📄 nwdasmall.cpp
字号:
Log("\n");
Log("Bit TBJ:\n");
for (unsigned uPrefixLengthA = 0; uPrefixLengthA < uPrefixCountA; ++uPrefixLengthA)
{
char c = ' ';
if (uPrefixLengthA > 0)
c = ConsensusChar(PA[uPrefixLengthA - 1]);
Log("%4u:%c ", uPrefixLengthA, c);
for (unsigned uPrefixLengthB = 0; uPrefixLengthB < uPrefixCountB; ++uPrefixLengthB)
{
char c = Get_J_Char(TB[uPrefixLengthA][uPrefixLengthB]);
Log(" %6c", c);
}
Log("\n");
}
}
static void ListTB(char *TBM_, const ProfPos *PA, const ProfPos *PB,
unsigned uPrefixCountA, unsigned uPrefixCountB)
{
Log(" ");
for (unsigned uPrefixLengthB = 0; uPrefixLengthB < uPrefixCountB; ++uPrefixLengthB)
{
char c = ' ';
if (uPrefixLengthB > 0)
c = ConsensusChar(PB[uPrefixLengthB - 1]);
Log(" %4u:%c", uPrefixLengthB, c);
}
Log("\n");
for (unsigned uPrefixLengthA = 0; uPrefixLengthA < uPrefixCountA; ++uPrefixLengthA)
{
char c = ' ';
if (uPrefixLengthA > 0)
c = ConsensusChar(PA[uPrefixLengthA - 1]);
Log("%4u:%c ", uPrefixLengthA, c);
for (unsigned uPrefixLengthB = 0; uPrefixLengthB < uPrefixCountB; ++uPrefixLengthB)
{
char c = TBM(uPrefixLengthA, uPrefixLengthB);
Log(" %6c", c);
}
Log("\n");
}
}
static const char *BitsToStr(char Bits)
{
static char Str[32];
sprintf(Str, "%cM %cD %cE %cI %cJ",
Get_M_Char(Bits),
Get_D_Char(Bits),
Get_E_Char(Bits),
Get_I_Char(Bits),
Get_J_Char(Bits));
}
#endif // TRACE
static inline void SetBitTBM(char **TB, unsigned i, unsigned j, char c)
{
char Bit;
switch (c)
{
case 'M':
Bit = BIT_MM;
break;
case 'D':
Bit = BIT_DM;
break;
#if DOUBLE_AFFINE
case 'E':
Bit = BIT_EM;
break;
case 'I':
Bit = BIT_IM;
break;
case 'J':
Bit = BIT_JM;
break;
#endif
default:
Quit("Huh?!");
}
TB[i][j] &= ~BIT_xM;
TB[i][j] |= Bit;
}
static inline void SetBitTBD(char **TB, unsigned i, unsigned j, char c)
{
char Bit;
switch (c)
{
case 'M':
Bit = BIT_MD;
break;
case 'D':
Bit = BIT_DD;
break;
default:
Quit("Huh?!");
}
TB[i][j] &= ~BIT_xD;
TB[i][j] |= Bit;
}
static inline void SetBitTBI(char **TB, unsigned i, unsigned j, char c)
{
char Bit;
switch (c)
{
case 'M':
Bit = BIT_MI;
break;
case 'I':
Bit = BIT_II;
break;
default:
Quit("Huh?!");
}
TB[i][j] &= ~BIT_xI;
TB[i][j] |= Bit;
}
#if DOUBLE_AFFINE
static inline void SetBitTBE(char **TB, unsigned i, unsigned j, char c)
{
char Bit;
switch (c)
{
case 'M':
Bit = BIT_ME;
break;
case 'E':
Bit = BIT_EE;
break;
default:
Quit("Huh?!");
}
TB[i][j] &= ~BIT_xE;
TB[i][j] |= Bit;
}
static inline void SetBitTBJ(char **TB, unsigned i, unsigned j, char c)
{
char Bit;
switch (c)
{
case 'M':
Bit = BIT_MJ;
break;
case 'J':
Bit = BIT_JJ;
break;
default:
Quit("Huh?!");
}
TB[i][j] &= ~BIT_xJ;
TB[i][j] |= Bit;
}
#endif
#if TRACE
#define LogMatrices() \
{ \
Log("Bit DPM:\n"); \
LogDP(DPM_, PA, PB, uPrefixCountA, uPrefixCountB); \
Log("Bit DPD:\n"); \
LogDP(DPD_, PA, PB, uPrefixCountA, uPrefixCountB); \
Log("Bit DPE:\n"); \
LogDP(DPE_, PA, PB, uPrefixCountA, uPrefixCountB); \
Log("Bit DPI:\n"); \
LogDP(DPI_, PA, PB, uPrefixCountA, uPrefixCountB); \
Log("Bit DPJ:\n"); \
LogDP(DPJ_, PA, PB, uPrefixCountA, uPrefixCountB); \
Log("Bit TB:\n"); \
LogBitTB(TB, PA, PB, uPrefixCountA, uPrefixCountB); \
bool Same; \
Same = DPEq('M', g_DPM, DPM_, uPrefixCountA, uPrefixCountB);\
if (Same) \
Log("DPM success\n"); \
Same = DPEq('D', g_DPD, DPD_, uPrefixCountA, uPrefixCountB);\
if (Same) \
Log("DPD success\n"); \
Same = DPEq('E', g_DPE, DPE_, uPrefixCountA, uPrefixCountB);\
if (Same) \
Log("DPE success\n"); \
Same = DPEq('I', g_DPI, DPI_, uPrefixCountA, uPrefixCountB);\
if (Same) \
Log("DPI success\n"); \
Same = DPEq('J', g_DPJ, DPJ_, uPrefixCountA, uPrefixCountB);\
if (Same) \
Log("DPJ success\n"); \
CompareTB(TB, g_TBM, g_TBD, g_TBE, g_TBI, g_TBJ, uPrefixCountA, uPrefixCountB);\
}
#else
#define LogMatrices() /* empty */
#endif
SCORE NWDASmall(const ProfPos *PA, unsigned uLengthA, const ProfPos *PB,
unsigned uLengthB, PWPath &Path)
{
assert(uLengthB > 0 && uLengthA > 0);
ProfPos *pa0 = (ProfPos *) PA;
ProfPos *pb0 = (ProfPos *) PB;
ProfPos *paa = (ProfPos *) (PA + uLengthA - 1);
ProfPos *pbb = (ProfPos *) (PB + uLengthB - 1);
pa0->m_scoreGapOpen *= -1;
pb0->m_scoreGapOpen *= -1;
paa->m_scoreGapClose *= -1;
pbb->m_scoreGapClose *= -1;
pa0->m_scoreGapOpen2 *= -1;
pb0->m_scoreGapOpen2 *= -1;
paa->m_scoreGapClose2 *= -1;
pbb->m_scoreGapClose2 *= -1;
const unsigned uPrefixCountA = uLengthA + 1;
const unsigned uPrefixCountB = uLengthB + 1;
const SCORE e = g_scoreGapExtend;
const SCORE e2 = g_scoreGapExtend2;
const SCORE min_e = MIN(g_scoreGapExtend, g_scoreGapExtend2);
ALLOC_TRACE()
SCORE *MCurr = new SCORE[uPrefixCountB];
SCORE *MNext = new SCORE[uPrefixCountB];
SCORE *MPrev = new SCORE[uPrefixCountB];
SCORE *DRow = new SCORE[uPrefixCountB];
SCORE *ERow = new SCORE[uPrefixCountB];
char **TB = new char *[uPrefixCountA];
for (unsigned i = 0; i < uPrefixCountA; ++i)
{
TB[i] = new char [uPrefixCountB];
memset(TB[i], 0, uPrefixCountB);
}
SCORE Iij = MINUS_INFINITY;
SetDPI(0, 0, Iij);
SCORE Jij = MINUS_INFINITY;
SetDPJ(0, 0, Jij);
Iij = PB[0].m_scoreGapOpen;
SetDPI(0, 1, Iij);
Jij = PB[0].m_scoreGapOpen2;
SetDPJ(0, 1, Jij);
for (unsigned j = 2; j <= uLengthB; ++j)
{
Iij += e;
Jij += e2;
SetDPI(0, j, Iij);
SetDPJ(0, j, Jij);
SetTBI(0, j, 'I');
SetTBJ(0, j, 'J');
}
for (unsigned j = 0; j <= uLengthB; ++j)
{
DRow[j] = MINUS_INFINITY;
ERow[j] = MINUS_INFINITY;
SetDPD(0, j, DRow[j]);
SetDPE(0, j, ERow[j]);
SetTBD(0, j, 'D');
SetTBE(0, j, 'E');
}
MPrev[0] = 0;
SetDPM(0, 0, MPrev[0]);
for (unsigned j = 1; j <= uLengthB; ++j)
{
MPrev[j] = MINUS_INFINITY;
SetDPM(0, j, MPrev[j]);
}
MCurr[0] = MINUS_INFINITY;
SetDPM(1, 0, MCurr[0]);
MCurr[1] = ScoreProfPos2(PA[0], PB[0]);
SetDPM(1, 1, MCurr[1]);
SetBitTBM(TB, 1, 1, 'M');
SetTBM(1, 1, 'M');
for (unsigned j = 2; j <= uLengthB; ++j)
{
SCORE M = ScoreProfPos2(PA[0], PB[j-1]) + PB[0].m_scoreGapOpen +
(j - 2)*e + PB[j-2].m_scoreGapClose;
SCORE M2 = ScoreProfPos2(PA[0], PB[j-1]) + PB[0].m_scoreGapOpen2 +
(j - 2)*e2 + PB[j-2].m_scoreGapClose2;
if (M >= M2)
{
MCurr[j] = M;
SetBitTBM(TB, 1, j, 'I');
SetTBM(1, j, 'I');
}
else
{
MCurr[j] = M2;
SetBitTBM(TB, 1, j, 'J');
SetTBM(1, j, 'J');
}
SetDPM(1, j, MCurr[j]);
}
// Main DP loop
for (unsigned i = 1; i < uLengthA; ++i)
{
Iij = MINUS_INFINITY;
Jij = MINUS_INFINITY;
SetDPI(i, 0, Iij);
SetDPJ(i, 0, Jij);
DRow[0] = PA[0].m_scoreGapOpen + (i - 1)*e;
ERow[0] = PA[0].m_scoreGapOpen2 + (i - 1)*e2;
SetDPD(i, 0, DRow[0]);
SetDPE(i, 0, ERow[0]);
MCurr[0] = MINUS_INFINITY;
if (i == 1)
{
MCurr[1] = ScoreProfPos2(PA[0], PB[0]);
SetBitTBM(TB, i, 1, 'M');
SetTBM(i, 1, 'M');
}
else
{
SCORE M = ScoreProfPos2(PA[i-1], PB[0]) + PA[0].m_scoreGapOpen +
(i - 2)*e + PA[i-2].m_scoreGapClose;
SCORE M2 = ScoreProfPos2(PA[i-1], PB[0]) + PA[0].m_scoreGapOpen2 +
(i - 2)*e2 + PA[i-2].m_scoreGapClose2;
if (M >= M2)
{
MCurr[1] = M;
SetBitTBM(TB, i, 1, 'D');
SetTBM(i, 1, 'D');
}
else
{
MCurr[1] = M2;
SetBitTBM(TB, i, 1, 'E');
SetTBM(i, 1, 'E');
}
}
SetDPM(i, 0, MCurr[0]);
SetDPM(i, 1, MCurr[1]);
for (unsigned j = 1; j < uLengthB; ++j)
MNext[j+1] = ScoreProfPos2(PA[i], PB[j]);
for (unsigned j = 1; j < uLengthB; ++j)
{
RECURSE_D(i, j)
RECURSE_E(i, j)
RECURSE_I(i, j)
RECURSE_J(i, j)
RECURSE_M(i, j)
}
// Special case for j=uLengthB
RECURSE_D_BTerm(i)
RECURSE_E_BTerm(i)
RECURSE_I_BTerm(i)
RECURSE_J_BTerm(i)
// Prev := Curr, Curr := Next, Next := Prev
Rotate(MPrev, MCurr, MNext);
}
// Special case for i=uLengthA
MCurr[0] = MINUS_INFINITY;
SCORE M = ScoreProfPos2(PA[uLengthA-1], PB[0]) + (uLengthA - 2)*e +
PA[0].m_scoreGapOpen + PA[uLengthA-2].m_scoreGapClose;
SCORE M2 = ScoreProfPos2(PA[uLengthA-1], PB[0]) + (uLengthA - 2)*e +
PA[0].m_scoreGapOpen + PA[uLengthA-2].m_scoreGapClose;
if (M >= M2)
{
MCurr[1] = M;
SetBitTBM(TB, uLengthA, 1, 'D');
SetTBM(uLengthA, 1, 'D');
}
else
{
MCurr[1] = M2;
SetBitTBM(TB, uLengthA, 1, 'E');
SetTBM(uLengthA, 1, 'D');
}
SetDPM(uLengthA, 0, MCurr[0]);
SetDPM(uLengthA, 1, MCurr[1]);
DRow[0] = MINUS_INFINITY;
ERow[0] = MINUS_INFINITY;
SetDPD(uLengthA, 0, DRow[0]);
SetDPE(uLengthA, 0, ERow[0]);
for (unsigned j = 1; j <= uLengthB; ++j)
{
RECURSE_D_ATerm(j);
RECURSE_E_ATerm(j);
}
Iij = MINUS_INFINITY;
Jij = MINUS_INFINITY;
for (unsigned j = 1; j <= uLengthB; ++j)
{
RECURSE_I_ATerm(j)
RECURSE_J_ATerm(j)
}
LogMatrices();
SCORE MAB = MCurr[uLengthB];
SCORE DAB = DRow[uLengthB] + PA[uLengthA-1].m_scoreGapClose;
SCORE EAB = ERow[uLengthB] + PA[uLengthA-1].m_scoreGapClose2;
SCORE IAB = Iij + PB[uLengthB-1].m_scoreGapClose;
SCORE JAB = Jij + PB[uLengthB-1].m_scoreGapClose2;
SCORE Score = MAB;
char cEdgeType = 'M';
if (DAB > Score)
{
Score = DAB;
cEdgeType = 'D';
}
if (EAB > Score)
{
Score = EAB;
cEdgeType = 'E';
}
if (IAB > Score)
{
Score = IAB;
cEdgeType = 'I';
}
if (JAB > Score)
{
Score = JAB;
cEdgeType = 'J';
}
#if TRACE
Log(" Small: MAB=%.4g DAB=%.4g EAB=%.4g IAB=%.4g JAB=%.4g best=%c\n",
MAB, DAB, EAB, IAB, JAB, cEdgeType);
#endif
BitTraceBack(TB, uLengthA, uLengthB, cEdgeType, Path);
#if DBEUG
Path.Validate();
#endif
delete[] MCurr;
delete[] MNext;
delete[] MPrev;
delete[] DRow;
delete[] ERow;
for (unsigned i = 0; i < uPrefixCountA; ++i)
delete[] TB[i];
delete[] TB;
return 0;
}
#endif // DOUBLE_AFFINE
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -