コード例 #1
0
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();
    }
}
コード例 #2
0
ファイル: grappa_interface.c プロジェクト: amnh/poy5
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); 

}