SCORE lp2Fast(SCORE x) { assert(x >= 0); const int iTableSize = 1000; const double dRange = 20.0; const double dScale = dRange/iTableSize; static SCORE dValue[iTableSize]; static bool bInit = false; if (!bInit) { for (int i = 0; i < iTableSize; ++i) dValue[i] = (SCORE) lp2(i*dScale); bInit = true; } if (x >= dRange) return 0.0; int i = (int) (x/dScale); assert(i >= 0 && i < iTableSize); SCORE dResult = dValue[i]; assert(BTEq(dResult, lp2(x))); return dResult; }
bool ScoreEq(SCORE s1, SCORE s2) { return BTEq(s1, s2); }
// The usual sum-of-pairs objective score: sum the score // of the alignment of each pair of sequences. SCORE ObjScoreSP(const MSA &msa, SCORE MatchScore[]) { #if TRACE Log("==================ObjScoreSP==============\n"); Log("msa=\n"); msa.LogMe(); #endif g_SPScoreLetters = 0; g_SPScoreGaps = 0; if (0 != MatchScore) { const unsigned uColCount = msa.GetColCount(); for (unsigned uColIndex = 0; uColIndex < uColCount; ++uColIndex) MatchScore[uColIndex] = 0; } const unsigned uSeqCount = msa.GetSeqCount(); SCORE scoreTotal = 0; unsigned uPairCount = 0; #if TRACE Log("Seq1 Seq2 wt1 wt2 Letters Gaps Unwt.Score Wt.Score Total\n"); Log("---- ---- ------ ------ ---------- ---------- ---------- ---------- ----------\n"); #endif for (unsigned uSeqIndex1 = 0; uSeqIndex1 < uSeqCount; ++uSeqIndex1) { const WEIGHT w1 = msa.GetSeqWeight(uSeqIndex1); for (unsigned uSeqIndex2 = uSeqIndex1 + 1; uSeqIndex2 < uSeqCount; ++uSeqIndex2) { const WEIGHT w2 = msa.GetSeqWeight(uSeqIndex2); const WEIGHT w = w1*w2; SCORE scoreLetters = ScoreSeqPairLetters(msa, uSeqIndex1, msa, uSeqIndex2); SCORE scoreGaps = ScoreSeqPairGaps(msa, uSeqIndex1, msa, uSeqIndex2); SCORE scorePair = scoreLetters + scoreGaps; ++uPairCount; scoreTotal += w*scorePair; g_SPScoreLetters += w*scoreLetters; g_SPScoreGaps += w*scoreGaps; #if TRACE Log("%4d %4d %6.3f %6.3f %10.2f %10.2f %10.2f %10.2f %10.2f >%s >%s\n", uSeqIndex1, uSeqIndex2, w1, w2, scoreLetters, scoreGaps, scorePair, scorePair*w1*w2, scoreTotal, msa.GetSeqName(uSeqIndex1), msa.GetSeqName(uSeqIndex2)); #endif } } #if TEST_SPFAST { SCORE f = ObjScoreSPFast(msa); Log("Fast = %.6g\n", f); Log("Brute = %.6g\n", scoreTotal); if (BTEq(f, scoreTotal)) Log("Agree\n"); else Log("** DISAGREE **\n"); } #endif // return scoreTotal / uPairCount; return scoreTotal; }
static SCORE ScoreColLetters(const MSA &msa, unsigned uColIndex) { MuscleContext *ctx = getMuscleContext(); SCOREMATRIX &Mx = *ctx->params.g_ptrScoreMatrix; unsigned &g_AlphaSize = ctx->alpha.g_AlphaSize; const unsigned uSeqCount = msa.GetSeqCount(); #if BRUTE_LETTERS SCORE BruteScore = 0; for (unsigned uSeqIndex1 = 0; uSeqIndex1 < uSeqCount; ++uSeqIndex1) { unsigned uLetter1 = msa.GetLetterEx(uSeqIndex1, uColIndex); if (uLetter1 >= g_AlphaSize) continue; WEIGHT w1 = msa.GetSeqWeight(uSeqIndex1); for (unsigned uSeqIndex2 = uSeqIndex1 + 1; uSeqIndex2 < uSeqCount; ++uSeqIndex2) { unsigned uLetter2 = msa.GetLetterEx(uSeqIndex2, uColIndex); if (uLetter2 >= g_AlphaSize) continue; WEIGHT w2 = msa.GetSeqWeight(uSeqIndex2); BruteScore += w1*w2*Mx[uLetter1][uLetter2]; } } #endif double N = 0; for (unsigned uSeqIndex1 = 0; uSeqIndex1 < uSeqCount; ++uSeqIndex1) { WEIGHT w = msa.GetSeqWeight(uSeqIndex1); N += w; } if (N <= 0) return 0; FCOUNT Freqs[20]; memset(Freqs, 0, sizeof(Freqs)); SCORE Score = 0; for (unsigned uSeqIndex1 = 0; uSeqIndex1 < uSeqCount; ++uSeqIndex1) { unsigned uLetter = msa.GetLetterEx(uSeqIndex1, uColIndex); if (uLetter >= g_AlphaSize) continue; WEIGHT w = msa.GetSeqWeight(uSeqIndex1); Freqs[uLetter] += w; Score -= w*w*Mx[uLetter][uLetter]; } for (unsigned uLetter1 = 0; uLetter1 < g_AlphaSize; ++uLetter1) { const FCOUNT f1 = Freqs[uLetter1]; Score += f1*f1*Mx[uLetter1][uLetter1]; for (unsigned uLetter2 = uLetter1 + 1; uLetter2 < g_AlphaSize; ++uLetter2) { const FCOUNT f2 = Freqs[uLetter2]; Score += 2*f1*f2*Mx[uLetter1][uLetter2]; } } Score /= 2; #if BRUTE_LETTERS assert(BTEq(BruteScore, Score)); #endif return Score; }