source: tags/cvs_2_svn/PARSIMONY/GA_genetic.cxx

Last change on this file was 5309, checked in by westram, 16 years ago
  • replaced calls to GB_find with new find-functions
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 29.7 KB
Line 
1#include <stdlib.h>
2#include <arbdb.h>
3#include <arbdbt.h>
4#include <string.h>
5#include <stdio.h>
6#include <memory.h>
7// #include <malloc.h>
8#include <iostream.h>
9#include "AP_buffer.hxx"
10#include "parsimony.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(void) {
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(void) {
30    if (fout) {
31        if (fclose(fout) != 0) {
32            new AP_ERR("~GA_genetic","coldnt 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","couldnt 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","Coldnt 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        } 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, if treeid == -1 retruns first tree in container
248    GBDATA *gb_tree,*gbid;
249    char treename[20];
250    long id;
251
252    if (container == 0) {
253        new AP_ERR("get_tree","container valid !");
254        return 0;
255    }
256    gb_tree = GB_entry(container,"tree");
257    if (treeid >= 0) {
258        while (gb_tree != 0) {
259            gbid = GB_entry(gb_tree,"id");
260            id = GB_read_int(gbid);
261            if (id == treeid) break;
262            gb_tree = GB_nextEntry(gb_tree);
263        }
264    }
265    return gb_tree;
266}
267
268
269
270/**********************************************************************
271
272 read and write a tree in the database
273 creating a string in which the tree is coded
274
275**************************************************/
276
277char *GA_genetic::write_tree_rek( AP_tree *node, char *dest, long mode)
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        }else{
290            if (node->name) return dest+1+strlen(node->name)+1;     /* N name term */
291            return dest+1+1;
292        }
293    }else{
294        sprintf(buffer,"%f,%f;",node->leftlen,node->rightlen);
295        if (mode == AP_PUT_DATA) {
296            *(dest++) = 'N';
297            strcpy(dest,buffer);
298            dest += strlen(buffer);
299        }else{
300            dest += strlen(buffer)+1;
301        }
302        dest = write_tree_rek(node->leftson,dest,mode);
303        dest = write_tree_rek(node->rightson,dest,mode);
304        return dest;
305    }
306}
307
308
309/********************************************************************************************
310                                        some tree read functions
311********************************************************************************************/
312AP_tree *GA_genetic::read_tree_rek(char **data)
313{
314    AP_tree *node;
315    char    c;
316    char    *p1;
317
318    node = (AP_tree *)new AP_tree_nlen;
319    c = *((*data)++);
320    if (c=='N') {
321        p1 = (char *)strchr(*data,',');
322        *(p1++) = 0;
323        node->leftlen = AP_atof(*data);
324        *data = p1;
325        p1 = (char *)strchr(*data,';');
326        *(p1++) = 0;
327        node->rightlen = AP_atof(*data);
328        *data = p1;
329
330        node->leftson = read_tree_rek(data);
331        if (!node->leftson) {
332            free((char *)node);
333            return 0;
334        }
335        node->rightson = read_tree_rek(data);
336        if (!node->rightson) {
337            free((char *)node);
338            return 0;
339        }
340        node->leftson->father = node;
341        node->rightson->father = node;
342    }else if (c=='L') {
343        node->is_leaf = GB_TRUE;
344        p1 = (char *)strchr(*data,1);
345        *p1 = 0;
346        node->name = (char *)strdup(*data);
347        *data = p1+1;
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    treename = new char[20];
372    if (!gb_cluster) {
373        return new AP_ERR("write tree","no gbdata !");
374    }
375    /*if (ga_tree->id > maxTree *max_cluster) {
376      return new AP_ERR("tree id too big!");
377      }*/
378    GB_push_transaction(gb_main);
379    if (ga_tree->id < 0) {
380        ga_tree->id = GB_read_int(gb_treeName);
381        GB_write_int(gb_treeName,1+ga_tree->id);
382    }
383    if ((gb_tree = get_tree(gb_cluster,ga_tree->id))==0) {
384        gb_tree = GB_create_container(gb_cluster,0,"tree");
385    }
386
387    gb_ref_count = GB_create(gb_tree,0,"ref_count");
388    gb_criteria = GB_create(gb_tree,0,"criteria");
389    gb_id = GB_create(gb_tree,0,"id");
390
391    GB_write_int(gb_ref_count,ga_tree->ref_count);
392    GB_write_APfloat(gb_criteria, ga_tree->criteria);
393    GB_write_int(gb_id,ga_tree->id);
394
395    gb_treedata = GB_search(gb_tree,"tree_data",GB_CREATE);
396    t_size = write_tree_rek((AP_tree *)ga_tree->tree, 0, AP_GWT_SIZE);
397    treedata= (char *)calloc(sizeof(char),(size_t)(t_size+1));
398    t_size = write_tree_rek((AP_tree *)ga_tree->tree, treedata, AP_PUT_DATA);
399    *(t_size) = 0;
400
401    GB_write_string(gb_treedata,treedata);
402    bestTree = GB_read_APfloat(gb_bestTree);
403    if (ga_tree->criteria > bestTree) {
404        bestTree = ga_tree->criteria;
405        GB_write_APfloat(gb_bestTree,bestTree);
406        GBT_write_tree(gb_main,0,0,(GBT_TREE *)ga_tree->tree);
407    }
408    free(treedata);
409    delete treename;
410    /*
411      gb_nnodes = GB_search(gb_tree,"nnodes",GB_CREATE);
412      error = GB_write_int(gb_nnodes,size);
413      if (error) return new AP_ERR(error,"");
414    */
415    GB_pop_transaction(gb_main);
416    return 0;
417}
418
419
420GA_tree *GA_genetic::read_tree(GBDATA *gb_cluster,long tree_id)
421/* read a tree
422   and removes it if no referenz is existing */
423{
424
425    char           *fbuf;
426    GBDATA         *gb_treedata=0;
427    GBDATA *gb_tree =0;
428    GBDATA *gb_count=0;
429    int count;
430    char *cptr[1];
431    GA_tree *tree;
432
433    gb_count = GB_entry(gb_cluster,"count");
434    count = (int)GB_read_int(gb_count);
435
436    gb_tree = get_tree(gb_cluster,tree_id);
437    if(gb_tree == 0) {
438        new AP_ERR("read_tree","this tree not found");
439    }
440
441    if (gb_tree ==0) {
442        new AP_ERR("read_tree","tree not found");
443        return 0;
444    }
445
446    tree = new GA_tree;
447    GBDATA *gb_ref_count = GB_search(gb_tree,"ref_count",GB_FIND);
448    GBDATA *gb_criteria = GB_search(gb_tree,"criteria",GB_FIND);
449    GBDATA *gb_id = GB_search(gb_tree,"id",GB_FIND);
450
451    if (gb_ref_count)
452        tree->ref_count = (int)GB_read_int(gb_ref_count);
453    if (gb_criteria)
454        tree->criteria =GB_read_APfloat(gb_criteria);
455    if (gb_id)
456        tree->id = GB_read_int(gb_id);
457
458    gb_treedata = GB_search(gb_tree,"tree_data",GB_FIND);
459    if (gb_treedata) {
460        fbuf =cptr[0] = GB_read_string(gb_treedata);
461        tree->tree = (AP_tree_nlen *)read_tree_rek(cptr);
462        free (fbuf);
463    }
464    delete_tree(gb_cluster,gb_tree);
465    GBT_link_tree((GBT_TREE*)tree->tree,gb_main, 0, 0);
466    return tree;
467}
468
469
470
471/********************************************************************************
472 *********************************************************************
473                Funktionen fuer die genetischen algorithnen
474
475                **********************************************************************
476                ******************************************************/
477
478AP_ERR * GA_genetic::put_start_tree(AP_tree *tree,const long tree_id, int  cluster) {
479    char * error = 0;
480    AP_ERR *ap_err = 0;
481    GBDATA * gb_cluster;
482    GA_tree * ga_tree;
483    GBDATA *gb_anzahl;
484    int anzahl;
485
486    GB_push_transaction(gb_main);
487    if (gb_tree_start == 0) {
488        gb_tree_start = GB_entry(gb_genetic,"tree_start");
489        if (gb_tree_start == 0) {
490            gb_tree_start = GB_create_container(gb_genetic,0,"tree_start");
491        }
492    }
493    if ( cluster > max_cluster) {
494        GB_pop_transaction(gb_main);
495        return new AP_ERR("put_start_tree","cluster unvalid");
496    }
497
498    if (gb_tree_start == 0) {
499        GB_pop_transaction(gb_main);
500        ap_err = new AP_ERR("Couldn't create container");
501        return ap_err;
502    }
503    gb_cluster = get_cluster(gb_tree_start,cluster);
504
505    if (gb_cluster ==0) {
506        char clustername[20];
507        sprintf(clustername,"cl_%d",cluster);
508        gb_cluster = GB_create_container(gb_tree_start,0,clustername);
509        if (gb_cluster ==0) {
510            GB_pop_transaction(gb_main);
511            return new AP_ERR("putStartTree","no cluster found");
512        }
513        gb_anzahl = GB_create(gb_cluster,0,"count");
514        GB_write_int(gb_anzahl,0);
515    }
516    gb_anzahl = GB_entry(gb_cluster,"count");
517    anzahl = (int)GB_read_int(gb_anzahl);
518
519    ga_tree = new GA_tree;
520    ga_tree->ref_count = 0;
521    ga_tree->criteria  = tree->mutation_rate;
522    ga_tree->id = tree_id;
523    ga_tree->tree = (AP_tree_nlen *)tree;
524
525    ap_err = write_tree(gb_cluster,ga_tree);
526
527    if (ap_err == 0) {
528        anzahl ++;
529        GB_write_int(gb_anzahl,anzahl);
530    }
531
532    delete ga_tree;
533    GB_pop_transaction(gb_main);
534    return ap_err;
535}
536
537GA_tree * GA_genetic::get_start_tree(int cluster) {
538    GBDATA *gb_cluster;
539    GBDATA *gb_anzahl;
540    int anzahl;
541    GA_tree *tree =0;
542    GB_push_transaction(gb_main);
543    gb_cluster = this->get_cluster(gb_tree_start,cluster);
544    gb_anzahl = GB_entry(gb_cluster,"count");
545    anzahl = (int)GB_read_int(gb_anzahl);
546    if (anzahl >= 1 ) {
547        // gb_tree = GB_entry(gb_cluster,"tree");
548        GBDATA *gbt = get_tree(gb_cluster,-1);
549        tree = this->read_tree(gb_cluster,-1);
550        GB_pop_transaction(gb_main);
551        return tree;
552    }
553    GB_pop_transaction(gb_main);
554    return tree;
555}
556
557
558
559
560AP_ERR * GA_genetic::put_optimized(GA_tree *tree,int cluster) {
561    GBDATA *gb_cluster;
562    int anzahl = 0;
563    GBDATA *gb_anzahl;
564
565    GB_push_transaction(gb_main);
566    gb_cluster = this->get_cluster(gb_tree_opt,cluster);
567    if (gb_cluster ==0) {
568        char clustername[20];
569        sprintf(clustername,"cl_%d",cluster);
570        gb_cluster = GB_create_container(gb_tree_opt,0,clustername);
571        if (gb_cluster ==0) {
572            GB_pop_transaction(gb_main);
573            return new AP_ERR("putStartTree","no cluster found");
574        }
575        gb_anzahl = GB_create(gb_cluster,0,"count");
576        GB_write_int(gb_anzahl,0);
577    }
578
579    gb_anzahl = GB_entry(gb_cluster,"count");
580    anzahl = (int)GB_read_int(gb_anzahl);
581    while (anzahl >= maxTree) {
582        remove_job(gb_cluster);
583    }
584
585    // baum speichern und anzahl erhoehen
586    // kreire jobs
587    tree->id = -1;
588    write_tree(gb_cluster,tree);
589    anzahl ++;
590    GB_write_int(gb_anzahl,anzahl);
591    create_jobs(tree,cluster);
592    GB_pop_transaction(gb_main);
593    return 0;
594}
595
596
597AP_ERR *GA_genetic::delete_tree(GBDATA *gb_cluster,GBDATA *gb_tree) {
598    int ref_count =0;
599    if (gb_tree == 0) {
600        return new AP_ERR("delete_tree","no tree given");
601    }
602
603    GBDATA *gb_ref_count = GB_search(gb_tree,"ref_count",GB_FIND);
604    if (gb_ref_count) {
605        ref_count = (int)GB_read_int(gb_ref_count);
606        if (ref_count > 0) {
607            GB_write_int(gb_ref_count,ref_count - 1);
608        } else {
609            GB_delete(gb_tree);
610            GBDATA *gb_count = GB_entry(gb_cluster,"count");
611            int count = (int)GB_read_int(gb_count);
612            GB_write_int(gb_count,--count);
613        }
614    }
615    return 0;
616}
617
618/**************************************************
619Alles was mit jobs zu tuen hat
620**************************************************/
621
622GA_job * GA_genetic::get_job(int cluster) {
623    int count;
624    GBDATA * gb_cluster;
625    GBDATA * gb_best_job;
626    int bew =0;
627    int best = 0;
628    AP_FLOAT crit_best,crit_next;
629    GA_job *job=0;
630    GBDATA *gbp_job=0;
631    GBDATA *gbp_criteria=0;
632
633    GB_push_transaction(gb_main);
634    if (gb_joblist == 0) {
635        new AP_ERR("get_job","no gbdata defined");
636        GB_pop_transaction(gb_main);
637        return 0;
638    }
639
640    count = (int)GB_read_int(gb_jobCount); // globaler zaehler
641    if (count <= 0) {
642        new AP_ERR("get_job","no job");
643        GB_pop_transaction(gb_main);
644        return 0;
645    }
646
647    //
648    // suche besten job aus cluster und liefer ihn zurueck
649    //
650    gb_cluster = get_cluster(gb_joblist,cluster);
651    if (gb_cluster ==0) {
652        new AP_ERR("no cluster found");
653        GB_pop_transaction(gb_main);
654        return 0;
655    }
656    GBDATA *gb_count = GB_entry(gb_cluster,"count");
657    count = (int)GB_read_int(gb_count); // globaler zaehler
658    if (count <= 0) {
659        new AP_ERR("get_job","no job");
660        GB_pop_transaction(gb_main);
661        return 0;
662    }
663
664    gb_best_job = gbp_job = GB_entry(gb_cluster,"job");
665    if (gbp_job != 0)
666        gbp_criteria = GB_entry(gbp_job,"criteria");
667
668    if (gbp_criteria != 0)
669        crit_best = GB_read_APfloat(gbp_criteria);
670
671    ga_assert(GB_has_key(gbp_job, "job"));
672    while ((gbp_job = GB_nextEntry(gbp_job)) !=0) {
673        gbp_criteria = GB_entry(gbp_job,"criteria");
674        crit_next = GB_read_APfloat(gbp_criteria);
675        if (crit_next > crit_best ) {
676            crit_best = crit_next;
677            gb_best_job = gbp_job;
678        }
679    }
680    if (gb_best_job == 0) {
681        GB_pop_transaction(gb_main);
682        return 0;
683    }
684
685    // lade baeume und loesche job
686    // erhoehe refpointer
687    job           = new GA_job;
688    job->criteria = crit_best;
689   
690    // decrement refcounter & delete trees;
691    GBDATA *gbd = GB_entry(gb_best_job, "cluster0"); if (gbd) job->cluster0 = (int)GB_read_int(gbd);
692    gbd         = GB_entry(gb_best_job, "cluster1"); if (gbd) job->cluster1 = (int)GB_read_int(gbd);
693    gbd         = GB_entry(gb_best_job, "id0");      if (gbd) job->id0      = GB_read_int(gbd);
694    gbd         = GB_entry(gb_best_job, "id1");      if (gbd) job->id1      = GB_read_int(gbd);
695    gbd         = GB_entry(gb_best_job, "modus");    if (gbd) job->modus    = (GA_JOB_MODE)GB_read_int(gbd);
696
697    // finde baeume
698    // Der erste Baum ist im selben Cluster !
699    gb_cluster = get_cluster(gb_tree_opt,job->cluster0);
700    job->tree0 = read_tree(gb_cluster,job->id0);
701
702    if (job->id1 != -1 ){ // falls zweiter baum angegeben
703        gb_cluster = get_cluster(gb_tree_opt,job->cluster1);
704        job->tree1 = read_tree(gb_cluster,job->id1);
705    }
706    // loesche job in DB
707    GB_delete(gb_best_job);
708    GB_pop_transaction(gb_main);
709    return job;
710}
711
712
713AP_ERR *GA_genetic::put_job(int cluster,GA_job *job) {
714    if (cluster > max_cluster) {
715        return new AP_ERR("put_job","wrong cluster");
716    }
717    GBDATA *gb_cluster;
718    GBDATA *gb_jobcluster;
719    GBDATA * gb_job;
720    GBDATA *gb_ref= 0;
721    GBDATA *gb_anzahl;
722    long anzahl;
723    AP_FLOAT crit0=0,crit1=0;
724    AP_ERR *aperr = 0;
725    char *err =0;
726    GBDATA *gbp;
727
728    if (job == 0) {
729        return new AP_ERR("put_job","no job given !");
730    }
731    if (cluster != job->cluster0) {
732        return new AP_ERR("put_job","internal Job error!");
733    }
734    GB_push_transaction(gb_main);
735
736                                // beide referenzcounter erhoehen
737    gb_jobcluster = gb_cluster = get_cluster(gb_joblist,job->cluster0);
738    gb_anzahl     = GB_entry(gb_cluster,"count");
739    anzahl        = GB_read_int(gb_anzahl);
740
741    // Criteria Ausrechnen !!
742    if (job->id1 >= 0) {
743        GBDATA *gbcl = get_cluster(gb_tree_opt,job->cluster1);
744        GBDATA *gbt  = get_tree(gbcl,job->id1);
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        crit1 = GB_read_APfloat(gbp);
750    }
751
752    if (job->id0 >= 0) {
753        GBDATA *gbcl = get_cluster(gb_tree_opt,job->cluster0);
754        GBDATA *gbt  = get_tree(gbcl,job->id0);
755        gbp = GB_entry(gbt,"ref_count");
756        int count = (int)GB_read_int(gbp) + 1;
757        GB_write_int(gbp,count);
758        gbp = GB_entry(gbt,"criteria");
759        crit0 = GB_read_APfloat(gbp);
760    }
761    job->calcCrit(crit0,crit1);
762    gb_job = GB_create_container(gb_jobcluster,0,"job");
763    gbp = GB_search(gb_job,"criteria",GB_CREATE);
764    GB_write_APfloat(gbp,job->criteria);
765    gbp =  GB_search(gb_job,"modus",GB_CREATE);
766    GB_write_int(gbp,(int)job->modus);
767    gbp =  GB_search(gb_job,"cluster0",GB_CREATE);
768    err = GB_write_int(gbp,job->cluster0);
769    gbp =  GB_search(gb_job,"cluster1",GB_CREATE);
770    err = GB_write_int(gbp,job->cluster1);
771    gbp =  GB_search(gb_job,"id0",GB_CREATE);
772    err = GB_write_int(gbp,job->id0);
773    gbp =  GB_search(gb_job,"id1",GB_CREATE);
774    err = GB_write_int(gbp,job->id1);
775
776    if (err !=0) {
777        aperr = new AP_ERR("put job","error while writing job to database");
778        GB_abort_transaction(gb_main);
779        return aperr;
780    }
781
782    jobCount = (int)GB_read_int(gb_jobCount);
783    jobCount++;
784    anzahl++;
785    GB_write_int(gb_jobCount,jobCount);
786    GB_write_int(gb_anzahl,anzahl);
787
788    while (anzahl > maxTree) {
789        cout << "cluster" << job->cluster0;
790        remove_job(gb_jobcluster);
791        anzahl = GB_read_int(gb_anzahl);
792    }
793
794    jobCount = (int)GB_read_int(gb_jobCount);
795
796    while (jobCount >= max_jobs) {
797        remove_job(0);
798    }
799
800    GB_pop_transaction(gb_main);
801    job->printl();
802    return aperr;
803}
804
805
806AP_ERR * GA_genetic::delete_job(GBDATA *gb_job) {
807    // loesche die einzelnen tree referenzen
808    // ggf. die trees
809    GBDATA * gbp;
810    GBDATA *gbt;
811    GBDATA *gb_cluster,*gbcl;
812    GA_job *job;
813    job = new GA_job;
814    GBDATA *jobcl;
815
816    if (gb_job == 0)
817        return new AP_ERR("delete_job","no job given !");
818    jobcl = GB_get_father(gb_job);
819
820    gbp = GB_entry(gb_job,"cluster0"); if (gbp) job->cluster0 = (int)GB_read_int(gbp);
821    gbp = GB_entry(gb_job,"cluster1"); if (gbp) job->cluster1 = (int)GB_read_int(gbp);
822   
823    gbp = GB_entry(gb_job,"id0"); if (gbp) job->id0 = GB_read_int(gbp);
824    gbp = GB_entry(gb_job,"id1"); if (gbp) job->id1 = GB_read_int(gbp);
825
826    // finde baeume
827    // Der erste Baum ist im selben Cluster !
828    gbcl = gb_cluster = get_cluster(gb_tree_opt,job->cluster0);
829
830    gbt = get_tree(gb_cluster,job->id0);
831    delete_tree(gb_cluster,gbt);
832    if (job->id1 != -1 ){ // falls zweiter baum angegeben
833        gb_cluster = get_cluster(gb_tree_opt,job->cluster1);
834        gbt = get_tree(gb_cluster,job->id1);
835        delete_tree(gb_cluster,gbt);
836    }
837    GBDATA *gb_count = GB_entry(jobcl,"count");
838    int count = (int)GB_read_int(gb_count) - 1;
839    GB_write_int(gb_count,count);
840
841    GB_delete(gb_job);
842    jobCount = (int)GB_read_int(gb_jobCount);
843    jobCount--;
844    GB_write_int(gb_jobCount,jobCount);
845    delete job;
846    return 0;
847}
848
849AP_ERR * GA_genetic::remove_job(GBDATA *gb_cluster) {
850    // find worst job in cluster (any if gb_cluster == 0)
851    // an delet it
852    GBDATA *gbjob;
853    GBDATA *gbworst = 0;
854    GBDATA *gbp_criteria;
855    GBDATA *gb_anzahl;
856    AP_FLOAT crit_next,crit_worst;
857    int cl,anzahl =0,safty = 0;
858
859    if (gb_cluster == 0) {
860        while (gb_cluster == 0) {
861            safty ++;
862            cl = (int)random()%max_cluster;
863            gb_cluster = get_cluster(gb_joblist,cl);
864            gb_anzahl = GB_entry(gb_cluster,"count");
865            anzahl = (int)GB_read_int(gb_anzahl);
866            if (anzahl <= min_job) {
867                if (safty > GA_SAFETY) {
868                    new AP_ERR("remove job","get looped");
869                } else {
870                    gb_cluster = 0;
871                }
872            }
873        }
874    }
875
876    gbjob = GB_entry(gb_cluster,"job");
877
878    if (gbjob != 0) {
879        gbp_criteria = GB_entry(gbjob,"criteria");
880        if (gbp_criteria != 0) {
881            crit_worst = GB_read_APfloat(gbp_criteria);
882            gbworst = gbjob;
883        }
884        ga_assert(GB_has_key(gbjob, "job"));
885        while ((gbjob = GB_nextEntry(gbjob)) !=0) {
886            gbp_criteria = GB_entry(gbjob,"criteria");
887            crit_next = GB_read_APfloat(gbp_criteria);
888            if (crit_next > crit_worst ) {
889                crit_worst = crit_next;
890                gbworst = gbjob;
891            }
892        }
893    }
894    if (gbworst == 0) {
895        cout << "Ccluster" << cl;
896        return new AP_ERR("remove_job","No job found");
897    }
898
899    delete_job(gbworst);
900    return 0;
901}
902
903
904
905AP_ERR *GA_genetic::create_jobs(GA_tree *tree,int cluster) {
906    // generiert jobs fuer einen Baum und
907    // speichert diese in der Datenbank
908    int i,t,jc=0;
909    GA_job *job;
910    if (tree == 0)
911        return new AP_ERR("create_jobs","no tree given");
912
913    read_presets();
914
915    /*
916      for (i=0;i<jobOpt;i++){       // Optimierungsjobs
917      job = new GA_job;
918      job->cluster0 = cluster;
919      job->id0 = tree->id;
920      job->cluster1 = -1;
921      job->id1 = -1;
922      job->modus = GA_KERNIGHAN;
923      if (put_job(job->cluster0,job) !=0)
924      ;
925      delete job;
926      }
927      // create list of all trees in clusters
928      // and count number of them
929      */
930    GBDATA *gbt;
931    GBDATA *gbcl;
932    GBDATA *gbc;
933    int count,treeid,treecount=0;
934
935
936    for(i =0;i<max_cluster;i++) {
937        cout << "\n" << i << " : ";
938        gbcl = get_cluster(gb_tree_opt,i);
939        if (gbcl != 0) {
940            gbc = GB_entry(gbcl,"count");
941            if (gbc) count = (int)GB_read_int(gbc);
942            gbt = GB_entry(gbcl,"tree");
943            for (t=0;t<maxTree;t++) {
944                if (gbt != 0) {
945                    treecount ++;
946                    treelist[i][t] = get_treeid(gbt);
947                    cout << " " << treelist[i][t];
948                    gbt = GB_nextEntry(gbt);
949                } else break;
950            }
951            cout << " ** " << t << " count " << count;
952            treePerCluster[i] = t;
953            gbcl = GB_find(gbcl,"cl*",this_level|search_next);
954        } else break;
955    }
956    clusterCount = i;
957    cout << "\n";
958    cout.flush();
959
960    for (i=0;i<jobCrossover;i++){   // Crossoverjobs
961        if (treePerCluster[cluster] > 1) { // in same cluster
962            job = new GA_job;
963            job->cluster0 = cluster;
964            job->id0 = tree->id;
965            job->cluster1 = cluster;
966            // choose random tree
967            treeid = (int)random()%treePerCluster[cluster];
968            while (treelist[cluster][treeid] == job->id0) {
969                treeid = (int)random()%treePerCluster[cluster];
970            };
971            // remove it from treelist by a swap
972            job->id1 = treelist[cluster][treeid];
973            treelist[cluster][treeid] =
974                treelist[cluster][treePerCluster[cluster]-1];
975            treePerCluster[cluster] --;
976            job->modus = GA_CROSSOVER;
977            if (put_job(job->cluster0,job) ==0)
978                jc++;
979            delete job;
980        }
981    }
982
983    int rcl;        // random cluster
984
985    for (i=0;i<jobCrossover;i++){   // Crossoverjobs
986        if (clusterCount <= 1) break;
987        if (treecount <= treePerCluster[cluster]) break;
988        // in same cluster
989        job = new GA_job;
990        job->cluster0 = cluster;
991        job->id0 = tree->id;
992        // search random cluster other than cluster
993        rcl = (int)random()%clusterCount;
994
995        int safty = 0;
996        while ((rcl == cluster) || (treePerCluster[rcl] < 1) )  {
997            safty ++;
998            rcl = (int)random()%clusterCount;
999            if (safty>GA_SAFETY) break;
1000        }
1001        if (safty >GA_SAFETY) {
1002            delete job;
1003            break;
1004        }
1005        job->cluster1 = rcl;
1006        treeid = (int)random()%treePerCluster[rcl];
1007        //      while (treelist[rcl][treeid] == job->id0) {
1008        treeid = (int)random()%treePerCluster[rcl];
1009
1010        //};
1011
1012        // remove it from treelist by a swap
1013        job->id1 = treelist[rcl][treeid];
1014        treelist[rcl][treeid] =
1015            treelist[rcl][treePerCluster[rcl]-1];
1016        treePerCluster[rcl] --;
1017        job->modus = GA_CROSSOVER;
1018        if (put_job(job->cluster0,job) ==0)
1019            jc++;
1020        delete job;
1021    }
1022    if (jc < 1) {   // create jobs falls keine anderen aufgetaucht sind
1023        job = new GA_job;
1024        job->cluster0 = cluster;
1025        job->id0 = tree->id;
1026        job->id1 = job->cluster1 = -1;
1027        job->modus = GA_CREATEJOBS;
1028        put_job(job->cluster0,job);
1029    }
1030    return 0;
1031}
1032
Note: See TracBrowser for help on using the repository browser.