Skip to content

Commit c464cc8

Browse files
committed
Better redundancy handling and bug fixes.
1 parent a12068d commit c464cc8

File tree

8 files changed

+10522
-63
lines changed

8 files changed

+10522
-63
lines changed

corda/corda.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
TOL = 1e-6 # Tolerance to judge whether a flux is non-zero
1919
UPPER = 1e6 # default upper bound
20+
UN = (1e-6, 1e-4) # uniform noise
2021

2122

2223
class CORDA(object):
@@ -119,18 +120,17 @@ def __init__(self, model, confidence, met_prod=None, n=5,
119120
self.tflux = 1
120121
self.impossible = []
121122
self.n = n
122-
self.noise = 0.1
123123
self.support = support
124124
self.pf = penalty_factor
125125
self.solver = solver_dict[get_solver_name() if solver is None
126126
else solver]
127127
self.sargs = solver_kwargs
128128

129129
def __perturb(self, lp, pen):
130-
noise = np.random.uniform(high=self.noise, size=len(pen))
130+
noise = np.random.uniform(low=UN[0], high=UN[1], size=len(pen))
131131

132132
for i, p in enumerate(pen):
133-
if p > 0.0:
133+
if p < 2.0:
134134
self.solver.change_variable_objective(lp, i, p + noise[i])
135135

136136
def __quiet_solve(self, lp, os):
@@ -154,8 +154,8 @@ def __reduce_conf(self, conf):
154154
red_conf = dict.fromkeys(rids, -1)
155155

156156
for k, v in conf.items():
157-
k = k.replace("_reverse", "")
158-
red_conf[k] = max(red_conf[k], v)
157+
kr = k.replace("_reverse", "")
158+
red_conf[kr] = max(red_conf[kr], v)
159159
return red_conf
160160

161161
def associated(self, targets, conf=None, penalize_medium=True):
@@ -309,7 +309,7 @@ def info(self, reversible=True):
309309
" - high: {}\n".format(old_counts[3])
310310
else:
311311
old = np.array([conf_old[k] for k in conf_old])
312-
new = np.array([conf[k] for k in conf])
312+
new = np.array([conf[k] for k in conf_old])
313313
med_inc = np.sum(((old == 1) | (old == 2)) & (new == 3))
314314
noc_inc = np.sum((old == -1) & (new == 3))
315315
free_inc = np.sum((old == 0) & (new == 3))

docs/Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
all:
2-
jupyter-nbconvert *.ipynb
2+
jupyter-nbconvert --execute *.ipynb

docs/index.html

Lines changed: 68 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -11951,7 +11951,7 @@ <h2 id="A-small-example">A small example<a class="anchor-link" href="#A-small-ex
1195111951
<div class="input_area">
1195211952
<div class=" highlight hl-ipython3"><pre><span></span><span class="kn">from</span> <span class="nn">corda</span> <span class="k">import</span> <span class="n">CORDA</span>
1195311953

11954-
<span class="n">opt</span> <span class="o">=</span> <span class="n">CORDA</span><span class="p">(</span><span class="n">mod</span><span class="p">,</span> <span class="n">conf</span><span class="p">)</span>
11954+
<span class="n">opt</span> <span class="o">=</span> <span class="n">CORDA</span><span class="p">(</span><span class="n">mod</span><span class="p">,</span> <span class="n">conf</span><span class="p">,</span> <span class="n">n</span><span class="o">=</span><span class="mi">20</span><span class="p">)</span>
1195511955
<span class="n">opt</span><span class="o">.</span><span class="n">build</span><span class="p">()</span>
1195611956
<span class="nb">print</span><span class="p">(</span><span class="n">opt</span><span class="p">)</span>
1195711957
</pre></div>
@@ -11967,9 +11967,9 @@ <h2 id="A-small-example">A small example<a class="anchor-link" href="#A-small-ex
1196711967
<div class="output_area"><div class="prompt"></div>
1196811968
<div class="output_subarea output_stream output_stdout output_text">
1196911969
<pre>build status: reconstruction complete
11970-
Inc. reactions: 32/60
11970+
Inc. reactions: 28/60
1197111971
- unclear: 0/0
11972-
- exclude: 31/59
11972+
- exclude: 27/59
1197311973
- low and medium: 0/0
1197411974
- high: 1/1
1197511975

@@ -11986,7 +11986,7 @@ <h2 id="A-small-example">A small example<a class="anchor-link" href="#A-small-ex
1198611986
</div>
1198711987
<div class="inner_cell">
1198811988
<div class="text_cell_render border-box-sizing rendered_html">
11989-
<p>The metric you see are for reversible reactions. We can obtain the irreversible reconstruction metrics by using:</p>
11989+
<p>The metric you sare for reversible reactions. We can obtain the irreversible reconstruction metrics by using:</p>
1199011990

1199111991
</div>
1199211992
</div>
@@ -12010,9 +12010,9 @@ <h2 id="A-small-example">A small example<a class="anchor-link" href="#A-small-ex
1201012010
<div class="output_area"><div class="prompt"></div>
1201112011
<div class="output_subarea output_stream output_stdout output_text">
1201212012
<pre>build status: reconstruction complete
12013-
Inc. reactions: 32/101
12013+
Inc. reactions: 28/101
1201412014
- unclear: 0/0
12015-
- exclude: 31/100
12015+
- exclude: 27/100
1201612016
- low and medium: 0/0
1201712017
- high: 1/1
1201812018

@@ -12029,7 +12029,44 @@ <h2 id="A-small-example">A small example<a class="anchor-link" href="#A-small-ex
1202912029
</div>
1203012030
<div class="inner_cell">
1203112031
<div class="text_cell_render border-box-sizing rendered_html">
12032-
<p>This gives a reconstruction that looks like this (red denotes included reactions):
12032+
<p>In order to see the list of reactions in the reconstructed model without specifically creating the new model you can use the following snippet.</p>
12033+
12034+
</div>
12035+
</div>
12036+
</div>
12037+
<div class="cell border-box-sizing code_cell rendered">
12038+
<div class="input">
12039+
<div class="prompt input_prompt">In&nbsp;[7]:</div>
12040+
<div class="inner_cell">
12041+
<div class="input_area">
12042+
<div class=" highlight hl-ipython3"><pre><span></span><span class="nb">print</span><span class="p">([</span><span class="n">opt</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">reactions</span><span class="o">.</span><span class="n">get_by_id</span><span class="p">(</span><span class="n">k</span><span class="p">)</span><span class="o">.</span><span class="n">reaction</span> <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">opt</span><span class="o">.</span><span class="n">conf</span><span class="o">.</span><span class="n">items</span><span class="p">()</span> <span class="k">if</span> <span class="n">v</span> <span class="o">==</span> <span class="mi">3</span><span class="p">])</span>
12043+
</pre></div>
12044+
12045+
</div>
12046+
</div>
12047+
</div>
12048+
12049+
<div class="output_wrapper">
12050+
<div class="output">
12051+
12052+
12053+
<div class="output_area"><div class="prompt"></div>
12054+
<div class="output_subarea output_stream output_stdout output_text">
12055+
<pre>[&#39;adp + pi --&gt; atp&#39;, &#39; --&gt; lac_L&#39;, &#39;ru5p_D --&gt; r5p&#39;, &#39;amp --&gt; &#39;, &#39;lac_L + nad --&gt; nadh + pyr&#39;, &#39; --&gt; adp&#39;, &#39;e4p + f6p --&gt; g3p + s7p&#39;, &#39;f6p + g3p --&gt; e4p + xu5p_D&#39;, &#39;atp + r5p --&gt; amp + prpp&#39;, &#39;g3p + nad + pi --&gt; 13dpg + nadh&#39;, &#39;gln --&gt; glu&#39;, &#39;atp + pyr --&gt; adp + oaa + pi&#39;, &#39; --&gt; g1p&#39;, &#39; --&gt; gln&#39;, &#39;atp + f6p --&gt; adp + fdp&#39;, &#39; --&gt; pi&#39;, &#39;g6p --&gt; f6p&#39;, &#39;13dpg --&gt; 3pg + pi&#39;, &#39;xu5p_D --&gt; ru5p_D&#39;, &#39;0.39253 3pg + 20.7045 atp + 0.15446 cit + 0.38587 glu + 0.35261 oaa + 0.053446 prpp + 0.50563 pyr --&gt; 20.6508 adp + 20.6508 pi&#39;, &#39;nadh --&gt; nad&#39;, &#39;g3p + s7p --&gt; r5p + xu5p_D&#39;, &#39;icit --&gt; cit&#39;, &#39;fdp --&gt; dhap + g3p&#39;, &#39;dhap --&gt; g3p&#39;, &#39;g1p --&gt; g6p&#39;, &#39;glu + nad --&gt; akg + nadh&#39;, &#39;akg + nadh --&gt; icit + nad&#39;]
12056+
</pre>
12057+
</div>
12058+
</div>
12059+
12060+
</div>
12061+
</div>
12062+
12063+
</div>
12064+
<div class="cell border-box-sizing text_cell rendered">
12065+
<div class="prompt input_prompt">
12066+
</div>
12067+
<div class="inner_cell">
12068+
<div class="text_cell_render border-box-sizing rendered_html">
12069+
<p>This gives a reconstruction that looks like this (orange denotes included reactions):
1203312070
<img src="reconstruction.png" alt="reconstruction"></p>
1203412071

1203512072
</div>
@@ -12047,7 +12084,7 @@ <h2 id="A-small-example">A small example<a class="anchor-link" href="#A-small-ex
1204712084
</div>
1204812085
<div class="cell border-box-sizing code_cell rendered">
1204912086
<div class="input">
12050-
<div class="prompt input_prompt">In&nbsp;[7]:</div>
12087+
<div class="prompt input_prompt">In&nbsp;[8]:</div>
1205112088
<div class="inner_cell">
1205212089
<div class="input_area">
1205312090
<div class=" highlight hl-ipython3"><pre><span></span><span class="n">opt</span> <span class="o">=</span> <span class="n">CORDA</span><span class="p">(</span><span class="n">mod</span><span class="p">,</span> <span class="n">conf</span><span class="p">,</span> <span class="n">met_prod</span><span class="o">=</span><span class="s2">&quot;pep&quot;</span><span class="p">)</span>
@@ -12066,9 +12103,9 @@ <h2 id="A-small-example">A small example<a class="anchor-link" href="#A-small-ex
1206612103
<div class="output_area"><div class="prompt"></div>
1206712104
<div class="output_subarea output_stream output_stdout output_text">
1206812105
<pre>build status: reconstruction complete
12069-
Inc. reactions: 38/61
12106+
Inc. reactions: 31/61
1207012107
- unclear: 0/0
12071-
- exclude: 36/59
12108+
- exclude: 29/59
1207212109
- low and medium: 0/0
1207312110
- high: 2/2
1207412111

@@ -12092,11 +12129,10 @@ <h2 id="A-small-example">A small example<a class="anchor-link" href="#A-small-ex
1209212129
</div>
1209312130
<div class="cell border-box-sizing code_cell rendered">
1209412131
<div class="input">
12095-
<div class="prompt input_prompt">In&nbsp;[8]:</div>
12132+
<div class="prompt input_prompt">In&nbsp;[9]:</div>
1209612133
<div class="inner_cell">
1209712134
<div class="input_area">
1209812135
<div class=" highlight hl-ipython3"><pre><span></span><span class="n">rec</span> <span class="o">=</span> <span class="n">opt</span><span class="o">.</span><span class="n">cobra_model</span><span class="p">(</span><span class="s2">&quot;plus_pep&quot;</span><span class="p">)</span>
12099-
<span class="nb">print</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">rec</span><span class="o">.</span><span class="n">reactions</span><span class="p">))</span>
1210012136
<span class="n">use</span> <span class="o">=</span> <span class="n">rec</span><span class="o">.</span><span class="n">metabolites</span><span class="o">.</span><span class="n">pep</span><span class="o">.</span><span class="n">reactions</span>
1210112137
<span class="k">for</span> <span class="n">r</span> <span class="ow">in</span> <span class="n">use</span><span class="p">:</span> <span class="nb">print</span><span class="p">(</span><span class="n">r</span><span class="o">.</span><span class="n">reaction</span><span class="p">)</span>
1210212138
</pre></div>
@@ -12111,9 +12147,7 @@ <h2 id="A-small-example">A small example<a class="anchor-link" href="#A-small-ex
1211112147

1211212148
<div class="output_area"><div class="prompt"></div>
1211312149
<div class="output_subarea output_stream output_stdout output_text">
12114-
<pre>37
12115-
gtp + oaa &lt;=&gt; gdp + pep
12116-
2pg &lt;=&gt; pep
12150+
<pre>2pg &lt;=&gt; pep
1211712151
</pre>
1211812152
</div>
1211912153
</div>
@@ -12127,14 +12161,15 @@ <h2 id="A-small-example">A small example<a class="anchor-link" href="#A-small-ex
1212712161
</div>
1212812162
<div class="inner_cell">
1212912163
<div class="text_cell_render border-box-sizing rendered_html">
12130-
<p>By default CORDA uses redundancy. This means, in case there are several minimal pathways to reach your objective, CORDA will include several of those (which is good since it gives your model some robustness). If we do not want that feature we can modify the parameter n in the CORDA initializer which denotes the maximum number of redundant pathways to include.</p>
12164+
<p>This is the unique solution for that additional constraint because it only includes 2 new reactions (3pg --&gt; 2pg --&gt; pep). The alternative would be using oxaloacetate, however that would require an additional import og GTP and a sink for GDP and would thus be more expensive (3 reactions).</p>
12165+
<p>By default CORDA uses redundancy. This means, in case there are several minimal pathways to reach your objective, CORDA will include several of those (which is good since it gives your model some robustness). In this case this did not happen since the best solution was unique. If we do not want that feature we can modify the parameter n in the CORDA initializer which denotes the maximum number of redundant pathways to include.</p>
1213112166

1213212167
</div>
1213312168
</div>
1213412169
</div>
1213512170
<div class="cell border-box-sizing code_cell rendered">
1213612171
<div class="input">
12137-
<div class="prompt input_prompt">In&nbsp;[9]:</div>
12172+
<div class="prompt input_prompt">In&nbsp;[10]:</div>
1213812173
<div class="inner_cell">
1213912174
<div class="input_area">
1214012175
<div class=" highlight hl-ipython3"><pre><span></span><span class="n">opt</span> <span class="o">=</span> <span class="n">CORDA</span><span class="p">(</span><span class="n">mod</span><span class="p">,</span> <span class="n">conf</span><span class="p">,</span> <span class="n">met_prod</span><span class="o">=</span><span class="s2">&quot;pep&quot;</span><span class="p">,</span> <span class="n">n</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
@@ -12156,8 +12191,8 @@ <h2 id="A-small-example">A small example<a class="anchor-link" href="#A-small-ex
1215612191

1215712192
<div class="output_area"><div class="prompt"></div>
1215812193
<div class="output_subarea output_stream output_stdout output_text">
12159-
<pre>33
12160-
gtp + oaa &lt;=&gt; gdp + pep
12194+
<pre>30
12195+
2pg &lt;=&gt; pep
1216112196
</pre>
1216212197
</div>
1216312198
</div>
@@ -12171,10 +12206,23 @@ <h2 id="A-small-example">A small example<a class="anchor-link" href="#A-small-ex
1217112206
</div>
1217212207
<div class="inner_cell">
1217312208
<div class="text_cell_render border-box-sizing rendered_html">
12174-
<p>As we can see we can now produce pep via oaa alone. However, the model will now be less robust to deletions.</p>
12209+
<p>Which gives the same solution in that case.</p>
1217512210

1217612211
</div>
1217712212
</div>
12213+
</div>
12214+
<div class="cell border-box-sizing code_cell rendered">
12215+
<div class="input">
12216+
<div class="prompt input_prompt">In&nbsp;[11]:</div>
12217+
<div class="inner_cell">
12218+
<div class="input_area">
12219+
<div class=" highlight hl-ipython3"><pre><span></span>
12220+
</pre></div>
12221+
12222+
</div>
12223+
</div>
12224+
</div>
12225+
1217812226
</div>
1217912227
</div>
1218012228
</div>

0 commit comments

Comments
 (0)