static VALUE problem_alloc(VALUE cls) { struct svm_problem *n; n = problem_new(); if(n == NULL) rb_raise(rb_eNoMemError, "Not enough memory for allocating Libsvm::Problem."); return Data_Wrap_Struct(cls, 0, problem_free, n); }
void solver_problems_iterate( Solver *solver, Request *t, int (*callback)(Problem *p, void *user_data), void *user_data ) { Id problem = 0; if (!callback) return; /* no use to iterate without callback */ while ((problem = solver_next_problem( solver, problem )) != 0) { Problem *p = problem_new( solver, t, problem ); if (callback( p, user_data ) ) break; } }
/* scans a cds for gaps. Returns CLN_GAPS, NOVRLP_CLN_GAPS, NO_GAPS, or FSHIFT_BAD; doesn't try to check for compensatory indels, which is more complicated (this is left for the special-purpose function below) */ int scan_for_gaps(GFF_Feature *feat, MSA *msa, Problem **problem) { int msa_start = feat->start - 1; int msa_end = feat->end - 1; int i, j; int near_boundary = 0; cds_gap_type retval = NGAPS; List *gaps = lst_new_ptr(10); for (j = 0; retval != FSHIFT_BAD && j < msa->nseqs; j++) { for (i = msa_start; i <= msa_end; i++) { if (ss_get_char_pos(msa, i, j, 0) == GAP_CHAR) { int gap_start, gap_end; struct gap *g; for (gap_start = i-1; gap_start >= msa_start && ss_get_char_pos(msa, gap_start, j, 0) == GAP_CHAR; gap_start--); gap_start++; /* inclusive */ for (gap_end = i+1; gap_end <= msa_end && ss_get_char_pos(msa, gap_end, j, 0) == GAP_CHAR; gap_end++); gap_end--; /* inclusive */ if ((gap_end - gap_start + 1) % 3 != 0) { retval = FSHIFT_BAD; *problem = problem_new(feat, FSHIFT, gap_start, gap_end); (*problem)->cds_gap = FSHIFT_BAD; break; } /* note whether gaps occur near a cds boundary (within 3 sites) */ if (gap_start <= msa_start + 3 || gap_end >= msa_end - 3) near_boundary = 1; if (retval == NGAPS) retval = CLN_GAPS; g = smalloc(sizeof(struct gap)); g->start = gap_start; g->end = gap_end; lst_push_ptr(gaps, g); i = gap_end; } } } if (retval == CLN_GAPS) { /* now check for overlaps */ lst_qsort(gaps, gap_compare); retval = NOVRLP_CLN_GAPS; for (i = 1; i < lst_size(gaps); i++) { struct gap *g1 = lst_get_ptr(gaps, i-1); struct gap *g2 = lst_get_ptr(gaps, i); if (g2->start <= g1->end && (g2->start != g1->start || g2->end != g1->end)) { retval = CLN_GAPS; break; } } if (retval == NOVRLP_CLN_GAPS && near_boundary) retval = CLN_GAPS; /* note that the boundary criterion is being confounded with the overlap criterion. Doesn't seem worth fixing at the moment ... */ } for (i = 0; i < lst_size(gaps); i++) sfree(lst_get_ptr(gaps, i)); lst_free(gaps); return retval; }
/* create a new problem, and add to the list */ Problem *problem_add(List *problems, GFF_Feature *feat, status_type status, int start, int end) { Problem *p = problem_new(feat, status, start, end); lst_push_ptr(problems, p); return p; }