source: branches/profile/PARSIMONY/GA_genetic.cxx

Last change on this file was 11401, checked in by westram, 10 years ago
  • reintegrates 'tree' into 'trunk':
    • consensus trees:
      • support for merging partial trees ("worked" before, but results were crap; implements #65)
      • generated trees are automatically re-rooted and -ordered
      • always list source trees in consensus-tree-comment; show info about partial trees
      • fixed progress bar
    • made GBT_TREE a base class of other tree classes (implements #31)
    • save tree properties in properties (not in DB)
    • new functions 'Remove zombies/marked from ALL trees'
    • tree load/save: layout fixes
    • unit tests
      • added tests for basic tree modifications (PARSIMONY)
    • performance:
      • compute_tree updates tree information in one traversal
      • tree generators are now capable to generate any type of tree (w/o needing to copy it once)
    • bugfixes:
      • NNI (of marked species) was also always performed for colored species
      • centered beautify-order is stable now
      • improved 'search optimal root'
  • adds:
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 29.1 KB
Line 
1#include <cstdlib>
2#include <arbdb.h>
3#include <arbdbt.h>
4#include <cstring>
5#include <cstdio>
6#include <memory.h>
7#include <iostream.h>
8#include "AP_buffer.hxx"
9#include "ap_main.hxx"
10#include "ap_tree_nlen.hxx"
11#include "GA_genetic.hxx"
12
13#define AP_GWT_SIZE 0
14#define AP_PUT_DATA 1
15
16
17GA_genetic::GA_genetic() {
18    gb_tree_start = 0;
19    gb_tree_opt   = 0;
20    gb_joblist    = 0;
21    gb_genetic    = 0;
22    gb_main       = 0;
23    gb_jobCount   = 0;
24    gb_bestTree   = 0;
25    min_job       = 1;
26}
27
28GA_genetic::~GA_genetic() {
29    if (fout) {
30        if (fclose(fout) != 0) {
31            new AP_ERR("~GA_genetic", "couldn't close output");
32        }
33    }
34}
35
36void GA_genetic::init(GBDATA *gbmain) {
37    this->gb_main = gbmain;
38    GB_push_transaction(gb_main);
39    gb_genetic    = GB_search(gb_main, "genetic", GB_CREATE_CONTAINER);
40    gb_presets    = GB_entry(gb_genetic, "presets");
41    gb_tree_start = GB_entry(gb_genetic, "tree_start");
42    gb_tree_opt   = GB_entry(gb_genetic, "tree_opt");
43    gb_joblist    = GB_entry(gb_genetic, "job_list");
44    gb_bestTree   = GB_entry(gb_presets, "bestTree");
45    gb_jobCount   = GB_entry(gb_presets, "jobCount");
46    gb_maxTree    = GB_entry(gb_presets, "maxTree");
47    gb_treeName   = GB_entry(gb_presets, "treeName");
48
49    if (gb_presets == 0) {
50        new AP_ERR("init", "No presets defined");
51        return;
52    }
53    if (gb_joblist == 0) {
54        gb_joblist = GB_create_container(gb_genetic, 0, "job_list");
55    }
56    if (gb_tree_start == 0) {
57        gb_tree_start = GB_create_container(gb_genetic, 0, "tree_start");
58    }
59    if (gb_tree_opt == 0) {
60        gb_tree_opt = GB_create_container(gb_genetic, 0, "tree_opt");
61    }
62    if (gb_treeName == 0) {
63        gb_treeName = GB_create(gb_genetic, 0, "treeName");
64        GB_write_int(gb_treeName, 0);
65    }
66    //
67    // read presets
68    GBDATA *gbp;
69    if ((gbp = GB_entry(gb_presets, "max_cluster")) == 0) {
70        new AP_ERR("GA_init", "some preset not found");
71        GB_pop_transaction(gb_main);
72        return;
73    }
74    max_cluster = (int)GB_read_int(gbp);
75
76    if ((gbp = GB_entry(gb_presets, "maxTree")) == 0) {
77        new AP_ERR("GA_init", "some preset not found");
78        GB_pop_transaction(gb_main);
79        return;
80    }
81    maxTree = (int)GB_read_int(gbp);
82
83    if ((gbp = GB_entry(gb_presets, "max_jobs")) == 0) {
84        new AP_ERR("GA_init", "some preset not found");
85        GB_pop_transaction(gb_main);
86        return;
87    }
88    max_jobs = (int)GB_read_int(gbp);
89
90    // allocate memory
91    treelist = (long **)calloc((size_t)max_cluster+1, sizeof(long **));
92    for (int i=0; i<max_cluster; i++) {
93        treelist[i] = (long *)calloc((size_t)maxTree+1, sizeof(long *));
94    }
95    treePerCluster = (int *)calloc((size_t)max_cluster+1, sizeof(int));
96
97    GB_pop_transaction(gb_main);
98    //
99    // open Filestream for output
100    //
101    fout = fopen("GAgeneticOutput", "w");
102    if (fout==0) new AP_ERR("GA_genetic::init", "couldn't open Output File");
103
104    return;
105}
106
107void GA_genetic::init_first(GBDATA *gbmain) {
108    // makes protodb
109    gb_main       = gbmain;
110    this->gb_main = gbmain;
111
112    GB_push_transaction(gb_main);
113    gb_genetic    = GB_create_container(gb_main, 0, "genetic");
114    gb_presets    = GB_create_container(gb_genetic, 0, "presets");
115    gb_tree_start = GB_create_container(gb_genetic, 0, "tree_start");
116    gb_tree_opt   = GB_create_container(gb_genetic, 0, "trees_opt");
117    gb_joblist    = GB_create_container(gb_genetic, 0, "job_list");
118
119
120
121    // write presets
122    GBDATA *gbp;
123    if ((gbp = GB_create_container(gb_presets, 0, "max_cluster")) == 0) {
124        new AP_ERR("GA_init", "some preset not found");
125        GB_pop_transaction(gb_main);
126        return;
127    }
128    GB_write_int(gbp, 3);
129
130    if ((gbp = GB_create_container(gb_presets, 0, "maxTree")) == 0) {
131        new AP_ERR("GA_init", "some preset not found");
132        GB_pop_transaction(gb_main);
133        return;
134    }
135    GB_write_int(gbp, 4);
136    if ((gbp = GB_create_container(gb_presets, 0, "max_jobs")) == 0) {
137        new AP_ERR("GA_init", "some preset not found");
138        GB_pop_transaction(gb_main);
139        return;
140    }
141    GB_write_int(gbp, 5);
142
143    GB_pop_transaction(gb_main);
144
145    tree_prototype = (AP_tree *) new AP_tree_nlen;
146    return;
147}
148
149void GA_genetic::exit() {
150}
151
152AP_ERR * GA_genetic::read_presets() {
153    GBDATA *gbp;
154    if (gb_presets == 0)
155        return new AP_ERR("GA_genetic", "not inited");
156    if ((gbp = GB_entry(gb_presets, "jobOpt")) == 0) {
157        return new AP_ERR("GA_genetic", "some preset not found");
158    }
159    jobOpt = (int)GB_read_int(gbp);
160    if ((gbp = GB_entry(gb_presets, "jobCross")) == 0) {
161        return new AP_ERR("GA_genetic", "some preset not found");
162    }
163    jobCrossover = (int)GB_read_int(gbp);
164    if ((gbp = GB_entry(gb_presets, "jobOther")) == 0) {
165        return new AP_ERR("GA_genetic", "some preset not found");
166    }
167    jobOther = (int)GB_read_int(gbp);
168
169    if (gb_jobCount) jobCount = (int)GB_read_int(gb_jobCount);
170    if (gb_bestTree) bestTree = GB_read_APfloat(gb_bestTree);
171    if (gb_maxTree) maxTree = (int)GB_read_int(gb_maxTree);
172
173    return 0;
174}
175
176
177
178double GA_genetic::AP_atof(char *str)
179{
180    double  res = 0.0;
181    double  val = 1.0;
182    long    neg = 0;
183    char    c;
184    char   *p   = str;
185
186    while (c = *(p++)) {
187        if (c == '.') {
188            val = .1;
189            continue;
190        }
191        if (c == '-') {
192            neg = 1;
193            continue;
194        }
195        if (val == 1.0) {
196            res *= 10.0;
197            res += c-'0';
198            continue;
199        }
200        res += (c-'0')*val;
201        val *= .1;
202    }
203    if (neg) return -res;
204    return res;
205}
206
207GBDATA *GA_genetic::get_cluster(GBDATA *container, int cluster) {
208    GBDATA *gb_cluster;
209    GBDATA *gb_anzahl;
210    char clustername[20];
211    if (cluster > max_cluster) {
212        new AP_ERR("too large clusternumber", 0);
213    }
214    if (container == 0) {
215        new AP_ERR("get_cluster", "container valid !");
216        return 0;
217    }
218    sprintf(clustername, "cl_%d", cluster);
219    gb_cluster = GB_entry(container, clustername);
220    if (gb_cluster == 0) {
221        printf("cl created\n");
222        gb_cluster = GB_create_container(container, 0, clustername);
223        if (gb_cluster == 0) {
224            new AP_ERR("get_cluster", "Couldn't create cluster");
225        }
226        gb_anzahl = GB_create(gb_cluster, 0, "count");
227        GB_write_int(gb_anzahl, 0);
228    }
229    return gb_cluster;
230}
231
232
233long GA_genetic::get_treeid(GBDATA *gbtree) {
234    if (gbtree != 0) {
235        GBDATA *gbid = GB_entry(gbtree, "id");
236        if (gbid) {
237            return (int)GB_read_int(gbid);
238        }
239        else {
240            new AP_ERR("No tree id in Database!");
241        }
242    }
243    return -1;
244}
245
246GBDATA *GA_genetic::get_tree(GBDATA *container, long treeid) {
247    // returns pointer to tree,
248    // if treeid == -1 returns first tree in container
249    GBDATA *gb_tree, *gbid;
250    char treename[20];
251    long id;
252
253    if (container == 0) {
254        new AP_ERR("get_tree", "container valid !");
255        return 0;
256    }
257    gb_tree = GB_entry(container, "tree");
258    if (treeid >= 0) {
259        while (gb_tree != 0) {
260            gbid = GB_entry(gb_tree, "id");
261            id = GB_read_int(gbid);
262            if (id == treeid) break;
263            gb_tree = GB_nextEntry(gb_tree);
264        }
265    }
266    return gb_tree;
267}
268
269
270
271char *GA_genetic::write_tree_rek(AP_tree *node, char *dest, long mode) {
272    /*! convert tree into string (representing tree).
273     *
274     * @param mode
275     * - if AP_PUT_DATA -> create tree representation in 'dest' buffer
276     * - else -> only calculate needed buffer size
277     */
278    char buffer[40];                // just real numbers
279    char    *c1;
280    if (node->is_leaf) {
281        if (mode == AP_PUT_DATA) {
282            *(dest++) = 'L';
283            if (node->name) strcpy(dest, node->name);
284            while (c1 = (char *)strchr(dest, 1)) *c1 = 2;
285            dest += strlen(dest);
286            *(dest++) = 1;
287            return dest;
288        }
289        else {
290            if (node->name) return dest+1+strlen(node->name)+1;     // N name term
291            return dest+1+1;
292        }
293    }
294    else {
295        sprintf(buffer, "%f,%f;", node->leftlen, node->rightlen);
296        if (mode == AP_PUT_DATA) {
297            *(dest++) = 'N';
298            strcpy(dest, buffer);
299            dest += strlen(buffer);
300        }
301        else {
302            dest += strlen(buffer)+1;
303        }
304        dest = write_tree_rek(node->leftson, dest, mode);
305        dest = write_tree_rek(node->rightson, dest, mode);
306        return dest;
307    }
308}
309
310AP_tree *GA_genetic::read_tree_rek(char **data)
311{
312    AP_tree *node;
313    char    c;
314    char    *p1;
315
316    node = (AP_tree *)new AP_tree_nlen;
317    c = *((*data)++);
318    if (c=='N') {
319        p1 = (char *)strchr(*data, ',');
320        *(p1++) = 0;
321        node->leftlen = AP_atof(*data);
322        *data = p1;
323        p1 = (char *)strchr(*data, ';');
324        *(p1++) = 0;
325        node->rightlen = AP_atof(*data);
326        *data = p1;
327
328        node->leftson = read_tree_rek(data);
329        if (!node->leftson) {
330            delete node;
331            return 0;
332        }
333        node->rightson = read_tree_rek(data);
334        if (!node->rightson) {
335            delete node;
336            return 0;
337        }
338        node->leftson->father = node;
339        node->rightson->father = node;
340    }
341    else if (c=='L') {
342        node->is_leaf = true;
343        p1 = (char *)strchr(*data, 1);
344        *p1 = 0;
345        node->name = (char *)strdup(*data);
346        *data = p1+1;
347    }
348    else {
349        new AP_ERR("GENETIC", "Error reading tree 362436\n");
350        return 0;
351    }
352    return node;
353}
354
355AP_ERR *GA_genetic::write_tree(GBDATA *gb_cluster, GA_tree *ga_tree)
356{
357    /* writes a tree to the database.
358       if there are GBDATA pointers in the inner nodes
359       the tree_name must be zero
360       to copy a tree call GB_copy((GBDATA *)dest,(GBDATA *)source);
361    */
362    char    *treedata, *t_size;
363    char    *treename;
364    GBDATA  *gb_treedata;
365    AP_ERR *ap_err = 0;
366    GBDATA * gb_ref_count;
367    GBDATA * gb_criteria;
368    GBDATA * gb_tree;
369    GBDATA * gb_id;
370
371    if (!gb_cluster) {
372        return new AP_ERR("write tree", "no gbdata !");
373    }
374    treename = new char[20];
375    GB_push_transaction(gb_main);
376    if (ga_tree->id < 0) {
377        ga_tree->id = GB_read_int(gb_treeName);
378        GB_write_int(gb_treeName, 1+ga_tree->id);
379    }
380    if ((gb_tree = get_tree(gb_cluster, ga_tree->id))==0) {
381        gb_tree = GB_create_container(gb_cluster, 0, "tree");
382    }
383
384    gb_ref_count = GB_create(gb_tree, 0, "ref_count");
385    gb_criteria = GB_create(gb_tree, 0, "criteria");
386    gb_id = GB_create(gb_tree, 0, "id");
387
388    GB_write_int(gb_ref_count, ga_tree->ref_count);
389    GB_write_APfloat(gb_criteria, ga_tree->criteria);
390    GB_write_int(gb_id, ga_tree->id);
391
392    gb_treedata = GB_search(gb_tree, "tree_data", GB_CREATE);
393    t_size = write_tree_rek((AP_tree *)ga_tree->tree, 0, AP_GWT_SIZE);
394    treedata = (char *)calloc(sizeof(char), (size_t)(t_size+1));
395    t_size = write_tree_rek((AP_tree *)ga_tree->tree, treedata, AP_PUT_DATA);
396    *(t_size) = 0;
397
398    GB_write_string(gb_treedata, treedata);
399    bestTree = GB_read_APfloat(gb_bestTree);
400    if (ga_tree->criteria > bestTree) {
401        bestTree = ga_tree->criteria;
402        GB_write_APfloat(gb_bestTree, bestTree);
403        GBT_write_tree(gb_main, 0, 0, ga_tree->tree);
404    }
405    free(treedata);
406    delete [] treename;
407    /*
408      gb_nnodes = GB_search(gb_tree,"nnodes",GB_CREATE);
409      error = GB_write_int(gb_nnodes,size);
410      if (error) return new AP_ERR(error,"");
411    */
412    GB_pop_transaction(gb_main);
413    return 0;
414}
415
416
417GA_tree *GA_genetic::read_tree(GBDATA *gb_cluster, long tree_id)
418/* read a tree
419   and removes it if no referenz is existing */
420{
421
422    char           *fbuf;
423    GBDATA         *gb_treedata=0;
424    GBDATA *gb_tree = 0;
425    GBDATA *gb_count=0;
426    int count;
427    char *cptr[1];
428    GA_tree *tree;
429
430    gb_count = GB_entry(gb_cluster, "count");
431    count = (int)GB_read_int(gb_count);
432
433    gb_tree = get_tree(gb_cluster, tree_id);
434    if (gb_tree == 0) {
435        new AP_ERR("read_tree", "this tree not found");
436    }
437
438    if (gb_tree == 0) {
439        new AP_ERR("read_tree", "tree not found");
440        return 0;
441    }
442
443    tree = new GA_tree;
444    GBDATA *gb_ref_count = GB_search(gb_tree, "ref_count", GB_FIND);
445    GBDATA *gb_criteria = GB_search(gb_tree, "criteria", GB_FIND);
446    GBDATA *gb_id = GB_search(gb_tree, "id", GB_FIND);
447
448    if (gb_ref_count)
449        tree->ref_count = (int)GB_read_int(gb_ref_count);
450    if (gb_criteria)
451        tree->criteria = GB_read_APfloat(gb_criteria);
452    if (gb_id)
453        tree->id = GB_read_int(gb_id);
454
455    gb_treedata = GB_search(gb_tree, "tree_data", GB_FIND);
456    if (gb_treedata) {
457        fbuf = cptr[0] = GB_read_string(gb_treedata);
458        tree->tree = (AP_tree_nlen *)read_tree_rek(cptr);
459        free (fbuf);
460    }
461    delete_tree(gb_cluster, gb_tree);
462    GBT_link_tree(tree->tree, gb_main, 0, 0);
463    return tree;
464}
465
466// ---------------------------
467//      genetic algorithms
468
469AP_ERR * GA_genetic::put_start_tree(AP_tree *tree, const long tree_id, int  cluster) {
470    char * error = 0;
471    AP_ERR *ap_err = 0;
472    GBDATA * gb_cluster;
473    GA_tree * ga_tree;
474    GBDATA *gb_anzahl;
475    int anzahl;
476
477    GB_push_transaction(gb_main);
478    if (gb_tree_start == 0) {
479        gb_tree_start = GB_entry(gb_genetic, "tree_start");
480        if (gb_tree_start == 0) {
481            gb_tree_start = GB_create_container(gb_genetic, 0, "tree_start");
482        }
483    }
484    if (cluster > max_cluster) {
485        GB_pop_transaction(gb_main);
486        return new AP_ERR("put_start_tree", "cluster invalid");
487    }
488
489    if (gb_tree_start == 0) {
490        GB_pop_transaction(gb_main);
491        ap_err = new AP_ERR("Couldn't create container");
492        return ap_err;
493    }
494    gb_cluster = get_cluster(gb_tree_start, cluster);
495
496    if (gb_cluster == 0) {
497        char clustername[20];
498        sprintf(clustername, "cl_%d", cluster);
499        gb_cluster = GB_create_container(gb_tree_start, 0, clustername);
500        if (gb_cluster == 0) {
501            GB_pop_transaction(gb_main);
502            return new AP_ERR("putStartTree", "no cluster found");
503        }
504        gb_anzahl = GB_create(gb_cluster, 0, "count");
505        GB_write_int(gb_anzahl, 0);
506    }
507    gb_anzahl = GB_entry(gb_cluster, "count");
508    anzahl = (int)GB_read_int(gb_anzahl);
509
510    ga_tree = new GA_tree;
511    ga_tree->ref_count = 0;
512    ga_tree->criteria  = tree->mutation_rate;
513    ga_tree->id = tree_id;
514    ga_tree->tree = (AP_tree_nlen *)tree;
515
516    ap_err = write_tree(gb_cluster, ga_tree);
517
518    if (ap_err == 0) {
519        anzahl ++;
520        GB_write_int(gb_anzahl, anzahl);
521    }
522
523    delete ga_tree;
524    GB_pop_transaction(gb_main);
525    return ap_err;
526}
527
528GA_tree * GA_genetic::get_start_tree(int cluster) {
529    GBDATA *gb_cluster;
530    GBDATA *gb_anzahl;
531    int anzahl;
532    GA_tree *tree = 0;
533    GB_push_transaction(gb_main);
534    gb_cluster = this->get_cluster(gb_tree_start, cluster);
535    gb_anzahl = GB_entry(gb_cluster, "count");
536    anzahl = (int)GB_read_int(gb_anzahl);
537    if (anzahl >= 1) {
538        GBDATA *gbt = get_tree(gb_cluster, -1);
539        tree = this->read_tree(gb_cluster, -1);
540        GB_pop_transaction(gb_main);
541        return tree;
542    }
543    GB_pop_transaction(gb_main);
544    return tree;
545}
546
547
548
549
550AP_ERR * GA_genetic::put_optimized(GA_tree *tree, int cluster) {
551    GBDATA *gb_cluster;
552    int anzahl = 0;
553    GBDATA *gb_anzahl;
554
555    GB_push_transaction(gb_main);
556    gb_cluster = this->get_cluster(gb_tree_opt, cluster);
557    if (gb_cluster == 0) {
558        char clustername[20];
559        sprintf(clustername, "cl_%d", cluster);
560        gb_cluster = GB_create_container(gb_tree_opt, 0, clustername);
561        if (gb_cluster == 0) {
562            GB_pop_transaction(gb_main);
563            return new AP_ERR("putStartTree", "no cluster found");
564        }
565        gb_anzahl = GB_create(gb_cluster, 0, "count");
566        GB_write_int(gb_anzahl, 0);
567    }
568
569    gb_anzahl = GB_entry(gb_cluster, "count");
570    anzahl = (int)GB_read_int(gb_anzahl);
571    while (anzahl >= maxTree) {
572        remove_job(gb_cluster);
573    }
574
575    // baum speichern und anzahl erhoehen
576    // kreire jobs
577    tree->id = -1;
578    write_tree(gb_cluster, tree);
579    anzahl ++;
580    GB_write_int(gb_anzahl, anzahl);
581    create_jobs(tree, cluster);
582    GB_pop_transaction(gb_main);
583    return 0;
584}
585
586
587AP_ERR *GA_genetic::delete_tree(GBDATA *gb_cluster, GBDATA *gb_tree) {
588    int ref_count = 0;
589    if (gb_tree == 0) {
590        return new AP_ERR("delete_tree", "no tree given");
591    }
592
593    GBDATA *gb_ref_count = GB_search(gb_tree, "ref_count", GB_FIND);
594    if (gb_ref_count) {
595        ref_count = (int)GB_read_int(gb_ref_count);
596        if (ref_count > 0) {
597            GB_write_int(gb_ref_count, ref_count - 1);
598        }
599        else {
600            GB_delete(gb_tree);
601            GBDATA *gb_count = GB_entry(gb_cluster, "count");
602            int count = (int)GB_read_int(gb_count);
603            GB_write_int(gb_count, --count);
604        }
605    }
606    return 0;
607}
608
609// -----------------------
610//      job management
611
612GA_job * GA_genetic::get_job(int cluster) {
613    int count;
614    GBDATA * gb_cluster;
615    GBDATA * gb_best_job;
616    int bew = 0;
617    int best = 0;
618    AP_FLOAT crit_best, crit_next;
619    GA_job *job=0;
620    GBDATA *gbp_job=0;
621    GBDATA *gbp_criteria=0;
622
623    GB_push_transaction(gb_main);
624    if (gb_joblist == 0) {
625        new AP_ERR("get_job", "no gbdata defined");
626        GB_pop_transaction(gb_main);
627        return 0;
628    }
629
630    count = (int)GB_read_int(gb_jobCount); // globaler zaehler
631    if (count <= 0) {
632        new AP_ERR("get_job", "no job");
633        GB_pop_transaction(gb_main);
634        return 0;
635    }
636
637    //
638    // suche besten job aus cluster und liefer ihn zurueck
639    //
640    gb_cluster = get_cluster(gb_joblist, cluster);
641    if (gb_cluster == 0) {
642        new AP_ERR("no cluster found");
643        GB_pop_transaction(gb_main);
644        return 0;
645    }
646    GBDATA *gb_count = GB_entry(gb_cluster, "count");
647    count = (int)GB_read_int(gb_count); // globaler zaehler
648    if (count <= 0) {
649        new AP_ERR("get_job", "no job");
650        GB_pop_transaction(gb_main);
651        return 0;
652    }
653
654    gb_best_job = gbp_job = GB_entry(gb_cluster, "job");
655    if (gbp_job != 0)
656        gbp_criteria = GB_entry(gbp_job, "criteria");
657
658    if (gbp_criteria != 0)
659        crit_best = GB_read_APfloat(gbp_criteria);
660
661    ga_assert(GB_has_key(gbp_job, "job"));
662    while ((gbp_job = GB_nextEntry(gbp_job)) != 0) {
663        gbp_criteria = GB_entry(gbp_job, "criteria");
664        crit_next = GB_read_APfloat(gbp_criteria);
665        if (crit_next > crit_best) {
666            crit_best = crit_next;
667            gb_best_job = gbp_job;
668        }
669    }
670    if (gb_best_job == 0) {
671        GB_pop_transaction(gb_main);
672        return 0;
673    }
674
675    // lade baeume und loesche job
676    // erhoehe refpointer
677    job           = new GA_job;
678    job->criteria = crit_best;
679
680    // decrement refcounter & delete trees;
681    GBDATA *gbd = GB_entry(gb_best_job, "cluster0"); if (gbd) job->cluster0 = (int)GB_read_int(gbd);
682    gbd         = GB_entry(gb_best_job, "cluster1"); if (gbd) job->cluster1 = (int)GB_read_int(gbd);
683    gbd         = GB_entry(gb_best_job, "id0");      if (gbd) job->id0      = GB_read_int(gbd);
684    gbd         = GB_entry(gb_best_job, "id1");      if (gbd) job->id1      = GB_read_int(gbd);
685    gbd         = GB_entry(gb_best_job, "mode");    if (gbd) job->mode    = (GA_JOB_MODE)GB_read_int(gbd);
686
687    // finde baeume
688    // Der erste Baum ist im selben Cluster !
689    gb_cluster = get_cluster(gb_tree_opt, job->cluster0);
690    job->tree0 = read_tree(gb_cluster, job->id0);
691
692    if (job->id1 != -1) { // falls zweiter baum angegeben
693        gb_cluster = get_cluster(gb_tree_opt, job->cluster1);
694        job->tree1 = read_tree(gb_cluster, job->id1);
695    }
696    // loesche job in DB
697    GB_delete(gb_best_job);
698    GB_pop_transaction(gb_main);
699    return job;
700}
701
702
703AP_ERR *GA_genetic::put_job(int cluster, GA_job *job) {
704    if (cluster > max_cluster) {
705        return new AP_ERR("put_job", "wrong cluster");
706    }
707    GBDATA *gb_cluster;
708    GBDATA *gb_jobcluster;
709    GBDATA * gb_job;
710    GBDATA *gb_ref = 0;
711    GBDATA *gb_anzahl;
712    long anzahl;
713    AP_FLOAT crit0=0, crit1=0;
714    AP_ERR *aperr = 0;
715    char *err = 0;
716    GBDATA *gbp;
717
718    if (job == 0) {
719        return new AP_ERR("put_job", "no job given !");
720    }
721    if (cluster != job->cluster0) {
722        return new AP_ERR("put_job", "internal Job error!");
723    }
724    GB_push_transaction(gb_main);
725
726                                // beide referenzcounter erhoehen
727    gb_jobcluster = gb_cluster = get_cluster(gb_joblist, job->cluster0);
728    gb_anzahl     = GB_entry(gb_cluster, "count");
729    anzahl        = GB_read_int(gb_anzahl);
730
731    // Criteria Ausrechnen !!
732    if (job->id1 >= 0) {
733        GBDATA *gbcl = get_cluster(gb_tree_opt, job->cluster1);
734        GBDATA *gbt  = get_tree(gbcl, job->id1);
735        gbp = GB_entry(gbt, "ref_count");
736        int count = (int)GB_read_int(gbp) + 1;
737        GB_write_int(gbp, count);
738        gbp = GB_entry(gbt, "criteria");
739        crit1 = GB_read_APfloat(gbp);
740    }
741
742    if (job->id0 >= 0) {
743        GBDATA *gbcl = get_cluster(gb_tree_opt, job->cluster0);
744        GBDATA *gbt  = get_tree(gbcl, job->id0);
745        gbp = GB_entry(gbt, "ref_count");
746        int count = (int)GB_read_int(gbp) + 1;
747        GB_write_int(gbp, count);
748        gbp = GB_entry(gbt, "criteria");
749        crit0 = GB_read_APfloat(gbp);
750    }
751    job->calcCrit(crit0, crit1);
752    gb_job = GB_create_container(gb_jobcluster, 0, "job");
753    gbp = GB_search(gb_job, "criteria", GB_CREATE);
754    GB_write_APfloat(gbp, job->criteria);
755    gbp =  GB_search(gb_job, "mode", GB_CREATE);
756    GB_write_int(gbp, (int)job->mode);
757    gbp =  GB_search(gb_job, "cluster0", GB_CREATE);
758    err = GB_write_int(gbp, job->cluster0);
759    gbp =  GB_search(gb_job, "cluster1", GB_CREATE);
760    err = GB_write_int(gbp, job->cluster1);
761    gbp =  GB_search(gb_job, "id0", GB_CREATE);
762    err = GB_write_int(gbp, job->id0);
763    gbp =  GB_search(gb_job, "id1", GB_CREATE);
764    err = GB_write_int(gbp, job->id1);
765
766    if (err != 0) {
767        aperr = new AP_ERR("put job", "error while writing job to database");
768        GB_abort_transaction(gb_main);
769        return aperr;
770    }
771
772    jobCount = (int)GB_read_int(gb_jobCount);
773    jobCount++;
774    anzahl++;
775    GB_write_int(gb_jobCount, jobCount);
776    GB_write_int(gb_anzahl, anzahl);
777
778    while (anzahl > maxTree) {
779        cout << "cluster" << job->cluster0;
780        remove_job(gb_jobcluster);
781        anzahl = GB_read_int(gb_anzahl);
782    }
783
784    jobCount = (int)GB_read_int(gb_jobCount);
785
786    while (jobCount >= max_jobs) {
787        remove_job(0);
788    }
789
790    GB_pop_transaction(gb_main);
791    job->printl();
792    return aperr;
793}
794
795
796AP_ERR * GA_genetic::delete_job(GBDATA *gb_job) {
797    // loesche die einzelnen tree referenzen
798    // ggf. die trees
799    GBDATA * gbp;
800    GBDATA *gbt;
801    GBDATA *gb_cluster, *gbcl;
802    GBDATA *jobcl;
803
804    if (gb_job == 0)
805        return new AP_ERR("delete_job", "no job given !");
806    GA_job *job = new GA_job;
807    jobcl = GB_get_father(gb_job);
808
809    gbp = GB_entry(gb_job, "cluster0"); if (gbp) job->cluster0 = (int)GB_read_int(gbp);
810    gbp = GB_entry(gb_job, "cluster1"); if (gbp) job->cluster1 = (int)GB_read_int(gbp);
811
812    gbp = GB_entry(gb_job, "id0"); if (gbp) job->id0 = GB_read_int(gbp);
813    gbp = GB_entry(gb_job, "id1"); if (gbp) job->id1 = GB_read_int(gbp);
814
815    // finde baeume
816    // Der erste Baum ist im selben Cluster !
817    gbcl = gb_cluster = get_cluster(gb_tree_opt, job->cluster0);
818
819    gbt = get_tree(gb_cluster, job->id0);
820    delete_tree(gb_cluster, gbt);
821    if (job->id1 != -1) { // falls zweiter baum angegeben
822        gb_cluster = get_cluster(gb_tree_opt, job->cluster1);
823        gbt = get_tree(gb_cluster, job->id1);
824        delete_tree(gb_cluster, gbt);
825    }
826    GBDATA *gb_count = GB_entry(jobcl, "count");
827    int count = (int)GB_read_int(gb_count) - 1;
828    GB_write_int(gb_count, count);
829
830    GB_delete(gb_job);
831    jobCount = (int)GB_read_int(gb_jobCount);
832    jobCount--;
833    GB_write_int(gb_jobCount, jobCount);
834    delete job;
835    return 0;
836}
837
838AP_ERR * GA_genetic::remove_job(GBDATA *gb_cluster) {
839    // find worst job in cluster (any if gb_cluster == 0)
840    // an delet it
841    GBDATA *gbjob;
842    GBDATA *gbworst = 0;
843    GBDATA *gbp_criteria;
844    GBDATA *gb_anzahl;
845    AP_FLOAT crit_next, crit_worst;
846    int cl, anzahl = 0, safty = 0;
847
848    if (gb_cluster == 0) {
849        while (gb_cluster == 0) {
850            safty ++;
851            cl = (int)random()%max_cluster;
852            gb_cluster = get_cluster(gb_joblist, cl);
853            gb_anzahl = GB_entry(gb_cluster, "count");
854            anzahl = (int)GB_read_int(gb_anzahl);
855            if (anzahl <= min_job) {
856                if (safty > GA_SAFETY) {
857                    new AP_ERR("remove job", "get looped");
858                }
859                else {
860                    gb_cluster = 0;
861                }
862            }
863        }
864    }
865
866    gbjob = GB_entry(gb_cluster, "job");
867
868    if (gbjob != 0) {
869        gbp_criteria = GB_entry(gbjob, "criteria");
870        if (gbp_criteria != 0) {
871            crit_worst = GB_read_APfloat(gbp_criteria);
872            gbworst = gbjob;
873        }
874        ga_assert(GB_has_key(gbjob, "job"));
875        while ((gbjob = GB_nextEntry(gbjob)) != 0) {
876            gbp_criteria = GB_entry(gbjob, "criteria");
877            crit_next = GB_read_APfloat(gbp_criteria);
878            if (crit_next > crit_worst) {
879                crit_worst = crit_next;
880                gbworst = gbjob;
881            }
882        }
883    }
884    if (gbworst == 0) {
885        cout << "Ccluster" << cl;
886        return new AP_ERR("remove_job", "No job found");
887    }
888
889    delete_job(gbworst);
890    return 0;
891}
892
893
894
895AP_ERR *GA_genetic::create_jobs(GA_tree *tree, int cluster) {
896    // generiert jobs fuer einen Baum und
897    // speichert diese in der Datenbank
898    int i, t, jc=0;
899    GA_job *job;
900    if (tree == 0)
901        return new AP_ERR("create_jobs", "no tree given");
902
903    read_presets();
904
905    /*
906      for (i=0;i<jobOpt;i++){       // Optimierungsjobs
907      job = new GA_job;
908      job->cluster0 = cluster;
909      job->id0 = tree->id;
910      job->cluster1 = -1;
911      job->id1 = -1;
912      job->mode = GA_KERNIGHAN;
913      if (put_job(job->cluster0,job) !=0)
914      ;
915      delete job;
916      }
917      // create list of all trees in clusters
918      // and count number of them
919      */
920    GBDATA *gbt;
921    GBDATA *gbcl;
922    GBDATA *gbc;
923    int count, treeid, treecount=0;
924
925
926    for (i = 0; i<max_cluster; i++) {
927        cout << "\n" << i << " : ";
928        gbcl = get_cluster(gb_tree_opt, i);
929        if (gbcl != 0) {
930            gbc = GB_entry(gbcl, "count");
931            if (gbc) count = (int)GB_read_int(gbc);
932            gbt = GB_entry(gbcl, "tree");
933            for (t=0; t<maxTree; t++) {
934                if (gbt != 0) {
935                    treecount ++;
936                    treelist[i][t] = get_treeid(gbt);
937                    cout << " " << treelist[i][t];
938                    gbt = GB_nextEntry(gbt);
939                } else break;
940            }
941            cout << " ** " << t << " count " << count;
942            treePerCluster[i] = t;
943            gbcl = GB_find(gbcl, "cl*", SEARCH_NEXT_BROTHER);
944        } else break;
945    }
946    clusterCount = i;
947    cout << "\n";
948    cout.flush();
949
950    for (i=0; i<jobCrossover; i++) { // Crossoverjobs
951        if (treePerCluster[cluster] > 1) { // in same cluster
952            job = new GA_job;
953            job->cluster0 = cluster;
954            job->id0 = tree->id;
955            job->cluster1 = cluster;
956            // choose random tree
957            treeid = (int)random()%treePerCluster[cluster];
958            while (treelist[cluster][treeid] == job->id0) {
959                treeid = (int)random()%treePerCluster[cluster];
960            };
961            // remove it from treelist by a swap
962            job->id1 = treelist[cluster][treeid];
963            treelist[cluster][treeid] =
964                treelist[cluster][treePerCluster[cluster]-1];
965            treePerCluster[cluster] --;
966            job->mode = GA_CROSSOVER;
967            if (put_job(job->cluster0, job) == 0)
968                jc++;
969            delete job;
970        }
971    }
972
973    int rcl;        // random cluster
974
975    for (i=0; i<jobCrossover; i++) { // Crossoverjobs
976        if (clusterCount <= 1) break;
977        if (treecount <= treePerCluster[cluster]) break;
978        // in same cluster
979        job = new GA_job;
980        job->cluster0 = cluster;
981        job->id0 = tree->id;
982        // search random cluster other than cluster
983        rcl = (int)random()%clusterCount;
984
985        int safty = 0;
986        while ((rcl == cluster) || (treePerCluster[rcl] < 1)) {
987            safty ++;
988            rcl = (int)random()%clusterCount;
989            if (safty>GA_SAFETY) break;
990        }
991        if (safty >GA_SAFETY) {
992            delete job;
993            break;
994        }
995        job->cluster1 = rcl;
996        treeid = (int)random()%treePerCluster[rcl];
997        treeid = (int)random()%treePerCluster[rcl];
998
999        // remove it from treelist by a swap
1000        job->id1 = treelist[rcl][treeid];
1001        treelist[rcl][treeid] =
1002            treelist[rcl][treePerCluster[rcl]-1];
1003        treePerCluster[rcl] --;
1004        job->mode = GA_CROSSOVER;
1005        if (put_job(job->cluster0, job) == 0)
1006            jc++;
1007        delete job;
1008    }
1009    if (jc < 1) {   // create jobs falls keine anderen aufgetaucht sind
1010        job = new GA_job;
1011        job->cluster0 = cluster;
1012        job->id0 = tree->id;
1013        job->id1 = job->cluster1 = -1;
1014        job->mode = GA_CREATEJOBS;
1015        put_job(job->cluster0, job);
1016    }
1017    return 0;
1018}
1019
Note: See TracBrowser for help on using the repository browser.