#include "pseud.h" CandStructPtr CandDestruct(CandStructPtr cand) { if(cand==NULL) return NULL; if(cand->ins_array){ cand->ins_array = MemFree(cand->ins_array); } if(cand->del_array){ cand->del_array = MemFree(cand->del_array); } if(cand->order){ cand->order = MemFree(cand->order); } if(cand->id_array){ cand->id_array = MemFree(cand->id_array); } if(cand->t_vector){ cand->t_vector = MemFree(cand->t_vector); } if(cand->pos_vector){ cand->pos_vector = MemFree(cand->pos_vector); } cand = MemFree(cand); return cand; } CandStructPtr CandStructAllocate(short nmax, int num_t) { CandStructPtr cand; cand = (CandStructPtr)calloc(1,sizeof(CandStruct)); if(cand==NULL){return NULL;} cand->ins_array = (short *)calloc(nmax,sizeof(short)); cand->del_array = (short *)calloc(nmax,sizeof(short)); cand->order = (short *)calloc(nmax,sizeof(short)); cand->id_array = (short *)calloc(num_t,sizeof(short)); cand->t_vector = (short *)calloc(num_t,sizeof(short)); cand->pos_vector = (short *)calloc(nmax,sizeof(short)); if(cand->pos_vector==NULL){ printf("out of memory for candidate\n");getch(); cand = CandDestruct(cand);return NULL; } cand->num_pos_cand = -1.0; return cand; } void SetCandToZero(CandStructPtr new_cand, short nmax, int num_t) { int i; short *ins_array, *del_array; short *order; short *id_array; short *t_vector; short *pos_vector; ins_array = new_cand->ins_array; for(i=0;idel_array; for(i=0;iorder; for(i=0;iid_array; for(i=0;it_vector; for(i=0;ipos_vector; for(i=0;ini; nd = cand->nd; /*printf("(ni,nd)=(%d,%d)\n",ni,nd);*/ /*nind_index*/ chain_id->nind_index = ni*(nmax+1)+nd; /*printf("nind_index=%d\n",chain_id->nind_index);*/ ins_array = cand->ins_array; del_array = cand->del_array; /*i_order*/ temp = 0; product = 1; for(i=0;ii_order=temp; /*printf("i_order=%d\n",chain_id->i_order);*/ /*d_order*/ temp = 0; product = 1; for(i=0;id_order=temp; /*printf("d_order=%d\n",chain_id->d_order);*/ /*id_order*/ order = cand->order; temp=0; product = 1; for(i=0;i<(ni+nd);i++){ temp += order[i]*product; product *= 2; } chain_id->order_index=temp; /*printf("order_index=%d\n",chain_id->order_index); */ /*t_index*/ t_vector = cand->t_vector; temp = 0; product = 1; for(i=0;it_index = temp; /*printf("t_index=%d\n",chain_id->t_index); */ /*pos_vector*/ if(chain_id->pos_vector==NULL){printf("Warning!pos_vector=NULL(press any key)\n");getch();return;} memcpy(chain_id->pos_vector, cand->pos_vector, (ni+nd)*sizeof(short)); /*printf("chain_id:"); for(i=0;i<(ni+nd);i++){ printf("%d,",*(chain_id->pos_vector+i)); } printf("\n"); */ chain_id->lnL = cand->lnL; chain_id->num_visit += 1; return; } void IDToArray(ChainIDPtr chain_id, CandStructPtr cand, short lmax, short nmax, int num_t) { short ni, nd; int i, j, k, p, nind_index, temp; short *ins_array, *del_array, *order, *t_vector, *id_array; if(chain_id==NULL){printf("chain_id=NULL\n");getch(); return;} if(cand==NULL){printf("cand=NULL\n");getch(); return;} /*nind_index*/ nind_index = chain_id->nind_index; cand->ni = (short)(nind_index/(nmax+1)); cand->nd = (short)(nind_index%(nmax+1)); /*printf("nind_index=%d\n",chain_id->nind_index);*/ /*printf("(ni,nd)=(%d,%d)\n",ni,nd);*/ ni = cand->ni; nd = cand->nd; ins_array = cand->ins_array; del_array = cand->del_array; /*i_order*/ temp = chain_id->i_order; for(i=0;id_order; for(i=0;iorder; temp=chain_id->order_index; for(i=0;i<(ni+nd);i++){ order[i]=(short)(temp%2); temp /=2; } /*t_index*/ t_vector = cand->t_vector; temp = chain_id->t_index; for(i=0;ipos_vector==NULL){printf("Warning!pos_vector=NULL(press any key)\n");getch();return;} memcpy(cand->pos_vector, chain_id->pos_vector, (ni+nd)*sizeof(short)); /*setup id_array*/ id_array = cand->id_array; j=0; k=0; p=0; for(i=0;ini; nd = src_cand->nd; dist_cand->ni = ni; dist_cand->nd = nd; memcpy(dist_cand->ins_array, src_cand->ins_array, ni*sizeof(short)); memcpy(dist_cand->del_array, src_cand->del_array, nd*sizeof(short)); memcpy(dist_cand->order, src_cand->order, (ni+nd)*sizeof(short)); memcpy(dist_cand->id_array, src_cand->id_array, num_t*sizeof(short)); memcpy(dist_cand->t_vector, src_cand->t_vector, num_t*sizeof(short)); memcpy(dist_cand->pos_vector, src_cand->pos_vector, (ni+nd)*sizeof(short)); dist_cand->lnL=src_cand->lnL; dist_cand->num_pos_cand=src_cand->num_pos_cand; return; } void DisplayCandidate(CandStructPtr cand, int num_t, FILE *fout, short flag) { short i, ni, nd; /*short *ins_array, *del_array; short *order;*/ short *id_array; /*short *t_vector;*/ short *pos_vector; if(cand==NULL){ fprintf(fout,"cand is NULL\n");return; } if(flag)fprintf(fout,"cand->chain_no = %d\n",cand->chain_no); ni = cand->ni; nd = cand->nd; printf("(ni, nd)=(%d, %d)\n",ni, nd); if(flag)fprintf(fout,"(ni, nd)=(%d, %d)\n",ni, nd); /*if(cand->ins_array){ ins_array = cand->ins_array; fprintf(fout,"ins_array:"); for(i=0;idel_array){ del_array = cand->del_array; fprintf(fout,"del_array:"); for(i=0;iorder){ order = cand->order; fprintf(fout,"order:"); for(i=0;i<(ni+nd);i++){fprintf(fout,"%d, ",order[i]); } fprintf(fout,"\n"); } */ if(cand->id_array){ id_array = cand->id_array; printf("id_array:"); for(i=0;it_vector){ t_vector = cand->t_vector; fprintf(fout,"t_vector:"); for(i=0;ipos_vector){ pos_vector = cand->pos_vector; printf("pos_vector:"); for(i=0;i<(ni+nd);i++){printf("%d, ",pos_vector[i]); } printf("\n"); if(flag){ fprintf(fout,"pos_vector:"); for(i=0;i<(ni+nd);i++){fprintf(fout,"%d, ",pos_vector[i]); } fprintf(fout,"\n"); } } return; }