Delete unneeded directory
[jabaws.git] / website / archive / binaries / mac / src / muscle / nwdasmall.cpp
diff --git a/website/archive/binaries/mac/src/muscle/nwdasmall.cpp b/website/archive/binaries/mac/src/muscle/nwdasmall.cpp
deleted file mode 100644 (file)
index 5f12706..0000000
+++ /dev/null
@@ -1,947 +0,0 @@
-#include "muscle.h"\r
-#include <math.h>\r
-#include "pwpath.h"\r
-#include "profile.h"\r
-#include <stdio.h>\r
-\r
-#if    DOUBLE_AFFINE\r
-\r
-// NW double affine small memory, term gaps fully penalized\r
-// (so up to caller to adjust in profile if desired).\r
-\r
-#define        TRACE   0\r
-\r
-#define MIN(x, y)      ((x) < (y) ? (x) : (y))\r
-\r
-#if    TRACE\r
-extern bool g_bKeepSimpleDP;\r
-extern SCORE *g_DPM;\r
-extern SCORE *g_DPD;\r
-extern SCORE *g_DPE;\r
-extern SCORE *g_DPI;\r
-extern SCORE *g_DPJ;\r
-extern char *g_TBM;\r
-extern char *g_TBD;\r
-extern char *g_TBE;\r
-extern char *g_TBI;\r
-extern char *g_TBJ;\r
-#endif\r
-\r
-#if    TRACE\r
-#define ALLOC_TRACE()                                                          \\r
-       const SCORE UNINIT = MINUS_INFINITY;                    \\r
-       const size_t LM = uPrefixCountA*uPrefixCountB;  \\r
-                                                                                                       \\r
-       SCORE *DPM_ = new SCORE[LM];                                    \\r
-       SCORE *DPD_ = new SCORE[LM];                                    \\r
-       SCORE *DPE_ = new SCORE[LM];                                    \\r
-       SCORE *DPI_ = new SCORE[LM];                                    \\r
-       SCORE *DPJ_ = new SCORE[LM];                                    \\r
-                                                                                                       \\r
-       char *TBM_ = new char[LM];                                              \\r
-       char *TBD_ = new char[LM];                                              \\r
-       char *TBE_ = new char[LM];                                              \\r
-       char *TBI_ = new char[LM];                                              \\r
-       char *TBJ_ = new char[LM];                                              \\r
-                                                                                                       \\r
-       memset(TBM_, '?', LM);                                                  \\r
-       memset(TBD_, '?', LM);                                                  \\r
-       memset(TBE_, '?', LM);                                                  \\r
-       memset(TBI_, '?', LM);                                                  \\r
-       memset(TBJ_, '?', LM);                                                  \\r
-                                                                                                       \\r
-       for (unsigned i = 0; i <= uLengthA; ++i)                \\r
-               for (unsigned j = 0; j <= uLengthB; ++j)        \\r
-                       {                                                                               \\r
-                       DPM(i, j) = UNINIT;                                             \\r
-                       DPD(i, j) = UNINIT;                                             \\r
-                       DPE(i, j) = UNINIT;                                             \\r
-                       DPI(i, j) = UNINIT;                                             \\r
-                       DPJ(i, j) = UNINIT;                                             \\r
-                       }\r
-#else\r
-#define ALLOC_TRACE()\r
-#endif\r
-\r
-#if    TRACE\r
-#define SetDPM(i, j, x)                DPM(i, j) = x\r
-#define SetDPD(i, j, x)                DPD(i, j) = x\r
-#define SetDPE(i, j, x)                DPE(i, j) = x\r
-#define SetDPI(i, j, x)                DPI(i, j) = x\r
-#define SetDPJ(i, j, x)                DPJ(i, j) = x\r
-#define SetTBM(i, j, x)                TBM(i, j) = x\r
-#define SetTBD(i, j, x)                TBD(i, j) = x\r
-#define SetTBE(i, j, x)                TBE(i, j) = x\r
-#define SetTBI(i, j, x)                TBI(i, j) = x\r
-#define SetTBJ(i, j, x)                TBJ(i, j) = x\r
-#else\r
-#define SetDPM(i, j, x)                /* empty  */\r
-#define SetDPD(i, j, x)                /* empty  */\r
-#define SetDPE(i, j, x)                /* empty  */\r
-#define SetDPI(i, j, x)                /* empty  */\r
-#define SetDPJ(i, j, x)                /* empty  */\r
-#define SetTBM(i, j, x)                /* empty  */\r
-#define SetTBD(i, j, x)                /* empty  */\r
-#define SetTBE(i, j, x)                /* empty  */\r
-#define SetTBI(i, j, x)                /* empty  */\r
-#define SetTBJ(i, j, x)                /* empty  */\r
-#endif\r
-\r
-#define RECURSE_D(i, j)                                \\r
-       {                                                               \\r
-       SCORE DD = DRow[j] + e;                 \\r
-       SCORE MD = MPrev[j] + PA[i-1].m_scoreGapOpen;\\r
-       if (DD > MD)                                    \\r
-               {                                                       \\r
-               DRow[j] = DD;                           \\r
-               SetTBD(i, j, 'D');                      \\r
-               }                                                       \\r
-       else                                                    \\r
-               {                                                       \\r
-               DRow[j] = MD;                           \\r
-               SetBitTBD(TB, i, j, 'M');       \\r
-               SetTBD(i, j, 'M');                      \\r
-               }                                                       \\r
-       SetDPD(i, j, DRow[j]);                  \\r
-       }\r
-\r
-#define RECURSE_E(i, j)                                \\r
-       {                                                               \\r
-       SCORE EE = ERow[j] + e2;                \\r
-       SCORE ME = MPrev[j] + PA[i-1].m_scoreGapOpen2;\\r
-       if (EE > ME)                                    \\r
-               {                                                       \\r
-               ERow[j] = EE;                           \\r
-               SetTBE(i, j, 'E');                      \\r
-               }                                                       \\r
-       else                                                    \\r
-               {                                                       \\r
-               ERow[j] = ME;                           \\r
-               SetBitTBE(TB, i, j, 'M');       \\r
-               SetTBE(i, j, 'M');                      \\r
-               }                                                       \\r
-       SetDPE(i, j, ERow[j]);                  \\r
-       }\r
-\r
-#define RECURSE_D_ATerm(j)     RECURSE_D(uLengthA, j)\r
-#define RECURSE_E_ATerm(j)     RECURSE_E(uLengthA, j)\r
-\r
-#define RECURSE_D_BTerm(j)     RECURSE_D(i, uLengthB)\r
-#define RECURSE_E_BTerm(j)     RECURSE_E(i, uLengthB)\r
-\r
-#define RECURSE_I(i, j)                                \\r
-       {                                                               \\r
-       Iij += e;                                               \\r
-       SCORE MI = MCurr[j-1] + PB[j-1].m_scoreGapOpen;\\r
-       if (MI >= Iij)                                  \\r
-               {                                                       \\r
-               Iij = MI;                                       \\r
-               SetBitTBI(TB, i, j, 'M');       \\r
-               SetTBI(i, j, 'M');                      \\r
-               }                                                       \\r
-       else                                                    \\r
-               SetTBI(i, j, 'I');                      \\r
-       SetDPI(i, j, Iij);                              \\r
-       }\r
-\r
-#define RECURSE_J(i, j)                                \\r
-       {                                                               \\r
-       Jij += e2;                                              \\r
-       SCORE MJ = MCurr[j-1] + PB[j-1].m_scoreGapOpen2;\\r
-       if (MJ >= Jij)                                  \\r
-               {                                                       \\r
-               Jij = MJ;                                       \\r
-               SetBitTBJ(TB, i, j, 'M');       \\r
-               SetTBJ(i, j, 'M');                      \\r
-               }                                                       \\r
-       else                                                    \\r
-               SetTBJ(i, j, 'I');                      \\r
-       SetDPJ(i, j, Jij);                              \\r
-       }\r
-\r
-#define RECURSE_I_ATerm(j)     RECURSE_I(uLengthA, j)\r
-#define RECURSE_J_ATerm(j)     RECURSE_J(uLengthA, j)\r
-\r
-#define RECURSE_I_BTerm(j)     RECURSE_I(i, uLengthB)\r
-#define RECURSE_J_BTerm(j)     RECURSE_J(i, uLengthB)\r
-\r
-#define RECURSE_M(i, j)                                                                        \\r
-       {                                                                                                       \\r
-       SCORE Best = MCurr[j];  /*  MM  */                                      \\r
-       SetTBM(i+1, j+1, 'M');                                                          \\r
-       SetBitTBM(TB, i+1, j+1, 'M');                                           \\r
-                                                                                                               \\r
-       SCORE DM = DRow[j] + PA[i-1].m_scoreGapClose;           \\r
-       if (DM > Best)                                                                          \\r
-               {                                                                                               \\r
-               Best = DM;                                                                              \\r
-               SetTBM(i+1, j+1, 'D');                                                  \\r
-               SetBitTBM(TB, i+1, j+1, 'D');                                   \\r
-               }                                                                                               \\r
-                                                                                                               \\r
-       SCORE EM = ERow[j] + PA[i-1].m_scoreGapClose2;          \\r
-       if (EM > Best)                                                                          \\r
-               {                                                                                               \\r
-               Best = EM;                                                                              \\r
-               SetTBM(i+1, j+1, 'E');                                                  \\r
-               SetBitTBM(TB, i+1, j+1, 'E');                                   \\r
-               }                                                                                               \\r
-                                                                                                               \\r
-       SCORE IM = Iij + PB[j-1].m_scoreGapClose;                       \\r
-       if (IM > Best)                                                                          \\r
-               {                                                                                               \\r
-               Best = IM;                                                                              \\r
-               SetTBM(i+1, j+1, 'I');                                                  \\r
-               SetBitTBM(TB, i+1, j+1, 'I');                                   \\r
-               }                                                                                               \\r
-                                                                                                               \\r
-       SCORE JM = Jij + PB[j-1].m_scoreGapClose2;                      \\r
-       if (JM > Best)                                                                          \\r
-               {                                                                                               \\r
-               Best = JM;                                                                              \\r
-               SetTBM(i+1, j+1, 'J');                                                  \\r
-               SetBitTBM(TB, i+1, j+1, 'J');                                   \\r
-               }                                                                                               \\r
-       MNext[j+1] += Best;                                                                     \\r
-       SetDPM(i+1, j+1, MNext[j+1]);                                           \\r
-       }\r
-\r
-#if    TRACE\r
-static bool LocalEq(BASETYPE b1, BASETYPE b2)\r
-       {\r
-       if (b1 < -100000 && b2 < -100000)\r
-               return true;\r
-       double diff = fabs(b1 - b2);\r
-       if (diff < 0.0001)\r
-               return true;\r
-       double sum = fabs(b1) + fabs(b2);\r
-       return diff/sum < 0.005;\r
-       }\r
-\r
-static char Get_M_Char(char Bits)\r
-       {\r
-       switch (Bits & BIT_xM)\r
-               {\r
-       case BIT_MM:\r
-               return 'M';\r
-       case BIT_DM:\r
-               return 'D';\r
-       case BIT_EM:\r
-               return 'E';\r
-       case BIT_IM:\r
-               return 'I';\r
-       case BIT_JM:\r
-               return 'J';\r
-               }\r
-       Quit("Huh?");\r
-       return '?';\r
-       }\r
-\r
-static char Get_D_Char(char Bits)\r
-       {\r
-       return (Bits & BIT_xD) ? 'M' : 'D';\r
-       }\r
-\r
-static char Get_E_Char(char Bits)\r
-       {\r
-       return (Bits & BIT_xE) ? 'M' : 'E';\r
-       }\r
-\r
-static char Get_I_Char(char Bits)\r
-       {\r
-       return (Bits & BIT_xI) ? 'M' : 'I';\r
-       }\r
-\r
-static char Get_J_Char(char Bits)\r
-       {\r
-       return (Bits & BIT_xJ) ? 'M' : 'J';\r
-       }\r
-\r
-static bool DPEq(char c, SCORE *g_DP, SCORE *DPD_,\r
-  unsigned uPrefixCountA, unsigned uPrefixCountB)\r
-       {\r
-       if (0 == g_DP)\r
-               {\r
-               Log("***DPDIFF*** DP%c=NULL\n", c);\r
-               return true;\r
-               }\r
-\r
-       SCORE *DPM_ = g_DP;\r
-       for (unsigned i = 0; i < uPrefixCountA; ++i)\r
-               for (unsigned j = 0; j < uPrefixCountB; ++j)\r
-                       if (!LocalEq(DPM(i, j), DPD(i, j)))\r
-                               {\r
-                               Log("***DPDIFF*** DP%c(%d, %d) Simple = %.2g, Small = %.2g\n",\r
-                                 c, i, j, DPM(i, j), DPD(i, j));\r
-                               return false;\r
-                               }\r
-       return true;\r
-       }\r
-\r
-static bool CompareTB(char **TB, char *TBM_, char *TBD_, char *TBE_, char *TBI_, char *TBJ_,\r
-  unsigned uPrefixCountA, unsigned uPrefixCountB)\r
-       {\r
-       if (!g_bKeepSimpleDP)\r
-               return true;\r
-       SCORE *DPM_ = g_DPM;\r
-       bool Eq = true;\r
-       for (unsigned i = 0; i < uPrefixCountA; ++i)\r
-               for (unsigned j = 0; j < uPrefixCountB; ++j)\r
-                       {\r
-                       char c1 = TBM(i, j);\r
-                       char c2 = Get_M_Char(TB[i][j]);\r
-                       if (c1 != '?' && c1 != c2 && DPM(i, j) > -100000)\r
-                               {\r
-                               Log("TBM(%d, %d) Simple = %c, NW = %c\n", i, j, c1, c2);\r
-                               Eq = false;\r
-                               goto D;\r
-                               }\r
-                       }\r
-\r
-D:\r
-       SCORE *DPD_ = g_DPD;\r
-       for (unsigned i = 0; i < uPrefixCountA; ++i)\r
-               for (unsigned j = 0; j < uPrefixCountB; ++j)\r
-                       {\r
-                       char c1 = TBD(i, j);\r
-                       char c2 = Get_D_Char(TB[i][j]);\r
-                       if (c1 != '?' && c1 != c2 && DPD(i, j) > -100000)\r
-                               {\r
-                               Log("TBD(%d, %d) Simple = %c, NW = %c\n", i, j, c1, c2);\r
-                               Eq = false;\r
-                               goto E;\r
-                               }\r
-                       }\r
-E:\r
-       SCORE *DPE_ = g_DPE;\r
-       if (0 == TBE_)\r
-               goto I;\r
-       for (unsigned i = 0; i < uPrefixCountA; ++i)\r
-               for (unsigned j = 0; j < uPrefixCountB; ++j)\r
-                       {\r
-                       char c1 = TBE(i, j);\r
-                       char c2 = Get_E_Char(TB[i][j]);\r
-                       if (c1 != '?' && c1 != c2 && DPE(i, j) > -100000)\r
-                               {\r
-                               Log("TBE(%d, %d) Simple = %c, NW = %c\n", i, j, c1, c2);\r
-                               Eq = false;\r
-                               goto I;\r
-                               }\r
-                       }\r
-I:\r
-       SCORE *DPI_ = g_DPI;\r
-       for (unsigned i = 0; i < uPrefixCountA; ++i)\r
-               for (unsigned j = 0; j < uPrefixCountB; ++j)\r
-                       {\r
-                       char c1 = TBI(i, j);\r
-                       char c2 = Get_I_Char(TB[i][j]);\r
-                       if (c1 != '?' && c1 != c2 && DPI(i, j) > -100000)\r
-                               {\r
-                               Log("TBI(%d, %d) Simple = %c, NW = %c\n", i, j, c1, c2);\r
-                               Eq = false;\r
-                               goto J;\r
-                               }\r
-                       }\r
-J:\r
-       SCORE *DPJ_ = g_DPJ;\r
-       if (0 == DPJ_)\r
-               goto Done;\r
-       for (unsigned i = 0; i < uPrefixCountA; ++i)\r
-               for (unsigned j = 0; j < uPrefixCountB; ++j)\r
-                       {\r
-                       char c1 = TBJ(i, j);\r
-                       char c2 = Get_J_Char(TB[i][j]);\r
-                       if (c1 != '?' && c1 != c2 && DPJ(i, j) > -100000)\r
-                               {\r
-                               Log("TBJ(%d, %d) Simple = %c, NW = %c\n", i, j, c1, c2);\r
-                               Eq = false;\r
-                               goto Done;\r
-                               }\r
-                       }\r
-Done:\r
-       if (Eq)\r
-               Log("TB success\n");\r
-       return Eq;\r
-       }\r
-\r
-static const char *LocalScoreToStr(SCORE s)\r
-       {\r
-       static char str[16];\r
-       if (s < -100000)\r
-               return "     *";\r
-       sprintf(str, "%6.1f", s);\r
-       return str;\r
-       }\r
-\r
-static void LogDP(const SCORE *DPM_, const ProfPos *PA, const ProfPos *PB,\r
-  unsigned uPrefixCountA, unsigned uPrefixCountB)\r
-       {\r
-       Log("        ");\r
-       for (unsigned uPrefixLengthB = 0; uPrefixLengthB < uPrefixCountB; ++uPrefixLengthB)\r
-               {\r
-               char c = ' ';\r
-               if (uPrefixLengthB > 0)\r
-                       c = ConsensusChar(PB[uPrefixLengthB - 1]);\r
-               Log(" %4u:%c", uPrefixLengthB, c);\r
-               }\r
-       Log("\n");\r
-       for (unsigned uPrefixLengthA = 0; uPrefixLengthA < uPrefixCountA; ++uPrefixLengthA)\r
-               {\r
-               char c = ' ';\r
-               if (uPrefixLengthA > 0)\r
-                       c = ConsensusChar(PA[uPrefixLengthA - 1]);\r
-               Log("%4u:%c  ", uPrefixLengthA, c);\r
-               for (unsigned uPrefixLengthB = 0; uPrefixLengthB < uPrefixCountB; ++uPrefixLengthB)\r
-                       Log(" %s", LocalScoreToStr(DPM(uPrefixLengthA, uPrefixLengthB)));\r
-               Log("\n");\r
-               }\r
-       }\r
-\r
-static void LogBitTB(char **TB, const ProfPos *PA, const ProfPos *PB,\r
-  unsigned uPrefixCountA, unsigned uPrefixCountB)\r
-       {\r
-       Log("        ");\r
-       for (unsigned uPrefixLengthB = 0; uPrefixLengthB < uPrefixCountB; ++uPrefixLengthB)\r
-               {\r
-               char c = ' ';\r
-               if (uPrefixLengthB > 0)\r
-                       c = ConsensusChar(PB[uPrefixLengthB - 1]);\r
-               Log(" %4u:%c", uPrefixLengthB, c);\r
-               }\r
-       Log("\n");\r
-       Log("Bit TBM:\n");\r
-       for (unsigned uPrefixLengthA = 0; uPrefixLengthA < uPrefixCountA; ++uPrefixLengthA)\r
-               {\r
-               char c = ' ';\r
-               if (uPrefixLengthA > 0)\r
-                       c = ConsensusChar(PA[uPrefixLengthA - 1]);\r
-               Log("%4u:%c  ", uPrefixLengthA, c);\r
-               for (unsigned uPrefixLengthB = 0; uPrefixLengthB < uPrefixCountB; ++uPrefixLengthB)\r
-                       {\r
-                       char c = Get_M_Char(TB[uPrefixLengthA][uPrefixLengthB]);\r
-                       Log(" %6c", c);\r
-                       }\r
-               Log("\n");\r
-               }\r
-\r
-       Log("\n");\r
-       Log("Bit TBD:\n");\r
-       for (unsigned uPrefixLengthA = 0; uPrefixLengthA < uPrefixCountA; ++uPrefixLengthA)\r
-               {\r
-               char c = ' ';\r
-               if (uPrefixLengthA > 0)\r
-                       c = ConsensusChar(PA[uPrefixLengthA - 1]);\r
-               Log("%4u:%c  ", uPrefixLengthA, c);\r
-               for (unsigned uPrefixLengthB = 0; uPrefixLengthB < uPrefixCountB; ++uPrefixLengthB)\r
-                       {\r
-                       char c = Get_D_Char(TB[uPrefixLengthA][uPrefixLengthB]);\r
-                       Log(" %6c", c);\r
-                       }\r
-               Log("\n");\r
-               }\r
-\r
-       Log("\n");\r
-       Log("Bit TBE:\n");\r
-       for (unsigned uPrefixLengthA = 0; uPrefixLengthA < uPrefixCountA; ++uPrefixLengthA)\r
-               {\r
-               char c = ' ';\r
-               if (uPrefixLengthA > 0)\r
-                       c = ConsensusChar(PA[uPrefixLengthA - 1]);\r
-               Log("%4u:%c  ", uPrefixLengthA, c);\r
-               for (unsigned uPrefixLengthB = 0; uPrefixLengthB < uPrefixCountB; ++uPrefixLengthB)\r
-                       {\r
-                       char c = Get_E_Char(TB[uPrefixLengthA][uPrefixLengthB]);\r
-                       Log(" %6c", c);\r
-                       }\r
-               Log("\n");\r
-               }\r
-\r
-       Log("\n");\r
-       Log("Bit TBI:\n");\r
-       for (unsigned uPrefixLengthA = 0; uPrefixLengthA < uPrefixCountA; ++uPrefixLengthA)\r
-               {\r
-               char c = ' ';\r
-               if (uPrefixLengthA > 0)\r
-                       c = ConsensusChar(PA[uPrefixLengthA - 1]);\r
-               Log("%4u:%c  ", uPrefixLengthA, c);\r
-               for (unsigned uPrefixLengthB = 0; uPrefixLengthB < uPrefixCountB; ++uPrefixLengthB)\r
-                       {\r
-                       char c = Get_I_Char(TB[uPrefixLengthA][uPrefixLengthB]);\r
-                       Log(" %6c", c);\r
-                       }\r
-               Log("\n");\r
-               }\r
-\r
-       Log("\n");\r
-       Log("Bit TBJ:\n");\r
-       for (unsigned uPrefixLengthA = 0; uPrefixLengthA < uPrefixCountA; ++uPrefixLengthA)\r
-               {\r
-               char c = ' ';\r
-               if (uPrefixLengthA > 0)\r
-                       c = ConsensusChar(PA[uPrefixLengthA - 1]);\r
-               Log("%4u:%c  ", uPrefixLengthA, c);\r
-               for (unsigned uPrefixLengthB = 0; uPrefixLengthB < uPrefixCountB; ++uPrefixLengthB)\r
-                       {\r
-                       char c = Get_J_Char(TB[uPrefixLengthA][uPrefixLengthB]);\r
-                       Log(" %6c", c);\r
-                       }\r
-               Log("\n");\r
-               }\r
-       }\r
-\r
-static void ListTB(char *TBM_, const ProfPos *PA, const ProfPos *PB,\r
-  unsigned uPrefixCountA, unsigned uPrefixCountB)\r
-       {\r
-       Log("        ");\r
-       for (unsigned uPrefixLengthB = 0; uPrefixLengthB < uPrefixCountB; ++uPrefixLengthB)\r
-               {\r
-               char c = ' ';\r
-               if (uPrefixLengthB > 0)\r
-                       c = ConsensusChar(PB[uPrefixLengthB - 1]);\r
-               Log(" %4u:%c", uPrefixLengthB, c);\r
-               }\r
-       Log("\n");\r
-       for (unsigned uPrefixLengthA = 0; uPrefixLengthA < uPrefixCountA; ++uPrefixLengthA)\r
-               {\r
-               char c = ' ';\r
-               if (uPrefixLengthA > 0)\r
-                       c = ConsensusChar(PA[uPrefixLengthA - 1]);\r
-               Log("%4u:%c  ", uPrefixLengthA, c);\r
-               for (unsigned uPrefixLengthB = 0; uPrefixLengthB < uPrefixCountB; ++uPrefixLengthB)\r
-                       {\r
-                       char c = TBM(uPrefixLengthA, uPrefixLengthB);\r
-                       Log(" %6c", c);\r
-                       }\r
-               Log("\n");\r
-               }\r
-       }\r
-\r
-static const char *BitsToStr(char Bits)\r
-       {\r
-       static char Str[32];\r
-\r
-       sprintf(Str, "%cM %cD %cE %cI %cJ",\r
-         Get_M_Char(Bits),\r
-         Get_D_Char(Bits),\r
-         Get_E_Char(Bits),\r
-         Get_I_Char(Bits),\r
-         Get_J_Char(Bits));\r
-       }\r
-#endif // TRACE\r
-\r
-static inline void SetBitTBM(char **TB, unsigned i, unsigned j, char c)\r
-       {\r
-       char Bit;\r
-       switch (c)\r
-               {\r
-       case 'M':\r
-               Bit = BIT_MM;\r
-               break;\r
-       case 'D':\r
-               Bit = BIT_DM;\r
-               break;\r
-#if    DOUBLE_AFFINE\r
-       case 'E':\r
-               Bit = BIT_EM;\r
-               break;\r
-       case 'I':\r
-               Bit = BIT_IM;\r
-               break;\r
-       case 'J':\r
-               Bit = BIT_JM;\r
-               break;\r
-#endif\r
-       default:\r
-               Quit("Huh?!");\r
-               }\r
-       TB[i][j] &= ~BIT_xM;\r
-       TB[i][j] |= Bit;\r
-       }\r
-\r
-static inline void SetBitTBD(char **TB, unsigned i, unsigned j, char c)\r
-       {\r
-       char Bit;\r
-       switch (c)\r
-               {\r
-       case 'M':\r
-               Bit = BIT_MD;\r
-               break;\r
-       case 'D':\r
-               Bit = BIT_DD;\r
-               break;\r
-       default:\r
-               Quit("Huh?!");\r
-               }\r
-       TB[i][j] &= ~BIT_xD;\r
-       TB[i][j] |= Bit;\r
-       }\r
-\r
-static inline void SetBitTBI(char **TB, unsigned i, unsigned j, char c)\r
-       {\r
-       char Bit;\r
-       switch (c)\r
-               {\r
-       case 'M':\r
-               Bit = BIT_MI;\r
-               break;\r
-       case 'I':\r
-               Bit = BIT_II;\r
-               break;\r
-       default:\r
-               Quit("Huh?!");\r
-               }\r
-       TB[i][j] &= ~BIT_xI;\r
-       TB[i][j] |= Bit;\r
-       }\r
-\r
-#if    DOUBLE_AFFINE\r
-static inline void SetBitTBE(char **TB, unsigned i, unsigned j, char c)\r
-       {\r
-       char Bit;\r
-       switch (c)\r
-               {\r
-       case 'M':\r
-               Bit = BIT_ME;\r
-               break;\r
-       case 'E':\r
-               Bit = BIT_EE;\r
-               break;\r
-       default:\r
-               Quit("Huh?!");\r
-               }\r
-       TB[i][j] &= ~BIT_xE;\r
-       TB[i][j] |= Bit;\r
-       }\r
-\r
-static inline void SetBitTBJ(char **TB, unsigned i, unsigned j, char c)\r
-       {\r
-       char Bit;\r
-       switch (c)\r
-               {\r
-       case 'M':\r
-               Bit = BIT_MJ;\r
-               break;\r
-       case 'J':\r
-               Bit = BIT_JJ;\r
-               break;\r
-       default:\r
-               Quit("Huh?!");\r
-               }\r
-       TB[i][j] &= ~BIT_xJ;\r
-       TB[i][j] |= Bit;\r
-       }\r
-#endif\r
-\r
-#if    TRACE\r
-#define LogMatrices()                                                                                  \\r
-       {                                                                                                                       \\r
-       Log("Bit DPM:\n");                                                                                      \\r
-       LogDP(DPM_, PA, PB, uPrefixCountA, uPrefixCountB);                      \\r
-       Log("Bit DPD:\n");                                                                                      \\r
-       LogDP(DPD_, PA, PB, uPrefixCountA, uPrefixCountB);                      \\r
-       Log("Bit DPE:\n");                                                                                      \\r
-       LogDP(DPE_, PA, PB, uPrefixCountA, uPrefixCountB);                      \\r
-       Log("Bit DPI:\n");                                                                                      \\r
-       LogDP(DPI_, PA, PB, uPrefixCountA, uPrefixCountB);                      \\r
-       Log("Bit DPJ:\n");                                                                                      \\r
-       LogDP(DPJ_, PA, PB, uPrefixCountA, uPrefixCountB);                      \\r
-       Log("Bit TB:\n");                                                                                       \\r
-       LogBitTB(TB, PA, PB, uPrefixCountA, uPrefixCountB);                     \\r
-       bool Same;                                                                                                      \\r
-       Same = DPEq('M', g_DPM, DPM_, uPrefixCountA, uPrefixCountB);\\r
-       if (Same)                                                                                                       \\r
-               Log("DPM success\n");                                                                   \\r
-       Same = DPEq('D', g_DPD, DPD_, uPrefixCountA, uPrefixCountB);\\r
-       if (Same)                                                                                                       \\r
-               Log("DPD success\n");                                                                   \\r
-       Same = DPEq('E', g_DPE, DPE_, uPrefixCountA, uPrefixCountB);\\r
-       if (Same)                                                                                                       \\r
-               Log("DPE success\n");                                                                   \\r
-       Same = DPEq('I', g_DPI, DPI_, uPrefixCountA, uPrefixCountB);\\r
-       if (Same)                                                                                                       \\r
-               Log("DPI success\n");                                                                   \\r
-       Same = DPEq('J', g_DPJ, DPJ_, uPrefixCountA, uPrefixCountB);\\r
-       if (Same)                                                                                                       \\r
-               Log("DPJ success\n");                                                                   \\r
-       CompareTB(TB, g_TBM, g_TBD, g_TBE, g_TBI, g_TBJ, uPrefixCountA, uPrefixCountB);\\r
-       }\r
-#else\r
-#define LogMatrices()  /* empty */\r
-#endif\r
-\r
-SCORE NWDASmall(const ProfPos *PA, unsigned uLengthA, const ProfPos *PB,\r
-  unsigned uLengthB, PWPath &Path)\r
-       {\r
-       assert(uLengthB > 0 && uLengthA > 0);\r
-\r
-       ProfPos *pa0 = (ProfPos *) PA;\r
-       ProfPos *pb0 = (ProfPos *) PB;\r
-       ProfPos *paa = (ProfPos *) (PA + uLengthA - 1);\r
-       ProfPos *pbb = (ProfPos *) (PB + uLengthB - 1);\r
-\r
-       pa0->m_scoreGapOpen *= -1;\r
-       pb0->m_scoreGapOpen *= -1;\r
-\r
-       paa->m_scoreGapClose *= -1;\r
-       pbb->m_scoreGapClose *= -1;\r
-\r
-       pa0->m_scoreGapOpen2 *= -1;\r
-       pb0->m_scoreGapOpen2 *= -1;\r
-       paa->m_scoreGapClose2 *= -1;\r
-       pbb->m_scoreGapClose2 *= -1;\r
-\r
-       const unsigned uPrefixCountA = uLengthA + 1;\r
-       const unsigned uPrefixCountB = uLengthB + 1;\r
-       const SCORE e = g_scoreGapExtend;\r
-\r
-       const SCORE e2 = g_scoreGapExtend2;\r
-       const SCORE min_e = MIN(g_scoreGapExtend, g_scoreGapExtend2);\r
-\r
-       ALLOC_TRACE()\r
-\r
-       SCORE *MCurr = new SCORE[uPrefixCountB];\r
-       SCORE *MNext = new SCORE[uPrefixCountB];\r
-       SCORE *MPrev = new SCORE[uPrefixCountB];\r
-       SCORE *DRow = new SCORE[uPrefixCountB];\r
-       SCORE *ERow = new SCORE[uPrefixCountB];\r
-\r
-       char **TB = new char *[uPrefixCountA];\r
-       for (unsigned i = 0; i < uPrefixCountA; ++i)\r
-               {\r
-               TB[i] = new char [uPrefixCountB];\r
-               memset(TB[i], 0, uPrefixCountB);\r
-               }\r
-\r
-       SCORE Iij = MINUS_INFINITY;\r
-       SetDPI(0, 0, Iij);\r
-\r
-       SCORE Jij = MINUS_INFINITY;\r
-       SetDPJ(0, 0, Jij);\r
-\r
-       Iij = PB[0].m_scoreGapOpen;\r
-       SetDPI(0, 1, Iij);\r
-\r
-       Jij = PB[0].m_scoreGapOpen2;\r
-       SetDPJ(0, 1, Jij);\r
-\r
-       for (unsigned j = 2; j <= uLengthB; ++j)\r
-               {\r
-               Iij += e;\r
-               Jij += e2;\r
-\r
-               SetDPI(0, j, Iij);\r
-               SetDPJ(0, j, Jij);\r
-\r
-               SetTBI(0, j, 'I');\r
-               SetTBJ(0, j, 'J');\r
-               }\r
-\r
-       for (unsigned j = 0; j <= uLengthB; ++j)\r
-               {\r
-               DRow[j] = MINUS_INFINITY;\r
-               ERow[j] = MINUS_INFINITY;\r
-\r
-               SetDPD(0, j, DRow[j]);\r
-               SetDPE(0, j, ERow[j]);\r
-\r
-               SetTBD(0, j, 'D');\r
-               SetTBE(0, j, 'E');\r
-               }\r
-\r
-       MPrev[0] = 0;\r
-       SetDPM(0, 0, MPrev[0]);\r
-       for (unsigned j = 1; j <= uLengthB; ++j)\r
-               {\r
-               MPrev[j] = MINUS_INFINITY;\r
-               SetDPM(0, j, MPrev[j]);\r
-               }\r
-\r
-       MCurr[0] = MINUS_INFINITY;\r
-       SetDPM(1, 0, MCurr[0]);\r
-\r
-       MCurr[1] = ScoreProfPos2(PA[0], PB[0]);\r
-       SetDPM(1, 1, MCurr[1]);\r
-       SetBitTBM(TB, 1, 1, 'M');\r
-       SetTBM(1, 1, 'M');\r
-\r
-       for (unsigned j = 2; j <= uLengthB; ++j)\r
-               {\r
-               SCORE M = ScoreProfPos2(PA[0], PB[j-1]) + PB[0].m_scoreGapOpen +\r
-                 (j - 2)*e + PB[j-2].m_scoreGapClose;\r
-               SCORE M2 = ScoreProfPos2(PA[0], PB[j-1]) + PB[0].m_scoreGapOpen2 +\r
-                 (j - 2)*e2 + PB[j-2].m_scoreGapClose2;\r
-               \r
-               if (M >= M2)\r
-                       {\r
-                       MCurr[j] = M;\r
-                       SetBitTBM(TB, 1, j, 'I');\r
-                       SetTBM(1, j, 'I');\r
-                       }\r
-               else\r
-                       {\r
-                       MCurr[j] = M2;\r
-                       SetBitTBM(TB, 1, j, 'J');\r
-                       SetTBM(1, j, 'J');\r
-                       }\r
-               SetDPM(1, j, MCurr[j]);\r
-               }\r
-\r
-// Main DP loop\r
-       for (unsigned i = 1; i < uLengthA; ++i)\r
-               {\r
-               Iij = MINUS_INFINITY;\r
-               Jij = MINUS_INFINITY;\r
-               SetDPI(i, 0, Iij);\r
-               SetDPJ(i, 0, Jij);\r
-\r
-               DRow[0] = PA[0].m_scoreGapOpen + (i - 1)*e;\r
-               ERow[0] = PA[0].m_scoreGapOpen2 + (i - 1)*e2;\r
-               SetDPD(i, 0, DRow[0]);\r
-               SetDPE(i, 0, ERow[0]);\r
-\r
-               MCurr[0] = MINUS_INFINITY; \r
-               if (i == 1)\r
-                       {\r
-                       MCurr[1] = ScoreProfPos2(PA[0], PB[0]);\r
-                       SetBitTBM(TB, i, 1, 'M');\r
-                       SetTBM(i, 1, 'M');\r
-                       }\r
-               else\r
-                       {\r
-                       SCORE M = ScoreProfPos2(PA[i-1], PB[0]) + PA[0].m_scoreGapOpen +\r
-                         (i - 2)*e + PA[i-2].m_scoreGapClose;\r
-                       SCORE M2 = ScoreProfPos2(PA[i-1], PB[0]) + PA[0].m_scoreGapOpen2 +\r
-                         (i - 2)*e2 + PA[i-2].m_scoreGapClose2;\r
-                       if (M >= M2)\r
-                               {\r
-                               MCurr[1] = M;\r
-                               SetBitTBM(TB, i, 1, 'D');\r
-                               SetTBM(i, 1, 'D');\r
-                               }\r
-                       else\r
-                               {\r
-                               MCurr[1] = M2;\r
-                               SetBitTBM(TB, i, 1, 'E');\r
-                               SetTBM(i, 1, 'E');\r
-                               }\r
-                       }\r
-               SetDPM(i, 0, MCurr[0]);\r
-               SetDPM(i, 1, MCurr[1]);\r
-\r
-               for (unsigned j = 1; j < uLengthB; ++j)\r
-                       MNext[j+1] = ScoreProfPos2(PA[i], PB[j]);\r
-\r
-               for (unsigned j = 1; j < uLengthB; ++j)\r
-                       {\r
-                       RECURSE_D(i, j)\r
-                       RECURSE_E(i, j)\r
-                       RECURSE_I(i, j)\r
-                       RECURSE_J(i, j)\r
-                       RECURSE_M(i, j)\r
-                       }\r
-       // Special case for j=uLengthB\r
-               RECURSE_D_BTerm(i)\r
-               RECURSE_E_BTerm(i)\r
-               RECURSE_I_BTerm(i)\r
-               RECURSE_J_BTerm(i)\r
-\r
-       // Prev := Curr, Curr := Next, Next := Prev\r
-               Rotate(MPrev, MCurr, MNext);\r
-               }\r
-\r
-// Special case for i=uLengthA\r
-       MCurr[0] = MINUS_INFINITY;\r
-       SCORE M = ScoreProfPos2(PA[uLengthA-1], PB[0]) + (uLengthA - 2)*e +\r
-         PA[0].m_scoreGapOpen + PA[uLengthA-2].m_scoreGapClose;\r
-       SCORE M2 = ScoreProfPos2(PA[uLengthA-1], PB[0]) + (uLengthA - 2)*e +\r
-         PA[0].m_scoreGapOpen + PA[uLengthA-2].m_scoreGapClose;\r
-       if (M >= M2)\r
-               {\r
-               MCurr[1] = M;\r
-               SetBitTBM(TB, uLengthA, 1, 'D');\r
-               SetTBM(uLengthA, 1, 'D');\r
-               }\r
-       else\r
-               {\r
-               MCurr[1] = M2;\r
-               SetBitTBM(TB, uLengthA, 1, 'E');\r
-               SetTBM(uLengthA, 1, 'D');\r
-               }\r
-       SetDPM(uLengthA, 0, MCurr[0]);\r
-       SetDPM(uLengthA, 1, MCurr[1]);\r
-\r
-       DRow[0] = MINUS_INFINITY;\r
-       ERow[0] = MINUS_INFINITY;\r
-\r
-       SetDPD(uLengthA, 0, DRow[0]);\r
-       SetDPE(uLengthA, 0, ERow[0]);\r
-\r
-       for (unsigned j = 1; j <= uLengthB; ++j)\r
-               {\r
-               RECURSE_D_ATerm(j);\r
-               RECURSE_E_ATerm(j);\r
-               }\r
-\r
-       Iij = MINUS_INFINITY;\r
-       Jij = MINUS_INFINITY;\r
-\r
-       for (unsigned j = 1; j <= uLengthB; ++j)\r
-               {\r
-               RECURSE_I_ATerm(j)\r
-               RECURSE_J_ATerm(j)\r
-               }\r
-\r
-       LogMatrices();\r
-\r
-       SCORE MAB = MCurr[uLengthB];\r
-       SCORE DAB = DRow[uLengthB] + PA[uLengthA-1].m_scoreGapClose;\r
-       SCORE EAB = ERow[uLengthB] + PA[uLengthA-1].m_scoreGapClose2;\r
-       SCORE IAB = Iij + PB[uLengthB-1].m_scoreGapClose;\r
-       SCORE JAB = Jij + PB[uLengthB-1].m_scoreGapClose2;\r
-\r
-       SCORE Score = MAB;\r
-       char cEdgeType = 'M';\r
-       if (DAB > Score)\r
-               {\r
-               Score = DAB;\r
-               cEdgeType = 'D';\r
-               }\r
-       if (EAB > Score)\r
-               {\r
-               Score = EAB;\r
-               cEdgeType = 'E';\r
-               }\r
-       if (IAB > Score)\r
-               {\r
-               Score = IAB;\r
-               cEdgeType = 'I';\r
-               }\r
-       if (JAB > Score)\r
-               {\r
-               Score = JAB;\r
-               cEdgeType = 'J';\r
-               }\r
-\r
-#if TRACE\r
-       Log("    Small: MAB=%.4g DAB=%.4g EAB=%.4g IAB=%.4g JAB=%.4g best=%c\n",\r
-         MAB, DAB, EAB, IAB, JAB, cEdgeType);\r
-#endif\r
-\r
-       BitTraceBack(TB, uLengthA, uLengthB, cEdgeType, Path);\r
-\r
-#if    DBEUG\r
-       Path.Validate();\r
-#endif\r
-\r
-       delete[] MCurr;\r
-       delete[] MNext;\r
-       delete[] MPrev;\r
-       delete[] DRow;\r
-       delete[] ERow;\r
-       for (unsigned i = 0; i < uPrefixCountA; ++i)\r
-               delete[] TB[i];\r
-       delete[] TB;\r
-\r
-       return 0;\r
-       }\r
-#endif // DOUBLE_AFFINE\r