PUBLIC int move_adaptive(char *string, short *ptable, short *s, short *s1, int verbosity_level){ srand(time(NULL)); Encoded enc; enc.seq = string; enc.s0 = s; enc.s1 = s1; /* moves*/ enc.bp_left=0; enc.bp_right=0; enc.bp_left2=0; enc.bp_right2=0; /* options*/ enc.noLP=0; enc.verbose_lvl=verbosity_level; enc.first=1; enc.shift=0; /* degeneracy*/ enc.begin_unpr=0; enc.begin_pr=0; enc.end_unpr=0; enc.end_pr=0; enc.current_en=0; // function enc.funct=NULL; // allocate memory for moves enc.moves_from = (int*) space(ptable[0]*ptable[0]*sizeof(int)); enc.moves_to = (int*) space(ptable[0]*ptable[0]*sizeof(int)); int i; for (i=0; i<MAX_DEGEN; i++) enc.processed[i]=enc.unprocessed[i]=NULL; struct_en str; str.structure = allocopy(ptable); str.energy = energy_of_structure_pt(enc.seq, str.structure, enc.s0, enc.s1, 0); while (move_rset(&enc, &str)!=0) { free_degen(&enc); } free_degen(&enc); copy_arr(ptable, str.structure); free(str.structure); free(enc.moves_from); free(enc.moves_to); return str.energy; }
PUBLIC int move_first( char *string, short *ptable, short *s, short *s1, int verbosity_level, int shifts, int noLP){ cnt_move = 0; Encoded enc; enc.seq = string; enc.s0 = s; enc.s1 = s1; /* moves*/ enc.bp_left=0; enc.bp_right=0; enc.bp_left2=0; enc.bp_right2=0; /* options*/ enc.noLP=noLP; enc.verbose_lvl=verbosity_level; enc.first=1; enc.shift=shifts; /* degeneracy*/ enc.begin_unpr=0; enc.begin_pr=0; enc.end_unpr=0; enc.end_pr=0; enc.current_en=0; /* function */ enc.funct=NULL; int i; for (i=0; i<MAX_DEGEN; i++) enc.processed[i]=enc.unprocessed[i]=NULL; struct_en str; str.structure = allocopy(ptable); str.energy = energy_of_structure_pt(enc.seq, str.structure, enc.s0, enc.s1, 0); while (move_set(&enc, &str)!=0) { free_degen(&enc); } free_degen(&enc); copy_arr(ptable, str.structure); free(str.structure); return str.energy; }
PRIVATE int move_rset(Encoded *Enc, struct_en *str){ /* count better neighbours*/ int cnt = 0; /* deepest descent*/ struct_en min; min.structure = allocopy(str->structure); min.energy = str->energy; Enc->current_en = str->energy; if (Enc->verbose_lvl>0) { fprintf(stderr, " start of MR:\n "); print_str(stderr, str->structure); fprintf(stderr, " %d\n\n", str->energy); } // construct and permute possible moves construct_moves(Enc, str->structure); /* find first lower one*/ int i; for (i=0; i<Enc->num_moves; i++) { Enc->bp_left = Enc->moves_from[i]; Enc->bp_right = Enc->moves_to[i]; cnt = update_deepest(Enc, str, &min); if (cnt) break; } /* if degeneracy occurs, solve it!*/ if (deal_deg && !cnt && (Enc->end_unpr - Enc->begin_unpr)>0) { Enc->processed[Enc->end_pr] = str->structure; Enc->end_pr++; str->structure = Enc->unprocessed[Enc->begin_unpr]; Enc->unprocessed[Enc->begin_unpr]=NULL; Enc->begin_unpr++; cnt += move_rset(Enc, str); } else { /* write output to str*/ copy_arr(str->structure, min.structure); str->energy = min.energy; } /* release minimal*/ free(min.structure); /* resolve degeneracy in local minima*/ if (deal_deg && (Enc->end_pr - Enc->begin_pr)>0) { Enc->processed[Enc->end_pr]=str->structure; Enc->end_pr++; int min = find_min(Enc->processed, Enc->begin_pr, Enc->end_pr); short *tmp = Enc->processed[min]; Enc->processed[min] = Enc->processed[Enc->begin_pr]; Enc->processed[Enc->begin_pr] = tmp; str->structure = Enc->processed[Enc->begin_pr]; Enc->begin_pr++; free_degen(Enc); } return cnt; }
/* move to deepest (or first) neighbour*/ PRIVATE int move_set(Encoded *Enc, struct_en *str){ /* count how many times called*/ cnt_move++; /* count better neighbours*/ int cnt = 0; /* deepest descent*/ struct_en min; min.structure = allocopy(str->structure); min.energy = str->energy; Enc->current_en = str->energy; if (Enc->verbose_lvl>0) { fprintf(stderr, " start of MS:\n "); print_str(stderr, str->structure); fprintf(stderr, " %d\n\n", str->energy); } /* if using first dont do all of them*/ bool end = false; /* insertions*/ if (!end) cnt += insertions(Enc, str, &min); if (Enc->first && cnt>0) end = true; if (Enc->verbose_lvl>1) fprintf(stderr, "\n"); /* deletions*/ if (!end) cnt += deletions(Enc, str, &min); if (Enc->first && cnt>0) end = true; /* shifts (only if enabled + noLP disabled)*/ if (!end && Enc->shift && !Enc->noLP) { cnt += shifts(Enc, str, &min); if (Enc->first && cnt>0) end = true; } /* if degeneracy occurs, solve it!*/ if (!end && (Enc->end_unpr - Enc->begin_unpr)>0) { Enc->processed[Enc->end_pr] = str->structure; Enc->end_pr++; str->structure = Enc->unprocessed[Enc->begin_unpr]; Enc->unprocessed[Enc->begin_unpr]=NULL; Enc->begin_unpr++; cnt += move_set(Enc, str); } else { /* write output to str*/ copy_arr(str->structure, min.structure); str->energy = min.energy; } /* release minimal*/ free(min.structure); /* resolve degeneracy in local minima*/ if ((Enc->end_pr - Enc->begin_pr)>0) { Enc->processed[Enc->end_pr]=str->structure; Enc->end_pr++; int min = find_min(Enc->processed, Enc->begin_pr, Enc->end_pr); short *tmp = Enc->processed[min]; Enc->processed[min] = Enc->processed[Enc->begin_pr]; Enc->processed[Enc->begin_pr] = tmp; str->structure = Enc->processed[Enc->begin_pr]; Enc->begin_pr++; free_degen(Enc); } if (Enc->verbose_lvl>1 && !(Enc->first)) { fprintf(stderr, "\n end of MS:\n "); print_str(stderr, str->structure); fprintf(stderr, " %d\n\n", str->energy); } return cnt; }
/* done with all structures along the way to deepest*/ PRIVATE int update_deepest(Encoded *Enc, struct_en *str, struct_en *min){ /* apply move + get its energy*/ int tmp_en; tmp_en = str->energy + energy_of_move_pt(str->structure, Enc->s0, Enc->s1, Enc->bp_left, Enc->bp_right); do_move(str->structure, Enc->bp_left, Enc->bp_right); if (Enc->bp_left2 != 0) { tmp_en += energy_of_move_pt(str->structure, Enc->s0, Enc->s1, Enc->bp_left2, Enc->bp_right2); do_move(str->structure, Enc->bp_left2, Enc->bp_right2); } int last_en = str->energy; str->energy = tmp_en; /* use f_point if we have it */ if (Enc->funct) { int end = Enc->funct(str, min); /* undo moves */ if (Enc->bp_left2!=0) do_move(str->structure, -Enc->bp_left2, -Enc->bp_right2); do_move(str->structure, -Enc->bp_left, -Enc->bp_right); str->energy = last_en; Enc->bp_left=0; Enc->bp_right=0; Enc->bp_left2=0; Enc->bp_right2=0; return (end?1:0); } if (Enc->verbose_lvl>1) { fprintf(stderr, " "); print_str(stderr, str->structure); fprintf(stderr, " %d\n", tmp_en); } /* better deepest*/ if (tmp_en < min->energy) { min->energy = tmp_en; copy_arr(min->structure, str->structure); /* delete degeneracy*/ free_degen(Enc); /* undo moves*/ if (Enc->bp_left2!=0) do_move(str->structure, -Enc->bp_left2, -Enc->bp_right2); do_move(str->structure, -Enc->bp_left, -Enc->bp_right); str->energy = last_en; Enc->bp_left=0; Enc->bp_right=0; Enc->bp_left2=0; Enc->bp_right2=0; return 1; } /* degeneracy*/ if ((str->energy == min->energy) && (Enc->current_en == min->energy)) { int found = 0; int i; for (i=Enc->begin_pr; i<Enc->end_pr; i++) { if (equals(Enc->processed[i], str->structure)) { found = 1; break; } } for (i=Enc->begin_unpr; !found && i<Enc->end_unpr; i++) { if (equals(Enc->unprocessed[i], str->structure)) { found = 1; break; } } if (!found) { /* print_stren(stderr, str); // fprintf(stderr, " %6.2f\n", str->energy); */ Enc->unprocessed[Enc->end_unpr]=allocopy(str->structure); Enc->end_unpr++; } } /* undo moves*/ if (Enc->bp_left2!=0) do_move(str->structure, -Enc->bp_left2, -Enc->bp_right2); do_move(str->structure, -Enc->bp_left, -Enc->bp_right); str->energy = last_en; Enc->bp_left=0; Enc->bp_right=0; Enc->bp_left2=0; Enc->bp_right2=0; return 0; }