diff --git a/cookbook/repairing_broken_networks.ipynb b/cookbook/repairing_broken_networks.ipynb index 6b77403..b4b3744 100644 --- a/cookbook/repairing_broken_networks.ipynb +++ b/cookbook/repairing_broken_networks.ipynb @@ -506,6 +506,69 @@ "At this stage, the repaired ligand network is connected again. The repaired network contains both the existing and newly proposed edges, while `new_edges_by_score` contains only the new ligand mappings that still need to be simulated." ] }, + { + "cell_type": "markdown", + "id": "fcd03f62-520e-46f5-b939-10f1ca7efa7a", + "metadata": {}, + "source": [ + "### Repair automatically with redundant connections\n", + "\n", + "To make the repaired network more robust against future transformation failures, we can instead use Konnektor's `RedundantMstConcatenator`.\n", + "\n", + "Like `MstConcatenator`, it selects connections based on mapping scores, but it attempts to add multiple spanning trees between the disconnected subnetworks. The `n_redundancy` parameter controls how many trees are requested.\n", + "\n", + "We again exclude all edges from the original planned network to avoid retrying previously attempted transformations." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "0277ae60-78d2-42ef-8309-3a3d66c17095", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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MHToUH3yySeuUc7Obrcz1pNz1VVXaf78+apcubJ+//13NWvWzB0mE6tooAOA2EZgP8mECRP073//2z0fNWqU6tevH1Iw/O6779S+fXsdPHhQ3bp1cye9HThwQLGGBjoAiG0E9kSWLFmizp07u+f9+/d3e8anpoxtNwXDhg1zp7y98soruuCCC9yGL7GEjB0AYhuB/W/WLGbHsNqBL9YI98QTT6T+YmbJ4hrqbD/5ggULuhK9zbvPnj1bsYKMHQBiG4H97w7366+/3q1NtzXq1t1uB8CkVZs2bdySuFq1amnz5s268MIL9eyzzyZ5BGy0qVq1qnu7fv161yUPAIgtBHZJ//d//6dp06a5k92sWS4jlqxVrFjRbWZjNwx242Clfeu0j/ataG25W+nSpd1zOuMBIPbEfWC3pWx2vroZPXq06tSpk2EX1/aUf/vtt122bsvj3nnnHXcE7KpVqxTNmGcHgNgV14H9xx9/VJcuXdxz2z3OsuuMZo10ffv21RdffOGWzdlr2rz71KlTFa2YZweA2BW3gX3btm2uWc5K47Y9bDBrzyy2e92iRYvUuHFj7dixQ5deeqnroLfNcKINGTsAxK64DOy2r7vt8W4nttlxrO+99166muVCZXPXs2bNcmvcrZHO5vavvPLKqGtSI2MHgNgVl4H9vvvu0/Tp090c+KRJk1S4cOGwvbbtZvfSSy+53ens+eTJk92e9NHUqBbM2G0N/s6dOyM9HABAKsRdYH/33XePrVF/4403VLNmzYiMo2vXrpozZ47KlCnj9qS34G77zkdLZ3ypUqXc82i64QAApCyuAvvixYt1yy23uOf33HOPrrnmmoiOp0GDBlq4cKFatmypPXv26Oqrr9agQYOi4ghY5tkBIDbFTWDfsmWLa5bbt2+f20DGGteiga2Z/+yzz1xXvnn88cfVtm1bN95IYp4dAGJTXAR2y4A7deqk3377TZUqVXLryW1debSwxj2bHrAd70477TR39rstibNsPtKBnVI8AMSWuAjsAwcOdOvILWhas5rt4x6NbGpg3rx5OvPMM7V27Vo1bdpUY8aMiWgp3g7GAQDEDt8H9rfeektPP/20ez527NhjmWi0ql69uhYsWKB27dq5Y19tA53evXu742AjEdjtjHk64wEgdvg6sFspu3v37u75kCFD3JrxWGBd6VZZGDp0qHt/5MiR7sS5DRs2hG0MVtUoWbKke/7zzz+H7XUBAOnj28Bup6pdccUV2r9/v8t+H3zwQcUSOwL2gQce0Mcff+zOercDZWze/euvvw7bGGigA4DY48vAfujQIbd0zMrIlStXdgexWKCMRXZTYkfAWol+06ZNLnN/8cUXw3IELEveACD2xGa0S8Gdd96pr776Svny5XM7y1nGG8usme7bb791nf3W4d+nTx83925L9zITGTsAxB7fBXbbTe6FF15wzy1Tr1q1qvwgb968bte8ESNGuKV61ghoXfNr1qzJtNckYweA2JMQCEdNN0y+++47nXfeea6D3BrPbI7aj7788kuXvf/5558qVKiQO8SmVatWmXICXnAffeuMtwoIACC6+SZjt/ln63q3oN6+fXt3cppf2Ty7dfzblrQWfG0nvUcffTTD593tpqFEiRLuOZ3x8aV5c6l/f+95+fLSM89k3PdOSJAmTcq47wfAh4HdgnnHjh21fv16ValSxZWpY7VZLlR2eIz1Edje93am+7333uuuwa5duzL0dZhnx4IF0t+rRjPExo1S27aRua7btkm33y6dfbaUJ49UtqzUt6+U+OTkWbO8m4+kHnYtgGjni+jXr18/zZ07V/nz53frv+1tPMiVK5dGjx6tV155RdmzZ9eECRPcKXG//PJLhr0G8+woWtQLghnFikA5c0bmutpWEPZ48knpp5+kN9+Upk2T/j4byjn3XO/mI/GjWzevclG/fmTGDcRVYH/11Vf18ssvKyEhwe0Bb8vb4o1twmPZe+nSpV1Qt+BuqwEyAhk7Ti7F231js2Z2Y2k3ftKMGakrryf+XOv9tPfHj5fOO0/KndtOPZSWL/eyYwukefNKbdpIf/554vd5/XX7++ndJNheSn36pPza1atLH34oXXaZVKmS1LKl9PDD0scf25kS3ufkyOHdfAQf1mby0Ud21LI3ViDaxXRgt01bbLtV8+9//1uXXnqp4lXjxo3dvPv555/vyvG2Oc/gwYN15MiRdH1fMnYkdvSo1KGDl8HPny+NGiUNHpz+a2R9rkOGSIsW2aFI0nXX2RkP0rPPSnPmSCtXSvfff/zzX3pJsn/6NkVgmbcF3jPPTNtrWxneinz2ukmx722HLXbpkrbvD4RdIEatX78+UKJECesWC1x11VWBo0ePRnpIUeHgwYOB/v37u+tij9atWwe2bt2a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ImNHVMiXL58mTpzo3tomNrbGHWnL1tu3b09QB+IYgR1R4+yzz9Zbb73lnj/77LN6++23Iz2kmDrwJXi9WLsOxDcCO6KKZZtDhgxxz61D3srLSJmdd28d8WeccYYuuugiLhkQxwjsiDpDhw5VmzZttG/fPtdUt23btkgPKepx4AuAIJrnEJUs+6xfv747wMSWxE2ZMoUTypKxdu1alS9f3u0Nv3LlSlWsWDG8vywAUYWMHVGpYMGCrpkud+7cbhOb+++/P9JDivoDX1q0aEFQB0BgR/SyTVZee+0193z48OEu0CP5A19s7ToAUIpH1Lvzzjv19NNPK2/evG5f+SpVqkR6SFHD1vtbsxwHvgAIohSPqPfYY4/pggsu0O7du9WhQwft3Lkz0kOKuqa56667jlPcADhk7IgJmzdvdgearFu3zgX3Dz/8UFmyxPd9aeIDX6ySYc2GABDf/zMiZhQrVswFc9suddKkSXr00UcV7959910X1GvUqMEpbgCOIbAjZjRs2FAvvviie26b2EybNk3xjANfACSFUjxiTo8ePTRq1Ci3JM7OHI/Hdds//PCDateu7Q7KsQNfihQpEukhAYgSZOyIOc8995w7Cc7mmG1nur179yqeD3whqANIjMCOmJMzZ0598MEHbt7dMtdbb73VbdASL2xePXjgC2vXAZyMwI6YZIedjB8/3m0z+84777gsPp4OfLH980uXLu222wWAxAjsiFm2tn3EiBHu+V133aXZs2crHnDgC4BToXkOMc1K8DfddJPGjRvnSvMLFy502bxf/f777ypXrpz7uVesWKFKlSpFekgAogwZO2JaQkKC65CvVauW28SmY8eObg7a7we+NG/enKAOIEkEdsS8PHnyaMKECW752/z589W3b1/5EQe+AAgFgR2+YGvZrYkumMGPHj1afjNr1iytXr1a+fPn11VXXRXp4QCIUgR2+EabNm00bNgw97x3794ue/frgS9WpQCApNA8B1+x+WfLZu3sdlsOZs10xYsXV6zbsWOHO/Bl//797obFttcFgKSQscNXrBRvDWZ2Zvv69evVqVMnHTp0SH448MWCevXq1dWgQYNIDwdAFCOww3dsDtoy9nz58rm17YMGDVKs48AXAKGiFA/fsuBue8kbW+d+/fXXKxb9+OOPbjmfHfhiVYiiRYtGekgAohgZO3zriiuu0H333eeed+vWzQXIWM7WL7/8coI6gBSRscPXjhw5oksvvVSfffaZWxK3YMECFSpUSLHCNtuxJsCtW7fq008/1SWXXBLpIQGIcmTs8LXgITEVKlTQqlWrdMMNN7hgHys++ugjF9QtuLdu3TrSwwEQAwjs8D3L0G2+PXfu3Jo2bZqGDh2qWCvDd+7c2d2kAEBKKMUjblgD3Y033uieW6Dv0KGDYuXAl19//VVnnnlmpIcEIAaQsSNuWBm+X79+7vnNN9+sZcuWKZqNGTPGBXU7npagDiBUBHbElSeeeELnn3++du3a5brm7W004sAXAGlFKR5x548//lC9evXcmnBb5/7BBx+4Heui7cCXFi1auE12Nm3axN7wAEJGxo64Y3vHf/jhh8qRI4c77vWxxx5TtHnttdfcWw58AZBaZOyIW3a8a48ePZQlSxZNnTpVF198saLBX3/9pRIlSri94efNm6dGjRpFekgAYggZO+JW9+7d3Y50Np9tmbGddR5NB75Uq1aNU9wApBqBHXHt+eefd6elbdu2zc237927N9JD4sAXAOlCKR5xz9aLWzPdn3/+6da5jx07NmLNdD/99JNq1qypbNmyuea+YsWKxf3vB0DqkLEj7pUpU0bjx493O7u9/fbbeuGFF6LiwBeCOoC0ILADkpo3b+7WuJs777xTc+bMCft1OXjwoN566y33vGvXrvxeAKQJgR34W//+/V0T3eHDh3X11Ve7Ung4ffzxx+7Al1KlSnHgC4A0I7ADf7N59VdffdXNcdsmNh07dnTHpoZ77bod+GJz7ACQFjTPASdZuXKl6tevrx07dqhnz5566aWXMv0arVu3zh34Ykvvli9frrPOOovfC4A0IWMHTlKpUiV3hrtl8C+//PKxhrbMPvDFgrrtY09QB5AeBHYgCW3bttVDDz3knt92221asGBBpl0nC+jBmwea5gCkF6V44BQB1zatmTx5ss444wwtXLgwU5agzZ4923Xl24EvGzdu1GmnncbvBECakbEDyf3jyJLFlcgrV67s5sA7derkOuYzq2nu2muvJagDSDcCO3AKp59+uiZOnKi8efO6o1TvueeeDD/wxY6NNZThAWQEAjuQgnPOOUdvvvmmez5ixAi99957GXbN3n//fe3bt8+9Bqe4AcgIBHYgBFddddWxbP2WW27Rjz/+mCHX7euvv1adOnXc947U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DgBBlOKBGPX+++/r2muvVY4cOfTTTz+5g2MAgIwdiFHXXHON2rRp47aZZW07gCACOxDDa9tHjhyp3Llz68svv9TYsWMjPSQAUYDADsSwChUqaOjQoceWwtkyOADxjcAOxDjbrKZmzZpuw5oBAwZEejgAIozmOcAH5s2b55bBBQIBt+Vsy5YtIz0kABFCxg74QOPGjXXbbbe559ZIt3///kgPCUCEENgBnxg+fLhKliypX3/91a1zBxCfKMUDPvLBBx/o6quvVvbs2fXDDz+oatWqkR4SgDAjYwd85KqrrtKll16qQ4cOue1mjx49GukhAQgzAjvgs7XtL774ovLkyaM5c+bojTfeiPSQAIQZgR3wmXLlyumhhx5yz++++25t3rw50kMCEEYEdsCH+vXrp9q1a2v79u1u4xoA8YPmOcCnFixYoEaNGrm17Z9//rlatWoV6SEBCAMydsCnGjRooD59+rjntsZ93759kR4SgDAgsAM+NmzYMJUuXVorV650zwH4H6V4wOcmTpyoK6+8UtmyZdPixYtVrVq1SA8JQCYiYwd87oorrlD79u11+PBh1rYDcYDADsSB559/Xnnz5tXcuXM1evToSA8HQCYisANxoEyZMsfm2AcNGqRNmzZFekgAMglz7ECcOHLkiFv+tnDhQl177bV69913Iz0kAJmAwA7EkUWLFrllcLaH/NSpU9WmTZtIDwlABqMUD8SRunXrul3pTK9evbR3795IDwlABiOwA3HG9pG3OffVq1cf21MegH9Qigfi0Mcff6zLL7/crW238nyNGjUiPSQAGYSMHYhDl112mdu0xta2d+/enXPbAR8hsANx6rnnnlO+fPk0b948vfLKK5EeDoAMQmAH4pTtIT98+HD3/J577tGGDRsiPSQAGYDADsQxO/WtYcOG2rlzp/r37x/p4QDIADTPAXHODoapX7++28Dmk08+0aWXXhrpIQFIBzJ2IM7Vrl1bd9xxh3veu3dv7dmzJ9JDApAOBHYAGjp0qMqVK6fffvvNPQcQuyjFA3CmTJniyvBZs2bVf//7X5fJA4g9ZOwAnEsuuURXX321m2u3te32FkDsIbADOObZZ59V/vz5tWDBAr300ktcGSAGUYoHcAIL6HZAjG1e8/PPP7v17gBiBxk7gBP06NFDjRs31q5du9S3b1+uDhBjyNgB/MNPP/3kjni1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", + "text/plain": [ + "
" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from konnektor.network_planners import RedundantMstConcatenator\n", + "\n", + "# Reuse the mapper, scorer, and subnetworks from above\n", + "redundant_concatenator = RedundantMstConcatenator(\n", + " mappers=mapper,\n", + " scorer=scorer,\n", + " n_redundancy=2,\n", + ")\n", + "\n", + "repaired_redundant = redundant_concatenator.concatenate_networks(\n", + " subnetworks,\n", + " exclude_edges=planned_network.edges,\n", + ")\n", + "\n", + "# Identify the additional transformations to run\n", + "new_edges_redundant = list(\n", + " set(repaired_redundant.edges) - set(broken_network.edges)\n", + ")\n", + "\n", + "plot_atommapping_network(repaired_redundant)" + ] + }, + { + "cell_type": "markdown", + "id": "30b1234e-a067-4e3a-96a8-89dc863bc361", + "metadata": {}, + "source": [ + "To use the redundant repair network for replacement transformations in Part 3, pass `new_edges_redundant` instead of `new_edges_by_score` to `build_alchemical_network()`." + ] + }, { "cell_type": "markdown", "id": "7c2fa5f7", @@ -523,7 +586,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 10, "id": "69943267-eebf-4814-932c-c35014ec24cd", "metadata": {}, "outputs": [], @@ -636,7 +699,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 11, "id": "42ac44ab", "metadata": {}, "outputs": [