int unique(struct regs *regs,char *name,int ncols,int col) { char *bf=find_col(name,col+1); struct regs *r; printf("ncols=%d, del col=%d, postfix=%s\n",ncols,col,bf); for(r=regs;r;r=r->next) if(count_cols(r->name)==ncols && !strcmp(bf,find_col(r->name,col+1))) { char buf1[1024]; struct regs *s; remove_col(buf1,r->name,col); printf("Checking %s (reduced to %s)\n",r->name,buf1); for(s=regs;s;s=s->next) if(!strcmp(buf1,s->name)) return 0; else if(s!=r && count_cols(s->name)==ncols && !strcmp(bf,find_col(s->name,col+1))) { char buf2[1024]; remove_col(buf2,s->name,col); printf("Comparing %s %s\n",buf1,buf2); if(!strcmp(buf1,buf2)) return 0; } } return 1; }
void simp_names(struct regs *regs) { struct regs *r; for(r=regs;r;r=r->next) { int ncols=count_cols(r->name); int x; for(x=ncols-2;x>=0;--x) if(unique(regs,get_name(r),ncols,x)) { remove_it(regs,get_name(r),ncols,x); --ncols; } } }
int remove_it(struct regs *r,char *name,int ncols,int col) { char *bf=find_col(name,col+1); while(r) { if(count_cols(r->name)==ncols && !strcmp(bf,find_col(r->name,col+1))) { char bf[1024]; remove_col(bf,r->name,col); printf("removing %s to %s\n",r->name,bf); r->name=strdup(bf); } r=r->next; } }
static fm_system* parse_files(FILE *afile, FILE *cfile) { fm_system* system = (fm_system*)malloc(sizeof(fm_system)); unsigned int i; unsigned int rows = count_rows(afile); unsigned int cols = count_cols(afile); fm_row *fm_rows = (fm_row *) malloc(sizeof(fm_row)*rows); fm_poly *fm_polys = (fm_poly *) malloc(sizeof(fm_poly)*rows*2); fm_poly_entry *fm_lesser_rows = (fm_poly_entry *) malloc(sizeof(fm_poly_entry)*rows*cols); fm_poly_entry *fm_greater_rows = (fm_poly_entry *) malloc(sizeof(fm_poly_entry)*rows); if(fm_rows == NULL || fm_polys == NULL || fm_lesser_rows == NULL || fm_greater_rows == NULL) { fprintf(stderr, "Unable to allocate memory!\n"); exit(1); } for(i = 0; i < rows; ++i) { fm_rows[i].lesser = &(fm_polys[i]); fm_rows[i].greater = &(fm_polys[rows+i]); fm_rows[i].lesser->poly = &(fm_lesser_rows[i*cols]); fm_rows[i].lesser->poly_len = cols; fm_rows[i].greater->poly = &(fm_greater_rows[i]); fm_rows[i].greater->poly_len = 1; } long file_length = fsize(afile)+1; char *buffer = (char *) malloc(sizeof(char)*file_length); fread(buffer, sizeof(char), file_length, afile); rewind(afile); buffer[file_length-1] = '\0'; long long read_integer; char *line_tok, *integer_tok, *line_save, *integer_save; unsigned int ctr_col = 0; unsigned int ctr_row = 0; for (line_tok = strtok_r(buffer+4*sizeof(char), "\n", &line_save); line_tok; line_tok = strtok_r(NULL, "\n", &line_save)) { //printf("line=%s\n", line_tok); for (integer_tok = strtok_r(line_tok, " \t", &integer_save); integer_tok; integer_tok = strtok_r(NULL, " \t", &integer_save)) { //printf("integer=%s\n", integer_tok); sscanf(integer_tok, "%lld", &read_integer); fm_rows[ctr_row].lesser->poly[ctr_col].numerator = read_integer; fm_rows[ctr_row].lesser->poly[ctr_col].denominator = 1; fm_rows[ctr_row].lesser->poly[ctr_col].index = ctr_col + 1; ++ctr_col; } system->nbr_x = ctr_col; system->curr_nbr_x = ctr_col; ctr_col = 0; ++ctr_row; } file_length = fsize(cfile)+1; buffer = (char *) malloc(sizeof(char)*file_length); fread(buffer, sizeof(char), file_length, cfile); rewind(cfile); buffer[file_length-1] = '\0'; ctr_row = 0; for (line_tok = strtok_r(buffer+2*sizeof(char), " \t\n", &line_save); line_tok; line_tok = strtok_r(NULL, "\n", &line_save)) { printf("line=%s\n", line_tok); sscanf(line_tok, "%lld", &read_integer); fm_rows[ctr_row].greater->poly[0].numerator = read_integer; fm_rows[ctr_row].greater->poly[0].denominator = 1; fm_rows[ctr_row].greater->poly[0].index = 0; ++ctr_row; } // free(buffer); system->rows = fm_rows; system->nbr_rows = count_rows(afile); return system; }
int infogap( struct opt_data *op ) { FILE *fl, *outfl; double *opt_params, of, maxof; char buf[255], filename[255]; int i, j, k, n, npar, nrow, ncol, *nPreds, col; gsl_matrix *ig_mat; //! info gap matrix for sorting gsl_permutation *p; nPreds = &op->preds->nTObs; // Set pointer to nObs for convenience if( op->cd->infile[0] == 0 ) { tprintf( "\nInfile must be specified for infogap run\n" ); return( 0 );} nrow = count_lines( op->cd->infile ); nrow--; // Determine number of parameter sets in file npar = count_cols( op->cd->infile, 2 ); npar = npar - 2; // Determine number of parameter sets in file if( npar != op->pd->nOptParam ) { tprintf( "Number of optimization parameters in %s does not match input file\n", op->cd->infile ); return( 0 ); } // Make sure MADS input file and PSSA file agree tprintf( "\n%s contains %d parameters and %d parameter sets\n", op->cd->infile, npar, nrow ); ncol = npar + *nPreds + 1; // Number of columns for ig_mat = #pars + #preds + #ofs ig_mat = gsl_matrix_alloc( nrow, ncol ); p = gsl_permutation_alloc( nrow ); fl = fopen( op->cd->infile, "r" ); if( fl == NULL ) { tprintf( "\nError opening %s\n", op->cd->infile ); return( 0 ); } tprintf( "Computing predictions for %s...", op->cd->infile ); if( ( opt_params = ( double * ) malloc( npar * sizeof( double ) ) ) == NULL ) { tprintf( "Not enough memory!\n" ); return( 0 ); } fgets( buf, sizeof buf, fl ); // Skip header // Fill in ig_mat for( i = 0; i < nrow; i++ ) { fscanf( fl, "%d %lf", &n, &of ); gsl_matrix_set( ig_mat, i, *nPreds, of ); // Place of after predictions for( j = 0; j < npar; j++ ) { fscanf( fl, "%lf", &opt_params[j] ); col = *nPreds + 1 + j; gsl_matrix_set( ig_mat, i, col, opt_params[j] ); // Place after of } fscanf( fl, " \n" ); func_global( opt_params, op, op->preds->res, NULL ); for( j = 0; j < *nPreds; j++ ) { gsl_matrix_set( ig_mat, i, j, op->preds->obs_current[j] ); // Place in first columns } } fclose( fl ); for( k = 0; k < *nPreds; k++ ) { gsl_vector_view column = gsl_matrix_column( ig_mat, k ); gsl_sort_vector_index( p, &column.vector ); // Print out ig_mat with headers sprintf( filename, "%s-pred%d.igap", op->root, k ); outfl = fopen( filename , "w" ); if( outfl == NULL ) { tprintf( "\nError opening %s\n", filename ); return( 0 ); } fprintf( outfl, " %-12s", op->preds->obs_id[k] ); fprintf( outfl, " OFmax OF" ); for( i = 0; i < npar; i++ ) fprintf( outfl, " (%-12s)", op->pd->var_name[i] ); fprintf( outfl, "\n" ); maxof = gsl_matrix_get( ig_mat, gsl_permutation_get( p, 0 ), *nPreds ); for( i = 0; i < nrow; i++ ) { if( maxof < gsl_matrix_get( ig_mat, gsl_permutation_get( p, i ), *nPreds ) ) maxof = gsl_matrix_get( ig_mat, gsl_permutation_get( p, i ), *nPreds ); fprintf( outfl, "%-12g", gsl_matrix_get( ig_mat, gsl_permutation_get( p, i ), k ) ); fprintf( outfl, "%-12g", maxof ); fprintf( outfl, "%-12g", gsl_matrix_get( ig_mat, gsl_permutation_get( p, i ), *nPreds ) ); for( j = *nPreds + 1; j < ncol; j++ ) fprintf( outfl, "%-12g", gsl_matrix_get( ig_mat, gsl_permutation_get( p, i ), j ) ); fprintf( outfl, "\n" ); } fclose( outfl ); tprintf( "Done\n" ); tprintf( "Results written to %s\n\n", filename ); } gsl_matrix_free( ig_mat ); return( 1 ); }