{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Step 2. Diagram rewriting" ] }, { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "Syntactic derivations in pregroup form can become extremely complicated, which may lead to excessive use of hardware resources and prohibitively long training times. The purpose of the :py:mod:`~lambeq.rewrite` module is to provide a means to the user to address some of these problems, via :term:`rewriters ` and :term:`rewriting rules ` that simplify the :term:`string diagram`. ``lambeq`` provides two kinds of rewriters:\n", "\n", "- `Box-level rewriters` utilize a sequence of :term:`functorial ` transformations on the diagram through rewriting rules. Each rewriting rule independently accesses individual boxes within the diagram, limiting its visibility to information solely within that specific box, without access to the broader diagram context.\n", "- Rewriters operating at the `diagram-level` function procedurally, implementing unrestricted transformations across the entirety of the diagram.\n", "\n", "``lambeq``'s rewriters are explained in detail in the following sections.\n", "\n", ":download:`Download code <../_code/rewrite.ipynb>`" ] }, { "cell_type": "markdown", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "## Box-level rewrite rules\n", "\n", "We will demonstrate the use of box-level rewriting rules using again the sentence \"John walks in the park\"." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "image/png": "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KooABpKk3NxcPfPMM2rZsqX8/PwUGhqqP/7xj9q2bVux9/nkk0903XXXyc/PTxEREXrggQeUm5vrskz+uzFHjx7VyJEjFRwcrICAAPXp00e//fab2ZsFlNmBAwdks9n0t7/9zWV+nz59ZLPZ9MILL7jMb9++vVq0aCFJSk5O1sSJE9WqVSvVqlVLAQEBSkxM1BtvvFGummbNmiWbzaZ7771XDodDkvTpp5+qa9euqlu3rvz9/dW4cWMNHjyY9oVq49LPzxf8ff78+WrVqpV8fX0VFRWlf/zjH9YWC1SyGTNm6Pbbb5ck3XjjjbLZbLLZbBo7dqxzGYfDoWeffVYxMTHy9fVVXFyc3n777SIfb9WqVerdu7eCgoLk5+enNm3aaN68eZWxKYDp8q+LtGrVKs2YMUNRUVHy9fVVmzZt9P7777ss++WXX2r48OGKjo6Wv7+/goKC1Lt3b3399deFHjf/eGfv3r265ZZbFBISotq1a1+2lrfffls+Pj665ZZblJWVVaHbiaqNjyBBknTbbbdp0aJF6tWrl+6++26lpKRozpw56tixo9atW6f4+HiX5T/77DO9+uqruuuuuzRu3DgtXbpUzz77rIKDgzV9+nSXZdPT09WlSxd16NBBTz75pPbt26cXX3xRN998s3755Rfe1USVFBUVpejoaK1evVqPP/64JOnixYtav3697Ha7Vq9erb/85S+SpHPnzmnz5s268847Jf1+gPjNN9+of//+atKkidLT07V48WL96U9/0smTJzVt2rRS1ZKXl6dJkyZp3rx5euqpp/TQQw9Jkr7++msNHDhQV199taZNm6agoCAdPXpUq1at0u7duxUXF1eB/xGgapk3b56OHz+u8ePHKygoSAsXLtSDDz6ohg0b6tZbb7W6PKBSDB48WMeOHdPrr7+u6dOnO98IiImJ0c6dOyVJ06dPV2Zmpu688075+vpq7ty5Gjt2rGJjY9WpUyfnY73++uu666671KFDBz388MOqWbOmVq5cqbvvvlt79uzR7NmzLdlGoKI9+OCDSk9P18SJEyVJ8+fP18iRI5WVleUMLxcsWKDU1FSNGTNGDRs21JEjR/TGG2+oR48eWrNmjW644QaXx7xw4YK6du2qTp06adasWTpx4kSx63/yySf18MMP65577tFLL70ku51zIjyK4UEGDBhgDBgwwOoyLLdmzRpDkjF79mzDMAzjyy+/NCQZw4YNMxwOh3O5rVu3Gl5eXkbnzp2d8/bt22dIMgICAox9+/Y55zscDqNVq1ZG/fr1XdbVtWtXQ5LxzDPPuMz/xz/+YUgyPv/8cxO20L1kZWUZkoykpCSrS7mspKQkQ5KRlZVldSmVZsKECYaPj4+Rnp5uGIZhfP3114YkY9SoUUatWrWMnJwcwzAMY9myZYYk48MPPzQMwzAuXLhQ6LHy8vKMrl27GrVr1zYuXrzonD9//nxDkrFmzZoi52VkZBiDBg0yfHx8jLffftvlMf/yl78Ykozjx49X9Ka7FXd4bXeXdl4V5fdZ8+fPd/k9IiLCOHPmjHO59PR0o27dukaHDh0sqtQ9uctruzu0c6sU1Y8UnH/NNdcY2dnZzvmHDx82atSoYYwYMcI57+jRo4avr68xcuTIQo8/efJkw263G3v27DFtG9yVu7y2u0s7N1t+m2jcuLFL/3HmzBmjcePGRnBwsJGRkWEYRtFjuZSUFCM0NNTo16+fy/z8452HH3640H0K9mF5eXnGxIkTDUnGrFmzKnjr3JMnvrYTt0FLliyRJD388MOy2WzO+W3bttWAAQO0fv16nTx50uU+gwYNcrnQm81m04033qiUlBRduHDBZVm73a7Jkye7zOvevbskadeuXRW5KUCF6t69u3JycrRu3TpJ0urVqxUeHq4///nPOn/+vH744QdJ0po1a5xtQJJq1qzpfIysrCydPn1aqamp6t27t86dO6fk5OQSrT81NVW9evXSqlWrtHz5co0ZM8bl73Xq1JEkffTRR4U+/gdUd7fffruzDUhSQECAOnToQL8CXGLixImqUaOG8/cGDRooLi7Opa18+OGHys7O1vjx43Xq1CmX24ABA+RwOLRq1Sorygcq3N133+3Sf9SpU0d33XWX0tLSnF/bXnAsd+HCBZ0+fVpeXl5q3769vv/++yIf9/777y92nVlZWbrlllv0+uuva8GCBYU+MQDPQQAD7du3T3a73XnaakGtWrVyLlNQdHR0oWVDQ0MlSadPn3aZHxkZKT8/vxItC1Ql+UHh6tWrnT9vvPFGJSQkKDg42GV+27ZtFRISIun3jvr+++9X48aN5e/vr7p16yosLEwPP/ywJCktLa1E6x87dqy+/fZbrVixQn369Cn090mTJik+Pl4TJ05USEiIbrrpJr300kuFAlOgOiquH6JfAVyVpK3s2LFDktSzZ0+FhYW53Hr16iVJOn78eOUUDJisqGOeli1bSpL27t0rSdqzZ49GjBih4OBg1apVyzmW++yzz4ocx4WFhSkoKKjYdf71r3/VkiVL9Pbbb+v//b//VzEbArdEAIMyudx1WwzDKPOyQFVSr149tWzZUqtXr1ZGRoa+//57de/eXXa7XV27dtVXX32l06dP6+eff3aGNZJ066236vnnn9dNN92kd955R59//rlWrlzpvGZM/gV0r2T48OGy2+36+9//rszMzEJ/Dw0N1Q8//KA1a9bo3nvv1fnz5/WXv/xFcXFx2rhxY8X8E4AqiuuHASVTXFspOAbLn/73v/+tlStXFnm77bbbKqVewGoXLlxQly5d9Pnnn+vPf/6zPvzwQ33xxRdauXKlunfvXuTxS0BAwGUfc9CgQQoICNDs2bN5o8DDcRFeKDo6Wg6HQzt27FCbNm1c/rZ9+3ZJUpMmTawoDbBc9+7d9eqrr2r58uW6ePGievToIUnq0aOH7r//fq1YsUKGYTgDmDNnzuiTTz7R6NGjC31zRGlP377tttvUo0cPjR49Wv3799fy5csLdfBeXl7q1q2bunXrJkn6+eeflZiYqCeeeEKffvppGbcaAOAuCn58vKyaNm0qSapbt6569uxZ7scDqrIdO3bo5ptvdpmXf8wTHR2tr776SkePHtVbb73l/JaxfI888kiZ1tm9e3eNGzdO/fv314033qhVq1YpPDy8bBsAt8YZMNCgQYMkSU899ZRLovvLL79o2bJl6ty5s8LCwiyqDrBW9+7d5XA49Pjjj6tx48aKiYlxzs/OztZTTz0lb29vdenSRdL/3mm89N2RY8eOlelrqEeMGKH33ntP69atU79+/VyusXTq1KlCyzdv3lz+/v5KTU0t9boAAO4nMDBQksr1uj9s2DD5+vrqb3/7W5FnXJ49e1bZ2dllfnygKpk7d67Onj3r/P3s2bOaN2+egoKC1LVr12LHcl9++WWx138piW7duunzzz/X/v37ndfOhOfhDBioV69eGjZsmN5//32lpaWpf//+zq+h9vPz00svvWR1iYBlunXrJrvdrh07dji/mlD6/bPC9evX1/bt29WhQwfVqlVLklSrVi317t1bCxculL+/v6677jodOHBAr732mpo0aVKm005vueUW+fj4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bNkiSWratKnFlcBd2Qyu/IMyWLhwoUaPHq2srCz5+vpaXQ5QbgkJCerYsaPmzJljdSkVzjAM1atXT3fddZdmzpxpdTmoBLfffru2bdumTZs2Vcr6nnrqKT3//PM6efJkpaxv4MCBkqRly5ZVyvrCwsJ03333adq0aZWyvsTERLVp00bz58+vlPXBWo899phee+01paSklOhjg+7myJEjatiwod59912NHDnS6nKAcpk8ebKWLVumffv2Vcv2CvNxDRgAqOZsNpvat2+vzz//nKvte4CLFy9q1apVateundWloIzatWunr776imtbeADDMLRixQq1b9++2h7MNWjQQAkJCXr99dfpg+DWzpw5ow8++EB/+MMfqm17hfkIYADAA0yaNEk//PCDVq1aZXUpMFlSUpIOHz6siRMnWl0KymjixIk6dOiQkpKSrC4FJlu5cqU2bdqkSZMmWV2KqWbNmqW1a9fq3XfftboUoMwefvhhZWRkVNrZkKieCGAAwAP07t1b7dq108yZM3kHshrLzc3Vk08+qSFDhujqq6+2uhyUUevWrTV48GA9+eSTys3NtbocmMQwDM2cOVPt27dXr169rC7HVH379tWwYcM0ZcoU7dy50+pygFJbvny55s6dq7///e+mfKsXPAcBDAB4AJvNpscee0zr16/XokWLrC4HJvnnP/+pvXv36pFHHrG6FJTTo48+qj179ujFF1+0uhSYZNGiRdqwYYMee+wxj/g4w8svv6ywsDDdeOON+u2336wuByixTz75REOGDNGgQYOq/dlqMB8BDAB4iJtuuknDhw/XqFGjtGTJEqvLQQV79dVX9cADD2jq1Km65pprrC4H5XTNNddo6tSpuv/++zV37lyry0EFW7JkiUaNGqURI0aoX79+VpdTKcLDw7VmzRoFBQWpa9eu+uKLL6wuCbgsh8OhOXPmaPDgwerfv7/ef/99eXvzJcIoHwIYAPAQNptNCxcu1ODBgzVs2DBCmGrk1Vdf1T333KMpU6Zo9uzZVpeDCjJ79mxNmTJFEydOJISpRpYsWaJhw4ZpyJAhSkpK8oizX/LVq1dPa9asUcuWLdW3b1+NHj1ap06dsrosoJBff/1VnTt31qRJkzRhwgS9//77qlGjhtVloRoggAEAD+Lt7a133nmHEKYaKRi+PP/88x51MFfd2Ww2Pf/884Qw1UjB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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from lambeq import BobcatParser\n", "\n", "# Parse the sentence\n", "parser = BobcatParser(verbose='suppress')\n", "diagram = parser.sentence2diagram(\"John walks in the park\")\n", "\n", "diagram.draw(figsize=(11,5), fontsize=13)" ] }, { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "Note that the representation of the preposition is a tensor of order 5 in the \"classical\" case, or a state of 5 quantum systems in the quantum case. Applying the ``prepositional_phrase`` :term:`rewriting rule ` to the diagram takes advantage of the underlying :term:`compact-closed ` monoidal structure, by using a \":term:`cap`\" to bridge the discontinued subject noun wire within the preposition tensor. Furthermore, the ``determiner`` :term:`rewriting rule ` will apply a :term:`cap` on type :math:`n \\cdot n^l`, eliminating completely the determiner \"the\"." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAABGAAAAIHCAYAAADQLypxAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/SrBM8AAAACXBIWXMAAA9hAAAPYQGoP6dpAABMMklEQVR4nO39eXQVhf0//r+yQELYZRFEAVlltYqCCwiKAlYEtdrWtdalLnVvq1bfLq1VtGq11Wo9RcWP1rbvt1YBFVQExBWVVlFERcUVUXYIa0ju749+yc8IIgkZhuQ+Hufck5vJ3HufdzL3zszzzp3JyWQymQAAAAAgMblpBwAAAACo7RQwAAAAAAlTwAAAAAAkTAEDAAAAkDAFDAAAAEDCFDAAAAAACVPAAAAAACRMAQMAAACQMAUMAAAAQMIUMAAAAAAJU8AAAAAAJEwBAwAAAJAwBQwAAABAwhQwAAAAAAlTwAAAAAAkTAEDAAAAkDAFDAAAAEDCFDAAAAAACVPAAAAAACRMAQMAAACQMAUMAAAAQMIUMAAAAAAJU8AAAAAAJEwBAwAAAJAwBQwAAABAwhQwAAAAAAlTwAAAAAAkTAEDAAAAkDAFDAAAAEDCFDAAAAAACVPAAAAAACRMAQMAAACQMAUMAAAAQMIUMAAAAAAJU8AAAAAAJEwBAwAAAJAwBQwAAABAwhQwAAAAAAlTwAAAAAAkTAEDAAAAkDAFDAAAAEDCFDAAAAAACVPAAAAAACRMAQMAAACQMAUMAAAAQMIUMAAAAAAJU8AAAAAAJEwBAwAAAJAwBQwAAABAwvLTDrCtffLJJ7Fw4cK0Y2ykefPm0bZt27RjJG57nf6kLxteA+Z/ALZH2bAMhmy3va6HZtv7T1YVMJ988kl069YtVq1alXaUjRQVFcXs2bNr9cy3PU9/0lfbXwPmfwC2V7V9GQzZbnteD82295+sKmAWLlwYq1atigceeCC6deuWdpxys2fPjhNOOCEWLlxYq2e87XX6k75seA2Y/wHYHmXDMhiy3fa6HpqN7z9ZVcBs0K1bt9hzzz3TjpG1TH+ymfkfAIA0WA9Nn4PwAgAAACRMAQMAAACQMAUMAAAAQMIUMAAAAAAJU8AAAAAAJEwBAwAAAJAwBQwAAABAwhQwAAAAAAlTwAAAAAAkTAEDAAAAkDAFDAAAAEDCFDAAAAAACVPAAAAAACRMAVNJH330UeTk5MTVV1+ddhRqiTFjxkROTk5MnTp1s8MAYFubOnVq5OTkxJgxY9KOAkANYxmysawsYF577bXIycmJm266Ke0oAAAAQBbITzsAAADbpwMOOCBWr14dderUSTsKANR4WbkHDAAA3y03NzcKCwsjLy8v7SgA1BArVqxIO8J2SwHz/1m/fn3ccMMN0b179ygsLIxmzZrFkUceGW+++ea33uaxxx6LvffeOwoLC6N169bxq1/9KtavX19hnEGDBkX79u1j3rx5ceyxx0bTpk2jqKgohg4dGu+9917ST4ut8PHHH0dOTk5cddVVFYYPHTo0cnJy4pZbbqkwvF+/ftGtW7eIiHjnnXfi7LPPjh49ekTDhg2jqKgo+vTpE6NHj96qTNdee23k5OTEueeeG2VlZRER8fjjj8fAgQOjefPmUa9evWjbtm0cddRR5i8Atto3v7//9d/vvffe6NGjRxQUFES7du3i97//fbphAdisPn36xKRJk+Lqq6+Odu3aRUFBQfTu3Tv+8Y9/VBjvqaeeih/96EfRoUOHqFevXjRp0iSGDBkSzz777Eb3uWF798MPP4yjjz46dthhh2jUqNFmc9x3331Rp06duPjii6v1+dUECpj/z/HHHx+XXnpp7LzzznHjjTfGmWeeGVOmTIl99903/vOf/2w0/hNPPBGnnHJKHHrooXHLLbfE7rvvHjfddNMmVz5WrlwZBxxwQOTl5cV1110X55xzTkydOjVGjhwZpaWl2+LpUQXt2rWLDh06xOTJk8uHrVu3Lp5//vnIzc2tMHz58uUxY8aMOOiggyLivyuo06ZNi+HDh8eNN94Y11xzTdSpUydOP/30GDVqVKWzlJaWxllnnRX/8z//E6NGjYrbbrstcnNz49lnn40RI0bE0qVL49e//nXcfvvtcfrpp8eiRYvi/fff3/qJAACb8Je//CV++9vfxrHHHhs333xztG7dOi655JJ48MEH044GwGZccskl8Y9//CPOPvvs+O1vfxvr1q2LY489tsKBcseMGROLFy+Ok046KW677ba48MILY/bs2TF48OB47rnnNrrP4uLiGDhwYOTn58e111672RPWXHfddXHyySfHGWecEddff30Cz3A7l8kiM2bMyERE5q677spERObGG2/MZDKZzFNPPZWJiMwPf/jDTFlZWfn4r7/+eiYvLy/Tv3//8mFz587NRESmqKgoM3fu3PLhZWVlmR49emRatWpV4TEHDhyYiYjMDTfcUGH473//+0xEZCZOnFiea8aMGQk86+1HTXyep512WqZOnTqZlStXZjKZTObZZ5/NRETmhBNOyDRs2DBTUlKSyWQymXHjxmUiIvPQQw9lMplMpri4eKP7Ki0tzQwcODDTqFGjzLp168qH33vvvZmIyEyZMmWTw1atWpU54ogjMnXq1Mncd999Fe7zwgsvzERE5ssvv6zup75N1cR5o7Ky4TkCtc+UKVMyEZG59957K/zeunXrzNKlS8vHW7lyZaZ58+aZffbZJ6WkVJXlE9R+G17nEZFp27ZthffvpUuXZtq2bZtp2rRpZtWqVZlMZtPbMvPnz880a9Ysc+ihh1YYvmF79/LLL9/oNl9fhpSWlmbOPvvsTERkrr322gq5sun9x0F4I+KRRx6JiIjLL788cnJyyofvvvvucfjhh8ejjz4aCxYsiBYtWpT/7Ygjjoj27duX/56TkxMHHnhg3H777VFcXBwNGjQo/1tubm6cd955FR5zw54Sc+bMqXC/bF8OOuigGD16dDz33HMxdOjQmDx5crRs2TLOP//8eOCBB+LVV1+NfffdN6ZMmVI+D0RE1K9fv/w+1qxZEytXroxMJlO+694777wTvXr1+s7HX7x4cRxyyCHxxhtvxPjx42Po0KEV/t64ceOIiHj44Yfj9NNPj/x8L2kAkvfTn/60fBkUEVFUVBT77LNPvPTSSymmguyUyWRi5cqVsWjRoli8eHEsWrSo/PratWtj/fr1UVJSEuvXr4/169dHo0aNYtmyZVGnTp3Iz8+P/Pz8qFOnTtStWzd22GGHaNasWYWfDRs2rLCNRM121llnVXj/bty4cZx55plx2WWXxdSpU+PQQw+tsC1TXFwca9eujby8vOjXr1+8/PLLm7zfX/7yl9/6mGvWrImjjz46xo8fH2PGjImf/OQn1feEahhbaxExd+7cyM3NLT9+x9f16NEjHn300Zg7d26FoqRDhw4bjdusWbOIiFi0aFGFAmannXaKwsLCbx2X7deGomzy5MnlBcyBBx4Ye+65ZzRt2jQmT54c++67b0yePDl233332GGHHSLiv29UV199dfzv//5vfPrppxvd75IlS7bo8U8++eQoLi6OadOmRf/+/Tf6+znnnBNjx46Ns88+Oy655JLo379/DBs2LI499ljFHgCJ+bb1IOs1UP2Ki4vj7bffjlmzZsVbb70VH374YYWyZfHixbFu3bqNbpeXlxf16tUrL1k2XPbcc8/497//XV7IbLisWbNmo+NZRkTUqVMndthhh/JSplmzZtG+ffvo0aNH9OzZM3r06PGdx/xg+7Gpbd7u3btHRMSHH34YEREffPBBXH755fHkk0/G0qVLK4y7qTKuRYsW0aRJk299zIsvvjhWrFgRf/vb3+K4446revhaQAFTRZs7G0Amk6nyuGxfdtxxx+jevXtMnjw5Vq1aFdOnTy8//srAgQPjmWeeiTPPPDNmzpwZF154YfntjjvuuHjsscfiZz/7WRxwwAHRrFmzyMvLiyeeeCJuueWW8gPofpcf/ehHce+998Y111wTjz76aNSrV6/C35s1axavvvpqPPfcc/H000/HtGnT4sILL4yrrroqnnjiidh3332rdXoAQMTm122AqikpKSkvWd56663y6x999FFE/HfDt0OHDtG5c+do165d7LHHHuWFyNfLkQ3XK7vnSiaTieLi4o32ovnmnjWLFi2KCRMmxG233Va+TrvLLruUlzEbfvbq1SsKCgqSmFQkqLi4OA444IBYuXJlXHDBBdGrV69o2LBh5ObmxqhRoyocB3ODoqKizd7nEUccEQ8//HDceOONMXTo0PKdEbKRAib++ylOWVlZzJ49O3r37l3hb2+//XZEROy6665pRGM7cNBBB8Udd9wR48ePj3Xr1sXgwYMjImLw4MHxy1/+MiZMmBCZTKZ8b5mlS5fGY489FieeeGL85S9/qXBfkyZNqtRjH3/88TF48OA48cQTY/jw4TF+/PiN3uDy8vJi0KBBMWjQoIiImDlzZvTp0yd+97vfxeOPP17FZw0AQNKWL18eEydOjLFjx8YTTzxRvrdB27Zto2fPnnHMMceUFxrdunX7zg3drZGTkxMNGzaMhg0bRrt27b5z/DVr1sQ777xTXhTNmjUrHn744bjpppsiIqJhw4YxbNiwGDFiRHz/+98v31OcdM2ePTtGjhxZYdiGbd4OHTrEM888E/PmzYt77rknfvrTn1YY73/+53+q9JgHHXRQnHLKKTF8+PA48MADY9KkSdGyZcuqPYEaTgET/23k7rjjjhg1alQ8+OCD5U3xW2+9FePGjYv+/fv7OkcWO+igg+L222+P3/zmN9G2bdvo2LFj+fC1a9fGqFGjIj8/Pw444ICI+P9/KvjNvZu++OKLKp2G+sc//nHk5+fHcccdF4ceemg8/vjj5V9xW7hwYTRv3rzC+LvttlvUq1cvFi9eXOnHAgAgWZ988kmMHz8+xo0bF1OmTImSkpL43ve+F+edd14MGTIkevXqVSO+0lNYWBjf+9734nvf+16F4cXFxTFr1qyYNGlSjBs3Lk488cTIy8uLAQMGxIgRI2LEiBHl69Nse3feeWeF48AsW7Ys/vKXv0STJk1i4MCB5Xu4fHNb5qmnnorp06dX+XEHDRoUEydOjO9///tx4IEHxjPPPFP1J1GDKWAi4pBDDokf/vCH8Y9//COWLFkSw4cPj/nz58ef//znKCwsjD/96U9pRyRFgwYNitzc3Jg9e3acfPLJ5cO7d+8erVq1irfffjv22WefaNiwYUT8t+0fMmRIPPDAA1GvXr3Ye++94+OPP4677rordt111yp9P/7oo4+OOnXqxA9/+MMYOnRoTJgwIRo1ahSnn356fPbZZzFkyJBo165drF69Ov75z3/GihUr4qSTTqquSQAAwFbIZDLx6KOPxqhRo+LVV1+N/Pz8OPDAA+MPf/hDHH744Vu0x0lN0aBBg+jXr1/069cvLr/88pg3b1489thjMXbs2Pj1r38dF110UfTq1SsuueSS+PGPf+wrjdtY8+bNo1+/fuV7t9x7773xySefxOjRo6OoqCj69+8frVq1il/84hfx0Ucfxc477xyvv/563H///dGrV6948803q/zY/fv3j6eeeiqGDRsWgwYNij/+8Y/V9bRqjNy0A6RhQ5v39Rf73/72t7j++uvj448/jl/84hdxxx13xMCBA+Oll16KPfbYI62obAeaNm1a3uxv+JrRBht+/+bwBx54IE455ZQYP358nHPOOfHoo4/GtddeGz//+c+rnGPkyJHxr3/9K2bMmBFDhgyJZcuWxYknnhitW7eO++67L84999z43e9+F3Xq1ImHHnoozjrrrCo/FgAAWy+TycRjjz0Wffr0iaOOOioaNmwY//jHP2LhwoXx1FNPxTnnnFOrypdN2WmnneJnP/tZPP7447Fw4cL417/+FW3bto0TTjghevfuHf/3f/+3xcdHZOvdcMMN8aMf/Sj+/Oc/x5VXXhl16tSJv/3tb3HqqadGRESTJk3iySefjH79+sVtt90Wv/jFL+Ltt9+OJ554Ivbcc8+tfvx99tknJk2aFF999VWcfvrpW31/NU5Kp79OxYbzjN98882ZiMjcc889aUfKZDLZc/7zbHmeVF42zBvZ8BwBqHksn5JRVlaWmThxYqZv376ZiMgccMABmalTp6Yda7syffr0zLBhwzIRkendu3fmkUceyZSVlaUdq1ba8DqPiMyUKVPSjlMuG99/snIPmA27TfXq1SvlJAAAQG0yb968OPDAA2PYsGGRl5cXkyZNiqlTp8bAgQPTjrZd6du3b0yYMCGef/75aNGiRRx55JHRt2/f+OCDD9KOBonJqgJm4sSJERFx//33xx577BF77bVXyokAAIDa4j//+U95ifDEE0/ECy+8EIMHD67U6aCzzf77719eUi1fvjz69esXzz//fNqxIBFZVcBcf/31EfHf43WMHz8+5TQAAEBtseHsqa1bt45XXnklDj30UMVLJWw4/mavXr1i8ODB8cADD6QdCapdVhUwU6dOjYj/FjFt2rRJNwwAAFDjZTKZuPnmm+OII46IYcOGxbPPPhutW7dOO1aNtMMOO8STTz4Zxx9/fJx44olx5ZVXbnQ6ZKpuxowZMWjQoLRjZDWnoQYAAKiia6+9Nq644oq45JJL4rrrrovc3Kz6jLva1a1bN+6+++7o0qVL/PrXv47i4uL4wx/+kHYsqBYKGAAAgCp444034je/+U1cdtllce2116Ydp9bIycmJSy+9NAoKCuKiiy6KI488MgYMGJB2LNhq6lkAAIBKWr9+fZxyyinRtWvXuOqqq9KOUyudf/75sd9++8Wpp54aq1evTjsObDUFDAAAQCXddNNN8frrr8c999wTdevWTTtOrZSbmxt33313fPLJJ0ouagUFDAAAQCW8++67cfXVV8dFF10Uffv2TTtOrbbbbrvF1VdfHTfffHO8+uqraceBraKAAQAAqIQbb7wxdtxxx/jNb36TdpSs8Mtf/jJ69OjhODvUeAoYAACALZTJZGLixIlx9NFHR1FRUdpxskJ+fn786Ec/ismTJ8e6devSjgNVpoABAADYQrNmzYrPP/88hg0blnaUrDJs2LBYsWJFvPTSS2lHgSpTwAAAAGyhiRMnRr169ZwWeRvbY489okWLFjFx4sS0o0CVKWAAAAC20MSJE2PQoEFRWFiYdpSskpubG0OHDlXAUKMpYAAAALbA2rVr47nnnouhQ4emHSUrDR06NF5//fVYuHBh2lGgShQwAAAAW2Dx4sWxbt266NSpU9pRslLHjh0jImL+/PkpJ4GqUcAAAABsgaVLl0ZERJMmTVLNka02TPcN/weoafLTDpCG2bNnpx2hgu0tT9Ky7fny3bJpnsim5wrA9s9yqXJWrlwZffv2jYYNG6YdJSs1btw49t5771i9enXaUWqk7e31vr3l2RayqoBp3rx5FBUVxQknnJB2lI0UFRVF8+bN046RqO15+pO+2v4aMP8DsL2q7cvg6rRmzZp45ZVXom7dumlHyUp169aNV199NVatWpV2lBple14Pzbb3n6wqYNq2bRuzZ8+uloM2jRkzJu67776YMmVKNST774uibdu21XJf26vqnP5Tp06NX/ziFzFp0qRo2rRpNaSjMubOnRtHH310jB49OvbYY49quc/a/hqozvk/k8nEXnvtFVdccUUcccQRWx8OoBL++Mc/xtSpU+ORRx5JO0pWevTRR+Oaa66J1157LXJycqrlPmv7MhiyXXWuhx544IHxk5/8JE4++eStDxbZ9/6TVQVMxH9nvur4Bz/99NORn58fe+65ZzWkyh7VNf0//fTTiIjYfffds6ox3V4UFRVFRETXrl29Biqhuub/TCYTERHt2rUz/YFtbscdd4zCwkLvPyn5z3/+ExERe+65Z7UVMEDtV13rofn5+dGmTRvLgCpyEF4AAACAhClgAAAAABKmgAEAAABImAIGAAAAIGEKGAAAAICEKWAAAAAAEqaAAQAAAEiYAgYAAIiPPvoocnJy4uqrr047Cmxz5n+2BQUMAAAAQMIUMAAAAAAJU8DAFshkMlFcXJx2DNimzPcAAFB9FDAJGDNmTOTk5MTkyZPjpptuio4dO0ZBQUF06dIl7rvvvrTj1XpbO/2nTp0aOTk5MWbMmPjzn/8c3bt3j8LCwrjpppu2Qfqab82aNXH11VdH165do6ioKJo0aRK9evWKX/3qV2lHywpVnf7me6A6WAakyzpoukz/dJn+6TL9t0x+2gFqs8suuyxWr14dZ5xxRhQUFMSdd94ZJ598cnTq1Cn233//tOPVels7/W+99dZYtGhRnH766dGqVavYZZddtkHqmu/nP/953HPPPXHSSSfFRRddFOvXr485c+bE5MmT046WFbZ2+pvvga1hGbB9sA6aLtM/XaZ/ukz/zVPAJGjt2rXx6quvRt26dSMi4uijj44OHTrE7bffbubbBrZ2+n/yySfxzjvvRMuWLZOOWqs88sgjceihh2q6U7K10998D2wNy4Dtg3XQdJn+6TL902X6b56vICXo7LPPLp/xIiLatGkTXbp0iTlz5qSYKnts7fQ/6aSTbIRWQePGjWPWrFnx1ltvpR0lK23t9DffA1vDMmD7YB00XaZ/ukz/dJn+m6eASVCHDh02GtasWbNYtGhRCmmyz9ZO/y5dulR3pKxw6623xpIlS6JXr17RsWPHOO2002Ls2LFRVlaWdrSssLXT33wPbA3LgO2DddB0mf7pMv3TZfpvngImQXl5eZscnslktnGS7LS107+oqKg642SNkSNHxkcffRT3339/HHTQQfHMM8/EEUccEYMGDYp169alHa/W29rpb74HtoZlwPbBOmi6TP90mf7pMv03TwEDVLsddtghTjjhhPjrX/8aH374YVx88cXx3HPPxdixY9OOlhVMfyBN3oMAYNMUMGS1DQccLSkpSTtKrVBaWhpLly6tMCwnJyf22GOPiIhYvHhxCqmyx5ZOf/M9kATLgJrFsoBsZv4nLc6CRFY76aST4tlnn425c+dG+/bt045T461YsSJat24dI0aMiD322CNatmwZc+fOjTvvvDOaNm0ahx9+eNoRa7Utnf7meyAJlgE1i2UB2cz8T1oUMEC1KSoqigsuuCCeeeaZmDRpUhQXF5evjP/617+OnXbaKe2ItZrpD6TJexAAbF5OxtFwquSGG26I3//+947mnJKxY8fGEUccEQsWLIjmzZunHSfrvPPOO9GtW7d47rnnon///mnHyTqZTCZyc3Nj9OjRceqpp6YdB8gyF198cYwdOzbefffdtKNkpbvvvjtOO+20KCsri5ycnLTjZJ3nn38+BgwYELNnz47ddtst7ThZZ+HChdGiRYt49NFHY+TIkWnHyUrNmjWLiy++OC655JK0o9RIjgEDAAAAkDAFDAAAAEDCFDAAAAAACVPAAAAAACRMAQMAAACQMAUMAAAAQMIUMAAAAAAJU8AAAAAAJEwBAwAAAJAwBQwAAABAwhQwAAAAAAlTwAAAAAAkTAEDAAAAkDAFDAAAAEDCFDAAAAAACVPAAAAAACRMAQMAAACQMAUMAAAAQMIUMAAAAAAJU8AAAAAAJEwBAwAAAJAwBQwAAABAwhQwAAAAAAlTwACVlpubG3369IlMJpN2lKxUVlYWffr0iaKiorSjALCNFRUVWQanKJPJRJ8+fSI312ZUWvbaa6/IyclJO0bW6tGjRzRs2DDtGDWWdw6g0oqKimLGjBmxcuXKtKNkpZUrV8aMGTMiLy8v7SgAbGO5ubmWwSkqLi6OGTNmRP369dOOkpUaNGgQr732WixfvjztKFkpk8nEyy+/rADbCgoYoNKaNGkSERFLly5NNUe22jDdN/wfAMgelsHpsgxOV2FhYRQUFJj/U7J69eooKSkx/28FBQxQafXr1486derEl19+mXaUrPTVV19FRETTpk1TTgLAtrbDDjtERFgGp+Srr76KunXr+hpwipo2bWr+T8mGdVAFTNUpYIBKy8nJib59+8a0adPSjpKVnn322ahXr1706tUr7SgAbGM9e/aMwsJCy+CUPPvss9G3b19fwUiRddD0PPvss5GTkxN777132lFqLAUMUCXDhg2LSZMmRUlJSdpRss7EiRNj0KBBUVhYmHYUALaxevXqxaBBg2LixIlpR8k6JSUlMWnSpBg2bFjaUbLasGHD4sUXX4xly5alHSXrTJw4Mfbaa69o3rx52lFqLAUMUCXDhg2L5cuXx8svv5x2lKyycuXKmDZtmpU/gCw2bNiwmDZtWqxatSrtKFnlpZdeihUrVlgGp2zo0KGxfv36mDx5ctpRskppaWk89dRT5v+tpIABqmTPPfeM5s2bx5NPPpl2lKzy7LPPxrp16yz8ALLYsGHDYu3atfHss8+mHSWrPPnkk9GiRYvYY4890o6S1Tp06BBdunSxDrqNvfbaa7F48WLroFtJAQNUSW5ubgwZMiQee+yxyGQyacfJGo8//ni0b98+OnfunHYUAFLSpUuXaNeuXTz22GNpR8kamUwmHn/88RgyZEjk5tqEStvQoUNjwoQJUVpamnaUrPH4449H48aNo2/fvmlHqdG8ewBVdtJJJ8Ubb7wRf/vb39KOkhXefvvtGD16dJx44okO/geQxXJycuKkk06K0aNHx+zZs9OOkxUeeOCBeOONN+LEE09MOwoRccIJJ8Snn34at912W9pRssKnn34at956axx33HGRn5+fdpwaTQEDVNnQoUPjuOOOi/PPP9/pABNWWloap556anTo0CEuu+yytOMAkLLLLrssdt111zj11FPtBZCw+fPnx/nnnx/HH398DB06NO04xH/PhHTOOefEZZddFh988EHacWq1TCYTZ5xxRjRq1ChGjRqVdpwaTwEDbJU//vGPkZeXF+ecc07aUWq1P/3pTzF9+vS4++67nf0IgCgsLIy77747Xn75ZXsBJOycc86J/Pz8uPXWW9OOwtdcd911seOOO8bpp5/u6/AJuv/++2PChAnxl7/8JRo3bpx2nBpPAQNslebNm8ftt98eDz30UPzrX/9KO06t9MEHH8Tll18e5513Xuy3335pxwFgO7H//vvHueeeG5dffnl8+OGHaceplR5++OF4+OGH489//rNT725nGjRoEH/9619jypQp8de//jXtOLXS/Pnz44ILLojjjz8+hg8fnnacWkEBA2y1Y445Jo444og4/fTT4/nnn087Tq3y6aefxpFHHhmtWrWKa6+9Nu04AGxnrr322mjZsmUceeSR8dlnn6Udp1Z5/vnn42c/+1kceeSRcfTRR6cdh004+OCD47TTTouLLrooJkyYkHacWmXBggVx1FFH2furmilggK2Wk5MTd999d/Tu3TsGDx7soLzV5LXXXot+/frF8uXLY/z48VG/fv20IwGwnWnQoEGMHz8+li5dGn379o0ZM2akHalWeOCBB2Lw4MHRu3fvuPvuux38fjt26623xkEHHRTDhw+P22+/Pe04tcLs2bOjX79+8cEHH8T48ePt/VWNFDBAtdhhhx3iySefjOOOOy5OOOGEuOqqq3wfdyv861//igMOOCDatm0b06dPjx49eqQdCYDtVM+ePWP69Omxyy67xIABA+KRRx5JO1KNlclk4sorr4wTTzwxjj/++HjyySejadOmacdiM+rXrx+PPPJInH/++XHuuefGeeedF+vXr087Vo01adKk2HfffaN+/frxyiuvRL9+/dKOVKsoYIBqU7du3bjnnnti1KhR8dvf/jaOO+64WLVqVdqxapSysrK44YYb4gc/+EEcfvjhMWXKlNhxxx3TjgXAdq5Vq1YxderUGD58ePzgBz+I3//+91FWVpZ2rBpl1apVceyxx8Y111wTo0aNirvvvjvq1q2bdiy2QF5eXvzhD3+IO++8M+64444YMWJELFu2LO1YNUomk4m77rorhg0bFvvuu2+88MIL0a5du7Rj1ToKGKBa5eTkxKWXXhr/93//F48++mh06tQpbr/99li7dm3a0bZrmUwmxo4dG3vuuWdceuml8T//8z/x97//PerVq5d2NABqiHr16sU//vGPuOyyy+KSSy6JPffcM8aNG2eP1O+wZs2auO2226Jjx44xbty4eOihh+LSSy/1taMa6Mwzz4wnnngiXnjhhejYsWPccMMNsXLlyrRjbdcymUw8/fTTsd9++8WZZ54ZZ511VowfPz4aNWqUdrRaSQEDJOLoo4+Ot956Kw455JA4//zzo1OnTnHXXXfFunXr0o62XclkMvHEE0/E3nvvHUcccUQ0bdo0pk2bFtdcc03k5nqLBqBycnNz43e/+11MmzYtmjZtGiNHjoy+ffvGhAkTFDHfsG7duvjLX/4SnTt3jgsuuCCGDh0ab775ZvzgBz9IOxpbYciQITFr1qw45phj4oorrogOHTrELbfcEqtXr0472nbn2WefjYEDB8aQIUMik8nEk08+Gbfddlvk5+enHa3WsnYPJKZjx45x3333xdtvvx0DBgyIs846K7p27Rr33HNP1u8RU1ZWFk899VTst99+cdhhh0VhYWFMnjw5pkyZEgMGDEg7HgA13IABA2LKlCnxzDPPRN26deP73/9+7L///vH0009n/VeT1q5dG3fffXd06dIlzj777BgwYEC8/fbbMWbMmOjYsWPa8agGO++8c9x5553x3nvvxeGHHx6/+tWvomPHjnHbbbdl/dfjM5lMPP/88zF48OAYNGhQrFy5Mh577LF46aWXYsiQIWnHq/UUMEDiunbtGg8++GDMnDkz9tprrzj11FOjefPmccwxx8T9998fixcvTjviNrF69ep4/PHH44wzzoidd945hg4dGmVlZfHkk0/Gc889FwceeGDaEQGoZQ466KB4/vnnY+LEiVFaWhpDhgyJnXfeOc4444x4/PHHY82aNWlH3CYWLVoU999/fxxzzDHRvHnzOO2002LvvfeON998Mx588MHo2rVr2hFJQPv27WP06NHx7rvvxiGHHBIXXHBBNG/ePEaOHBl33313fPnll2lH3CbWrVsXTz/9dJx77rnRvn37GDBgQCxYsCAeeeSReO211+Kwww7zlbttJCdjX8QqueGGG+L3v/99LFq0KO0oWWns2LFxxBFHxIIFC5wWrQaaPXt2/Otf/4px48bFK6+8Enl5edG/f/8YMWJEjBgxIjp16pR2xGqzYMGCePzxx2PcuHHx5JNPxqpVq6Jjx44xcuTIGDlyZAwYMMACD6hRLr744hg7dmy8++67aUehkjKZTDz33HMxduzYGDt2bHzwwQdRVFQUQ4cOjREjRsRhhx0WLVq0SDtmtXn//fdj3LhxMW7cuHj++eejtLQ0+vbtGyNGjIijjjoqunXrlnZEtrEPP/wwHn744Rg3bly8+OKLkclkYp999ilfB+3WrVutWS9bsmRJTJgwIcaNGxcTJkyI5cuXR9u2bcuf6+DBg33dPQUKmCpSwKRLAVN7zJs3Lx577LEYN25cTJo0KdauXRudOnWK3r17R8+ePaNHjx7Rs2fP6Ny5c9SpUyftuN+qrKwsPvnkk3jrrbdi1qxZ8dZbb8Vbb70VM2fOrLBwHzlyZOy22261ZuEOZB8FTO2QyWRi9uzZ5QXFyy+/HDk5OeXL368vg9u2bbtdb6iVlJTEnDlzKiyDZ86cGe+//34UFBTEwQcfHCNHjozhw4dH69at047LdmJTH5K1a9cuvve975XP+z169IiuXbtGQUFB2nG/VSaTic8++6x83t/w8/XXX4/169dHnz59ytdBe/fubR00ZQqYKlLApEsBUzutXLkynnrqqZgyZUrMmjUrZs2aVb5raJ06daJr167lC8QuXbpE8+bNo1mzZtGsWbPYYYcdoqioKLFs69ati8WLF8eiRYvKf3744YflC7pZs2aVH2W/YcOG5QvtffbZJ4YPH+5U0kCtoYCpnb788st47LHH4uWXXy5ftq1YsSIiIurXrx89evQoXwZ36NChfNm74WeSp2tetWpV+bJ30aJFsXDhwnjvvffKc7777rtRUlISERE77rhj+TJ40KBBMWTIkKhfv35i2agd1qxZE5MnT45JkyaVFxjz5s2LiP+e4rpz587l89Vuu+0WLVq0qPAaKCoqSqzYKCkpicWLF1d4DXz00UcVCpfly5dHxH9fq927d4+ePXtG3759Y/jw4bHzzjsnkouqUcBUkQImXQqY7LFw4cLyguPrrf6mjhtTWFhYYWG44Xq9evUiPz8/6tSpE/n5+ZGfnx9NmjSJZcuWxfr166OkpCTWr18f69evj7Vr18aSJUsqFC2LFi2K4uLijR6vqKgounfvXuFTkp49e8bOO+/s0wW2uUwmEytWrKgw3y5evDiKi4srzOMbNlJKS0vLXw9ff200btx4o9dQkiuW1DwKmOyw4VP1ry97NyyPN3U2mQYNGlR432jWrFk0bdo0CgoKNnqvady4cSxdurTC+9L69etj9erVFZa/G35u6jg1O+ywQ4Vl74aCyHoh1WXJkiXl8/zXXwNfffXVRuMWFBRUKCQ3vBaKiorK5/+vL2dXrFhRPv9/cx30m8vxDeXKNx9vwzro118D7dq12673ViPC+aWA7Vrz5s1j4MCBMXDgwPJhmUwmli5dutEK2qauf/zxx7FmzZqNVvJ69+4db7zxxkYbn3Xr1o2mTZtGs2bNolOnThttiH5zwWohx7aQyWRi3rx55St/s2fPjgULFlSY1xcvXlxernzT11f86tSpE02bNo3ly5dXWPErKSmJ0tLSTd6+oKBgo9dAq1atKqz42eiB2iUnJyd22WWX2GWXXeLQQw8tH15WVrbRMndTy+EFCxbEe++9F+vWrdtoGbz77rvHzJkzN1oGb/ggpXXr1tGzZ89Nfqiy4WeTJk0UwySqadOm0b9//+jfv3+F4cuWLfvO9c9FixbFG2+8EWvWrNnoQ5Du3bvHrFmzNiomNyyfmzVrFu3bt9/s+mezZs0iLy8vpSnD1lDAADVOTk5ONG3aNJo2bep0kdQ6CxcujDfffHOj4wktW7YsIv6759Vuu+0WrVu3jl133TX22muvb11B22GHHaJBgwZbvJFSVlYWK1as2OwK5Ybrzz//fIwePbq89GnZsuVGn0b36tUrGjVqlNi0Ara93NzcaNGiRa06WC9URuPGjaNx48bRoUOHtKNQAylgACBFmUwm3nzzzRg3blyMHTs2XnvttYiIqFu3bnTr1i169OgRhx12WHmx0b59+8T2vMrNza3UimVJSUm8//77FXbNfvrpp+OOO+6I0tLSyMvLiwMOOKD8jAtWVgGAbKaAAYBtrKSkJKZNm1Z+9pGPPvooGjZsGIceemicd9550bdv3+jYsWPk52/fi+k6depEt27dolu3bnH00UeXD1+7dm28++678eKLL8b48ePj0ksvjQsvvDB69uxZXsbsvffevsIHAGSV7XvNDgBqkU8//TRGjRoVDz74YCxbtix22WWX8kJi0KBBiZ5FZFsqKCiI3r17R+/evePMM8+M4uLieOqpp2LcuHFx1113xXXXXRetWrWK0047LS666KJo2rRp2pEBABLnoycASNgXX3wR5513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ZOTmWiwCAJCM/LQDwLZUr169OPbYY+PYY4+Nzz77LB566KGYNGlSXHvttXHZZZdFkyZN4qCDDorBgwfHwQcfHJ07d/ZJONRAX375ZTzzzDMxadKkmDRpUnz66aeRn58f++yzT5x//vlx5JFHxu677552TAAAsogChqy18847xwUXXBAXXHBBlJSUxCuvvFK+sXb++efH+vXrY5dddomDDz44Dj744Nh///2jbdu2ChnYDi1YsCBeffXV8tfwm2++GRERPXv2jB/84Adx8MEHxwEHHBANGzZMOSkAANlKAQMRUadOndh///1j//33j6uuuipWrFgR06ZNK9+Yu/feeyMiomHDhtG9e/fo2bNn9OjRo/xn69atFTOwDSxZsiRmzZoVs2bNirfeeqv8+ldffRURUV6aXnrppXHQQQdFq1atUk4MAAD/pYCBTWjYsGEcdthhcdhhh0VExPz58+Pf//53+Qbff/7zn3jwwQdj9erVERHRtGnTCoXMhp8tWrRI82lAjVVcXBxvv/12+WvurbfeirfeeivmzZsXERF5eXnRuXPn6NmzZ5x11lnRs2fP2H333aNTp07KUAAAtksKGNgCrVq1iu9///vx/e9/v3xYaWlpzJ07t8IG4gsvvBB33313lJSUREREy5YtNypmOnXqFC1atHCwT7JeJpOJZcuWxYcffrjRXi0fffRRRETk5OREhw4domfPnnHyySeXv5a6du0aBQUF6T4BAACoBAUMVFFeXl506tQpOnXqFEcccUT58JKSknj//fcrFDNPP/103HHHHeVnWcrPz4/WrVvHTjvt9K2XNm3aRJMmTXyaT41UXFwc8+bN+87Lhr3IIiLatm0bPXr0iGOOOaa8sOzWrVsUFRWl+EwAAKB6KGCgmtWpUye6desW3bp1i2OOOaZ8+Nq1a+Odd96JuXPnbrQROm3atJg3b14sWrSown0VFhZutqTZcHFgUbaVNWvWxBdffPGdxcry5csr3K5hw4bl82vbtm1jn332qfB79+7do1GjRik9KwAASJ4CBraRgoKC2H333Td76ts1a9bE/PnzyzdiP//88wobtTNnzvzWjdvWrVtHkyZNonHjxtGoUaNK/axfv749bbJAJpOJNWvWxPLly2PZsmWV+rl06dKYP39+LF68uMJ9frMk7N27d7Rp06bCsNatWysJAQDIegoY2I4UFhZG+/bto3379psdr7i4eJN7ISxbtqx8g/mzzz6rsAFdXFz8rfeXm5sbjRo1qlRxU1hYGHXr1i2/FBQUbPb3vLw8Jc93KCsri7Vr18a6desqXL45bMPva9eujRUrVlSqSNlwfKJNqVevXoX/8YbrO+64YzRu3DhatWq10d5XviYHAABbRgEDNVCDBg2ic+fO0blz5y2+TWlpaaxYsWKjDfLNbax/+eWXMWfOnArD165dW6XMOTk5G5UyW1LcbGpYnTp1IicnJ3JyciI3N7fCz2+7/s1hDRo0iOLi4shkMlFWVlbh57dd39Sw0tLSzZYkW1KkbLhsOEZQZeXl5UXjxo03Ksl23nnn6N69+xaVag0bNoy6detW6fEBAIDvpoCBLJGXlxdNmjSJJk2abNX9bNjrYu3atd9ZKFT2928OW7VqVSxZsmSjv5eUlJQXIVUtUPbaa6949dVXq1zgbLiel5dXXhB9syhq0KBBpcqmqhRUDRs2jHr16tkLBQAAtnMKGKBSCgoKnP4XAACgknLTDgAAAABQ2ylgAAAAABKmgAEAAABImAIGAAAAIGEKGAAAAICEKWAAAAAAEqaAAQAAAEiYAgYAAAAgYQoYAAAAgIQpYAAAAAASpoABAAAASJgCBgAAACBhChgAAACAhClgAAAAABKmgAEAAABImAIGAAAAIGEKGAAAAICEKWAAAAAAEqaAAQAAAEiYAgYAAAAgYQoYAAAAgIQpYAAAAAASpoABAAAASJgCBgAAACBhChgAAACAhClgAAAAABKmgAEAAABImAIGAAAAIGEKGAAAAICEKWAAAAAAEqaAAQAAAEiYAgYAAAAgYQoYAAAAgIQpYAAAAAASpoABAAAASJgCBgAAACBhChgAAACAhClgAAAAABKmgAEAAABImAIGAAAAIGEKGAAAAICEKWAAAAAAEqaAAQAAAEiYAgYAAAAgYQoYAAAAgIQpYAAAAAASpoABAAAASJgCBgAAACBhChgAAACAhClgAAAAABKmgAEAAABImAIGAAAAIGEKGAAAAICEKWAAAAAAEqaAAQAAAEiYAgYAAAAgYQoYAAAAgIQpYAAAAAASpoABAAAASJgCBgAAACBhChgAAACAhClgAAAAABKmgAEAAABImAIGAAAAIGEKGAAAAICEKWAAAAAAEqaAAQAAAEiYAgYAAAAgYQoYAAAAgIQpYAAAAAASpoABAAAASFh+2gFqqkaNGsWuu+6adgwAyDqNGzeOevXqpR0DAKBS7AFTRQ0aNIgZM2bEihUr0o4CAFll5syZkZeXl3YMAIBKUcBUUZ8+fSIi4t577005CQBkj+nTp8dbb70Ve+21V9pRAAAqRQFTRd27d4+f//zn8etf/zrmzp2bdhwAqPXWrl0bp5xySuy5557xk5/8JO04AACVooDZCqNGjYrmzZvHqaeeGqtXr047DgDUWplMJi6//PKYM2dO3HPPPZGf7zB2AEDNooDZCg0bNox77rknXnrppdhrr71i5syZaUcCgFrnq6++ihEjRsTNN98c1157bfTq1SvtSAAAlaaA2UqDBw+O1157LfLz82PvvfeOW2+9NcrKytKOBQC1wsSJE6N3794xffr0GD9+fPzqV79KOxIAQJUoYKpBjx49Yvr06XH22WfHhRdeGAMHDozx48crYgCgimbMmBHHH398HHroobHHHnvEzJkzY/jw4WnHAgCoMgVMNSksLIxbbrklnnrqqVi3bl2MGDEiunXrFnfccUesXLky7XgAsN0rLS2NRx99NA444IDYa6+94sUXX4w777wzHn/88WjVqlXa8QAAtooCppodcsgh8fLLL8cLL7wQvXv3jnPPPTd22WWXuPTSS2P27NmRyWTSjggA25Uvvvgi/vjHP0aXLl3iyCOPjLKysnjooYdizpw5ceaZZ0ZurtUVAKDmcwqBBOTk5MR+++0X++23X3z00Udx2223xZ133hk33HBDdO7cOUaMGBEjRoyI/fbbz1kcAMg6mUwmZs2aFePGjYtx48bF9OnTIy8vL4455pj4+9//Hn379k07IgBAtcvJ2CVjm1i9enU888wzMW7cuBg/fnzMnz8/mjVrFocddliMGDEihgwZEg0bNkw7JgAkoqSkJJ5//vny0uXDDz+M+vXrx7Bhw2LEiBFx2GGHRbNmzdKOyRa4+OKLY+zYsfHuu++mHQUAahS7X2wj9erVi+HDh8fw4cOjrKwsXn311fKV0P/3//5f5OXlxe677x777rtv7LfffrHvvvtG+/btIycnJ+3oAFBpCxcujJdeeilefPHFeOmll+LVV1+NVatWxU477RQjRoyIkSNHxqBBg6KwsDDtqAAA24Q9YLYDH374YTz99NPlK6pz5syJiIhWrVrFvvvuW17K9OnTx4oq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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from lambeq import Rewriter\n", "\n", "# Apply rewrite rule for prepositional phrases\n", "\n", "rewriter = Rewriter(['prepositional_phrase', 'determiner'])\n", "rewritten_diagram = rewriter(diagram)\n", "\n", "rewritten_diagram.draw(figsize=(11,5), fontsize=13)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We will now ask `lambeq` to normalise the diagram, by \"stretching\" the wires and re-arranging the boxes if required:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA5cAAAGjCAYAAAC44eF3AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/SrBM8AAAACXBIWXMAAA9hAAAPYQGoP6dpAAAvX0lEQVR4nO3deXxU9b34//cQghBlX1SUSEGloiigVq02QbTgQgGFqrHW61or1apfW7Wlj15wo1SvWrXVWm/BVo1WKyguuIGARa0CWrziFQSFPlzYlX0J8/vj/khF1AIfkkOS5/PxyEMZhsx75uScnNeZmTO5fD6fDwAAAEhQL+sBAAAAqPnEJQAAAMnEJQAAAMnEJQAAAMnEJQAAAMnEJQAAAMnEJQAAAMnEJQAAAMnEJQAAAMnEJQAAAMnEJQAAAMnEJQAAAMnEJQAAAMnEJQAAAMnEJQAAAMnEJQAAAMnEJQAAAMnEJQAAAMnEJQAAAMnEJQAAAMnEJQAAAMnEJQAAAMnEJQAAAMnEJQAAAMnEJQAAAMnEJQAAAMnEJQAAAMnEJQAAAMnEJQAAAMnEJQAAAMnEJQAAAMnEJQAAAMnEJQAAAMnEJQAAAMnEJQAAAMnEJQAAAMnEJQAAAMnEJQAAAMnEJQAAAMnEJQAAAMnqZz3A9jR37txYuHBh1mNsF61atYri4uKsx6hRatPyp26z/m8d6z5QG9j2b73atP2vLcu/1sTl3LlzY7/99ouVK1dmPcp2UVRUFDNmzKgVP2TVobYtf+o26/+Ws+4DtYVt/9apbdv/2rL8a01cLly4MFauXBn33ntv7LffflmPk2TGjBlxxhlnxMKFC2v8D1h1qU3Ln7rN+r91rPtAbWDbv/Vq0/a/Ni3/WhOXG+23337RvXv3rMcgI5Y/1E3WfYC6yfZ/x+KEPgAAACQTlwAAACQTlwAAACQTlwAAACQTlwAAACQTlwAAACQTlwAAACQTlwAAACQTlwAAACQTlwAAACQTlwAAACQTlwAAACQTlwAAACQTlwAAACQTlwAAACQTlwAAACQTlwAAACQTlwAAACQTlwAAACQTlwAAACQTlwAAACQTlwAAACQTlwAAACQTlwAAACQTlwAAACQTlwAAACQTl1vgvffei1wuF0OGDMl6FNghjBw5MnK5XLzwwgtfeRlATfLCCy9ELpeLkSNHZj0KUAPZhtShuNy4sG+88casRwEAAKh16mc9AADAjqCkpCRWrVoVhYWFWY8CUCPVmWcuAQC+Sr169aJhw4ZRUFCQ9ShADbJs2bKsR9hh1Om4XL9+fQwfPjw6d+4cDRs2jJYtW8ZJJ50U06dP/9J/8/jjj8ehhx4aDRs2jN133z1++tOfxvr16ze5To8ePaJ9+/bxwQcfRFlZWTRv3jyKioqid+/e8c4771T13aIOe//99yOXy8V//ud/bnJ57969I5fLxc0337zJ5Ycddljst99+ERHx9ttvx6BBg2L//fePxo0bR1FRURx88MFx9913J8103XXXRS6Xi4svvjg2bNgQERFPPPFElJaWRqtWraJRo0ZRXFwcJ598svUDyNTn3y/12T+PGDEi9t9//9hpp51ir732il//+tfZDgt8pY3ngnjuuediyJAhsddee8VOO+0UBx54YDzwwAObXPeZZ56JU089NTp06BCNGjWKZs2aRa9evWLChAmbfd+N+/mzZ8+OgQMHRosWLaJJkyZfOcs999wThYWFMXDgwFi9evV2vZ87mjodl9/73vfiqquuij333DNuuOGG+OEPfxjjx4+PI444IqZNm7bZ9Z988sk455xz4vjjj4+bb745DjrooLjxxhu/8BfMihUroqSkJAoKCuL666+Piy66KF544YXo169fVFRUVMfdow7aa6+9okOHDjFu3LjKy9auXRsvvvhi1KtXb5PLP/3005gyZUr07NkzIv5vJ2rixInRp0+fuOGGG+Kaa66JwsLCOP/882PYsGFbPUtFRUVceOGF8Ytf/CKGDRsWt912W9SrVy8mTJgQffv2jaVLl8bPfvazuP322+P888+PRYsWxaxZs9IfBIDt7M4774yrr746ysrK4r/+679i9913jyuvvDLuv//+rEcD/o0rr7wyHnjggRg0aFBcffXVsXbt2igrK9vkpDsjR46MxYsXx5lnnhm33XZbXHbZZTFjxow45phjYtKkSZt9z+XLl0dpaWnUr18/rrvuuq886ef1118fZ511VlxwwQXxl7/8JRo2bFgF93IHkq8lpkyZko+I/JQpU77w78ePH5+PiPwNN9yQz+fz+WeeeSYfEflTTjklv2HDhsrrvf766/mCgoL8UUcdVXnZnDlz8hGRLyoqys+ZM6fy8g0bNuT333///G677bbJbZWWluYjIj98+PBNLv/1r3+dj4j82LFjk+4Lm/OY/ct5552XLywszK9YsSKfz+fzEyZMyEdE/owzzsg3btw4v27dunw+n88/9thj+YjIP/zww/l8Pp9fvnz5Zt+roqIiX1pamm/SpEl+7dq1lZePGDEiHxH58ePHf+FlK1euzPfv3z9fWFiYv+eeezb5npdddlk+IvIff/zx9r7rtYKf5a3j8WJ72rivMGLEiE3+vPvuu+eXLl1aeb0VK1bkW7VqlT/88MMzmpTaxrZs6/27x2zjfklxcfEm6+/SpUvzxcXF+ebNm+dXrlyZz+e/eB/oo48+yrds2TJ//PHHb3L5xv38wYMHb/ZvPrsNqaioyA8aNCgfEfnrrrsu6b7UJHX2mctRo0ZFRMTgwYMjl8tVXn7QQQfFd77znXjxxRdjwYIFm/yb/v37R/v27Sv/nMvl4uijj46PPvooli9fvsl169WrFz/+8Y83uWzjM0QzZ87cnncFNtGzZ89Yt25d5ZG2cePGRZs2beKSSy6JZcuWxauvvhoREePHj6/8GY6I2HnnnSu/x+rVq2PRokWxePHi6NWrV3z66afx9ttvb9HtL168OL797W/Hc889F2PGjIkzzzxzk79v2rRpRET89a9/3ewl5QA7orPPPrty2xURUVRUFIcffrjf51ADXHjhhZusv02bNo0f/vCHsWTJksqPT/vsPtDy5ctj0aJFUVBQEIcddli88sorX/h9f/KTn3zpba5evToGDhwYd911V4wcOTJ+/vOfb587UwPU2bicM2dO1KtXr/L9Zp+1//77V17nszp06LDZdVu2bBkREYsWLdrk8rZt2272tPeXXRe2p40HMTa+BHbcuHFx9NFHR/fu3aN58+abXH7QQQdFixYtIuL/NqY/+clPori4OBo1ahStWrWK1q1bx+DBgyMiYsmSJVt0+2eddVZMnjw5nnrqqejdu/dmf3/RRRdFt27dYtCgQdGiRYs44YQT4tZbb93sYA7AjuLLfv/7fQ47vi/a1+/cuXNERMyePTsiIt5999047bTTonnz5tG4cePKfaAnn3zyC/d/WrduHc2aNfvS27ziiiti1KhRcc8998R//Md/bJ87UkPU2bjcFl919rh8Pr/N14Xtadddd43OnTvHuHHjYuXKlfHKK69Ez549o169elFaWhrPP/98LFq0KP7xj39UhmhExOmnnx433XRTnHDCCXHffffF2LFj49lnn43LLrssIqLyZDz/zqmnnhr16tWLa665JlatWrXZ37ds2TJeffXVGD9+fFx88cWxbNmyuOyyy2LfffeNl156afs8CADbkbPHQu21fPnyKCkpibFjx8Yll1wSDz/8cDz99NPx7LPPRs+ePb9wv72oqOgrv2f//v2jqKgobrjhhjp3EKrOxmWHDh1iw4YNMWPGjM3+7q233oqIiK997WvVPRZsFz179oypU6fGmDFjYu3atXHMMcdERMQxxxxT+axiPp+vjMulS5fG448/Ht///vfjzjvvjNNPPz169+4dxx57bDRo0GCrbvt73/te3HvvvTFu3Ljo06dPrFy5crPrFBQURI8ePeK6666LSZMmxbRp02L58uVx7bXXpt95AID/31ft63fo0CGef/75+OCDD+Lmm2+OIUOGxIABA6JXr15x7LHHxooVK7bpNnv27BlPPPFEzJw5M44++uiYP39+0n2oSepsXPbv3z8iIoYNG7bJEYk333wzHnvssTjqqKOidevWGU0HaXr27BkbNmyIoUOHRnFxcXTs2LHy8jVr1sSwYcOifv36UVJSEhH/Oir/+aNzH3744TZ9FMlpp50W5eXlMWnSpDj++OM3eU/ywoULN7v+17/+9WjUqFEsXrx4q28LAODL3HHHHfHJJ59U/vmTTz6JO++8M5o1axalpaVfug/0zDPPfOn7LbdEjx49YuzYsfHee+9VnqOlLqif9QBZ+fa3vx2nnHJKPPDAA7FkyZLo06dPfPTRR/Hb3/42GjZsGLfeemvWI8I269GjR9SrVy9mzJgRZ511VuXlnTt3jt122y3eeuutOPzww6Nx48YREdG4cePo1atX3HvvvdGoUaM49NBD4/3334/f//738bWvfW2bXtIxcODAKCwsjFNOOSV69+4dTz31VDRp0iTOP//8+Oc//xm9evWKvfbaK1atWhUPPvhgLFu2bLOT/wAApGjVqlUcdthhcfbZZ0dExIgRI2Lu3Llx9913R1FRURx11FGx2267xeWXXx7vvfde7LnnnvH666/Hn//85+jSpUtMnz59m2/7qKOOimeeeSaOO+646NGjR4wbNy7atm27ve7aDqnOPHO58WjEZ983cd9998WvfvWreP/99+Pyyy+P3/3ud1FaWhovvfRSdOvWLatRIVnz5s2ja9euERGbvK/y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82c/+1m0bds26xGpQpZ/3Wb5A/xLLl8X32m6jV5++eU44ogjYvr06XHAAQdkPQ7VbOTIkXH22WfH+vXrv/SN29ReV155ZTzyyCN18rTiRPTt2zciIh577LGMJyEL++yzT5x88skxfPjwrEehmlVUVET9+vVjxIgRcdZZZ2U9DtXszTffjC5dusRLL70Uhx9+eNbj1AjecwkAAEAycQkAAEAycQkAAEAycQkAAEAycQkAAEAycQkAAEAycQkAAEAycQkAAEAycQkAAEAycQkAAEAycQkAAEAycQkAAEAycQkAAEAycQkAAEAycQkAAEAycQkAAEAycQkAAEAycQkAAEAycQkAAEAycQkAAEAycQkAAEAycQkAAEAycQkAAEAycQkAAEAycQkAAEAycQkAAEAycQkAAEAycQkAAEAycQkAAEAycQkAAEAycQkAAEAycQkAAEAycQkAAEAycQkAAEAycQkAAEAycQkAAEAycQkAAEAycQkAAEAycQkAAEAycQkAAEAycQkAAEAycQkAAEAycQkAAECy+lkPUJMUFBRESUlJ5PP5rEchA4WFhVFaWpr1GGSkZcuW0aVLl6zHICN77rln1K/vVybURaWlpVFYWJj1GGQgn89HSUlJFBQUZD1KjeGZy61Qv379mDhxYqxduzbrUcjAsmXL4sUXX7SBqaOWLVsWU6ZMyXoMMjJr1qz48MMPsx4DqGYFBQUxadKkWL58edajkIE1a9bExIkTHVzYCuJyKzRs2DAiIlatWpXxJGRh9erVsdNOO2U9Bhlp2LChdb8OW7NmjfUf6ijb/7pr9erVERG2/1tBXG6FNm3aRETExx9/nPEkZOGjjz6KXXfdNesxyEibNm1i0aJFsW7duqxHIQPWf6i72rRpY9+vjvroo48iImz/t4K43AotWrSIRo0axbx587IehQzMnTs32rVrl/UYZKRdu3axYcOG+OCDD7IehWqWz+dj7ty5UVxcnPUoQAbatWsXc+fOzXoMMjBv3rwoKiqK5s2bZz1KjSEut0Iul7OBqcPmzZsnLuuwjcvewaW6Z9GiRbF69WrrP9RR7dq1s+2vozY+sZDL5bIepcYQl1upuLjYBqaO8sxF3bYxLBxcqns2LnPrP9RNxcXFtv111Lx582z7t5K43EqdOnWKN954I+sxqGaLFy+OefPmRadOnbIehYw0adIk2rZta/2vg954443I5XKx9957Zz0KkIFOnTrF3LlzY8mSJVmPQjV744037PttJXG5lUpLS2PmzJlOSV/HTJo0KfL5vM+5rONKSkpiwoQJWY9BNZswYUJ07do1mjVrlvUoQAZKS0sjn8/HpEmTsh6FavTBBx/ErFmz7PttJXG5lUpKSiIi7GDWMRMmTIji4uJo37591qOQodLS0njttdd83lkdM2HCBDsXUIe1b98+2rVrZ9+vjtm4vDfu+7NlxOVW2nXXXePrX/96vPDCC1mPQjWyc0lERI8ePaKioiL+9re/ZT0K1WTu3Lnx3nvvWf+hDsvlclFaWmrfr46ZMGFC7LfffpUfRciWEZfboHfv3jF69Gifd1dHzJo1K6ZOnRq9evXKehQy1qlTpyguLo6HH34461GoJg899FA0aNBAXEId17t375g6dWq8++67WY9CNVi7dm2MGjXKvt82EJfb4Nxzz42PP/44xowZk/UoVIO77747mjVrFgMGDMh6FDKWy+Xi3HPPjfLy8vj000+zHocqls/n46677ooBAwb4jDOo404++eRo2rRp3H333VmPQjUYM2ZMzJ8/P84777ysR6lxxOU26NKlSxxxxBFx1113ZT0KVWzt2rUxYsSIOPPMM6NRo0ZZj8MO4JxzzolVq1ZFeXl51qNQxSZOnBjvvPNOXHDBBVmPAmSsqKgozjzzzBgxYoRXrtUBd911V3zzm9+MAw44IOtRahxxuY1+8IMfxDPPPBMzZ87MehSq0KhRo2L+/Plx/vnnZz0KO4g999wzTjzxxLjzzjsjn89nPQ5V6I477oh9993XyRyAiIg4//zz4+OPP45Ro0ZlPQpVaObMmfHMM8/ED37wg6xHqZHE5TY65ZRTom3btnHVVVdlPQpVZM2aNTF48ODo3bu3I1ds4vLLL4/XX3897r///qxHoYq8+uqr8eCDD8bll18euVwu63GAHUCXLl2iV69eMXjw4FizZk3W41BFrrzyythzzz3jlFNOyXqUGklcbqOioqIYPnx4PPLII84eVkvdeuut8d5778VNN92U9SjsYEpLS+Pkk0+OK6+8MlasWJH1OGxn+Xw+LrnkkjjwwAPj3HPPzXocYAdy0003xZw5c+K2227LehSqwPjx42PUqFExfPhwb4faRuIywemnnx5HHHFEXHLJJVFRUZH1OGxHH3/8cVxzzTUxaNCg6Ny5c9bjsAO64YYbYuHChTF8+PCsR2E7Ky8vj5deeiluueWWKCgoyHocYAey//77x4UXXhhXX311fPzxx1mPw3ZUUVERl156aXzzm9+MsrKyrMepscRlglwuF7/5zW9i+vTpcfXVV2c9DtvJhg0b4pxzzokGDRrEkCFDsh6HHVSHDh3iJz/5SfzqV7+KV155Jetx2E7mzp0bl1xySQwYMCCOPvrorMcBdkBDhw6NBg0axDnnnBMbNmzIehy2k6FDh8abb74Zt9xyi7dDJBCXiQ499NC49tpr4+qrr47HH38863HYDq6++up46qmn4r777osWLVpkPQ47sF/+8pdxyCGHxIABA2L+/PlZj0Oi1atXx8CBA2PnnXeO3//+91mPA+ygWrRoEffee2889dRTcc0112Q9DtvBmDFj4pprrolrr702Dj300KzHqdHE5XZw1VVXRd++feOMM86IWbNmZT0OCZ544okYOnRoXH311dG7d++sx2EH16BBg3jooYdi3bp1ceqpp8b69euzHokEP/7xj+Mf//hH/PWvf42WLVtmPQ6wAzvuuONi6NChMXTo0HjyySezHocEs2bNiu9///vRr1+/uPLKK7Mep8YTl9tBvXr14k9/+lO0bt06TjjhhJg3b17WI7ENJk+eHKeffnp85zvfiZ///OdZj0MNsccee8Rf/vKXmDRpUpxzzjkCswbK5/NxzTXXxB/+8If43e9+FwcffHDWIwE1wODBg+PEE0+MsrKymDx5ctbjsA3mzZsXxx9/fLRp0ybuueeeqFdPGqXyCG4nTZs2jbFjx8aaNWuipKQk5syZk/VIbIXx48dHr169omvXrnHffffZuLBVSktL49577437778/Tj/9dB+wXYPk8/kYPHhw/PKXv4xrrrkmzjnnnKxHAmqIevXqxf333x9du3aNXr16+fSAGmbOnDlRUlIS69ati7Fjx0bTpk2zHqlWsAe9HXXs2DEmTZoUBQUFUVJSEu+8807WI7EFxo4dGyeccEJ885vfjKeeeioaN26c9UjUQKeddlo89NBDMXr06Bg4cKDPQKsB8vl8XH755TFs2LC48cYb4xe/+EXWIwE1TOPGjeOpp56KI444Io4//vh4+umnsx6JLfDOO+/Et771rahfv35MnDgxOnTokPVItYa43M6Ki4tj4sSJscsuu8Rhhx0Wo0ePznokvsSGDRviV7/6VfTp0yeOPfbYeOyxx6KoqCjrsajBTjrppBg9enQ8/fTTceSRR8bs2bOzHokvsWjRoujbt2/cfPPNcfvtt8fll1+e9UhADVVUVBRjxoyJY445Jk488cQYPny4s8juwEaPHh2HHXZYNG7cOCZMmBDFxcVZj1SriMsq0LZt25g8eXL06NEjTjrppLj00ktj7dq1WY/FZyxYsCBOPPHE+NnPfhZXXHFFPPLII9GwYcOsx6IWOOGEE+LFF1+MJUuWRLdu3eLhhx/OeiQ+Z/LkydGtW7eYPHlyjBkzJn70ox9lPRJQwzVs2DBGjRoVP/3pT+Oqq66KPn36xIIFC7Iei89Ys2ZNXHLJJXHSSSfF0UcfHZMnT462bdtmPVatIy6rSPPmzeORRx6JW2+9Ne6444448sgjY8qUKVmPVefl8/l49NFHo2vXrvHaa6/F2LFj4/rrr4/CwsKsR6MWOeSQQ2Lq1KnRu3fv+O53vxsXXHBBLFy4MOux6rwVK1bE0KFDo6SkJIqLi+P111+PPn36ZD0WUEsUFhbGsGHD4qmnnopXX301unbtGo899ljk8/msR6vzpkyZEkceeWTceeedcdttt8Vf//rXaN68edZj1Urisgrlcrm4+OKLY/LkybFy5co45JBD4vTTT3eyn4y8/PLLUVJSEv37948DDjgg3njjDR83QpVp2rRpPPjgg3HHHXfEAw88EB07dozrr78+Vq5cmfVodc769evj7rvvjn322Seuu+66uOqqq2L8+PHRrl27rEcDaqHjjjsuXn/99TjggAOiX79+UVJSEi+//HLWY9VJs2fPjrKysjjkkENi1apVMXny5Ljooosil8tlPVqtJS6rwcEHHxxvvPFG3H333TFhwoTo1KlTXHrppZ7JqCbvvPNODBgwII444ohYtmxZjB07NsaOHeulEFS5XC4XP/zhD+Pdd9+Ns88+O4YMGRL77LNP/Pd//7ePLKkG+Xw+HnvssTjwwAPj/PPPjx49esTbb78d1157rVcrAFVqjz32qNzf+PTTT+OII46IgQMHOtljNVm4cGFceuml8fWvfz0mTpwYd999d7zxxhs+aqoaiMtqUr9+/Tj33HNj5syZMWTIkPjjH/8YHTt2jGHDhsXSpUuzHq9WmjdvXgwaNCg6d+4cr732WvzpT3+qfKmiI1ZUp1atWsUtt9wSb7/9dpSUlMR5550XBx10UIwePVpkVoF8Ph+TJk2K0tLS6NevX+y+++7x2muvxf333++MgEC1yeVy0bt375g6dWrcc8898fe//z06d+4cgwYN8pnoVWTp0qUxbNiw6NixY4wYMSKGDBkSM2fOjHPPPTfq16+f9Xh1Qi7vheCZWLBgQVx77bVxxx13RC6XixNOOCHKysqiT58+zliaYOHChfHwww9HeXl5TJo0KZo2bRqDBw+Oiy66yAl72GG89tprccUVV8T48eNj1113jVNOOSXKysri8MMPd+AjwZtvvhnl5eXxwAMPxOzZs+PAAw+M4cOHO6BEsn322SdOPvnkGD58eNajUIOtXr06br/99rjuuuvik08+iW9961tRVlYWAwcOjFatWmU9Xo21cuXKePzxx6O8vDyefPLJyOfzMWjQoPjFL37hcc2AuMzYBx98EA8++GCUl5fHq6++Grvsskv069cvysrKolevXl66tQWWLVsWo0ePjvLy8nj22Wcjn8/HscceG2VlZXHSSSdFkyZNsh4RNpPP5+O1116L8vLyePDBB+ODDz6I9u3bx2mnnRZlZWXRpUsXQbQFZs+eHQ888ECUl5fHm2++Gc2aNYsBAwZEWVlZ9OjRIwoKCrIekVpAXLI9ffrppzFq1KgoLy+P5557LnK5XHz729+OsrKy6N+/v8/b3gJr166NZ599NsrLy+PRRx+N5cuXx6GHHhplZWVx6qmneutThsTlDmTWrFmVO0lvvfVWtGjRIgYOHBhlZWVRUlIS9ep5FfNGq1evjieffDLKy8vj8ccfj9WrV8dRRx0VZWVl8d3vfjdat26d9YiwxSoqKmLSpElRXl4eDz/8cCxevDg6d+4cZWVlcdppp8Xee++d9Yg7lA8//DD+8pe/RHl5ebzyyitRVFQUffv2jbKysujdu3fstNNOWY9ILSMuqSrz58+vfMXViy++GA0bNow+ffpEWVlZnHDCCV519Rl+V9YM4nIHlM/nY/r06VFeXh7l5eXx/vvvR9u2baOkpCS6d+8e3bp1i27dukXLli2zHrVa5PP5+Oc//xnTpk2LadOmxdSpU+OFF16ITz/9NLp161Z5lMqH4FIbfPZo7OjRo2PFihXRrVu3OOywwyrX/wMOOKDO7HCsX78+3n777Zg6dWpMmzYtXn311XjppZeioKAgjj/++DjttNOib9++sfPOO2c9KrWYuKQ6zJ07t/LVbNOmTYsmTZpEjx49Krf93bt3jz322KPOvKpl0aJFm+z7TZw40at8agBxuYPL5/Px8ssvx0MPPRR///vf4/XXX48VK1ZERERxcXHlxmbjf9u2bVujV7INGzbEu+++W7kjufG/G8+s26pVq+jWrVsceeSRcdppp0WnTp0ynhiqzsqVK+OJJ56IMWPGxNSpU2PGjBmxYcOGqF+/fnTu3HmT9b9r1641/qVUq1evjunTp2+y/k+fPj1Wr14dERF77713dOvWLXr16hUDBgzwGWVUG3FJdfvf//3feOCBB+Jvf/vbF+4HfXbfr2PHjjX61W35fD4++OCDzfb95s6dGxERO++8c3Tt2jW+8Y1vxHe/+13nJ9jBicsapqKiImbNmrXJyjd16tRYvHhxRES0bt06unfvHl27do3i4uJo3br1Jl8tW7bM9D1Ia9eujYULF8aCBQtiwYIFMX/+/FiwYEHMnj07pk6dGm+88UYsW7YsIiLatWu32Qa0Lh2xg89btWrVF8bXmjVrIuL/doC7desWXbp0id122y1at24dbdq0qVz/mzRpktn6k8/nY8WKFZXr/savjz/+ON56662YNm1avPXWW1FRUREFBQWx3377bbLuH3TQQdG0adNMZgdxSZa+6BVc06ZNqzzjbOPGjeOggw6K7t27R4cOHTbb9rdq1SoaNGiQ2fwVFRWxaNGizbb/c+fOrbxPCxYsiIiIli1bVr5Cb+PvgH322adGx3NdIy5rgXw+H/Pmzavc2EybNi1ef/31+PDDDzf7mINcLhctW7bcLDo3boRatWoVjRo1isLCwigsLIz69etX/v/GP69bt26Tr/Xr11f+/4oVKyqD8fNf8+fPj08++WSz+Rs2bBjt2rXbZEeyW7duzvAFW2DdunUxY8aMTXY43nrrrVi0aNFm123QoEG0atVqk52Oz24DWrRoscn6/vntQD6fj4qKis3W+41fS5cu3ezA0We/Vq1atdlMTZs2jX333XeTl/x36dIlGjVqVB0PH2wRccmOaOHChZs92TBv3rzKV3t8VtOmTb9w279x+7/zzjt/6b5fYWHhZtv8z/551apVlU8cfNG2f9GiRfH53Khfv37svvvu0bVr1032/dq1a+dJhBpOXNZi+Xx+k529L4q9z1+2du3ar/yeRx55ZPztb3/7yusUFRVtdtTsy2K2devWsfPOO9uQwHa2fv36yiPFX3bA57N/90W//D+vefPmsWTJkn97nS9b1z//1apVKyffoUYQl9QUn32VyJZs+xcsWBArV678yu+5Jft+DRo0+Mp9vc9/NWvWzL5fLeXTRGuxXC4XzZs3j+bNm8e+++77b6+fz+dj+fLlsXr16i88MrVu3brI5/NRr169L3xWo7CwMIqKinxOJ+wA6tevH7vuumvsuuuuW3T9ioqK+PTTT2Pt2rVfeoR64/f9slc1NGnSxMcnAWQol8vFLrvsErvsskt87Wtf26J/s3Llyli5cuWX7vtt2LAhcrncl+77NWzYMHbZZRexSESISz4jl8tF48aNa/xJQYCtV1BQ4AQ5AHWQJwbYnrw7FgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgAAgGTiEgDgKxx33HHRpUuXrMcA2OHl8vl8PushAAAAqNk8cwkAAEAycQkAAEAycQkAAEAycQkAAEAycQkAAEAycQkAAEAycQkAAEAycQkAAEAycQkAAEAycQkAAEAycQkAAEAycQkAAEAycQkAAEAycQkAAEAycQkAAEAycQkAAEAycQkAAEAycQkAAEAycQkAAEAycQkAAEAycQkAAEAycQkAAEAycQkAAEAycQkAAEAycQkAAEAycQkAAEAycQkAAEAycQkAAEAycQkAAEAycQkAAEAycQkAAEAycQkAAEAycQkAAEAycQkAAEAycQkAAEAycQkAAEAycQkAAEAycQkAAEAycQkAAEAycQkAAEAycQkAAEAycQkAAECy/w/J2NoN8xs9rQAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "normalised_diagram = rewritten_diagram.normal_form()\n", "normalised_diagram.draw(figsize=(9,4), fontsize=13)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In the simplified diagram, the order of the preposition tensor is reduced by 2, which at least for a classical experiment, is a substantial improvement. Note also that the determiner is now eliminated, equating the meaning of the noun phrase \"the park\" with that of the noun \"park\"." ] }, { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "Another very useful rewrite rule is the :py:class:`~.CurryRewriteRule`, which allows us to convert adjoint output wires into input wires using map-state duality. For example:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "image/png": "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91doaKg2b96srVu3Ki4ujhNkVIBatWpp3LhxOnTokJYuXaqDBw/q5ptvlt1utzoaLGIYhl555RV169ZN586d00cffaQ9e/YoMTGRE2RUAE9PTyUmJurrr7/WRx99pMLCQnXr1k2vvPIKX4dVg9ntdnXs2FEHDx7U0qVLlZ6errFjx5b6onhcHTc3N8XHx+vTTz/V5s2bFRoaqgEDBmjKlClyOBxWxwMsUS2XoB944AEtXLhQf/zjH/Xhhx9aHQdVUFZWlvr376/p06dr+vTpWrt2rbp37251rGrJ09NTw4YN086dO9WnTx8NHjxYTzzxhPO7/VAz5Ofna+TIkUpKStJ9992nTz/9VAMHDqxRJwu5Vtzc3DRw4EB99tlnGjNmjJKSkjRq1Cjl5+dbHQ3XUHFxsR5//HENHjxYMTEx2rlzp4YNG8aKnErSvXt3rV27VtOmTdO0adM0YMAAZWVlWR0LuOaqZbm88IW5//vf/9S4cWOr46CK2bZtmzp06KBdu3Y5z3TKlsrK5+/vr/fff18zZszQzJkz1bdvX+d3iqF6S09PV+fOnbV8+XItXbpUc+fOlbe3t9Wxqj1vb2+9/PLLWrJkid5991117txZ6enpVsfCNfDjjz/qtttu06xZszRz5kwtX77c+dULqDxubm568sknlZycrJ07d6pDhw764osvrI4FSaNGjZJhGOrdu7fVUao9lqhRo7zxxhvq0aOHGjdurJ07d+rWW2+1OlKNYrPZNGHCBKWkpOibb75Rhw4d9NVXX1kdC5Xok08+0c0336yioiJt27ZNw4YNszpSjTN8+HBt27ZNhYWFuvnmm7V27VqrI6ES7d69W+3bt1daWppSUlL02GOPsYfANXbbbbdp586datSokbp376433njD6kjANUO5RI2xa9cujRkzRgkJCUpNTeU74SzUq1cv7dq1S/Xr19eQIUOUl5dndSRUgmPHjunuu+9W586dtX37dt10001WR6qxoqKitGPHDt1yyy26++67dezYMasjoRKcOXNGd955pxo0aKBdu3apV69eVkeqsZo2bapNmzZp6NChGjNmjHbt2mV1JOCaoFyiRjh79qyGDh2qm266Sa+88gpnga0CGjZsqHfffVcnTpzQuHHjrI6DCuZwODRixAj5+fnprbfeUt26da2OVOPVrVtXy5Ytk4+PjxITEznhSDU0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7dpldaQaLT8/X6NGjdKiRYs0d+5cXX/99VZHcimUy6swevRovfHGG3r33XfVpUsXpaenWx2pRnr99dfVtWtXBQUF6bPPPlP9+vWtjgQAAFBuISEh+vTTTxUYGKguXbpowYIFVkeqkdLT09W5c2e9++67WrJkiUaNGmV1JJdDubxKI0aM0LZt21RQUKCbb76Z7ym6hgoKCnTvvfdqzJgxGjlypLZs2aLmzZtbHQsAAOCqXXfdddq6dasSExOdyzmFhYVWx6oxVqxYoZtvvlmFhYXatm2bhg8fbnUkl0S5NCEqKkrbt29XTEyMBg8erEmTJqmoqMjqWNVaenq6unXrprfeeksLFy7UK6+8Ih8fH6tjAQAAmObj46NXX31VCxYs0JtvvqmuXbuyh1wlKyoq0qRJk3THHXfo1ltv1Y4dOzg5pAmUS5P8/f21fPlyzZo1S//85z913XXXacaMGTp9+rTV0aqVr776SsOGDVPr1q31888/67PPPmNXBQAAUC2NHj1an332mU6fPq3WrVtr2LBh+uqrr6yOVa2cPn1aL7zwgpo3b65//vOfmjVrlt577z3VrVvX6mgujXJZAWw2mx599FHt27dPAwYM0N///nc1a9ZMkyZN4qxfJhiGoQ0bNqhfv35q166dtm7dqtmzZ+urr75Su3btrI6Ha2DRokWy2WzauHHj714HABs3bpTNZtOiRYusjgJUiHbt2unrr7/W7NmztXXrVrVr1079+/fXxo0b+cYCE06cOKFJkyapWbNmeuqppzRo0CDt27dPjz76KCeGrACUywoUERGh//73v8rIyFBSUpLmz5+v5s2b67777tOBAwesjucyHA6Hli9frltuuUXR0dE6ceKE3nzzTaWnp2vs2LGqVauW1REBAAAqXa1atTR27Filp6dr6dKlOn78uPr06aNbbrlFy5cvl8PhsDqiyzhw4IDGjBmj5s2ba/78+UpKSlJGRoZee+01RUREWB2v2qBcVoJGjRrphRdeUGZmpp555hl99NFHioyMVNu2bTVx4kSlpKRwbOZvnDhxQosXL1ZCQoIaNGigIUOGqHbt2lq9erV2796thIQEeXp6Wh0TAFBF9ezZUwUFBRoxYoTVUYAK5+npqWHDhmn37t1avXq1atWqpSFDhig0NFQJCQlavHgxe8v9RlFRkVJSUjRx4kS1adNGkZGRWrVq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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "curry_functor = Rewriter(['curry'])\n", "curried_diagram = curry_functor(normalised_diagram)\n", "curried_diagram.draw(figsize=(9,4), fontsize=13)" ] }, { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "After normalisation the resulting diagram no longer contains any cups, which eliminates :term:`post\\-selection` and allows for faster execution." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "image/png": "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XM4999yqRwT2gTgABqxer+eaa67JypUrs2LFivT29vbHws0335xjjjmm6hGBfSAOgAE77LDDsnDhwqrHAAaJew4AgII4AAAK4gAAKIgDAKAgDgCAgjgAAAriAAAoiAMAoCAOAICCOAAACuIAACiIAwCgIA4AgII4AAAK4gAAKIgDAKAgDgCAgjgAAAriAAAoiAMAoCAOAICCOAAACuIAACiIAwCgIA4AgII4AAAK4gAAKIgDAKAgDgCAgjgAAAriAAAoiAMAoCAOAICCOAAACuIAACiIAwCgIA4AgII4AAAK4gAAKIgDAKAgDgCAgjgAAAriAAAoiAMAoCAOAICCOAAACuIAACiIAwCgIA4AgII4AAAKw6seADgwvO9976t6BOAAUWs0Go2qhwAADhxeVgAACuIAACiIAwCgIA4AgII4AAAK4gAAKIgDAKAgDgCAgjgAAAriAAAoiAMAoCAOAICCOAAACuIAACiIAwCgIA4AgII4AAAK4gAAKIgDAKAgDgCAgjgAAAriAAAoiAMAoCAOAICCOAAACuIAACiIAwCgIA4AgII4AAAK4gAAKIgDAKAgDgCAgjgAAAriAAAoiAMAoCAOAICCOAAACuIAACiIAwCgIA4AgII4AAAK4gAAKPw/1tuturFMs2AAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "curried_diagram.normal_form().draw(figsize=(5,4), fontsize=13)" ] }, { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "These examples clearly demonstrate the flexibility of :term:`string diagrams ` compared to simple :term:`tensor networks `, which was one of the main reasons for choosing them as ``lambeq``'s representation format. ``lambeq`` comes with a number of standard :term:`rewrite rules ` covering auxiliary verbs, connectors, coordinators, adverbs, determiners, relative pronouns, and prepositional phrases." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "| Rewrite rule | Description |\n", "| -------------------------------------------- | ------------------------------------------------------------------------------ |\n", "| `auxiliary` | Removes auxiliary verbs (such as \"do\") by replacing them with caps. |\n", "| `connector` | Removes sentence connectors (such as \"that\") by replacing them with caps. |\n", "| `coordination` | Simplifies \"and\" by replacing it with a layer of interleaving spiders. |\n", "| `curry` | Uses map-state duality to reduce the number of cups in the diagram. |\n", "| `determiner` | Removes determiners (such as \"the\") by replacing them with caps. |\n", "| `object_rel_pronoun` , `subject_rel_pronoun` | Simplifies relative pronouns (such as \"that\") using cups, spiders and a loop. |\n", "| `postadverb` , `preadverb` | Simplifies adverbs by passing through the noun wire transparently using a cap. |\n", "| `prepositional_phrase` | Simplifies prepositions by passing through the noun wire using a cap. |" ] }, { "cell_type": "markdown", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "## Diagram-level rewriters" ] }, { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "While box-level rewriters and rewrite rules access one box at a time, for certain cases of more general transformations you will require knowledge of the broader context in the diagram. For example, imagine the following derivation:" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from lambeq.backend.grammar import Diagram, Word, Ty, Cup\n", "from lambeq import AtomicType\n", "\n", "n = AtomicType.NOUN\n", "s = AtomicType.SENTENCE\n", "\n", "words = [Word('do', n.r @ s @ n.l), Word('your', n @ n.l), \n", " Word('homework', n), Word('now', s.r @ s)]\n", "morphisms = [(Cup, 2, 3), (Cup, 4, 5), (Cup, 1, 6)]\n", "diagram = Diagram.create_pregroup_diagram(words, morphisms)\n", "diagram.draw(figsize=(5,2))" ] }, { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "Note that this diagram has two free wires, coming from different boxes. In cases like these, if your loss function expects a single wire, you are going to get a dimension mismatch error. The probem can be addressed by merging the two free wires into one, so you are able to train your model in a consistent way. In ``lambeq``, this can be done with the :py:class:`~.UnifyCodomainRewriter`, which acts at the diagram level. Specifically, the rewriter looks at the codomain of the diagram (in the above case :math:`n^r \\cdot s`), and if this consists of more than one wires, it merges these wires with an extra box." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAgcAAAGjCAYAAAC4xLZeAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/SrBM8AAAACXBIWXMAAA9hAAAPYQGoP6dpAAAt/klEQVR4nO3de1hU9aLG8XeQi1wkFURRQPGGqGjiFW+5lfK2M027m5GXysrLOW6z27M1n93NtlvNzmnvLC12e5dmerIM805iHihQU0NNQ83SDMVUSLnMOn90mqdfooICa2C+n+eZx2FmzZr3t9a41jtrFoPDsixLAAAA/8/L7gAAAMC9UA4AAICBcgAAAAyUAwAAYKAcAAAAA+UAAAAYKAcAAMBAOQAAAAbKAQAAMFAOAACAgXIAAAAMlAMAAGCgHAAAAAPlAAAAGCgHAADAQDkAAAAGygEAADBQDgAAgIFyAAAADJQDAABgoBwAAAAD5QAAABgoBwAAwEA5AAAABsoBAAAwUA4AAICBcgAAAAyUAwAAYKAcAAAAA+UAAAAYKAcAAMBAOQAAAAbKAQAAMFAOAACAgXIAAAAMlAMAAGCgHAAAAAPlAAAAGCgHAADAQDkAAAAGb7sDSNKRI0eUm5trdwzUAKGhoYqKirI7hoHXd+XwxHXtiWP2VHava9vLwZEjRxQbG6uCggK7o6AGCAgIUHZ2tttsQHl9Vx5PXNeeOGZPZfe6tr0c5ObmqqCgQG+//bZiY2PtjoNqLDs7W6NHj1Zubq7bbDx5fVcOT1zXnjhmT+UO69r2cvCr2NhYxcfH2x0DqBS8vj2HJ65rTxxzTccJiQAAwEA5AAAABsoBAAAwUA4AAICBcgAAAAyUAwAAYKAcAAAAA+UAAAAYKAcAAMBAOQAAAAbKAQAAMFAO3Fy/fv00depUu2MANYan/59q1qyZ5s+fb3cMuDnKAQAAMFAOAFwzy7JUXFxsdwxcRmFhod0RUI1QDtxIfn6+xowZo6CgIIWHh2vu3LnG/Xl5eRozZozq1aungIAADR48WF9//bVNaeGukpOTFRISogsXLhi3Dx8+XPfee68k6dVXX1WLFi3k6+urmJgY/fOf/3RNd+jQITkcDu3YscN12+nTp+VwOLR582ZJ0ubNm+VwOJSSkqLOnTvLz89PaWlplT62iuJ0OvXYY4+pfv36atSokWbNmuW678iRI7rlllsUFBSk4OBg3X777frhhx9c98+aNUvXX3+9Fi9erKioKAUFBenhhx9WSUmJJOmmm25SWFiYnn32WeM5T58+rfHjx6tBgwYKDg5W//79tXPnTknSTz/9pFq1aumLL75w5atfv7569OjhevzHH39szG/Xrl3q37+//P39FRISogceeEDnzp1z3Z+UlKThw4fr2WefVePGjRUTE1Pqsnj99ddVt25dbdiw4SqWpH369eunyZMnX9V6LMvyfvvttxUZGVmlY3InlAM3Mn36dKWmpuqDDz7Q2rVrtXnzZmVlZbnuT0pK0hdffKFVq1Zp27ZtsixLQ4YMUVFRkY2p4W5uu+02lZSUaNWqVa7bTpw4odWrV2vs2LFauXKlpkyZomnTpmn37t168MEHdf/992vTpk3lfq7HH39cL7zwgrKzs9WhQ4eKHEaleuuttxQYGKj09HTNmTNHs2fP1rp16+R0OnXLLbfo1KlTSk1N1bp16/TNN9/ojjvuMB5/8OBBpaSkaM2aNXrnnXf0xhtvaMqUKZKk1157TS+++KKefvpppaenux5z22236cSJE0pJSVFmZqbi4+M1YMAAnTp1Stddd52uv/56V/natWuXHA6Htm/f7trhZ2ZmuuaVn5+vgQMHql69evr888/13nvvaf369Xr00UeNnBs2bNC+ffu0bt06ffTRRxcthzlz5ujxxx/X2rVrNWDAgApZtlXpatdjWZZ3amqqbrjhBruGZj/LZpmZmZYkKzMz0+4otjp79qzl6+trLVu2zHXbyZMnLX9/f2vKlCnW/v37LUnW1q1bXffn5uZa/v7+xmM8mTu+luzKNHHiRGvw4MGun+fOnWs1b97ccjqdVs+ePa0JEyYY0992223WkCFDLMuyrJycHEuStX37dtf9eXl5liRr06ZNlmVZ1qZNmyxJ1v/8z/9U+lhKcy3L9YYbbrB69+5t3Na1a1drxowZ1tq1a61atWpZR44ccd23Z88eS5KVkZFhWZZlzZw50woICLDOnDnjmmbgwIFW48aNjUwxMTHW888/b1mWZW3ZssUKDg62zp8/bzxvixYtrH/84x+WZVnWf/7nf1pDhw61LMuy5s+fb91xxx1Wx44drZSUFMuyLCsyMtI1/9dee82qV6+ede7cOde8Vq9ebXl5eVnHjx+3LMuy7rvvPqthw4bWhQsXjOds2rSpNW/ePOuxxx6zwsPDrd27d5d7Gf7Kzv9z17oer7S8W7Zsab322mtVNBqTO2zLOHLgJg4ePKjCwkJ1797ddVv9+vVdhwKzs7Pl7e1t3B8SEqKYmBhlZ2dXeV64twkTJmjt2rX67rvvJElvvvmmkpKS5HA4lJ2drV69ehnT9+rV66peR126dKmQvFXt90c5wsPDdeLECWVnZysyMtI4nNy2bVvVrVvXWD7NmjVTnTp1XD83bNhQ0dHRxjwbNmyoEydOSJJ27typc+fOKSQkREFBQa5LTk6ODh48KEm64YYblJaWppKSEqWmpqpfv37q16+fNm/erO+//17ffvuta97Z2dnq2LGjAgMDXbf16tVLTqdT+/btc90WFxcnX1/fi8Y/d+5cLVq0SGlpaWrXrl25lp07uZb1eKXlfeDAAfXr168qh+NWKAdADdSpUyd17NhRycnJyszM1J49e5SUlFSmx3p5/bJZsCzLddulPrr67c6pOvHx8TF+djgccjqd1/R4b2/vS87z3LlzCg8P144dO4zLvn37NH36dElS3759dfbsWWVlZenTTz81dlapqalq0KBBucd5qfXTp08flZSUaNmyZeWepzu5lvV4peXduHFjtWrVqjJiVwuUAzfRokUL+fj4GJ9R5uXlaf/+/ZKk2NhYFRcXG/efPHlS+/btU9u2bas8L9zf+PHj9eabb2rJkiVKTEx0vYuKjY3V1q1bjWm3bt3qeh39uhM6duyY6/7fnpxYk8XGxurbb7813qV/9dVXOn369DX9P4uPj9fx48fl7e2tli1bGpfQ0FBJUt26ddWhQwe98sor8vHxUZs2bdS3b19t375dH330keLj442cO3fuVH5+vuu2rVu3ysvL65InHv5Wt27dlJKSoueee05//etfr3pc7qos6/FKy9ujzzcQ5cBtBAUFady4cZo+fbo2btyo3bt3KykpyfUurlWrVrrllls0YcIEpaWlaefOnRo9erSaNGmiW265xeb0cEd33323jh49qkWLFmns2LGu26dPn64333xTr776qr7++mv97W9/04oVK/SnP/1JkuTv768ePXq4TjRMTU3V008/bdcwqlRiYqLi4uJ0zz33KCsrSxkZGRozZoxuuOGGa/oIJTExUQkJCRo+fLjWrl2rQ4cO6bPPPtNTTz3lOmNe+uUM/H/961+uHVP9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e6t9+/Z2x6hy7du3l7e3t90xqlRgYKCaNWtmdwygVJQDuK3jx48rNzfX7hhV6qefftLBgwftjlHlDhw4oDNnztgdo0r9+OOP+uGHH+yOAZSKcgC3VadOHZ09e9buGFXq7NmzqlOnjt0xqhzrGnAvlAO4rcaNGysnJ8fuGFUqJydH4eHhdseocp66rhs3bmx3DKBUlAO4rYSEBGVmZurChQt2R6ky27ZtU0JCgt0xqlyPHj20bds2u2NUmfPnzysrK8sj1zWqB8oB3FZCQoIKCwuVlZVld5QqkZubq6+//tojdxgJCQnav3+/x5xjkpWVpcLCQo9c16geKAdwWx07dpS/v7/HvKP8dZyeuMP4dcz/+7//a3OSqrFt2zb5+/urQ4cOdkcBSkU5gNvy8fFRQkKC3n//fVmWZXecSrdixQo1adLEI3+9LTo6Wk2aNNGKFSvsjlLpLMvS+++/r4SEBPn4+NgdBygV5QBu7U9/+pM+++wzrVmzxu4olWrfvn1KTk7WY489JofDYXecKudwODR9+nQlJydr3759dsepVCkpKdq2bZumT59udxTgkigHcGuDBg1S79699dRTT8npdNodp9L8+c9/VpMmTfTggw/aHcU2Dz74oMLDwzVz5ky7o1Qap9Opp556Sn369NHAgQPtjgNcEuUAbs3hcOjZZ5/V9u3btXTpUrvjVIqMjAwtW7ZMM2fOlJ+fn91xbFO7dm3NnDlTS5cu1eeff253nErx7rvvaseOHXr22Wc98ggRqg/KAdxe3759NXLkSI0bN05bt261O06FOnDggIYNG6b4+Hjdd999dsexXVJSkjp16qRhw4bpwIEDdsepUGlpaRo/frxGjRqlPn362B0HuCzKAaqFf/7zn+rWrZuGDBmi7du32x2nQhw9elSJiYmqW7euUlJSPO5vC5TG29tba9asUXBwsBITE3X06FG7I1WIrKwsDR06VN27d1dycrLdcYArohygWvD399eqVavUunVrDRw4UJmZmXZHuiaHDh3SjTfeKMuytG7dOoWFhdkdyW2EhYVp/fr1sixLN954ow4dOmR3pGuSmZmpgQMHKiYmRqtWrZK/v7/dkYArohyg2ggODtaaNWsUERGh7t27a8aMGSooKLA7VrmUlJRo3rx5ateunQoKCrR+/XpFRkbaHcvtREZGav369crPz1e7du00b948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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from lambeq import UnifyCodomainRewriter\n", "\n", "rewriter = UnifyCodomainRewriter(output_type=s)\n", "\n", "rewriter(diagram).draw(figsize=(5,4))" ] }, { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "This type of transformation would not be possible with box-level rewriters, since it requires knowledge that is available in more than one boxes.\n", "\n", "Other diagram-level rewriters that are available in ``lambeq``:\n", "\n", "- :py:class:`~.RemoveCupsRewriter`: Removes the :term:`cups ` from a diagram, reducing or eliminating :term:`post\\-selection`.\n", "- :py:class:`~.RemoveSwapsRewriter`: Removes the :term:`swaps ` from a diagram, producing a proper :term:`pregroup ` diagram, following J. Lambek's definition.\n", "\n", "More diagram-level rewriters can be created by extending the class :py:class:`~.DiagramRewriter`. " ] }, { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ ".. rubric:: See also:\n", "\n", "- :ref:`lambeq.rewrite package `\n", "- `Example notebook rewrite.ipynb <../examples/rewrite.ipynb>`_\n", "- `DisCoCat in lambeq <./discocat.ipynb>`_\n", "- `Extending lambeq <./extend-lambeq.ipynb>`_" ] } ], "metadata": { "language_info": { "name": "python" } }, "nbformat": 4, "nbformat_minor": 4 }