void ampegdecoder::seekinit3(int discard) { int i,j,k; int extra=(seekmode==seekmodeexact)?1:0; if ((discard>=seekinitframes)&&extra) for (i=0; i<2; i++) for (j=0; j<32; j++) for (k=0; k<18; k++) prevblck[i][j][k]=0; huffoffset=0; for (i=discard; i<seekinitframes; i++) if (i<(seekinitframes-extra)) for (j=0; j<(hdrlsf?2:1); j++) { if (!decodehdr(0)) return; readmain(0); } else { if (!decodehdr(0)) return; decode3(); } }
value grappa_CAML_inv_med (value medsov, value c_gene1, value c_gene2, value c_gene3, value num_genes,value circular) { int debug=0; CAMLparam5(medsov,c_gene1,c_gene2,c_gene3,num_genes); CAMLxparam1(circular); CAMLlocal1(res); int MEDIAN_SOLVER; struct genome_struct *g1, *g2, *g3; struct genome_struct *gen[3]; struct genome_struct *out_genome_list; struct genome_arr_t *out_genome_arr; int CIRCULAR; int NUM_GENES; int num_cond; int old_max_num_genes; //int multichromosome=0; MEDIAN_SOLVER = Int_val(medsov); g1 = (struct genome_struct *) Data_custom_val (c_gene1); g2 = (struct genome_struct *) Data_custom_val (c_gene2); g3 = (struct genome_struct *) Data_custom_val (c_gene3); CIRCULAR = Int_val(circular); NUM_GENES = Int_val(num_genes); long dims[1]; dims[0] = NUM_GENES; condense3_mem_t * cond3mem_p; cond3mem_p = &CONDENSE3_MEM; convert_mem_t * convertmem_p; convertmem_p = &CONVERT_MEM; old_max_num_genes = cond3mem_p->max_num_genes; if (debug) { printf("grappa_interface.grappa_CAML_inv_med,MEDIAN_SOLVER=%d,MAX_NAME=%d\n",MEDIAN_SOLVER,MAX_NAME); fflush(stdout); } out_genome_list = ( struct genome_struct * ) malloc ( 1 * sizeof ( struct genome_struct ) ); if ( out_genome_list == ( struct genome_struct * ) NULL )fprintf ( stderr, "ERROR: genome_list NULL\n" ); out_genome_list[0].gnamePtr = ( char * ) malloc ( MAX_NAME * sizeof ( char ) ); sprintf (out_genome_list[0].gnamePtr, "%i", 0); if ( out_genome_list[0].gnamePtr == ( char * ) NULL ) { fprintf ( stderr, "ERROR: gname NULL\n" ); }; out_genome_list[0].genes =( int * ) malloc ( NUM_GENES * sizeof ( int ) ); out_genome_list[0].delimiters = (int *) malloc (NUM_GENES * sizeof (int) ); out_genome_list[0].magic_number = GRAPPA_MAGIC_NUMBER; out_genome_list[0].encoding = NULL; if (old_max_num_genes >= NUM_GENES) {} else { //free_mem_4_all (); ini_mem_4_all (NUM_GENES); free_mem_4_invdist (&INVDIST_MEM); ini_mem_4_invdist (NUM_GENES); free_mem_4_albert (); ini_mem_4_albert (NUM_GENES); free_mem_4_siepel (); ini_mem_4_siepel(NUM_GENES); free_mem_4_cond3 (); ini_mem_4_cond3 (NUM_GENES); free_mem_4_convert(); ini_mem_4_convert(NUM_GENES); free_mem_4_mgr(); mgr_ini_mem(NUM_GENES); //3 times of original gene size is the worst case for multi-chromosome. } /* debug msg fprintf(stdout,"in gene list = ["); int x=0; for(x=0;x<NUM_GENES;x++) fprintf(stdout,"%d,",g1->genes[x]); fprintf(stdout,"]; \n"); for(x=0;x<NUM_GENES;x++) fprintf(stdout,"%d,",g2->genes[x]); fprintf(stdout,"]; \n"); for(x=0;x<NUM_GENES;x++) fprintf(stdout,"%d,",g3->genes[x]); fprintf(stdout,"]; \n"); fflush(stdout); debug msg */ if(MEDIAN_SOLVER<7) { condense3 ( g1->genes, g2->genes, g3->genes, cond3mem_p->con_g1->genes, cond3mem_p->con_g2->genes, cond3mem_p->con_g3->genes, NUM_GENES, &num_cond, cond3mem_p->pred1, cond3mem_p->pred2, cond3mem_p->picked, cond3mem_p->decode ); //when 3 input array are the same num_cond = 0 //when 2 out of 3 input array are the same, num_cond could be 0 //either way, median solver in grappa/mgr will crush. //either way, median3 solver will not be called from genAli.ml. //I add the if (num_cond>0) else... here just in case. if (num_cond>0) { gen[0] = cond3mem_p->con_g1; gen[1] = cond3mem_p->con_g2; gen[2] = cond3mem_p->con_g3; switch (MEDIAN_SOLVER) { case 1: //Alberto Capara median solver if ( CIRCULAR ) albert_inversion_median_circular ( gen,num_cond,cond3mem_p->con_med->genes ); else albert_inversion_median_noncircular (gen,num_cond,cond3mem_p->con_med->genes ); break; case 2: //A. Siepel median solver find_reversal_median ( cond3mem_p->con_med, gen, num_cond, &SIEPEL_MEM ); break; case 3: //Exact median solver convert2_to_tsp ( gen[0], gen[1], gen[2], convertmem_p->adjl, convertmem_p->adjp, num_cond, CIRCULAR ); bbtsp ( 2 * num_cond, cond3mem_p->con_med->genes, FALSE, /* cannot use median that does not exist */ gen[0]->genes, gen[1]->genes, gen[2]->genes, convertmem_p->adjl, convertmem_p->neighbors, convertmem_p->stack, convertmem_p->outcycle, convertmem_p->degree, convertmem_p->otherEnd, convertmem_p->edges, CIRCULAR ); break; case 4: //Greedy median solver convert2_to_tsp ( gen[0], gen[1], gen[2], convertmem_p->adjl, convertmem_p->adjp, num_cond, CIRCULAR ); coalestsp ( 2 * num_cond, cond3mem_p->con_med->genes,FALSE, gen[0]->genes, gen[1]->genes, gen[2]->genes, convertmem_p->adjl, convertmem_p->neighbors, convertmem_p->stack, convertmem_p->outcycle, convertmem_p->degree, convertmem_p->otherEnd, convertmem_p->edges, CIRCULAR ); break; /* case5 and case6 need the CONCORDE package */ // http://www.tsp.gatech.edu//concorde/downloads/downloads.htm #ifdef USE_CONCORDE case 5: //SimpleLK TSP median solver convert_to_tsp ( gen[0], gen[1], gen[2], num_cond, CIRCULAR, convertmem_p->weights ); greedylk ( 2 * num_cond, convertmem_p->weights, cond3mem_p->con_med->genes, convertmem_p->incycle, convertmem_p->outcycle ); break; case 6: //ChainedLK TSP median solver convert_to_tsp ( gen[0], gen[1], gen[2], num_cond, CIRCULAR, convertmem_p->weights ); chlinkern ( 2 * num_cond, convertmem_p->weights, cond3mem_p->con_med->genes, convertmem_p->incycle, convertmem_p->outcycle ); break; #endif default: fprintf(stderr, "unknown choice of median solver !\n"); break; } decode3 ( out_genome_list->genes, cond3mem_p->con_med->genes, cond3mem_p->pred1, cond3mem_p->decode, num_cond ); } else { int x=0; for(x=0;x<NUM_GENES;x++) { out_genome_list->genes[x] = g1->genes[x]; out_genome_list->delimiters[x] = g1->delimiters[x]; } // memcpy (out_genome_list->genes, g1->genes, NUM_GENES); // memcpy (out_genome_list->delimiters, g1->delimiters, NUM_GENES); out_genome_list->deli_num = g1->deli_num; out_genome_list->genome_num = g1->genome_num; } } else// MEDIAN_SOLVER == 7, MGR median solver { mgr_med (g1->genes,g2->genes,g3->genes,g1->delimiters,g2->delimiters,g3->delimiters,g1->deli_num,g2->deli_num,g3->deli_num, NUM_GENES,CIRCULAR,out_genome_list); } /* debug msg fprintf(stdout,"out_genome_list = ["); int xx=0; for(xx=0;xx<NUM_GENES;xx++) fprintf(stdout,"%d,",out_genome_list->genes[xx]); fprintf(stdout,"]; delimiters = ["); for(xx=0;xx<out_genome_list->deli_num;xx++) fprintf(stdout,"%d",out_genome_list->delimiters[xx]); fprintf(stdout,"]\n"); fflush(stdout); debug msg */ CAMLlocal1 (c_genome_arr); c_genome_arr = alloc_custom(&genomeArrOps, sizeof(struct genome_arr_t), 1, 1000000); out_genome_arr = (struct genome_arr_t *) Data_custom_val(c_genome_arr); // fprintf(stdout, "inv_med , genome list addr=%p\n",out_genome_arr); out_genome_arr->magic_number = GRAPPA_MAGIC_NUMBER; out_genome_arr->genome_ptr = out_genome_list; assert( GRAPPA_MAGIC_NUMBER == out_genome_list[0].magic_number); out_genome_arr->num_genome = 1; out_genome_arr->num_gene = NUM_GENES; CAMLreturn(c_genome_arr); }