source: branches/profile/PARSIMONY/GA_main.cxx

Last change on this file was 11062, checked in by westram, 10 years ago
  • stop using malloc.h
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 6.3 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
13void tree_init(AP_tree *tree0);
14GA_genetic * GAgenetic;
15void parsimony_func(AP_tree *);
16
17void  buildRandomTreeRek(AP_tree *tree, AP_tree **list, int *num) {
18    // builds a list of all species
19    if (tree->is_leaf) {
20        AP_tree_nlen *pntr = new AP_tree_nlen;
21        pntr->copy((AP_tree_nlen*)tree);
22        pntr->father = 0;
23        list[*num] = (AP_tree *)pntr;
24        (*num)++;
25        return;
26    }
27    buildRandomTreeRek(tree->leftson, list, num);
28    buildRandomTreeRek(tree->rightson, list, num);
29    return;
30}
31
32
33AP_tree * buildRandomTree(AP_tree *root) {
34    // function returns a random constructed tree
35    // root is tree with species (needed to build a list of species)
36    AP_tree **list;
37
38    if (root->sequence_proto == 0) tree_init(root);
39
40    AP_tree_nlen *ntree;
41    AP_tree *tree1, *tree0;
42    int num;
43    int count = 0;
44
45    root->arb_tree_leafsum();
46
47    list = (AP_tree **)calloc(root->gr.leave_sum + 1, sizeof(AP_tree *));
48
49    buildRandomTreeRek(root, list, &count);
50    count--;
51    while (count >1) {
52        // choose two random numbers
53        num = (int)random()%(count+1);
54        tree0 = list[num];
55        list[num] = list[count];
56        count --;
57        num = (int)random()%(count+1);
58        tree1 = list[num];
59        ntree = new AP_tree_nlen;
60        ntree->leftson = tree0;
61        ntree->rightson = tree1;
62        ntree->sequence = 0;
63        tree0->father = ntree;
64        tree1->father = ntree;
65        ntree->is_leaf = false;
66        // ################## Laengenberechnung #################3
67        ntree->leftlen = .5;
68        ntree->rightlen = .5;
69        list[num] = (AP_tree *)ntree;
70    }
71    tree0 = list[0];
72    free(list);
73    return tree0;
74}
75
76void kernighan_lin(AP_tree_nlen *tree) {
77    if (tree == 0) new AP_ERR("kernighan_lin", "No tree !");
78    // ruft kernighan auf
79}
80
81AP_tree_nlen *crossover(AP_tree_nlen *tree0, AP_tree_nlen *tree1) {
82    int size1, size0;
83    AP_CO_LIST *list0, *list1;
84
85    if (tree0 == 0 || tree1 == 0) {
86        new AP_ERR("crossover", "Needs two tress as argument");
87        return 0;
88    }
89    list0 = tree0->createList(&size0);
90    list1 = tree1->createList(&size1);
91
92    fprintf(GAgenetic->fout, "\ncrossover tree %d %d size %d %d",
93            tree0, tree1, size0, size1);
94
95    // ruft crossover auf
96    return tree0;
97}
98
99int randomCluster() {
100    int maxcluster = GAgenetic->getMaxCluster();
101    int cluster;
102    cluster = (int)random()%maxcluster;
103    cout << cluster << "clust\n";
104    return cluster;
105}
106AP_ERR * make_start_population(GBDATA *gbmain, AP_tree *tree) {
107    // makes random start population
108    // (at least two trees in each cluster)
109    static int msp = 0;
110    msp ++;
111    if (msp > 1) return new AP_ERR("make_start_population", "Only call it once !");
112    int name=0, i = 0, maxcluster;
113
114    AP_tree_nlen* rtree;
115
116    if (GAgenetic == 0) {
117        GAgenetic = new GA_genetic;
118        GAgenetic->init(gbmain);
119    }
120
121    maxcluster = GAgenetic->getMaxCluster();
122    while (i<maxcluster) {
123        rtree = (AP_tree_nlen *)buildRandomTree(tree);
124        rtree->parsimony_rek();
125        GAgenetic->put_start_tree((AP_tree *)rtree, name, i);
126        name ++;
127        fprintf(GAgenetic->fout, "\ncluster %d put Starttree %d", i, name-1);
128        rtree = (AP_tree_nlen *)buildRandomTree(tree);
129        rtree->parsimony_rek();
130        GAgenetic->put_start_tree((AP_tree *)rtree, name, i);
131        name ++;
132        fprintf(GAgenetic->fout, "\nCluster %d put Starttree %d", i, name-1);
133        i ++;
134    }
135    return 0;
136}
137
138void quit_genetic() {
139    fclose(GAgenetic->fout);
140}
141
142void start_genetic(GBDATA *gbmain) {
143    //
144    // the genetic algorithm is implemented here
145    //
146
147    GA_tree * starttree;
148    GA_job *job;
149    int cluster;
150
151
152    if (GAgenetic == 0) {
153        GAgenetic = new GA_genetic;
154        GAgenetic->init(gbmain);
155    }
156    fprintf(GAgenetic->fout, "\n**** Genetic ALGORITHM *****\n");
157    make_start_population(gbmain, ap_main->tree_root);
158
159    //
160    // get starttree and optimize it
161    //
162
163    int i = 0;
164
165    while (i<GAgenetic->getMaxCluster()) {
166        cluster = i;
167        while ((starttree = GAgenetic->get_start_tree(cluster)) != 0) {
168            if (starttree != 0) {
169                kernighan_lin(starttree->tree);
170                GAgenetic->put_optimized(starttree, cluster);
171                fprintf(GAgenetic->fout, "\nStarttree %d optimized in cluster %d",
172                        starttree->id,
173                        cluster);
174                delete starttree;
175            }
176            else {
177                fprintf(GAgenetic->fout, "\nNo starttree found in cluster %d", cluster);
178            }
179        }
180        i ++;
181    }
182
183    //
184    // get job and do it
185    //
186    i = 0;
187    while (i++ <20) {
188        cluster = randomCluster();
189        job = GAgenetic->get_job(cluster);
190        if (job != 0) {
191            switch (job->mode) {
192                case GA_CROSSOVER: {
193                    GA_tree * gaTree = new GA_tree;
194                    gaTree->tree = crossover(job->tree0->tree, job->tree1->tree);
195
196                    GB_push_transaction(gb_main);
197                    char *use = GBT_get_default_alignment(gb_main);
198                    gaTree->tree->load_sequences_rek(0, use);
199                    GB_pop_transaction(gb_main);
200
201                    parsimony_func(gaTree->tree);
202
203                    gaTree->criteria = gaTree->tree->mutation_rate;
204                    gaTree->id = -1;
205                    GAgenetic->put_optimized(gaTree, job->cluster0);
206                    delete gaTree;
207                    delete use;
208                    break; }
209                case GA_KERNIGHAN:
210                    kernighan_lin(job->tree0->tree);
211                    break;
212                case GA_NNI:
213                    break;
214                case GA_CREATEJOBS:
215                    break;
216                case GA_NONE:
217                default:
218                    break;
219            }
220            fprintf(GAgenetic->fout, "\njob %d in cluster %d : %d executed, mode %d"
221                    , job, job->cluster0, job->cluster1, job->mode);
222            GAgenetic->put_optimized(job->tree0, cluster);
223        }
224        else {
225            fprintf(GAgenetic->fout, "\nno job found");
226        }
227    }
228}
Note: See TracBrowser for help on using the repository browser.