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

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