Ejemplo n.º 1
0
void getPostOrder(int *pre, int *mid, int *post, int len){
	int i;
	int idx = 0;
	
	for(i = 0; i < len; i++) if(mid[i] == pre[0]){
		idx = i;
		break;
	}
	if(len < 0) return;
	getPostOrder(pre +1,mid, post, idx);
	getPostOrder(pre + idx + 1, mid+ idx + 1, post + idx, len - idx -1);
	post[len -1] = pre[0];
}
Ejemplo n.º 2
0
int main(){
	int i;
	int cnt = 0;
	char c;
	int pre[100] = {-1};
	int mid[100] = {-1};
	int *post;
	while(scanf("%c", &c), c != '\n'){
		if(isdigit(c)){
			pre[cnt++] = c;
		}
	}
	cnt = 0;
	while(scanf("%c", &c), c != '\n'){
		if(isdigit(c)){
			mid[cnt++] = c;
		}
	}
	post = malloc(sizeof(int) * cnt);
	assert(post != NULL);
	getPostOrder(pre, mid, post, cnt);
	for(i = 0; i< cnt; i++){
		printf("%d\n", post[i]);
	}
	printf("\n");
}
Ejemplo n.º 3
0
void parsimony(Tree *tree, int nseqs, char **seqs,
               bool buildAncestral, char **ancetralSeqs)
{
    int seqlen = strlen(seqs[0]);
    
    // allocate dynamic table
    ParsimonyCell *table = new ParsimonyCell [tree->nnodes * 4];
    int *gapless = new int [tree->nnodes];
    
    // initalize distances
    for (int i=0; i<tree->nnodes; i++) {
        tree->nodes[i]->dist = 0.0;
        gapless[i] = 0;
    }
    
    // get recursion order
    ExtendArray<int> postorder(0, tree->nnodes);
    getPostOrder(tree, &postorder);

    
    for (int i=0; i<seqlen; i++) {
        // initialize leaves
        // iterate just over the leaves
        
        for (int j=0; j<nseqs; j++) {
            int base = dna2int[(int) (unsigned char) seqs[j][i]];
            
            if (base == -1) {
                // gap
                for (int k=0; k<4; k++) {             
                    table[matind(4, j, k)].cost = 0;
                    table[matind(4, j, k)].gap = true;
                }
            } else {
                for (int k=0; k<4; k++) {
                    table[matind(4, j, k)].cost = MAX_COST;
                    table[matind(4, j, k)].gap = false;
                }
                table[matind(4, j, base)].cost = 0;
            }
        }
        
        // populate cost table
        parsimony_helper(tree, nseqs, seqs, table, postorder);
        
        
        // find min cost at root
        float mincost = MAX_COST;
        int minbase= 0;
        int root = tree->root->name;
        
        for (int a=0; a<4; a++) {
            if (table[matind(4, root, a)].cost < mincost) {
                mincost = table[matind(4, root, a)].cost;
                minbase = a;
            }
        }
        
        // add up dist
        getParsimonyCost(tree, tree->root, minbase, table);
        
        // add up ungapped chars
        for (int j=0; j<tree->nnodes; j++) {
            gapless[j] += table[matind(4, j, 0)].gap ? 0 : 1;
        }
    }
    
    // divide subsitutions by number of sites
    for (int i=0; i<tree->nnodes; i++)
        if (gapless[i] != 0.0)
            tree->nodes[i]->dist /= gapless[i];
    
    // place root in middle of top branch
    Node *rootnode = tree->root;
    float totlen = rootnode->children[0]->dist + 
                   rootnode->children[1]->dist;
    rootnode->children[0]->dist = totlen / 2.0;
    rootnode->children[1]->dist = totlen / 2.0;
    
    // cleanup
    delete [] table;
    delete [] gapless;
    
}