source: tags/svn.1.5.4/PARSIMONY/GA_genetic.cxx

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