public static String predictFromGrammar23S( String seq, String nat, Grammar grammar, boolean verbose) { int size = seq.length(); Map<String, BigDouble> parr = new HashMap<String, BigDouble>(); int[][][] tau = new int[size][size][3]; output.out("\t\tTau allocated"); String pred = null; if (size < 1) { output.out("\nInvalid sequence provided: \n\t[ " + seq + " ]"); return pred; } output.out("\nPredicting secondary structure for \n\t\t[ " + seq + " ]"); long start = System.currentTimeMillis(); for (int i = 0; i < size; i++) { // Progress Bar CommandLine.DisplayBar(seq.length(), i, ((long) (System.currentTimeMillis() - start) / 1000)); for (int j = i; j < size; j++) { String ij = i + ":" + (i + j); for (int k = 0; k < 3; k++) { tau[i][j][k] = -1; parr.put(ij + ":" + k, new BigDouble(0)); } } } CommandLine.DisplayBarFinish(); // Fill Array if (grammar instanceof PfoldGrammar) { PfoldGrammar pfold = (PfoldGrammar) grammar; // _23S_CYK(seq, pfold.getKH_params(), pfold // .getPfold_paramsUnmatched(), pfold // .getPfold_paramsBasePairs(), parr, tau); } BigDouble prob = parr.get("0:" + (size - 1) + ":" + 0); output.out("\t-Probability of highest probability parse for sequence is \n\t\t" + prob); if (prob != null) { // grammar.recordProbability(prob); // Trace Back if (prob.compareTo(0) > 0) { pred = kh_trace_back(tau); { output.out("\t-Highest probability parse generates structure\n\t\t[ " + pred + " ]"); if (nat != null) output.out( "\t-FMeasure for predicted structure is\n\t\t" + Compare.getFMeasureBD(nat, pred)); } } } return pred; }
// private static void Pfold_CYK(String seq, BigDouble[] p, BigDouble[] p_u, // BigDouble[][] p_bp, BigDouble[][][] arr, int[][][] tau) { private static void Pfold_CYK( String seq, BigDecimal[] p, BigDecimal[] p_u, BigDecimal[][] p_bp, BigDecimal[][][] arr, int[][][] tau) { int S = 0, L = 1, F = 2; int[] seq2 = PfoldGrammar.getNucleotideIndexArray(seq); BigDecimal temp, tempProd, one = new BigDecimal(1); BigDecimal S_LS, L_dFd, F_dFd; S_LS = one.subtract(p[S]); L_dFd = one.subtract(p[L]); F_dFd = one.subtract(p[F]); MathContext precision = MathContext.DECIMAL128; for (int i = 0; i < seq.length(); i++) { temp = p[L].multiply(p_u[seq2[i]]); arr[i][i][L] = p[L].multiply(p_u[seq2[i]]); tau[i][i][S] = 0; tau[i][i][L] = 0; tau[i][i][F] = 0; } System.out.println(); long start = System.currentTimeMillis(); for (int j = 0; j < seq.length(); j++) { // Progress Bar CommandLine.DisplayBar(seq.length(), j, ((long) (System.currentTimeMillis() - start) / 1000)); for (int i = 0; i + j < seq.length(); i++) { int ij = i + j; if (j > 2) { tempProd = p_bp[seq2[i]][seq2[ij]].multiply(arr[i + 1][ij - 1][F], precision); // /////// // L->dFd temp = L_dFd.multiply(tempProd, precision); if (arr[i][ij][L].compareTo(temp) <= 0) { arr[i][ij][L] = new BigDecimal(temp.toPlainString()); tau[i][ij][L] = (F << 8) | 0xff; } // /////// // F->dFd temp = F_dFd.multiply(tempProd, precision); if (arr[i][ij][F].compareTo(temp) <= 0) { arr[i][ij][F] = new BigDecimal(temp.toPlainString()); tau[i][ij][F] = (F << 8) | 0xff; } } // ///// // S->L temp = p[S].multiply(arr[i][ij][L], precision); if (arr[i][ij][S].compareTo(temp) <= 0) { arr[i][ij][S] = new BigDecimal(temp.toPlainString()); tau[i][ij][S] = (L << 8) | 0xff; } for (int k = i; k < ij; k++) { tempProd = arr[i][k][L].multiply(arr[k + 1][ij][S], precision); // ////// // S->LS temp = S_LS.multiply(tempProd, precision); if (arr[i][ij][S].compareTo(temp) <= 0) { arr[i][ij][S] = new BigDecimal(temp.toPlainString()); tau[i][ij][S] = (k << 16) | (L << 8) | (S); } // ////// // F->LS temp = p[F].multiply(tempProd, precision); if (arr[i][ij][F].compareTo(temp) <= 0) { arr[i][ij][F] = new BigDecimal(temp.toPlainString()); tau[i][ij][F] = (k << 16) | (L << 8) | (S); } } } } CommandLine.DisplayBarFinish(); }