예제 #1
0
파일: traceback.c 프로젝트: ash211/gtfold
int traceVBI(int i, int j) {
	
	int VBIij_temp;
	int ip, jp, el, v;
	int ifinal, jfinal;

	ifinal = 0;
	jfinal = 0;

	for (ip = i + 1; ip < j - 1; ip++) {
		for (jp = ip + 1; jp < j; jp++) {
			if (check_iloop(i,j,ip,jp)) continue;
			el = eL(i, j, ip, jp);
			v = V(ip, jp);
			VBIij_temp = el + v;
			if (VBIij_temp == VBI(i,j)) {
				ifinal = ip;
				jfinal = jp;
				break;
			}
		}
		if (jp != j)
			break;
	}

	structure[ifinal] = jfinal;
	structure[jfinal] = ifinal;
	if (verbose==1) 
		printf(" %12.2f\n", eL(i, j, ifinal, jfinal)/100.00);
	total_en += eL(i, j, ifinal, jfinal);

	int eVI = traceV(ifinal, jfinal);
	return eVI ;
}
예제 #2
0
void NSEDataTraceService::traceRegurlarGrid(
    peano::applications::faxen::lbf::RegularGridBlockVertex**  vertices,
    peano::applications::faxen::lbf::RegularGridBlockCell&  cell,
    const tarch::la::Vector<DIMENSIONS,double>&  centerPoint) {
    if(_isInitialized) {
        int indX = floor((centerPoint[0]-_xOffset)/_dx);
        int indY = floor((centerPoint[1]-_yOffset)/_dy);
//		std::cout << "cell center point: " << centerPoint << std::endl;
//		std::cout << "indX & indY: " << indX << ", " << indY  << std::endl;
//		std::cout << "is trace u enabled: " << _traceU << std::endl;
//		std::cout << "is trace v enabled: " << _traceV << std::endl;
//		std::cout << "is trace p enabled: " << _traceP << std::endl;
        traceU(indX,indY,cell);
        traceV(indX,indY,cell);
        traceRHS(indX,indY,cell);
        traceP(indX,indY,cell);
    }
}
예제 #3
0
파일: traceback.c 프로젝트: ash211/gtfold
int traceV(int i, int j) {
	int a, b, c, d, Vij;
	if (j-i < TURN)  return INFINITY_;

	a = eH(i, j);
	b = eS(i, j) + V(i + 1, j - 1);
	if (eS(i, j) == 0) b = INFINITY_;
	c = VBI(i,j);
	d = VM(i,j);
	
	Vij = MIN(MIN(a, b), MIN(c, d));
	
	if (Vij == a && Vij != b && Vij != c && Vij != d) { 
		if (verbose == 1) 
			printf("i %5d j %5d Hairpin   %12.2f\n", i, j, eH(i, j)/100.00);
		total_en += eH(i,j);
		return Vij;
	} else if (Vij == b) { 
		if (verbose == 1) 
			printf("i %5d j %5d Stack     %12.2f\n", i, j, eS(i, j)/100.00);
		total_en += eS(i,j);
		structure[i + 1] = j - 1;
		structure[j - 1] = i + 1;
		traceV(i + 1, j - 1);
		return Vij;
	} else if (Vij == c) { 
		if (verbose == 1) 
			printf("i %5d j %5d IntLoop  ", i, j);
		traceVBI(i, j);
		return Vij;
	} else if (Vij == d && Vij != a && Vij != b && Vij != c) { 
		int eVM = traceVM(i, j);
		if (verbose ==1) 
			printf("i %5d j %5d MultiLoop %12.2f\n", i, j, (Vij-eVM)/100.0);
		total_en += (Vij-eVM);
		return Vij;
	} 
	return 0;
}
예제 #4
0
void traceW(int j) {
	int done = 0, i;
	int wim1, flag = 1 ;
	
  if (j == 0 || j == 1)
    return;
	
	for (i = 1; i < j && !done; i++) {
		if (j-i < TURN) continue;

		wim1 = MIN(0, W[i-1]);
		flag = 1;
		if ( wim1 != W[i-1] && canSSregion(0,i)) flag = 0;

		if (g_unamode||g_mismatch) {
			if ((W[j] == V(i,j) + auPenalty(i, j) + wim1 && canStack(i,j)) || forcePair(i,j)) { 
							done = 1;
							if (print_energy_decompose == 1) fprintf(energy_decompose_outfile, "i %5d j %5d ExtLoop   %12.2f\n", i, j, auPenalty(i, j)/100.00);
							total_ex += auPenalty(i, j);
							traceV(i, j);
							if (flag ) traceW(i - 1);
							break;
			} else if ((W[j] ==  V(i,j-1) + auPenalty(i,j-1) + Ed5(j-1,i,j) + wim1 && canSS(j) && canStack(i,j-1)) || forcePair(i, j-1)) { 	
							done = 1;
							if (print_energy_decompose == 1) fprintf(energy_decompose_outfile, "i %5d j %5d ExtLoop   %12.2f\n", i, j-1, (auPenalty(i,j-1) + Ed5(j-1,i,j))/100.00);
							total_ex += (auPenalty(i,j-1) + Ed5(j-1,i,j));
							traceV(i, j - 1);
							if (flag ) traceW(i - 1);
							break;
			} else if ((W[j] == V(i+1,j) + auPenalty(i+1,j) + Ed3(j,i+1,i) + wim1 && canSS(i) && canStack(i+1,j)) || forcePair(i+1,j)){
							done = 1;
							if (print_energy_decompose == 1) fprintf(energy_decompose_outfile, "i %5d j %5d ExtLoop   %12.2f\n", i+1, j, (auPenalty(i+1,j) + Ed3(j,i+1,i))/100.00);
							total_ex += (auPenalty(i+1,j) + Ed3(j,i+1,i));
							traceV(i + 1, j);
							if (flag ) traceW(i - 1);
							break;
			} else if ((W[j] == V(i+1,j-1) + auPenalty(i+1, j-1) + Estacke(j-1,i+1) + wim1 && canSS(i) && canSS(j) && canStack(i+1,j-1)) || forcePair(i+1,j-1)) { 
							done = 1;
							if (print_energy_decompose == 1) fprintf(energy_decompose_outfile, "i %5d j %5d ExtLoop   %12.2f\n", i+1, j-1, (auPenalty(i+1, j-1) + Estacke(j-1,i+1))/100.00);
							total_ex += (auPenalty(i+1, j-1) + Estacke(j-1,i+1));
							traceV(i + 1, j - 1);
							if (flag ) traceW(i - 1);
							break;
			}
		} else if (g_dangles == 2) {
				int e_dangles = 0;
				if (i>1) e_dangles +=  Ed3(j,i,i-1);
				if (j<length) e_dangles += Ed5(j,i,j+1);
				if ((W[j] == V(i,j) + auPenalty(i, j) + e_dangles + wim1 && canSS(i) && canSS(j) && canStack(i+1,j-1)) || forcePair(i+1,j-1)) { 
												done = 1;
												if (print_energy_decompose == 1) fprintf(energy_decompose_outfile, "i %5d j %5d ExtLoop   %12.2f\n", i+1, j-1, (auPenalty(i, j) + e_dangles)/100.00);
												total_ex += (auPenalty(i, j) + e_dangles);
												traceV(i, j);
												if (flag ) traceW(i - 1);
												break;
				} 
		}	else if (g_dangles == 0) {
			if ((W[j] == V(i,j) + auPenalty(i, j) + wim1 && canStack(i,j)) || forcePair(i,j)) { 
							done = 1;
							if (print_energy_decompose == 1) fprintf(energy_decompose_outfile, "i %5d j %5d ExtLoop   %12.2f\n", i, j, auPenalty(i, j)/100.00);
							total_ex += auPenalty(i, j);
							traceV(i, j);
							if (flag ) traceW(i - 1);
							break;
			}
		} else { // default
			if ((W[j] == V(i,j) + auPenalty(i, j) + wim1 && canStack(i,j)) || forcePair(i,j)) { 
							done = 1;
							if (print_energy_decompose == 1) fprintf(energy_decompose_outfile, "i %5d j %5d ExtLoop   %12.2f\n", i, j, auPenalty(i, j)/100.00);
							total_ex += auPenalty(i, j);
							traceV(i, j);
							if (flag ) traceW(i - 1);
							break;
			} else if ((W[j] ==  V(i,j-1) + auPenalty(i,j-1) + Ed5(j-1,i,j) + wim1 && canSS(j) && canStack(i,j-1)) || forcePair(i, j-1)) { 	
							done = 1;
							if (print_energy_decompose == 1) fprintf(energy_decompose_outfile, "i %5d j %5d ExtLoop   %12.2f\n", i, j-1, (auPenalty(i,j-1) + Ed5(j-1,i,j))/100.00);
							total_ex += (auPenalty(i,j-1) + Ed5(j-1,i,j));
							traceV(i, j - 1);
							if (flag ) traceW(i - 1);
							break;
			} else if ((W[j] == V(i+1,j) + auPenalty(i+1,j) + Ed3(j,i+1,i) + wim1 && canSS(i) && canStack(i+1,j)) || forcePair(i+1,j)){
							done = 1;
							if (print_energy_decompose == 1) fprintf(energy_decompose_outfile, "i %5d j %5d ExtLoop   %12.2f\n", i+1, j, (auPenalty(i+1,j) + Ed3(j,i+1,i))/100.00);
							total_ex += (auPenalty(i+1,j) + Ed3(j,i+1,i));
							traceV(i + 1, j);
							if (flag ) traceW(i - 1);
							break;
			} else if ((W[j] == V(i+1,j-1) + auPenalty(i+1, j-1) + Ed3(j-1,i+1,i) + Ed5(j-1,i+1,j) + wim1 && canSS(i) && canSS(j) && canStack(i+1,j-1)) || forcePair(i+1,j-1)) { 
							done = 1;
							if (print_energy_decompose == 1) fprintf(energy_decompose_outfile, "i %5d j %5d ExtLoop   %12.2f\n", i+1, j-1, (auPenalty(i+1, j-1) + Ed3(j-1,i+1,i) + Ed5(j-1,i+1,j))/100.00);
							total_ex += (auPenalty(i+1, j-1) + Ed3(j-1,i+1,i) + Ed5(j-1,i+1,j));
							traceV(i + 1, j - 1);
							if (flag ) traceW(i - 1);
							break;
			} 
		}
	}
		
	if (W[j] == W[j - 1] && !done) traceW(j-1);
 
	//if (!done) {
	//	fprintf(stderr, "ERROR: W(%d) could not be traced\n", j);
	//}

	return;
}
예제 #5
0
int traceWM(int i, int j) {
	assert(i < j);
	int done=0, eWM=0;

	if (!done && WM(i,j) == WMPrime[i][j]) {
			eWM += traceWMPrime(i,j);
			done = 1;
	}

	if (!done){
		if (g_unamode||g_mismatch) {
						if (WM(i,j) == V(i,j) + auPenalty(i, j) + Eb && canStack(i,j)) { 
										eWM += traceV(i, j);
										done = 1;
						} else if (WM(i,j) == V(i+1, j) + Ed3(j,i + 1,i) + auPenalty(i+1, j) + Eb + Ec && canSS(i) &&  canStack(i+1,j)) { 
										eWM += traceV(i + 1, j);
										done = 1;
						} else if (WM(i,j) == V(i,j-1) + Ed5(j-1,i,j) + auPenalty(i,j-1) +  Eb + Ec && canSS(j) && canStack(i,j-1)) { 
										done = 1;
										eWM += traceV(i, j - 1);
						} else if (WM(i,j) == V(i+1,j-1) + Estackm(j-1,i+1) + auPenalty(i+1, j-1) + Eb + 2*Ec && canSS(i) && canSS(j) && canStack(i+1,j-1)) {
										done = 1;
										eWM += traceV(i + 1, j - 1);
						}
		} else if (g_dangles == 2) {
						int energy = V(i,j) + auPenalty(i, j) + Eb;				
						energy += (i==1)?Ed3(j,i,length):Ed3(j,i,i-1);
						/*if (j<len)*/ energy += Ed5(j,i,j+1);
						if (WM(i,j) ==  energy && canSS(i) && canSS(j) && canStack(i+1,j-1)) { 
										eWM += traceV(i, j);
										done = 1;
						}
		} else if (g_dangles == 0) {
						if (WM(i,j) == V(i,j) + auPenalty(i, j) + Eb && canStack(i,j)) { 
										eWM += traceV(i, j);
										done = 1;
						}
		} else  {
						if (WM(i,j) == V(i,j) + auPenalty(i, j) + Eb && canStack(i,j)) { 
										eWM += traceV(i, j);
										done = 1;
						} else if (WM(i,j) == V(i+1, j) + Ed3(j,i + 1,i) + auPenalty(i+1, j) + Eb + Ec && canSS(i) &&  canStack(i+1,j)) { 
										eWM += traceV(i + 1, j);
										done = 1;
						} else if (WM(i,j) == V(i,j-1) + Ed5(j-1,i,j) + auPenalty(i,j-1) +  Eb + Ec && canSS(j) && canStack(i,j-1)) { 
										eWM += traceV(i, j - 1);
										done = 1;
						} else if (WM(i,j) == V(i+1,j-1) + Ed3(j-1,i+1,i) + Ed5(j-1,i+1,j) + auPenalty(i+1, j-1) + Eb + 2*Ec && canSS(i) && canSS(j) && canStack(i+1,j-1)) { 
										eWM += traceV(i + 1, j - 1);
										done = 1;
						}
		}
	}
	
	if (!done){
		if (WM(i,j) == WM(i + 1,j) + Ec && canSS(i)) { 
							done = 1;
							eWM += traceWM(i + 1, j);
		} else if (WM(i,j) == WM(i,j - 1) + Ec && canSS(j)) { 
							done = 1;
							eWM += traceWM(i, j - 1);
		}
	}

	if(!done) { 
		fprintf(stderr, "ERROR: WM(%d,%d) could not be traced\n", i,j);
	}
	return eWM;
}
예제 #6
0
파일: traceback.c 프로젝트: ash211/gtfold
void traceW(int j) {
	int done, i, Wj,Wj_temp;
	int wim1, flag, Widjd, Wijd, Widj, Wij;
	Wj = INFINITY_;
	flag = 1;
	done = 0; 
	
	if (j == 0 || j == 1) return;

	for (i = 1; i < j && !done; i++) {
		if (j-i < TURN) continue;

		wim1 = MIN(0, W[i-1]);
		flag = 1;
		if (wim1 != W[i-1]) flag = 0;

		Widjd = Wijd =  Widj = INFINITY_;
		Wij = V(i,j) + auPenalty(i, j) + wim1;
		Widjd =(check_base(i)&&check_base(j))?(V(i+1,j-1) + auPenalty(i+1, j-1) + Ed3(j-1,i+1,i) + Ed5(j-1,i+1,j) + wim1): INFINITY_;
		Wijd = (check_base(j))?(V(i,j-1) + auPenalty(i,j-1) + Ed5(j-1,i,j) + wim1):INFINITY_;
		Widj = (check_base(i))?(V(i+1,j) + auPenalty(i+1,j) + Ed3(j,i+1,i) + wim1):INFINITY_;
		Wj_temp=Wj;
		Wj = MIN(MIN(MIN(Wij, Widjd), MIN(Wijd, Widj)), Wj);

		if (W[j] == Wj) {
			if (W[j] == Wij) { 
				done = 1;
				if (verbose == 1) 
					printf("i %5d j %5d ExtLoop   %12.2f\n", i, j, auPenalty(i, j)/100.00);
				total_ex += auPenalty(i, j);
				structure[i] = j;
				structure[j] = i;
				traceV(i, j);
				if (flag || is_ss(1,i)) traceW(i - 1);
				break;
			} else if (W[j] == Widjd && check_base(i) && check_base(j)) { 
				done = 1;
				if (verbose == 1) 
					printf("i %5d j %5d ExtLoop   %12.2f\n", i+1, j-1, (auPenalty(i+1, j-1) + Ed3(j-1,i+1,i) + Ed5(j-1,i+1,j))/100.00);
				total_ex += (auPenalty(i+1, j-1) + Ed3(j-1,i+1,i) + Ed5(j-1,i+1,j));
				structure[i + 1] = j - 1;
				structure[j - 1] = i + 1;
				traceV(i + 1, j - 1);
				if (flag || is_ss(1,i)) traceW(i - 1);
				break;
			} else if (W[j] == Wijd && check_base(j)) { 
				done = 1;
				if (verbose == 1) 
					printf("i %5d j %5d ExtLoop   %12.2f\n", i, j-1, (auPenalty(i,j-1) + Ed5(j-1,i,j))/100.00);
				total_ex += (auPenalty(i,j-1) + Ed5(j-1,i,j));
				structure[i] = j - 1;
				structure[j - 1] = i;
				traceV(i, j - 1);
				if (flag || is_ss(1,i)) traceW(i - 1);
				break;
			} else if (W[j] == Widj && check_base(i)) { 
				done = 1;
				if (verbose == 1) 
					printf("i %5d j %5d ExtLoop   %12.2f\n", i+1, j, (auPenalty(i+1,j) + Ed3(j,i+1,i))/100.00);
				total_ex += (auPenalty(i+1,j) + Ed3(j,i+1,i));
				structure[i + 1] = j;
				structure[j] = i + 1;
				traceV(i + 1, j);
				if (flag || is_ss(1,i)) traceW(i - 1);
				break;
			}
		}
	}
		
	if (W[j] == W[j - 1] && !done) traceW(j-1);

	return;
}