Minor changes
[ou-summer-of-code-2017.git] / 09-resolving-the-bill / subsequence.ipynb
index c945df8ef101137430c3218aa4e65af10e8bcf0c..4484bfb6c6a1fa5fe979607ccc7d6c4c086d1b26 100644 (file)
@@ -19,7 +19,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 54,
+   "execution_count": 1,
    "metadata": {
     "collapsed": true
    },
@@ -41,7 +41,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 4,
+   "execution_count": 2,
    "metadata": {
     "scrolled": true
    },
        " (5, 10): False}"
       ]
      },
-     "execution_count": 4,
+     "execution_count": 2,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 5,
+   "execution_count": 3,
    "metadata": {
     "collapsed": true
    },
   },
   {
    "cell_type": "code",
-   "execution_count": 6,
+   "execution_count": 4,
    "metadata": {},
    "outputs": [
     {
   },
   {
    "cell_type": "code",
-   "execution_count": 47,
+   "execution_count": 5,
    "metadata": {},
    "outputs": [
     {
        " (4, 7): (4, 6, 'b', 's2')}"
       ]
      },
-     "execution_count": 47,
+     "execution_count": 5,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 59,
+   "execution_count": 13,
    "metadata": {
     "collapsed": true
    },
     "    j = max([0] + [k[1] for k in bps])\n",
     "    chars = ''\n",
     "    if (i, j) in bps:\n",
-    "        while i != 0 or j != 0:\n",
+    "        while i != 0 and j != 0:\n",
     "            if bps[i, j][3] == 's1':\n",
     "                chars += bps[i, j][2].upper()\n",
     "            else:\n",
   },
   {
    "cell_type": "code",
-   "execution_count": 60,
+   "execution_count": 7,
    "metadata": {},
    "outputs": [
     {
        "'AAAbAbb'"
       ]
      },
-     "execution_count": 60,
+     "execution_count": 7,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 49,
+   "execution_count": 28,
    "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "aa 0 0 ! ! True\n",
+      "aa 0 1 ! ! True\n",
+      "aa 0 2 ! ! True\n",
+      "aa 0 3 ! ! True\n",
+      "aa 0 4 ! ! True\n",
+      "aa 0 5 ! ! True\n",
+      "aa 0 6 ! ! True\n",
+      "aa 0 7 ! ! True\n",
+      "aa 0 8 ! ! True\n",
+      "aa 0 9 ! ! True\n",
+      "aa 0 10 ! ! True\n",
+      "xx 1 1 a d False\n",
+      "s1 1 2 a a True\n",
+      "s2 1 3 a b True\n",
+      "s2 1 4 a a True\n",
+      "s1 1 4 a a True\n",
+      "s2 1 5 a a True\n",
+      "s1 1 5 a a True\n",
+      "s2 1 6 a b True\n",
+      "s2 1 7 a c True\n",
+      "s2 1 8 a a True\n",
+      "s1 1 8 a a True\n",
+      "s2 1 9 a c True\n",
+      "s2 1 10 a b True\n",
+      "xx 2 2 a a False\n",
+      "xx 2 3 a b False\n",
+      "s1 2 4 a a True\n",
+      "s2 2 5 a a True\n",
+      "s1 2 5 a a True\n",
+      "s2 2 6 a b True\n",
+      "s2 2 7 a c True\n",
+      "s2 2 8 a a True\n",
+      "s1 2 8 a a True\n",
+      "s2 2 9 a c True\n",
+      "s2 2 10 a b True\n",
+      "xx 3 3 a b False\n",
+      "xx 3 4 a a False\n",
+      "s1 3 5 a a True\n",
+      "s2 3 6 a b True\n",
+      "s2 3 7 a c True\n",
+      "s2 3 8 a a True\n",
+      "s1 3 8 a a True\n",
+      "s2 3 9 a c True\n",
+      "s2 3 10 a b True\n",
+      "xx 4 4 a a False\n",
+      "xx 4 5 a a False\n",
+      "xx 4 6 a b False\n",
+      "xx 4 7 a c False\n",
+      "s1 4 8 a a True\n",
+      "s2 4 9 a c True\n",
+      "s2 4 10 a b True\n"
+     ]
+    },
+    {
+     "data": {
+      "text/plain": [
+       "True"
+      ]
+     },
+     "execution_count": 28,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "is_subseq(s1, s2t, debug=True)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 27,
+   "metadata": {
+    "collapsed": true
+   },
    "outputs": [],
    "source": [
-    "def is_subseq(seq1, seq2, return_backpointers=False, debug=False):\n",
+    "def is_subseq(seq1, seq2, return_backpointers=False, return_table=False, debug=False):\n",
     "    \"\"\"Return true if seq1 is a subsequence of seq2.\n",
     "    If return_backpointers, also return the set of backpointers to\n",
     "    reconstruct the subsequence\"\"\"\n",
     "                if not dp_table[i, j]:\n",
     "                    if debug: print('xx', i, j, seq1[i-1], seq2[j-1], dp_table[i, j]) \n",
     "   \n",
-    "    if return_backpointers:\n",
-    "        return dp_table[len(seq1), len(seq2)], backpointers\n",
+    "#     if return_backpointers:\n",
+    "#         return dp_table[len(seq1), len(seq2)], backpointers\n",
+    "#     else:\n",
+    "#         return dp_table[len(seq1), len(seq2)]\n",
+    "    \n",
+    "    if return_backpointers or return_table:\n",
+    "        retval = [dp_table[len(seq1), len(seq2)]]\n",
+    "        if return_backpointers:\n",
+    "            retval += [backpointers]\n",
+    "        if return_table:\n",
+    "            retval += [dp_table]\n",
+    "        return tuple(retval)\n",
     "    else:\n",
     "        return dp_table[len(seq1), len(seq2)]"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 39,
+   "execution_count": 37,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "def show_annotated_table(table, bps):\n",
+    "    return '\\n'.join(' '.join('.' if (i, j) not in bps else bps[i, j][2] if table[i, j] else '.' for j in sorted(set([k[1] for k in table])))\n",
+    "        for i in sorted(set([k[0] for k in table])))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 29,
    "metadata": {},
    "outputs": [
     {
        "True"
       ]
      },
-     "execution_count": 39,
+     "execution_count": 29,
      "metadata": {},
      "output_type": "execute_result"
     }
    ],
    "source": [
-    "is_subseq(s1, s2t)"
+    "tf, bps, tb = is_subseq(s1, s2t, return_backpointers=True, return_table=True)\n",
+    "tf"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 55,
+   "execution_count": 20,
    "metadata": {},
    "outputs": [
     {
      "data": {
       "text/plain": [
-       "True"
+       "'AbAAbcAcb'"
       ]
      },
-     "execution_count": 55,
+     "execution_count": 20,
      "metadata": {},
      "output_type": "execute_result"
     }
    ],
    "source": [
-    "tf, bps = is_subseq(s1, s2t, return_backpointers=True)\n",
-    "tf"
+    "show_backtrace(bps)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 32,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "T T T T T T T T T T T\n",
+      "F F T T T T T T T T T\n",
+      "F F F F T T T T T T T\n",
+      "F F F F F T T T T T T\n",
+      "F F F F F F F F T T T\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(show_table(tb))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 38,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      ". . . . . . . . . . .\n",
+      ". . a b a a b c a c b\n",
+      ". . . . a a b c a c b\n",
+      ". . . . . a b c a c b\n",
+      ". . . . . . . . a c b\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(show_annotated_table(tb, bps))"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 56,
+   "execution_count": 21,
    "metadata": {},
    "outputs": [
     {
      "data": {
       "text/plain": [
-       "'AABCaCb'"
+       "False"
       ]
      },
-     "execution_count": 56,
+     "execution_count": 21,
      "metadata": {},
      "output_type": "execute_result"
     }
    ],
    "source": [
-    "show_backtrace(bps)"
+    "len(show_backtrace(bps)) == len(s2t)"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 42,
+   "execution_count": 24,
    "metadata": {},
    "outputs": [
     {
      "data": {
       "text/plain": [
-       "False"
+       "('aaaa', 'dabaabcacb')"
       ]
      },
-     "execution_count": 42,
+     "execution_count": 24,
      "metadata": {},
      "output_type": "execute_result"
     }
    ],
    "source": [
-    "is_subseq(s1, s2f)"
+    "s1, s2t"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 43,
+   "execution_count": 23,
    "metadata": {},
    "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "aa 0 0 ! ! True\n",
-      "aa 0 1 ! ! True\n",
-      "aa 0 2 ! ! True\n",
-      "aa 0 3 ! ! True\n",
-      "aa 0 4 ! ! True\n",
-      "aa 0 5 ! ! True\n",
-      "aa 0 6 ! ! True\n",
-      "aa 0 7 ! ! True\n",
-      "s1 1 1 a a True\n",
-      "s2 1 2 a a True\n",
-      "s1 1 2 a a True\n",
-      "s2 1 3 a a True\n",
-      "s1 1 3 a a True\n",
-      "s2 1 4 a b True\n",
-      "s2 1 5 a a True\n",
-      "s1 1 5 a a True\n",
-      "s2 1 6 a b True\n",
-      "s2 1 7 a b True\n",
-      "s1 2 2 a a True\n",
-      "s2 2 3 a a True\n",
-      "s1 2 3 a a True\n",
-      "s2 2 4 a b True\n",
-      "s2 2 5 a a True\n",
-      "s1 2 5 a a True\n",
-      "s2 2 6 a b True\n",
-      "s2 2 7 a b True\n",
-      "s1 3 3 a a True\n",
-      "s2 3 4 a b True\n",
-      "s2 3 5 a a True\n",
-      "s1 3 5 a a True\n",
-      "s2 3 6 a b True\n",
-      "s2 3 7 a b True\n",
-      "xx 4 4 a b False\n",
-      "s1 4 5 a a True\n",
-      "s2 4 6 a b True\n",
-      "s2 4 7 a b True\n"
-     ]
-    },
     {
      "data": {
       "text/plain": [
-       "(True,\n",
-       " {(1, 1): (0, 1, 'a', 's1'),\n",
-       "  (1, 2): (0, 2, 'a', 's1'),\n",
-       "  (1, 3): (0, 3, 'a', 's1'),\n",
-       "  (1, 4): (1, 3, 'b', 's2'),\n",
-       "  (1, 5): (0, 5, 'a', 's1'),\n",
-       "  (1, 6): (1, 5, 'b', 's2'),\n",
-       "  (1, 7): (1, 6, 'b', 's2'),\n",
-       "  (2, 2): (1, 2, 'a', 's1'),\n",
-       "  (2, 3): (1, 3, 'a', 's1'),\n",
-       "  (2, 4): (2, 3, 'b', 's2'),\n",
-       "  (2, 5): (1, 5, 'a', 's1'),\n",
-       "  (2, 6): (2, 5, 'b', 's2'),\n",
-       "  (2, 7): (2, 6, 'b', 's2'),\n",
-       "  (3, 3): (2, 3, 'a', 's1'),\n",
-       "  (3, 4): (3, 3, 'b', 's2'),\n",
-       "  (3, 5): (2, 5, 'a', 's1'),\n",
-       "  (3, 6): (3, 5, 'b', 's2'),\n",
-       "  (3, 7): (3, 6, 'b', 's2'),\n",
-       "  (4, 5): (3, 5, 'a', 's1'),\n",
-       "  (4, 6): (4, 5, 'b', 's2'),\n",
-       "  (4, 7): (4, 6, 'b', 's2')})"
+       "{(1, 2): (0, 1, 'a', 's1'),\n",
+       " (1, 3): (1, 2, 'b', 's2'),\n",
+       " (1, 4): (0, 3, 'a', 's1'),\n",
+       " (1, 5): (0, 4, 'a', 's1'),\n",
+       " (1, 6): (1, 5, 'b', 's2'),\n",
+       " (1, 7): (1, 6, 'c', 's2'),\n",
+       " (1, 8): (0, 7, 'a', 's1'),\n",
+       " (1, 9): (1, 8, 'c', 's2'),\n",
+       " (1, 10): (1, 9, 'b', 's2'),\n",
+       " (2, 4): (1, 3, 'a', 's1'),\n",
+       " (2, 5): (1, 4, 'a', 's1'),\n",
+       " (2, 6): (2, 5, 'b', 's2'),\n",
+       " (2, 7): (2, 6, 'c', 's2'),\n",
+       " (2, 8): (1, 7, 'a', 's1'),\n",
+       " (2, 9): (2, 8, 'c', 's2'),\n",
+       " (2, 10): (2, 9, 'b', 's2'),\n",
+       " (3, 5): (2, 4, 'a', 's1'),\n",
+       " (3, 6): (3, 5, 'b', 's2'),\n",
+       " (3, 7): (3, 6, 'c', 's2'),\n",
+       " (3, 8): (2, 7, 'a', 's1'),\n",
+       " (3, 9): (3, 8, 'c', 's2'),\n",
+       " (3, 10): (3, 9, 'b', 's2'),\n",
+       " (4, 8): (3, 7, 'a', 's1'),\n",
+       " (4, 9): (4, 8, 'c', 's2'),\n",
+       " (4, 10): (4, 9, 'b', 's2')}"
       ]
      },
-     "execution_count": 43,
+     "execution_count": 23,
      "metadata": {},
      "output_type": "execute_result"
     }
    ],
+   "source": [
+    "bps"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "is_subseq(s1, s2f)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
    "source": [
     "is_subseq('aaaa', 'aaababb', return_backpointers=True, debug=True)"
    ]