{ "cells": [ { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "# Loopless FBA" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "The goal of this procedure is identification of a thermodynamically consistent flux state without loops, as implied by the name. You can find a more detailed description in the [method](#Method) section at the end of the notebook." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [], "source": [ "%matplotlib inline\n", "import plot_helper\n", "\n", "import cobra.test\n", "from cobra import Reaction, Metabolite, Model\n", "from cobra.flux_analysis.loopless import add_loopless, loopless_solution\n", "from cobra.flux_analysis import pfba" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "## Loopless solution" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Classical loopless approaches as described below are computationally expensive to solve due to the added mixed-integer constraints. A much faster, and pragmatic approach is instead to post-process flux distributions to simply set fluxes to zero wherever they can be zero without changing the fluxes of any exchange reactions in the model. [CycleFreeFlux](http://dx.doi.org/10.1093/bioinformatics/btv096) is an algorithm that can be used to achieve this and in cobrapy it is implemented in the `cobra.flux_analysis.loopless_solution` function. `loopless_solution` will identify the closest flux distribution (using only loopless elementary flux modes) to the original one. Note that this will not remove loops which you explicitly requested, for instance by forcing a loop reaction to carry non-zero flux. \n", "\n", "Using a larger model than the simple example above, this can be demonstrated as follows" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [], "source": [ "salmonella = cobra.test.create_test_model('salmonella')\n", "nominal = salmonella.optimize()\n", "loopless = loopless_solution(salmonella)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [], "source": [ "import pandas\n", "df = pandas.DataFrame(dict(loopless=loopless.fluxes, nominal=nominal.fluxes))" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" }, { "data": { "application/pdf": "JVBERi0xLjQKJazcIKu6CjEgMCBvYmoKPDwgL1BhZ2VzIDIgMCBSIC9UeXBlIC9DYXRhbG9nID4+\nCmVuZG9iago4IDAgb2JqCjw8IC9TaGFkaW5nIDYgMCBSIC9Qcm9jU2V0IFsgL1BERiAvVGV4dCAv\nSW1hZ2VCIC9JbWFnZUMgL0ltYWdlSSBdCi9Gb250IDMgMCBSIC9QYXR0ZXJuIDUgMCBSIC9YT2Jq\nZWN0IDcgMCBSIC9FeHRHU3RhdGUgNCAwIFIgPj4KZW5kb2JqCjEwIDAgb2JqCjw8IC9SZXNvdXJj\nZXMgOCAwIFIgL1BhcmVudCAyIDAgUiAvTWVkaWFCb3ggWyAwIDAgMzk0LjQ2NTYyNSAyNjUuNjgz\nNzUgXQovR3JvdXAgPDwgL0NTIC9EZXZpY2VSR0IgL1MgL1RyYW5zcGFyZW5jeSAvVHlwZSAvR3Jv\ndXAgPj4gL0Fubm90cyBbIF0KL0NvbnRlbnRzIDkgMCBSIC9UeXBlIC9QYWdlID4+CmVuZG9iago5\nIDAgb2JqCjw8IC9MZW5ndGggMTEgMCBSIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4\nnO1dSZMkt3W+96+oo31AEngLlqMYshnhCB8kM+yDQgcFRdFikJQlhqS/7+8hs7syJ4BC5XRVT/aw\nSM2I9eorZGJ7C/CWcPr+6YtfhdN3P5/86Xv8+efpd6ff4///eAqnr05f/Prbf/z5m29/+9WXp29+\nfvKg//jERSaJGknx8Yf1R4o6xcxJQfabT//79PTTE56CX3yFhr97epI8lflXnCYVg6HpzFP6gPrD\nmkoqU1naPLewpuJJf3r666nRPLNM+UQhTSKnv317+p/TT6cvfkW161OgoDFHAs6jO8s/6clPyWvO\nxErl9Lfv8O7f4895kLq/PG1++duvnq5E/u27p79ipGyoA15WJp+5cEocyymIYiBy8lRSkNM3P56+\n+E9/+vVfXvD294P6oD6oD+qD+i6pE5cgkSQL4wNpDKmk7LmBdX7yFEuSDJlgn0h9khRLboMZUjBQ\nkpitZVGGOAraAgNLhSCvIJeuafgMvozFtxBknkj8/PoqXgQCLbQb3qIxEl59D+tDoZhSZJk/UfQl\nqMbma3jPWVmVUv1ASiFzaLWM3qVSfMgU64RgsINQhjR+3US7zUy7wVR/9suNNSvFkGNtWKJ48kyd\n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\nAfC9+Rye/nn63en3oPwRf76yb56STBQICqqV+1CIBj39uCZKVar19MPT05dPS4vh9M+nv9ZHO3t2\n5ClGNYW9WD4ZmmqenKcvvz598e+YZX/6+k9PeeKUi7cAYHz+49O/sP/X09ffP/3b12jJJFPtwct/\n4Odf/Prb7//w33//rz/89LP78c8//f3npWPPL1G784S3nHJNj7J+/zX1ig4Ey3ScLTOxwl64tgd0\nox7ENFnKKC2bHqyo1/RA41RqPYNAkO5X9iDcpgcUxK70C+d1D9bUXg82r0fBDvOFFMZSLEsf7DXr\nW57wltunRj8ln6w+3PqpK+p1T1XLdwdTM7B6Wj01tB/LPk3MwTKYrB67pl71WJhqU7FEAlYKQFaP\npc5j1cpbm9vZ5rEr6nWPFfy4QLLmelN4fiy/PHaDD8VydtclUyyIP9AM/+Evf/m/H779+efmu0qe\nSlT7DcaWGDY4411FJ/mQemFF2w5OwfIcqdVPSZZAbM4z8jaM5dyJLFMSjdhW606cqVd1ImO6Jado\nBQvpzXjLuRMh6GTa1LYTZ+pVnQgh4Jce84Cu5zfjL6te4NVTtKoY226cyZdXv07Rzz8I2H0hU8Lf\ncoHJrB6dImSEsabto8/ky2wG20diHcREE9QYtlK8YHMXWM354eTjBJ6WgF8/fEW+8uFYfNjPkosI\n0UWGs3o4GA575g8GfUW+9uHMk0KtpxQFkvkC25k1PlNssMuKcTVoF1Nga+XrH5/8sr5++gsWzR9+\neG6CTv+BLz5UdLDG/vHnb7797Vdfnr75edWtFRtd9RW8qeSFjf7XE2fGwvoQvqJ+gG+23mrkA/S5\nmUut/+bp/wFKYXyBCmVuZHN0cmVhbQplbmRvYmoKMTEgMCBvYmoKNzQ4MAplbmRvYmoKMTcgMCBv\nYmoKPDwgL0xlbmd0aCAzNyAvU3VidHlwZSAvRm9ybSAvVHlwZSAvWE9iamVjdCAvRmlsdGVyIC9G\nbGF0ZURlY29kZQovQkJveCBbIC0xMDIxIC00NjMgMTc5NCAxMjMzIF0gPj4Kc3RyZWFtCnic4zI0\nMFMwNjVVyOUyNzYCs3LALCNzIyALJItgQWTTAAFfCgoKZW5kc3RyZWFtCmVuZG9iagoxOCAwIG9i\nago8PCAvTGVuZ3RoIDMzMiAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeJwtUjmOJDEM\ny/0KfmAA6/Lxnh5M1Pv/dElVBQWqbMs85HLDRCV+LJDbUWvi10ZmoMLwr6vMhe9I28g6iGvIRVzJ\nlsJnRCzkMcQ8xILv2/gZHvmszMmzB8Yv2fcZVuypCctCxosztMMqjsMqyLFg6yKqe3hTpMOpJNjj\ni/8+xXMXgha+I2jAL/nnqyN4vqRF2j1m27RbD5ZpR5UUloPtac7L5EvrLFfH4/kg2d4VO0JqV4Ci\nMHfGeS6OMm1lRGthZ4OkxsX25tiPpQRd6MZlpDgC+ZkqwgNKmsxsoiD+yOkhpzIQpq7pSie3URV3\n6slcs7m8nUkyW/dFis0UzuvCmfV3mDKrzTt5lhOlTkX4GXu2BA2d4+rZa5mFRrc5wSslfDZ2enLy\nvZpZD8mpSEgV07oKTqPIFEvYlviaiprS1Mvw35f3GX//ATPifAEKZW5kc3RyZWFtCmVuZG9iagox\nOSAwIG9iago8PCAvTGVuZ3RoIDE2MSAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeJxF\nkEsSwyAMQ/ecQkfwRwZ8nnS6Su+/rSFNs4CnsUAGdycEqbUFE9EFL21Lugs+WwnOxnjoNm41EuQE\ndYBWpONolFJ9ucVplXTxaDZzKwutEx1mDnqUoxmgEDoV3u2i5HKm7s75R3D1X/VHse6czcTAZOUO\nhGb1Ke58mx1RXd1kf9JjbtZrfxX2qrC0rKXlhNvOXTOgBO6pHO39BalzOoQKZW5kc3RyZWFtCmVu\nZG9iagoyMCAwIG9iago8PCAvTGVuZ3RoIDIxMCAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJl\nYW0KeJw1UMsNQzEIu2cKFqgUAoFknla9df9rbdA7YRH/QljIlAh5qcnOKelLPjpMD7Yuv7EiC611\nJezKmiCeK++hmbKx0djiYHAaJl6AFjdg6GmNGjV04YKmLpVCgcUl8Jl8dXvovk8ZeGoZcnYEEUPJ\nYAlquhZNWLQ8n5BOAeL/fsPuLeShkvPKnhv5G5zt8DuzbuEnanYi0XIVMtSzNMcYCBNFHjx5RaZw\n4rPWd9U0EtRmC06WAa5OP4wOAGAiXlmA7K5EOUvSjqWfb7zH9w9AAFO0CmVuZHN0cmVhbQplbmRv\nYmoKMjEgMCBvYmoKPDwgL0xlbmd0aCAyMTQgL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFt\nCnicPVC7EUMxCOs9BQvkznztN8/Lpcv+bSScpEI2QhKUmkzJlIc6ypKsKU8dPktih7yH5W5kNiUq\nRS+TsCX30ArxfYnmFPfd1ZazQzSXaDl+CzMqqhsd00s2mnAqE7qg3MMz+g1tdANWhx6xWyDQpGDX\ntiByxw8YDMGZE4siDEpNBv+tcvdS3O89HG+iiJR08K755fTLzy28Tj2ORLq9+YprcaY6CkRwRmry\ninRhxbLIQ6TVBDU9A2u1AK7eevk3aEd0GYDsE4njNKUcQ//WuMfrA4eKUvQKZW5kc3RyZWFtCmVu\nZG9iagoyMiAwIG9iago8PCAvTGVuZ3RoIDMzOCAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJl\nYW0KeJw1Ujmu3UAM630KXSCAds2c5wWpfu7fhpRfCkO0VoqajhaVafllIVUtky6/7UltiRvy98kK\niROSVyXapQyRUPk8hVS/Z8u8vtacESBLlQqTk5LHJQv+DJfeLhznY2s/jyN3PXpgVYyEEgHLFBOj\na1k6u8Oajfw8pgE/4hFyrli3HGMVSA26cdoV70PzecgaIGaYlooKXVaJFn5B8aBHrX33WFRYINHt\nHElwjI1QkYB2gdpIDDmzFruoL/pZlJgJdO2LIu6iwBJJzJxiXTr6Dz50LKi/NuPLr45K+kgra0za\nd6NJacwik66XRW83b309uEDzLsp/Xs0gQVPWKGl80KqdYyiaGWWFdxyaDDTHHIfMEzyHMxKU9H0o\nfl9LJrookT8ODaF/Xx6jjJwGbwFz0Z+2igMX8dlhrxxghdLFmuR9QCoTemD6/9f4ef78Axy2gFQK\nZW5kc3RyZWFtCmVuZG9iagoyMyAwIG9iago8PCAvTGVuZ3RoIDgwIC9GaWx0ZXIgL0ZsYXRlRGVj\nb2RlID4+CnN0cmVhbQp4nEWMuw3AMAhEe6ZgBH4mZp8olbN/GyBK3HBPunu4OhIyU95hhocEngws\nhlPxBpmjYDW4RlKNneyjsG5fdYHmelOr9fcHKk92dnE9zcsZ9AplbmRzdHJlYW0KZW5kb2JqCjI0\nIDAgb2JqCjw8IC9MZW5ndGggNDUgL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCnicMzK3\nUDBQsDQBEoYWJgrmZgYKKYZclhBWLhdMLAfMAtGWcAoingYAn30MtQplbmRzdHJlYW0KZW5kb2Jq\nCjI1IDAgb2JqCjw8IC9MZW5ndGggNjggL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCnic\nMzK3UDBQsDQBEoYWJgrmZgYKKYZcQL6piblCLhdIDMTKAbMMgLQlnIKIW0I0QZSCWBClZiZmEEk4\nAyKXBgDJtBXlCmVuZHN0cmVhbQplbmRvYmoKMjYgMCBvYmoKPDwgL0xlbmd0aCAzMDQgL0ZpbHRl\nciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCnicPZI7ksMwDEN7nYIXyIz4k+TzZCeV9/7tPjLJVoBJ\niQAoL3WZsqY8IGkmCf/R4eFiO+V32J7NzMC1RC8TyynPoSvE3EX5spmNurI6xarDMJ1b9Kici4ZN\nk5rnKksZtwuew7WJ55Z9xA83NKgHdY1Lwg3d1WhZCs1wdf87vUfZdzU8F5tU6tQXjxdRFeb5IU+i\nh+lK4nw8KCFcezBGFhLkU9FAjrNcrfJeQvYOtxqywkFqSeezJzzYdXpPLm4XzRAPZLlU+E5R7O3Q\nM77sSgk9ErbhWO59O5qx6RqbOOx+70bWyoyuaCF+yFcn6yVg3FMmRRJkTrZYbovVnu6hKKZzhnMZ\nIOrZioZS5mJXq38MO28sL9ksyJTMCzJGp02eOHjIfo2a9HmV53j9AWzzczsKZW5kc3RyZWFtCmVu\nZG9iagoyNyAwIG9iago8PCAvTGVuZ3RoIDI1NSAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJl\nYW0KeJxFkUuSAyAIRPeegiOA/OQ8mZpVcv/tNJhMNnaXqP2ESiOmEiznFHkw/cjyzWS26bUcq52N\nAooiFMzkKvRYgdWdKeLMtUS19bEyctzpHYPiDeeunFSyuFHGOqo6FTim58r6qu78uCzKviOHMgVs\n1jkONnDltmGME6PNVneH+0SQp5Opo+J2kGz4g5PGvsrVFbhONvvqJRgHgn6hCUzyTaB1hkDj5il6\ncgn28XG780Cwt7wJpGwI5MgQjA5Bu06uf3Hr/N7/OsOd59oMV4538TtMa7vjLzHJirmARe4U1PM9\nF63rDB3vyZljctN9Q+dcsMvdQabP/B/r9w9QimaICmVuZHN0cmVhbQplbmRvYmoKMjggMCBvYmoK\nPDwgL0xlbmd0aCAyMzYgL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCnicTVBLbkQhDNtz\nilzgSSQhAc5D1VXn/tuxw1TtKoYYf0gP6bJVHutTYnWJ7PKlTZfKMnkVqOVP2/9RDAJu/9DIQbS3\njJ1i5hLWxcIkPOU0Ixsn1ywfjztPG2aFxsSN450uGWCfFgE1W5XNgTltOjdAupAat6qz3mRQDCLq\nQs0Hky6cp9GXiDmeqGBKdya1kBtcPtWhA3FavQq5Y4uTb8QcWaHAYdBMcdZfAdaoybJZyCBJhiHO\nfaN7lAqNqMp5KxXCD5OhEfWG1aAGlbmFoqnlkvwd2gIwBbaMdekMSoGqAMHfKqd9vwEkjV1TCmVu\nZHN0cmVhbQplbmRvYmoKMjkgMCBvYmoKPDwgL0xlbmd0aCAyNDggL0ZpbHRlciAvRmxhdGVEZWNv\nZGUgPj4Kc3RyZWFtCnicLVE5kgNBCMvnFXpCc9PvscuR9//pCsoBg4ZDIDotcVDGTxCWK97yyFW0\n4e+ZGMF3waHfynUbFjkQFUjSGFRNqF28Hr0HdhxmAvOkNSyDGesDP2MKN3pxeEzG2e11GTUEe9dr\nT2ZQMisXccnEBVN12MiZw0+mjAvtXM8NyLkR1mUYpJuVxoyEI00hUkih6iapM0GQBKOrUaONHMV+\n6csjnWFVI2oM+1xL29dzE84aNDsWqzw5pUdXnMvJxQsrB/28zcBFVBqrPBAScL/bQ/2c7OQ33tK5\ns8X0+F5zsrwwFVjx5rUbkE21+Dcv4vg94+v5/AOopVsWCmVuZHN0cmVhbQplbmRvYmoKMzAgMCBv\nYmoKPDwgL0xlbmd0aCAyNDUgL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCnicRVC7jUMx\nDOs9BRcIYP0se553SJXbvz1KRnCFIVo/kloSmIjASwyxlG/iR0ZBPQu/F4XiM8TPF4VBzoSkQJz1\nGRCZeIbaRm7odnDOvMMzjDkCF8VacKbTmfZc2OScBycQzm2U8YxCuklUFXFUn3FM8aqyz43XgaW1\nbLPTkewhjYRLSSUml35TKv+0KVsq6NpFE7BI5IGTTTThLD9DkmLMoJRR9zC1jvRxspFHddDJ2Zw5\nLZnZ7qftTHwPWCaZUeUpnecyPiep81xOfe6zHdHkoqVV+5z93pGW8iK126HV6VclUZmN1aeQuDz/\njJ/x/gOOoFk+CmVuZHN0cmVhbQplbmRvYmoKMTUgMCBvYmoKPDwgL1N1YnR5cGUgL1R5cGUzIC9C\nYXNlRm9udCAvRGVqYVZ1U2FucyAvTmFtZSAvRGVqYVZ1U2FucyAvRmlyc3RDaGFyIDAKL1R5cGUg\nL0ZvbnQgL0NoYXJQcm9jcyAxNiAwIFIgL0ZvbnRCQm94IFsgLTEwMjEgLTQ2MyAxNzk0IDEyMzMg\nXQovRW5jb2RpbmcgPDwKL0RpZmZlcmVuY2VzIFsgNDggL3plcm8gL29uZSAvdHdvIC90aHJlZSA5\nNyAvYSAxMDEgL2UgMTA1IC9pIDEwOCAvbCAvbSAvbiAvbyAvcCAxMTUgL3MKXQovVHlwZSAvRW5j\nb2RpbmcgPj4KL0ZvbnREZXNjcmlwdG9yIDE0IDAgUiAvTGFzdENoYXIgMjU1IC9Gb250TWF0cml4\nIFsgMC4wMDEgMCAwIDAuMDAxIDAgMCBdCi9XaWR0aHMgMTMgMCBSID4+CmVuZG9iagoxNCAwIG9i\nago8PCAvU3RlbVYgMCAvTWF4V2lkdGggMTM0MiAvRm9udEJCb3ggWyAtMTAyMSAtNDYzIDE3OTQg\nMTIzMyBdCi9Gb250TmFtZSAvRGVqYVZ1U2FucyAvWEhlaWdodCAwIC9GbGFncyAzMiAvQ2FwSGVp\nZ2h0IDAgL0FzY2VudCA5MjkKL0l0YWxpY0FuZ2xlIDAgL0Rlc2NlbnQgLTIzNiAvVHlwZSAvRm9u\ndERlc2NyaXB0b3IgPj4KZW5kb2JqCjEzIDAgb2JqClsgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAg\nNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAKNjAwIDYwMCA2\nMDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCAzMTggNDAxIDQ2\nMCA4MzggNjM2Cjk1MCA3ODAgMjc1IDM5MCAzOTAgNTAwIDgzOCAzMTggMzYxIDMxOCAzMzcgNjM2\nIDYzNiA2MzYgNjM2IDYzNiA2MzYgNjM2IDYzNgo2MzYgNjM2IDMzNyAzMzcgODM4IDgzOCA4Mzgg\nNTMxIDEwMDAgNjg0IDY4NiA2OTggNzcwIDYzMiA1NzUgNzc1IDc1MiAyOTUKMjk1IDY1NiA1NTcg\nODYzIDc0OCA3ODcgNjAzIDc4NyA2OTUgNjM1IDYxMSA3MzIgNjg0IDk4OSA2ODUgNjExIDY4NSAz\nOTAgMzM3CjM5MCA4MzggNTAwIDUwMCA2MTMgNjM1IDU1MCA2MzUgNjE1IDM1MiA2MzUgNjM0IDI3\nOCAyNzggNTc5IDI3OCA5NzQgNjM0IDYxMgo2MzUgNjM1IDQxMSA1MjEgMzkyIDYzNCA1OTIgODE4\nIDU5MiA1OTIgNTI1IDYzNiAzMzcgNjM2IDgzOCA2MDAgNjM2IDYwMCAzMTgKMzUyIDUxOCAxMDAw\nIDUwMCA1MDAgNTAwIDEzNDIgNjM1IDQwMCAxMDcwIDYwMCA2ODUgNjAwIDYwMCAzMTggMzE4IDUx\nOCA1MTgKNTkwIDUwMCAxMDAwIDUwMCAxMDAwIDUyMSA0MDAgMTAyMyA2MDAgNTI1IDYxMSAzMTgg\nNDAxIDYzNiA2MzYgNjM2IDYzNiAzMzcKNTAwIDUwMCAxMDAwIDQ3MSA2MTIgODM4IDM2MSAxMDAw\nIDUwMCA1MDAgODM4IDQwMSA0MDEgNTAwIDYzNiA2MzYgMzE4IDUwMAo0MDEgNDcxIDYxMiA5Njkg\nOTY5IDk2OSA1MzEgNjg0IDY4NCA2ODQgNjg0IDY4NCA2ODQgOTc0IDY5OCA2MzIgNjMyIDYzMiA2\nMzIKMjk1IDI5NSAyOTUgMjk1IDc3NSA3NDggNzg3IDc4NyA3ODcgNzg3IDc4NyA4MzggNzg3IDcz\nMiA3MzIgNzMyIDczMiA2MTEgNjA1CjYzMCA2MTMgNjEzIDYxMyA2MTMgNjEzIDYxMyA5ODIgNTUw\nIDYxNSA2MTUgNjE1IDYxNSAyNzggMjc4IDI3OCAyNzggNjEyIDYzNAo2MTIgNjEyIDYxMiA2MTIg\nNjEyIDgzOCA2MTIgNjM0IDYzNCA2MzQgNjM0IDU5MiA2MzUgNTkyIF0KZW5kb2JqCjE2IDAgb2Jq\nCjw8IC9zIDE4IDAgUiAvbiAxOSAwIFIgL3plcm8gMjAgMCBSIC9vIDIxIDAgUiAvdGhyZWUgMjIg\nMCBSIC9vbmUgMjMgMCBSCi9sIDI0IDAgUiAvaSAyNSAwIFIgL2EgMjYgMCBSIC9lIDMwIDAgUiAv\ncCAyOCAwIFIgL3R3byAyOSAwIFIgL20gMjcgMCBSID4+CmVuZG9iagozIDAgb2JqCjw8IC9GMSAx\nNSAwIFIgPj4KZW5kb2JqCjQgMCBvYmoKPDwgL0EyIDw8IC9jYSAxIC9DQSAxIC9UeXBlIC9FeHRH\nU3RhdGUgPj4KL0ExIDw8IC9jYSAxIC9DQSAwIC9UeXBlIC9FeHRHU3RhdGUgPj4gPj4KZW5kb2Jq\nCjUgMCBvYmoKPDwgPj4KZW5kb2JqCjYgMCBvYmoKPDwgPj4KZW5kb2JqCjcgMCBvYmoKPDwgL0Rl\namFWdVNhbnMtbWludXMgMTcgMCBSIC9NMCAxMiAwIFIgPj4KZW5kb2JqCjEyIDAgb2JqCjw8IC9T\ndWJ0eXBlIC9Gb3JtCi9CQm94IFsgLTIuNzM2MDY3OTc3NSAtMi43MzYwNjc5Nzc1IDIuNzM2MDY3\nOTc3NSAyLjczNjA2Nzk3NzUgXSAvTGVuZ3RoIDEzOQovRmlsdGVyIC9GbGF0ZURlY29kZSAvVHlw\nZSAvWE9iamVjdCA+PgpzdHJlYW0KeJxtkDEOwzAIRXdO4Qt8C+wEOWvGXCNLVSn3X5tW6Y8js1j4\nA/8Blt6iaZPzQcmlunpLh2iel6pWOtGyuTXzr6Sqk5dTmptZXRIY7cIs2EEP0JeS/lr+nztNxOVB\nQofqAFd55M9wl4CP0QQRC+NIGOfGYy8EiyO4D8JDIrg4QhK6FV8iq3wAhGdYiwplbmRzdHJlYW0K\nZW5kb2JqCjIgMCBvYmoKPDwgL0NvdW50IDEgL0tpZHMgWyAxMCAwIFIgXSAvVHlwZSAvUGFnZXMg\nPj4KZW5kb2JqCjMxIDAgb2JqCjw8IC9Qcm9kdWNlciAobWF0cGxvdGxpYiBwZGYgYmFja2VuZCkK\nL0NyZWF0b3IgKG1hdHBsb3RsaWIgMi4wLjAsIGh0dHA6Ly9tYXRwbG90bGliLm9yZykKL0NyZWF0\naW9uRGF0ZSAoRDoyMDE3MDMxNzEwNTI1MyswMicwMCcpID4+CmVuZG9iagp4cmVmCjAgMzIKMDAw\nMDAwMDAwMCA2NTUzNSBmIAowMDAwMDAwMDE2IDAwMDAwIG4gCjAwMDAwMTQxNDMgMDAwMDAgbiAK\nMDAwMDAxMzYwNyAwMDAwMCBuIAowMDAwMDEzNjM5IDAwMDAwIG4gCjAwMDAwMTM3MzggMDAwMDAg\nbiAKMDAwMDAxMzc1OSAwMDAwMCBuIAowMDAwMDEzNzgwIDAwMDAwIG4gCjAwMDAwMDAwNjUgMDAw\nMDAgbiAKMDAwMDAwMDM5OCAwMDAwMCBuIAowMDAwMDAwMjA4IDAwMDAwIG4gCjAwMDAwMDc5NTMg\nMDAwMDAgbiAKMDAwMDAxMzgzNyAwMDAwMCBuIAowMDAwMDEyMzkxIDAwMDAwIG4gCjAwMDAwMTIx\nOTEgMDAwMDAgbiAKMDAwMDAxMTgyNiAwMDAwMCBuIAowMDAwMDEzNDQ0IDAwMDAwIG4gCjAwMDAw\nMDc5NzQgMDAwMDAgbiAKMDAwMDAwODE0NCAwMDAwMCBuIAowMDAwMDA4NTQ5IDAwMDAwIG4gCjAw\nMDAwMDg3ODMgMDAwMDAgbiAKMDAwMDAwOTA2NiAwMDAwMCBuIAowMDAwMDA5MzUzIDAwMDAwIG4g\nCjAwMDAwMDk3NjQgMDAwMDAgbiAKMDAwMDAwOTkxNiAwMDAwMCBuIAowMDAwMDEwMDMzIDAwMDAw\nIG4gCjAwMDAwMTAxNzMgMDAwMDAgbiAKMDAwMDAxMDU1MCAwMDAwMCBuIAowMDAwMDEwODc4IDAw\nMDAwIG4gCjAwMDAwMTExODcgMDAwMDAgbiAKMDAwMDAxMTUwOCAwMDAwMCBuIAowMDAwMDE0MjAz\nIDAwMDAwIG4gCnRyYWlsZXIKPDwgL1Jvb3QgMSAwIFIgL0luZm8gMzEgMCBSIC9TaXplIDMyID4+\nCnN0YXJ0eHJlZgoxNDM1MQolJUVPRgo=\n", "image/png": "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\nQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "df.plot.scatter(x='loopless', y='nominal')" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "This functionality can also be used in FVA by using the `loopless=True` argument to avoid getting high flux ranges for reactions that essentially only can reach high fluxes if they are allowed to participate in loops (see the simulation notebook) leading to much narrower flux ranges." ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "## Loopless model" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Cobrapy also includes the \"classical\" loopless formulation by [Schellenberger et. al.](https://dx.doi.org/10.1016%2Fj.bpj.2010.12.3707) implemented in `cobra.flux_analysis.add_loopless` modify the model with additional mixed-integer constraints that make thermodynamically infeasible loops impossible. This is much slower than the strategy provided above and should only be used if one of the two following cases applies:\n", "\n", "1. You want to combine a non-linear (e.g. quadratic) objective with the loopless condition\n", "2. You want to force the model to be infeasible in the presence of loops independent of the set reaction bounds.\n", "\n", "We will demonstrate this with a toy model which has a simple loop cycling A $\\rightarrow$ B $\\rightarrow$ C $\\rightarrow$ A, with A allowed to enter the system and C allowed to leave. A graphical view of the system is drawn below:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false, "deletable": true, "editable": true, "scrolled": true }, "outputs": [ { "data": { "application/pdf": "JVBERi0xLjQKJazcIKu6CjEgMCBvYmoKPDwgL1BhZ2VzIDIgMCBSIC9UeXBlIC9DYXRhbG9nID4+\nCmVuZG9iago4IDAgb2JqCjw8IC9TaGFkaW5nIDYgMCBSIC9Qcm9jU2V0IFsgL1BERiAvVGV4dCAv\nSW1hZ2VCIC9JbWFnZUMgL0ltYWdlSSBdCi9Gb250IDMgMCBSIC9QYXR0ZXJuIDUgMCBSIC9YT2Jq\nZWN0IDcgMCBSIC9FeHRHU3RhdGUgNCAwIFIgPj4KZW5kb2JqCjEwIDAgb2JqCjw8IC9SZXNvdXJj\nZXMgOCAwIFIgL1BhcmVudCAyIDAgUiAvTWVkaWFCb3ggWyAwIDAgNjMxLjE1OTM3NSAyNzkuNDg4\nNzUgXQovR3JvdXAgPDwgL0NTIC9EZXZpY2VSR0IgL1MgL1RyYW5zcGFyZW5jeSAvVHlwZSAvR3Jv\ndXAgPj4gL0Fubm90cyBbIF0KL0NvbnRlbnRzIDkgMCBSIC9UeXBlIC9QYWdlID4+CmVuZG9iago5\nIDAgb2JqCjw8IC9MZW5ndGggMTEgMCBSIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4\nnNVXu25dNxDs+RUs7cIM98HHllbipEqh4AIJEBgu5ESGEAWwinx/ZnlzD3mOrptALlxJZ7XkzuwO\nhxTFh/A5Sk6UK5fIknqj3kosvSSLrJoqx6c/4q/x75hT652lsCnho/QsxlSqBf/L5SM+3X85M+4y\nf/lplxm+nPl0HwJzSTpgVk3dMnWKj4i2VDL3uoaZLRWSbrGW1FioObeczKpyrC1xLi2XeBdYOGnr\nhtU91QEFmZKEyFRjy6macd3FODUr3iRfPsNenRVN27ZsNVmWQmvx1pP0mnWs3mA2S7324jAnn44W\n5EF/Up8xX47i2arsUymx9UrrnoRfqea+r074ECk7nOTVcyl14bPEVupLeOvStuXSza34ru8bzGVC\nk886yudTvwufQrgJt/Fbka4AXS4DZibgbDK0K+BGZcx6iQsUQNVVwRn9piwgJYyGqguIsyYyttFG\ncf7sWkNnU21F0TwPWh2i5NwwByzcBw0AJbfLDpc4OQYD5mVbEu96ox0EKkma8JDRApdq6qW0AXcy\nI4fQm2872zCDvgMglDH3NRlaMnWFrPvi71pdTHsM+LDuulvxkmMYAl2YLcFdG9b41rO57dLdCWE3\niQl3ndpktg74ihq+OU0ru+cc7ViZUz/asTJ+PdixcoUBHO1YIaZ2sGN13R3seI0tnrSGL/Y1t5w2\nN4uvhjhhTutc+EyPndRXO1YooB7tWKHdcrBjda09s2OFcuvBjpW8+t6O19hKfQlvXdq2XLq5Fd/1\nfYO5TGjyWUf5fOr/Q7oRoowP8ff4Hj8/+jfudxzSBumVhddjIKvAS+eCVceWfy1RzyUFSUS36gji\nWIHqMfVKFLMytfO2L8JD0Etcb1h1dgjOEJC7vdtYxX1vkXpPTZ2qg+5JTYQ0wkxwysg6wn7vCZyv\njzF3qfWSDM8jRD25YzjiyWbwGRbMz4lZzpj+C9EZE6+1CSTcAERr83MOZlpw0Cx2xdOm4BWEimcV\nmoFwt4SSOHgO2y8Z0DVvCZQGKPWSbq17HOmE3c5hPA7EfZWiSWJiFXspOizA1dpBZVzUT+xBDjO6\nSkdh2tTqQXu73CvRVb0vQqTimpFnx6X0iurHgjO6glPNCZo50NvlXolePS9nhPfh5hS/+xFXYImn\nP4P7WB30jFLWan4lnj6GV+9++/D2dTw9xHen8DngSopvcsQqoaQDDynuWGnqC+4esWvIuIDwAHEA\n2GHWePWPbxRgalmUcMU7sDc4dW6/M9nfqiOdRjrq3q6VpePKb1+3Ml+vjEdIGfnq5MtXKCyz8G48\nWsUrjvlgpninX+bzw88fvr/MZ7fk/BI7l1EA76aXNW+vLoCr+f9CzoHhI7iBtgU3VxcoLgH7j9Oh\nwgbpNvwL2RPvwAplbmRzdHJlYW0KZW5kb2JqCjExIDAgb2JqCjEwMzcKZW5kb2JqCjE2IDAgb2Jq\nCjw8IC9MZW5ndGggODggL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCnicLY2xDcAwCAR7\nT8EI4AeM94lSxfu3wdgNfzq9Hg8jJnAeN6XRJz3SHEWric+ir8GY1CLJ0K9zxCVlJYxyucK7pVEJ\nBUE2CfwYrugz/8aZuSvvD5G5G2EKZW5kc3RyZWFtCmVuZG9iagoxNyAwIG9iago8PCAvTGVuZ3Ro\nIDc5IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4nE3Nuw3AIAwE0J4pPALg/z5RqrB/\nGxsiQmM/6U46wQ4V3OKwGGh3uFrxpVGYfeqZEpJQcz1EWDMlOoSkX/rLMMOY2Mi277dW7hfeGxwZ\nCmVuZHN0cmVhbQplbmRvYmoKMTggMCBvYmoKPDwgL0xlbmd0aCA4NyAvRmlsdGVyIC9GbGF0ZURl\nY29kZSA+PgpzdHJlYW0KeJw9jrsRwDAIQ3umYATzCYZ9cqmc/duAP2nQQzpOuAk2DM/R7cLOgTdB\n7kUvsC5vgAohiyQZ+fbOxaJWmcWvpkXqhDRJnDdR6E6LSucD4/QOeD66dR16CmVuZHN0cmVhbQpl\nbmRvYmoKMTkgMCBvYmoKPDwgL0xlbmd0aCAyMzIgL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3Ry\nZWFtCnicNVE7cgUxCOt9Cl0gM+Zvn2czr0ru30awk2ZhAQkJ5z3YiMSXGNId5YpvWZ1mGX4ni7z4\nWSmcvBdRgVRFWCHt4FnOaobBcyNT4HImPsvMJ9NixwKqiTjOjpxmMAgxjetoOR1mmgc9IdcHI27s\nNMtVDGm9W6rX91r+U0X5yLqb5dYpm1qpW/SMPYnLzuupLe0Lo47ipiDS4WOH9yBfxJzFRSfSzX4z\n5bCSNASnBfAjMZTq2eE1wsTPjARP2dPpfZSG1z5our53L+jIzYRM5RbKSMWTlcaYMVS/Ec0k9f0/\n0LM+f5owVEcKZW5kc3RyZWFtCmVuZG9iagoyMCAwIG9iago8PCAvTGVuZ3RoIDUyIC9GaWx0ZXIg\nL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4nDM1MFAwUNC1VNA1MjZVMDUEsg3NTBVSDLng7FwIEySf\nwwVTCWGBpHMQKnO40gBUlw8dCmVuZHN0cmVhbQplbmRvYmoKMjEgMCBvYmoKPDwgL0xlbmd0aCA4\nOCAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeJw1jLsNwDAIRHumuBH4OID3iVKR/dsQ\nWy64e9IT5znAyD4PR+jELWRD4aZ4STmhPlE0Wm86tkhzv7xkMxcV/TPcfYXt5oBkNEnkIdHlcuVZ\nKXo+l9obfgplbmRzdHJlYW0KZW5kb2JqCjIyIDAgb2JqCjw8IC9MZW5ndGggMzM4IC9GaWx0ZXIg\nL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4nDVSOa7dQAzrfQpdIIB2zZznBal+7t+GlF8KQ7RWipqO\nFpVp+WUhVS2TLr/tSW2JG/L3yQqJE5JXJdqlDJFQ+TyFVL9ny7y+1pwRIEuVCpOTksclC/4Ml94u\nHOdjaz+PI3c9emBVjIQSAcsUE6NrWTq7w5qN/DymAT/iEXKuWLccYxVIDbpx2hXvQ/N5yBogZpiW\nigpdVokWfkHxoEetffdYVFgg0e0cSXCMjVCRgHaB2kgMObMWu6gv+lmUmAl07Ysi7qLAEknMnGJd\nOvoPPnQsqL8248uvjkr6SCtrTNp3o0lpzCKTrpdFbzdvfT24QPMuyn9ezSBBU9YoaXzQqp1jKJoZ\nZYV3HJoMNMcch8wTPIczEpT0fSh+X0smuiiRPw4NoX9fHqOMnAZvAXPRn7aKAxfx2WGvHGCF0sWa\n5H1AKhN6YPr/1/h5/vwDHLaAVAplbmRzdHJlYW0KZW5kb2JqCjIzIDAgb2JqCjw8IC9MZW5ndGgg\nODAgL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCnicRYy7DcAwCER7pmAEfiZmnyiVs38b\nIErccE+6e7g6EjJT3mGGhwSeDCyGU/EGmaNgNbhGUo2d7KOwbl91geZ6U6v19wcqT3Z2cT3Nyxn0\nCmVuZHN0cmVhbQplbmRvYmoKMjQgMCBvYmoKPDwgL0xlbmd0aCA3MiAvRmlsdGVyIC9GbGF0ZURl\nY29kZSA+PgpzdHJlYW0KeJw1jLERwDAIA3um0Ag2WGDvk0tF9m9DfE4DLx0Pl6LBWg26giNwdan8\n0SNduSlFl2POguFxql9IMUY9qCPj3sdPuV9wFhJ9CmVuZHN0cmVhbQplbmRvYmoKMjUgMCBvYmoK\nPDwgL0xlbmd0aCAxNjAgL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCnicPZBLEsMgDEP3\nnEJHwPh/nnS6Su6/rQ2dbLAYhPTAfWIioxYngq/EhwalwyTwbBWEezDZEXKE5ARNhrKDJHENDQal\nwqZjme/JpnXSSqy80X7ZdzRmnXSKLUWHdiH/5/Ui3KPgGusZPA9gMcjaSqXsmTBaZaau8qjotR/T\n4T0PRKvF5fUGrvDaRzepKCpL6v5EdzTY/pG3+x7fH5llOCQKZW5kc3RyZWFtCmVuZG9iagoyNiAw\nIG9iago8PCAvTGVuZ3RoIDI0OCAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeJwtUTmS\nA0EIy+cVekJz0++xy5H3/+kKygGDhkMgOi1xUMZPEJYr3vLIVbTh75kYwXfBod/KdRsWORAVSNIY\nVE2oXbwevQd2HGYC86Q1LIMZ6wM/Ywo3enF4TMbZ7XUZNQR712tPZlAyKxdxycQFU3XYyJnDT6aM\nC+1czw3IuRHWZRikm5XGjIQjTSFSSKHqJqkzQZAEo6tRo40cxX7pyyOdYVUjagz7XEvb13MTzho0\nOxarPDmlR1ecy8nFCysH/bzNwEVUGqs8EBJwv9tD/Zzs5Dfe0rmzxfT4XnOyvDAVWPHmtRuQTbX4\nNy/i+D3j6/n8A6ilWxYKZW5kc3RyZWFtCmVuZG9iagoyNyAwIG9iago8PCAvTGVuZ3RoIDI1OSAv\nRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeJw9UklywzAMu/sVfAJ3Se9Jpyfn/9cC9NSX\nEGOKAAimd4vK2fhpK1l+5McuO0sit3wHbZP7iqoHpG6CzCXHJVeIWcrnSpBYtJSZWJ+pDsrPNahV\n+MJPzExMhyQRS8hJPYqwfl4H96B+vaTzW2T8o2OD0luSTAWdGu6Vo5TYsFSfGuQeNN2UVp+ZdmUH\nLI03ZKUmdfr10+MHSzClLxLRQYjEn+RyhywLKQfxdq7eQHhXuyDVUysPO0Saj5HeUgWrOTMBS0bT\nDiNgbdaYIFUCvEVrCLQW4vKFTisiPjk3dDBNVZ6FyLBS4Vh7z2gNF7qGvNJwepJx//kfvCve1+8f\n2vNmZAplbmRzdHJlYW0KZW5kb2JqCjE0IDAgb2JqCjw8IC9TdWJ0eXBlIC9UeXBlMyAvQmFzZUZv\nbnQgL0RlamFWdVNhbnMgL05hbWUgL0RlamFWdVNhbnMgL0ZpcnN0Q2hhciAwCi9UeXBlIC9Gb250\nIC9DaGFyUHJvY3MgMTUgMCBSIC9Gb250QkJveCBbIC0xMDIxIC00NjMgMTc5NCAxMjMzIF0KL0Vu\nY29kaW5nIDw8Ci9EaWZmZXJlbmNlcyBbIDQ5IC9vbmUgL3R3byAvdGhyZWUgNjUgL0EgL0IgL0Mg\nL0QgL0UgNzcgL00gODggL1ggOTUgL3VuZGVyc2NvcmUgMTE4IC92Cl0KL1R5cGUgL0VuY29kaW5n\nID4+Ci9Gb250RGVzY3JpcHRvciAxMyAwIFIgL0xhc3RDaGFyIDI1NSAvRm9udE1hdHJpeCBbIDAu\nMDAxIDAgMCAwLjAwMSAwIDAgXQovV2lkdGhzIDEyIDAgUiA+PgplbmRvYmoKMTMgMCBvYmoKPDwg\nL1N0ZW1WIDAgL01heFdpZHRoIDEzNDIgL0ZvbnRCQm94IFsgLTEwMjEgLTQ2MyAxNzk0IDEyMzMg\nXQovRm9udE5hbWUgL0RlamFWdVNhbnMgL1hIZWlnaHQgMCAvRmxhZ3MgMzIgL0NhcEhlaWdodCAw\nIC9Bc2NlbnQgOTI5Ci9JdGFsaWNBbmdsZSAwIC9EZXNjZW50IC0yMzYgL1R5cGUgL0ZvbnREZXNj\ncmlwdG9yID4+CmVuZG9iagoxMiAwIG9iagpbIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2\nMDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwCjYwMCA2MDAgNjAwIDYw\nMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgMzE4IDQwMSA0NjAgODM4\nIDYzNgo5NTAgNzgwIDI3NSAzOTAgMzkwIDUwMCA4MzggMzE4IDM2MSAzMTggMzM3IDYzNiA2MzYg\nNjM2IDYzNiA2MzYgNjM2IDYzNiA2MzYKNjM2IDYzNiAzMzcgMzM3IDgzOCA4MzggODM4IDUzMSAx\nMDAwIDY4NCA2ODYgNjk4IDc3MCA2MzIgNTc1IDc3NSA3NTIgMjk1CjI5NSA2NTYgNTU3IDg2MyA3\nNDggNzg3IDYwMyA3ODcgNjk1IDYzNSA2MTEgNzMyIDY4NCA5ODkgNjg1IDYxMSA2ODUgMzkwIDMz\nNwozOTAgODM4IDUwMCA1MDAgNjEzIDYzNSA1NTAgNjM1IDYxNSAzNTIgNjM1IDYzNCAyNzggMjc4\nIDU3OSAyNzggOTc0IDYzNCA2MTIKNjM1IDYzNSA0MTEgNTIxIDM5MiA2MzQgNTkyIDgxOCA1OTIg\nNTkyIDUyNSA2MzYgMzM3IDYzNiA4MzggNjAwIDYzNiA2MDAgMzE4CjM1MiA1MTggMTAwMCA1MDAg\nNTAwIDUwMCAxMzQyIDYzNSA0MDAgMTA3MCA2MDAgNjg1IDYwMCA2MDAgMzE4IDMxOCA1MTggNTE4\nCjU5MCA1MDAgMTAwMCA1MDAgMTAwMCA1MjEgNDAwIDEwMjMgNjAwIDUyNSA2MTEgMzE4IDQwMSA2\nMzYgNjM2IDYzNiA2MzYgMzM3CjUwMCA1MDAgMTAwMCA0NzEgNjEyIDgzOCAzNjEgMTAwMCA1MDAg\nNTAwIDgzOCA0MDEgNDAxIDUwMCA2MzYgNjM2IDMxOCA1MDAKNDAxIDQ3MSA2MTIgOTY5IDk2OSA5\nNjkgNTMxIDY4NCA2ODQgNjg0IDY4NCA2ODQgNjg0IDk3NCA2OTggNjMyIDYzMiA2MzIgNjMyCjI5\nNSAyOTUgMjk1IDI5NSA3NzUgNzQ4IDc4NyA3ODcgNzg3IDc4NyA3ODcgODM4IDc4NyA3MzIgNzMy\nIDczMiA3MzIgNjExIDYwNQo2MzAgNjEzIDYxMyA2MTMgNjEzIDYxMyA2MTMgOTgyIDU1MCA2MTUg\nNjE1IDYxNSA2MTUgMjc4IDI3OCAyNzggMjc4IDYxMiA2MzQKNjEyIDYxMiA2MTIgNjEyIDYxMiA4\nMzggNjEyIDYzNCA2MzQgNjM0IDYzNCA1OTIgNjM1IDU5MiBdCmVuZG9iagoxNSAwIG9iago8PCAv\nWCAxNiAwIFIgL0UgMTcgMCBSIC9NIDE4IDAgUiAvdW5kZXJzY29yZSAyMCAwIFIgL0MgMTkgMCBS\nIC9BIDIxIDAgUgovdiAyNCAwIFIgL3RocmVlIDIyIDAgUiAvRCAyNSAwIFIgL29uZSAyMyAwIFIg\nL3R3byAyNiAwIFIgL0IgMjcgMCBSID4+CmVuZG9iagozIDAgb2JqCjw8IC9GMSAxNCAwIFIgPj4K\nZW5kb2JqCjQgMCBvYmoKPDwgPj4KZW5kb2JqCjUgMCBvYmoKPDwgPj4KZW5kb2JqCjYgMCBvYmoK\nPDwgPj4KZW5kb2JqCjcgMCBvYmoKPDwgPj4KZW5kb2JqCjIgMCBvYmoKPDwgL0NvdW50IDEgL0tp\nZHMgWyAxMCAwIFIgXSAvVHlwZSAvUGFnZXMgPj4KZW5kb2JqCjI4IDAgb2JqCjw8IC9Qcm9kdWNl\nciAobWF0cGxvdGxpYiBwZGYgYmFja2VuZCkKL0NyZWF0b3IgKG1hdHBsb3RsaWIgMi4wLjAsIGh0\ndHA6Ly9tYXRwbG90bGliLm9yZykKL0NyZWF0aW9uRGF0ZSAoRDoyMDE3MDMxNzEwNTI1NCswMicw\nMCcpID4+CmVuZG9iagp4cmVmCjAgMjkKMDAwMDAwMDAwMCA2NTUzNSBmIAowMDAwMDAwMDE2IDAw\nMDAwIG4gCjAwMDAwMDYwNzYgMDAwMDAgbiAKMDAwMDAwNTk2MCAwMDAwMCBuIAowMDAwMDA1OTky\nIDAwMDAwIG4gCjAwMDAwMDYwMTMgMDAwMDAgbiAKMDAwMDAwNjAzNCAwMDAwMCBuIAowMDAwMDA2\nMDU1IDAwMDAwIG4gCjAwMDAwMDAwNjUgMDAwMDAgbiAKMDAwMDAwMDM5OCAwMDAwMCBuIAowMDAw\nMDAwMjA4IDAwMDAwIG4gCjAwMDAwMDE1MTAgMDAwMDAgbiAKMDAwMDAwNDc0OCAwMDAwMCBuIAow\nMDAwMDA0NTQ4IDAwMDAwIG4gCjAwMDAwMDQxODMgMDAwMDAgbiAKMDAwMDAwNTgwMSAwMDAwMCBu\nIAowMDAwMDAxNTMxIDAwMDAwIG4gCjAwMDAwMDE2OTEgMDAwMDAgbiAKMDAwMDAwMTg0MiAwMDAw\nMCBuIAowMDAwMDAyMDAxIDAwMDAwIG4gCjAwMDAwMDIzMDYgMDAwMDAgbiAKMDAwMDAwMjQzMCAw\nMDAwMCBuIAowMDAwMDAyNTkwIDAwMDAwIG4gCjAwMDAwMDMwMDEgMDAwMDAgbiAKMDAwMDAwMzE1\nMyAwMDAwMCBuIAowMDAwMDAzMjk3IDAwMDAwIG4gCjAwMDAwMDM1MzAgMDAwMDAgbiAKMDAwMDAw\nMzg1MSAwMDAwMCBuIAowMDAwMDA2MTM2IDAwMDAwIG4gCnRyYWlsZXIKPDwgL1Jvb3QgMSAwIFIg\nL0luZm8gMjggMCBSIC9TaXplIDI5ID4+CnN0YXJ0eHJlZgo2Mjg0CiUlRU9GCg==\n", "image/png": "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\n/H+ieuKtL2xjbwAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_helper.plot_loop()" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [], "source": [ "model = Model()\n", "model.add_metabolites([Metabolite(i) for i in \"ABC\"])\n", "model.add_reactions([Reaction(i) for i in [\"EX_A\", \"DM_C\", \"v1\", \"v2\", \"v3\"]])\n", "\n", "model.reactions.EX_A.add_metabolites({\"A\": 1})\n", "model.reactions.DM_C.add_metabolites({\"C\": -1})\n", "\n", "model.reactions.v1.add_metabolites({\"A\": -1, \"B\": 1})\n", "model.reactions.v2.add_metabolites({\"B\": -1, \"C\": 1})\n", "model.reactions.v3.add_metabolites({\"C\": -1, \"A\": 1})\n", "\n", "model.objective = 'DM_C'" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "While this model contains a loop, a flux state exists which has no flux through reaction v$_3$, and is identified by loopless FBA." ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "loopless solution: status = optimal\n", "loopless solution flux: v3 = 0.0\n" ] } ], "source": [ "with model:\n", " add_loopless(model)\n", " solution = model.optimize()\n", "print(\"loopless solution: status = \" + solution.status)\n", "print(\"loopless solution flux: v3 = %.1f\" % solution.fluxes[\"v3\"])" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "If there is no forced flux through a loopless reaction, parsimonious FBA will also have no flux through the loop." ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "parsimonious solution: status = optimal\n", "loopless solution flux: v3 = 0.0\n" ] } ], "source": [ "solution = pfba(model)\n", "print(\"parsimonious solution: status = \" + solution.status)\n", "print(\"loopless solution flux: v3 = %.1f\" % solution.fluxes[\"v3\"])" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "However, if flux is forced through v$_3$, then there is no longer a feasible loopless solution, but the parsimonious solution will still exist." ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "model is infeasible\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "cobra/util/solver.py:398 \u001b[1;31mUserWarning\u001b[0m: solver status is 'infeasible'\n" ] } ], "source": [ "model.reactions.v3.lower_bound = 1\n", "with model:\n", " add_loopless(model)\n", " try:\n", " solution = model.optimize()\n", " except:\n", " print('model is infeasible')" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "parsimonious solution: status = optimal\n", "loopless solution flux: v3 = 1.0\n" ] } ], "source": [ "solution = pfba(model)\n", "print(\"parsimonious solution: status = \" + solution.status)\n", "print(\"loopless solution flux: v3 = %.1f\" % solution.fluxes[\"v3\"])" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "## Method" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "`loopless_solution` is based on a given reference flux distribution. It will look for a new flux distribution with the following requirements:\n", "\n", "1. The objective value is the same as in the reference fluxes.\n", "2. All exchange fluxes have the same value as in the reference distribution.\n", "3. All non-exchange fluxes have the same sign (flow in the same direction) as the reference fluxes.\n", "4. The sum of absolute non-exchange fluxes is minimized.\n", "\n", "As proven in the [original publication](http://dx.doi.org/10.1093/bioinformatics/btv096) this will identify the \"least-loopy\" solution closest to the reference fluxes.\n", "\n", "If you are using `add_loopless` this will use the method [described here](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3030201/). In summary, it will add $G \\approx \\Delta G$ proxy variables and make loops thermodynamically infeasible. This is achieved by the following formulation.\n", "\n", "$$\n", "\\begin{eqnarray}\n", "&\\text{maximize } v_{obj} \\\\\n", "s.t. & Sv = 0\\\\\n", "& lb_j \\leq v_j \\leq ub_j \\\\\n", "& -M\\cdot (1 - a_i) \\leq v_i \\leq M\\cdot a_i\\\\\n", "& -1000a_i + (1 - a_i) \\leq G_i \\leq -a_i + 1000(1 - a_i)\\\\\n", "& N_{int}G = 0\\\\\n", "& a_i \\in \\{0, 1\\}\n", "\\end{eqnarray}\n", "$$\n", "\n", "Here the index j runs over all reactions and the index i only over internal ones. $a_i$ are indicator variables which equal one if the reaction flux flows in hte forward direction and 0 otherwise. They are used to force the G proxies to always carry the opposite sign of the flux (as it is the case for the \"real\" $\\Delta G$ values). $N_{int}$ is the nullspace matrix for internal reactions and is used to find thermodinamically \"correct\" values for G. \n" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.5.2" } }, "nbformat": 4, "nbformat_minor": 0 }