+++ /dev/null
-#include "muscle.h"\r
-#include "pwpath.h"\r
-\r
-#define TRACE 0\r
-\r
-void DiffPaths(const PWPath &p1, const PWPath &p2, unsigned Edges1[],\r
- unsigned *ptruDiffCount1, unsigned Edges2[], unsigned *ptruDiffCount2)\r
- {\r
-#if TRACE\r
- Log("DiffPaths\n");\r
- Log("p1=");\r
- p1.LogMe();\r
- Log("p2=");\r
- p2.LogMe();\r
-#endif\r
- const unsigned uEdgeCount1 = p1.GetEdgeCount();\r
- const unsigned uEdgeCount2 = p2.GetEdgeCount();\r
-\r
- unsigned uDiffCount1 = 0;\r
- unsigned uDiffCount2 = 0;\r
- unsigned uEdgeIndex1 = 0;\r
- unsigned uEdgeIndex2 = 0;\r
- const PWEdge *Edge1 = &p1.GetEdge(uEdgeIndex1);\r
- const PWEdge *Edge2 = &p2.GetEdge(uEdgeIndex2);\r
- for (;;)\r
- {\r
- unsigned uEdgeIndexTop1 = uEdgeIndex1;\r
- unsigned uEdgeIndexTop2 = uEdgeIndex2;\r
- Edge1 = &p1.GetEdge(uEdgeIndex1);\r
- Edge2 = &p2.GetEdge(uEdgeIndex2);\r
-#if TRACE\r
- Log("e1[%u] PLA%u PLB%u %c, e2[%u] PLA%u PLB %u %c DC1=%u DC2=%u\n",\r
- uEdgeIndex1, Edge1->uPrefixLengthA, Edge1->uPrefixLengthB, Edge1->cType,\r
- uEdgeIndex2, Edge2->uPrefixLengthA, Edge2->uPrefixLengthB, Edge2->cType,\r
- uDiffCount1, uDiffCount2);\r
-#endif\r
- if (Edge1->uPrefixLengthA == Edge2->uPrefixLengthA &&\r
- Edge1->uPrefixLengthB == Edge2->uPrefixLengthB)\r
- {\r
- if (!Edge1->Equal(*Edge2))\r
- {\r
- Edges1[uDiffCount1++] = uEdgeIndex1;\r
- Edges2[uDiffCount2++] = uEdgeIndex2;\r
- }\r
- ++uEdgeIndex1;\r
- ++uEdgeIndex2;\r
- }\r
-\r
- else if (Edge2->uPrefixLengthA < Edge1->uPrefixLengthA ||\r
- Edge2->uPrefixLengthB < Edge1->uPrefixLengthB)\r
- Edges2[uDiffCount2++] = uEdgeIndex2++;\r
-\r
- else if (Edge1->uPrefixLengthA < Edge2->uPrefixLengthA ||\r
- Edge1->uPrefixLengthB < Edge2->uPrefixLengthB)\r
- Edges1[uDiffCount1++] = uEdgeIndex1++;\r
-\r
- if (uEdgeCount1 == uEdgeIndex1)\r
- {\r
- while (uEdgeIndex2 < uEdgeCount2)\r
- Edges2[uDiffCount2++] = uEdgeIndex2++;\r
- goto Done;\r
- }\r
- if (uEdgeCount2 == uEdgeIndex2)\r
- {\r
- while (uEdgeIndex1 < uEdgeCount1)\r
- Edges1[uDiffCount1++] = uEdgeIndex1++;\r
- goto Done;\r
- }\r
- if (uEdgeIndex1 == uEdgeIndexTop1 && uEdgeIndex2 == uEdgeIndexTop2)\r
- Quit("DiffPaths stuck");\r
- }\r
-Done:;\r
-#if TRACE\r
- Log("DiffCount1=%u (%u %u)\n", uDiffCount1, uEdgeCount1, uEdgeCount2);\r
- Log("Diffs1=");\r
- for (unsigned i = 0; i < uDiffCount1; ++i)\r
- {\r
- const PWEdge e = p1.GetEdge(Edges1[i]);\r
- Log(" %u=%c%u.%u", Edges1[i], e.cType, e.uPrefixLengthA, e.uPrefixLengthB); \r
- }\r
- Log("\n");\r
- Log("DiffCount2=%u\n", uDiffCount2);\r
- Log("Diffs2=");\r
- for (unsigned i = 0; i < uDiffCount2; ++i)\r
- {\r
- const PWEdge e = p2.GetEdge(Edges2[i]);\r
- Log(" %u=%c%u.%u", Edges2[i], e.cType, e.uPrefixLengthA, e.uPrefixLengthB); \r
- }\r
- Log("\n");\r
-#endif\r
- *ptruDiffCount1 = uDiffCount1;\r
- *ptruDiffCount2 = uDiffCount2;\r
- }\r
-\r
-void TestDiffPaths()\r
- {\r
- PWPath p1;\r
- PWPath p2;\r
-\r
- p1.AppendEdge('M', 1, 1);\r
- p1.AppendEdge('M', 2, 2);\r
- p1.AppendEdge('M', 3, 3);\r
-\r
- p2.AppendEdge('M', 1, 1);\r
- p2.AppendEdge('D', 2, 1);\r
- p2.AppendEdge('I', 2, 2);\r
- p2.AppendEdge('M', 3, 3);\r
-\r
- unsigned Edges1[64];\r
- unsigned Edges2[64];\r
- unsigned uDiffCount1;\r
- unsigned uDiffCount2;\r
- DiffPaths(p1, p2, Edges1, &uDiffCount1, Edges2, &uDiffCount2);\r
- }\r