diff --git a/dev/advanced/1_variants/index.html b/dev/advanced/1_variants/index.html
index a0fedb113295696bb18de1fdfc8d1b23ba5a9ee4..470bfb2dea3548f3102dbdf823d1b5c97df27ac4 100644
--- a/dev/advanced/1_variants/index.html
+++ b/dev/advanced/1_variants/index.html
@@ -87,4 +87,4 @@ end</code></pre><p>In turn, these variants can be used in <a href="../../functio
  nothing
  nothing
  [7.47738193404817, 1.8840414375838503e-8, 4.860861010127701, -16.023526104614593, … ]
- [7.47738193404817, 1.8840414375838503e-8, 4.860861010127701, -16.023526104614593, … ]</code></pre></article><nav class="docs-footer"><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> on <span class="colophon-date" title="Wednesday 4 August 2021 13:35">Wednesday 4 August 2021</span>. Using Julia version 1.6.0.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
+ [7.47738193404817, 1.8840414375838503e-8, 4.860861010127701, -16.023526104614593, … ]</code></pre></article><nav class="docs-footer"><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> on <span class="colophon-date" title="Wednesday 4 August 2021 13:58">Wednesday 4 August 2021</span>. Using Julia version 1.6.0.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
diff --git a/dev/advanced/2_custom_model/index.html b/dev/advanced/2_custom_model/index.html
index 84391bb73905312d81b47ae7baa9a8c139aa6854..b980d55af5570244f778b5788024ebf45626ef20 100644
--- a/dev/advanced/2_custom_model/index.html
+++ b/dev/advanced/2_custom_model/index.html
@@ -43,4 +43,4 @@ Dict{String, Float64} with 5 entries:
   &quot;rxn4&quot; =&gt; 1.0
 </code></pre><h2 id="Writing-generic-model-modifications"><a class="docs-heading-anchor" href="#Writing-generic-model-modifications">Writing generic model modifications</a><a id="Writing-generic-model-modifications-1"></a><a class="docs-heading-anchor-permalink" href="#Writing-generic-model-modifications" title="Permalink"></a></h2><p>The custom model structure can also be made compatible with many of the existing variant-generating functions and analysis modifiers.</p><p>The functions prepared for use as &quot;variants&quot; in <a href="../../functions/#COBREXA.screen-Union{Tuple{MetabolicModel}, Tuple{N}, Tuple{T}, Tuple{V}} where {V&lt;:(AbstractVector{T} where T), T&lt;:Tuple, N}"><code>screen</code></a>, usually prefixed by <code>with_</code>, have their generic variants that only call simpler, overloadable functions for each specific model. This choice is based on the overloading dispatch system of Julia. For example,<a href="../../functions/#COBREXA.with_removed_metabolites-Tuple"><code>with_removed_metabolites</code></a> is implemented very generically by reducing the problem to some specific <a href="../../functions/#COBREXA.remove_metabolites-Tuple{CoreModel, Any}"><code>remove_metabolites</code></a> functions selected by the dispatch, as follows:</p><pre><code class="language-julia">with_removed_metabolites(args...; kwargs...) =
     m -&gt; remove_metabolites(m, args...; kwargs...)</code></pre><p>To be able to use <a href="../../functions/#COBREXA.with_removed_metabolites-Tuple"><code>with_removed_metabolites</code></a> in your model, we can just overload the actual inner function. For the simple circular model, the modification might as well look like this:</p><pre><code class="language-julia">COBREXA.remove_metabolites(m::CircularModel, n::Int) =
-    return CircularModel(m.size - n)</code></pre><div class="admonition is-danger"><header class="admonition-header">Functions that generate model variants must be pure</header><div class="admonition-body"><p>Notice that the function is &quot;pure&quot;, i.e., does not make any in-place modifications to the original model structure. That property is required for <a href="../../functions/#COBREXA.screen-Union{Tuple{MetabolicModel}, Tuple{N}, Tuple{T}, Tuple{V}} where {V&lt;:(AbstractVector{T} where T), T&lt;:Tuple, N}"><code>screen</code></a> and other functions to properly and predictably apply the modifications to the model. To expose potential in-place modifications to your codebase, you should instead overload the &quot;bang&quot; counterpart of remove metabolites, called <a href="../../functions/#COBREXA.remove_metabolites!-Tuple{StandardModel, Vector{String}}"><code>remove_metabolites!</code></a>.</p></div></div></article><nav class="docs-footer"><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> on <span class="colophon-date" title="Wednesday 4 August 2021 13:35">Wednesday 4 August 2021</span>. Using Julia version 1.6.0.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
+    return CircularModel(m.size - n)</code></pre><div class="admonition is-danger"><header class="admonition-header">Functions that generate model variants must be pure</header><div class="admonition-body"><p>Notice that the function is &quot;pure&quot;, i.e., does not make any in-place modifications to the original model structure. That property is required for <a href="../../functions/#COBREXA.screen-Union{Tuple{MetabolicModel}, Tuple{N}, Tuple{T}, Tuple{V}} where {V&lt;:(AbstractVector{T} where T), T&lt;:Tuple, N}"><code>screen</code></a> and other functions to properly and predictably apply the modifications to the model. To expose potential in-place modifications to your codebase, you should instead overload the &quot;bang&quot; counterpart of remove metabolites, called <a href="../../functions/#COBREXA.remove_metabolites!-Tuple{StandardModel, Vector{String}}"><code>remove_metabolites!</code></a>.</p></div></div></article><nav class="docs-footer"><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> on <span class="colophon-date" title="Wednesday 4 August 2021 13:58">Wednesday 4 August 2021</span>. Using Julia version 1.6.0.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
diff --git a/dev/advanced/index.html b/dev/advanced/index.html
index 3557ad609af7559cafcc8aa12a8c38ddc4a847c8..6a5c5856b1f24937d1f4ab7bdbd6b7573b3ff521 100644
--- a/dev/advanced/index.html
+++ b/dev/advanced/index.html
@@ -1,2 +1,2 @@
 <!DOCTYPE html>
-<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>Advanced tutorials · COBREXA.jl</title><link href="https://fonts.googleapis.com/css?family=Lato|Roboto+Mono" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.0/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.0/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.0/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.11.1/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL=".."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="../assets/documenter.js"></script><script src="../siteinfo.js"></script><script src="../../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/documenter-dark.css" data-theme-name="documenter-dark" data-theme-primary-dark/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="../assets/themeswap.js"></script><link href="../assets/favicon.ico" rel="icon" type="image/x-icon"/></head><body><div id="documenter"><nav class="docs-sidebar"><a class="docs-logo" href="../"><img class="docs-light-only" src="../assets/logo.svg" alt="COBREXA.jl logo"/><img class="docs-dark-only" src="../assets/logo-dark.svg" alt="COBREXA.jl logo"/></a><div class="docs-package-name"><span class="docs-autofit">COBREXA.jl</span></div><form class="docs-search" action="../search/"><input class="docs-search-query" id="documenter-search-query" name="q" type="text" placeholder="Search docs"/></form><ul class="docs-menu"><li><a class="tocitem" href="../">Home</a></li><li><a class="tocitem" href="../tutorials/">Quickstart tutorials</a></li><li class="is-active"><a class="tocitem" href>Advanced tutorials</a></li><li><a class="tocitem" href="../notebooks/">Examples and notebooks</a></li><li><a class="tocitem" href="../functions/">Function reference</a></li><li><a class="tocitem" href="../howToContribute/">How to contribute</a></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><nav class="breadcrumb"><ul class="is-hidden-mobile"><li class="is-active"><a href>Advanced tutorials</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href>Advanced tutorials</a></li></ul></nav><div class="docs-right"><a class="docs-edit-link" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/master/docs/src/advanced.md" title="Edit on GitHub"><span class="docs-icon fab"></span><span class="docs-label is-hidden-touch">Edit on GitHub</span></a><a class="docs-settings-button fas fa-cog" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-sidebar-button fa fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a></div></header><article class="content" id="documenter-page"><h1 id="COBREXA-Advanced-tutorials"><a class="docs-heading-anchor" href="#COBREXA-Advanced-tutorials">COBREXA Advanced tutorials</a><a id="COBREXA-Advanced-tutorials-1"></a><a class="docs-heading-anchor-permalink" href="#COBREXA-Advanced-tutorials" title="Permalink"></a></h1><ul><li><a href="1_variants/#Exploring-many-model-variants">Exploring many model variants</a></li><ul><li><a href="1_variants/#Variant-specification">Variant specification</a></li><li><a href="1_variants/#Writing-custom-variant-functions">Writing custom variant functions</a></li><li><a href="1_variants/#Passing-extra-arguments-to-the-analysis-function">Passing extra arguments to the analysis function</a></li></ul><li><a href="2_custom_model/#Working-with-custom-models">Working with custom models</a></li><ul><li><a href="2_custom_model/#Writing-the-generic-accessors">Writing the generic accessors</a></li><li><a href="2_custom_model/#Writing-generic-model-modifications">Writing generic model modifications</a></li></ul></ul></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="../tutorials/">« Quickstart tutorials</a><a class="docs-footer-nextpage" href="../notebooks/">Examples and notebooks »</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> on <span class="colophon-date" title="Wednesday 4 August 2021 13:35">Wednesday 4 August 2021</span>. Using Julia version 1.6.0.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
+<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>Advanced tutorials · COBREXA.jl</title><link href="https://fonts.googleapis.com/css?family=Lato|Roboto+Mono" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.0/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.0/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.0/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.11.1/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL=".."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="../assets/documenter.js"></script><script src="../siteinfo.js"></script><script src="../../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/documenter-dark.css" data-theme-name="documenter-dark" data-theme-primary-dark/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="../assets/themeswap.js"></script><link href="../assets/favicon.ico" rel="icon" type="image/x-icon"/></head><body><div id="documenter"><nav class="docs-sidebar"><a class="docs-logo" href="../"><img class="docs-light-only" src="../assets/logo.svg" alt="COBREXA.jl logo"/><img class="docs-dark-only" src="../assets/logo-dark.svg" alt="COBREXA.jl logo"/></a><div class="docs-package-name"><span class="docs-autofit">COBREXA.jl</span></div><form class="docs-search" action="../search/"><input class="docs-search-query" id="documenter-search-query" name="q" type="text" placeholder="Search docs"/></form><ul class="docs-menu"><li><a class="tocitem" href="../">Home</a></li><li><a class="tocitem" href="../tutorials/">Quickstart tutorials</a></li><li class="is-active"><a class="tocitem" href>Advanced tutorials</a></li><li><a class="tocitem" href="../notebooks/">Examples and notebooks</a></li><li><a class="tocitem" href="../functions/">Function reference</a></li><li><a class="tocitem" href="../howToContribute/">How to contribute</a></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><nav class="breadcrumb"><ul class="is-hidden-mobile"><li class="is-active"><a href>Advanced tutorials</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href>Advanced tutorials</a></li></ul></nav><div class="docs-right"><a class="docs-edit-link" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/master/docs/src/advanced.md" title="Edit on GitHub"><span class="docs-icon fab"></span><span class="docs-label is-hidden-touch">Edit on GitHub</span></a><a class="docs-settings-button fas fa-cog" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-sidebar-button fa fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a></div></header><article class="content" id="documenter-page"><h1 id="COBREXA-Advanced-tutorials"><a class="docs-heading-anchor" href="#COBREXA-Advanced-tutorials">COBREXA Advanced tutorials</a><a id="COBREXA-Advanced-tutorials-1"></a><a class="docs-heading-anchor-permalink" href="#COBREXA-Advanced-tutorials" title="Permalink"></a></h1><ul><li><a href="1_variants/#Exploring-many-model-variants">Exploring many model variants</a></li><ul><li><a href="1_variants/#Variant-specification">Variant specification</a></li><li><a href="1_variants/#Writing-custom-variant-functions">Writing custom variant functions</a></li><li><a href="1_variants/#Passing-extra-arguments-to-the-analysis-function">Passing extra arguments to the analysis function</a></li></ul><li><a href="2_custom_model/#Working-with-custom-models">Working with custom models</a></li><ul><li><a href="2_custom_model/#Writing-the-generic-accessors">Writing the generic accessors</a></li><li><a href="2_custom_model/#Writing-generic-model-modifications">Writing generic model modifications</a></li></ul></ul></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="../tutorials/">« Quickstart tutorials</a><a class="docs-footer-nextpage" href="../notebooks/">Examples and notebooks »</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> on <span class="colophon-date" title="Wednesday 4 August 2021 13:58">Wednesday 4 August 2021</span>. Using Julia version 1.6.0.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
diff --git a/dev/functions/index.html b/dev/functions/index.html
index 2a410fa4bd236f2dc91a7e414484602d9d2098a6..d9f28ed3678979a8fdf42b73ee6d9b0d9492e202 100644
--- a/dev/functions/index.html
+++ b/dev/functions/index.html
@@ -1,10 +1,10 @@
 <!DOCTYPE html>
-<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>Function reference · COBREXA.jl</title><link href="https://fonts.googleapis.com/css?family=Lato|Roboto+Mono" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.0/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.0/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.0/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.11.1/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL=".."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="../assets/documenter.js"></script><script src="../siteinfo.js"></script><script src="../../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/documenter-dark.css" data-theme-name="documenter-dark" data-theme-primary-dark/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="../assets/themeswap.js"></script><link href="../assets/favicon.ico" rel="icon" type="image/x-icon"/></head><body><div id="documenter"><nav class="docs-sidebar"><a class="docs-logo" href="../"><img class="docs-light-only" src="../assets/logo.svg" alt="COBREXA.jl logo"/><img class="docs-dark-only" src="../assets/logo-dark.svg" alt="COBREXA.jl logo"/></a><div class="docs-package-name"><span class="docs-autofit">COBREXA.jl</span></div><form class="docs-search" action="../search/"><input class="docs-search-query" id="documenter-search-query" name="q" type="text" placeholder="Search docs"/></form><ul class="docs-menu"><li><a class="tocitem" href="../">Home</a></li><li><a class="tocitem" href="../tutorials/">Quickstart tutorials</a></li><li><a class="tocitem" href="../advanced/">Advanced tutorials</a></li><li><a class="tocitem" href="../notebooks/">Examples and notebooks</a></li><li class="is-active"><a class="tocitem" href>Function reference</a><ul class="internal"><li><a class="tocitem" href="#Base-Types"><span>Base Types</span></a></li><li><a class="tocitem" href="#Model-types-and-contents"><span>Model types and contents</span></a></li><li><a class="tocitem" href="#Base-functions"><span>Base functions</span></a></li><li><a class="tocitem" href="#File-I/O-and-serialization"><span>File I/O and serialization</span></a></li><li><a class="tocitem" href="#Model-reconstruction"><span>Model reconstruction</span></a></li><li><a class="tocitem" href="#Analysis-functions"><span>Analysis functions</span></a></li><li><a class="tocitem" href="#Miscellaneous-utilities"><span>Miscellaneous utilities</span></a></li></ul></li><li><a class="tocitem" href="../howToContribute/">How to contribute</a></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><nav class="breadcrumb"><ul class="is-hidden-mobile"><li class="is-active"><a href>Function reference</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href>Function reference</a></li></ul></nav><div class="docs-right"><a class="docs-edit-link" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/master/docs/src/functions.md" title="Edit on GitHub"><span class="docs-icon fab"></span><span class="docs-label is-hidden-touch">Edit on GitHub</span></a><a class="docs-settings-button fas fa-cog" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-sidebar-button fa fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a></div></header><article class="content" id="documenter-page"><h1 id="Functions"><a class="docs-heading-anchor" href="#Functions">Functions</a><a id="Functions-1"></a><a class="docs-heading-anchor-permalink" href="#Functions" title="Permalink"></a></h1><h2 id="Base-Types"><a class="docs-heading-anchor" href="#Base-Types">Base Types</a><a id="Base-Types-1"></a><a class="docs-heading-anchor-permalink" href="#Base-Types" title="Permalink"></a></h2><article class="docstring"><header><a class="docstring-binding" id="COBREXA.Maybe" href="#COBREXA.Maybe"><code>COBREXA.Maybe</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia">Maybe{T} = Union{Nothing, T}</code></pre><p>A nice name for &quot;nullable&quot; type.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/abstract/Maybe.jl#L2-L6">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA._default-Union{Tuple{T}, Tuple{T, Union{Nothing, T}}} where T" href="#COBREXA._default-Union{Tuple{T}, Tuple{T, Union{Nothing, T}}} where T"><code>COBREXA._default</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">_default(d::T, x::Maybe{T})::T where {T}</code></pre><p>Fold the <code>Maybe{T}</code> down to <code>T</code> by defaulting.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/abstract/Maybe.jl#L9-L13">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA._maybemap-Tuple{Any, Union{Nothing, T} where T}" href="#COBREXA._maybemap-Tuple{Any, Union{Nothing, T} where T}"><code>COBREXA._maybemap</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">_maybemap(f, x::Maybe)::Maybe</code></pre><p>Apply a function to <code>x</code> only if it is not <code>nothing</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/abstract/Maybe.jl#L18-L22">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.Annotations" href="#COBREXA.Annotations"><code>COBREXA.Annotations</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia">Annotations = Dict{String,Vector{String}}</code></pre><p>Dictionary used to store (possible multiple) standardized annotations of something, such as a <a href="#COBREXA.Metabolite"><code>Metabolite</code></a> and a <a href="#COBREXA.Reaction"><code>Reaction</code></a>.</p><p><strong>Example</strong></p><pre><code class="language-none">Annotations(&quot;PubChem&quot; =&gt; [&quot;CID12345&quot;, &quot;CID54321&quot;])</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/abstract/MetabolicModel.jl#L39-L49">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.GeneAssociation" href="#COBREXA.GeneAssociation"><code>COBREXA.GeneAssociation</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia">GeneAssociation = Vector{Vector{String}}</code></pre><p>An association to genes, represented as a logical formula in a positive disjunctive normal form (DNF). (The 2nd-level vectors of strings are connected by &quot;and&quot; to form conjunctions, and the 1st-level vectors of these conjunctions are connected by &quot;or&quot; to form the DNF.)</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/abstract/MetabolicModel.jl#L22-L29">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.MetabolicModel" href="#COBREXA.MetabolicModel"><code>COBREXA.MetabolicModel</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia">abstract type MetabolicModel end</code></pre><p>A helper supertype that wraps everything usable as a linear-like model for COBREXA functions.</p><p>If you want your model type to work with COBREXA, add the <code>MetabolicModel</code> as its supertype, and implement the accessor functions. Accessors <a href="#COBREXA.reactions-Tuple{MetabolicModel}"><code>reactions</code></a>, <a href="#COBREXA.metabolites-Tuple{MetabolicModel}"><code>metabolites</code></a>, <a href="#COBREXA.stoichiometry-Tuple{MetabolicModel}"><code>stoichiometry</code></a>, <a href="#COBREXA.bounds-Tuple{MetabolicModel}"><code>bounds</code></a> and <a href="#COBREXA.objective-Tuple{MetabolicModel}"><code>objective</code></a> must be implemented; others are not mandatory and default to safe &quot;empty&quot; values.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/abstract/MetabolicModel.jl#L2-L13">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.MetaboliteFormula" href="#COBREXA.MetaboliteFormula"><code>COBREXA.MetaboliteFormula</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia">MetaboliteFormula = Dict{String,Int}</code></pre><p>Dictionary of atoms and their abundances in a molecule.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/abstract/MetabolicModel.jl#L32-L36">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.Notes" href="#COBREXA.Notes"><code>COBREXA.Notes</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia">Notes = Dict{String,Vector{String}}</code></pre><p>Free-form notes about something (e.g. a <a href="#COBREXA.Gene"><code>Gene</code></a>), categorized by &quot;topic&quot;.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/abstract/MetabolicModel.jl#L52-L57">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.balance-Tuple{MetabolicModel}" href="#COBREXA.balance-Tuple{MetabolicModel}"><code>COBREXA.balance</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">balance(a::MetabolicModel)::SparseVec</code></pre><p>Get the sparse balance vector of a model (ie. the <code>b</code> from <code>S x = b</code>).</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/abstract/MetabolicModel.jl#L116-L120">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.bounds-Tuple{MetabolicModel}" href="#COBREXA.bounds-Tuple{MetabolicModel}"><code>COBREXA.bounds</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">bounds(a::MetabolicModel)::Tuple{SparseVec,SparseVec}</code></pre><p>Get the lower and upper flux bounds of a model.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/abstract/MetabolicModel.jl#L107-L111">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.coupling-Tuple{MetabolicModel}" href="#COBREXA.coupling-Tuple{MetabolicModel}"><code>COBREXA.coupling</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">coupling(a::MetabolicModel)::SparseMat</code></pre><p>Get a matrix of coupling constraint definitions of a model. By default, there is no coupling in the models.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/abstract/MetabolicModel.jl#L134-L139">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.coupling_bounds-Tuple{MetabolicModel}" href="#COBREXA.coupling_bounds-Tuple{MetabolicModel}"><code>COBREXA.coupling_bounds</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">coupling_bounds(a::MetabolicModel)::Tuple{SparseVec,SparseVec}</code></pre><p>Get the lower and upper bounds for each coupling bound in a model, as specified by <code>coupling</code>. By default, the model does not have any coupling bounds.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/abstract/MetabolicModel.jl#L153-L158">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.gene_annotations-Tuple{MetabolicModel, String}" href="#COBREXA.gene_annotations-Tuple{MetabolicModel, String}"><code>COBREXA.gene_annotations</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">gene_annotations(a::MetabolicModel, gene_id::String)::Annotations</code></pre><p>Return standardized names that identify the corresponding gene or product. The dictionary assigns vectors of possible identifiers to identifier system names, e.g. <code>&quot;PDB&quot; =&gt; [&quot;PROT01&quot;]</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/abstract/MetabolicModel.jl#L251-L257">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.gene_notes-Tuple{MetabolicModel, String}" href="#COBREXA.gene_notes-Tuple{MetabolicModel, String}"><code>COBREXA.gene_notes</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">gene_notes(model::MetabolicModel, gene_id::String)::Notes</code></pre><p>Return the notes associated with the gene <code>gene_id</code> in <code>model</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/abstract/MetabolicModel.jl#L280-L284">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.genes-Tuple{MetabolicModel}" href="#COBREXA.genes-Tuple{MetabolicModel}"><code>COBREXA.genes</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">genes(a::MetabolicModel)::Vector{String}</code></pre><p>Return identifiers of all genes contained in the model. By default, there are no genes.</p><p>In SBML, these are usually called &quot;gene products&quot; but we write <code>genes</code> for simplicity.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/abstract/MetabolicModel.jl#L163-L171">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.metabolite_annotations-Tuple{MetabolicModel, String}" href="#COBREXA.metabolite_annotations-Tuple{MetabolicModel, String}"><code>COBREXA.metabolite_annotations</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">metabolite_annotations(a::MetabolicModel, metabolite_id::String)::Annotations</code></pre><p>Return standardized names that may help to reliably identify the metabolite. The dictionary assigns vectors of possible identifiers to identifier system names, e.g. <code>&quot;ChEMBL&quot; =&gt; [&quot;123&quot;]</code> or <code>&quot;PubChem&quot; =&gt; [&quot;CID123&quot;, &quot;CID654645645&quot;]</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/abstract/MetabolicModel.jl#L240-L246">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.metabolite_charge-Tuple{MetabolicModel, String}" href="#COBREXA.metabolite_charge-Tuple{MetabolicModel, String}"><code>COBREXA.metabolite_charge</code></a> — <span class="docstring-category">Method</span></header><section><div><p>metabolite<em>charge(model::MetabolicModel, metabolite</em>id::String)::Maybe{Int}</p><p>Return the charge associated with metabolite <code>metabolite_id</code> in <code>model</code>. Returns <code>nothing</code> if charge not present.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/abstract/MetabolicModel.jl#L219-L224">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.metabolite_compartment-Tuple{MetabolicModel, String}" href="#COBREXA.metabolite_compartment-Tuple{MetabolicModel, String}"><code>COBREXA.metabolite_compartment</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">metabolite_compartment(model::MetabolicModel, metabolite_id::String)::Maybe{String}</code></pre><p>Return the compartment of metabolite <code>metabolite_id</code> in <code>model</code> if it is assigned. If not, return <code>nothing</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/abstract/MetabolicModel.jl#L289-L294">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.metabolite_formula-Tuple{MetabolicModel, String}" href="#COBREXA.metabolite_formula-Tuple{MetabolicModel, String}"><code>COBREXA.metabolite_formula</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">metabolite_formula(
+<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>Function reference · COBREXA.jl</title><link href="https://fonts.googleapis.com/css?family=Lato|Roboto+Mono" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.0/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.0/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.0/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.11.1/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL=".."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="../assets/documenter.js"></script><script src="../siteinfo.js"></script><script src="../../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/documenter-dark.css" data-theme-name="documenter-dark" data-theme-primary-dark/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="../assets/themeswap.js"></script><link href="../assets/favicon.ico" rel="icon" type="image/x-icon"/></head><body><div id="documenter"><nav class="docs-sidebar"><a class="docs-logo" href="../"><img class="docs-light-only" src="../assets/logo.svg" alt="COBREXA.jl logo"/><img class="docs-dark-only" src="../assets/logo-dark.svg" alt="COBREXA.jl logo"/></a><div class="docs-package-name"><span class="docs-autofit">COBREXA.jl</span></div><form class="docs-search" action="../search/"><input class="docs-search-query" id="documenter-search-query" name="q" type="text" placeholder="Search docs"/></form><ul class="docs-menu"><li><a class="tocitem" href="../">Home</a></li><li><a class="tocitem" href="../tutorials/">Quickstart tutorials</a></li><li><a class="tocitem" href="../advanced/">Advanced tutorials</a></li><li><a class="tocitem" href="../notebooks/">Examples and notebooks</a></li><li class="is-active"><a class="tocitem" href>Function reference</a><ul class="internal"><li><a class="tocitem" href="#Base-Types"><span>Base Types</span></a></li><li><a class="tocitem" href="#Model-types-and-contents"><span>Model types and contents</span></a></li><li><a class="tocitem" href="#Base-functions"><span>Base functions</span></a></li><li><a class="tocitem" href="#File-I/O-and-serialization"><span>File I/O and serialization</span></a></li><li><a class="tocitem" href="#Model-reconstruction"><span>Model reconstruction</span></a></li><li><a class="tocitem" href="#Analysis-functions"><span>Analysis functions</span></a></li><li><a class="tocitem" href="#Miscellaneous-utilities"><span>Miscellaneous utilities</span></a></li></ul></li><li><a class="tocitem" href="../howToContribute/">How to contribute</a></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><nav class="breadcrumb"><ul class="is-hidden-mobile"><li class="is-active"><a href>Function reference</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href>Function reference</a></li></ul></nav><div class="docs-right"><a class="docs-edit-link" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/master/docs/src/functions.md" title="Edit on GitHub"><span class="docs-icon fab"></span><span class="docs-label is-hidden-touch">Edit on GitHub</span></a><a class="docs-settings-button fas fa-cog" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-sidebar-button fa fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a></div></header><article class="content" id="documenter-page"><h1 id="Functions"><a class="docs-heading-anchor" href="#Functions">Functions</a><a id="Functions-1"></a><a class="docs-heading-anchor-permalink" href="#Functions" title="Permalink"></a></h1><h2 id="Base-Types"><a class="docs-heading-anchor" href="#Base-Types">Base Types</a><a id="Base-Types-1"></a><a class="docs-heading-anchor-permalink" href="#Base-Types" title="Permalink"></a></h2><article class="docstring"><header><a class="docstring-binding" id="COBREXA.Maybe" href="#COBREXA.Maybe"><code>COBREXA.Maybe</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia">Maybe{T} = Union{Nothing, T}</code></pre><p>A nice name for &quot;nullable&quot; type.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/abstract/Maybe.jl#L2-L6">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA._default-Union{Tuple{T}, Tuple{T, Union{Nothing, T}}} where T" href="#COBREXA._default-Union{Tuple{T}, Tuple{T, Union{Nothing, T}}} where T"><code>COBREXA._default</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">_default(d::T, x::Maybe{T})::T where {T}</code></pre><p>Fold the <code>Maybe{T}</code> down to <code>T</code> by defaulting.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/abstract/Maybe.jl#L9-L13">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA._maybemap-Tuple{Any, Union{Nothing, T} where T}" href="#COBREXA._maybemap-Tuple{Any, Union{Nothing, T} where T}"><code>COBREXA._maybemap</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">_maybemap(f, x::Maybe)::Maybe</code></pre><p>Apply a function to <code>x</code> only if it is not <code>nothing</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/abstract/Maybe.jl#L18-L22">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.Annotations" href="#COBREXA.Annotations"><code>COBREXA.Annotations</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia">Annotations = Dict{String,Vector{String}}</code></pre><p>Dictionary used to store (possible multiple) standardized annotations of something, such as a <a href="#COBREXA.Metabolite"><code>Metabolite</code></a> and a <a href="#COBREXA.Reaction"><code>Reaction</code></a>.</p><p><strong>Example</strong></p><pre><code class="language-none">Annotations(&quot;PubChem&quot; =&gt; [&quot;CID12345&quot;, &quot;CID54321&quot;])</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/abstract/MetabolicModel.jl#L39-L49">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.GeneAssociation" href="#COBREXA.GeneAssociation"><code>COBREXA.GeneAssociation</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia">GeneAssociation = Vector{Vector{String}}</code></pre><p>An association to genes, represented as a logical formula in a positive disjunctive normal form (DNF). (The 2nd-level vectors of strings are connected by &quot;and&quot; to form conjunctions, and the 1st-level vectors of these conjunctions are connected by &quot;or&quot; to form the DNF.)</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/abstract/MetabolicModel.jl#L22-L29">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.MetabolicModel" href="#COBREXA.MetabolicModel"><code>COBREXA.MetabolicModel</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia">abstract type MetabolicModel end</code></pre><p>A helper supertype that wraps everything usable as a linear-like model for COBREXA functions.</p><p>If you want your model type to work with COBREXA, add the <code>MetabolicModel</code> as its supertype, and implement the accessor functions. Accessors <a href="#COBREXA.reactions-Tuple{MetabolicModel}"><code>reactions</code></a>, <a href="#COBREXA.metabolites-Tuple{MetabolicModel}"><code>metabolites</code></a>, <a href="#COBREXA.stoichiometry-Tuple{MetabolicModel}"><code>stoichiometry</code></a>, <a href="#COBREXA.bounds-Tuple{MetabolicModel}"><code>bounds</code></a> and <a href="#COBREXA.objective-Tuple{MetabolicModel}"><code>objective</code></a> must be implemented; others are not mandatory and default to safe &quot;empty&quot; values.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/abstract/MetabolicModel.jl#L2-L13">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.MetaboliteFormula" href="#COBREXA.MetaboliteFormula"><code>COBREXA.MetaboliteFormula</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia">MetaboliteFormula = Dict{String,Int}</code></pre><p>Dictionary of atoms and their abundances in a molecule.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/abstract/MetabolicModel.jl#L32-L36">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.Notes" href="#COBREXA.Notes"><code>COBREXA.Notes</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia">Notes = Dict{String,Vector{String}}</code></pre><p>Free-form notes about something (e.g. a <a href="#COBREXA.Gene"><code>Gene</code></a>), categorized by &quot;topic&quot;.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/abstract/MetabolicModel.jl#L52-L57">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.balance-Tuple{MetabolicModel}" href="#COBREXA.balance-Tuple{MetabolicModel}"><code>COBREXA.balance</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">balance(a::MetabolicModel)::SparseVec</code></pre><p>Get the sparse balance vector of a model (ie. the <code>b</code> from <code>S x = b</code>).</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/abstract/MetabolicModel.jl#L116-L120">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.bounds-Tuple{MetabolicModel}" href="#COBREXA.bounds-Tuple{MetabolicModel}"><code>COBREXA.bounds</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">bounds(a::MetabolicModel)::Tuple{SparseVec,SparseVec}</code></pre><p>Get the lower and upper flux bounds of a model.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/abstract/MetabolicModel.jl#L107-L111">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.coupling-Tuple{MetabolicModel}" href="#COBREXA.coupling-Tuple{MetabolicModel}"><code>COBREXA.coupling</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">coupling(a::MetabolicModel)::SparseMat</code></pre><p>Get a matrix of coupling constraint definitions of a model. By default, there is no coupling in the models.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/abstract/MetabolicModel.jl#L134-L139">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.coupling_bounds-Tuple{MetabolicModel}" href="#COBREXA.coupling_bounds-Tuple{MetabolicModel}"><code>COBREXA.coupling_bounds</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">coupling_bounds(a::MetabolicModel)::Tuple{SparseVec,SparseVec}</code></pre><p>Get the lower and upper bounds for each coupling bound in a model, as specified by <code>coupling</code>. By default, the model does not have any coupling bounds.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/abstract/MetabolicModel.jl#L153-L158">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.gene_annotations-Tuple{MetabolicModel, String}" href="#COBREXA.gene_annotations-Tuple{MetabolicModel, String}"><code>COBREXA.gene_annotations</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">gene_annotations(a::MetabolicModel, gene_id::String)::Annotations</code></pre><p>Return standardized names that identify the corresponding gene or product. The dictionary assigns vectors of possible identifiers to identifier system names, e.g. <code>&quot;PDB&quot; =&gt; [&quot;PROT01&quot;]</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/abstract/MetabolicModel.jl#L251-L257">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.gene_notes-Tuple{MetabolicModel, String}" href="#COBREXA.gene_notes-Tuple{MetabolicModel, String}"><code>COBREXA.gene_notes</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">gene_notes(model::MetabolicModel, gene_id::String)::Notes</code></pre><p>Return the notes associated with the gene <code>gene_id</code> in <code>model</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/abstract/MetabolicModel.jl#L280-L284">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.genes-Tuple{MetabolicModel}" href="#COBREXA.genes-Tuple{MetabolicModel}"><code>COBREXA.genes</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">genes(a::MetabolicModel)::Vector{String}</code></pre><p>Return identifiers of all genes contained in the model. By default, there are no genes.</p><p>In SBML, these are usually called &quot;gene products&quot; but we write <code>genes</code> for simplicity.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/abstract/MetabolicModel.jl#L163-L171">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.metabolite_annotations-Tuple{MetabolicModel, String}" href="#COBREXA.metabolite_annotations-Tuple{MetabolicModel, String}"><code>COBREXA.metabolite_annotations</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">metabolite_annotations(a::MetabolicModel, metabolite_id::String)::Annotations</code></pre><p>Return standardized names that may help to reliably identify the metabolite. The dictionary assigns vectors of possible identifiers to identifier system names, e.g. <code>&quot;ChEMBL&quot; =&gt; [&quot;123&quot;]</code> or <code>&quot;PubChem&quot; =&gt; [&quot;CID123&quot;, &quot;CID654645645&quot;]</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/abstract/MetabolicModel.jl#L240-L246">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.metabolite_charge-Tuple{MetabolicModel, String}" href="#COBREXA.metabolite_charge-Tuple{MetabolicModel, String}"><code>COBREXA.metabolite_charge</code></a> — <span class="docstring-category">Method</span></header><section><div><p>metabolite<em>charge(model::MetabolicModel, metabolite</em>id::String)::Maybe{Int}</p><p>Return the charge associated with metabolite <code>metabolite_id</code> in <code>model</code>. Returns <code>nothing</code> if charge not present.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/abstract/MetabolicModel.jl#L219-L224">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.metabolite_compartment-Tuple{MetabolicModel, String}" href="#COBREXA.metabolite_compartment-Tuple{MetabolicModel, String}"><code>COBREXA.metabolite_compartment</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">metabolite_compartment(model::MetabolicModel, metabolite_id::String)::Maybe{String}</code></pre><p>Return the compartment of metabolite <code>metabolite_id</code> in <code>model</code> if it is assigned. If not, return <code>nothing</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/abstract/MetabolicModel.jl#L289-L294">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.metabolite_formula-Tuple{MetabolicModel, String}" href="#COBREXA.metabolite_formula-Tuple{MetabolicModel, String}"><code>COBREXA.metabolite_formula</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">metabolite_formula(
     a::MetabolicModel,
     metabolite_id::String,
-)::Maybe{MetaboliteFormula}</code></pre><p>Return the formula of metabolite <code>metabolite_id</code> in <code>model</code>. Return <code>nothing</code> in case the formula is not known or irrelevant.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/abstract/MetabolicModel.jl#L203-L211">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.metabolite_notes-Tuple{MetabolicModel, String}" href="#COBREXA.metabolite_notes-Tuple{MetabolicModel, String}"><code>COBREXA.metabolite_notes</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">metabolite_notes(model::MetabolicModel, metabolite_id::String)::Notes</code></pre><p>Return the notes associated with metabolite <code>reaction_id</code> in <code>model</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/abstract/MetabolicModel.jl#L271-L275">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.metabolites-Tuple{MetabolicModel}" href="#COBREXA.metabolites-Tuple{MetabolicModel}"><code>COBREXA.metabolites</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">metabolites(a::MetabolicModel)::Vector{String}</code></pre><p>Return a vector of metabolite identifiers in a model.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/abstract/MetabolicModel.jl#L71-L75">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.n_coupling_constraints-Tuple{MetabolicModel}" href="#COBREXA.n_coupling_constraints-Tuple{MetabolicModel}"><code>COBREXA.n_coupling_constraints</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">n_coupling_constraints(a::MetabolicModel)::Int</code></pre><p>Get the number of coupling constraints in a model.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/abstract/MetabolicModel.jl#L144-L148">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.n_genes-Tuple{MetabolicModel}" href="#COBREXA.n_genes-Tuple{MetabolicModel}"><code>COBREXA.n_genes</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">n_genes(a::MetabolicModel)::Int</code></pre><p>Return the number of genes in the model (as returned by <a href="#COBREXA.genes-Tuple{MetabolicModel}"><code>genes</code></a>). If you just need the number of the genes, this may be much more efficient than calling <a href="#COBREXA.genes-Tuple{MetabolicModel}"><code>genes</code></a> and measuring the array.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/abstract/MetabolicModel.jl#L176-L182">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.n_metabolites-Tuple{MetabolicModel}" href="#COBREXA.n_metabolites-Tuple{MetabolicModel}"><code>COBREXA.n_metabolites</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">n_metabolites(a::MetabolicModel)::Int</code></pre><p>Get the number of metabolites in a model.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/abstract/MetabolicModel.jl#L89-L93">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.n_reactions-Tuple{MetabolicModel}" href="#COBREXA.n_reactions-Tuple{MetabolicModel}"><code>COBREXA.n_reactions</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">n_reactions(a::MetabolicModel)::Int</code></pre><p>Get the number of reactions in a model.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/abstract/MetabolicModel.jl#L80-L84">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.objective-Tuple{MetabolicModel}" href="#COBREXA.objective-Tuple{MetabolicModel}"><code>COBREXA.objective</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">objective(a::MetabolicModel)::SparseVec</code></pre><p>Get the objective vector of a model.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/abstract/MetabolicModel.jl#L125-L129">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.precache!-Tuple{MetabolicModel}" href="#COBREXA.precache!-Tuple{MetabolicModel}"><code>COBREXA.precache!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">precache!(a::MetabolicModel)::Nothing</code></pre><p>Do whatever is feasible to get the model into a state that can be read from as-quickly-as-possible. This may include e.g. generating helper index structures and loading delayed parts of the model from disk. The model should be modified &quot;transparently&quot; in-place. Analysis functions call this right before applying modifications or converting the model to the optimization model using <a href="#COBREXA.make_optimization_model-Tuple{MetabolicModel, Any}"><code>make_optimization_model</code></a>; usually on the same machine where the optimizers (and, generally, the core analysis algorithms) will run. The calls are done in a good hope that the performance will be improved.</p><p>By default, it should be safe to do nothing.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/abstract/MetabolicModel.jl#L323-L336">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.reaction_annotations-Tuple{MetabolicModel, String}" href="#COBREXA.reaction_annotations-Tuple{MetabolicModel, String}"><code>COBREXA.reaction_annotations</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">reaction_annotations(a::MetabolicModel, reaction_id::String)::Annotations</code></pre><p>Return standardized names that may help identifying the reaction. The dictionary assigns vectors of possible identifiers to identifier system names, e.g. <code>&quot;Reactome&quot; =&gt; [&quot;reactomeID123&quot;]</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/abstract/MetabolicModel.jl#L229-L235">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.reaction_gene_association-Tuple{MetabolicModel, String}" href="#COBREXA.reaction_gene_association-Tuple{MetabolicModel, String}"><code>COBREXA.reaction_gene_association</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">reaction_gene_association(a::MetabolicModel, gene_id::String)::Maybe{GeneAssociation}</code></pre><p>Returns the sets of genes that need to be present so that the reaction can work (technically, a DNF on gene availability, with positive atoms only).</p><p>For simplicity, <code>nothing</code> may be returned, meaning that the reaction always takes place. (in DNF, that would be equivalent to returning <code>[[]]</code>.)</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/abstract/MetabolicModel.jl#L187-L195">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.reaction_notes-Tuple{MetabolicModel, String}" href="#COBREXA.reaction_notes-Tuple{MetabolicModel, String}"><code>COBREXA.reaction_notes</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">reaction_notes(model::MetabolicModel, reaction_id::String)::Notes</code></pre><p>Return the notes associated with reaction <code>reaction_id</code> in <code>model</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/abstract/MetabolicModel.jl#L262-L266">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.reaction_stoichiometry-Tuple{MetabolicModel, String}" href="#COBREXA.reaction_stoichiometry-Tuple{MetabolicModel, String}"><code>COBREXA.reaction_stoichiometry</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">reaction_stoichiometry(model::MetaboliteModel, rid::String)::Dict{String, Float64}</code></pre><p>Return the stoichiometry of reaction with ID <code>rid</code> in the model. The dictionary maps the metabolite IDs to their stoichiometric coefficients.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/abstract/MetabolicModel.jl#L309-L314">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.reaction_subsystem-Tuple{MetabolicModel, String}" href="#COBREXA.reaction_subsystem-Tuple{MetabolicModel, String}"><code>COBREXA.reaction_subsystem</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">reaction_subsystem(model::MetabolicModel, reaction_id::String)::Maybe{String}</code></pre><p>Return the subsystem of reaction <code>reaction_id</code> in <code>model</code> if it is assigned. If not, return <code>nothing</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/abstract/MetabolicModel.jl#L299-L304">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.reactions-Tuple{MetabolicModel}" href="#COBREXA.reactions-Tuple{MetabolicModel}"><code>COBREXA.reactions</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">reactions(a::MetabolicModel)::Vector{String}</code></pre><p>Return a vector of reaction identifiers in a model.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/abstract/MetabolicModel.jl#L62-L66">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.stoichiometry-Tuple{MetabolicModel}" href="#COBREXA.stoichiometry-Tuple{MetabolicModel}"><code>COBREXA.stoichiometry</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">stoichiometry(a::MetabolicModel)::SparseMat</code></pre><p>Get the sparse stoichiometry matrix of a model.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/abstract/MetabolicModel.jl#L98-L102">source</a></section></article><h2 id="Model-types-and-contents"><a class="docs-heading-anchor" href="#Model-types-and-contents">Model types and contents</a><a id="Model-types-and-contents-1"></a><a class="docs-heading-anchor-permalink" href="#Model-types-and-contents" title="Permalink"></a></h2><article class="docstring"><header><a class="docstring-binding" id="COBREXA.CoreModel" href="#COBREXA.CoreModel"><code>COBREXA.CoreModel</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia">struct CoreModel &lt;: MetabolicModel</code></pre><p>A &quot;bare bones&quot; core linear optimization problem of the form, with reaction and metabolite names.</p><pre><code class="language-none">min c^T x
+)::Maybe{MetaboliteFormula}</code></pre><p>Return the formula of metabolite <code>metabolite_id</code> in <code>model</code>. Return <code>nothing</code> in case the formula is not known or irrelevant.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/abstract/MetabolicModel.jl#L203-L211">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.metabolite_notes-Tuple{MetabolicModel, String}" href="#COBREXA.metabolite_notes-Tuple{MetabolicModel, String}"><code>COBREXA.metabolite_notes</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">metabolite_notes(model::MetabolicModel, metabolite_id::String)::Notes</code></pre><p>Return the notes associated with metabolite <code>reaction_id</code> in <code>model</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/abstract/MetabolicModel.jl#L271-L275">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.metabolites-Tuple{MetabolicModel}" href="#COBREXA.metabolites-Tuple{MetabolicModel}"><code>COBREXA.metabolites</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">metabolites(a::MetabolicModel)::Vector{String}</code></pre><p>Return a vector of metabolite identifiers in a model.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/abstract/MetabolicModel.jl#L71-L75">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.n_coupling_constraints-Tuple{MetabolicModel}" href="#COBREXA.n_coupling_constraints-Tuple{MetabolicModel}"><code>COBREXA.n_coupling_constraints</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">n_coupling_constraints(a::MetabolicModel)::Int</code></pre><p>Get the number of coupling constraints in a model.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/abstract/MetabolicModel.jl#L144-L148">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.n_genes-Tuple{MetabolicModel}" href="#COBREXA.n_genes-Tuple{MetabolicModel}"><code>COBREXA.n_genes</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">n_genes(a::MetabolicModel)::Int</code></pre><p>Return the number of genes in the model (as returned by <a href="#COBREXA.genes-Tuple{MetabolicModel}"><code>genes</code></a>). If you just need the number of the genes, this may be much more efficient than calling <a href="#COBREXA.genes-Tuple{MetabolicModel}"><code>genes</code></a> and measuring the array.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/abstract/MetabolicModel.jl#L176-L182">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.n_metabolites-Tuple{MetabolicModel}" href="#COBREXA.n_metabolites-Tuple{MetabolicModel}"><code>COBREXA.n_metabolites</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">n_metabolites(a::MetabolicModel)::Int</code></pre><p>Get the number of metabolites in a model.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/abstract/MetabolicModel.jl#L89-L93">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.n_reactions-Tuple{MetabolicModel}" href="#COBREXA.n_reactions-Tuple{MetabolicModel}"><code>COBREXA.n_reactions</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">n_reactions(a::MetabolicModel)::Int</code></pre><p>Get the number of reactions in a model.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/abstract/MetabolicModel.jl#L80-L84">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.objective-Tuple{MetabolicModel}" href="#COBREXA.objective-Tuple{MetabolicModel}"><code>COBREXA.objective</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">objective(a::MetabolicModel)::SparseVec</code></pre><p>Get the objective vector of a model.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/abstract/MetabolicModel.jl#L125-L129">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.precache!-Tuple{MetabolicModel}" href="#COBREXA.precache!-Tuple{MetabolicModel}"><code>COBREXA.precache!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">precache!(a::MetabolicModel)::Nothing</code></pre><p>Do whatever is feasible to get the model into a state that can be read from as-quickly-as-possible. This may include e.g. generating helper index structures and loading delayed parts of the model from disk. The model should be modified &quot;transparently&quot; in-place. Analysis functions call this right before applying modifications or converting the model to the optimization model using <a href="#COBREXA.make_optimization_model-Tuple{MetabolicModel, Any}"><code>make_optimization_model</code></a>; usually on the same machine where the optimizers (and, generally, the core analysis algorithms) will run. The calls are done in a good hope that the performance will be improved.</p><p>By default, it should be safe to do nothing.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/abstract/MetabolicModel.jl#L323-L336">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.reaction_annotations-Tuple{MetabolicModel, String}" href="#COBREXA.reaction_annotations-Tuple{MetabolicModel, String}"><code>COBREXA.reaction_annotations</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">reaction_annotations(a::MetabolicModel, reaction_id::String)::Annotations</code></pre><p>Return standardized names that may help identifying the reaction. The dictionary assigns vectors of possible identifiers to identifier system names, e.g. <code>&quot;Reactome&quot; =&gt; [&quot;reactomeID123&quot;]</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/abstract/MetabolicModel.jl#L229-L235">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.reaction_gene_association-Tuple{MetabolicModel, String}" href="#COBREXA.reaction_gene_association-Tuple{MetabolicModel, String}"><code>COBREXA.reaction_gene_association</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">reaction_gene_association(a::MetabolicModel, gene_id::String)::Maybe{GeneAssociation}</code></pre><p>Returns the sets of genes that need to be present so that the reaction can work (technically, a DNF on gene availability, with positive atoms only).</p><p>For simplicity, <code>nothing</code> may be returned, meaning that the reaction always takes place. (in DNF, that would be equivalent to returning <code>[[]]</code>.)</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/abstract/MetabolicModel.jl#L187-L195">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.reaction_notes-Tuple{MetabolicModel, String}" href="#COBREXA.reaction_notes-Tuple{MetabolicModel, String}"><code>COBREXA.reaction_notes</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">reaction_notes(model::MetabolicModel, reaction_id::String)::Notes</code></pre><p>Return the notes associated with reaction <code>reaction_id</code> in <code>model</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/abstract/MetabolicModel.jl#L262-L266">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.reaction_stoichiometry-Tuple{MetabolicModel, String}" href="#COBREXA.reaction_stoichiometry-Tuple{MetabolicModel, String}"><code>COBREXA.reaction_stoichiometry</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">reaction_stoichiometry(model::MetaboliteModel, rid::String)::Dict{String, Float64}</code></pre><p>Return the stoichiometry of reaction with ID <code>rid</code> in the model. The dictionary maps the metabolite IDs to their stoichiometric coefficients.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/abstract/MetabolicModel.jl#L309-L314">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.reaction_subsystem-Tuple{MetabolicModel, String}" href="#COBREXA.reaction_subsystem-Tuple{MetabolicModel, String}"><code>COBREXA.reaction_subsystem</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">reaction_subsystem(model::MetabolicModel, reaction_id::String)::Maybe{String}</code></pre><p>Return the subsystem of reaction <code>reaction_id</code> in <code>model</code> if it is assigned. If not, return <code>nothing</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/abstract/MetabolicModel.jl#L299-L304">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.reactions-Tuple{MetabolicModel}" href="#COBREXA.reactions-Tuple{MetabolicModel}"><code>COBREXA.reactions</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">reactions(a::MetabolicModel)::Vector{String}</code></pre><p>Return a vector of reaction identifiers in a model.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/abstract/MetabolicModel.jl#L62-L66">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.stoichiometry-Tuple{MetabolicModel}" href="#COBREXA.stoichiometry-Tuple{MetabolicModel}"><code>COBREXA.stoichiometry</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">stoichiometry(a::MetabolicModel)::SparseMat</code></pre><p>Get the sparse stoichiometry matrix of a model.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/abstract/MetabolicModel.jl#L98-L102">source</a></section></article><h2 id="Model-types-and-contents"><a class="docs-heading-anchor" href="#Model-types-and-contents">Model types and contents</a><a id="Model-types-and-contents-1"></a><a class="docs-heading-anchor-permalink" href="#Model-types-and-contents" title="Permalink"></a></h2><article class="docstring"><header><a class="docstring-binding" id="COBREXA.CoreModel" href="#COBREXA.CoreModel"><code>COBREXA.CoreModel</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia">struct CoreModel &lt;: MetabolicModel</code></pre><p>A &quot;bare bones&quot; core linear optimization problem of the form, with reaction and metabolite names.</p><pre><code class="language-none">min c^T x
 s.t. S x = b
-      xₗ ≤ x ≤ xᵤ</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/CoreModel.jl#L2-L12">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="Base.convert-Union{Tuple{M}, Tuple{Type{CoreModel}, M}} where M&lt;:MetabolicModel" href="#Base.convert-Union{Tuple{M}, Tuple{Type{CoreModel}, M}} where M&lt;:MetabolicModel"><code>Base.convert</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">Base.convert(::Type{CoreModel}, m::M) where {M &lt;: MetabolicModel}</code></pre><p>Make a <code>CoreModel</code> out of any compatible model type.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/CoreModel.jl#L100-L104">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.balance-Tuple{CoreModel}" href="#COBREXA.balance-Tuple{CoreModel}"><code>COBREXA.balance</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">balance(a::CoreModel)::SparseVec</code></pre><p><code>CoreModel</code> target flux balance.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/CoreModel.jl#L70-L74">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.bounds-Tuple{CoreModel}" href="#COBREXA.bounds-Tuple{CoreModel}"><code>COBREXA.bounds</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">bounds(a::CoreModel)::Tuple{SparseVec,SparseVec}</code></pre><p><code>CoreModel</code> flux bounds.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/CoreModel.jl#L63-L67">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.metabolites-Tuple{CoreModel}" href="#COBREXA.metabolites-Tuple{CoreModel}"><code>COBREXA.metabolites</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">metabolites(a::CoreModel)::Vector{String}</code></pre><p>Metabolites in a <code>CoreModel</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/CoreModel.jl#L49-L53">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.objective-Tuple{CoreModel}" href="#COBREXA.objective-Tuple{CoreModel}"><code>COBREXA.objective</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">objective(a::CoreModel)::SparseVec</code></pre><p><code>CoreModel</code> objective vector.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/CoreModel.jl#L77-L81">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.reaction_stoichiometry-Tuple{CoreModel, Any}" href="#COBREXA.reaction_stoichiometry-Tuple{CoreModel, Any}"><code>COBREXA.reaction_stoichiometry</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">reaction_stoichiometry(model::CoreModel, ridx)::Dict{String, Float64}</code></pre><p>Return the stoichiometry of reaction at index <code>ridx</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/CoreModel.jl#L92-L96">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.reaction_stoichiometry-Tuple{CoreModel, String}" href="#COBREXA.reaction_stoichiometry-Tuple{CoreModel, String}"><code>COBREXA.reaction_stoichiometry</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">reaction_stoichiometry(model::CoreModel, rid::String)::Dict{String, Float64}</code></pre><p>Return the stoichiometry of reaction with ID <code>rid</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/CoreModel.jl#L84-L88">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.reactions-Tuple{CoreModel}" href="#COBREXA.reactions-Tuple{CoreModel}"><code>COBREXA.reactions</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">reactions(a::CoreModel)::Vector{String}</code></pre><p>Get the reactions in a <code>CoreModel</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/CoreModel.jl#L42-L46">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.stoichiometry-Tuple{CoreModel}" href="#COBREXA.stoichiometry-Tuple{CoreModel}"><code>COBREXA.stoichiometry</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">stoichiometry(a::CoreModel)::SparseMat</code></pre><p><code>CoreModel</code> stoichiometry matrix.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/CoreModel.jl#L56-L60">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.CoreModelCoupled" href="#COBREXA.CoreModelCoupled"><code>COBREXA.CoreModelCoupled</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia">struct CoreModelCoupled &lt;: MetabolicModel</code></pre><p>The linear model with additional coupling constraints in the form</p><pre><code class="language-none">    cₗ ≤ C x ≤ cᵤ</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/CoreModelCoupled.jl#L2-L9">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="Base.convert-Tuple{Type{CoreModelCoupled}, MetabolicModel}" href="#Base.convert-Tuple{Type{CoreModelCoupled}, MetabolicModel}"><code>Base.convert</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">Base.convert(::Type{CoreModelCoupled}, mm::MetabolicModel)</code></pre><p>Make a <code>CoreModelCoupled</code> out of any compatible model type.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/CoreModelCoupled.jl#L117-L121">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.balance-Tuple{CoreModelCoupled}" href="#COBREXA.balance-Tuple{CoreModelCoupled}"><code>COBREXA.balance</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">balance(a::CoreModelCoupled)</code></pre><p>Extract balance from <a href="#COBREXA.CoreModelCoupled"><code>CoreModelCoupled</code></a> (uses the internal <a href="#COBREXA.CoreModel"><code>CoreModel</code></a>).</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/CoreModelCoupled.jl#L64-L69">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.bounds-Tuple{CoreModelCoupled}" href="#COBREXA.bounds-Tuple{CoreModelCoupled}"><code>COBREXA.bounds</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">bounds(a::CoreModelCoupled)</code></pre><p>Extract bounds from <a href="#COBREXA.CoreModelCoupled"><code>CoreModelCoupled</code></a> (uses the internal <a href="#COBREXA.CoreModel"><code>CoreModel</code></a>).</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/CoreModelCoupled.jl#L56-L61">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.coupling-Tuple{CoreModelCoupled}" href="#COBREXA.coupling-Tuple{CoreModelCoupled}"><code>COBREXA.coupling</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">coupling(a::CoreModelCoupled)::SparseMat</code></pre><p>Coupling constraint matrix for a <code>CoreModelCoupled</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/CoreModelCoupled.jl#L80-L84">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.coupling_bounds-Tuple{CoreModelCoupled}" href="#COBREXA.coupling_bounds-Tuple{CoreModelCoupled}"><code>COBREXA.coupling_bounds</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">coupling_bounds(a::CoreModelCoupled)::Tuple{SparseVec,SparseVec}</code></pre><p>Coupling bounds for a <code>CoreModelCoupled</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/CoreModelCoupled.jl#L94-L98">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.metabolites-Tuple{CoreModelCoupled}" href="#COBREXA.metabolites-Tuple{CoreModelCoupled}"><code>COBREXA.metabolites</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">metabolites(a::CoreModelCoupled)</code></pre><p>Extract metabolites from <a href="#COBREXA.CoreModelCoupled"><code>CoreModelCoupled</code></a> (uses the internal <a href="#COBREXA.CoreModel"><code>CoreModel</code></a>).</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/CoreModelCoupled.jl#L40-L45">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.n_coupling_constraints-Tuple{CoreModelCoupled}" href="#COBREXA.n_coupling_constraints-Tuple{CoreModelCoupled}"><code>COBREXA.n_coupling_constraints</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">n_coupling_constraints(a::CoreModelCoupled)::Int</code></pre><p>The number of coupling constraints in a <code>CoreModelCoupled</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/CoreModelCoupled.jl#L87-L91">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.objective-Tuple{CoreModelCoupled}" href="#COBREXA.objective-Tuple{CoreModelCoupled}"><code>COBREXA.objective</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">objective(a::CoreModelCoupled)</code></pre><p>Extract objective from <a href="#COBREXA.CoreModelCoupled"><code>CoreModelCoupled</code></a> (uses the internal <a href="#COBREXA.CoreModel"><code>CoreModel</code></a>).</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/CoreModelCoupled.jl#L72-L77">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.reaction_stoichiometry-Tuple{CoreModelCoupled, Any}" href="#COBREXA.reaction_stoichiometry-Tuple{CoreModelCoupled, Any}"><code>COBREXA.reaction_stoichiometry</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">reaction_stoichiometry(model::CoreModelCoupled, ridx)::Dict{String, Float64}</code></pre><p>Return the stoichiometry of reaction at index <code>ridx</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/CoreModelCoupled.jl#L108-L112">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.reaction_stoichiometry-Tuple{CoreModelCoupled, String}" href="#COBREXA.reaction_stoichiometry-Tuple{CoreModelCoupled, String}"><code>COBREXA.reaction_stoichiometry</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">reaction_stoichiometry(model::CoreModelCoupled, rid::String)::Dict{String, Float64}</code></pre><p>Return the stoichiometry of reaction with ID <code>rid</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/CoreModelCoupled.jl#L101-L105">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.reactions-Tuple{CoreModelCoupled}" href="#COBREXA.reactions-Tuple{CoreModelCoupled}"><code>COBREXA.reactions</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">reactions(a::CoreModelCoupled)</code></pre><p>Extract reactions from <a href="#COBREXA.CoreModelCoupled"><code>CoreModelCoupled</code></a> (uses the internal <a href="#COBREXA.CoreModel"><code>CoreModel</code></a>).</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/CoreModelCoupled.jl#L32-L37">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.stoichiometry-Tuple{CoreModelCoupled}" href="#COBREXA.stoichiometry-Tuple{CoreModelCoupled}"><code>COBREXA.stoichiometry</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">stoichiometry(a::CoreModelCoupled)</code></pre><p>Extract stoichiometry from <a href="#COBREXA.CoreModelCoupled"><code>CoreModelCoupled</code></a> (uses the internal <a href="#COBREXA.CoreModel"><code>CoreModel</code></a>).</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/CoreModelCoupled.jl#L48-L53">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.FluxSummary" href="#COBREXA.FluxSummary"><code>COBREXA.FluxSummary</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia">FluxSummary</code></pre><p>A struct used to store summary information about the solution of a constraint based analysis result.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/FluxSummary.jl#L1-L6">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.flux_summary-Tuple{Dict{String, Float64}}" href="#COBREXA.flux_summary-Tuple{Dict{String, Float64}}"><code>COBREXA.flux_summary</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">flux_summary(flux_result::Dict{String, Float64};
+      xₗ ≤ x ≤ xᵤ</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/CoreModel.jl#L2-L12">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="Base.convert-Union{Tuple{M}, Tuple{Type{CoreModel}, M}} where M&lt;:MetabolicModel" href="#Base.convert-Union{Tuple{M}, Tuple{Type{CoreModel}, M}} where M&lt;:MetabolicModel"><code>Base.convert</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">Base.convert(::Type{CoreModel}, m::M) where {M &lt;: MetabolicModel}</code></pre><p>Make a <code>CoreModel</code> out of any compatible model type.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/CoreModel.jl#L100-L104">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.balance-Tuple{CoreModel}" href="#COBREXA.balance-Tuple{CoreModel}"><code>COBREXA.balance</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">balance(a::CoreModel)::SparseVec</code></pre><p><code>CoreModel</code> target flux balance.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/CoreModel.jl#L70-L74">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.bounds-Tuple{CoreModel}" href="#COBREXA.bounds-Tuple{CoreModel}"><code>COBREXA.bounds</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">bounds(a::CoreModel)::Tuple{SparseVec,SparseVec}</code></pre><p><code>CoreModel</code> flux bounds.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/CoreModel.jl#L63-L67">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.metabolites-Tuple{CoreModel}" href="#COBREXA.metabolites-Tuple{CoreModel}"><code>COBREXA.metabolites</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">metabolites(a::CoreModel)::Vector{String}</code></pre><p>Metabolites in a <code>CoreModel</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/CoreModel.jl#L49-L53">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.objective-Tuple{CoreModel}" href="#COBREXA.objective-Tuple{CoreModel}"><code>COBREXA.objective</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">objective(a::CoreModel)::SparseVec</code></pre><p><code>CoreModel</code> objective vector.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/CoreModel.jl#L77-L81">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.reaction_stoichiometry-Tuple{CoreModel, Any}" href="#COBREXA.reaction_stoichiometry-Tuple{CoreModel, Any}"><code>COBREXA.reaction_stoichiometry</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">reaction_stoichiometry(model::CoreModel, ridx)::Dict{String, Float64}</code></pre><p>Return the stoichiometry of reaction at index <code>ridx</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/CoreModel.jl#L92-L96">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.reaction_stoichiometry-Tuple{CoreModel, String}" href="#COBREXA.reaction_stoichiometry-Tuple{CoreModel, String}"><code>COBREXA.reaction_stoichiometry</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">reaction_stoichiometry(model::CoreModel, rid::String)::Dict{String, Float64}</code></pre><p>Return the stoichiometry of reaction with ID <code>rid</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/CoreModel.jl#L84-L88">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.reactions-Tuple{CoreModel}" href="#COBREXA.reactions-Tuple{CoreModel}"><code>COBREXA.reactions</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">reactions(a::CoreModel)::Vector{String}</code></pre><p>Get the reactions in a <code>CoreModel</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/CoreModel.jl#L42-L46">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.stoichiometry-Tuple{CoreModel}" href="#COBREXA.stoichiometry-Tuple{CoreModel}"><code>COBREXA.stoichiometry</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">stoichiometry(a::CoreModel)::SparseMat</code></pre><p><code>CoreModel</code> stoichiometry matrix.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/CoreModel.jl#L56-L60">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.CoreModelCoupled" href="#COBREXA.CoreModelCoupled"><code>COBREXA.CoreModelCoupled</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia">struct CoreModelCoupled &lt;: MetabolicModel</code></pre><p>The linear model with additional coupling constraints in the form</p><pre><code class="language-none">    cₗ ≤ C x ≤ cᵤ</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/CoreModelCoupled.jl#L2-L9">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="Base.convert-Tuple{Type{CoreModelCoupled}, MetabolicModel}" href="#Base.convert-Tuple{Type{CoreModelCoupled}, MetabolicModel}"><code>Base.convert</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">Base.convert(::Type{CoreModelCoupled}, mm::MetabolicModel)</code></pre><p>Make a <code>CoreModelCoupled</code> out of any compatible model type.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/CoreModelCoupled.jl#L117-L121">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.balance-Tuple{CoreModelCoupled}" href="#COBREXA.balance-Tuple{CoreModelCoupled}"><code>COBREXA.balance</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">balance(a::CoreModelCoupled)</code></pre><p>Extract balance from <a href="#COBREXA.CoreModelCoupled"><code>CoreModelCoupled</code></a> (uses the internal <a href="#COBREXA.CoreModel"><code>CoreModel</code></a>).</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/CoreModelCoupled.jl#L64-L69">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.bounds-Tuple{CoreModelCoupled}" href="#COBREXA.bounds-Tuple{CoreModelCoupled}"><code>COBREXA.bounds</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">bounds(a::CoreModelCoupled)</code></pre><p>Extract bounds from <a href="#COBREXA.CoreModelCoupled"><code>CoreModelCoupled</code></a> (uses the internal <a href="#COBREXA.CoreModel"><code>CoreModel</code></a>).</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/CoreModelCoupled.jl#L56-L61">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.coupling-Tuple{CoreModelCoupled}" href="#COBREXA.coupling-Tuple{CoreModelCoupled}"><code>COBREXA.coupling</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">coupling(a::CoreModelCoupled)::SparseMat</code></pre><p>Coupling constraint matrix for a <code>CoreModelCoupled</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/CoreModelCoupled.jl#L80-L84">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.coupling_bounds-Tuple{CoreModelCoupled}" href="#COBREXA.coupling_bounds-Tuple{CoreModelCoupled}"><code>COBREXA.coupling_bounds</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">coupling_bounds(a::CoreModelCoupled)::Tuple{SparseVec,SparseVec}</code></pre><p>Coupling bounds for a <code>CoreModelCoupled</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/CoreModelCoupled.jl#L94-L98">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.metabolites-Tuple{CoreModelCoupled}" href="#COBREXA.metabolites-Tuple{CoreModelCoupled}"><code>COBREXA.metabolites</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">metabolites(a::CoreModelCoupled)</code></pre><p>Extract metabolites from <a href="#COBREXA.CoreModelCoupled"><code>CoreModelCoupled</code></a> (uses the internal <a href="#COBREXA.CoreModel"><code>CoreModel</code></a>).</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/CoreModelCoupled.jl#L40-L45">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.n_coupling_constraints-Tuple{CoreModelCoupled}" href="#COBREXA.n_coupling_constraints-Tuple{CoreModelCoupled}"><code>COBREXA.n_coupling_constraints</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">n_coupling_constraints(a::CoreModelCoupled)::Int</code></pre><p>The number of coupling constraints in a <code>CoreModelCoupled</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/CoreModelCoupled.jl#L87-L91">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.objective-Tuple{CoreModelCoupled}" href="#COBREXA.objective-Tuple{CoreModelCoupled}"><code>COBREXA.objective</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">objective(a::CoreModelCoupled)</code></pre><p>Extract objective from <a href="#COBREXA.CoreModelCoupled"><code>CoreModelCoupled</code></a> (uses the internal <a href="#COBREXA.CoreModel"><code>CoreModel</code></a>).</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/CoreModelCoupled.jl#L72-L77">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.reaction_stoichiometry-Tuple{CoreModelCoupled, Any}" href="#COBREXA.reaction_stoichiometry-Tuple{CoreModelCoupled, Any}"><code>COBREXA.reaction_stoichiometry</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">reaction_stoichiometry(model::CoreModelCoupled, ridx)::Dict{String, Float64}</code></pre><p>Return the stoichiometry of reaction at index <code>ridx</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/CoreModelCoupled.jl#L108-L112">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.reaction_stoichiometry-Tuple{CoreModelCoupled, String}" href="#COBREXA.reaction_stoichiometry-Tuple{CoreModelCoupled, String}"><code>COBREXA.reaction_stoichiometry</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">reaction_stoichiometry(model::CoreModelCoupled, rid::String)::Dict{String, Float64}</code></pre><p>Return the stoichiometry of reaction with ID <code>rid</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/CoreModelCoupled.jl#L101-L105">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.reactions-Tuple{CoreModelCoupled}" href="#COBREXA.reactions-Tuple{CoreModelCoupled}"><code>COBREXA.reactions</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">reactions(a::CoreModelCoupled)</code></pre><p>Extract reactions from <a href="#COBREXA.CoreModelCoupled"><code>CoreModelCoupled</code></a> (uses the internal <a href="#COBREXA.CoreModel"><code>CoreModel</code></a>).</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/CoreModelCoupled.jl#L32-L37">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.stoichiometry-Tuple{CoreModelCoupled}" href="#COBREXA.stoichiometry-Tuple{CoreModelCoupled}"><code>COBREXA.stoichiometry</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">stoichiometry(a::CoreModelCoupled)</code></pre><p>Extract stoichiometry from <a href="#COBREXA.CoreModelCoupled"><code>CoreModelCoupled</code></a> (uses the internal <a href="#COBREXA.CoreModel"><code>CoreModel</code></a>).</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/CoreModelCoupled.jl#L48-L53">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.FluxSummary" href="#COBREXA.FluxSummary"><code>COBREXA.FluxSummary</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia">FluxSummary</code></pre><p>A struct used to store summary information about the solution of a constraint based analysis result.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/FluxSummary.jl#L1-L6">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.flux_summary-Tuple{Dict{String, Float64}}" href="#COBREXA.flux_summary-Tuple{Dict{String, Float64}}"><code>COBREXA.flux_summary</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">flux_summary(flux_result::Dict{String, Float64};
             exclude_exchanges = false,
             exchange_prefixes = _constants.exchange_prefixes,
             biomass_strings = _constants.biomass_strings,
@@ -24,7 +24,7 @@ Import:
 Export:
   EX_h_e:      17.5309
   EX_co2_e:    22.8098
-  EX_h2o_e:    29.1758</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/FluxSummary.jl#L14-L50">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.FluxVariabilitySummary" href="#COBREXA.FluxVariabilitySummary"><code>COBREXA.FluxVariabilitySummary</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia">FluxVariabilitySummary</code></pre><p>A struct used to store summary information about the solution of a flux variability analysis result.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/FluxVariabilitySummary.jl#L1-L6">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.flux_variability_summary-Tuple{Tuple{Dict{String, Dict{String, Float64}}, Dict{String, Dict{String, Float64}}}}" href="#COBREXA.flux_variability_summary-Tuple{Tuple{Dict{String, Dict{String, Float64}}, Dict{String, Dict{String, Float64}}}}"><code>COBREXA.flux_variability_summary</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">flux_variability_summary(flux_result::Tuple{Dict{String, Dict{String, Float64}}, Dict{String, Dict{String, Float64}}};
+  EX_h2o_e:    29.1758</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/FluxSummary.jl#L14-L50">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.FluxVariabilitySummary" href="#COBREXA.FluxVariabilitySummary"><code>COBREXA.FluxVariabilitySummary</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia">FluxVariabilitySummary</code></pre><p>A struct used to store summary information about the solution of a flux variability analysis result.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/FluxVariabilitySummary.jl#L1-L6">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.flux_variability_summary-Tuple{Tuple{Dict{String, Dict{String, Float64}}, Dict{String, Dict{String, Float64}}}}" href="#COBREXA.flux_variability_summary-Tuple{Tuple{Dict{String, Dict{String, Float64}}, Dict{String, Dict{String, Float64}}}}"><code>COBREXA.flux_variability_summary</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">flux_variability_summary(flux_result::Tuple{Dict{String, Dict{String, Float64}}, Dict{String, Dict{String, Float64}}};
     exclude_exchanges = false,
     exchange_prefixes = _constants.exchange_prefixes,
     biomass_strings = _constants.biomass_strings,
@@ -42,9 +42,9 @@ Exchange
   EX_nh4_e:                 -4.8448       -4.8448
   EX_pi_e:                  -3.2149       -3.2149
   EX_for_e:                 0.0           0.0
-  ...                       ...           ...</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/FluxVariabilitySummary.jl#L12-L45">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.Gene" href="#COBREXA.Gene"><code>COBREXA.Gene</code></a> — <span class="docstring-category">Type</span></header><section><div><p>Gene struct.</p><p><strong>Fields</strong></p><pre><code class="language-none">id :: String
+  ...                       ...           ...</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/FluxVariabilitySummary.jl#L12-L45">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.Gene" href="#COBREXA.Gene"><code>COBREXA.Gene</code></a> — <span class="docstring-category">Type</span></header><section><div><p>Gene struct.</p><p><strong>Fields</strong></p><pre><code class="language-none">id :: String
 notes :: Dict{String, Vector{String}}
-annotation :: Dict{String, Union{Vector{String}, String}}</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/Gene.jl#L1-L10">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.JSONModel" href="#COBREXA.JSONModel"><code>COBREXA.JSONModel</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia">struct JSONModel &lt;: MetabolicModel
+annotation :: Dict{String, Union{Vector{String}, String}}</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/Gene.jl#L1-L10">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.JSONModel" href="#COBREXA.JSONModel"><code>COBREXA.JSONModel</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia">struct JSONModel &lt;: MetabolicModel
     json::Dict{String,Any}
     rxn_index::Dict{String,Int}
     rxns::Vector{Any}
@@ -54,12 +54,12 @@ annotation :: Dict{String, Union{Vector{String}, String}}</code></pre></div><a c
     genes::Vector{Any}
 end</code></pre><p>A struct used to store the contents of a JSON model, i.e. a model read from a file ending with <code>.json</code>. These model files typically store all the model data in arrays of JSON objects (represented in Julia as vectors of dictionaries).</p><p>Usually, not all of the fields of the input JSON can be easily represented when converting to other models, care should be taken to avoid losing information.</p><p>Direct work with the <code>json</code> structure is not very efficient; the model structure therefore caches some of the internal structure in the extra fields. The single-parameter <a href="#COBREXA.JSONModel"><code>JSONModel</code></a> constructor creates these caches correctly from the <code>json</code>. The model structure is designed as read-only, and changes in <code>json</code> invalidate the cache.</p><p><strong>Example</strong></p><pre><code class="language-none">model = load_json_model(&quot;some_model.json&quot;)
 model.json # see the actual underlying JSON
-reactions(model) # see the list of reactions</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/JSONModel.jl#L1-L31">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="Base.convert-Tuple{Type{JSONModel}, MetabolicModel}" href="#Base.convert-Tuple{Type{JSONModel}, MetabolicModel}"><code>Base.convert</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">Base.convert(::Type{JSONModel}, mm::MetabolicModel)</code></pre><p>Convert any <a href="#COBREXA.MetabolicModel"><code>MetabolicModel</code></a> to <a href="#COBREXA.JSONModel"><code>JSONModel</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/JSONModel.jl#L255-L259">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.bounds-Tuple{JSONModel}" href="#COBREXA.bounds-Tuple{JSONModel}"><code>COBREXA.bounds</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">bounds(model::JSONModel)</code></pre><p>Get the bounds for reactions, assuming the information is stored in <code>.lower_bound</code> and <code>.upper_bound</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/JSONModel.jl#L128-L133">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.gene_annotations-Tuple{JSONModel, String}" href="#COBREXA.gene_annotations-Tuple{JSONModel, String}"><code>COBREXA.gene_annotations</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">gene_annotations(model::JSONModel, gid::String)::Annotations</code></pre><p>Gene annotations from the <a href="#COBREXA.JSONModel"><code>JSONModel</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/JSONModel.jl#L193-L197">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.gene_notes-Tuple{JSONModel, String}" href="#COBREXA.gene_notes-Tuple{JSONModel, String}"><code>COBREXA.gene_notes</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">gene_notes(model::JSONModel, gid::String)::Notes</code></pre><p>Gene notes from the <a href="#COBREXA.JSONModel"><code>JSONModel</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/JSONModel.jl#L203-L207">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.genes-Tuple{JSONModel}" href="#COBREXA.genes-Tuple{JSONModel}"><code>COBREXA.genes</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">genes(model::JSONModel)</code></pre><p>Extract gene names from a JSON model.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/JSONModel.jl#L93-L97">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.metabolite_annotations-Tuple{JSONModel, String}" href="#COBREXA.metabolite_annotations-Tuple{JSONModel, String}"><code>COBREXA.metabolite_annotations</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">metabolite_annotations(model::JSONModel, mid::String)::Annotations</code></pre><p>Metabolite annotations from the <a href="#COBREXA.JSONModel"><code>JSONModel</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/JSONModel.jl#L229-L233">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.metabolite_charge-Tuple{JSONModel, String}" href="#COBREXA.metabolite_charge-Tuple{JSONModel, String}"><code>COBREXA.metabolite_charge</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">metabolite_charge(model::JSONModel, mid::String)</code></pre><p>Return the metabolite <code>.charge</code></p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/JSONModel.jl#L177-L181">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.metabolite_compartment-Tuple{JSONModel, String}" href="#COBREXA.metabolite_compartment-Tuple{JSONModel, String}"><code>COBREXA.metabolite_compartment</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">metabolite_compartment(model::JSONModel, mid::String)</code></pre><p>Return the metabolite <code>.compartment</code></p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/JSONModel.jl#L185-L189">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.metabolite_formula-Tuple{JSONModel, String}" href="#COBREXA.metabolite_formula-Tuple{JSONModel, String}"><code>COBREXA.metabolite_formula</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">metabolite_formula(model::JSONModel, mid::String)</code></pre><p>Parse and return the metabolite <code>.formula</code></p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/JSONModel.jl#L169-L173">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.metabolite_notes-Tuple{JSONModel, String}" href="#COBREXA.metabolite_notes-Tuple{JSONModel, String}"><code>COBREXA.metabolite_notes</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">metabolite_notes(model::JSONModel, mid::String)::Notes</code></pre><p>Metabolite notes from the <a href="#COBREXA.JSONModel"><code>JSONModel</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/JSONModel.jl#L239-L243">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.metabolites-Tuple{JSONModel}" href="#COBREXA.metabolites-Tuple{JSONModel}"><code>COBREXA.metabolites</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">metabolites(model::JSONModel)</code></pre><p>Extract metabolite names (stored as <code>.id</code>) from JSON model.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/JSONModel.jl#L86-L90">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.objective-Tuple{JSONModel}" href="#COBREXA.objective-Tuple{JSONModel}"><code>COBREXA.objective</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">objective(model::JSONModel)</code></pre><p>Collect <code>.objective_coefficient</code> keys from model reactions.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/JSONModel.jl#L143-L147">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.reaction_annotations-Tuple{JSONModel, String}" href="#COBREXA.reaction_annotations-Tuple{JSONModel, String}"><code>COBREXA.reaction_annotations</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">reaction_annotations(model::JSONModel, rid::String)::Annotations</code></pre><p>Reaction annotations from the <a href="#COBREXA.JSONModel"><code>JSONModel</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/JSONModel.jl#L211-L215">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.reaction_gene_association-Tuple{JSONModel, String}" href="#COBREXA.reaction_gene_association-Tuple{JSONModel, String}"><code>COBREXA.reaction_gene_association</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">reaction_gene_associaton(model::JSONModel, rid::String)</code></pre><p>Parses the <code>.gene_reaction_rule</code> from reactions.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/JSONModel.jl#L151-L155">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.reaction_notes-Tuple{JSONModel, String}" href="#COBREXA.reaction_notes-Tuple{JSONModel, String}"><code>COBREXA.reaction_notes</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">reaction_notes(model::JSONModel, rid::String)::Notes</code></pre><p>Reaction notes from the <a href="#COBREXA.JSONModel"><code>JSONModel</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/JSONModel.jl#L221-L225">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.reaction_stoichiometry-Tuple{JSONModel, String}" href="#COBREXA.reaction_stoichiometry-Tuple{JSONModel, String}"><code>COBREXA.reaction_stoichiometry</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">reaction_stoichiometry(model::JSONModel, rid::String)::Dict{String, Float64}</code></pre><p>Return the stoichiometry of reaction with ID <code>rid</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/JSONModel.jl#L247-L251">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.reaction_subsystem-Tuple{JSONModel, String}" href="#COBREXA.reaction_subsystem-Tuple{JSONModel, String}"><code>COBREXA.reaction_subsystem</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">reaction_subsystem(model::JSONModel, rid::String)</code></pre><p>Parses the <code>.subsystem</code> out from reactions.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/JSONModel.jl#L161-L165">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.reactions-Tuple{JSONModel}" href="#COBREXA.reactions-Tuple{JSONModel}"><code>COBREXA.reactions</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">reactions(model::JSONModel)</code></pre><p>Extract reaction names (stored as <code>.id</code>) from JSON model.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/JSONModel.jl#L79-L83">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.stoichiometry-Tuple{JSONModel}" href="#COBREXA.stoichiometry-Tuple{JSONModel}"><code>COBREXA.stoichiometry</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">stoichiometry(model::JSONModel)</code></pre><p>Get the stoichiometry. Assuming the information is stored in reaction object under key <code>.metabolites</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/JSONModel.jl#L100-L105">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.MATModel" href="#COBREXA.MATModel"><code>COBREXA.MATModel</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia">struct MATModel</code></pre><p>Wrapper around the models loaded in dictionaries from the MATLAB representation.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/MATModel.jl#L1-L5">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="Base.convert-Tuple{Type{MATModel}, MetabolicModel}" href="#Base.convert-Tuple{Type{MATModel}, MetabolicModel}"><code>Base.convert</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">Base.convert(::Type{MATModel}, m::MetabolicModel)</code></pre><p>Convert any metabolic model to <code>MATModel</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/MATModel.jl#L198-L202">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA._mat_has_squashed_coupling-Tuple{Any}" href="#COBREXA._mat_has_squashed_coupling-Tuple{Any}"><code>COBREXA._mat_has_squashed_coupling</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">_mat_has_squashed_coupling(mat)</code></pre><p>Guesses whether C in the MAT file is stored in A=[S;C].</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/MATModel.jl#L26-L30">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.balance-Tuple{MATModel}" href="#COBREXA.balance-Tuple{MATModel}"><code>COBREXA.balance</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">balance(m::MATModel)</code></pre><p>Extracts balance from the MAT model, defaulting to zeroes if not present.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/MATModel.jl#L66-L70">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.bounds-Tuple{MATModel}" href="#COBREXA.bounds-Tuple{MATModel}"><code>COBREXA.bounds</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">bounds(m::MATModel)</code></pre><p>Extracts bounds from the MAT file, saved under <code>lb</code> and <code>ub</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/MATModel.jl#L56-L60">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.coupling-Tuple{MATModel}" href="#COBREXA.coupling-Tuple{MATModel}"><code>COBREXA.coupling</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">coupling(m::MATModel)</code></pre><p>Extract coupling matrix stored, in <code>C</code> key.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/MATModel.jl#L87-L91">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.coupling_bounds-Tuple{MATModel}" href="#COBREXA.coupling_bounds-Tuple{MATModel}"><code>COBREXA.coupling_bounds</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">coupling_bounds(m::MATModel)</code></pre><p>Extracts the coupling constraints. Currently, there are several accepted ways to store these in MATLAB models; this takes the constraints from vectors <code>cl</code> and <code>cu</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/MATModel.jl#L96-L100">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.genes-Tuple{MATModel}" href="#COBREXA.genes-Tuple{MATModel}"><code>COBREXA.genes</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">genes(m::MATModel)</code></pre><p>Extracts the possible gene list from <code>genes</code> key.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/MATModel.jl#L116-L120">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.metabolite_charge-Tuple{MATModel, String}" href="#COBREXA.metabolite_charge-Tuple{MATModel, String}"><code>COBREXA.metabolite_charge</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">metabolite_charge(m::MATModel, mid::String)</code></pre><p>Extract metabolite charge from <code>metCharge</code> or <code>metCharges</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/MATModel.jl#L150-L154">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.metabolite_compartment-Tuple{MATModel, String}" href="#COBREXA.metabolite_compartment-Tuple{MATModel, String}"><code>COBREXA.metabolite_compartment</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">metabolite_compartment(m::MATModel, mid::String)</code></pre><p>Extract metabolite compartment from <code>metCompartment</code> or <code>metCompartments</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/MATModel.jl#L160-L164">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.metabolite_formula-Tuple{MATModel, String}" href="#COBREXA.metabolite_formula-Tuple{MATModel, String}"><code>COBREXA.metabolite_formula</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">metabolite_formula(m::MATModel, mid::String)</code></pre><p>Extract metabolite formula from key <code>metFormula</code> or <code>metFormulas</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/MATModel.jl#L140-L144">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.metabolites-Tuple{MATModel}" href="#COBREXA.metabolites-Tuple{MATModel}"><code>COBREXA.metabolites</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">metabolites(m::MATModel)::Vector{String}</code></pre><p>Extracts metabolite names from <code>mets</code> key in the MAT file.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/MATModel.jl#L35-L39">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.objective-Tuple{MATModel}" href="#COBREXA.objective-Tuple{MATModel}"><code>COBREXA.objective</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">objective(m::MATModel)</code></pre><p>Extracts the objective from the MAT model (defaults to zeroes).</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/MATModel.jl#L79-L83">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.reaction_gene_association-Tuple{MATModel, String}" href="#COBREXA.reaction_gene_association-Tuple{MATModel, String}"><code>COBREXA.reaction_gene_association</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">reaction_gene_association(m::MATModel, rid::String)</code></pre><p>Extracts the associations from <code>grRules</code> key, if present.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/MATModel.jl#L126-L130">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.reaction_stoichiometry-Tuple{MATModel, Any}" href="#COBREXA.reaction_stoichiometry-Tuple{MATModel, Any}"><code>COBREXA.reaction_stoichiometry</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">reaction_stoichiometry(model::MATModel, ridx)::Dict{String, Float64}</code></pre><p>Return the stoichiometry of reaction at index <code>ridx</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/MATModel.jl#L181-L185">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.reaction_stoichiometry-Tuple{MATModel, String}" href="#COBREXA.reaction_stoichiometry-Tuple{MATModel, String}"><code>COBREXA.reaction_stoichiometry</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">reaction_stoichiometry(model::MATModel, rid::String)::Dict{String, Float64}</code></pre><p>Return the stoichiometry of reaction with ID <code>rid</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/MATModel.jl#L171-L175">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.reactions-Tuple{MATModel}" href="#COBREXA.reactions-Tuple{MATModel}"><code>COBREXA.reactions</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">reactions(m::MATModel)::Vector{String}</code></pre><p>Extracts reaction names from <code>rxns</code> key in the MAT file.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/MATModel.jl#L13-L17">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.stoichiometry-Tuple{MATModel}" href="#COBREXA.stoichiometry-Tuple{MATModel}"><code>COBREXA.stoichiometry</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">stoichiometry(m::MATModel)</code></pre><p>Extract the stoichiometry matrix, stored under key <code>S</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/MATModel.jl#L49-L53">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.Metabolite" href="#COBREXA.Metabolite"><code>COBREXA.Metabolite</code></a> — <span class="docstring-category">Type</span></header><section><div><p>Metabolite structure.</p><p><strong>Fields</strong></p><pre><code class="language-none">id :: String
+reactions(model) # see the list of reactions</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/JSONModel.jl#L1-L31">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="Base.convert-Tuple{Type{JSONModel}, MetabolicModel}" href="#Base.convert-Tuple{Type{JSONModel}, MetabolicModel}"><code>Base.convert</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">Base.convert(::Type{JSONModel}, mm::MetabolicModel)</code></pre><p>Convert any <a href="#COBREXA.MetabolicModel"><code>MetabolicModel</code></a> to <a href="#COBREXA.JSONModel"><code>JSONModel</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/JSONModel.jl#L255-L259">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.bounds-Tuple{JSONModel}" href="#COBREXA.bounds-Tuple{JSONModel}"><code>COBREXA.bounds</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">bounds(model::JSONModel)</code></pre><p>Get the bounds for reactions, assuming the information is stored in <code>.lower_bound</code> and <code>.upper_bound</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/JSONModel.jl#L128-L133">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.gene_annotations-Tuple{JSONModel, String}" href="#COBREXA.gene_annotations-Tuple{JSONModel, String}"><code>COBREXA.gene_annotations</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">gene_annotations(model::JSONModel, gid::String)::Annotations</code></pre><p>Gene annotations from the <a href="#COBREXA.JSONModel"><code>JSONModel</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/JSONModel.jl#L193-L197">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.gene_notes-Tuple{JSONModel, String}" href="#COBREXA.gene_notes-Tuple{JSONModel, String}"><code>COBREXA.gene_notes</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">gene_notes(model::JSONModel, gid::String)::Notes</code></pre><p>Gene notes from the <a href="#COBREXA.JSONModel"><code>JSONModel</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/JSONModel.jl#L203-L207">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.genes-Tuple{JSONModel}" href="#COBREXA.genes-Tuple{JSONModel}"><code>COBREXA.genes</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">genes(model::JSONModel)</code></pre><p>Extract gene names from a JSON model.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/JSONModel.jl#L93-L97">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.metabolite_annotations-Tuple{JSONModel, String}" href="#COBREXA.metabolite_annotations-Tuple{JSONModel, String}"><code>COBREXA.metabolite_annotations</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">metabolite_annotations(model::JSONModel, mid::String)::Annotations</code></pre><p>Metabolite annotations from the <a href="#COBREXA.JSONModel"><code>JSONModel</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/JSONModel.jl#L229-L233">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.metabolite_charge-Tuple{JSONModel, String}" href="#COBREXA.metabolite_charge-Tuple{JSONModel, String}"><code>COBREXA.metabolite_charge</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">metabolite_charge(model::JSONModel, mid::String)</code></pre><p>Return the metabolite <code>.charge</code></p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/JSONModel.jl#L177-L181">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.metabolite_compartment-Tuple{JSONModel, String}" href="#COBREXA.metabolite_compartment-Tuple{JSONModel, String}"><code>COBREXA.metabolite_compartment</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">metabolite_compartment(model::JSONModel, mid::String)</code></pre><p>Return the metabolite <code>.compartment</code></p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/JSONModel.jl#L185-L189">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.metabolite_formula-Tuple{JSONModel, String}" href="#COBREXA.metabolite_formula-Tuple{JSONModel, String}"><code>COBREXA.metabolite_formula</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">metabolite_formula(model::JSONModel, mid::String)</code></pre><p>Parse and return the metabolite <code>.formula</code></p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/JSONModel.jl#L169-L173">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.metabolite_notes-Tuple{JSONModel, String}" href="#COBREXA.metabolite_notes-Tuple{JSONModel, String}"><code>COBREXA.metabolite_notes</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">metabolite_notes(model::JSONModel, mid::String)::Notes</code></pre><p>Metabolite notes from the <a href="#COBREXA.JSONModel"><code>JSONModel</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/JSONModel.jl#L239-L243">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.metabolites-Tuple{JSONModel}" href="#COBREXA.metabolites-Tuple{JSONModel}"><code>COBREXA.metabolites</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">metabolites(model::JSONModel)</code></pre><p>Extract metabolite names (stored as <code>.id</code>) from JSON model.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/JSONModel.jl#L86-L90">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.objective-Tuple{JSONModel}" href="#COBREXA.objective-Tuple{JSONModel}"><code>COBREXA.objective</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">objective(model::JSONModel)</code></pre><p>Collect <code>.objective_coefficient</code> keys from model reactions.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/JSONModel.jl#L143-L147">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.reaction_annotations-Tuple{JSONModel, String}" href="#COBREXA.reaction_annotations-Tuple{JSONModel, String}"><code>COBREXA.reaction_annotations</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">reaction_annotations(model::JSONModel, rid::String)::Annotations</code></pre><p>Reaction annotations from the <a href="#COBREXA.JSONModel"><code>JSONModel</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/JSONModel.jl#L211-L215">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.reaction_gene_association-Tuple{JSONModel, String}" href="#COBREXA.reaction_gene_association-Tuple{JSONModel, String}"><code>COBREXA.reaction_gene_association</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">reaction_gene_associaton(model::JSONModel, rid::String)</code></pre><p>Parses the <code>.gene_reaction_rule</code> from reactions.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/JSONModel.jl#L151-L155">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.reaction_notes-Tuple{JSONModel, String}" href="#COBREXA.reaction_notes-Tuple{JSONModel, String}"><code>COBREXA.reaction_notes</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">reaction_notes(model::JSONModel, rid::String)::Notes</code></pre><p>Reaction notes from the <a href="#COBREXA.JSONModel"><code>JSONModel</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/JSONModel.jl#L221-L225">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.reaction_stoichiometry-Tuple{JSONModel, String}" href="#COBREXA.reaction_stoichiometry-Tuple{JSONModel, String}"><code>COBREXA.reaction_stoichiometry</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">reaction_stoichiometry(model::JSONModel, rid::String)::Dict{String, Float64}</code></pre><p>Return the stoichiometry of reaction with ID <code>rid</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/JSONModel.jl#L247-L251">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.reaction_subsystem-Tuple{JSONModel, String}" href="#COBREXA.reaction_subsystem-Tuple{JSONModel, String}"><code>COBREXA.reaction_subsystem</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">reaction_subsystem(model::JSONModel, rid::String)</code></pre><p>Parses the <code>.subsystem</code> out from reactions.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/JSONModel.jl#L161-L165">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.reactions-Tuple{JSONModel}" href="#COBREXA.reactions-Tuple{JSONModel}"><code>COBREXA.reactions</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">reactions(model::JSONModel)</code></pre><p>Extract reaction names (stored as <code>.id</code>) from JSON model.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/JSONModel.jl#L79-L83">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.stoichiometry-Tuple{JSONModel}" href="#COBREXA.stoichiometry-Tuple{JSONModel}"><code>COBREXA.stoichiometry</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">stoichiometry(model::JSONModel)</code></pre><p>Get the stoichiometry. Assuming the information is stored in reaction object under key <code>.metabolites</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/JSONModel.jl#L100-L105">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.MATModel" href="#COBREXA.MATModel"><code>COBREXA.MATModel</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia">struct MATModel</code></pre><p>Wrapper around the models loaded in dictionaries from the MATLAB representation.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/MATModel.jl#L1-L5">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="Base.convert-Tuple{Type{MATModel}, MetabolicModel}" href="#Base.convert-Tuple{Type{MATModel}, MetabolicModel}"><code>Base.convert</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">Base.convert(::Type{MATModel}, m::MetabolicModel)</code></pre><p>Convert any metabolic model to <code>MATModel</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/MATModel.jl#L198-L202">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA._mat_has_squashed_coupling-Tuple{Any}" href="#COBREXA._mat_has_squashed_coupling-Tuple{Any}"><code>COBREXA._mat_has_squashed_coupling</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">_mat_has_squashed_coupling(mat)</code></pre><p>Guesses whether C in the MAT file is stored in A=[S;C].</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/MATModel.jl#L26-L30">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.balance-Tuple{MATModel}" href="#COBREXA.balance-Tuple{MATModel}"><code>COBREXA.balance</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">balance(m::MATModel)</code></pre><p>Extracts balance from the MAT model, defaulting to zeroes if not present.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/MATModel.jl#L66-L70">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.bounds-Tuple{MATModel}" href="#COBREXA.bounds-Tuple{MATModel}"><code>COBREXA.bounds</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">bounds(m::MATModel)</code></pre><p>Extracts bounds from the MAT file, saved under <code>lb</code> and <code>ub</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/MATModel.jl#L56-L60">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.coupling-Tuple{MATModel}" href="#COBREXA.coupling-Tuple{MATModel}"><code>COBREXA.coupling</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">coupling(m::MATModel)</code></pre><p>Extract coupling matrix stored, in <code>C</code> key.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/MATModel.jl#L87-L91">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.coupling_bounds-Tuple{MATModel}" href="#COBREXA.coupling_bounds-Tuple{MATModel}"><code>COBREXA.coupling_bounds</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">coupling_bounds(m::MATModel)</code></pre><p>Extracts the coupling constraints. Currently, there are several accepted ways to store these in MATLAB models; this takes the constraints from vectors <code>cl</code> and <code>cu</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/MATModel.jl#L96-L100">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.genes-Tuple{MATModel}" href="#COBREXA.genes-Tuple{MATModel}"><code>COBREXA.genes</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">genes(m::MATModel)</code></pre><p>Extracts the possible gene list from <code>genes</code> key.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/MATModel.jl#L116-L120">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.metabolite_charge-Tuple{MATModel, String}" href="#COBREXA.metabolite_charge-Tuple{MATModel, String}"><code>COBREXA.metabolite_charge</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">metabolite_charge(m::MATModel, mid::String)</code></pre><p>Extract metabolite charge from <code>metCharge</code> or <code>metCharges</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/MATModel.jl#L150-L154">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.metabolite_compartment-Tuple{MATModel, String}" href="#COBREXA.metabolite_compartment-Tuple{MATModel, String}"><code>COBREXA.metabolite_compartment</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">metabolite_compartment(m::MATModel, mid::String)</code></pre><p>Extract metabolite compartment from <code>metCompartment</code> or <code>metCompartments</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/MATModel.jl#L160-L164">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.metabolite_formula-Tuple{MATModel, String}" href="#COBREXA.metabolite_formula-Tuple{MATModel, String}"><code>COBREXA.metabolite_formula</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">metabolite_formula(m::MATModel, mid::String)</code></pre><p>Extract metabolite formula from key <code>metFormula</code> or <code>metFormulas</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/MATModel.jl#L140-L144">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.metabolites-Tuple{MATModel}" href="#COBREXA.metabolites-Tuple{MATModel}"><code>COBREXA.metabolites</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">metabolites(m::MATModel)::Vector{String}</code></pre><p>Extracts metabolite names from <code>mets</code> key in the MAT file.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/MATModel.jl#L35-L39">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.objective-Tuple{MATModel}" href="#COBREXA.objective-Tuple{MATModel}"><code>COBREXA.objective</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">objective(m::MATModel)</code></pre><p>Extracts the objective from the MAT model (defaults to zeroes).</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/MATModel.jl#L79-L83">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.reaction_gene_association-Tuple{MATModel, String}" href="#COBREXA.reaction_gene_association-Tuple{MATModel, String}"><code>COBREXA.reaction_gene_association</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">reaction_gene_association(m::MATModel, rid::String)</code></pre><p>Extracts the associations from <code>grRules</code> key, if present.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/MATModel.jl#L126-L130">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.reaction_stoichiometry-Tuple{MATModel, Any}" href="#COBREXA.reaction_stoichiometry-Tuple{MATModel, Any}"><code>COBREXA.reaction_stoichiometry</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">reaction_stoichiometry(model::MATModel, ridx)::Dict{String, Float64}</code></pre><p>Return the stoichiometry of reaction at index <code>ridx</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/MATModel.jl#L181-L185">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.reaction_stoichiometry-Tuple{MATModel, String}" href="#COBREXA.reaction_stoichiometry-Tuple{MATModel, String}"><code>COBREXA.reaction_stoichiometry</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">reaction_stoichiometry(model::MATModel, rid::String)::Dict{String, Float64}</code></pre><p>Return the stoichiometry of reaction with ID <code>rid</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/MATModel.jl#L171-L175">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.reactions-Tuple{MATModel}" href="#COBREXA.reactions-Tuple{MATModel}"><code>COBREXA.reactions</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">reactions(m::MATModel)::Vector{String}</code></pre><p>Extracts reaction names from <code>rxns</code> key in the MAT file.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/MATModel.jl#L13-L17">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.stoichiometry-Tuple{MATModel}" href="#COBREXA.stoichiometry-Tuple{MATModel}"><code>COBREXA.stoichiometry</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">stoichiometry(m::MATModel)</code></pre><p>Extract the stoichiometry matrix, stored under key <code>S</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/MATModel.jl#L49-L53">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.Metabolite" href="#COBREXA.Metabolite"><code>COBREXA.Metabolite</code></a> — <span class="docstring-category">Type</span></header><section><div><p>Metabolite structure.</p><p><strong>Fields</strong></p><pre><code class="language-none">id :: String
 formula :: String
 charge :: Int
 compartment :: String
 notes :: Dict{String, Vector{String}}
-annotation :: Dict{String, Union{Vector{String}, String}}</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/Metabolite.jl#L1-L13">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.Reaction" href="#COBREXA.Reaction"><code>COBREXA.Reaction</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia">mutable struct Reaction
+annotation :: Dict{String, Union{Vector{String}, String}}</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/Metabolite.jl#L1-L13">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.Reaction" href="#COBREXA.Reaction"><code>COBREXA.Reaction</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia">mutable struct Reaction
     id::String
     metabolites::Dict{String,Float64}
     lb::Float64
@@ -69,7 +69,7 @@ annotation :: Dict{String, Union{Vector{String}, String}}</code></pre></div><a c
     notes::Notes
     annotations::Annotations
     objective_coefficient::Float64
-end</code></pre><p>A structure for representing a single reaction in a <a href="#COBREXA.StandardModel"><code>StandardModel</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/Reaction.jl#L1-L15">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.Reaction" href="#COBREXA.Reaction"><code>COBREXA.Reaction</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia">Reaction(
+end</code></pre><p>A structure for representing a single reaction in a <a href="#COBREXA.StandardModel"><code>StandardModel</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/Reaction.jl#L1-L15">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.Reaction" href="#COBREXA.Reaction"><code>COBREXA.Reaction</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia">Reaction(
     id = &quot;&quot;;
     metabolites = Dict{String,Float64}(),
     lb = -_constants.default_reaction_bound,
@@ -79,33 +79,33 @@ end</code></pre><p>A structure for representing a single reaction in a <a href="
     notes = Notes(),
     annotations = Annotations(),
     objective_coefficient = 0.0,
-)</code></pre><p>A constructor for Reaction that only takes a reaction <code>id</code> and assigns default/uninformative values to all the fields that are not explicitely assigned.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/Reaction.jl#L28-L44">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.Reaction" href="#COBREXA.Reaction"><code>COBREXA.Reaction</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia">Reaction(
+)</code></pre><p>A constructor for Reaction that only takes a reaction <code>id</code> and assigns default/uninformative values to all the fields that are not explicitely assigned.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/Reaction.jl#L28-L44">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.Reaction" href="#COBREXA.Reaction"><code>COBREXA.Reaction</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia">Reaction(
     id::String,
     metabolites::Dict{String,Union{Int, Float64}},
     dir = :bidirectional;
     default_bound = _constants.default_reaction_bound,
-)</code></pre><p>Convenience constructor for <code>Reaction</code>. The reaction equation is specified using <code>metabolites</code>, which is a dictionary mapping metabolite ids to stoichiometric coefficients. The direcion of the reaction is set through <code>dir</code> which can take <code>:bidirectional</code>, <code>:forward</code>, and <code>:reverse</code> as values. Finally, the <code>default_bound</code> is the value taken to mean infinity in the context of constraint based models, often this is set to a very high flux value like 1000.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/Reaction.jl#L70-L84">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.ReactionStatus" href="#COBREXA.ReactionStatus"><code>COBREXA.ReactionStatus</code></a> — <span class="docstring-category">Type</span></header><section><div><p>Used for concise reporting of modeling results.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/ReactionStatus.jl#L1-L3">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.SBMLModel" href="#COBREXA.SBMLModel"><code>COBREXA.SBMLModel</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia">struct SBMLModel</code></pre><p>Thin wrapper around the model from SBML.jl library. Allows easy conversion from SBML to any other model format.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/SBMLModel.jl#L1-L6">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="Base.convert-Tuple{Type{SBMLModel}, MetabolicModel}" href="#Base.convert-Tuple{Type{SBMLModel}, MetabolicModel}"><code>Base.convert</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">Base.convert(::Type{SBMLModel}, mm::MetabolicModel)</code></pre><p>Convert any metabolic model to <a href="#COBREXA.SBMLModel"><code>SBMLModel</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/SBMLModel.jl#L146-L150">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.balance-Tuple{SBMLModel}" href="#COBREXA.balance-Tuple{SBMLModel}"><code>COBREXA.balance</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">balance(model::SBMLModel)::SparseVec</code></pre><p>Balance vector of a <a href="#COBREXA.SBMLModel"><code>SBMLModel</code></a>. This is always zero.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/SBMLModel.jl#L73-L77">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.bounds-Tuple{SBMLModel}" href="#COBREXA.bounds-Tuple{SBMLModel}"><code>COBREXA.bounds</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">bounds(model::SBMLModel)::Tuple{SparseVec,SparseVec}</code></pre><p>Get the lower and upper flux bounds of model <a href="#COBREXA.SBMLModel"><code>SBMLModel</code></a>. Throws <code>DomainError</code> in case if the SBML contains mismatching units.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/SBMLModel.jl#L49-L54">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.genes-Tuple{SBMLModel}" href="#COBREXA.genes-Tuple{SBMLModel}"><code>COBREXA.genes</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">genes(model::SBMLModel)::Vector{String}</code></pre><p>Get genes of a <a href="#COBREXA.SBMLModel"><code>SBMLModel</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/SBMLModel.jl#L87-L91">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.metabolite_charge-Tuple{SBMLModel, String}" href="#COBREXA.metabolite_charge-Tuple{SBMLModel, String}"><code>COBREXA.metabolite_charge</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">metabolite_charge(model::SBMLModel, mid::String)::Maybe{Int}</code></pre><p>Get charge of a chosen metabolite from <a href="#COBREXA.SBMLModel"><code>SBMLModel</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/SBMLModel.jl#L117-L121">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.metabolite_formula-Tuple{SBMLModel, String}" href="#COBREXA.metabolite_formula-Tuple{SBMLModel, String}"><code>COBREXA.metabolite_formula</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">metabolite_formula(model::SBMLModel, mid::String)::Maybe{MetaboliteFormula}</code></pre><p>Get <a href="#COBREXA.MetaboliteFormula"><code>MetaboliteFormula</code></a> from a chosen metabolite from <a href="#COBREXA.SBMLModel"><code>SBMLModel</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/SBMLModel.jl#L109-L113">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.metabolites-Tuple{SBMLModel}" href="#COBREXA.metabolites-Tuple{SBMLModel}"><code>COBREXA.metabolites</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">metabolites(model::SBMLModel)::Vector{String}</code></pre><p>Get metabolites from a <a href="#COBREXA.SBMLModel"><code>SBMLModel</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/SBMLModel.jl#L18-L22">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.n_genes-Tuple{SBMLModel}" href="#COBREXA.n_genes-Tuple{SBMLModel}"><code>COBREXA.n_genes</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">n_genes(model::SBMLModel)::Int</code></pre><p>Get number of genes in <a href="#COBREXA.SBMLModel"><code>SBMLModel</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/SBMLModel.jl#L94-L98">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.n_metabolites-Tuple{SBMLModel}" href="#COBREXA.n_metabolites-Tuple{SBMLModel}"><code>COBREXA.n_metabolites</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">n_metabolites(model::SBMLModel)::Int</code></pre><p>Efficient counting of metabolites in <a href="#COBREXA.SBMLModel"><code>SBMLModel</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/SBMLModel.jl#L32-L36">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.n_reactions-Tuple{SBMLModel}" href="#COBREXA.n_reactions-Tuple{SBMLModel}"><code>COBREXA.n_reactions</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">n_reactions(model::SBMLModel)::Int</code></pre><p>Efficient counting of reactions in <a href="#COBREXA.SBMLModel"><code>SBMLModel</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/SBMLModel.jl#L25-L29">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.objective-Tuple{SBMLModel}" href="#COBREXA.objective-Tuple{SBMLModel}"><code>COBREXA.objective</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">objective(model::SBMLModel)::SparseVec</code></pre><p>Objective of the <a href="#COBREXA.SBMLModel"><code>SBMLModel</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/SBMLModel.jl#L80-L84">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.reaction_gene_association-Tuple{SBMLModel, String}" href="#COBREXA.reaction_gene_association-Tuple{SBMLModel, String}"><code>COBREXA.reaction_gene_association</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">reaction_gene_association(model::SBMLModel, rid::String)::Maybe{GeneAssociation}</code></pre><p>Retrieve the <a href="#COBREXA.GeneAssociation"><code>GeneAssociation</code></a> from <a href="#COBREXA.SBMLModel"><code>SBMLModel</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/SBMLModel.jl#L101-L105">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.reaction_stoichiometry-Tuple{SBMLModel, String}" href="#COBREXA.reaction_stoichiometry-Tuple{SBMLModel, String}"><code>COBREXA.reaction_stoichiometry</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">reaction_stoichiometry(model::SBMLModel, rid::String)::Dict{String, Float64}</code></pre><p>Return the stoichiometry of reaction with ID <code>rid</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/SBMLModel.jl#L138-L142">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.reactions-Tuple{SBMLModel}" href="#COBREXA.reactions-Tuple{SBMLModel}"><code>COBREXA.reactions</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">reactions(model::SBMLModel)::Vector{String}</code></pre><p>Get reactions from a <a href="#COBREXA.SBMLModel"><code>SBMLModel</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/SBMLModel.jl#L11-L15">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.stoichiometry-Tuple{SBMLModel}" href="#COBREXA.stoichiometry-Tuple{SBMLModel}"><code>COBREXA.stoichiometry</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">stoichiometry(model::SBMLModel)::SparseMat</code></pre><p>Recreate the stoichiometry matrix from the <a href="#COBREXA.SBMLModel"><code>SBMLModel</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/SBMLModel.jl#L39-L43">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.Serialized" href="#COBREXA.Serialized"><code>COBREXA.Serialized</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia">mutable struct Serialized{M &lt;: MetabolicModel}
+)</code></pre><p>Convenience constructor for <code>Reaction</code>. The reaction equation is specified using <code>metabolites</code>, which is a dictionary mapping metabolite ids to stoichiometric coefficients. The direcion of the reaction is set through <code>dir</code> which can take <code>:bidirectional</code>, <code>:forward</code>, and <code>:reverse</code> as values. Finally, the <code>default_bound</code> is the value taken to mean infinity in the context of constraint based models, often this is set to a very high flux value like 1000.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/Reaction.jl#L70-L84">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.ReactionStatus" href="#COBREXA.ReactionStatus"><code>COBREXA.ReactionStatus</code></a> — <span class="docstring-category">Type</span></header><section><div><p>Used for concise reporting of modeling results.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/ReactionStatus.jl#L1-L3">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.SBMLModel" href="#COBREXA.SBMLModel"><code>COBREXA.SBMLModel</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia">struct SBMLModel</code></pre><p>Thin wrapper around the model from SBML.jl library. Allows easy conversion from SBML to any other model format.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/SBMLModel.jl#L1-L6">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="Base.convert-Tuple{Type{SBMLModel}, MetabolicModel}" href="#Base.convert-Tuple{Type{SBMLModel}, MetabolicModel}"><code>Base.convert</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">Base.convert(::Type{SBMLModel}, mm::MetabolicModel)</code></pre><p>Convert any metabolic model to <a href="#COBREXA.SBMLModel"><code>SBMLModel</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/SBMLModel.jl#L146-L150">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.balance-Tuple{SBMLModel}" href="#COBREXA.balance-Tuple{SBMLModel}"><code>COBREXA.balance</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">balance(model::SBMLModel)::SparseVec</code></pre><p>Balance vector of a <a href="#COBREXA.SBMLModel"><code>SBMLModel</code></a>. This is always zero.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/SBMLModel.jl#L73-L77">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.bounds-Tuple{SBMLModel}" href="#COBREXA.bounds-Tuple{SBMLModel}"><code>COBREXA.bounds</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">bounds(model::SBMLModel)::Tuple{SparseVec,SparseVec}</code></pre><p>Get the lower and upper flux bounds of model <a href="#COBREXA.SBMLModel"><code>SBMLModel</code></a>. Throws <code>DomainError</code> in case if the SBML contains mismatching units.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/SBMLModel.jl#L49-L54">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.genes-Tuple{SBMLModel}" href="#COBREXA.genes-Tuple{SBMLModel}"><code>COBREXA.genes</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">genes(model::SBMLModel)::Vector{String}</code></pre><p>Get genes of a <a href="#COBREXA.SBMLModel"><code>SBMLModel</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/SBMLModel.jl#L87-L91">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.metabolite_charge-Tuple{SBMLModel, String}" href="#COBREXA.metabolite_charge-Tuple{SBMLModel, String}"><code>COBREXA.metabolite_charge</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">metabolite_charge(model::SBMLModel, mid::String)::Maybe{Int}</code></pre><p>Get charge of a chosen metabolite from <a href="#COBREXA.SBMLModel"><code>SBMLModel</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/SBMLModel.jl#L117-L121">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.metabolite_formula-Tuple{SBMLModel, String}" href="#COBREXA.metabolite_formula-Tuple{SBMLModel, String}"><code>COBREXA.metabolite_formula</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">metabolite_formula(model::SBMLModel, mid::String)::Maybe{MetaboliteFormula}</code></pre><p>Get <a href="#COBREXA.MetaboliteFormula"><code>MetaboliteFormula</code></a> from a chosen metabolite from <a href="#COBREXA.SBMLModel"><code>SBMLModel</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/SBMLModel.jl#L109-L113">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.metabolites-Tuple{SBMLModel}" href="#COBREXA.metabolites-Tuple{SBMLModel}"><code>COBREXA.metabolites</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">metabolites(model::SBMLModel)::Vector{String}</code></pre><p>Get metabolites from a <a href="#COBREXA.SBMLModel"><code>SBMLModel</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/SBMLModel.jl#L18-L22">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.n_genes-Tuple{SBMLModel}" href="#COBREXA.n_genes-Tuple{SBMLModel}"><code>COBREXA.n_genes</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">n_genes(model::SBMLModel)::Int</code></pre><p>Get number of genes in <a href="#COBREXA.SBMLModel"><code>SBMLModel</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/SBMLModel.jl#L94-L98">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.n_metabolites-Tuple{SBMLModel}" href="#COBREXA.n_metabolites-Tuple{SBMLModel}"><code>COBREXA.n_metabolites</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">n_metabolites(model::SBMLModel)::Int</code></pre><p>Efficient counting of metabolites in <a href="#COBREXA.SBMLModel"><code>SBMLModel</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/SBMLModel.jl#L32-L36">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.n_reactions-Tuple{SBMLModel}" href="#COBREXA.n_reactions-Tuple{SBMLModel}"><code>COBREXA.n_reactions</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">n_reactions(model::SBMLModel)::Int</code></pre><p>Efficient counting of reactions in <a href="#COBREXA.SBMLModel"><code>SBMLModel</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/SBMLModel.jl#L25-L29">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.objective-Tuple{SBMLModel}" href="#COBREXA.objective-Tuple{SBMLModel}"><code>COBREXA.objective</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">objective(model::SBMLModel)::SparseVec</code></pre><p>Objective of the <a href="#COBREXA.SBMLModel"><code>SBMLModel</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/SBMLModel.jl#L80-L84">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.reaction_gene_association-Tuple{SBMLModel, String}" href="#COBREXA.reaction_gene_association-Tuple{SBMLModel, String}"><code>COBREXA.reaction_gene_association</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">reaction_gene_association(model::SBMLModel, rid::String)::Maybe{GeneAssociation}</code></pre><p>Retrieve the <a href="#COBREXA.GeneAssociation"><code>GeneAssociation</code></a> from <a href="#COBREXA.SBMLModel"><code>SBMLModel</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/SBMLModel.jl#L101-L105">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.reaction_stoichiometry-Tuple{SBMLModel, String}" href="#COBREXA.reaction_stoichiometry-Tuple{SBMLModel, String}"><code>COBREXA.reaction_stoichiometry</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">reaction_stoichiometry(model::SBMLModel, rid::String)::Dict{String, Float64}</code></pre><p>Return the stoichiometry of reaction with ID <code>rid</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/SBMLModel.jl#L138-L142">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.reactions-Tuple{SBMLModel}" href="#COBREXA.reactions-Tuple{SBMLModel}"><code>COBREXA.reactions</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">reactions(model::SBMLModel)::Vector{String}</code></pre><p>Get reactions from a <a href="#COBREXA.SBMLModel"><code>SBMLModel</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/SBMLModel.jl#L11-L15">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.stoichiometry-Tuple{SBMLModel}" href="#COBREXA.stoichiometry-Tuple{SBMLModel}"><code>COBREXA.stoichiometry</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">stoichiometry(model::SBMLModel)::SparseMat</code></pre><p>Recreate the stoichiometry matrix from the <a href="#COBREXA.SBMLModel"><code>SBMLModel</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/SBMLModel.jl#L39-L43">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.Serialized" href="#COBREXA.Serialized"><code>COBREXA.Serialized</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia">mutable struct Serialized{M &lt;: MetabolicModel}
     m::Maybe{M}
     filename::String
-end</code></pre><p>A meta-model that represents a model that is serialized on the disk. The internal model will be loaded on-demand by using any accessor, or by calling <a href="#COBREXA.precache!-Tuple{MetabolicModel}"><code>precache!</code></a> directly.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/Serialized.jl#L2-L11">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.precache!-Tuple{Serialized}" href="#COBREXA.precache!-Tuple{Serialized}"><code>COBREXA.precache!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">precache!(model::Serialized{MetabolicModel})::Nothing</code></pre><p>Load the <code>Serialized</code> model from disk in case it&#39;s not alreadly loaded.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/Serialized.jl#L48-L52">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.StandardModel" href="#COBREXA.StandardModel"><code>COBREXA.StandardModel</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia">mutable struct StandardModel</code></pre><p><code>StandardModel</code> is used to store a constraint based metabolic model with meta-information.  Meta-information is defined as annotation details, which include gene-reaction-rules, formulas, etc.</p><p>This model type seeks to keep as much meta-information as possible, as opposed to <code>CoreModel</code> and <code>CoreModelCoupled</code>, which keep the bare neccessities only. When merging models and keeping meta-information is important, use this as the model type.  If meta-information is not important, use the more efficient core model types.  See <a href="#COBREXA.CoreModel"><code>CoreModel</code></a> and <a href="#COBREXA.CoreModelCoupled"><code>CoreModelCoupled</code></a> for comparison.</p><p>In this model, reactions, metabolites, and genes are stored in ordered dictionaries indexed by each struct&#39;s <code>id</code> field.  For example, <code>model.reactions[&quot;rxn1_id&quot;]</code> returns a <code>Reaction</code> where the field <code>id</code> equals <code>&quot;rxn1_id&quot;</code>.  This makes adding and removing reactions efficient.</p><p>Note that the stoichiometric matrix (or any other core data, e.g. flux bounds) is not stored directly as in <code>CoreModel</code>.  When this model type is used in analysis functions, these core data structures are built from scratch each time an analysis function is called.  This can cause performance issues if you run many small analysis functions sequentially.  Consider using the core model types if performance is critical.</p><p>See also: <a href="#COBREXA.Reaction"><code>Reaction</code></a>, <a href="#COBREXA.Metabolite"><code>Metabolite</code></a>, <a href="#COBREXA.Gene"><code>Gene</code></a></p><p><strong>Fields</strong></p><pre><code class="language-none">id :: String
+end</code></pre><p>A meta-model that represents a model that is serialized on the disk. The internal model will be loaded on-demand by using any accessor, or by calling <a href="#COBREXA.precache!-Tuple{MetabolicModel}"><code>precache!</code></a> directly.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/Serialized.jl#L2-L11">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.precache!-Tuple{Serialized}" href="#COBREXA.precache!-Tuple{Serialized}"><code>COBREXA.precache!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">precache!(model::Serialized{MetabolicModel})::Nothing</code></pre><p>Load the <code>Serialized</code> model from disk in case it&#39;s not alreadly loaded.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/Serialized.jl#L48-L52">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.StandardModel" href="#COBREXA.StandardModel"><code>COBREXA.StandardModel</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia">mutable struct StandardModel</code></pre><p><code>StandardModel</code> is used to store a constraint based metabolic model with meta-information.  Meta-information is defined as annotation details, which include gene-reaction-rules, formulas, etc.</p><p>This model type seeks to keep as much meta-information as possible, as opposed to <code>CoreModel</code> and <code>CoreModelCoupled</code>, which keep the bare neccessities only. When merging models and keeping meta-information is important, use this as the model type.  If meta-information is not important, use the more efficient core model types.  See <a href="#COBREXA.CoreModel"><code>CoreModel</code></a> and <a href="#COBREXA.CoreModelCoupled"><code>CoreModelCoupled</code></a> for comparison.</p><p>In this model, reactions, metabolites, and genes are stored in ordered dictionaries indexed by each struct&#39;s <code>id</code> field.  For example, <code>model.reactions[&quot;rxn1_id&quot;]</code> returns a <code>Reaction</code> where the field <code>id</code> equals <code>&quot;rxn1_id&quot;</code>.  This makes adding and removing reactions efficient.</p><p>Note that the stoichiometric matrix (or any other core data, e.g. flux bounds) is not stored directly as in <code>CoreModel</code>.  When this model type is used in analysis functions, these core data structures are built from scratch each time an analysis function is called.  This can cause performance issues if you run many small analysis functions sequentially.  Consider using the core model types if performance is critical.</p><p>See also: <a href="#COBREXA.Reaction"><code>Reaction</code></a>, <a href="#COBREXA.Metabolite"><code>Metabolite</code></a>, <a href="#COBREXA.Gene"><code>Gene</code></a></p><p><strong>Fields</strong></p><pre><code class="language-none">id :: String
 reactions :: OrderedDict{String, Reaction}
 metabolites :: OrderedDict{String, Metabolite}
 genes :: OrderedDict{String, Gene}</code></pre><p><strong>Example</strong></p><pre><code class="language-none">model = load_model(StandardModel, &quot;my_model.json&quot;)
-keys(model.reactions)</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/StandardModel.jl#L1-L42">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="Base.convert-Tuple{Type{StandardModel}, MetabolicModel}" href="#Base.convert-Tuple{Type{StandardModel}, MetabolicModel}"><code>Base.convert</code></a> — <span class="docstring-category">Method</span></header><section><div><p>Base.convert(::Type{StandardModel}, model::MetabolicModel)</p><p>Convert any <code>MetabolicModel</code> into a <code>StandardModel</code>. Note, some data loss may occur since only the generic interface is used during the conversion process.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/StandardModel.jl#L278-L284">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.balance-Tuple{StandardModel}" href="#COBREXA.balance-Tuple{StandardModel}"><code>COBREXA.balance</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">balance(model::StandardModel)</code></pre><p>Return the balance of the linear problem, i.e. b in Sv = 0 where S is the stoichiometric matrix and v is the flux vector.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/StandardModel.jl#L157-L162">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.bounds-Tuple{StandardModel}" href="#COBREXA.bounds-Tuple{StandardModel}"><code>COBREXA.bounds</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">bounds(model::StandardModel)</code></pre><p>Return the lower and upper bounds, respectively, for reactions in <code>model</code>. Order matches that of the reaction ids returned in <code>reactions()</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/StandardModel.jl#L148-L153">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.gene_annotations-Tuple{StandardModel, String}" href="#COBREXA.gene_annotations-Tuple{StandardModel, String}"><code>COBREXA.gene_annotations</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">gene_annotations(model::StandardModel, id::String)::Annotations</code></pre><p>Return the annotation associated with gene <code>id</code> in <code>model</code>. Return an empty Dict if not present.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/StandardModel.jl#L244-L249">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.gene_notes-Tuple{StandardModel, String}" href="#COBREXA.gene_notes-Tuple{StandardModel, String}"><code>COBREXA.gene_notes</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">gene_notes(model::StandardModel, id::String)::Notes</code></pre><p>Return the notes associated with gene <code>id</code> in <code>model</code>. Return an empty Dict if not present.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/StandardModel.jl#L236-L241">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.genes-Tuple{StandardModel}" href="#COBREXA.genes-Tuple{StandardModel}"><code>COBREXA.genes</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">genes(model::StandardModel)</code></pre><p>Return a vector of gene id strings in <code>model</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/StandardModel.jl#L91-L95">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.lower_bounds-Tuple{StandardModel}" href="#COBREXA.lower_bounds-Tuple{StandardModel}"><code>COBREXA.lower_bounds</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">lower_bounds(model::StandardModel)</code></pre><p>Return the lower bounds for all reactions in <code>model</code> in sparse format.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/StandardModel.jl#L131-L135">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.metabolite_annotations-Tuple{StandardModel, String}" href="#COBREXA.metabolite_annotations-Tuple{StandardModel, String}"><code>COBREXA.metabolite_annotations</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">metabolite_annotations(model::StandardModel, id::String)::Annotations</code></pre><p>Return the annotation associated with metabolite <code>id</code> in <code>model</code>. Return an empty Dict if not present.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/StandardModel.jl#L227-L232">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.metabolite_charge-Tuple{StandardModel, String}" href="#COBREXA.metabolite_charge-Tuple{StandardModel, String}"><code>COBREXA.metabolite_charge</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">metabolite_charge(model::StandardModel, id::String)</code></pre><p>Return the charge associated with metabolite <code>id</code> in <code>model</code>. Return nothing if not present.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/StandardModel.jl#L191-L196">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.metabolite_compartment-Tuple{StandardModel, String}" href="#COBREXA.metabolite_compartment-Tuple{StandardModel, String}"><code>COBREXA.metabolite_compartment</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">metabolite_compartment(model::StandardModel, id::String)</code></pre><p>Return compartment associated with metabolite <code>id</code> in <code>model</code>. Return <code>nothing</code> if not present.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/StandardModel.jl#L200-L205">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.metabolite_formula-Tuple{StandardModel, String}" href="#COBREXA.metabolite_formula-Tuple{StandardModel, String}"><code>COBREXA.metabolite_formula</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">metabolite_formula(model::StandardModel, id::String)</code></pre><p>Return the formula of reaction <code>id</code> in <code>model</code>. Return <code>nothing</code> if not present.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/StandardModel.jl#L182-L187">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.metabolite_notes-Tuple{StandardModel, String}" href="#COBREXA.metabolite_notes-Tuple{StandardModel, String}"><code>COBREXA.metabolite_notes</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">metabolite_notes(model::StandardModel, id::String)::Notes</code></pre><p>Return the notes associated with metabolite <code>id</code> in <code>model</code>. Return an empty Dict if not present.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/StandardModel.jl#L218-L223">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.metabolites-Tuple{StandardModel}" href="#COBREXA.metabolites-Tuple{StandardModel}"><code>COBREXA.metabolites</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">metabolites(model::StandardModel)</code></pre><p>Return a vector of metabolite id strings contained in <code>model</code>. The order of metabolite strings returned here matches the order used to construct the stoichiometric matrix.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/StandardModel.jl#L75-L81">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.n_genes-Tuple{StandardModel}" href="#COBREXA.n_genes-Tuple{StandardModel}"><code>COBREXA.n_genes</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">n_genes(model::StandardModel)</code></pre><p>Return the number of genes in <code>model</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/StandardModel.jl#L98-L102">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.n_metabolites-Tuple{StandardModel}" href="#COBREXA.n_metabolites-Tuple{StandardModel}"><code>COBREXA.n_metabolites</code></a> — <span class="docstring-category">Method</span></header><section><div><p>n_metabolites(model::StandardModel)</p><p>Return the number of metabolites in <code>model</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/StandardModel.jl#L84-L88">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.n_reactions-Tuple{StandardModel}" href="#COBREXA.n_reactions-Tuple{StandardModel}"><code>COBREXA.n_reactions</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">n_reactions(model::StandardModel)</code></pre><p>Return the number of reactions contained in <code>model</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/StandardModel.jl#L67-L71">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.objective-Tuple{StandardModel}" href="#COBREXA.objective-Tuple{StandardModel}"><code>COBREXA.objective</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">objective(model::StandardModel)</code></pre><p>Return sparse objective vector for <code>model</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/StandardModel.jl#L165-L169">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.reaction_annotations-Tuple{StandardModel, String}" href="#COBREXA.reaction_annotations-Tuple{StandardModel, String}"><code>COBREXA.reaction_annotations</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">reaction_annotations(model::StandardModel, id::String)::Annotations</code></pre><p>Return the annotation associated with reaction <code>id</code> in <code>model</code>. Return an empty Dict if not present.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/StandardModel.jl#L261-L266">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.reaction_gene_association-Tuple{StandardModel, String}" href="#COBREXA.reaction_gene_association-Tuple{StandardModel, String}"><code>COBREXA.reaction_gene_association</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">reaction_gene_association(model::StandardModel, id::String)</code></pre><p>Return the gene reaction rule in string format for reaction with <code>id</code> in <code>model</code>. Return <code>nothing</code> if not available.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/StandardModel.jl#L173-L178">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.reaction_notes-Tuple{StandardModel, String}" href="#COBREXA.reaction_notes-Tuple{StandardModel, String}"><code>COBREXA.reaction_notes</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">reaction_notes(model::StandardModel, id::String)::Notes</code></pre><p>Return the notes associated with reaction <code>id</code> in <code>model</code>. Return an empty Dict if not present.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/StandardModel.jl#L253-L258">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.reaction_stoichiometry-Tuple{StandardModel, String}" href="#COBREXA.reaction_stoichiometry-Tuple{StandardModel, String}"><code>COBREXA.reaction_stoichiometry</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">reaction_stoichiometry(model::StandardModel, rid::String)::Dict{String, Float64}</code></pre><p>Return the stoichiometry of reaction with ID <code>rid</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/StandardModel.jl#L270-L274">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.reaction_subsystem-Tuple{StandardModel, String}" href="#COBREXA.reaction_subsystem-Tuple{StandardModel, String}"><code>COBREXA.reaction_subsystem</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">reaction_subsystem(id::String, model::StandardModel)</code></pre><p>Return the subsystem associated with reaction <code>id</code> in <code>model</code>. Return <code>nothing</code> if not present.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/StandardModel.jl#L209-L214">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.reactions-Tuple{StandardModel}" href="#COBREXA.reactions-Tuple{StandardModel}"><code>COBREXA.reactions</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">reactions(model::StandardModel)</code></pre><p>Return a vector of reaction id strings contained in <code>model</code>. The order of reaction ids returned here matches the order used to construct the stoichiometric matrix.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/StandardModel.jl#L58-L64">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.stoichiometry-Tuple{StandardModel}" href="#COBREXA.stoichiometry-Tuple{StandardModel}"><code>COBREXA.stoichiometry</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">stoichiometry(model::StandardModel)</code></pre><p>Return the stoichiometric matrix associated with <code>model</code> in sparse format.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/StandardModel.jl#L105-L109">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.upper_bounds-Tuple{StandardModel}" href="#COBREXA.upper_bounds-Tuple{StandardModel}"><code>COBREXA.upper_bounds</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">upper_bounds(model::StandardModel)</code></pre><p>Return the upper bounds for all reactions in <code>model</code> in sparse format. Order matches that of the reaction ids returned in <code>reactions()</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/types/StandardModel.jl#L139-L144">source</a></section></article><h2 id="Base-functions"><a class="docs-heading-anchor" href="#Base-functions">Base functions</a><a id="Base-functions-1"></a><a class="docs-heading-anchor-permalink" href="#Base-functions" title="Permalink"></a></h2><article class="docstring"><header><a class="docstring-binding" id="COBREXA._constants" href="#COBREXA._constants"><code>COBREXA._constants</code></a> — <span class="docstring-category">Constant</span></header><section><div><p>A named tuple that contains the magic values that are used globally for whatever purposes.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/constants.jl#L2-L5">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.get_optmodel_bounds-Tuple{Any}" href="#COBREXA.get_optmodel_bounds-Tuple{Any}"><code>COBREXA.get_optmodel_bounds</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">get_optmodel_bounds(opt_model)</code></pre><p>Returns vectors of the lower and upper bounds of <code>opt_model</code> constraints, where <code>opt_model</code> is a JuMP model constructed by e.g. <a href="#COBREXA.make_optimization_model-Tuple{MetabolicModel, Any}"><code>make_optimization_model</code></a> or <a href="#COBREXA.flux_balance_analysis-Union{Tuple{M}, Tuple{M, Any}} where M&lt;:MetabolicModel"><code>flux_balance_analysis</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/solver.jl#L60-L66">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.is_solved-Tuple{Any}" href="#COBREXA.is_solved-Tuple{Any}"><code>COBREXA.is_solved</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">is_solved(optmodel)</code></pre><p>Return <code>true</code> if <code>optmodel</code> solved successfully (solution is optimal or locally optimal).  Return <code>false</code> if any other termination status is reached. Termination status is defined in the documentation of <code>JuMP</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/solver.jl#L34-L40">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.make_optimization_model-Tuple{MetabolicModel, Any}" href="#COBREXA.make_optimization_model-Tuple{MetabolicModel, Any}"><code>COBREXA.make_optimization_model</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">make_optimization_model(
+keys(model.reactions)</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/StandardModel.jl#L1-L42">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="Base.convert-Tuple{Type{StandardModel}, MetabolicModel}" href="#Base.convert-Tuple{Type{StandardModel}, MetabolicModel}"><code>Base.convert</code></a> — <span class="docstring-category">Method</span></header><section><div><p>Base.convert(::Type{StandardModel}, model::MetabolicModel)</p><p>Convert any <code>MetabolicModel</code> into a <code>StandardModel</code>. Note, some data loss may occur since only the generic interface is used during the conversion process.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/StandardModel.jl#L278-L284">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.balance-Tuple{StandardModel}" href="#COBREXA.balance-Tuple{StandardModel}"><code>COBREXA.balance</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">balance(model::StandardModel)</code></pre><p>Return the balance of the linear problem, i.e. b in Sv = 0 where S is the stoichiometric matrix and v is the flux vector.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/StandardModel.jl#L157-L162">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.bounds-Tuple{StandardModel}" href="#COBREXA.bounds-Tuple{StandardModel}"><code>COBREXA.bounds</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">bounds(model::StandardModel)</code></pre><p>Return the lower and upper bounds, respectively, for reactions in <code>model</code>. Order matches that of the reaction ids returned in <code>reactions()</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/StandardModel.jl#L148-L153">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.gene_annotations-Tuple{StandardModel, String}" href="#COBREXA.gene_annotations-Tuple{StandardModel, String}"><code>COBREXA.gene_annotations</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">gene_annotations(model::StandardModel, id::String)::Annotations</code></pre><p>Return the annotation associated with gene <code>id</code> in <code>model</code>. Return an empty Dict if not present.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/StandardModel.jl#L244-L249">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.gene_notes-Tuple{StandardModel, String}" href="#COBREXA.gene_notes-Tuple{StandardModel, String}"><code>COBREXA.gene_notes</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">gene_notes(model::StandardModel, id::String)::Notes</code></pre><p>Return the notes associated with gene <code>id</code> in <code>model</code>. Return an empty Dict if not present.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/StandardModel.jl#L236-L241">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.genes-Tuple{StandardModel}" href="#COBREXA.genes-Tuple{StandardModel}"><code>COBREXA.genes</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">genes(model::StandardModel)</code></pre><p>Return a vector of gene id strings in <code>model</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/StandardModel.jl#L91-L95">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.lower_bounds-Tuple{StandardModel}" href="#COBREXA.lower_bounds-Tuple{StandardModel}"><code>COBREXA.lower_bounds</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">lower_bounds(model::StandardModel)</code></pre><p>Return the lower bounds for all reactions in <code>model</code> in sparse format.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/StandardModel.jl#L131-L135">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.metabolite_annotations-Tuple{StandardModel, String}" href="#COBREXA.metabolite_annotations-Tuple{StandardModel, String}"><code>COBREXA.metabolite_annotations</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">metabolite_annotations(model::StandardModel, id::String)::Annotations</code></pre><p>Return the annotation associated with metabolite <code>id</code> in <code>model</code>. Return an empty Dict if not present.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/StandardModel.jl#L227-L232">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.metabolite_charge-Tuple{StandardModel, String}" href="#COBREXA.metabolite_charge-Tuple{StandardModel, String}"><code>COBREXA.metabolite_charge</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">metabolite_charge(model::StandardModel, id::String)</code></pre><p>Return the charge associated with metabolite <code>id</code> in <code>model</code>. Return nothing if not present.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/StandardModel.jl#L191-L196">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.metabolite_compartment-Tuple{StandardModel, String}" href="#COBREXA.metabolite_compartment-Tuple{StandardModel, String}"><code>COBREXA.metabolite_compartment</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">metabolite_compartment(model::StandardModel, id::String)</code></pre><p>Return compartment associated with metabolite <code>id</code> in <code>model</code>. Return <code>nothing</code> if not present.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/StandardModel.jl#L200-L205">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.metabolite_formula-Tuple{StandardModel, String}" href="#COBREXA.metabolite_formula-Tuple{StandardModel, String}"><code>COBREXA.metabolite_formula</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">metabolite_formula(model::StandardModel, id::String)</code></pre><p>Return the formula of reaction <code>id</code> in <code>model</code>. Return <code>nothing</code> if not present.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/StandardModel.jl#L182-L187">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.metabolite_notes-Tuple{StandardModel, String}" href="#COBREXA.metabolite_notes-Tuple{StandardModel, String}"><code>COBREXA.metabolite_notes</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">metabolite_notes(model::StandardModel, id::String)::Notes</code></pre><p>Return the notes associated with metabolite <code>id</code> in <code>model</code>. Return an empty Dict if not present.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/StandardModel.jl#L218-L223">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.metabolites-Tuple{StandardModel}" href="#COBREXA.metabolites-Tuple{StandardModel}"><code>COBREXA.metabolites</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">metabolites(model::StandardModel)</code></pre><p>Return a vector of metabolite id strings contained in <code>model</code>. The order of metabolite strings returned here matches the order used to construct the stoichiometric matrix.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/StandardModel.jl#L75-L81">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.n_genes-Tuple{StandardModel}" href="#COBREXA.n_genes-Tuple{StandardModel}"><code>COBREXA.n_genes</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">n_genes(model::StandardModel)</code></pre><p>Return the number of genes in <code>model</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/StandardModel.jl#L98-L102">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.n_metabolites-Tuple{StandardModel}" href="#COBREXA.n_metabolites-Tuple{StandardModel}"><code>COBREXA.n_metabolites</code></a> — <span class="docstring-category">Method</span></header><section><div><p>n_metabolites(model::StandardModel)</p><p>Return the number of metabolites in <code>model</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/StandardModel.jl#L84-L88">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.n_reactions-Tuple{StandardModel}" href="#COBREXA.n_reactions-Tuple{StandardModel}"><code>COBREXA.n_reactions</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">n_reactions(model::StandardModel)</code></pre><p>Return the number of reactions contained in <code>model</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/StandardModel.jl#L67-L71">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.objective-Tuple{StandardModel}" href="#COBREXA.objective-Tuple{StandardModel}"><code>COBREXA.objective</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">objective(model::StandardModel)</code></pre><p>Return sparse objective vector for <code>model</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/StandardModel.jl#L165-L169">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.reaction_annotations-Tuple{StandardModel, String}" href="#COBREXA.reaction_annotations-Tuple{StandardModel, String}"><code>COBREXA.reaction_annotations</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">reaction_annotations(model::StandardModel, id::String)::Annotations</code></pre><p>Return the annotation associated with reaction <code>id</code> in <code>model</code>. Return an empty Dict if not present.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/StandardModel.jl#L261-L266">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.reaction_gene_association-Tuple{StandardModel, String}" href="#COBREXA.reaction_gene_association-Tuple{StandardModel, String}"><code>COBREXA.reaction_gene_association</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">reaction_gene_association(model::StandardModel, id::String)</code></pre><p>Return the gene reaction rule in string format for reaction with <code>id</code> in <code>model</code>. Return <code>nothing</code> if not available.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/StandardModel.jl#L173-L178">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.reaction_notes-Tuple{StandardModel, String}" href="#COBREXA.reaction_notes-Tuple{StandardModel, String}"><code>COBREXA.reaction_notes</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">reaction_notes(model::StandardModel, id::String)::Notes</code></pre><p>Return the notes associated with reaction <code>id</code> in <code>model</code>. Return an empty Dict if not present.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/StandardModel.jl#L253-L258">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.reaction_stoichiometry-Tuple{StandardModel, String}" href="#COBREXA.reaction_stoichiometry-Tuple{StandardModel, String}"><code>COBREXA.reaction_stoichiometry</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">reaction_stoichiometry(model::StandardModel, rid::String)::Dict{String, Float64}</code></pre><p>Return the stoichiometry of reaction with ID <code>rid</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/StandardModel.jl#L270-L274">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.reaction_subsystem-Tuple{StandardModel, String}" href="#COBREXA.reaction_subsystem-Tuple{StandardModel, String}"><code>COBREXA.reaction_subsystem</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">reaction_subsystem(id::String, model::StandardModel)</code></pre><p>Return the subsystem associated with reaction <code>id</code> in <code>model</code>. Return <code>nothing</code> if not present.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/StandardModel.jl#L209-L214">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.reactions-Tuple{StandardModel}" href="#COBREXA.reactions-Tuple{StandardModel}"><code>COBREXA.reactions</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">reactions(model::StandardModel)</code></pre><p>Return a vector of reaction id strings contained in <code>model</code>. The order of reaction ids returned here matches the order used to construct the stoichiometric matrix.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/StandardModel.jl#L58-L64">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.stoichiometry-Tuple{StandardModel}" href="#COBREXA.stoichiometry-Tuple{StandardModel}"><code>COBREXA.stoichiometry</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">stoichiometry(model::StandardModel)</code></pre><p>Return the stoichiometric matrix associated with <code>model</code> in sparse format.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/StandardModel.jl#L105-L109">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.upper_bounds-Tuple{StandardModel}" href="#COBREXA.upper_bounds-Tuple{StandardModel}"><code>COBREXA.upper_bounds</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">upper_bounds(model::StandardModel)</code></pre><p>Return the upper bounds for all reactions in <code>model</code> in sparse format. Order matches that of the reaction ids returned in <code>reactions()</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/types/StandardModel.jl#L139-L144">source</a></section></article><h2 id="Base-functions"><a class="docs-heading-anchor" href="#Base-functions">Base functions</a><a id="Base-functions-1"></a><a class="docs-heading-anchor-permalink" href="#Base-functions" title="Permalink"></a></h2><article class="docstring"><header><a class="docstring-binding" id="COBREXA._constants" href="#COBREXA._constants"><code>COBREXA._constants</code></a> — <span class="docstring-category">Constant</span></header><section><div><p>A named tuple that contains the magic values that are used globally for whatever purposes.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/constants.jl#L2-L5">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.get_optmodel_bounds-Tuple{Any}" href="#COBREXA.get_optmodel_bounds-Tuple{Any}"><code>COBREXA.get_optmodel_bounds</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">get_optmodel_bounds(opt_model)</code></pre><p>Returns vectors of the lower and upper bounds of <code>opt_model</code> constraints, where <code>opt_model</code> is a JuMP model constructed by e.g. <a href="#COBREXA.make_optimization_model-Tuple{MetabolicModel, Any}"><code>make_optimization_model</code></a> or <a href="#COBREXA.flux_balance_analysis-Union{Tuple{M}, Tuple{M, Any}} where M&lt;:MetabolicModel"><code>flux_balance_analysis</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/solver.jl#L60-L66">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.is_solved-Tuple{Any}" href="#COBREXA.is_solved-Tuple{Any}"><code>COBREXA.is_solved</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">is_solved(optmodel)</code></pre><p>Return <code>true</code> if <code>optmodel</code> solved successfully (solution is optimal or locally optimal).  Return <code>false</code> if any other termination status is reached. Termination status is defined in the documentation of <code>JuMP</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/solver.jl#L34-L40">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.make_optimization_model-Tuple{MetabolicModel, Any}" href="#COBREXA.make_optimization_model-Tuple{MetabolicModel, Any}"><code>COBREXA.make_optimization_model</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">make_optimization_model(
     model::MetabolicModel,
     optimizer;
     sense = MOI.MAX_SENSE,
-)</code></pre><p>Convert <code>MetabolicModel</code>s to a JuMP model, place objectives and the equality constraint.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/solver.jl#L2-L11">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.optimize_objective-Tuple{Any}" href="#COBREXA.optimize_objective-Tuple{Any}"><code>COBREXA.optimize_objective</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">optimize_objective(optmodel)::Union{Float64,Nothing}</code></pre><p>Shortcut for running JuMP <code>optimize!</code> on a model and returning the objective value, if solved.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/solver.jl#L45-L50">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.set_optmodel_bound!-Tuple{Any, Any}" href="#COBREXA.set_optmodel_bound!-Tuple{Any, Any}"><code>COBREXA.set_optmodel_bound!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">set_optmodel_bound!(index, optimization_model;
+)</code></pre><p>Convert <code>MetabolicModel</code>s to a JuMP model, place objectives and the equality constraint.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/solver.jl#L2-L11">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.optimize_objective-Tuple{Any}" href="#COBREXA.optimize_objective-Tuple{Any}"><code>COBREXA.optimize_objective</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">optimize_objective(optmodel)::Union{Float64,Nothing}</code></pre><p>Shortcut for running JuMP <code>optimize!</code> on a model and returning the objective value, if solved.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/solver.jl#L45-L50">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.set_optmodel_bound!-Tuple{Any, Any}" href="#COBREXA.set_optmodel_bound!-Tuple{Any, Any}"><code>COBREXA.set_optmodel_bound!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">set_optmodel_bound!(index, optimization_model;
     ub=_constants.default_reaction_rate,
-    lb=-_constants.default_reaction_rate)</code></pre><p>Helper function to set the bounds of variables. The JuMP <code>set_normalized_rhs</code> function is a little confusing, so this function simplifies setting constraints. In short, JuMP uses a normalized right hand side representation of constraints, which means that lower bounds have their sign flipped. This function does this for you, so you don&#39;t have to remember to do this whenever you change the constraints.</p><p>Just supply the constraint <code>index</code> and the JuMP model (<code>opt_model</code>) that will be solved, and the variable&#39;s bounds will be set to <code>ub</code> and <code>lb</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/solver.jl#L72-L87">source</a></section></article><h2 id="File-I/O-and-serialization"><a class="docs-heading-anchor" href="#File-I/O-and-serialization">File I/O and serialization</a><a id="File-I/O-and-serialization-1"></a><a class="docs-heading-anchor-permalink" href="#File-I/O-and-serialization" title="Permalink"></a></h2><article class="docstring"><header><a class="docstring-binding" id="COBREXA.load_model-Tuple{String}" href="#COBREXA.load_model-Tuple{String}"><code>COBREXA.load_model</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">load_model(file_name::String)::MetabolicModel</code></pre><p>Generic function for loading models that chooses a specific loader function from the <code>file_name</code> extension, or throws an error.</p><p>Currently, these model types are supported:</p><ul><li>SBML models (<code>*.xml</code>, loaded with <a href="#COBREXA.load_sbml_model-Tuple{String}"><code>load_sbml_model</code></a>)</li><li>JSON models (<code>*.json</code>, loaded with <a href="#COBREXA.load_json_model-Tuple{String}"><code>load_json_model</code></a>)</li><li>MATLAB models (<code>*.mat</code>, loaded with <a href="#COBREXA.load_mat_model-Tuple{String}"><code>load_mat_model</code></a>)</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/io/io.jl#L2-L13">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.load_model-Union{Tuple{T}, Tuple{Type{T}, String}} where T&lt;:MetabolicModel" href="#COBREXA.load_model-Union{Tuple{T}, Tuple{Type{T}, String}} where T&lt;:MetabolicModel"><code>COBREXA.load_model</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">load_model(type::Type{T}, file_name::String)::T where T</code></pre><p>Helper function tht loads the model using <a href="#COBREXA.load_model-Tuple{String}"><code>load_model</code></a> and return it converted to <code>type</code>.</p><p><strong>Example:</strong></p><pre><code class="language-none">load_model(CoreModel, &quot;mySBMLModel.xml&quot;)</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/io/io.jl#L27-L36">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.save_model-Tuple{MetabolicModel, String}" href="#COBREXA.save_model-Tuple{MetabolicModel, String}"><code>COBREXA.save_model</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">save_model(model::MetabolicModel, file_name::String)</code></pre><p>Generic function for saving models that chooses a specific writer function from the <code>file_name</code> extension, or throws an error.</p><p>Currently, these model types are supported:</p><ul><li>JSON models (<code>*.json</code>, loaded with <a href="#COBREXA.save_json_model-Tuple{MetabolicModel, String}"><code>save_json_model</code></a>)</li><li>MATLAB models (<code>*.mat</code>, loaded with <a href="#COBREXA.save_mat_model-Tuple{MetabolicModel, String}"><code>save_mat_model</code></a>)</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/io/io.jl#L41-L51">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.load_json_model-Tuple{String}" href="#COBREXA.load_json_model-Tuple{String}"><code>COBREXA.load_json_model</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">load_json_model(filename::String)::JSONModel</code></pre><p>Load and return a JSON-formatted model that is stored in <code>file_name</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/io/json.jl#L1-L5">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.save_json_model-Tuple{MetabolicModel, String}" href="#COBREXA.save_json_model-Tuple{MetabolicModel, String}"><code>COBREXA.save_json_model</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">save_json_model(model::MetabolicModel, file_name::String)</code></pre><p>Save a <a href="#COBREXA.JSONModel"><code>JSONModel</code></a> in <code>model</code> to a JSON file <code>file_name</code>.</p><p>In case the <code>model</code> is not <code>JSONModel</code>, it will be converted automatically.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/io/json.jl#L10-L16">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.load_mat_model-Tuple{String}" href="#COBREXA.load_mat_model-Tuple{String}"><code>COBREXA.load_mat_model</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">load_mat_model(file_name::String)</code></pre><p>Load and return a MATLAB file <code>file_name</code> that contains a COBRA-compatible model.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/io/mat.jl#L2-L7">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.save_mat_model-Tuple{MetabolicModel, String}" href="#COBREXA.save_mat_model-Tuple{MetabolicModel, String}"><code>COBREXA.save_mat_model</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">save_mat_model(model::MetabolicModel, file_name::String; model_name::String=&quot;model&quot;)</code></pre><p>Save a <a href="#COBREXA.MATModel"><code>MATModel</code></a> in <code>model</code> to a MATLAB file <code>file_name</code> in a format compatible with other MATLAB-based COBRA software.</p><p>In case the <code>model</code> is not <code>MATModel</code>, it will be converted automatically.</p><p><code>model_name</code> is the identifier name for the whole model written to the MATLAB file; defaults to just &quot;model&quot;.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/io/mat.jl#L14-L24">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.load_sbml_model-Tuple{String}" href="#COBREXA.load_sbml_model-Tuple{String}"><code>COBREXA.load_sbml_model</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">load_sbml_model(file_name::String)::SBMLModel</code></pre><p>Load and return a SBML XML model in <code>file_name</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/io/sbml.jl#L2-L6">source</a></section></article><h3 id="Pretty-printing"><a class="docs-heading-anchor" href="#Pretty-printing">Pretty printing</a><a id="Pretty-printing-1"></a><a class="docs-heading-anchor-permalink" href="#Pretty-printing" title="Permalink"></a></h3><article class="docstring"><header><a class="docstring-binding" id="Base.show-Tuple{IO, MIME{Symbol(&quot;text/plain&quot;)}, MetabolicModel}" href="#Base.show-Tuple{IO, MIME{Symbol(&quot;text/plain&quot;)}, MetabolicModel}"><code>Base.show</code></a> — <span class="docstring-category">Method</span></header><section><div><p>Pretty printing of everything metabolic-modelish.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/io/show/MetabolicModel.jl#L1-L3">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA._pretty_substances-Tuple{Vector{String}}" href="#COBREXA._pretty_substances-Tuple{Vector{String}}"><code>COBREXA._pretty_substances</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">_pretty_substances(ss::Vector{String})::String</code></pre><p>Nicely format a substance list.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/io/show/Reaction.jl#L2-L6">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="Base.show-Union{Tuple{M}, Tuple{IO, MIME{Symbol(&quot;text/plain&quot;)}, Serialized{M}}} where M" href="#Base.show-Union{Tuple{M}, Tuple{IO, MIME{Symbol(&quot;text/plain&quot;)}, Serialized{M}}} where M"><code>Base.show</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">Base.show(io::IO, ::MIME&quot;text/plain&quot;, m::Serialized{M}) where {M}</code></pre><p>Show the <a href="#COBREXA.Serialized"><code>Serialized</code></a> model without unnecessarily loading it.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/io/show/Serialized.jl#L2-L6">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA._pretty_print_keyvals-Tuple{Any, String, Any}" href="#COBREXA._pretty_print_keyvals-Tuple{Any, String, Any}"><code>COBREXA._pretty_print_keyvals</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">_pretty_print_keyvals(io, def::String, payload; kwargs...)</code></pre><p>Nicely prints keys and values.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/io/show/pretty_printing.jl#L1-L5">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA._pretty_print_keyvals-Tuple{Any, String, Dict}" href="#COBREXA._pretty_print_keyvals-Tuple{Any, String, Dict}"><code>COBREXA._pretty_print_keyvals</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">_pretty_print_keyvals(
+    lb=-_constants.default_reaction_rate)</code></pre><p>Helper function to set the bounds of variables. The JuMP <code>set_normalized_rhs</code> function is a little confusing, so this function simplifies setting constraints. In short, JuMP uses a normalized right hand side representation of constraints, which means that lower bounds have their sign flipped. This function does this for you, so you don&#39;t have to remember to do this whenever you change the constraints.</p><p>Just supply the constraint <code>index</code> and the JuMP model (<code>opt_model</code>) that will be solved, and the variable&#39;s bounds will be set to <code>ub</code> and <code>lb</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/solver.jl#L72-L87">source</a></section></article><h2 id="File-I/O-and-serialization"><a class="docs-heading-anchor" href="#File-I/O-and-serialization">File I/O and serialization</a><a id="File-I/O-and-serialization-1"></a><a class="docs-heading-anchor-permalink" href="#File-I/O-and-serialization" title="Permalink"></a></h2><article class="docstring"><header><a class="docstring-binding" id="COBREXA.load_model-Tuple{String}" href="#COBREXA.load_model-Tuple{String}"><code>COBREXA.load_model</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">load_model(file_name::String)::MetabolicModel</code></pre><p>Generic function for loading models that chooses a specific loader function from the <code>file_name</code> extension, or throws an error.</p><p>Currently, these model types are supported:</p><ul><li>SBML models (<code>*.xml</code>, loaded with <a href="#COBREXA.load_sbml_model-Tuple{String}"><code>load_sbml_model</code></a>)</li><li>JSON models (<code>*.json</code>, loaded with <a href="#COBREXA.load_json_model-Tuple{String}"><code>load_json_model</code></a>)</li><li>MATLAB models (<code>*.mat</code>, loaded with <a href="#COBREXA.load_mat_model-Tuple{String}"><code>load_mat_model</code></a>)</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/io/io.jl#L2-L13">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.load_model-Union{Tuple{T}, Tuple{Type{T}, String}} where T&lt;:MetabolicModel" href="#COBREXA.load_model-Union{Tuple{T}, Tuple{Type{T}, String}} where T&lt;:MetabolicModel"><code>COBREXA.load_model</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">load_model(type::Type{T}, file_name::String)::T where T</code></pre><p>Helper function tht loads the model using <a href="#COBREXA.load_model-Tuple{String}"><code>load_model</code></a> and return it converted to <code>type</code>.</p><p><strong>Example:</strong></p><pre><code class="language-none">load_model(CoreModel, &quot;mySBMLModel.xml&quot;)</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/io/io.jl#L27-L36">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.save_model-Tuple{MetabolicModel, String}" href="#COBREXA.save_model-Tuple{MetabolicModel, String}"><code>COBREXA.save_model</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">save_model(model::MetabolicModel, file_name::String)</code></pre><p>Generic function for saving models that chooses a specific writer function from the <code>file_name</code> extension, or throws an error.</p><p>Currently, these model types are supported:</p><ul><li>JSON models (<code>*.json</code>, loaded with <a href="#COBREXA.save_json_model-Tuple{MetabolicModel, String}"><code>save_json_model</code></a>)</li><li>MATLAB models (<code>*.mat</code>, loaded with <a href="#COBREXA.save_mat_model-Tuple{MetabolicModel, String}"><code>save_mat_model</code></a>)</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/io/io.jl#L41-L51">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.load_json_model-Tuple{String}" href="#COBREXA.load_json_model-Tuple{String}"><code>COBREXA.load_json_model</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">load_json_model(filename::String)::JSONModel</code></pre><p>Load and return a JSON-formatted model that is stored in <code>file_name</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/io/json.jl#L1-L5">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.save_json_model-Tuple{MetabolicModel, String}" href="#COBREXA.save_json_model-Tuple{MetabolicModel, String}"><code>COBREXA.save_json_model</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">save_json_model(model::MetabolicModel, file_name::String)</code></pre><p>Save a <a href="#COBREXA.JSONModel"><code>JSONModel</code></a> in <code>model</code> to a JSON file <code>file_name</code>.</p><p>In case the <code>model</code> is not <code>JSONModel</code>, it will be converted automatically.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/io/json.jl#L10-L16">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.load_mat_model-Tuple{String}" href="#COBREXA.load_mat_model-Tuple{String}"><code>COBREXA.load_mat_model</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">load_mat_model(file_name::String)</code></pre><p>Load and return a MATLAB file <code>file_name</code> that contains a COBRA-compatible model.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/io/mat.jl#L2-L7">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.save_mat_model-Tuple{MetabolicModel, String}" href="#COBREXA.save_mat_model-Tuple{MetabolicModel, String}"><code>COBREXA.save_mat_model</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">save_mat_model(model::MetabolicModel, file_name::String; model_name::String=&quot;model&quot;)</code></pre><p>Save a <a href="#COBREXA.MATModel"><code>MATModel</code></a> in <code>model</code> to a MATLAB file <code>file_name</code> in a format compatible with other MATLAB-based COBRA software.</p><p>In case the <code>model</code> is not <code>MATModel</code>, it will be converted automatically.</p><p><code>model_name</code> is the identifier name for the whole model written to the MATLAB file; defaults to just &quot;model&quot;.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/io/mat.jl#L14-L24">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.load_sbml_model-Tuple{String}" href="#COBREXA.load_sbml_model-Tuple{String}"><code>COBREXA.load_sbml_model</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">load_sbml_model(file_name::String)::SBMLModel</code></pre><p>Load and return a SBML XML model in <code>file_name</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/io/sbml.jl#L2-L6">source</a></section></article><h3 id="Pretty-printing"><a class="docs-heading-anchor" href="#Pretty-printing">Pretty printing</a><a id="Pretty-printing-1"></a><a class="docs-heading-anchor-permalink" href="#Pretty-printing" title="Permalink"></a></h3><article class="docstring"><header><a class="docstring-binding" id="Base.show-Tuple{IO, MIME{Symbol(&quot;text/plain&quot;)}, MetabolicModel}" href="#Base.show-Tuple{IO, MIME{Symbol(&quot;text/plain&quot;)}, MetabolicModel}"><code>Base.show</code></a> — <span class="docstring-category">Method</span></header><section><div><p>Pretty printing of everything metabolic-modelish.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/io/show/MetabolicModel.jl#L1-L3">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA._pretty_substances-Tuple{Vector{String}}" href="#COBREXA._pretty_substances-Tuple{Vector{String}}"><code>COBREXA._pretty_substances</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">_pretty_substances(ss::Vector{String})::String</code></pre><p>Nicely format a substance list.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/io/show/Reaction.jl#L2-L6">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="Base.show-Union{Tuple{M}, Tuple{IO, MIME{Symbol(&quot;text/plain&quot;)}, Serialized{M}}} where M" href="#Base.show-Union{Tuple{M}, Tuple{IO, MIME{Symbol(&quot;text/plain&quot;)}, Serialized{M}}} where M"><code>Base.show</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">Base.show(io::IO, ::MIME&quot;text/plain&quot;, m::Serialized{M}) where {M}</code></pre><p>Show the <a href="#COBREXA.Serialized"><code>Serialized</code></a> model without unnecessarily loading it.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/io/show/Serialized.jl#L2-L6">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA._pretty_print_keyvals-Tuple{Any, String, Any}" href="#COBREXA._pretty_print_keyvals-Tuple{Any, String, Any}"><code>COBREXA._pretty_print_keyvals</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">_pretty_print_keyvals(io, def::String, payload; kwargs...)</code></pre><p>Nicely prints keys and values.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/io/show/pretty_printing.jl#L1-L5">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA._pretty_print_keyvals-Tuple{Any, String, Dict}" href="#COBREXA._pretty_print_keyvals-Tuple{Any, String, Dict}"><code>COBREXA._pretty_print_keyvals</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">_pretty_print_keyvals(
     io,
     def::String,
     payload::Dict
-)</code></pre><p>Specialization of <code>_pretty_print_keyvals</code> for dictionaries.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/io/show/pretty_printing.jl#L27-L35">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA._pretty_print_keyvals-Tuple{Any, String, String}" href="#COBREXA._pretty_print_keyvals-Tuple{Any, String, String}"><code>COBREXA._pretty_print_keyvals</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">_pretty_print_keyvals(
+)</code></pre><p>Specialization of <code>_pretty_print_keyvals</code> for dictionaries.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/io/show/pretty_printing.jl#L27-L35">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA._pretty_print_keyvals-Tuple{Any, String, String}" href="#COBREXA._pretty_print_keyvals-Tuple{Any, String, String}"><code>COBREXA._pretty_print_keyvals</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">_pretty_print_keyvals(
     io,
     def::String,
     payload::String
-)</code></pre><p>Specialization of <code>_pretty_print_keyvals</code> for plain strings.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/io/show/pretty_printing.jl#L9-L17">source</a></section></article><h2 id="Model-reconstruction"><a class="docs-heading-anchor" href="#Model-reconstruction">Model reconstruction</a><a id="Model-reconstruction-1"></a><a class="docs-heading-anchor-permalink" href="#Model-reconstruction" title="Permalink"></a></h2><article class="docstring"><header><a class="docstring-binding" id="COBREXA.add_reactions-Tuple{CoreModel, CoreModel}" href="#COBREXA.add_reactions-Tuple{CoreModel, CoreModel}"><code>COBREXA.add_reactions</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">add_reactions(m1::CoreModel, m2::CoreModel; check_consistency = false)</code></pre><p>Add all reactions from <code>m2</code> to <code>m1</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/reconstruction/CoreModel.jl#L109-L114">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.add_reactions-Union{Tuple{K}, Tuple{V2}, Tuple{V1}, Tuple{CoreModel, V1, V2, AbstractFloat, AbstractFloat, AbstractFloat, String, K}} where {V1&lt;:AbstractVector{Float64}, V2&lt;:AbstractVector{Float64}, K&lt;:AbstractVector{String}}" href="#COBREXA.add_reactions-Union{Tuple{K}, Tuple{V2}, Tuple{V1}, Tuple{CoreModel, V1, V2, AbstractFloat, AbstractFloat, AbstractFloat, String, K}} where {V1&lt;:AbstractVector{Float64}, V2&lt;:AbstractVector{Float64}, K&lt;:AbstractVector{String}}"><code>COBREXA.add_reactions</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">add_reactions(
+)</code></pre><p>Specialization of <code>_pretty_print_keyvals</code> for plain strings.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/io/show/pretty_printing.jl#L9-L17">source</a></section></article><h2 id="Model-reconstruction"><a class="docs-heading-anchor" href="#Model-reconstruction">Model reconstruction</a><a id="Model-reconstruction-1"></a><a class="docs-heading-anchor-permalink" href="#Model-reconstruction" title="Permalink"></a></h2><article class="docstring"><header><a class="docstring-binding" id="COBREXA.add_reactions-Tuple{CoreModel, CoreModel}" href="#COBREXA.add_reactions-Tuple{CoreModel, CoreModel}"><code>COBREXA.add_reactions</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">add_reactions(m1::CoreModel, m2::CoreModel; check_consistency = false)</code></pre><p>Add all reactions from <code>m2</code> to <code>m1</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/reconstruction/CoreModel.jl#L109-L114">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.add_reactions-Union{Tuple{K}, Tuple{V2}, Tuple{V1}, Tuple{CoreModel, V1, V2, AbstractFloat, AbstractFloat, AbstractFloat, String, K}} where {V1&lt;:AbstractVector{Float64}, V2&lt;:AbstractVector{Float64}, K&lt;:AbstractVector{String}}" href="#COBREXA.add_reactions-Union{Tuple{K}, Tuple{V2}, Tuple{V1}, Tuple{CoreModel, V1, V2, AbstractFloat, AbstractFloat, AbstractFloat, String, K}} where {V1&lt;:AbstractVector{Float64}, V2&lt;:AbstractVector{Float64}, K&lt;:AbstractVector{String}}"><code>COBREXA.add_reactions</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">add_reactions(
     m::CoreModel,
     s::V1,
     b::V2,
@@ -115,7 +115,7 @@ keys(model.reactions)</code></pre></div><a class="docs-sourcelink" target="_blan
     rxn::String,
     mets::K;
     check_consistency = false,
-) where {V1&lt;:VecType,V2&lt;:VecType,K&lt;:StringVecType}</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/reconstruction/CoreModel.jl#L35-L48">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.add_reactions-Union{Tuple{K}, Tuple{V}, Tuple{M}, Tuple{CoreModel, M, V, V, V, V, K, K}} where {M&lt;:AbstractMatrix{Float64}, V&lt;:AbstractVector{Float64}, K&lt;:AbstractVector{String}}" href="#COBREXA.add_reactions-Union{Tuple{K}, Tuple{V}, Tuple{M}, Tuple{CoreModel, M, V, V, V, V, K, K}} where {M&lt;:AbstractMatrix{Float64}, V&lt;:AbstractVector{Float64}, K&lt;:AbstractVector{String}}"><code>COBREXA.add_reactions</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">add_reactions(
+) where {V1&lt;:VecType,V2&lt;:VecType,K&lt;:StringVecType}</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/reconstruction/CoreModel.jl#L35-L48">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.add_reactions-Union{Tuple{K}, Tuple{V}, Tuple{M}, Tuple{CoreModel, M, V, V, V, V, K, K}} where {M&lt;:AbstractMatrix{Float64}, V&lt;:AbstractVector{Float64}, K&lt;:AbstractVector{String}}" href="#COBREXA.add_reactions-Union{Tuple{K}, Tuple{V}, Tuple{M}, Tuple{CoreModel, M, V, V, V, V, K, K}} where {M&lt;:AbstractMatrix{Float64}, V&lt;:AbstractVector{Float64}, K&lt;:AbstractVector{String}}"><code>COBREXA.add_reactions</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">add_reactions(
     m::CoreModel,
     Sp::M,
     b::V,
@@ -125,7 +125,7 @@ keys(model.reactions)</code></pre></div><a class="docs-sourcelink" target="_blan
     rxns::K,
     mets::K;
     check_consistency = false,
-) where {M&lt;:MatType,V&lt;:VecType,K&lt;:StringVecType}</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/reconstruction/CoreModel.jl#L129-L142">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.add_reactions-Union{Tuple{V2}, Tuple{V1}, Tuple{CoreModel, V1, V2, AbstractFloat, AbstractFloat, AbstractFloat}} where {V1&lt;:AbstractVector{Float64}, V2&lt;:AbstractVector{Float64}}" href="#COBREXA.add_reactions-Union{Tuple{V2}, Tuple{V1}, Tuple{CoreModel, V1, V2, AbstractFloat, AbstractFloat, AbstractFloat}} where {V1&lt;:AbstractVector{Float64}, V2&lt;:AbstractVector{Float64}}"><code>COBREXA.add_reactions</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">add_reactions(
+) where {M&lt;:MatType,V&lt;:VecType,K&lt;:StringVecType}</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/reconstruction/CoreModel.jl#L129-L142">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.add_reactions-Union{Tuple{V2}, Tuple{V1}, Tuple{CoreModel, V1, V2, AbstractFloat, AbstractFloat, AbstractFloat}} where {V1&lt;:AbstractVector{Float64}, V2&lt;:AbstractVector{Float64}}" href="#COBREXA.add_reactions-Union{Tuple{V2}, Tuple{V1}, Tuple{CoreModel, V1, V2, AbstractFloat, AbstractFloat, AbstractFloat}} where {V1&lt;:AbstractVector{Float64}, V2&lt;:AbstractVector{Float64}}"><code>COBREXA.add_reactions</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">add_reactions(
     m::CoreModel,
     s::V1,
     b::V2,
@@ -133,7 +133,7 @@ keys(model.reactions)</code></pre></div><a class="docs-sourcelink" target="_blan
     xl::AbstractFloat,
     xu::AbstractFloat;
     check_consistency = false,
-) where {V1&lt;:VecType,V2&lt;:VecType}</code></pre><p>Add reaction(s) to a <code>CoreModel</code> model <code>m</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/reconstruction/CoreModel.jl#L1-L14">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.add_reactions-Union{Tuple{V}, Tuple{M}, Tuple{CoreModel, M, V, V, V, V}} where {M&lt;:AbstractMatrix{Float64}, V&lt;:AbstractVector{Float64}}" href="#COBREXA.add_reactions-Union{Tuple{V}, Tuple{M}, Tuple{CoreModel, M, V, V, V, V}} where {M&lt;:AbstractMatrix{Float64}, V&lt;:AbstractVector{Float64}}"><code>COBREXA.add_reactions</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">add_reactions(
+) where {V1&lt;:VecType,V2&lt;:VecType}</code></pre><p>Add reaction(s) to a <code>CoreModel</code> model <code>m</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/reconstruction/CoreModel.jl#L1-L14">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.add_reactions-Union{Tuple{V}, Tuple{M}, Tuple{CoreModel, M, V, V, V, V}} where {M&lt;:AbstractMatrix{Float64}, V&lt;:AbstractVector{Float64}}" href="#COBREXA.add_reactions-Union{Tuple{V}, Tuple{M}, Tuple{CoreModel, M, V, V, V, V}} where {M&lt;:AbstractMatrix{Float64}, V&lt;:AbstractVector{Float64}}"><code>COBREXA.add_reactions</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">add_reactions(
     m::CoreModel,
     Sp::M,
     b::V,
@@ -141,12 +141,12 @@ keys(model.reactions)</code></pre></div><a class="docs-sourcelink" target="_blan
     xl::V,
     xu::V;
     check_consistency = false,
-) where {M&lt;:MatType,V&lt;:VecType}</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/reconstruction/CoreModel.jl#L73-L84">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.remove_metabolites-Tuple{CoreModel, Any}" href="#COBREXA.remove_metabolites-Tuple{CoreModel, Any}"><code>COBREXA.remove_metabolites</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">remove_metabolites(model::CoreModel, metabolites)</code></pre><p>Removes a set of <code>metabolites</code> from the <code>model</code> of type <code>CoreModel</code> and returns a new <code>CoreModel</code> without those metabolites. Here, <code>metabolites</code> can be either a string, a vector of strings, an index or a vector of indices. Also removes any reactions that have no associated metabolites after the metabolites have been removed.</p><p><strong>Example</strong></p><pre><code class="language-none">model = load_model(CoreModel, &quot;e_coli_core.json&quot;)
+) where {M&lt;:MatType,V&lt;:VecType}</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/reconstruction/CoreModel.jl#L73-L84">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.remove_metabolites-Tuple{CoreModel, Any}" href="#COBREXA.remove_metabolites-Tuple{CoreModel, Any}"><code>COBREXA.remove_metabolites</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">remove_metabolites(model::CoreModel, metabolites)</code></pre><p>Removes a set of <code>metabolites</code> from the <code>model</code> of type <code>CoreModel</code> and returns a new <code>CoreModel</code> without those metabolites. Here, <code>metabolites</code> can be either a string, a vector of strings, an index or a vector of indices. Also removes any reactions that have no associated metabolites after the metabolites have been removed.</p><p><strong>Example</strong></p><pre><code class="language-none">model = load_model(CoreModel, &quot;e_coli_core.json&quot;)
 
 m1 = remove_metabolites(model, [&quot;glc__D_e&quot;, &quot;for_c&quot;])
 m2 = remove_metabolites(model, &quot;glc__D_e&quot;)
 m3 = remove_metabolites(model, indexin([&quot;glc__D_e&quot;, &quot;for_c&quot;], metabolites(model)))
-m4 = remove_metabolites(model, first(indexin([&quot;glc__D_e&quot;], metabolites(model))))</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/reconstruction/CoreModel.jl#L273-L291">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.remove_reactions-Tuple{CoreModel, Int64}" href="#COBREXA.remove_reactions-Tuple{CoreModel, Int64}"><code>COBREXA.remove_reactions</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">remove_reactions(m::CoreModel, rxn::Int)</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/reconstruction/CoreModel.jl#L351-L354">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.remove_reactions-Tuple{CoreModel, String}" href="#COBREXA.remove_reactions-Tuple{CoreModel, String}"><code>COBREXA.remove_reactions</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">remove_reactions(m::CoreModel, rxn::String)</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/reconstruction/CoreModel.jl#L359-L362">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.remove_reactions-Tuple{CoreModel, Vector{Int64}}" href="#COBREXA.remove_reactions-Tuple{CoreModel, Vector{Int64}}"><code>COBREXA.remove_reactions</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">remove_reactions(m::CoreModel, rxns::Vector{Int})</code></pre><p>Removes a set of reactions from a CoreModel. Also removes the metabolites not involved in any reaction.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/reconstruction/CoreModel.jl#L327-L332">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.remove_reactions-Tuple{CoreModel, Vector{String}}" href="#COBREXA.remove_reactions-Tuple{CoreModel, Vector{String}}"><code>COBREXA.remove_reactions</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">remove_reactions(m::CoreModel, rxns::Vector{String})</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/reconstruction/CoreModel.jl#L367-L370">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.verify_consistency-Union{Tuple{K}, Tuple{V}, Tuple{M}, Tuple{CoreModel, M, V, V, V, V, K, K, Any, Any}} where {M&lt;:AbstractMatrix{Float64}, V&lt;:AbstractVector{Float64}, K&lt;:AbstractVector{String}}" href="#COBREXA.verify_consistency-Union{Tuple{K}, Tuple{V}, Tuple{M}, Tuple{CoreModel, M, V, V, V, V, K, K, Any, Any}} where {M&lt;:AbstractMatrix{Float64}, V&lt;:AbstractVector{Float64}, K&lt;:AbstractVector{String}}"><code>COBREXA.verify_consistency</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">verify_consistency(
+m4 = remove_metabolites(model, first(indexin([&quot;glc__D_e&quot;], metabolites(model))))</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/reconstruction/CoreModel.jl#L273-L291">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.remove_reactions-Tuple{CoreModel, Int64}" href="#COBREXA.remove_reactions-Tuple{CoreModel, Int64}"><code>COBREXA.remove_reactions</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">remove_reactions(m::CoreModel, rxn::Int)</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/reconstruction/CoreModel.jl#L351-L354">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.remove_reactions-Tuple{CoreModel, String}" href="#COBREXA.remove_reactions-Tuple{CoreModel, String}"><code>COBREXA.remove_reactions</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">remove_reactions(m::CoreModel, rxn::String)</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/reconstruction/CoreModel.jl#L359-L362">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.remove_reactions-Tuple{CoreModel, Vector{Int64}}" href="#COBREXA.remove_reactions-Tuple{CoreModel, Vector{Int64}}"><code>COBREXA.remove_reactions</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">remove_reactions(m::CoreModel, rxns::Vector{Int})</code></pre><p>Removes a set of reactions from a CoreModel. Also removes the metabolites not involved in any reaction.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/reconstruction/CoreModel.jl#L327-L332">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.remove_reactions-Tuple{CoreModel, Vector{String}}" href="#COBREXA.remove_reactions-Tuple{CoreModel, Vector{String}}"><code>COBREXA.remove_reactions</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">remove_reactions(m::CoreModel, rxns::Vector{String})</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/reconstruction/CoreModel.jl#L367-L370">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.verify_consistency-Union{Tuple{K}, Tuple{V}, Tuple{M}, Tuple{CoreModel, M, V, V, V, V, K, K, Any, Any}} where {M&lt;:AbstractMatrix{Float64}, V&lt;:AbstractVector{Float64}, K&lt;:AbstractVector{String}}" href="#COBREXA.verify_consistency-Union{Tuple{K}, Tuple{V}, Tuple{M}, Tuple{CoreModel, M, V, V, V, V, K, K, Any, Any}} where {M&lt;:AbstractMatrix{Float64}, V&lt;:AbstractVector{Float64}, K&lt;:AbstractVector{String}}"><code>COBREXA.verify_consistency</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">verify_consistency(
     m::CoreModel,
     Sp::M,
     b::V,
@@ -157,17 +157,17 @@ m4 = remove_metabolites(model, first(indexin([&quot;glc__D_e&quot;], metabolites
     mets::K,
     new_reactions,
     new_metabolites,
-) where {M&lt;:MatType,V&lt;:VecType,K&lt;:StringVecType}</code></pre><p>Check the consistency of given reactions with existing reactions in <code>m</code>.</p><p>TODO: work in progress, doesn&#39;t return consistency status.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/reconstruction/CoreModel.jl#L214-L232">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.add_coupling_constraints!-Tuple{CoreModelCoupled, AbstractVector{Float64}, AbstractFloat, AbstractFloat}" href="#COBREXA.add_coupling_constraints!-Tuple{CoreModelCoupled, AbstractVector{Float64}, AbstractFloat, AbstractFloat}"><code>COBREXA.add_coupling_constraints!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">add_coupling_constraints!(
+) where {M&lt;:MatType,V&lt;:VecType,K&lt;:StringVecType}</code></pre><p>Check the consistency of given reactions with existing reactions in <code>m</code>.</p><p>TODO: work in progress, doesn&#39;t return consistency status.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/reconstruction/CoreModel.jl#L214-L232">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.add_coupling_constraints!-Tuple{CoreModelCoupled, AbstractVector{Float64}, AbstractFloat, AbstractFloat}" href="#COBREXA.add_coupling_constraints!-Tuple{CoreModelCoupled, AbstractVector{Float64}, AbstractFloat, AbstractFloat}"><code>COBREXA.add_coupling_constraints!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">add_coupling_constraints!(
     m::CoreModelCoupled,
     c::VecType,
     cl::AbstractFloat,
     cu::AbstractFloat,
-)</code></pre><p>Overload for adding a single coupling constraint.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/reconstruction/CoreModelCoupled.jl#L235-L244">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.add_coupling_constraints!-Union{Tuple{V}, Tuple{CoreModelCoupled, AbstractMatrix{Float64}, V, V}} where V&lt;:AbstractVector{Float64}" href="#COBREXA.add_coupling_constraints!-Union{Tuple{V}, Tuple{CoreModelCoupled, AbstractMatrix{Float64}, V, V}} where V&lt;:AbstractVector{Float64}"><code>COBREXA.add_coupling_constraints!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">add_coupling_constraints!(
+)</code></pre><p>Overload for adding a single coupling constraint.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/reconstruction/CoreModelCoupled.jl#L235-L244">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.add_coupling_constraints!-Union{Tuple{V}, Tuple{CoreModelCoupled, AbstractMatrix{Float64}, V, V}} where V&lt;:AbstractVector{Float64}" href="#COBREXA.add_coupling_constraints!-Union{Tuple{V}, Tuple{CoreModelCoupled, AbstractMatrix{Float64}, V, V}} where V&lt;:AbstractVector{Float64}"><code>COBREXA.add_coupling_constraints!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">add_coupling_constraints!(
     m::CoreModelCoupled,
     C::MatType,
     cl::V,
     cu::V,
-) where {V&lt;:VecType}</code></pre><p>In-place add a single coupling constraint in form</p><pre><code class="language-none">    cₗ ≤ C x ≤ cᵤ</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/reconstruction/CoreModelCoupled.jl#L260-L272">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.add_coupling_constraints-Tuple{CoreModel, Vararg{Any, N} where N}" href="#COBREXA.add_coupling_constraints-Tuple{CoreModel, Vararg{Any, N} where N}"><code>COBREXA.add_coupling_constraints</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">add_coupling_constraints(m::CoreModel, args...)</code></pre><p>Add coupling constraints to a plain <a href="#COBREXA.CoreModel"><code>CoreModel</code></a> (returns a <a href="#COBREXA.CoreModelCoupled"><code>CoreModelCoupled</code></a>).</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/reconstruction/CoreModelCoupled.jl#L226-L231">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.add_coupling_constraints-Tuple{CoreModelCoupled, Vararg{Any, N} where N}" href="#COBREXA.add_coupling_constraints-Tuple{CoreModelCoupled, Vararg{Any, N} where N}"><code>COBREXA.add_coupling_constraints</code></a> — <span class="docstring-category">Method</span></header><section><div><p>Add constraints of the following form to a CoreModelCoupled and return a modified one.</p><p>Add constraints to a <a href="#COBREXA.CoreModelCoupled"><code>CoreModelCoupled</code></a> and return a modified one.</p><p>The arguments are same as for in-place <a href="#COBREXA.add_coupling_constraints!-Tuple{CoreModelCoupled, AbstractVector{Float64}, AbstractFloat, AbstractFloat}"><code>add_coupling_constraints!</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/reconstruction/CoreModelCoupled.jl#L213-L219">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.add_reactions-Tuple{CoreModelCoupled, CoreModel}" href="#COBREXA.add_reactions-Tuple{CoreModelCoupled, CoreModel}"><code>COBREXA.add_reactions</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">add_reactions(m1::CoreModelCoupled, m2::CoreModel; check_consistency = false)</code></pre><p>Add all reactions from <code>m2</code> to <code>m1</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/reconstruction/CoreModelCoupled.jl#L107-L112">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.add_reactions-Union{Tuple{K}, Tuple{V2}, Tuple{V1}, Tuple{CoreModelCoupled, V1, V2, AbstractFloat, AbstractFloat, AbstractFloat, String, K}} where {V1&lt;:AbstractVector{Float64}, V2&lt;:AbstractVector{Float64}, K&lt;:AbstractVector{String}}" href="#COBREXA.add_reactions-Union{Tuple{K}, Tuple{V2}, Tuple{V1}, Tuple{CoreModelCoupled, V1, V2, AbstractFloat, AbstractFloat, AbstractFloat, String, K}} where {V1&lt;:AbstractVector{Float64}, V2&lt;:AbstractVector{Float64}, K&lt;:AbstractVector{String}}"><code>COBREXA.add_reactions</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">add_reactions(
+) where {V&lt;:VecType}</code></pre><p>In-place add a single coupling constraint in form</p><pre><code class="language-none">    cₗ ≤ C x ≤ cᵤ</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/reconstruction/CoreModelCoupled.jl#L260-L272">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.add_coupling_constraints-Tuple{CoreModel, Vararg{Any, N} where N}" href="#COBREXA.add_coupling_constraints-Tuple{CoreModel, Vararg{Any, N} where N}"><code>COBREXA.add_coupling_constraints</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">add_coupling_constraints(m::CoreModel, args...)</code></pre><p>Add coupling constraints to a plain <a href="#COBREXA.CoreModel"><code>CoreModel</code></a> (returns a <a href="#COBREXA.CoreModelCoupled"><code>CoreModelCoupled</code></a>).</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/reconstruction/CoreModelCoupled.jl#L226-L231">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.add_coupling_constraints-Tuple{CoreModelCoupled, Vararg{Any, N} where N}" href="#COBREXA.add_coupling_constraints-Tuple{CoreModelCoupled, Vararg{Any, N} where N}"><code>COBREXA.add_coupling_constraints</code></a> — <span class="docstring-category">Method</span></header><section><div><p>Add constraints of the following form to a CoreModelCoupled and return a modified one.</p><p>Add constraints to a <a href="#COBREXA.CoreModelCoupled"><code>CoreModelCoupled</code></a> and return a modified one.</p><p>The arguments are same as for in-place <a href="#COBREXA.add_coupling_constraints!-Tuple{CoreModelCoupled, AbstractVector{Float64}, AbstractFloat, AbstractFloat}"><code>add_coupling_constraints!</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/reconstruction/CoreModelCoupled.jl#L213-L219">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.add_reactions-Tuple{CoreModelCoupled, CoreModel}" href="#COBREXA.add_reactions-Tuple{CoreModelCoupled, CoreModel}"><code>COBREXA.add_reactions</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">add_reactions(m1::CoreModelCoupled, m2::CoreModel; check_consistency = false)</code></pre><p>Add all reactions from <code>m2</code> to <code>m1</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/reconstruction/CoreModelCoupled.jl#L107-L112">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.add_reactions-Union{Tuple{K}, Tuple{V2}, Tuple{V1}, Tuple{CoreModelCoupled, V1, V2, AbstractFloat, AbstractFloat, AbstractFloat, String, K}} where {V1&lt;:AbstractVector{Float64}, V2&lt;:AbstractVector{Float64}, K&lt;:AbstractVector{String}}" href="#COBREXA.add_reactions-Union{Tuple{K}, Tuple{V2}, Tuple{V1}, Tuple{CoreModelCoupled, V1, V2, AbstractFloat, AbstractFloat, AbstractFloat, String, K}} where {V1&lt;:AbstractVector{Float64}, V2&lt;:AbstractVector{Float64}, K&lt;:AbstractVector{String}}"><code>COBREXA.add_reactions</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">add_reactions(
     m::CoreModelCoupled,
     s::V1,
     b::V2,
@@ -177,7 +177,7 @@ m4 = remove_metabolites(model, first(indexin([&quot;glc__D_e&quot;], metabolites
     rxn::String,
     mets::K;
     check_consistency = false,
-) where {V1&lt;:VecType,V2&lt;:VecType,K&lt;:StringVecType}</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/reconstruction/CoreModelCoupled.jl#L33-L46">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.add_reactions-Union{Tuple{K}, Tuple{V}, Tuple{M}, Tuple{CoreModelCoupled, M, V, V, V, V, K, K}} where {M&lt;:AbstractMatrix{Float64}, V&lt;:AbstractVector{Float64}, K&lt;:AbstractVector{String}}" href="#COBREXA.add_reactions-Union{Tuple{K}, Tuple{V}, Tuple{M}, Tuple{CoreModelCoupled, M, V, V, V, V, K, K}} where {M&lt;:AbstractMatrix{Float64}, V&lt;:AbstractVector{Float64}, K&lt;:AbstractVector{String}}"><code>COBREXA.add_reactions</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">add_reactions(
+) where {V1&lt;:VecType,V2&lt;:VecType,K&lt;:StringVecType}</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/reconstruction/CoreModelCoupled.jl#L33-L46">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.add_reactions-Union{Tuple{K}, Tuple{V}, Tuple{M}, Tuple{CoreModelCoupled, M, V, V, V, V, K, K}} where {M&lt;:AbstractMatrix{Float64}, V&lt;:AbstractVector{Float64}, K&lt;:AbstractVector{String}}" href="#COBREXA.add_reactions-Union{Tuple{K}, Tuple{V}, Tuple{M}, Tuple{CoreModelCoupled, M, V, V, V, V, K, K}} where {M&lt;:AbstractMatrix{Float64}, V&lt;:AbstractVector{Float64}, K&lt;:AbstractVector{String}}"><code>COBREXA.add_reactions</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">add_reactions(
     m::CoreModelCoupled,
     Sp::M,
     b::V,
@@ -187,7 +187,7 @@ m4 = remove_metabolites(model, first(indexin([&quot;glc__D_e&quot;], metabolites
     rxns::K,
     mets::K;
     check_consistency = false,
-) where {M&lt;:MatType,V&lt;:VecType,K&lt;:StringVecType}</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/reconstruction/CoreModelCoupled.jl#L123-L136">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.add_reactions-Union{Tuple{V2}, Tuple{V1}, Tuple{CoreModelCoupled, V1, V2, AbstractFloat, AbstractFloat, AbstractFloat}} where {V1&lt;:AbstractVector{Float64}, V2&lt;:AbstractVector{Float64}}" href="#COBREXA.add_reactions-Union{Tuple{V2}, Tuple{V1}, Tuple{CoreModelCoupled, V1, V2, AbstractFloat, AbstractFloat, AbstractFloat}} where {V1&lt;:AbstractVector{Float64}, V2&lt;:AbstractVector{Float64}}"><code>COBREXA.add_reactions</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">add_reactions(
+) where {M&lt;:MatType,V&lt;:VecType,K&lt;:StringVecType}</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/reconstruction/CoreModelCoupled.jl#L123-L136">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.add_reactions-Union{Tuple{V2}, Tuple{V1}, Tuple{CoreModelCoupled, V1, V2, AbstractFloat, AbstractFloat, AbstractFloat}} where {V1&lt;:AbstractVector{Float64}, V2&lt;:AbstractVector{Float64}}" href="#COBREXA.add_reactions-Union{Tuple{V2}, Tuple{V1}, Tuple{CoreModelCoupled, V1, V2, AbstractFloat, AbstractFloat, AbstractFloat}} where {V1&lt;:AbstractVector{Float64}, V2&lt;:AbstractVector{Float64}}"><code>COBREXA.add_reactions</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">add_reactions(
     m::CoreModelCoupled,
     s::V1,
     b::V2,
@@ -195,7 +195,7 @@ m4 = remove_metabolites(model, first(indexin([&quot;glc__D_e&quot;], metabolites
     xl::AbstractFloat,
     xu::AbstractFloat;
     check_consistency = false,
-) where {V1&lt;:VecType,V2&lt;:VecType}</code></pre><p>Add reaction(s) to a <code>CoreModelCoupled</code> model <code>m</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/reconstruction/CoreModelCoupled.jl#L1-L14">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.add_reactions-Union{Tuple{V}, Tuple{M}, Tuple{CoreModelCoupled, M, V, V, V, V}} where {M&lt;:AbstractMatrix{Float64}, V&lt;:AbstractVector{Float64}}" href="#COBREXA.add_reactions-Union{Tuple{V}, Tuple{M}, Tuple{CoreModelCoupled, M, V, V, V, V}} where {M&lt;:AbstractMatrix{Float64}, V&lt;:AbstractVector{Float64}}"><code>COBREXA.add_reactions</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">add_reactions(
+) where {V1&lt;:VecType,V2&lt;:VecType}</code></pre><p>Add reaction(s) to a <code>CoreModelCoupled</code> model <code>m</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/reconstruction/CoreModelCoupled.jl#L1-L14">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.add_reactions-Union{Tuple{V}, Tuple{M}, Tuple{CoreModelCoupled, M, V, V, V, V}} where {M&lt;:AbstractMatrix{Float64}, V&lt;:AbstractVector{Float64}}" href="#COBREXA.add_reactions-Union{Tuple{V}, Tuple{M}, Tuple{CoreModelCoupled, M, V, V, V, V}} where {M&lt;:AbstractMatrix{Float64}, V&lt;:AbstractVector{Float64}}"><code>COBREXA.add_reactions</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">add_reactions(
     m::CoreModelCoupled,
     Sp::M,
     b::V,
@@ -203,12 +203,12 @@ m4 = remove_metabolites(model, first(indexin([&quot;glc__D_e&quot;], metabolites
     xl::V,
     xu::V;
     check_consistency = false,
-) where {M&lt;:MatType,V&lt;:VecType}</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/reconstruction/CoreModelCoupled.jl#L77-L88">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.change_coupling_bounds!-Union{Tuple{V}, Tuple{CoreModelCoupled, Vector{Int64}}} where V&lt;:AbstractVector{Float64}" href="#COBREXA.change_coupling_bounds!-Union{Tuple{V}, Tuple{CoreModelCoupled, Vector{Int64}}} where V&lt;:AbstractVector{Float64}"><code>COBREXA.change_coupling_bounds!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">change_coupling_bounds!(
+) where {M&lt;:MatType,V&lt;:VecType}</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/reconstruction/CoreModelCoupled.jl#L77-L88">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.change_coupling_bounds!-Union{Tuple{V}, Tuple{CoreModelCoupled, Vector{Int64}}} where V&lt;:AbstractVector{Float64}" href="#COBREXA.change_coupling_bounds!-Union{Tuple{V}, Tuple{CoreModelCoupled, Vector{Int64}}} where V&lt;:AbstractVector{Float64}"><code>COBREXA.change_coupling_bounds!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">change_coupling_bounds!(
     model::CoreModelCoupled,
     constraints::Vector{Int};
     cl::V = Float64[],
     cu::V = Float64[],
-) where {V&lt;:VecType}</code></pre><p>Change the lower and/or upper bounds (<code>cl</code> and <code>cu</code>) for the given list of coupling constraints.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/reconstruction/CoreModelCoupled.jl#L329-L339">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.remove_coupling_constraints!-Tuple{CoreModelCoupled, Int64}" href="#COBREXA.remove_coupling_constraints!-Tuple{CoreModelCoupled, Int64}"><code>COBREXA.remove_coupling_constraints!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">remove_coupling_constraints!(m::CoreModelCoupled, constraint::Int)</code></pre><p>Removes a single coupling constraints from a <a href="#COBREXA.CoreModelCoupled"><code>CoreModelCoupled</code></a> in-place.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/reconstruction/CoreModelCoupled.jl#L305-L310">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.remove_coupling_constraints!-Tuple{CoreModelCoupled, Vector{Int64}}" href="#COBREXA.remove_coupling_constraints!-Tuple{CoreModelCoupled, Vector{Int64}}"><code>COBREXA.remove_coupling_constraints!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">remove_coupling_constraints!(m::CoreModelCoupled, constraints::Vector{Int})</code></pre><p>Removes a set of coupling constraints from a <a href="#COBREXA.CoreModelCoupled"><code>CoreModelCoupled</code></a> in-place.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/reconstruction/CoreModelCoupled.jl#L315-L320">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.remove_coupling_constraints-Tuple{CoreModelCoupled, Vararg{Any, N} where N}" href="#COBREXA.remove_coupling_constraints-Tuple{CoreModelCoupled, Vararg{Any, N} where N}"><code>COBREXA.remove_coupling_constraints</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">remove_coupling_constraints(m::CoreModelCoupled, args...)</code></pre><p>Remove coupling constraints from the linear model, and return the modified model. Arguments are the same as for in-place version <a href="#COBREXA.remove_coupling_constraints!-Tuple{CoreModelCoupled, Int64}"><code>remove_coupling_constraints!</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/reconstruction/CoreModelCoupled.jl#L291-L297">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.remove_reactions-Tuple{CoreModelCoupled, Int64}" href="#COBREXA.remove_reactions-Tuple{CoreModelCoupled, Int64}"><code>COBREXA.remove_reactions</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">remove_reactions(m::CoreModelCoupled, rxn::Int)</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/reconstruction/CoreModelCoupled.jl#L184-L187">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.remove_reactions-Tuple{CoreModelCoupled, String}" href="#COBREXA.remove_reactions-Tuple{CoreModelCoupled, String}"><code>COBREXA.remove_reactions</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">remove_reactions(m::CoreModelCoupled, rxn::String)</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/reconstruction/CoreModelCoupled.jl#L192-L195">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.remove_reactions-Tuple{CoreModelCoupled, Vector{Int64}}" href="#COBREXA.remove_reactions-Tuple{CoreModelCoupled, Vector{Int64}}"><code>COBREXA.remove_reactions</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">remove_reactions(m::CoreModelCoupled, rxns::Vector{Int})</code></pre><p>Remove reaction(s) from a <code>CoreModelCoupled</code>.</p><p>Also removes any metabolites not involved in any reaction after the deletion.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/reconstruction/CoreModelCoupled.jl#L167-L174">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.remove_reactions-Tuple{CoreModelCoupled, Vector{String}}" href="#COBREXA.remove_reactions-Tuple{CoreModelCoupled, Vector{String}}"><code>COBREXA.remove_reactions</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">remove_reactions(m::CoreModelCoupled, rxns::Vector{String})</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/reconstruction/CoreModelCoupled.jl#L200-L203">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.:←-Tuple{Union{Nothing, Metabolite, MetaboliteWithCoefficient, Vector{MetaboliteWithCoefficient}}, Union{Nothing, Metabolite, MetaboliteWithCoefficient, Vector{MetaboliteWithCoefficient}}}" href="#COBREXA.:←-Tuple{Union{Nothing, Metabolite, MetaboliteWithCoefficient, Vector{MetaboliteWithCoefficient}}, Union{Nothing, Metabolite, MetaboliteWithCoefficient, Vector{MetaboliteWithCoefficient}}}"><code>COBREXA.:←</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">←(
+) where {V&lt;:VecType}</code></pre><p>Change the lower and/or upper bounds (<code>cl</code> and <code>cu</code>) for the given list of coupling constraints.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/reconstruction/CoreModelCoupled.jl#L329-L339">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.remove_coupling_constraints!-Tuple{CoreModelCoupled, Int64}" href="#COBREXA.remove_coupling_constraints!-Tuple{CoreModelCoupled, Int64}"><code>COBREXA.remove_coupling_constraints!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">remove_coupling_constraints!(m::CoreModelCoupled, constraint::Int)</code></pre><p>Removes a single coupling constraints from a <a href="#COBREXA.CoreModelCoupled"><code>CoreModelCoupled</code></a> in-place.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/reconstruction/CoreModelCoupled.jl#L305-L310">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.remove_coupling_constraints!-Tuple{CoreModelCoupled, Vector{Int64}}" href="#COBREXA.remove_coupling_constraints!-Tuple{CoreModelCoupled, Vector{Int64}}"><code>COBREXA.remove_coupling_constraints!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">remove_coupling_constraints!(m::CoreModelCoupled, constraints::Vector{Int})</code></pre><p>Removes a set of coupling constraints from a <a href="#COBREXA.CoreModelCoupled"><code>CoreModelCoupled</code></a> in-place.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/reconstruction/CoreModelCoupled.jl#L315-L320">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.remove_coupling_constraints-Tuple{CoreModelCoupled, Vararg{Any, N} where N}" href="#COBREXA.remove_coupling_constraints-Tuple{CoreModelCoupled, Vararg{Any, N} where N}"><code>COBREXA.remove_coupling_constraints</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">remove_coupling_constraints(m::CoreModelCoupled, args...)</code></pre><p>Remove coupling constraints from the linear model, and return the modified model. Arguments are the same as for in-place version <a href="#COBREXA.remove_coupling_constraints!-Tuple{CoreModelCoupled, Int64}"><code>remove_coupling_constraints!</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/reconstruction/CoreModelCoupled.jl#L291-L297">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.remove_reactions-Tuple{CoreModelCoupled, Int64}" href="#COBREXA.remove_reactions-Tuple{CoreModelCoupled, Int64}"><code>COBREXA.remove_reactions</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">remove_reactions(m::CoreModelCoupled, rxn::Int)</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/reconstruction/CoreModelCoupled.jl#L184-L187">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.remove_reactions-Tuple{CoreModelCoupled, String}" href="#COBREXA.remove_reactions-Tuple{CoreModelCoupled, String}"><code>COBREXA.remove_reactions</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">remove_reactions(m::CoreModelCoupled, rxn::String)</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/reconstruction/CoreModelCoupled.jl#L192-L195">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.remove_reactions-Tuple{CoreModelCoupled, Vector{Int64}}" href="#COBREXA.remove_reactions-Tuple{CoreModelCoupled, Vector{Int64}}"><code>COBREXA.remove_reactions</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">remove_reactions(m::CoreModelCoupled, rxns::Vector{Int})</code></pre><p>Remove reaction(s) from a <code>CoreModelCoupled</code>.</p><p>Also removes any metabolites not involved in any reaction after the deletion.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/reconstruction/CoreModelCoupled.jl#L167-L174">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.remove_reactions-Tuple{CoreModelCoupled, Vector{String}}" href="#COBREXA.remove_reactions-Tuple{CoreModelCoupled, Vector{String}}"><code>COBREXA.remove_reactions</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">remove_reactions(m::CoreModelCoupled, rxns::Vector{String})</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/reconstruction/CoreModelCoupled.jl#L200-L203">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.:←-Tuple{Union{Nothing, Metabolite, MetaboliteWithCoefficient, Vector{MetaboliteWithCoefficient}}, Union{Nothing, Metabolite, MetaboliteWithCoefficient, Vector{MetaboliteWithCoefficient}}}" href="#COBREXA.:←-Tuple{Union{Nothing, Metabolite, MetaboliteWithCoefficient, Vector{MetaboliteWithCoefficient}}, Union{Nothing, Metabolite, MetaboliteWithCoefficient, Vector{MetaboliteWithCoefficient}}}"><code>COBREXA.:←</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">←(
     substrates::Union{
         Nothing,
         Metabolite,
@@ -221,7 +221,7 @@ m4 = remove_metabolites(model, first(indexin([&quot;glc__D_e&quot;], metabolites
         MetaboliteWithCoefficient,
         Vector{MetaboliteWithCoefficient}
     },
-)</code></pre><p>Make a reverse-only <a href="#COBREXA.Reaction"><code>Reaction</code></a> from <code>substrates</code> and <code>products</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/reconstruction/Reaction.jl#L100-L117">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.:→-Tuple{Union{Nothing, Metabolite, MetaboliteWithCoefficient, Vector{MetaboliteWithCoefficient}}, Union{Nothing, Metabolite, MetaboliteWithCoefficient, Vector{MetaboliteWithCoefficient}}}" href="#COBREXA.:→-Tuple{Union{Nothing, Metabolite, MetaboliteWithCoefficient, Vector{MetaboliteWithCoefficient}}, Union{Nothing, Metabolite, MetaboliteWithCoefficient, Vector{MetaboliteWithCoefficient}}}"><code>COBREXA.:→</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">→(
+)</code></pre><p>Make a reverse-only <a href="#COBREXA.Reaction"><code>Reaction</code></a> from <code>substrates</code> and <code>products</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/reconstruction/Reaction.jl#L100-L117">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.:→-Tuple{Union{Nothing, Metabolite, MetaboliteWithCoefficient, Vector{MetaboliteWithCoefficient}}, Union{Nothing, Metabolite, MetaboliteWithCoefficient, Vector{MetaboliteWithCoefficient}}}" href="#COBREXA.:→-Tuple{Union{Nothing, Metabolite, MetaboliteWithCoefficient, Vector{MetaboliteWithCoefficient}}, Union{Nothing, Metabolite, MetaboliteWithCoefficient, Vector{MetaboliteWithCoefficient}}}"><code>COBREXA.:→</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">→(
     substrates::Union{
         Nothing,
         Metabolite,
@@ -234,7 +234,7 @@ m4 = remove_metabolites(model, first(indexin([&quot;glc__D_e&quot;], metabolites
         MetaboliteWithCoefficient,
         Vector{MetaboliteWithCoefficient}
     },
-)</code></pre><p>Make a forward-only <a href="#COBREXA.Reaction"><code>Reaction</code></a> from <code>substrates</code> and <code>products</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/reconstruction/Reaction.jl#L64-L81">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.:↔-Tuple{Union{Nothing, Metabolite, MetaboliteWithCoefficient, Vector{MetaboliteWithCoefficient}}, Union{Nothing, Metabolite, MetaboliteWithCoefficient, Vector{MetaboliteWithCoefficient}}}" href="#COBREXA.:↔-Tuple{Union{Nothing, Metabolite, MetaboliteWithCoefficient, Vector{MetaboliteWithCoefficient}}, Union{Nothing, Metabolite, MetaboliteWithCoefficient, Vector{MetaboliteWithCoefficient}}}"><code>COBREXA.:↔</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">↔(
+)</code></pre><p>Make a forward-only <a href="#COBREXA.Reaction"><code>Reaction</code></a> from <code>substrates</code> and <code>products</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/reconstruction/Reaction.jl#L64-L81">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.:↔-Tuple{Union{Nothing, Metabolite, MetaboliteWithCoefficient, Vector{MetaboliteWithCoefficient}}, Union{Nothing, Metabolite, MetaboliteWithCoefficient, Vector{MetaboliteWithCoefficient}}}" href="#COBREXA.:↔-Tuple{Union{Nothing, Metabolite, MetaboliteWithCoefficient, Vector{MetaboliteWithCoefficient}}, Union{Nothing, Metabolite, MetaboliteWithCoefficient, Vector{MetaboliteWithCoefficient}}}"><code>COBREXA.:↔</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">↔(
     substrates::Union{
         Nothing,
         Metabolite,
@@ -247,15 +247,15 @@ m4 = remove_metabolites(model, first(indexin([&quot;glc__D_e&quot;], metabolites
         MetaboliteWithCoefficient,
         Vector{MetaboliteWithCoefficient}
     },
-)</code></pre><p>Make a bidirectional (reversible) <a href="#COBREXA.Reaction"><code>Reaction</code></a> from <code>substrates</code> and <code>products</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/reconstruction/Reaction.jl#L136-L154">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.add_gene!-Tuple{StandardModel, Gene}" href="#COBREXA.add_gene!-Tuple{StandardModel, Gene}"><code>COBREXA.add_gene!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">add_gene!(model::StandardModel, genes::Gene)</code></pre><p>Add <code>gene</code> to <code>model</code> based on gene <code>id</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/reconstruction/StandardModel.jl#L48-L52">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.add_genes!-Tuple{StandardModel, Vector{Gene}}" href="#COBREXA.add_genes!-Tuple{StandardModel, Vector{Gene}}"><code>COBREXA.add_genes!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">add_genes!(model::StandardModel, genes::Vector{Gene})</code></pre><p>Add <code>genes</code> to <code>model</code> based on gene <code>id</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/reconstruction/StandardModel.jl#L37-L41">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.add_metabolite!-Tuple{StandardModel, Metabolite}" href="#COBREXA.add_metabolite!-Tuple{StandardModel, Metabolite}"><code>COBREXA.add_metabolite!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">add_metabolite!(model::StandardModel, met::Metabolite)</code></pre><p>Add <code>met</code> to <code>model</code> based on metabolite <code>id</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/reconstruction/StandardModel.jl#L30-L34">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.add_metabolites!-Tuple{StandardModel, Vector{Metabolite}}" href="#COBREXA.add_metabolites!-Tuple{StandardModel, Vector{Metabolite}}"><code>COBREXA.add_metabolites!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">add_metabolites!(model::StandardModel, mets::Vector{Metabolite})</code></pre><p>Add <code>mets</code> to <code>model</code> based on metabolite <code>id</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/reconstruction/StandardModel.jl#L19-L23">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.add_reaction!-Tuple{StandardModel, Reaction}" href="#COBREXA.add_reaction!-Tuple{StandardModel, Reaction}"><code>COBREXA.add_reaction!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">add_reaction!(model::StandardModel, rxn::Reaction)</code></pre><p>Add <code>rxn</code> to <code>model</code> based on reaction <code>id</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/reconstruction/StandardModel.jl#L12-L16">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.add_reactions!-Tuple{StandardModel, Vector{Reaction}}" href="#COBREXA.add_reactions!-Tuple{StandardModel, Vector{Reaction}}"><code>COBREXA.add_reactions!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">add_reactions!(model::StandardModel, rxns::Vector{Reaction})</code></pre><p>Add <code>rxns</code> to <code>model</code> based on reaction <code>id</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/reconstruction/StandardModel.jl#L1-L5">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.remove_gene!-Tuple{StandardModel, String}" href="#COBREXA.remove_gene!-Tuple{StandardModel, String}"><code>COBREXA.remove_gene!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">remove_gene!(
+)</code></pre><p>Make a bidirectional (reversible) <a href="#COBREXA.Reaction"><code>Reaction</code></a> from <code>substrates</code> and <code>products</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/reconstruction/Reaction.jl#L136-L154">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.add_gene!-Tuple{StandardModel, Gene}" href="#COBREXA.add_gene!-Tuple{StandardModel, Gene}"><code>COBREXA.add_gene!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">add_gene!(model::StandardModel, genes::Gene)</code></pre><p>Add <code>gene</code> to <code>model</code> based on gene <code>id</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/reconstruction/StandardModel.jl#L48-L52">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.add_genes!-Tuple{StandardModel, Vector{Gene}}" href="#COBREXA.add_genes!-Tuple{StandardModel, Vector{Gene}}"><code>COBREXA.add_genes!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">add_genes!(model::StandardModel, genes::Vector{Gene})</code></pre><p>Add <code>genes</code> to <code>model</code> based on gene <code>id</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/reconstruction/StandardModel.jl#L37-L41">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.add_metabolite!-Tuple{StandardModel, Metabolite}" href="#COBREXA.add_metabolite!-Tuple{StandardModel, Metabolite}"><code>COBREXA.add_metabolite!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">add_metabolite!(model::StandardModel, met::Metabolite)</code></pre><p>Add <code>met</code> to <code>model</code> based on metabolite <code>id</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/reconstruction/StandardModel.jl#L30-L34">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.add_metabolites!-Tuple{StandardModel, Vector{Metabolite}}" href="#COBREXA.add_metabolites!-Tuple{StandardModel, Vector{Metabolite}}"><code>COBREXA.add_metabolites!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">add_metabolites!(model::StandardModel, mets::Vector{Metabolite})</code></pre><p>Add <code>mets</code> to <code>model</code> based on metabolite <code>id</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/reconstruction/StandardModel.jl#L19-L23">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.add_reaction!-Tuple{StandardModel, Reaction}" href="#COBREXA.add_reaction!-Tuple{StandardModel, Reaction}"><code>COBREXA.add_reaction!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">add_reaction!(model::StandardModel, rxn::Reaction)</code></pre><p>Add <code>rxn</code> to <code>model</code> based on reaction <code>id</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/reconstruction/StandardModel.jl#L12-L16">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.add_reactions!-Tuple{StandardModel, Vector{Reaction}}" href="#COBREXA.add_reactions!-Tuple{StandardModel, Vector{Reaction}}"><code>COBREXA.add_reactions!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">add_reactions!(model::StandardModel, rxns::Vector{Reaction})</code></pre><p>Add <code>rxns</code> to <code>model</code> based on reaction <code>id</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/reconstruction/StandardModel.jl#L1-L5">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.remove_gene!-Tuple{StandardModel, String}" href="#COBREXA.remove_gene!-Tuple{StandardModel, String}"><code>COBREXA.remove_gene!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">remove_gene!(
     model::StandardModel,
     id::Vector{String};
     knockout_reactions::Bool = false,
-)</code></pre><p>Remove gene with <code>id</code> from <code>model</code>. If <code>knockout_reactions</code> is true, then also constrain reactions that require the genes to function to carry zero flux.</p><p><strong>Example</strong></p><pre><code class="language-none">remove_gene!(model, &quot;g1&quot;)</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/reconstruction/StandardModel.jl#L198-L212">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.remove_genes!-Tuple{StandardModel, Vector{String}}" href="#COBREXA.remove_genes!-Tuple{StandardModel, Vector{String}}"><code>COBREXA.remove_genes!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">remove_genes!(
+)</code></pre><p>Remove gene with <code>id</code> from <code>model</code>. If <code>knockout_reactions</code> is true, then also constrain reactions that require the genes to function to carry zero flux.</p><p><strong>Example</strong></p><pre><code class="language-none">remove_gene!(model, &quot;g1&quot;)</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/reconstruction/StandardModel.jl#L198-L212">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.remove_genes!-Tuple{StandardModel, Vector{String}}" href="#COBREXA.remove_genes!-Tuple{StandardModel, Vector{String}}"><code>COBREXA.remove_genes!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">remove_genes!(
     model::StandardModel,
     ids::Vector{String};
     knockout_reactions::Bool = false,
-)</code></pre><p>Remove all genes with <code>ids</code> from <code>model</code>. If <code>knockout_reactions</code> is true, then also constrain reactions that require the genes to function to carry zero flux.</p><p><strong>Example</strong></p><pre><code class="language-none">remove_genes!(model, [&quot;g1&quot;, &quot;g2&quot;])</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/reconstruction/StandardModel.jl#L165-L179">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.remove_metabolite!-Tuple{StandardModel, String}" href="#COBREXA.remove_metabolite!-Tuple{StandardModel, String}"><code>COBREXA.remove_metabolite!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">remove_metabolite!(model::StandardModel, id::String)</code></pre><p>Remove metabolite with <code>id</code> from <code>model</code>. Warning, this could leave the model inconsistent, e.g. a reaction might require the deleted metabolite, in which case analysis functions will error.</p><p><strong>Example</strong></p><pre><code class="language-none">remove_metabolite!(model, &quot;atp_c&quot;)</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/reconstruction/StandardModel.jl#L151-L162">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.remove_metabolites!-Tuple{StandardModel, Vector{String}}" href="#COBREXA.remove_metabolites!-Tuple{StandardModel, Vector{String}}"><code>COBREXA.remove_metabolites!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">remove_metabolites!(model::StandardModel, ids::Vector{String})</code></pre><p>Remove all metabolites with <code>ids</code> from <code>model</code>. Warning, this could leave the model inconsistent, e.g. a reaction might require the deleted metabolite, in which case analysis functions will error.</p><p><strong>Example</strong></p><pre><code class="language-none">remove_metabolites!(model, [&quot;atp_c&quot;, &quot;adp_c&quot;])</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/reconstruction/StandardModel.jl#L135-L146">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.remove_reaction!-Tuple{StandardModel, String}" href="#COBREXA.remove_reaction!-Tuple{StandardModel, String}"><code>COBREXA.remove_reaction!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">remove_reaction!(model::StandardModel, id::String)</code></pre><p>Remove reaction with <code>id</code> from <code>model</code>. Note, may result in orphan metabolites.</p><p><strong>Example</strong></p><pre><code class="language-none">remove_reaction!(model, &quot;EX_glc__D_e&quot;)</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/reconstruction/StandardModel.jl#L123-L132">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.remove_reactions!-Tuple{StandardModel, Vector{String}}" href="#COBREXA.remove_reactions!-Tuple{StandardModel, Vector{String}}"><code>COBREXA.remove_reactions!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">remove_reactions!(model::StandardModel, ids::Vector{String})</code></pre><p>Remove all reactions with <code>ids</code> from <code>model</code>. Note, may result in orphan metabolites.</p><p><strong>Example</strong></p><pre><code class="language-none">remove_reactions!(model, [&quot;EX_glc__D_e&quot;, &quot;fba&quot;])</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/reconstruction/StandardModel.jl#L109-L118">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.@add_reactions!-Tuple{Symbol, Expr}" href="#COBREXA.@add_reactions!-Tuple{Symbol, Expr}"><code>COBREXA.@add_reactions!</code></a> — <span class="docstring-category">Macro</span></header><section><div><pre><code class="language-julia">@add_reactions!(model::Symbol, ex::Expr)</code></pre><p>Shortcut to add multiple reactions and their lower and upper bounds</p><p><strong>Call variants</strong></p><pre><code class="language-none">@add_reactions! model begin
+)</code></pre><p>Remove all genes with <code>ids</code> from <code>model</code>. If <code>knockout_reactions</code> is true, then also constrain reactions that require the genes to function to carry zero flux.</p><p><strong>Example</strong></p><pre><code class="language-none">remove_genes!(model, [&quot;g1&quot;, &quot;g2&quot;])</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/reconstruction/StandardModel.jl#L165-L179">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.remove_metabolite!-Tuple{StandardModel, String}" href="#COBREXA.remove_metabolite!-Tuple{StandardModel, String}"><code>COBREXA.remove_metabolite!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">remove_metabolite!(model::StandardModel, id::String)</code></pre><p>Remove metabolite with <code>id</code> from <code>model</code>. Warning, this could leave the model inconsistent, e.g. a reaction might require the deleted metabolite, in which case analysis functions will error.</p><p><strong>Example</strong></p><pre><code class="language-none">remove_metabolite!(model, &quot;atp_c&quot;)</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/reconstruction/StandardModel.jl#L151-L162">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.remove_metabolites!-Tuple{StandardModel, Vector{String}}" href="#COBREXA.remove_metabolites!-Tuple{StandardModel, Vector{String}}"><code>COBREXA.remove_metabolites!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">remove_metabolites!(model::StandardModel, ids::Vector{String})</code></pre><p>Remove all metabolites with <code>ids</code> from <code>model</code>. Warning, this could leave the model inconsistent, e.g. a reaction might require the deleted metabolite, in which case analysis functions will error.</p><p><strong>Example</strong></p><pre><code class="language-none">remove_metabolites!(model, [&quot;atp_c&quot;, &quot;adp_c&quot;])</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/reconstruction/StandardModel.jl#L135-L146">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.remove_reaction!-Tuple{StandardModel, String}" href="#COBREXA.remove_reaction!-Tuple{StandardModel, String}"><code>COBREXA.remove_reaction!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">remove_reaction!(model::StandardModel, id::String)</code></pre><p>Remove reaction with <code>id</code> from <code>model</code>. Note, may result in orphan metabolites.</p><p><strong>Example</strong></p><pre><code class="language-none">remove_reaction!(model, &quot;EX_glc__D_e&quot;)</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/reconstruction/StandardModel.jl#L123-L132">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.remove_reactions!-Tuple{StandardModel, Vector{String}}" href="#COBREXA.remove_reactions!-Tuple{StandardModel, Vector{String}}"><code>COBREXA.remove_reactions!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">remove_reactions!(model::StandardModel, ids::Vector{String})</code></pre><p>Remove all reactions with <code>ids</code> from <code>model</code>. Note, may result in orphan metabolites.</p><p><strong>Example</strong></p><pre><code class="language-none">remove_reactions!(model, [&quot;EX_glc__D_e&quot;, &quot;fba&quot;])</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/reconstruction/StandardModel.jl#L109-L118">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.@add_reactions!-Tuple{Symbol, Expr}" href="#COBREXA.@add_reactions!-Tuple{Symbol, Expr}"><code>COBREXA.@add_reactions!</code></a> — <span class="docstring-category">Macro</span></header><section><div><pre><code class="language-julia">@add_reactions!(model::Symbol, ex::Expr)</code></pre><p>Shortcut to add multiple reactions and their lower and upper bounds</p><p><strong>Call variants</strong></p><pre><code class="language-none">@add_reactions! model begin
     reaction_name, reaction
 end
 
@@ -269,21 +269,21 @@ end</code></pre><p><strong>Examples</strong></p><pre><code class="language-none"
     &quot;v1&quot;, nothing → A, 0, 500
     &quot;v2&quot;, A ↔ B + C, -500
     &quot;v3&quot;, B + C → nothing
-end</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/reconstruction/StandardModel.jl#L55-L85">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.add_model_with_exchanges-Tuple{CoreModel, MetabolicModel, Vector{String}, Vector{String}}" href="#COBREXA.add_model_with_exchanges-Tuple{CoreModel, MetabolicModel, Vector{String}, Vector{String}}"><code>COBREXA.add_model_with_exchanges</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">add_model_with_exchanges(
+end</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/reconstruction/StandardModel.jl#L55-L85">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.add_model_with_exchanges-Tuple{CoreModel, MetabolicModel, Vector{String}, Vector{String}}" href="#COBREXA.add_model_with_exchanges-Tuple{CoreModel, MetabolicModel, Vector{String}, Vector{String}}"><code>COBREXA.add_model_with_exchanges</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">add_model_with_exchanges(
     community::CoreModel,
     model::MetabolicModel,
     exchange_rxn_ids::Vector{String},
     exchange_met_ids::Vector{String};
     model_name = &quot;unknown_species&quot;,
     biomass_id = nothing,
-)::CoreModel</code></pre><p>Add <code>model</code> to <code>community</code>, which is a pre-existing community model with <code>exchange_rxn_ids</code> and <code>exchange_met_ids</code>. The <code>model_name</code> is appended to each reaction and metabolite, see <a href="#COBREXA.join_with_exchanges-Union{Tuple{M}, Tuple{Vector{M}, Vector{String}, Vector{String}}} where M&lt;:MetabolicModel"><code>join_with_exchanges</code></a>. If <code>biomass_id</code> is specified then a biomass metabolite for <code>model</code> is also added to the resulting model. The column corresponding to the <code>biomass_id</code> reaction then produces this new biomass metabolite with unit coefficient. Note, <code>exchange_rxn_ids</code> and <code>exchange_met_ids</code> must already exist in the <code>community</code> model.</p><p><strong>Example</strong></p><pre><code class="language-none">community = add_model_with_exchanges(community, model, exchange_rxn_ids, exchange_met_ids; model_name=&quot;species_2&quot;, biomass_id=&quot;BIOMASS_Ecoli_core_w_GAM&quot;)</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/reconstruction/community.jl#L62-L85">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.add_objective!-Tuple{CoreModel, Vector{String}}" href="#COBREXA.add_objective!-Tuple{CoreModel, Vector{String}}"><code>COBREXA.add_objective!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">add_objective!(
+)::CoreModel</code></pre><p>Add <code>model</code> to <code>community</code>, which is a pre-existing community model with <code>exchange_rxn_ids</code> and <code>exchange_met_ids</code>. The <code>model_name</code> is appended to each reaction and metabolite, see <a href="#COBREXA.join_with_exchanges-Union{Tuple{M}, Tuple{Vector{M}, Vector{String}, Vector{String}}} where M&lt;:MetabolicModel"><code>join_with_exchanges</code></a>. If <code>biomass_id</code> is specified then a biomass metabolite for <code>model</code> is also added to the resulting model. The column corresponding to the <code>biomass_id</code> reaction then produces this new biomass metabolite with unit coefficient. Note, <code>exchange_rxn_ids</code> and <code>exchange_met_ids</code> must already exist in the <code>community</code> model.</p><p><strong>Example</strong></p><pre><code class="language-none">community = add_model_with_exchanges(community, model, exchange_rxn_ids, exchange_met_ids; model_name=&quot;species_2&quot;, biomass_id=&quot;BIOMASS_Ecoli_core_w_GAM&quot;)</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/reconstruction/community.jl#L62-L85">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.add_objective!-Tuple{CoreModel, Vector{String}}" href="#COBREXA.add_objective!-Tuple{CoreModel, Vector{String}}"><code>COBREXA.add_objective!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">add_objective!(
     community::CoreModel,
     objective_mets::Vector{String};
     objective_weights = Float64[],
     objective_column_index = 0,
 )</code></pre><p>Add an objective to the <code>community</code> model. Supply the string names of the objective metabolites in <code>objective_mets</code>. Optionally specify the weight to assign each metabolite in the objective function, if unassigned then equal weight is assumed. Also, optionally specify whether the objective already exists in the model by assigning <code>objective_column_index</code>. If unassigned then an objective column will be added, otherwise the column at <code>objective_column_index</code> will be updated.</p><p>Note, the weights are negated inside the function so that the objective metabolites are seen as reagents/substrates, not products in the reaction equation.</p><p><strong>Example</strong></p><pre><code class="language-none">add_objective!(model, [&quot;met1&quot;, &quot;met2&quot;]) # adds a new column with weights = [1,1]
 add_objective!(model, [&quot;met1&quot;, &quot;met2&quot;]; objective_weights=[0.1, 0.9]) # adds a new column
-add_objective!(model, [&quot;met1&quot;, &quot;met2&quot;]; objective_weights=[0.1, 0.9], objective_column_index=10) # updates column 10</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/reconstruction/community.jl#L1-L26">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.join_with_exchanges-Union{Tuple{M}, Tuple{Vector{M}, Vector{String}, Vector{String}}} where M&lt;:MetabolicModel" href="#COBREXA.join_with_exchanges-Union{Tuple{M}, Tuple{Vector{M}, Vector{String}, Vector{String}}} where M&lt;:MetabolicModel"><code>COBREXA.join_with_exchanges</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">join_with_exchanges(models::Vector{M},
+add_objective!(model, [&quot;met1&quot;, &quot;met2&quot;]; objective_weights=[0.1, 0.9], objective_column_index=10) # updates column 10</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/reconstruction/community.jl#L1-L26">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.join_with_exchanges-Union{Tuple{M}, Tuple{Vector{M}, Vector{String}, Vector{String}}} where M&lt;:MetabolicModel" href="#COBREXA.join_with_exchanges-Union{Tuple{M}, Tuple{Vector{M}, Vector{String}, Vector{String}}} where M&lt;:MetabolicModel"><code>COBREXA.join_with_exchanges</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">join_with_exchanges(models::Vector{M},
     exchange_rxn_ids::Vector{String},
     exchange_met_ids::Vector{String};
     add_biomass_objective=false,
@@ -313,36 +313,36 @@ community = join_with_exchanges(
     exchange_met_ids;
     add_biomass_objective = true,
     biomass_ids = biomass_ids,
-)</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/reconstruction/community.jl#L172-L243">source</a></section></article><h3 id="Model-variant-specifications"><a class="docs-heading-anchor" href="#Model-variant-specifications">Model variant specifications</a><a id="Model-variant-specifications-1"></a><a class="docs-heading-anchor-permalink" href="#Model-variant-specifications" title="Permalink"></a></h3><article class="docstring"><header><a class="docstring-binding" id="COBREXA.with_added_reactions-Tuple" href="#COBREXA.with_added_reactions-Tuple"><code>COBREXA.with_added_reactions</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">with_added_reactions(args...; kwargs...)</code></pre><p>Specifies a model variant with reactions added. Forwards the arguments to <a href="#COBREXA.add_reactions-Tuple{CoreModel, CoreModel}"><code>add_reactions</code></a>. Intended to be used with <a href="#COBREXA.screen-Union{Tuple{MetabolicModel}, Tuple{N}, Tuple{T}, Tuple{V}} where {V&lt;:(AbstractVector{T} where T), T&lt;:Tuple, N}"><code>screen</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/reconstruction/modifications/generic.jl#L27-L32">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.with_changed_bound-Tuple" href="#COBREXA.with_changed_bound-Tuple"><code>COBREXA.with_changed_bound</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">with_changed_bound(args...; kwargs...)</code></pre><p>Specifies a model variant that has a new bound set. Forwards arguments to <a href="#COBREXA.change_bound-Tuple{CoreModel, Int64}"><code>change_bound</code></a>. Intended for usage with <a href="#COBREXA.screen-Union{Tuple{MetabolicModel}, Tuple{N}, Tuple{T}, Tuple{V}} where {V&lt;:(AbstractVector{T} where T), T&lt;:Tuple, N}"><code>screen</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/reconstruction/modifications/generic.jl#L1-L6">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.with_changed_bounds-Tuple" href="#COBREXA.with_changed_bounds-Tuple"><code>COBREXA.with_changed_bounds</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">with_changed_bounds(args...; kwargs...)</code></pre><p>Specifies a model variant that has new bounds set. Forwards arguments to <a href="#COBREXA.change_bounds-Tuple{CoreModel, AbstractVector{Int64}}"><code>change_bounds</code></a>. Intended for usage with <a href="#COBREXA.screen-Union{Tuple{MetabolicModel}, Tuple{N}, Tuple{T}, Tuple{V}} where {V&lt;:(AbstractVector{T} where T), T&lt;:Tuple, N}"><code>screen</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/reconstruction/modifications/generic.jl#L9-L14">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.with_removed_metabolites-Tuple" href="#COBREXA.with_removed_metabolites-Tuple"><code>COBREXA.with_removed_metabolites</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">with_removed_metabolites(args...; kwargs...)</code></pre><p>Specifies a model variant without specified metabolites. Forwards arguments to <a href="#COBREXA.remove_metabolites-Tuple{CoreModel, Any}"><code>remove_metabolites</code></a>. Intended to be used with <a href="#COBREXA.screen-Union{Tuple{MetabolicModel}, Tuple{N}, Tuple{T}, Tuple{V}} where {V&lt;:(AbstractVector{T} where T), T&lt;:Tuple, N}"><code>screen</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/reconstruction/modifications/generic.jl#L17-L22">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.with_removed_reactions-Tuple" href="#COBREXA.with_removed_reactions-Tuple"><code>COBREXA.with_removed_reactions</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">with_removed_reactions(args...; kwargs...)</code></pre><p>Specifies a model variant with specified reactions removed. Forwards arguments to <a href="#COBREXA.remove_reactions-Tuple{CoreModel, Int64}"><code>remove_reactions</code></a>. Intended to be used with <a href="#COBREXA.screen-Union{Tuple{MetabolicModel}, Tuple{N}, Tuple{T}, Tuple{V}} where {V&lt;:(AbstractVector{T} where T), T&lt;:Tuple, N}"><code>screen</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/reconstruction/modifications/generic.jl#L35-L40">source</a></section></article><h2 id="Analysis-functions"><a class="docs-heading-anchor" href="#Analysis-functions">Analysis functions</a><a id="Analysis-functions-1"></a><a class="docs-heading-anchor-permalink" href="#Analysis-functions" title="Permalink"></a></h2><article class="docstring"><header><a class="docstring-binding" id="COBREXA.envelope_lattice-Tuple{MetabolicModel, Vector{Int64}}" href="#COBREXA.envelope_lattice-Tuple{MetabolicModel, Vector{Int64}}"><code>COBREXA.envelope_lattice</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">envelope_lattice(
+)</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/reconstruction/community.jl#L172-L243">source</a></section></article><h3 id="Model-variant-specifications"><a class="docs-heading-anchor" href="#Model-variant-specifications">Model variant specifications</a><a id="Model-variant-specifications-1"></a><a class="docs-heading-anchor-permalink" href="#Model-variant-specifications" title="Permalink"></a></h3><article class="docstring"><header><a class="docstring-binding" id="COBREXA.with_added_reactions-Tuple" href="#COBREXA.with_added_reactions-Tuple"><code>COBREXA.with_added_reactions</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">with_added_reactions(args...; kwargs...)</code></pre><p>Specifies a model variant with reactions added. Forwards the arguments to <a href="#COBREXA.add_reactions-Tuple{CoreModel, CoreModel}"><code>add_reactions</code></a>. Intended to be used with <a href="#COBREXA.screen-Union{Tuple{MetabolicModel}, Tuple{N}, Tuple{T}, Tuple{V}} where {V&lt;:(AbstractVector{T} where T), T&lt;:Tuple, N}"><code>screen</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/reconstruction/modifications/generic.jl#L27-L32">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.with_changed_bound-Tuple" href="#COBREXA.with_changed_bound-Tuple"><code>COBREXA.with_changed_bound</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">with_changed_bound(args...; kwargs...)</code></pre><p>Specifies a model variant that has a new bound set. Forwards arguments to <a href="#COBREXA.change_bound-Tuple{CoreModel, Int64}"><code>change_bound</code></a>. Intended for usage with <a href="#COBREXA.screen-Union{Tuple{MetabolicModel}, Tuple{N}, Tuple{T}, Tuple{V}} where {V&lt;:(AbstractVector{T} where T), T&lt;:Tuple, N}"><code>screen</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/reconstruction/modifications/generic.jl#L1-L6">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.with_changed_bounds-Tuple" href="#COBREXA.with_changed_bounds-Tuple"><code>COBREXA.with_changed_bounds</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">with_changed_bounds(args...; kwargs...)</code></pre><p>Specifies a model variant that has new bounds set. Forwards arguments to <a href="#COBREXA.change_bounds-Tuple{CoreModel, AbstractVector{Int64}}"><code>change_bounds</code></a>. Intended for usage with <a href="#COBREXA.screen-Union{Tuple{MetabolicModel}, Tuple{N}, Tuple{T}, Tuple{V}} where {V&lt;:(AbstractVector{T} where T), T&lt;:Tuple, N}"><code>screen</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/reconstruction/modifications/generic.jl#L9-L14">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.with_removed_metabolites-Tuple" href="#COBREXA.with_removed_metabolites-Tuple"><code>COBREXA.with_removed_metabolites</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">with_removed_metabolites(args...; kwargs...)</code></pre><p>Specifies a model variant without specified metabolites. Forwards arguments to <a href="#COBREXA.remove_metabolites-Tuple{CoreModel, Any}"><code>remove_metabolites</code></a>. Intended to be used with <a href="#COBREXA.screen-Union{Tuple{MetabolicModel}, Tuple{N}, Tuple{T}, Tuple{V}} where {V&lt;:(AbstractVector{T} where T), T&lt;:Tuple, N}"><code>screen</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/reconstruction/modifications/generic.jl#L17-L22">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.with_removed_reactions-Tuple" href="#COBREXA.with_removed_reactions-Tuple"><code>COBREXA.with_removed_reactions</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">with_removed_reactions(args...; kwargs...)</code></pre><p>Specifies a model variant with specified reactions removed. Forwards arguments to <a href="#COBREXA.remove_reactions-Tuple{CoreModel, Int64}"><code>remove_reactions</code></a>. Intended to be used with <a href="#COBREXA.screen-Union{Tuple{MetabolicModel}, Tuple{N}, Tuple{T}, Tuple{V}} where {V&lt;:(AbstractVector{T} where T), T&lt;:Tuple, N}"><code>screen</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/reconstruction/modifications/generic.jl#L35-L40">source</a></section></article><h2 id="Analysis-functions"><a class="docs-heading-anchor" href="#Analysis-functions">Analysis functions</a><a id="Analysis-functions-1"></a><a class="docs-heading-anchor-permalink" href="#Analysis-functions" title="Permalink"></a></h2><article class="docstring"><header><a class="docstring-binding" id="COBREXA.envelope_lattice-Tuple{MetabolicModel, Vector{Int64}}" href="#COBREXA.envelope_lattice-Tuple{MetabolicModel, Vector{Int64}}"><code>COBREXA.envelope_lattice</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">envelope_lattice(
     model::MetabolicModel,
     ridxs::Vector{Int};
     samples = 10,
     ranges = collect(zip(bounds(model)...))[ridxs],
     reaction_samples = fill(samples, length(ridxs)),
-)</code></pre><p>Create a lattice (list of &quot;tick&quot; vectors) for reactions at indexes <code>ridxs</code> in a model. Arguments <code>samples</code>, <code>ranges</code>, and <code>reaction_samples</code> may be optionally specified to customize the latice creation process.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/analysis/envelopes.jl#L11-L23">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.envelope_lattice-Tuple{MetabolicModel, Vector{String}}" href="#COBREXA.envelope_lattice-Tuple{MetabolicModel, Vector{String}}"><code>COBREXA.envelope_lattice</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">envelope_lattice(model::MetabolicModel, rids::Vector{String}; kwargs...)</code></pre><p>Version of <a href="#COBREXA.envelope_lattice-Tuple{MetabolicModel, Vector{Int64}}"><code>envelope_lattice</code></a> that works on string reaction IDs instead of integer indexes.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/analysis/envelopes.jl#L2-L7">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.objective_envelope-Tuple{MetabolicModel, Vector{Int64}, Any}" href="#COBREXA.objective_envelope-Tuple{MetabolicModel, Vector{Int64}, Any}"><code>COBREXA.objective_envelope</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">objective_envelope(
+)</code></pre><p>Create a lattice (list of &quot;tick&quot; vectors) for reactions at indexes <code>ridxs</code> in a model. Arguments <code>samples</code>, <code>ranges</code>, and <code>reaction_samples</code> may be optionally specified to customize the latice creation process.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/analysis/envelopes.jl#L11-L23">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.envelope_lattice-Tuple{MetabolicModel, Vector{String}}" href="#COBREXA.envelope_lattice-Tuple{MetabolicModel, Vector{String}}"><code>COBREXA.envelope_lattice</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">envelope_lattice(model::MetabolicModel, rids::Vector{String}; kwargs...)</code></pre><p>Version of <a href="#COBREXA.envelope_lattice-Tuple{MetabolicModel, Vector{Int64}}"><code>envelope_lattice</code></a> that works on string reaction IDs instead of integer indexes.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/analysis/envelopes.jl#L2-L7">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.objective_envelope-Tuple{MetabolicModel, Vector{Int64}, Any}" href="#COBREXA.objective_envelope-Tuple{MetabolicModel, Vector{Int64}, Any}"><code>COBREXA.objective_envelope</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">objective_envelope(
     model::MetabolicModel,
     ridxs::Vector{Int},
     optimizer;
     lattice = envelope_lattice(model, ridxs),
     kwargs...,
-)</code></pre><p>Compute an array of objective values for the <code>model</code> for rates of reactions specified <code>ridxs</code> fixed to a regular range of values between their respective lower and upper bounds.</p><p>This can be used to compute a &quot;production envelope&quot; of a metabolite; but generalizes to any specifiable objective and to multiple dimensions of the examined space. To retrieve a production envelope of any metabolite, set the objective coefficient vector of the <code>model</code> to a vector that contains a single <code>1</code> for the exchange reaction that &quot;outputs&quot; this metabolite, and run <a href="#COBREXA.objective_envelope-Tuple{MetabolicModel, Vector{Int64}, Any}"><code>objective_envelope</code></a> with the exchange reaction of the &quot;parameter&quot; metabolite specified in <code>ridxs</code>.</p><p>Returns a named tuple that contains <code>lattice</code> with reference values of the metabolites, and an N-dimensional array <code>values</code> with the computed objective values, where N is the number of specified reactions.  Because of the increasing dimensionality, the computation gets very voluminous with increasing length of <code>ridxs</code>.</p><p><code>kwargs</code> are internally forwarded to <a href="#COBREXA.screen_optmodel_modifications-Union{Tuple{N}, Tuple{V}, Tuple{MetabolicModel, Any}} where {V&lt;:(AbstractVector{T} where T), N}"><code>screen_optmodel_modifications</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/analysis/envelopes.jl#L49-L77">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.objective_envelope-Tuple{MetabolicModel, Vector{String}, Vararg{Any, N} where N}" href="#COBREXA.objective_envelope-Tuple{MetabolicModel, Vector{String}, Vararg{Any, N} where N}"><code>COBREXA.objective_envelope</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">objective_envelope(model::MetabolicModel, rids::Vector{String}, args...; kwargs...)</code></pre><p>Versioin of <a href="#COBREXA.objective_envelope-Tuple{MetabolicModel, Vector{Int64}, Any}"><code>objective_envelope</code></a> that works on string reaction IDs instead of integer indexes.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/analysis/envelopes.jl#L35-L40">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.flux_balance_analysis-Union{Tuple{M}, Tuple{M, Any}} where M&lt;:MetabolicModel" href="#COBREXA.flux_balance_analysis-Union{Tuple{M}, Tuple{M, Any}} where M&lt;:MetabolicModel"><code>COBREXA.flux_balance_analysis</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">flux_balance_analysis(
+)</code></pre><p>Compute an array of objective values for the <code>model</code> for rates of reactions specified <code>ridxs</code> fixed to a regular range of values between their respective lower and upper bounds.</p><p>This can be used to compute a &quot;production envelope&quot; of a metabolite; but generalizes to any specifiable objective and to multiple dimensions of the examined space. To retrieve a production envelope of any metabolite, set the objective coefficient vector of the <code>model</code> to a vector that contains a single <code>1</code> for the exchange reaction that &quot;outputs&quot; this metabolite, and run <a href="#COBREXA.objective_envelope-Tuple{MetabolicModel, Vector{Int64}, Any}"><code>objective_envelope</code></a> with the exchange reaction of the &quot;parameter&quot; metabolite specified in <code>ridxs</code>.</p><p>Returns a named tuple that contains <code>lattice</code> with reference values of the metabolites, and an N-dimensional array <code>values</code> with the computed objective values, where N is the number of specified reactions.  Because of the increasing dimensionality, the computation gets very voluminous with increasing length of <code>ridxs</code>.</p><p><code>kwargs</code> are internally forwarded to <a href="#COBREXA.screen_optmodel_modifications-Union{Tuple{N}, Tuple{V}, Tuple{MetabolicModel, Any}} where {V&lt;:(AbstractVector{T} where T), N}"><code>screen_optmodel_modifications</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/analysis/envelopes.jl#L49-L77">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.objective_envelope-Tuple{MetabolicModel, Vector{String}, Vararg{Any, N} where N}" href="#COBREXA.objective_envelope-Tuple{MetabolicModel, Vector{String}, Vararg{Any, N} where N}"><code>COBREXA.objective_envelope</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">objective_envelope(model::MetabolicModel, rids::Vector{String}, args...; kwargs...)</code></pre><p>Versioin of <a href="#COBREXA.objective_envelope-Tuple{MetabolicModel, Vector{Int64}, Any}"><code>objective_envelope</code></a> that works on string reaction IDs instead of integer indexes.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/analysis/envelopes.jl#L35-L40">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.flux_balance_analysis-Union{Tuple{M}, Tuple{M, Any}} where M&lt;:MetabolicModel" href="#COBREXA.flux_balance_analysis-Union{Tuple{M}, Tuple{M, Any}} where M&lt;:MetabolicModel"><code>COBREXA.flux_balance_analysis</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">flux_balance_analysis(
     model::M,
     optimizer;
     modifications = [],
 ) where {M&lt;:MetabolicModel}</code></pre><p>Run flux balance analysis (FBA) on the <code>model</code> optionally specifying <code>modifications</code> to the problem.  Basically, FBA solves this optimization problem:</p><pre><code class="language-none">max cáµ€x
 s.t. S x = b
-     xₗ ≤ x ≤ xᵤ</code></pre><p>See &quot;Orth, J., Thiele, I. &amp; Palsson, B. What is flux balance analysis?. Nat Biotechnol 28, 245-248 (2010). https://doi.org/10.1038/nbt.1614&quot; for more information.</p><p>The <code>optimizer</code> must be set to a <code>JuMP</code>-compatible optimizer, such as <code>GLPK.Optimizer</code> or <code>Tulip.Optimizer</code></p><p>Optionally, you may specify one or more modifications to be applied to the model before the analysis, such as <a href="#COBREXA.change_optimizer_attribute-Tuple{Any, Any}"><code>change_optimizer_attribute</code></a>, <a href="#COBREXA.change_objective-Tuple{Union{Int64, String}}"><code>change_objective</code></a>, and <a href="#COBREXA.change_sense-Tuple{Any}"><code>change_sense</code></a>.</p><p>Returns an optimized <code>JuMP</code> model.</p><p><strong>Example</strong></p><pre><code class="language-none">model = load_model(&quot;e_coli_core.json&quot;)
+     xₗ ≤ x ≤ xᵤ</code></pre><p>See &quot;Orth, J., Thiele, I. &amp; Palsson, B. What is flux balance analysis?. Nat Biotechnol 28, 245-248 (2010). https://doi.org/10.1038/nbt.1614&quot; for more information.</p><p>The <code>optimizer</code> must be set to a <code>JuMP</code>-compatible optimizer, such as <code>GLPK.Optimizer</code> or <code>Tulip.Optimizer</code></p><p>Optionally, you may specify one or more modifications to be applied to the model before the analysis, such as <a href="#COBREXA.change_optimizer_attribute-Tuple{Any, Any}"><code>change_optimizer_attribute</code></a>, <a href="#COBREXA.change_objective-Tuple{Union{String, Vector{String}}}"><code>change_objective</code></a>, and <a href="#COBREXA.change_sense-Tuple{Any}"><code>change_sense</code></a>.</p><p>Returns an optimized <code>JuMP</code> model.</p><p><strong>Example</strong></p><pre><code class="language-none">model = load_model(&quot;e_coli_core.json&quot;)
 solution = flux_balance_analysis(model, GLPK.optimizer)
 value.(solution[:x])  # extract flux steady state from the optimizer
 
 biomass_reaction_id = findfirst(model.reactions, &quot;BIOMASS_Ecoli_core_w_GAM&quot;)
 
 modified_solution = flux_balance_analysis(model, GLPK.optimizer;
-    modifications=[change_objective(biomass_reaction_id)])</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/analysis/flux_balance_analysis.jl#L31-L70">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.flux_balance_analysis_dict-Tuple{MetabolicModel, Vararg{Any, N} where N}" href="#COBREXA.flux_balance_analysis_dict-Tuple{MetabolicModel, Vararg{Any, N} where N}"><code>COBREXA.flux_balance_analysis_dict</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">flux_balance_analysis_dict(model::MetabolicModel, args...)::Union{Dict{String, Float64},Nothing}</code></pre><p>A variant of FBA that returns a dictionary assigning fluxes to reactions, if the solution is found. Arguments are passed to <a href="#COBREXA.flux_balance_analysis-Union{Tuple{M}, Tuple{M, Any}} where M&lt;:MetabolicModel"><code>flux_balance_analysis</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/analysis/flux_balance_analysis.jl#L15-L20">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.flux_balance_analysis_vec-Tuple" href="#COBREXA.flux_balance_analysis_vec-Tuple"><code>COBREXA.flux_balance_analysis_vec</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">flux_balance_analysis_vec(args...)::Union{Vector{Float64},Nothing}</code></pre><p>A variant of FBA that returns a vector of fluxes in the same order as reactions of the model, if the solution is found.</p><p>Arguments are passed to <a href="#COBREXA.flux_balance_analysis-Union{Tuple{M}, Tuple{M, Any}} where M&lt;:MetabolicModel"><code>flux_balance_analysis</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/analysis/flux_balance_analysis.jl#L1-L8">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA._FVA_add_constraint-NTuple{4, Any}" href="#COBREXA._FVA_add_constraint-NTuple{4, Any}"><code>COBREXA._FVA_add_constraint</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">_FVA_add_constraint(model, c, x, Z)</code></pre><p>Internal helper function for adding constraints to a model. Exists mainly because for avoiding namespace problems on remote workers.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/analysis/flux_variability_analysis.jl#L154-L159">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA._FVA_optimize_reaction-Tuple{Any, Any, Any}" href="#COBREXA._FVA_optimize_reaction-Tuple{Any, Any, Any}"><code>COBREXA._FVA_optimize_reaction</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">_FVA_get_opt(model, rid)</code></pre><p>Internal helper for creating the optimized model on a remote worker, for avoiding namespace problems.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/analysis/flux_variability_analysis.jl#L165-L170">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.flux_variability_analysis-Tuple{MetabolicModel, Any}" href="#COBREXA.flux_variability_analysis-Tuple{MetabolicModel, Any}"><code>COBREXA.flux_variability_analysis</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">flux_variability_analysis(
+    modifications=[change_objective(biomass_reaction_id)])</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/analysis/flux_balance_analysis.jl#L31-L70">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.flux_balance_analysis_dict-Tuple{MetabolicModel, Vararg{Any, N} where N}" href="#COBREXA.flux_balance_analysis_dict-Tuple{MetabolicModel, Vararg{Any, N} where N}"><code>COBREXA.flux_balance_analysis_dict</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">flux_balance_analysis_dict(model::MetabolicModel, args...)::Union{Dict{String, Float64},Nothing}</code></pre><p>A variant of FBA that returns a dictionary assigning fluxes to reactions, if the solution is found. Arguments are passed to <a href="#COBREXA.flux_balance_analysis-Union{Tuple{M}, Tuple{M, Any}} where M&lt;:MetabolicModel"><code>flux_balance_analysis</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/analysis/flux_balance_analysis.jl#L15-L20">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.flux_balance_analysis_vec-Tuple" href="#COBREXA.flux_balance_analysis_vec-Tuple"><code>COBREXA.flux_balance_analysis_vec</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">flux_balance_analysis_vec(args...)::Union{Vector{Float64},Nothing}</code></pre><p>A variant of FBA that returns a vector of fluxes in the same order as reactions of the model, if the solution is found.</p><p>Arguments are passed to <a href="#COBREXA.flux_balance_analysis-Union{Tuple{M}, Tuple{M, Any}} where M&lt;:MetabolicModel"><code>flux_balance_analysis</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/analysis/flux_balance_analysis.jl#L1-L8">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA._FVA_add_constraint-NTuple{4, Any}" href="#COBREXA._FVA_add_constraint-NTuple{4, Any}"><code>COBREXA._FVA_add_constraint</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">_FVA_add_constraint(model, c, x, Z)</code></pre><p>Internal helper function for adding constraints to a model. Exists mainly because for avoiding namespace problems on remote workers.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/analysis/flux_variability_analysis.jl#L154-L159">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA._FVA_optimize_reaction-Tuple{Any, Any, Any}" href="#COBREXA._FVA_optimize_reaction-Tuple{Any, Any, Any}"><code>COBREXA._FVA_optimize_reaction</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">_FVA_get_opt(model, rid)</code></pre><p>Internal helper for creating the optimized model on a remote worker, for avoiding namespace problems.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/analysis/flux_variability_analysis.jl#L165-L170">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.flux_variability_analysis-Tuple{MetabolicModel, Any}" href="#COBREXA.flux_variability_analysis-Tuple{MetabolicModel, Any}"><code>COBREXA.flux_variability_analysis</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">flux_variability_analysis(
     model::MetabolicModel,
     optimizer;
     kwargs...
-)</code></pre><p>A simpler version of <a href="#COBREXA.flux_variability_analysis-Tuple{MetabolicModel, Any}"><code>flux_variability_analysis</code></a> that maximizes and minimizes all reactions in the model. Arguments are forwarded.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/analysis/flux_variability_analysis.jl#L99-L108">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.flux_variability_analysis-Tuple{MetabolicModel, Vector{Int64}, Any}" href="#COBREXA.flux_variability_analysis-Tuple{MetabolicModel, Vector{Int64}, Any}"><code>COBREXA.flux_variability_analysis</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">flux_variability_analysis(
+)</code></pre><p>A simpler version of <a href="#COBREXA.flux_variability_analysis-Tuple{MetabolicModel, Any}"><code>flux_variability_analysis</code></a> that maximizes and minimizes all reactions in the model. Arguments are forwarded.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/analysis/flux_variability_analysis.jl#L99-L108">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.flux_variability_analysis-Tuple{MetabolicModel, Vector{Int64}, Any}" href="#COBREXA.flux_variability_analysis-Tuple{MetabolicModel, Vector{Int64}, Any}"><code>COBREXA.flux_variability_analysis</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">flux_variability_analysis(
     model::MetabolicModel,
     reactions::Vector{Int},
     optimizer;
@@ -355,7 +355,7 @@ s.t. S x = b
     xₗ ≤ x ≤ xᵤ
      cᵀx ≥ bounds(Z₀)[1]
      cᵀx ≤ bounds(Z₀)[2]</code></pre><p>where Z₀:= cᵀx₀ is the objective value of an optimal solution of the associated FBA problem (see <a href="#COBREXA.flux_balance_analysis-Union{Tuple{M}, Tuple{M, Any}} where M&lt;:MetabolicModel"><code>flux_balance_analysis</code></a> for a related analysis, also for explanation of the <code>modifications</code> argument).</p><p>The <code>bounds</code> is a user-supplied function that specifies the objective bounds for the variability optimizations, by default it restricts the flux objective value to the precise optimum reached in FBA. It can return <code>-Inf</code> and <code>Inf</code> in first and second pair to remove the limit. Use <a href="#COBREXA.gamma_bounds-Tuple{Any}"><code>gamma_bounds</code></a> and <a href="#COBREXA.objective_bounds-Tuple{Any}"><code>objective_bounds</code></a> for simple bounds.</p><p><code>optimizer</code> must be set to a <code>JuMP</code>-compatible optimizer. The computation of the individual optimization problems is transparently distributed to <code>workers</code> (see <code>Distributed.workers()</code>).</p><p><code>ret</code> is a function used to extract results from optimized JuMP models of the individual reactions. By default, it calls and returns the value of <code>JuMP.objective_value</code>. More information can be extracted e.g. by setting it to a function that returns a more elaborate data structure; such as <code>m -&gt; (JuMP.objective_value(m), JuMP.value.(m[:x]))</code>.</p><p>Returns a matrix of extracted <code>ret</code> values for minima and maxima, of total size (<code>length(reactions)</code>,2). The optimizer result status is checked with <a href="#COBREXA.is_solved-Tuple{Any}"><code>is_solved</code></a>; <code>nothing</code> is returned if the optimization failed for any reason.</p><p><strong>Example</strong></p><pre><code class="language-none">model = load_model(&quot;e_coli_core.json&quot;)
-flux_variability_analysis(model, [1, 2, 3, 42], GLPK.optimizer)</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/analysis/flux_variability_analysis.jl#L1-L51">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.flux_variability_analysis_dict-Tuple{MetabolicModel, Any}" href="#COBREXA.flux_variability_analysis_dict-Tuple{MetabolicModel, Any}"><code>COBREXA.flux_variability_analysis_dict</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">flux_variability_analysis_dict(
+flux_variability_analysis(model, [1, 2, 3, 42], GLPK.optimizer)</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/analysis/flux_variability_analysis.jl#L1-L51">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.flux_variability_analysis_dict-Tuple{MetabolicModel, Any}" href="#COBREXA.flux_variability_analysis_dict-Tuple{MetabolicModel, Any}"><code>COBREXA.flux_variability_analysis_dict</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">flux_variability_analysis_dict(
     model::MetabolicModel,
     optimizer;
     kwargs...
@@ -368,7 +368,7 @@ flux_variability_analysis(model, [1, 2, 3, 42], GLPK.optimizer)</code></pre></di
         change_constraint(&quot;EX_glc__D_e&quot;, -10, -10),
         change_constraint(&quot;EX_o2_e&quot;, 0.0, 0.0),
     ],
-)</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/analysis/flux_variability_analysis.jl#L114-L138">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.parsimonious_flux_balance_analysis-Tuple{MetabolicModel, Any}" href="#COBREXA.parsimonious_flux_balance_analysis-Tuple{MetabolicModel, Any}"><code>COBREXA.parsimonious_flux_balance_analysis</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">parsimonious_flux_balance_analysis(
+)</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/analysis/flux_variability_analysis.jl#L114-L138">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.parsimonious_flux_balance_analysis-Tuple{MetabolicModel, Any}" href="#COBREXA.parsimonious_flux_balance_analysis-Tuple{MetabolicModel, Any}"><code>COBREXA.parsimonious_flux_balance_analysis</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">parsimonious_flux_balance_analysis(
     model::MetabolicModel,
     optimizer;
     modifications = [],
@@ -381,7 +381,7 @@ s.t. S x = b
      xₗ ≤ x ≤ xᵤ
      μ = μ⁰</code></pre><p>Where the optimal solution of the FBA problem, μ⁰, has been added as an additional constraint. See &quot;Lewis, Nathan E, Hixson, Kim K, Conrad, Tom M, Lerman, Joshua A, Charusanti, Pep, Polpitiya, Ashoka D, Adkins, Joshua N, Schramm, Gunnar, Purvine, Samuel O, Lopez-Ferrer, Daniel, Weitz, Karl K, Eils, Roland, König, Rainer, Smith, Richard D, Palsson, Bernhard Ø, (2010) Omic data from evolved E. coli are consistent with computed optimal growth from genome-scale models. Molecular Systems Biology, 6. 390. doi: accession:10.1038/msb.2010.47&quot; for more details.</p><p>pFBA gets the model optimum by standard FBA (using <a href="#COBREXA.flux_balance_analysis-Union{Tuple{M}, Tuple{M, Any}} where M&lt;:MetabolicModel"><code>flux_balance_analysis</code></a> with <code>optimizer</code> and <code>modifications</code>), then finds a minimal total flux through the model that still satisfies the (slightly relaxed) optimum. This is done using a quadratic problem optimizer. If the original optimizer does not support quadratic optimization, it can be changed using the callback in <code>qp_modifications</code>, which are applied after the FBA. See the documentation of flux<em>balance</em>analysis for usage examples of modifications.</p><p>Thhe optimum relaxation sequence can be specified in <code>relax</code> parameter, it defaults to multiplicative range of <code>[1.0, 0.999999, ..., 0.99]</code> of the original bound.</p><p>Returns an optimized model that contains the pFBA solution; or <code>nothing</code> if the optimization failed.</p><p><strong>Example</strong></p><pre><code class="language-none">model = load_model(&quot;e_coli_core.json&quot;)
 optmodel = parsimonious_flux_balance_analysis(model, biomass, Gurobi.Optimizer)
-value.(solution[:x])  # extract the flux from the optimizer</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/analysis/parsimonious_flux_balance_analysis.jl#L1-L54">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.parsimonious_flux_balance_analysis_dict-Tuple{MetabolicModel, Vararg{Any, N} where N}" href="#COBREXA.parsimonious_flux_balance_analysis_dict-Tuple{MetabolicModel, Vararg{Any, N} where N}"><code>COBREXA.parsimonious_flux_balance_analysis_dict</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">parsimonious_flux_balance_analysis_dict(model::MetabolicModel, args...; kwargs...)</code></pre><p>Perform parsimonious flux balance analysis on <code>model</code> using <code>optimizer</code>. Returns a dictionary mapping the reaction IDs to fluxes. Arguments are forwarded to <a href="#COBREXA.parsimonious_flux_balance_analysis-Tuple{MetabolicModel, Any}"><code>parsimonious_flux_balance_analysis</code></a> internally.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/analysis/parsimonious_flux_balance_analysis.jl#L112-L118">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.parsimonious_flux_balance_analysis_vec-Tuple" href="#COBREXA.parsimonious_flux_balance_analysis_vec-Tuple"><code>COBREXA.parsimonious_flux_balance_analysis_vec</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">parsimonious_flux_balance_analysis_vec(args...; kwargs...)</code></pre><p>Perform parsimonious flux balance analysis on <code>model</code> using <code>optimizer</code>. Returns a vector of fluxes in the same order as the reactions in <code>model</code>. Arguments are forwarded to <a href="#COBREXA.parsimonious_flux_balance_analysis-Tuple{MetabolicModel, Any}"><code>parsimonious_flux_balance_analysis</code></a> internally.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/analysis/parsimonious_flux_balance_analysis.jl#L96-L103">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.screen-Union{Tuple{MetabolicModel}, Tuple{N}, Tuple{T}, Tuple{V}} where {V&lt;:(AbstractVector{T} where T), T&lt;:Tuple, N}" href="#COBREXA.screen-Union{Tuple{MetabolicModel}, Tuple{N}, Tuple{T}, Tuple{V}} where {V&lt;:(AbstractVector{T} where T), T&lt;:Tuple, N}"><code>COBREXA.screen</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">function screen(
+value.(solution[:x])  # extract the flux from the optimizer</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/analysis/parsimonious_flux_balance_analysis.jl#L1-L54">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.parsimonious_flux_balance_analysis_dict-Tuple{MetabolicModel, Vararg{Any, N} where N}" href="#COBREXA.parsimonious_flux_balance_analysis_dict-Tuple{MetabolicModel, Vararg{Any, N} where N}"><code>COBREXA.parsimonious_flux_balance_analysis_dict</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">parsimonious_flux_balance_analysis_dict(model::MetabolicModel, args...; kwargs...)</code></pre><p>Perform parsimonious flux balance analysis on <code>model</code> using <code>optimizer</code>. Returns a dictionary mapping the reaction IDs to fluxes. Arguments are forwarded to <a href="#COBREXA.parsimonious_flux_balance_analysis-Tuple{MetabolicModel, Any}"><code>parsimonious_flux_balance_analysis</code></a> internally.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/analysis/parsimonious_flux_balance_analysis.jl#L112-L118">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.parsimonious_flux_balance_analysis_vec-Tuple" href="#COBREXA.parsimonious_flux_balance_analysis_vec-Tuple"><code>COBREXA.parsimonious_flux_balance_analysis_vec</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">parsimonious_flux_balance_analysis_vec(args...; kwargs...)</code></pre><p>Perform parsimonious flux balance analysis on <code>model</code> using <code>optimizer</code>. Returns a vector of fluxes in the same order as the reactions in <code>model</code>. Arguments are forwarded to <a href="#COBREXA.parsimonious_flux_balance_analysis-Tuple{MetabolicModel, Any}"><code>parsimonious_flux_balance_analysis</code></a> internally.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/analysis/parsimonious_flux_balance_analysis.jl#L96-L103">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.screen-Union{Tuple{MetabolicModel}, Tuple{N}, Tuple{T}, Tuple{V}} where {V&lt;:(AbstractVector{T} where T), T&lt;:Tuple, N}" href="#COBREXA.screen-Union{Tuple{MetabolicModel}, Tuple{N}, Tuple{T}, Tuple{V}} where {V&lt;:(AbstractVector{T} where T), T&lt;:Tuple, N}"><code>COBREXA.screen</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">function screen(
     model::MetabolicModel;
     variants::Maybe{Array{V,N}} = nothing,
     analysis,
@@ -409,21 +409,13 @@ screen_variants(m,
         [reverse_reaction(5)],
         [reverse_reaction(3), reverse_reaction(6)]
     ],
-    mod -&gt; flux_balance_analysis_vec(mod, GLPK.Optimizer))  # run analysis</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/analysis/screening.jl#L2-L70">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.screen_optimize_objective-Tuple{Any, Any}" href="#COBREXA.screen_optimize_objective-Tuple{Any, Any}"><code>COBREXA.screen_optimize_objective</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">screen_optimize_objective(_, optmodel)::Union{Float64,Nothing}</code></pre><p>A variant of <a href="#COBREXA.optimize_objective-Tuple{Any}"><code>optimize_objective</code></a> directly usable in <a href="#COBREXA.screen_optmodel_modifications-Union{Tuple{N}, Tuple{V}, Tuple{MetabolicModel, Any}} where {V&lt;:(AbstractVector{T} where T), N}"><code>screen_optmodel_modifications</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/analysis/screening.jl#L147-L152">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.screen_optmodel_modifications-Union{Tuple{N}, Tuple{V}, Tuple{MetabolicModel, Any}} where {V&lt;:(AbstractVector{T} where T), N}" href="#COBREXA.screen_optmodel_modifications-Union{Tuple{N}, Tuple{V}, Tuple{MetabolicModel, Any}} where {V&lt;:(AbstractVector{T} where T), N}"><code>COBREXA.screen_optmodel_modifications</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">screen_optmodel_modifications(
+    mod -&gt; flux_balance_analysis_vec(mod, GLPK.Optimizer))  # run analysis</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/analysis/screening.jl#L2-L70">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.screen_optimize_objective-Tuple{Any, Any}" href="#COBREXA.screen_optimize_objective-Tuple{Any, Any}"><code>COBREXA.screen_optimize_objective</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">screen_optimize_objective(_, optmodel)::Union{Float64,Nothing}</code></pre><p>A variant of <a href="#COBREXA.optimize_objective-Tuple{Any}"><code>optimize_objective</code></a> directly usable in <a href="#COBREXA.screen_optmodel_modifications-Union{Tuple{N}, Tuple{V}, Tuple{MetabolicModel, Any}} where {V&lt;:(AbstractVector{T} where T), N}"><code>screen_optmodel_modifications</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/analysis/screening.jl#L147-L152">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.screen_optmodel_modifications-Union{Tuple{N}, Tuple{V}, Tuple{MetabolicModel, Any}} where {V&lt;:(AbstractVector{T} where T), N}" href="#COBREXA.screen_optmodel_modifications-Union{Tuple{N}, Tuple{V}, Tuple{MetabolicModel, Any}} where {V&lt;:(AbstractVector{T} where T), N}"><code>COBREXA.screen_optmodel_modifications</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">screen_optmodel_modifications(
     model::MetabolicModel,
     optimizer;
     modifications::Array{V,N},
     analysis = screen_optimize_objective,
     workers = [myid()],
-) where {V&lt;:AbstractVector,N}</code></pre><p>Screen multiple modifications of the same optimization model.</p><p>This function is potentially more efficient than <a href="#COBREXA.screen-Union{Tuple{MetabolicModel}, Tuple{N}, Tuple{T}, Tuple{V}} where {V&lt;:(AbstractVector{T} where T), T&lt;:Tuple, N}"><code>screen</code></a> because it avoids making variants of the model structure and remaking of the optimization model. On the other hand, modification functions need to keep the optimization model in a recoverable state (one that leaves the model usable for the next modification), which limits the possible spectrum of modifications applied.</p><p>Internally, <code>model</code> is distributed to <code>workers</code> and transformed into the optimization model using <a href="#COBREXA.make_optimization_model-Tuple{MetabolicModel, Any}"><code>make_optimization_model</code></a>. With that, vectors of functions in <code>modifications</code> are consecutively applied, and the result of <code>analysis</code> function called on model are collected to an array of the same extent as <code>modifications</code>.</p><p>Both the modification functions (in vectors) and the analysis function here have 2 parameters (as opposed to 1 with <a href="#COBREXA.screen-Union{Tuple{MetabolicModel}, Tuple{N}, Tuple{T}, Tuple{V}} where {V&lt;:(AbstractVector{T} where T), T&lt;:Tuple, N}"><code>screen</code></a>): first is the <code>model</code> (carried through as-is), second is the prepared JuMP optimization model that may be modified and acted upon. As an example, you can use modification <a href="#COBREXA.change_constraint-Tuple{String, Any, Any}"><code>change_constraint</code></a> and analysis <a href="#COBREXA.screen_optimize_objective-Tuple{Any, Any}"><code>screen_optimize_objective</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/analysis/screening.jl#L156-L184">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.screen_variant" href="#COBREXA.screen_variant"><code>COBREXA.screen_variant</code></a> — <span class="docstring-category">Function</span></header><section><div><pre><code class="language-julia">screen_variant(model::MetabolicModel, variant::Vector, analysis, args = ())</code></pre><p>Helper function for <a href="#COBREXA.screen-Union{Tuple{MetabolicModel}, Tuple{N}, Tuple{T}, Tuple{V}} where {V&lt;:(AbstractVector{T} where T), T&lt;:Tuple, N}"><code>screen</code></a> that applies all single-argument functions in <code>variant</code> to the <code>model</code> (in order from &quot;first&quot; to &quot;last&quot;), and executes <code>analysis</code> on the result.</p><p>Can be used to test model variants locally.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/analysis/screening.jl#L123-L131">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.screen_variants-Tuple{Any, Any, Any}" href="#COBREXA.screen_variants-Tuple{Any, Any, Any}"><code>COBREXA.screen_variants</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">screen_variants(model, variants, analysis; workers=[myid()])</code></pre><p>A shortcut for <a href="#COBREXA.screen-Union{Tuple{MetabolicModel}, Tuple{N}, Tuple{T}, Tuple{V}} where {V&lt;:(AbstractVector{T} where T), T&lt;:Tuple, N}"><code>screen</code></a> that only works with model variants.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/analysis/screening.jl#L139-L143">source</a></section></article><h3 id="Analysis-modifications"><a class="docs-heading-anchor" href="#Analysis-modifications">Analysis modifications</a><a id="Analysis-modifications-1"></a><a class="docs-heading-anchor-permalink" href="#Analysis-modifications" title="Permalink"></a></h3><article class="docstring"><header><a class="docstring-binding" id="COBREXA._do_knockout-Tuple{MetabolicModel, Any, Vector{String}}" href="#COBREXA._do_knockout-Tuple{MetabolicModel, Any, Vector{String}}"><code>COBREXA._do_knockout</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">_do_knockout(model::MetabolicModel, opt_model)</code></pre><p>Internal helper for knockouts on generic MetabolicModels. This can be overloaded so that the knockouts may work differently (more efficiently) with other models.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/analysis/modifications/knockout.jl#L17-L23">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.knockout-Tuple{String}" href="#COBREXA.knockout-Tuple{String}"><code>COBREXA.knockout</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">knockout(gene_id::String)</code></pre><p>A helper variant of <a href="#COBREXA.knockout-Tuple{String}"><code>knockout</code></a> for a single gene.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/analysis/modifications/knockout.jl#L10-L14">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.knockout-Tuple{Vector{String}}" href="#COBREXA.knockout-Tuple{Vector{String}}"><code>COBREXA.knockout</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">knockout(gene_ids::Vector{String})</code></pre><p>A modification that zeroes the bounds of all reactions that would be knocked out by the specified genes (effectively disables the reactions).</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/analysis/modifications/knockout.jl#L1-L6">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.change_constraint-Tuple{String, Any, Any}" href="#COBREXA.change_constraint-Tuple{String, Any, Any}"><code>COBREXA.change_constraint</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">change_constraint(id::String, lb, ub)</code></pre><p>Change the lower and upper bounds (<code>lb</code> and <code>ub</code> respectively) of reaction <code>id</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/analysis/modifications/optimizer.jl#L53-L57">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.change_objective-Tuple{Union{Int64, String}}" href="#COBREXA.change_objective-Tuple{Union{Int64, String}}"><code>COBREXA.change_objective</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">change_objective(rxn::Union{Int,String}; weight::Float64 = 1.0, sense = MOI.MAX_SENSE)</code></pre><p>Modification that changes the objective to maximize or minimize the specified reaction (either by index or string ID), optionally specifying the objective weight.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/analysis/modifications/optimizer.jl#L66-L72">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.change_objective-Tuple{Vector{Int64}}" href="#COBREXA.change_objective-Tuple{Vector{Int64}}"><code>COBREXA.change_objective</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">change_objective(
-    ridxs::Vector{Int};
-    weights::Vector{Float64} = ones(length(ridxs)),
-    sense = MOI.MAX_SENSE,
-)</code></pre><p>A potentially more efficient variant of <a href="#COBREXA.change_objective-Tuple{Union{Int64, String}}"><code>change_objective</code></a> that works on integer indexes of the reactions.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/analysis/modifications/optimizer.jl#L105-L114">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.change_objective-Tuple{Vector{String}}" href="#COBREXA.change_objective-Tuple{Vector{String}}"><code>COBREXA.change_objective</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">change_objective(
-    rids::Vector{String};
-    weights::Vector{Float64} = ones(length(rids)),
-    sense = MOI.MAX_SENSE,
-)</code></pre><p>Modification that changes the objective function used in a constraint based analysis function to maximize (or minimize, based on <code>sense</code>) the sum (optionally weighted by <code>weights</code>) of the rates of the reactions specified by string IDs.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/analysis/modifications/optimizer.jl#L76-L87">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.change_optimizer-Tuple{Any}" href="#COBREXA.change_optimizer-Tuple{Any}"><code>COBREXA.change_optimizer</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">change_optimizer(optimizer)</code></pre><p>Change the JuMP optimizer used to run the optimization.</p><p>This may be used to try different approaches for reaching the optimum, and in problems that may require different optimizers for different parts, such as the <a href="#COBREXA.parsimonious_flux_balance_analysis-Tuple{MetabolicModel, Any}"><code>parsimonious_flux_balance_analysis</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/analysis/modifications/optimizer.jl#L15-L23">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.change_optimizer_attribute-Tuple{Any, Any}" href="#COBREXA.change_optimizer_attribute-Tuple{Any, Any}"><code>COBREXA.change_optimizer_attribute</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">change_optimizer_attribute(attribute_key, value)</code></pre><p>Change a JuMP optimizer attribute. The attributes are optimizer-specific, refer to the JuMP documentation and the documentation of the specific optimizer for usable keys and values.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/analysis/modifications/optimizer.jl#L28-L34">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.change_sense-Tuple{Any}" href="#COBREXA.change_sense-Tuple{Any}"><code>COBREXA.change_sense</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">change_sense(objective_sense)</code></pre><p>Change the objective sense of optimization. Possible arguments are <code>MOI.MAX_SENSE</code> and <code>MOI.MIN_SENSE</code>.</p><p>If you want to change the objective and sense at the same time, use <a href="#COBREXA.change_objective-Tuple{Union{Int64, String}}"><code>change_objective</code></a> instead to do both at once.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/analysis/modifications/optimizer.jl#L2-L10">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.constrain_objective_value-Tuple{Any}" href="#COBREXA.constrain_objective_value-Tuple{Any}"><code>COBREXA.constrain_objective_value</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">constrain_objective_value(tolerance)</code></pre><p>Limit the objective value to <code>tolerance</code>-times the current objective value, as with <a href="#COBREXA.objective_bounds-Tuple{Any}"><code>objective_bounds</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/analysis/modifications/optimizer.jl#L39-L44">source</a></section></article><h3 id="Flux-sampling"><a class="docs-heading-anchor" href="#Flux-sampling">Flux sampling</a><a id="Flux-sampling-1"></a><a class="docs-heading-anchor-permalink" href="#Flux-sampling" title="Permalink"></a></h3><article class="docstring"><header><a class="docstring-binding" id="COBREXA._affine_hit_and_run_chain-NTuple{5, Any}" href="#COBREXA._affine_hit_and_run_chain-NTuple{5, Any}"><code>COBREXA._affine_hit_and_run_chain</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">_affine_hit_and_run_chain(warmup, lbs, ubs, iters, chain)</code></pre><p>Internal helper function for computing a single affine hit-and-run chain. The number of the chain is passed for possible future initialization of stable RNGs.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/analysis/sampling/affine_hit_and_run.jl#L73-L79">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.affine_hit_and_run-Tuple{Matrix{Float64}, Vector{Float64}, Vector{Float64}}" href="#COBREXA.affine_hit_and_run-Tuple{Matrix{Float64}, Vector{Float64}, Vector{Float64}}"><code>COBREXA.affine_hit_and_run</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">function affine_hit_and_run(
+) where {V&lt;:AbstractVector,N}</code></pre><p>Screen multiple modifications of the same optimization model.</p><p>This function is potentially more efficient than <a href="#COBREXA.screen-Union{Tuple{MetabolicModel}, Tuple{N}, Tuple{T}, Tuple{V}} where {V&lt;:(AbstractVector{T} where T), T&lt;:Tuple, N}"><code>screen</code></a> because it avoids making variants of the model structure and remaking of the optimization model. On the other hand, modification functions need to keep the optimization model in a recoverable state (one that leaves the model usable for the next modification), which limits the possible spectrum of modifications applied.</p><p>Internally, <code>model</code> is distributed to <code>workers</code> and transformed into the optimization model using <a href="#COBREXA.make_optimization_model-Tuple{MetabolicModel, Any}"><code>make_optimization_model</code></a>. With that, vectors of functions in <code>modifications</code> are consecutively applied, and the result of <code>analysis</code> function called on model are collected to an array of the same extent as <code>modifications</code>.</p><p>Both the modification functions (in vectors) and the analysis function here have 2 parameters (as opposed to 1 with <a href="#COBREXA.screen-Union{Tuple{MetabolicModel}, Tuple{N}, Tuple{T}, Tuple{V}} where {V&lt;:(AbstractVector{T} where T), T&lt;:Tuple, N}"><code>screen</code></a>): first is the <code>model</code> (carried through as-is), second is the prepared JuMP optimization model that may be modified and acted upon. As an example, you can use modification <a href="#COBREXA.change_constraint-Tuple{String, Any, Any}"><code>change_constraint</code></a> and analysis <a href="#COBREXA.screen_optimize_objective-Tuple{Any, Any}"><code>screen_optimize_objective</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/analysis/screening.jl#L156-L184">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.screen_variant" href="#COBREXA.screen_variant"><code>COBREXA.screen_variant</code></a> — <span class="docstring-category">Function</span></header><section><div><pre><code class="language-julia">screen_variant(model::MetabolicModel, variant::Vector, analysis, args = ())</code></pre><p>Helper function for <a href="#COBREXA.screen-Union{Tuple{MetabolicModel}, Tuple{N}, Tuple{T}, Tuple{V}} where {V&lt;:(AbstractVector{T} where T), T&lt;:Tuple, N}"><code>screen</code></a> that applies all single-argument functions in <code>variant</code> to the <code>model</code> (in order from &quot;first&quot; to &quot;last&quot;), and executes <code>analysis</code> on the result.</p><p>Can be used to test model variants locally.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/analysis/screening.jl#L123-L131">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.screen_variants-Tuple{Any, Any, Any}" href="#COBREXA.screen_variants-Tuple{Any, Any, Any}"><code>COBREXA.screen_variants</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">screen_variants(model, variants, analysis; workers=[myid()])</code></pre><p>A shortcut for <a href="#COBREXA.screen-Union{Tuple{MetabolicModel}, Tuple{N}, Tuple{T}, Tuple{V}} where {V&lt;:(AbstractVector{T} where T), T&lt;:Tuple, N}"><code>screen</code></a> that only works with model variants.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/analysis/screening.jl#L139-L143">source</a></section></article><h3 id="Analysis-modifications"><a class="docs-heading-anchor" href="#Analysis-modifications">Analysis modifications</a><a id="Analysis-modifications-1"></a><a class="docs-heading-anchor-permalink" href="#Analysis-modifications" title="Permalink"></a></h3><article class="docstring"><header><a class="docstring-binding" id="COBREXA.change_constraint-Tuple{String, Any, Any}" href="#COBREXA.change_constraint-Tuple{String, Any, Any}"><code>COBREXA.change_constraint</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">change_constraint(id::String, lb, ub)</code></pre><p>Change the lower and upper bounds (<code>lb</code> and <code>ub</code> respectively) of reaction <code>id</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/analysis/modifications/generic.jl#L15-L19">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.change_objective-Tuple{Union{String, Vector{String}}}" href="#COBREXA.change_objective-Tuple{Union{String, Vector{String}}}"><code>COBREXA.change_objective</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">change_objective(new_objective::Union{String,Vector{String}}; weights=[], sense=MOI.MAX_SENSE)</code></pre><p>Modification that changes the objective function used in a constraint based analysis function.  <code>new_objective</code> can be a single reaction identifier, or an array of reactions identifiers.</p><p>Optionally, the objective can be weighted by a vector of <code>weights</code>, and a optimization <code>sense</code> can be set.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/analysis/modifications/generic.jl#L27-L36">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.constrain_objective_value-Tuple{Any}" href="#COBREXA.constrain_objective_value-Tuple{Any}"><code>COBREXA.constrain_objective_value</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">constrain_objective_value(tolerance)</code></pre><p>Limit the objective value to <code>tolerance</code>-times the current objective value, as with <a href="#COBREXA.objective_bounds-Tuple{Any}"><code>objective_bounds</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/analysis/modifications/generic.jl#L2-L7">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA._do_knockout-Tuple{MetabolicModel, Any, Vector{String}}" href="#COBREXA._do_knockout-Tuple{MetabolicModel, Any, Vector{String}}"><code>COBREXA._do_knockout</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">_do_knockout(model::MetabolicModel, opt_model)</code></pre><p>Internal helper for knockouts on generic MetabolicModels. This can be overloaded so that the knockouts may work differently (more efficiently) with other models.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/analysis/modifications/knockout.jl#L17-L23">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.knockout-Tuple{String}" href="#COBREXA.knockout-Tuple{String}"><code>COBREXA.knockout</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">knockout(gene_id::String)</code></pre><p>A helper variant of <a href="#COBREXA.knockout-Tuple{String}"><code>knockout</code></a> for a single gene.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/analysis/modifications/knockout.jl#L10-L14">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.knockout-Tuple{Vector{String}}" href="#COBREXA.knockout-Tuple{Vector{String}}"><code>COBREXA.knockout</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">knockout(gene_ids::Vector{String})</code></pre><p>A modification that zeroes the bounds of all reactions that would be knocked out by the specified genes (effectively disables the reactions).</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/analysis/modifications/knockout.jl#L1-L6">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.change_optimizer-Tuple{Any}" href="#COBREXA.change_optimizer-Tuple{Any}"><code>COBREXA.change_optimizer</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">change_optimizer(optimizer)</code></pre><p>Change the JuMP optimizer used to run the optimization.</p><p>This may be used to try different approaches for reaching the optimum, and in problems that may require different optimizers for different parts, such as the <a href="#COBREXA.parsimonious_flux_balance_analysis-Tuple{MetabolicModel, Any}"><code>parsimonious_flux_balance_analysis</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/analysis/modifications/optimizer.jl#L14-L22">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.change_optimizer_attribute-Tuple{Any, Any}" href="#COBREXA.change_optimizer_attribute-Tuple{Any, Any}"><code>COBREXA.change_optimizer_attribute</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">change_optimizer_attribute(attribute_key, value)</code></pre><p>Change a JuMP optimizer attribute. The attributes are optimizer-specific, refer to the JuMP documentation and the documentation of the specific optimizer for usable keys and values.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/analysis/modifications/optimizer.jl#L25-L31">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.change_sense-Tuple{Any}" href="#COBREXA.change_sense-Tuple{Any}"><code>COBREXA.change_sense</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">change_sense(objective_sense)</code></pre><p>Change the objective sense of optimization. Possible arguments are <code>MOI.MAX_SENSE</code> and <code>MOI.MIN_SENSE</code>.</p><p>If you want to change the objective and sense at the same time, use <a href="#COBREXA.change_objective-Tuple{Union{String, Vector{String}}}"><code>change_objective</code></a> instead to do both at once.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/analysis/modifications/optimizer.jl#L2-L10">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.silence" href="#COBREXA.silence"><code>COBREXA.silence</code></a> — <span class="docstring-category">Function</span></header><section><div><pre><code class="language-julia">silence</code></pre><p>Modification that disable all output from the JuMP optimizer (shortcut for <code>set_silent</code> from JuMP).</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/analysis/modifications/optimizer.jl#L35-L40">source</a></section></article><h3 id="Flux-sampling"><a class="docs-heading-anchor" href="#Flux-sampling">Flux sampling</a><a id="Flux-sampling-1"></a><a class="docs-heading-anchor-permalink" href="#Flux-sampling" title="Permalink"></a></h3><article class="docstring"><header><a class="docstring-binding" id="COBREXA._affine_hit_and_run_chain-NTuple{5, Any}" href="#COBREXA._affine_hit_and_run_chain-NTuple{5, Any}"><code>COBREXA._affine_hit_and_run_chain</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">_affine_hit_and_run_chain(warmup, lbs, ubs, iters, chain)</code></pre><p>Internal helper function for computing a single affine hit-and-run chain. The number of the chain is passed for possible future initialization of stable RNGs.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/analysis/sampling/affine_hit_and_run.jl#L73-L79">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.affine_hit_and_run-Tuple{Matrix{Float64}, Vector{Float64}, Vector{Float64}}" href="#COBREXA.affine_hit_and_run-Tuple{Matrix{Float64}, Vector{Float64}, Vector{Float64}}"><code>COBREXA.affine_hit_and_run</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">function affine_hit_and_run(
     warmup_points::Matrix{Float64},
     lbs::Vector{Float64},
     ubs::Vector{Float64};
@@ -436,41 +428,41 @@ using Tulip
 model = load_model(StandardModel, model_path)
 
 warmup, lbs, ubs = warmup_from_variability(model, Tulip.Optimizer, 100)
-samples = affine_hit_and_run(warmup, lbs, ubs, sample_iters = 1:3)</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/analysis/sampling/affine_hit_and_run.jl#L1-L41">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.warmup_from_variability" href="#COBREXA.warmup_from_variability"><code>COBREXA.warmup_from_variability</code></a> — <span class="docstring-category">Function</span></header><section><div><pre><code class="language-julia">function warmup_from_variability(
+samples = affine_hit_and_run(warmup, lbs, ubs, sample_iters = 1:3)</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/analysis/sampling/affine_hit_and_run.jl#L1-L41">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.warmup_from_variability" href="#COBREXA.warmup_from_variability"><code>COBREXA.warmup_from_variability</code></a> — <span class="docstring-category">Function</span></header><section><div><pre><code class="language-julia">function warmup_from_variability(
     model::MetabolicModel,
     optimizer,
     min_reactions::Vector{Int}=1:n_reactions(model),
     max_reactions::Vector{Int}=1:n_reactions(model);
     modifications = [],
     workers::Vector{Int} = [myid()],
-)::Tuple{Matrix{Float64}, Vector{Float64}, Vector{Float64}}</code></pre><p>Generate FVA-like warmup points for samplers, by minimizing and maximizing the specified reactions. The result is returned as a matrix, each point occupies as single column in the result.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/analysis/sampling/warmup_variability.jl#L33-L46">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.warmup_from_variability-Tuple{MetabolicModel, Any, Int64}" href="#COBREXA.warmup_from_variability-Tuple{MetabolicModel, Any, Int64}"><code>COBREXA.warmup_from_variability</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">warmup_from_variability(
+)::Tuple{Matrix{Float64}, Vector{Float64}, Vector{Float64}}</code></pre><p>Generate FVA-like warmup points for samplers, by minimizing and maximizing the specified reactions. The result is returned as a matrix, each point occupies as single column in the result.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/analysis/sampling/warmup_variability.jl#L33-L46">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.warmup_from_variability-Tuple{MetabolicModel, Any, Int64}" href="#COBREXA.warmup_from_variability-Tuple{MetabolicModel, Any, Int64}"><code>COBREXA.warmup_from_variability</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">warmup_from_variability(
     model::MetabolicModel,
     optimizer,
     n_points::Int;
     kwargs...
-)</code></pre><p>Generates FVA-like warmup points for samplers, by selecting random points by minimizing and maximizing reactions. Can not return more than 2 times the number of reactions in the model.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/analysis/sampling/warmup_variability.jl#L1-L12">source</a></section></article><h2 id="Miscellaneous-utilities"><a class="docs-heading-anchor" href="#Miscellaneous-utilities">Miscellaneous utilities</a><a id="Miscellaneous-utilities-1"></a><a class="docs-heading-anchor-permalink" href="#Miscellaneous-utilities" title="Permalink"></a></h2><article class="docstring"><header><a class="docstring-binding" id="COBREXA.ambiguously_identified_items-Tuple{Dict{String, Dict{String, Set{String}}}}" href="#COBREXA.ambiguously_identified_items-Tuple{Dict{String, Dict{String, Set{String}}}}"><code>COBREXA.ambiguously_identified_items</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">ambiguously_identified_items(
+)</code></pre><p>Generates FVA-like warmup points for samplers, by selecting random points by minimizing and maximizing reactions. Can not return more than 2 times the number of reactions in the model.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/analysis/sampling/warmup_variability.jl#L1-L12">source</a></section></article><h2 id="Miscellaneous-utilities"><a class="docs-heading-anchor" href="#Miscellaneous-utilities">Miscellaneous utilities</a><a id="Miscellaneous-utilities-1"></a><a class="docs-heading-anchor-permalink" href="#Miscellaneous-utilities" title="Permalink"></a></h2><article class="docstring"><header><a class="docstring-binding" id="COBREXA.ambiguously_identified_items-Tuple{Dict{String, Dict{String, Set{String}}}}" href="#COBREXA.ambiguously_identified_items-Tuple{Dict{String, Dict{String, Set{String}}}}"><code>COBREXA.ambiguously_identified_items</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">ambiguously_identified_items(
     index::Dict{String,Dict{String,[String]}},
-)::Vector{String}</code></pre><p>Find items (genes, metabolites, ...) from the annotation index that are identified non-uniquely by at least one of their annotations.</p><p>This often indicates that the items are duplicate or miscategorized.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/utils/Annotation.jl#L44-L53">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.annotation_index-Tuple{AbstractDict{String, V} where V}" href="#COBREXA.annotation_index-Tuple{AbstractDict{String, V} where V}"><code>COBREXA.annotation_index</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">annotation_index(
+)::Vector{String}</code></pre><p>Find items (genes, metabolites, ...) from the annotation index that are identified non-uniquely by at least one of their annotations.</p><p>This often indicates that the items are duplicate or miscategorized.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/utils/Annotation.jl#L44-L53">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.annotation_index-Tuple{AbstractDict{String, V} where V}" href="#COBREXA.annotation_index-Tuple{AbstractDict{String, V} where V}"><code>COBREXA.annotation_index</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">annotation_index(
     xs::AbstractDict{String};
     annotations = _annotations,
-)::Dict{String,Dict{String,[String]}}</code></pre><p>Extract annotations from a dictionary of items <code>xs</code> and build an index that maps annotation &quot;kinds&quot; (e.g. <code>&quot;PubChem&quot;</code>) to the mapping from the annotations (e.g.  <code>&quot;COMPOUND_12345&quot;</code>) to item IDs that carry the annotations.</p><p>Function <code>annotations</code> is used to access the <code>Annotations</code> object in the dictionary values.</p><p>This is extremely useful for finding items by annotation data.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/utils/Annotation.jl#L6-L20">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.get_atoms-Tuple{Metabolite}" href="#COBREXA.get_atoms-Tuple{Metabolite}"><code>COBREXA.get_atoms</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">get_atoms(met::Metabolite)::MetaboliteFormula</code></pre><p>Simple wrapper for getting the atom dictionary count out of a <code>Metabolite</code>.</p><p>See also: <a href="#COBREXA.metabolite_formula-Tuple{MetabolicModel, String}"><code>metabolite_formula</code></a></p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/utils/Metabolite.jl#L1-L7">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.check_duplicate_reaction-Tuple{Reaction, OrderedCollections.OrderedDict{String, Reaction}}" href="#COBREXA.check_duplicate_reaction-Tuple{Reaction, OrderedCollections.OrderedDict{String, Reaction}}"><code>COBREXA.check_duplicate_reaction</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">check_duplicate_reaction(rxn::Reaction, rxns::Dict{String, Reaction}; only_metabolites=true)</code></pre><p>Check if <code>rxn</code> already exists in <code>rxns</code> but has another <code>id</code>. If <code>only_metabolites</code> is <code>true</code> then only the metabolite <code>id</code>s are checked. Otherwise, compares metabolite <code>id</code>s and the absolute value of their stoichiometric coefficients to those of <code>rxn</code>. If <code>rxn</code> has the same reaction equation as another reaction in <code>rxns</code>, the return the <code>id</code>. Otherwise return <code>nothing</code>.</p><p>See also: <a href="#COBREXA.is_mass_balanced-Tuple{StandardModel, Reaction}"><code>is_mass_balanced</code></a></p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/utils/Reaction.jl#L1-L11">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.is_boundary-Tuple{Reaction}" href="#COBREXA.is_boundary-Tuple{Reaction}"><code>COBREXA.is_boundary</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">is_boundary(rxn::Reaction)</code></pre><p>Return true if reaction is a boundary reaction, otherwise return false. Checks if boundary by inspecting number of metabolites in reaction equation. Boundary reactions have only one metabolite, e.g. an exchange reaction, or a sink/demand reaction.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/utils/Reaction.jl#L41-L47">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.is_mass_balanced-Tuple{StandardModel, Reaction}" href="#COBREXA.is_mass_balanced-Tuple{StandardModel, Reaction}"><code>COBREXA.is_mass_balanced</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">is_mass_balanced(model::StandardModel, rxn::Reaction)</code></pre><p>Checks if <code>rxn</code> is atom balanced. Returns a boolean for whether the reaction is balanced, and the associated balance of atoms for convenience (useful if not balanced).</p><p>See also: <a href="#COBREXA.get_atoms-Tuple{Metabolite}"><code>get_atoms</code></a>, <a href="#COBREXA.check_duplicate_reaction-Tuple{Reaction, OrderedCollections.OrderedDict{String, Reaction}}"><code>check_duplicate_reaction</code></a></p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/utils/Reaction.jl#L52-L59">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.stoichiometry_string-Tuple{Any}" href="#COBREXA.stoichiometry_string-Tuple{Any}"><code>COBREXA.stoichiometry_string</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">stoichiometry_string(rxn_dict)</code></pre><p>Return the reaction equation as a string.</p><p><strong>Example</strong></p><pre><code class="language-none">julia&gt; req = Dict(&quot;coa_c&quot; =&gt; -1, &quot;for_c&quot; =&gt; 1, &quot;accoa_c&quot; =&gt; 1, &quot;pyr_c&quot; =&gt; -1);
+)::Dict{String,Dict{String,[String]}}</code></pre><p>Extract annotations from a dictionary of items <code>xs</code> and build an index that maps annotation &quot;kinds&quot; (e.g. <code>&quot;PubChem&quot;</code>) to the mapping from the annotations (e.g.  <code>&quot;COMPOUND_12345&quot;</code>) to item IDs that carry the annotations.</p><p>Function <code>annotations</code> is used to access the <code>Annotations</code> object in the dictionary values.</p><p>This is extremely useful for finding items by annotation data.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/utils/Annotation.jl#L6-L20">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.get_atoms-Tuple{Metabolite}" href="#COBREXA.get_atoms-Tuple{Metabolite}"><code>COBREXA.get_atoms</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">get_atoms(met::Metabolite)::MetaboliteFormula</code></pre><p>Simple wrapper for getting the atom dictionary count out of a <code>Metabolite</code>.</p><p>See also: <a href="#COBREXA.metabolite_formula-Tuple{MetabolicModel, String}"><code>metabolite_formula</code></a></p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/utils/Metabolite.jl#L1-L7">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.check_duplicate_reaction-Tuple{Reaction, OrderedCollections.OrderedDict{String, Reaction}}" href="#COBREXA.check_duplicate_reaction-Tuple{Reaction, OrderedCollections.OrderedDict{String, Reaction}}"><code>COBREXA.check_duplicate_reaction</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">check_duplicate_reaction(rxn::Reaction, rxns::Dict{String, Reaction}; only_metabolites=true)</code></pre><p>Check if <code>rxn</code> already exists in <code>rxns</code> but has another <code>id</code>. If <code>only_metabolites</code> is <code>true</code> then only the metabolite <code>id</code>s are checked. Otherwise, compares metabolite <code>id</code>s and the absolute value of their stoichiometric coefficients to those of <code>rxn</code>. If <code>rxn</code> has the same reaction equation as another reaction in <code>rxns</code>, the return the <code>id</code>. Otherwise return <code>nothing</code>.</p><p>See also: <a href="#COBREXA.is_mass_balanced-Tuple{StandardModel, Reaction}"><code>is_mass_balanced</code></a></p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/utils/Reaction.jl#L1-L11">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.is_boundary-Tuple{Reaction}" href="#COBREXA.is_boundary-Tuple{Reaction}"><code>COBREXA.is_boundary</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">is_boundary(rxn::Reaction)</code></pre><p>Return true if reaction is a boundary reaction, otherwise return false. Checks if boundary by inspecting number of metabolites in reaction equation. Boundary reactions have only one metabolite, e.g. an exchange reaction, or a sink/demand reaction.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/utils/Reaction.jl#L41-L47">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.is_mass_balanced-Tuple{StandardModel, Reaction}" href="#COBREXA.is_mass_balanced-Tuple{StandardModel, Reaction}"><code>COBREXA.is_mass_balanced</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">is_mass_balanced(model::StandardModel, rxn::Reaction)</code></pre><p>Checks if <code>rxn</code> is atom balanced. Returns a boolean for whether the reaction is balanced, and the associated balance of atoms for convenience (useful if not balanced).</p><p>See also: <a href="#COBREXA.get_atoms-Tuple{Metabolite}"><code>get_atoms</code></a>, <a href="#COBREXA.check_duplicate_reaction-Tuple{Reaction, OrderedCollections.OrderedDict{String, Reaction}}"><code>check_duplicate_reaction</code></a></p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/utils/Reaction.jl#L52-L59">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.stoichiometry_string-Tuple{Any}" href="#COBREXA.stoichiometry_string-Tuple{Any}"><code>COBREXA.stoichiometry_string</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">stoichiometry_string(rxn_dict)</code></pre><p>Return the reaction equation as a string.</p><p><strong>Example</strong></p><pre><code class="language-none">julia&gt; req = Dict(&quot;coa_c&quot; =&gt; -1, &quot;for_c&quot; =&gt; 1, &quot;accoa_c&quot; =&gt; 1, &quot;pyr_c&quot; =&gt; -1);
 julia&gt; stoichiometry_string(req)
-&quot;coa_c + pyr_c = for_c + accoa_c&quot;</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/utils/Reaction.jl#L74-L85">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.serialize_model-Tuple{Serialized, String}" href="#COBREXA.serialize_model-Tuple{Serialized, String}"><code>COBREXA.serialize_model</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">serialize_model(model::Serialized, filename::String)::Serialized</code></pre><p>Specialization of <a href="#COBREXA.serialize_model-Tuple{Serialized, String}"><code>serialize_model</code></a> that prevents nested serialization of already-serialized models.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/utils/Serialized.jl#L17-L22">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.serialize_model-Union{Tuple{MM}, Tuple{MM, String}} where MM&lt;:MetabolicModel" href="#COBREXA.serialize_model-Union{Tuple{MM}, Tuple{MM, String}} where MM&lt;:MetabolicModel"><code>COBREXA.serialize_model</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">serialize_model(model::MM, filename::String)::Serialized{MM} where {MM&lt;:MetabolicModel}</code></pre><p>Serialize the <code>model</code> to file <code>filename</code>, returning a <a href="#COBREXA.Serialized"><code>Serialized</code></a> model that is able to load itself back automatically upon precaching by <a href="#COBREXA.precache!-Tuple{MetabolicModel}"><code>precache!</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/utils/Serialized.jl#L2-L8">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="Base.copy-Tuple{Gene}" href="#Base.copy-Tuple{Gene}"><code>Base.copy</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">Base.copy(g::Gene)</code></pre><p>Shallow copy of a <a href="#COBREXA.Gene"><code>Gene</code></a></p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/utils/StandardModel.jl#L45-L49">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="Base.copy-Tuple{Metabolite}" href="#Base.copy-Tuple{Metabolite}"><code>Base.copy</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">Base.copy(m::Metabolite)</code></pre><p>Shallow copy of a <a href="#COBREXA.Metabolite"><code>Metabolite</code></a></p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/utils/StandardModel.jl#L31-L35">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="Base.copy-Tuple{Reaction}" href="#Base.copy-Tuple{Reaction}"><code>Base.copy</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">Base.copy(r::Reaction)</code></pre><p>Shallow copy of a <a href="#COBREXA.Reaction"><code>Reaction</code></a></p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/utils/StandardModel.jl#L14-L18">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="Base.copy-Tuple{StandardModel}" href="#Base.copy-Tuple{StandardModel}"><code>Base.copy</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">Base.copy(m::StandardModel)</code></pre><p>Shallow copy of a <a href="#COBREXA.StandardModel"><code>StandardModel</code></a></p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/utils/StandardModel.jl#L2-L6">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.atom_exchange-Tuple{StandardModel, String}" href="#COBREXA.atom_exchange-Tuple{StandardModel, String}"><code>COBREXA.atom_exchange</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">atom_exchange(model::StandardModel, rxn_id::String)</code></pre><p>Specialized version of <a href="#COBREXA.atom_exchange-Tuple{StandardModel, String}"><code>atom_exchange</code></a> for <a href="#COBREXA.StandardModel"><code>StandardModel</code></a> that quickly returns a dictionary mapping the flux-relative stoichiometry of atoms through a single reaction in <code>model</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/utils/StandardModel.jl#L52-L58">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.atom_exchange-Tuple{MetabolicModel, Dict{String, Float64}}" href="#COBREXA.atom_exchange-Tuple{MetabolicModel, Dict{String, Float64}}"><code>COBREXA.atom_exchange</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">atom_exchange(model::MetabolicModel, flux_dict::Dict{String, Float64})</code></pre><p>Return a dictionary mapping the flux of atoms across the boundary of the model given <code>flux_dict</code> (the solution of a constraint based analysis) of reactions in <code>model</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/utils/atom_exchange.jl#L1-L6">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.gamma_bounds-Tuple{Any}" href="#COBREXA.gamma_bounds-Tuple{Any}"><code>COBREXA.gamma_bounds</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">gamma_bounds(gamma)</code></pre><p>A bounds-generating function for <a href="#COBREXA.flux_variability_analysis-Tuple{MetabolicModel, Any}"><code>flux_variability_analysis</code></a> that limits the objective value to be at least <code>gamma*Z₀</code>, as usual in COBRA packages. Use as the <code>bounds</code> argument:</p><pre><code class="language-none">flux_variability_analysis(model, some_optimizer; bounds = gamma_bounds(0.9))</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/utils/bounds.jl#L1-L10">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.objective_bounds-Tuple{Any}" href="#COBREXA.objective_bounds-Tuple{Any}"><code>COBREXA.objective_bounds</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">objective_bounds(tolerance)</code></pre><p>A bounds-generating function for <a href="#COBREXA.flux_variability_analysis-Tuple{MetabolicModel, Any}"><code>flux_variability_analysis</code></a> that limits the objective value to a small multiple of Z₀. Use as <code>bounds</code> argument, similarly to <a href="#COBREXA.gamma_bounds-Tuple{Any}"><code>gamma_bounds</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/utils/bounds.jl#L13-L19">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA._parse_formula-Tuple{String}" href="#COBREXA._parse_formula-Tuple{String}"><code>COBREXA._parse_formula</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">_parse_formula(f::String)::MetaboliteFormula</code></pre><p>Parse a formula in format <code>C2H6O</code> into a <a href="#COBREXA.MetaboliteFormula"><code>MetaboliteFormula</code></a>, which is basically a dictionary of atom counts in the molecule.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/utils/chemical_formulas.jl#L2-L7">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA._unparse_formula-Tuple{Dict{String, Int64}}" href="#COBREXA._unparse_formula-Tuple{Dict{String, Int64}}"><code>COBREXA._unparse_formula</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">_unparse_formula(f::MetaboliteFormula)::String</code></pre><p>Format <a href="#COBREXA.MetaboliteFormula"><code>MetaboliteFormula</code></a> to <code>String</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/utils/chemical_formulas.jl#L19-L23">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.metabolite_fluxes-Tuple{MetabolicModel, Dict{String, Float64}}" href="#COBREXA.metabolite_fluxes-Tuple{MetabolicModel, Dict{String, Float64}}"><code>COBREXA.metabolite_fluxes</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">metabolite_fluxes(model::MetabolicModel, flux_dict::Dict{String, Float64})</code></pre><p>Return two dictionaries of metabolite <code>id</code>s mapped to reactions that consume or produce them, given the flux distribution supplied in <code>flux_dict</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/utils/fluxes.jl#L1-L6">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA._parse_grr-Tuple{SBML.GeneProductAssociation}" href="#COBREXA._parse_grr-Tuple{SBML.GeneProductAssociation}"><code>COBREXA._parse_grr</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">_parse_grr(gpa::SBML.GeneProductAssociation)::GeneAssociation</code></pre><p>Parse <code>SBML.GeneProductAssociation</code> structure to the simpler GeneAssociation. The input must be (implicitly) in a positive DNF.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/utils/gene_associations.jl#L2-L7">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA._parse_grr-Tuple{String}" href="#COBREXA._parse_grr-Tuple{String}"><code>COBREXA._parse_grr</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">_parse_grr(s::String)::GeneAssociation</code></pre><p>Parse a DNF gene association rule in format <code>(YIL010W and YLR043C) or (YIL010W and YGR209C)</code> to <code>GeneAssociation. Also accepts</code>OR<code>,</code>|<code>,</code>||<code>,</code>AND<code>,</code>&amp;<code>, and</code>&amp;&amp;`.</p><p><strong>Example</strong></p><pre><code class="language-none">julia&gt; _parse_grr(&quot;(YIL010W and YLR043C) or (YIL010W and YGR209C)&quot;)
+&quot;coa_c + pyr_c = for_c + accoa_c&quot;</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/utils/Reaction.jl#L74-L85">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.serialize_model-Tuple{Serialized, String}" href="#COBREXA.serialize_model-Tuple{Serialized, String}"><code>COBREXA.serialize_model</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">serialize_model(model::Serialized, filename::String)::Serialized</code></pre><p>Specialization of <a href="#COBREXA.serialize_model-Tuple{Serialized, String}"><code>serialize_model</code></a> that prevents nested serialization of already-serialized models.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/utils/Serialized.jl#L17-L22">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.serialize_model-Union{Tuple{MM}, Tuple{MM, String}} where MM&lt;:MetabolicModel" href="#COBREXA.serialize_model-Union{Tuple{MM}, Tuple{MM, String}} where MM&lt;:MetabolicModel"><code>COBREXA.serialize_model</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">serialize_model(model::MM, filename::String)::Serialized{MM} where {MM&lt;:MetabolicModel}</code></pre><p>Serialize the <code>model</code> to file <code>filename</code>, returning a <a href="#COBREXA.Serialized"><code>Serialized</code></a> model that is able to load itself back automatically upon precaching by <a href="#COBREXA.precache!-Tuple{MetabolicModel}"><code>precache!</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/utils/Serialized.jl#L2-L8">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="Base.copy-Tuple{Gene}" href="#Base.copy-Tuple{Gene}"><code>Base.copy</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">Base.copy(g::Gene)</code></pre><p>Shallow copy of a <a href="#COBREXA.Gene"><code>Gene</code></a></p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/utils/StandardModel.jl#L45-L49">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="Base.copy-Tuple{Metabolite}" href="#Base.copy-Tuple{Metabolite}"><code>Base.copy</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">Base.copy(m::Metabolite)</code></pre><p>Shallow copy of a <a href="#COBREXA.Metabolite"><code>Metabolite</code></a></p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/utils/StandardModel.jl#L31-L35">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="Base.copy-Tuple{Reaction}" href="#Base.copy-Tuple{Reaction}"><code>Base.copy</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">Base.copy(r::Reaction)</code></pre><p>Shallow copy of a <a href="#COBREXA.Reaction"><code>Reaction</code></a></p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/utils/StandardModel.jl#L14-L18">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="Base.copy-Tuple{StandardModel}" href="#Base.copy-Tuple{StandardModel}"><code>Base.copy</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">Base.copy(m::StandardModel)</code></pre><p>Shallow copy of a <a href="#COBREXA.StandardModel"><code>StandardModel</code></a></p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/utils/StandardModel.jl#L2-L6">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.atom_exchange-Tuple{StandardModel, String}" href="#COBREXA.atom_exchange-Tuple{StandardModel, String}"><code>COBREXA.atom_exchange</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">atom_exchange(model::StandardModel, rxn_id::String)</code></pre><p>Specialized version of <a href="#COBREXA.atom_exchange-Tuple{StandardModel, String}"><code>atom_exchange</code></a> for <a href="#COBREXA.StandardModel"><code>StandardModel</code></a> that quickly returns a dictionary mapping the flux-relative stoichiometry of atoms through a single reaction in <code>model</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/utils/StandardModel.jl#L52-L58">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.atom_exchange-Tuple{MetabolicModel, Dict{String, Float64}}" href="#COBREXA.atom_exchange-Tuple{MetabolicModel, Dict{String, Float64}}"><code>COBREXA.atom_exchange</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">atom_exchange(model::MetabolicModel, flux_dict::Dict{String, Float64})</code></pre><p>Return a dictionary mapping the flux of atoms across the boundary of the model given <code>flux_dict</code> (the solution of a constraint based analysis) of reactions in <code>model</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/utils/atom_exchange.jl#L1-L6">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.gamma_bounds-Tuple{Any}" href="#COBREXA.gamma_bounds-Tuple{Any}"><code>COBREXA.gamma_bounds</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">gamma_bounds(gamma)</code></pre><p>A bounds-generating function for <a href="#COBREXA.flux_variability_analysis-Tuple{MetabolicModel, Any}"><code>flux_variability_analysis</code></a> that limits the objective value to be at least <code>gamma*Z₀</code>, as usual in COBRA packages. Use as the <code>bounds</code> argument:</p><pre><code class="language-none">flux_variability_analysis(model, some_optimizer; bounds = gamma_bounds(0.9))</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/utils/bounds.jl#L1-L10">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.objective_bounds-Tuple{Any}" href="#COBREXA.objective_bounds-Tuple{Any}"><code>COBREXA.objective_bounds</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">objective_bounds(tolerance)</code></pre><p>A bounds-generating function for <a href="#COBREXA.flux_variability_analysis-Tuple{MetabolicModel, Any}"><code>flux_variability_analysis</code></a> that limits the objective value to a small multiple of Z₀. Use as <code>bounds</code> argument, similarly to <a href="#COBREXA.gamma_bounds-Tuple{Any}"><code>gamma_bounds</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/utils/bounds.jl#L13-L19">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA._parse_formula-Tuple{String}" href="#COBREXA._parse_formula-Tuple{String}"><code>COBREXA._parse_formula</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">_parse_formula(f::String)::MetaboliteFormula</code></pre><p>Parse a formula in format <code>C2H6O</code> into a <a href="#COBREXA.MetaboliteFormula"><code>MetaboliteFormula</code></a>, which is basically a dictionary of atom counts in the molecule.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/utils/chemical_formulas.jl#L2-L7">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA._unparse_formula-Tuple{Dict{String, Int64}}" href="#COBREXA._unparse_formula-Tuple{Dict{String, Int64}}"><code>COBREXA._unparse_formula</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">_unparse_formula(f::MetaboliteFormula)::String</code></pre><p>Format <a href="#COBREXA.MetaboliteFormula"><code>MetaboliteFormula</code></a> to <code>String</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/utils/chemical_formulas.jl#L19-L23">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.metabolite_fluxes-Tuple{MetabolicModel, Dict{String, Float64}}" href="#COBREXA.metabolite_fluxes-Tuple{MetabolicModel, Dict{String, Float64}}"><code>COBREXA.metabolite_fluxes</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">metabolite_fluxes(model::MetabolicModel, flux_dict::Dict{String, Float64})</code></pre><p>Return two dictionaries of metabolite <code>id</code>s mapped to reactions that consume or produce them, given the flux distribution supplied in <code>flux_dict</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/utils/fluxes.jl#L1-L6">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA._parse_grr-Tuple{SBML.GeneProductAssociation}" href="#COBREXA._parse_grr-Tuple{SBML.GeneProductAssociation}"><code>COBREXA._parse_grr</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">_parse_grr(gpa::SBML.GeneProductAssociation)::GeneAssociation</code></pre><p>Parse <code>SBML.GeneProductAssociation</code> structure to the simpler GeneAssociation. The input must be (implicitly) in a positive DNF.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/utils/gene_associations.jl#L2-L7">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA._parse_grr-Tuple{String}" href="#COBREXA._parse_grr-Tuple{String}"><code>COBREXA._parse_grr</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">_parse_grr(s::String)::GeneAssociation</code></pre><p>Parse a DNF gene association rule in format <code>(YIL010W and YLR043C) or (YIL010W and YGR209C)</code> to <code>GeneAssociation. Also accepts</code>OR<code>,</code>|<code>,</code>||<code>,</code>AND<code>,</code>&amp;<code>, and</code>&amp;&amp;`.</p><p><strong>Example</strong></p><pre><code class="language-none">julia&gt; _parse_grr(&quot;(YIL010W and YLR043C) or (YIL010W and YGR209C)&quot;)
 2-element Array{Array{String,1},1}:
  [&quot;YIL010W&quot;, &quot;YLR043C&quot;]
- [&quot;YIL010W&quot;, &quot;YGR209C&quot;]</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/utils/gene_associations.jl#L37-L51">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA._unparse_grr-Tuple{Type{SBML.GeneProductAssociation}, Vector{Vector{String}}}" href="#COBREXA._unparse_grr-Tuple{Type{SBML.GeneProductAssociation}, Vector{Vector{String}}}"><code>COBREXA._unparse_grr</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">_unparse_grr(
+ [&quot;YIL010W&quot;, &quot;YGR209C&quot;]</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/utils/gene_associations.jl#L37-L51">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA._unparse_grr-Tuple{Type{SBML.GeneProductAssociation}, Vector{Vector{String}}}" href="#COBREXA._unparse_grr-Tuple{Type{SBML.GeneProductAssociation}, Vector{Vector{String}}}"><code>COBREXA._unparse_grr</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">_unparse_grr(
     ::Type{SBML.GeneProductAssociation},
     x::GeneAssociation,
-)::SBML.GeneAssociation</code></pre><p>Convert a GeneAssociation to the corresponding <code>SBML.jl</code> structure.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/utils/gene_associations.jl#L22-L29">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA._unparse_grr-Tuple{Type{String}, Vector{Vector{String}}}" href="#COBREXA._unparse_grr-Tuple{Type{String}, Vector{Vector{String}}}"><code>COBREXA._unparse_grr</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">unparse_grr(grr::Vector{Vector{Gene}}</code></pre><p>Converts a nested string gene reaction array  back into a gene reaction rule string.</p><p><strong>Example</strong></p><pre><code class="language-none">julia&gt; _unparse_grr(String, [[&quot;YIL010W&quot;, &quot;YLR043C&quot;], [&quot;YIL010W&quot;, &quot;YGR209C&quot;]])
-&quot;(YIL010W and YLR043C) or (YIL010W and YGR209C)&quot;</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/utils/gene_associations.jl#L63-L74">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA._guesskey-Tuple{Any, Any}" href="#COBREXA._guesskey-Tuple{Any, Any}"><code>COBREXA._guesskey</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">_guesskey(ks, possibilities)</code></pre><p>Unfortunately, many model types that contain dictionares do not have standardized field names, so we need to try a few possibilities and guess the best one. The keys used to look for valid field names should be ideally specified as constants in <code>src/base/constants.jl</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/utils/guesskey.jl#L2-L9">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.find_biomass_reaction_ids-Tuple{MetabolicModel}" href="#COBREXA.find_biomass_reaction_ids-Tuple{MetabolicModel}"><code>COBREXA.find_biomass_reaction_ids</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">find_biomass_reaction_ids(m::MetabolicModel; kwargs...)</code></pre><p>Shortcut for finding biomass reaction identifiers in a model; arguments are forwarded to <a href="#COBREXA.looks_like_biomass_reaction-Tuple{String}"><code>looks_like_biomass_reaction</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/utils/looks_like.jl#L91-L96">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.find_biomass_reactions-Tuple{MetabolicModel}" href="#COBREXA.find_biomass_reactions-Tuple{MetabolicModel}"><code>COBREXA.find_biomass_reactions</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">find_biomass_reactions(m::MetabolicModel; kwargs...)</code></pre><p>Shortcut for finding biomass reaction indexes in a model; arguments are forwarded to <a href="#COBREXA.looks_like_biomass_reaction-Tuple{String}"><code>looks_like_biomass_reaction</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/utils/looks_like.jl#L82-L87">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.find_exchange_metabolite_ids-Tuple{MetabolicModel}" href="#COBREXA.find_exchange_metabolite_ids-Tuple{MetabolicModel}"><code>COBREXA.find_exchange_metabolite_ids</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">find_exchange_metabolite_ids(m::MetabolicModel; kwargs...)</code></pre><p>Shortcut for finding exchange metabolite identifiers in a model; arguments are forwarded to <a href="#COBREXA.looks_like_exchange_metabolite-Tuple{String}"><code>looks_like_exchange_metabolite</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/utils/looks_like.jl#L131-L136">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.find_exchange_metabolites-Tuple{MetabolicModel}" href="#COBREXA.find_exchange_metabolites-Tuple{MetabolicModel}"><code>COBREXA.find_exchange_metabolites</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">find_exchange_metabolites(m::MetabolicModel; kwargs...)</code></pre><p>Shortcut for finding exchange metabolite indexes in a model; arguments are forwarded to <a href="#COBREXA.looks_like_exchange_metabolite-Tuple{String}"><code>looks_like_exchange_metabolite</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/utils/looks_like.jl#L123-L128">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.find_exchange_reaction_ids-Tuple{MetabolicModel}" href="#COBREXA.find_exchange_reaction_ids-Tuple{MetabolicModel}"><code>COBREXA.find_exchange_reaction_ids</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">find_exchange_reaction_ids(m::MetabolicModel; kwargs...)</code></pre><p>Shortcut for finding exchange reaction identifiers in a model; arguments are forwarded to <a href="#COBREXA.looks_like_exchange_reaction-Tuple{String}"><code>looks_like_exchange_reaction</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/utils/looks_like.jl#L46-L51">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.find_exchange_reactions-Tuple{MetabolicModel}" href="#COBREXA.find_exchange_reactions-Tuple{MetabolicModel}"><code>COBREXA.find_exchange_reactions</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">find_exchange_reactions(m::MetabolicModel; kwargs...)</code></pre><p>Shortcut for finding exchange reaction indexes in a model; arguments are forwarded to <a href="#COBREXA.looks_like_exchange_reaction-Tuple{String}"><code>looks_like_exchange_reaction</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/utils/looks_like.jl#L37-L42">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.looks_like_biomass_reaction-Tuple{String}" href="#COBREXA.looks_like_biomass_reaction-Tuple{String}"><code>COBREXA.looks_like_biomass_reaction</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">looks_like_biomass_reaction(rxn_id::String;
+)::SBML.GeneAssociation</code></pre><p>Convert a GeneAssociation to the corresponding <code>SBML.jl</code> structure.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/utils/gene_associations.jl#L22-L29">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA._unparse_grr-Tuple{Type{String}, Vector{Vector{String}}}" href="#COBREXA._unparse_grr-Tuple{Type{String}, Vector{Vector{String}}}"><code>COBREXA._unparse_grr</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">unparse_grr(grr::Vector{Vector{Gene}}</code></pre><p>Converts a nested string gene reaction array  back into a gene reaction rule string.</p><p><strong>Example</strong></p><pre><code class="language-none">julia&gt; _unparse_grr(String, [[&quot;YIL010W&quot;, &quot;YLR043C&quot;], [&quot;YIL010W&quot;, &quot;YGR209C&quot;]])
+&quot;(YIL010W and YLR043C) or (YIL010W and YGR209C)&quot;</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/utils/gene_associations.jl#L63-L74">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA._guesskey-Tuple{Any, Any}" href="#COBREXA._guesskey-Tuple{Any, Any}"><code>COBREXA._guesskey</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">_guesskey(ks, possibilities)</code></pre><p>Unfortunately, many model types that contain dictionares do not have standardized field names, so we need to try a few possibilities and guess the best one. The keys used to look for valid field names should be ideally specified as constants in <code>src/base/constants.jl</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/utils/guesskey.jl#L2-L9">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.find_biomass_reaction_ids-Tuple{MetabolicModel}" href="#COBREXA.find_biomass_reaction_ids-Tuple{MetabolicModel}"><code>COBREXA.find_biomass_reaction_ids</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">find_biomass_reaction_ids(m::MetabolicModel; kwargs...)</code></pre><p>Shortcut for finding biomass reaction identifiers in a model; arguments are forwarded to <a href="#COBREXA.looks_like_biomass_reaction-Tuple{String}"><code>looks_like_biomass_reaction</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/utils/looks_like.jl#L91-L96">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.find_biomass_reactions-Tuple{MetabolicModel}" href="#COBREXA.find_biomass_reactions-Tuple{MetabolicModel}"><code>COBREXA.find_biomass_reactions</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">find_biomass_reactions(m::MetabolicModel; kwargs...)</code></pre><p>Shortcut for finding biomass reaction indexes in a model; arguments are forwarded to <a href="#COBREXA.looks_like_biomass_reaction-Tuple{String}"><code>looks_like_biomass_reaction</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/utils/looks_like.jl#L82-L87">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.find_exchange_metabolite_ids-Tuple{MetabolicModel}" href="#COBREXA.find_exchange_metabolite_ids-Tuple{MetabolicModel}"><code>COBREXA.find_exchange_metabolite_ids</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">find_exchange_metabolite_ids(m::MetabolicModel; kwargs...)</code></pre><p>Shortcut for finding exchange metabolite identifiers in a model; arguments are forwarded to <a href="#COBREXA.looks_like_exchange_metabolite-Tuple{String}"><code>looks_like_exchange_metabolite</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/utils/looks_like.jl#L131-L136">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.find_exchange_metabolites-Tuple{MetabolicModel}" href="#COBREXA.find_exchange_metabolites-Tuple{MetabolicModel}"><code>COBREXA.find_exchange_metabolites</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">find_exchange_metabolites(m::MetabolicModel; kwargs...)</code></pre><p>Shortcut for finding exchange metabolite indexes in a model; arguments are forwarded to <a href="#COBREXA.looks_like_exchange_metabolite-Tuple{String}"><code>looks_like_exchange_metabolite</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/utils/looks_like.jl#L123-L128">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.find_exchange_reaction_ids-Tuple{MetabolicModel}" href="#COBREXA.find_exchange_reaction_ids-Tuple{MetabolicModel}"><code>COBREXA.find_exchange_reaction_ids</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">find_exchange_reaction_ids(m::MetabolicModel; kwargs...)</code></pre><p>Shortcut for finding exchange reaction identifiers in a model; arguments are forwarded to <a href="#COBREXA.looks_like_exchange_reaction-Tuple{String}"><code>looks_like_exchange_reaction</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/utils/looks_like.jl#L46-L51">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.find_exchange_reactions-Tuple{MetabolicModel}" href="#COBREXA.find_exchange_reactions-Tuple{MetabolicModel}"><code>COBREXA.find_exchange_reactions</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">find_exchange_reactions(m::MetabolicModel; kwargs...)</code></pre><p>Shortcut for finding exchange reaction indexes in a model; arguments are forwarded to <a href="#COBREXA.looks_like_exchange_reaction-Tuple{String}"><code>looks_like_exchange_reaction</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/utils/looks_like.jl#L37-L42">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.looks_like_biomass_reaction-Tuple{String}" href="#COBREXA.looks_like_biomass_reaction-Tuple{String}"><code>COBREXA.looks_like_biomass_reaction</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">looks_like_biomass_reaction(rxn_id::String;
     exclude_exchanges = false,
     exchange_prefixes = _constants.exchange_prefixes,
     biomass_strings = _constants.biomass_strings,
 )::Bool</code></pre><p>A predicate that matches reaction identifiers that look like biomass reactions. Biomass reactions are identified by looking for occurences of <code>biomass_strings</code> in the reaction id. If <code>exclude_exchanges</code> is set, the strings that look like exchanges (from <a href="#COBREXA.looks_like_exchange_reaction-Tuple{String}"><code>looks_like_exchange_reaction</code></a>) will not match.</p><p><strong>Example</strong></p><pre><code class="language-none">filter(looks_like_biomass_reaction, reactions(model)) # returns strings
-findall(looks_like_biomass_reaction, reactions(model)) # returns indices</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/utils/looks_like.jl#L55-L72">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.looks_like_exchange_metabolite-Tuple{String}" href="#COBREXA.looks_like_exchange_metabolite-Tuple{String}"><code>COBREXA.looks_like_exchange_metabolite</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">looks_like_exchange_metabolite(rxn_id::String;
+findall(looks_like_biomass_reaction, reactions(model)) # returns indices</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/utils/looks_like.jl#L55-L72">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.looks_like_exchange_metabolite-Tuple{String}" href="#COBREXA.looks_like_exchange_metabolite-Tuple{String}"><code>COBREXA.looks_like_exchange_metabolite</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">looks_like_exchange_metabolite(rxn_id::String;
     exchange_suffixes = _constants.exchange_suffixes,
     )::Bool</code></pre><p>A predicate that matches metabolite identifiers that look like involved in exchange reactions. Exchange metabolites are identified by <code>exchange_suffixes</code> at the end of the metabolite id.</p><p><strong>Example</strong></p><pre><code class="language-none">filter(looks_like_exchange_metabolite, metabolites(model)) # returns strings
-findall(looks_like_exchange_metabolite, metabolites(model)) # returns indices</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/utils/looks_like.jl#L101-L115">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.looks_like_exchange_reaction-Tuple{String}" href="#COBREXA.looks_like_exchange_reaction-Tuple{String}"><code>COBREXA.looks_like_exchange_reaction</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">looks_like_exchange_reaction(rxn_id::String;
+findall(looks_like_exchange_metabolite, metabolites(model)) # returns indices</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/utils/looks_like.jl#L101-L115">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.looks_like_exchange_reaction-Tuple{String}" href="#COBREXA.looks_like_exchange_reaction-Tuple{String}"><code>COBREXA.looks_like_exchange_reaction</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">looks_like_exchange_reaction(rxn_id::String;
     exclude_biomass = false,
     biomass_strings = _constants.biomass_strings,
     exchange_prefixes = _constants.exchange_prefixes,
@@ -480,105 +472,105 @@ filter(looks_like_exchange_reaction, reactions(model)) # returns Strings
 # to use the optional arguments you need to expand the function&#39;s arguments
 # using an anonymous function
 findall(x -&gt; looks_like_exchange_reaction(x; exclude_biomass=true), reactions(model)) # returns indices
-filter(x -&gt; looks_like_exchange_reaction(x; exclude_biomass=true), reactions(model)) # returns Strings</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/utils/looks_like.jl#L1-L26">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.change_bound!-Tuple{CoreModel, Int64}" href="#COBREXA.change_bound!-Tuple{CoreModel, Int64}"><code>COBREXA.change_bound!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">change_bound!(
+filter(x -&gt; looks_like_exchange_reaction(x; exclude_biomass=true), reactions(model)) # returns Strings</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/utils/looks_like.jl#L1-L26">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.change_bound!-Tuple{CoreModel, Int64}" href="#COBREXA.change_bound!-Tuple{CoreModel, Int64}"><code>COBREXA.change_bound!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">change_bound!(
     model::CoreModel,
     rxn_idx::Int;
     lower = nothing,
     upper = nothing,
-)</code></pre><p>Change the specified reaction flux bound in the model in-place.</p><p><strong>Example</strong></p><pre><code class="language-none">new_model = change_bound!(model, 123, lower=-21.15, upper=42.3)</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/macros/change_bounds.jl#L44-L59">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.change_bound!-Tuple{CoreModel, String}" href="#COBREXA.change_bound!-Tuple{CoreModel, String}"><code>COBREXA.change_bound!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">change_bound!(
+)</code></pre><p>Change the specified reaction flux bound in the model in-place.</p><p><strong>Example</strong></p><pre><code class="language-none">new_model = change_bound!(model, 123, lower=-21.15, upper=42.3)</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/macros/change_bounds.jl#L44-L59">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.change_bound!-Tuple{CoreModel, String}" href="#COBREXA.change_bound!-Tuple{CoreModel, String}"><code>COBREXA.change_bound!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">change_bound!(
     model::CoreModel,
     rxn_id::String;
     lower = nothing,
     upper = nothing,
-)</code></pre><p>Change the specified reaction flux bound in the model in-place.</p><p><strong>Example</strong></p><pre><code class="language-none">new_model = change_bound!(model, &quot;ReactionB&quot;, lower=-21.15, upper=42.3)</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/macros/change_bounds.jl#L44-L59">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.change_bound!-Tuple{CoreModelCoupled, Int64}" href="#COBREXA.change_bound!-Tuple{CoreModelCoupled, Int64}"><code>COBREXA.change_bound!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">change_bound!(
+)</code></pre><p>Change the specified reaction flux bound in the model in-place.</p><p><strong>Example</strong></p><pre><code class="language-none">new_model = change_bound!(model, &quot;ReactionB&quot;, lower=-21.15, upper=42.3)</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/macros/change_bounds.jl#L44-L59">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.change_bound!-Tuple{CoreModelCoupled, Int64}" href="#COBREXA.change_bound!-Tuple{CoreModelCoupled, Int64}"><code>COBREXA.change_bound!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">change_bound!(
     model::CoreModelCoupled,
     rxn_idx::Int;
     lower = nothing,
     upper = nothing,
-)</code></pre><p>Change the specified reaction flux bound in the model in-place.</p><p><strong>Example</strong></p><pre><code class="language-none">new_model = change_bound!(model, 123, lower=-21.15, upper=42.3)</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/macros/change_bounds.jl#L44-L59">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.change_bound!-Tuple{CoreModelCoupled, String}" href="#COBREXA.change_bound!-Tuple{CoreModelCoupled, String}"><code>COBREXA.change_bound!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">change_bound!(
+)</code></pre><p>Change the specified reaction flux bound in the model in-place.</p><p><strong>Example</strong></p><pre><code class="language-none">new_model = change_bound!(model, 123, lower=-21.15, upper=42.3)</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/macros/change_bounds.jl#L44-L59">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.change_bound!-Tuple{CoreModelCoupled, String}" href="#COBREXA.change_bound!-Tuple{CoreModelCoupled, String}"><code>COBREXA.change_bound!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">change_bound!(
     model::CoreModelCoupled,
     rxn_id::String;
     lower = nothing,
     upper = nothing,
-)</code></pre><p>Change the specified reaction flux bound in the model in-place.</p><p><strong>Example</strong></p><pre><code class="language-none">new_model = change_bound!(model, &quot;ReactionB&quot;, lower=-21.15, upper=42.3)</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/macros/change_bounds.jl#L44-L59">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.change_bound!-Tuple{StandardModel, String}" href="#COBREXA.change_bound!-Tuple{StandardModel, String}"><code>COBREXA.change_bound!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">change_bound!(
+)</code></pre><p>Change the specified reaction flux bound in the model in-place.</p><p><strong>Example</strong></p><pre><code class="language-none">new_model = change_bound!(model, &quot;ReactionB&quot;, lower=-21.15, upper=42.3)</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/macros/change_bounds.jl#L44-L59">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.change_bound!-Tuple{StandardModel, String}" href="#COBREXA.change_bound!-Tuple{StandardModel, String}"><code>COBREXA.change_bound!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">change_bound!(
     model::StandardModel,
     rxn_id::String;
     lower = nothing,
     upper = nothing,
-)</code></pre><p>Change the specified reaction flux bound in the model in-place.</p><p><strong>Example</strong></p><pre><code class="language-none">new_model = change_bound!(model, &quot;ReactionB&quot;, lower=-21.15, upper=42.3)</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/macros/change_bounds.jl#L44-L59">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.change_bound-Tuple{CoreModel, Int64}" href="#COBREXA.change_bound-Tuple{CoreModel, Int64}"><code>COBREXA.change_bound</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">change_bound(
+)</code></pre><p>Change the specified reaction flux bound in the model in-place.</p><p><strong>Example</strong></p><pre><code class="language-none">new_model = change_bound!(model, &quot;ReactionB&quot;, lower=-21.15, upper=42.3)</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/macros/change_bounds.jl#L44-L59">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.change_bound-Tuple{CoreModel, Int64}" href="#COBREXA.change_bound-Tuple{CoreModel, Int64}"><code>COBREXA.change_bound</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">change_bound(
     model::CoreModel,
     rxn_idx::Int;
     lower = nothing,
     upper = nothing,
-)</code></pre><p>Change the specified reaction flux bound in the model and return the modified model.</p><p><strong>Example</strong></p><pre><code class="language-none">change_bound(model, 123, lower=-21.15, upper=42.3)</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/macros/change_bounds.jl#L44-L59">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.change_bound-Tuple{CoreModel, String}" href="#COBREXA.change_bound-Tuple{CoreModel, String}"><code>COBREXA.change_bound</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">change_bound(
+)</code></pre><p>Change the specified reaction flux bound in the model and return the modified model.</p><p><strong>Example</strong></p><pre><code class="language-none">change_bound(model, 123, lower=-21.15, upper=42.3)</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/macros/change_bounds.jl#L44-L59">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.change_bound-Tuple{CoreModel, String}" href="#COBREXA.change_bound-Tuple{CoreModel, String}"><code>COBREXA.change_bound</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">change_bound(
     model::CoreModel,
     rxn_id::String;
     lower = nothing,
     upper = nothing,
-)</code></pre><p>Change the specified reaction flux bound in the model and return the modified model.</p><p><strong>Example</strong></p><pre><code class="language-none">change_bound(model, &quot;ReactionB&quot;, lower=-21.15, upper=42.3)</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/macros/change_bounds.jl#L44-L59">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.change_bound-Tuple{CoreModelCoupled, Int64}" href="#COBREXA.change_bound-Tuple{CoreModelCoupled, Int64}"><code>COBREXA.change_bound</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">change_bound(
+)</code></pre><p>Change the specified reaction flux bound in the model and return the modified model.</p><p><strong>Example</strong></p><pre><code class="language-none">change_bound(model, &quot;ReactionB&quot;, lower=-21.15, upper=42.3)</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/macros/change_bounds.jl#L44-L59">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.change_bound-Tuple{CoreModelCoupled, Int64}" href="#COBREXA.change_bound-Tuple{CoreModelCoupled, Int64}"><code>COBREXA.change_bound</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">change_bound(
     model::CoreModelCoupled,
     rxn_idx::Int;
     lower = nothing,
     upper = nothing,
-)</code></pre><p>Change the specified reaction flux bound in the model and return the modified model.</p><p><strong>Example</strong></p><pre><code class="language-none">change_bound(model, 123, lower=-21.15, upper=42.3)</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/macros/change_bounds.jl#L44-L59">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.change_bound-Tuple{CoreModelCoupled, String}" href="#COBREXA.change_bound-Tuple{CoreModelCoupled, String}"><code>COBREXA.change_bound</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">change_bound(
+)</code></pre><p>Change the specified reaction flux bound in the model and return the modified model.</p><p><strong>Example</strong></p><pre><code class="language-none">change_bound(model, 123, lower=-21.15, upper=42.3)</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/macros/change_bounds.jl#L44-L59">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.change_bound-Tuple{CoreModelCoupled, String}" href="#COBREXA.change_bound-Tuple{CoreModelCoupled, String}"><code>COBREXA.change_bound</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">change_bound(
     model::CoreModelCoupled,
     rxn_id::String;
     lower = nothing,
     upper = nothing,
-)</code></pre><p>Change the specified reaction flux bound in the model and return the modified model.</p><p><strong>Example</strong></p><pre><code class="language-none">change_bound(model, &quot;ReactionB&quot;, lower=-21.15, upper=42.3)</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/macros/change_bounds.jl#L44-L59">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.change_bound-Tuple{StandardModel, String}" href="#COBREXA.change_bound-Tuple{StandardModel, String}"><code>COBREXA.change_bound</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">change_bound(
+)</code></pre><p>Change the specified reaction flux bound in the model and return the modified model.</p><p><strong>Example</strong></p><pre><code class="language-none">change_bound(model, &quot;ReactionB&quot;, lower=-21.15, upper=42.3)</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/macros/change_bounds.jl#L44-L59">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.change_bound-Tuple{StandardModel, String}" href="#COBREXA.change_bound-Tuple{StandardModel, String}"><code>COBREXA.change_bound</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">change_bound(
     model::StandardModel,
     rxn_id::String;
     lower = nothing,
     upper = nothing,
-)</code></pre><p>Change the specified reaction flux bound in the model and return the modified model.</p><p><strong>Example</strong></p><pre><code class="language-none">change_bound(model, &quot;ReactionB&quot;, lower=-21.15, upper=42.3)</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/macros/change_bounds.jl#L44-L59">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.change_bounds!-Tuple{CoreModel, AbstractVector{Int64}}" href="#COBREXA.change_bounds!-Tuple{CoreModel, AbstractVector{Int64}}"><code>COBREXA.change_bounds!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">change_bounds!(
+)</code></pre><p>Change the specified reaction flux bound in the model and return the modified model.</p><p><strong>Example</strong></p><pre><code class="language-none">change_bound(model, &quot;ReactionB&quot;, lower=-21.15, upper=42.3)</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/macros/change_bounds.jl#L44-L59">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.change_bounds!-Tuple{CoreModel, AbstractVector{Int64}}" href="#COBREXA.change_bounds!-Tuple{CoreModel, AbstractVector{Int64}}"><code>COBREXA.change_bounds!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">change_bounds!(
     model::CoreModel,
     rxn_idxs::AbstractVector{Int64};
     lower = (nothing for _ = rxn_idxs),
     upper = (nothing for _ = rxn_idxs),
-)</code></pre><p>Change the specified reaction flux bounds in the model in-place.</p><p><strong>Example</strong></p><pre><code class="language-none">new_model = change_bounds!(model, [123, 234], lower=[-2.1, -50.05], upper=[4.2, 100.1])</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/macros/change_bounds.jl#L44-L59">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.change_bounds!-Tuple{CoreModel, AbstractVector{String}}" href="#COBREXA.change_bounds!-Tuple{CoreModel, AbstractVector{String}}"><code>COBREXA.change_bounds!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">change_bounds!(
+)</code></pre><p>Change the specified reaction flux bounds in the model in-place.</p><p><strong>Example</strong></p><pre><code class="language-none">new_model = change_bounds!(model, [123, 234], lower=[-2.1, -50.05], upper=[4.2, 100.1])</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/macros/change_bounds.jl#L44-L59">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.change_bounds!-Tuple{CoreModel, AbstractVector{String}}" href="#COBREXA.change_bounds!-Tuple{CoreModel, AbstractVector{String}}"><code>COBREXA.change_bounds!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">change_bounds!(
     model::CoreModel,
     rxn_ids::AbstractVector{String};
     lower = (nothing for _ = rxn_ids),
     upper = (nothing for _ = rxn_ids),
-)</code></pre><p>Change the specified reaction flux bounds in the model in-place.</p><p><strong>Example</strong></p><pre><code class="language-none">new_model = change_bounds!(model, [&quot;ReactionA&quot;, &quot;ReactionC&quot;], lower=[-2.1, -50.05], upper=[4.2, 100.1])</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/macros/change_bounds.jl#L44-L59">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.change_bounds!-Tuple{CoreModelCoupled, AbstractVector{Int64}}" href="#COBREXA.change_bounds!-Tuple{CoreModelCoupled, AbstractVector{Int64}}"><code>COBREXA.change_bounds!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">change_bounds!(
+)</code></pre><p>Change the specified reaction flux bounds in the model in-place.</p><p><strong>Example</strong></p><pre><code class="language-none">new_model = change_bounds!(model, [&quot;ReactionA&quot;, &quot;ReactionC&quot;], lower=[-2.1, -50.05], upper=[4.2, 100.1])</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/macros/change_bounds.jl#L44-L59">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.change_bounds!-Tuple{CoreModelCoupled, AbstractVector{Int64}}" href="#COBREXA.change_bounds!-Tuple{CoreModelCoupled, AbstractVector{Int64}}"><code>COBREXA.change_bounds!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">change_bounds!(
     model::CoreModelCoupled,
     rxn_idxs::AbstractVector{Int64};
     lower = (nothing for _ = rxn_idxs),
     upper = (nothing for _ = rxn_idxs),
-)</code></pre><p>Change the specified reaction flux bounds in the model in-place.</p><p><strong>Example</strong></p><pre><code class="language-none">new_model = change_bounds!(model, [123, 234], lower=[-2.1, -50.05], upper=[4.2, 100.1])</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/macros/change_bounds.jl#L44-L59">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.change_bounds!-Tuple{CoreModelCoupled, AbstractVector{String}}" href="#COBREXA.change_bounds!-Tuple{CoreModelCoupled, AbstractVector{String}}"><code>COBREXA.change_bounds!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">change_bounds!(
+)</code></pre><p>Change the specified reaction flux bounds in the model in-place.</p><p><strong>Example</strong></p><pre><code class="language-none">new_model = change_bounds!(model, [123, 234], lower=[-2.1, -50.05], upper=[4.2, 100.1])</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/macros/change_bounds.jl#L44-L59">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.change_bounds!-Tuple{CoreModelCoupled, AbstractVector{String}}" href="#COBREXA.change_bounds!-Tuple{CoreModelCoupled, AbstractVector{String}}"><code>COBREXA.change_bounds!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">change_bounds!(
     model::CoreModelCoupled,
     rxn_ids::AbstractVector{String};
     lower = (nothing for _ = rxn_ids),
     upper = (nothing for _ = rxn_ids),
-)</code></pre><p>Change the specified reaction flux bounds in the model in-place.</p><p><strong>Example</strong></p><pre><code class="language-none">new_model = change_bounds!(model, [&quot;ReactionA&quot;, &quot;ReactionC&quot;], lower=[-2.1, -50.05], upper=[4.2, 100.1])</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/macros/change_bounds.jl#L44-L59">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.change_bounds!-Tuple{StandardModel, AbstractVector{String}}" href="#COBREXA.change_bounds!-Tuple{StandardModel, AbstractVector{String}}"><code>COBREXA.change_bounds!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">change_bounds!(
+)</code></pre><p>Change the specified reaction flux bounds in the model in-place.</p><p><strong>Example</strong></p><pre><code class="language-none">new_model = change_bounds!(model, [&quot;ReactionA&quot;, &quot;ReactionC&quot;], lower=[-2.1, -50.05], upper=[4.2, 100.1])</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/macros/change_bounds.jl#L44-L59">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.change_bounds!-Tuple{StandardModel, AbstractVector{String}}" href="#COBREXA.change_bounds!-Tuple{StandardModel, AbstractVector{String}}"><code>COBREXA.change_bounds!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">change_bounds!(
     model::StandardModel,
     rxn_ids::AbstractVector{String};
     lower = (nothing for _ = rxn_ids),
     upper = (nothing for _ = rxn_ids),
-)</code></pre><p>Change the specified reaction flux bounds in the model in-place.</p><p><strong>Example</strong></p><pre><code class="language-none">new_model = change_bounds!(model, [&quot;ReactionA&quot;, &quot;ReactionC&quot;], lower=[-2.1, -50.05], upper=[4.2, 100.1])</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/macros/change_bounds.jl#L44-L59">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.change_bounds-Tuple{CoreModel, AbstractVector{Int64}}" href="#COBREXA.change_bounds-Tuple{CoreModel, AbstractVector{Int64}}"><code>COBREXA.change_bounds</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">change_bounds(
+)</code></pre><p>Change the specified reaction flux bounds in the model in-place.</p><p><strong>Example</strong></p><pre><code class="language-none">new_model = change_bounds!(model, [&quot;ReactionA&quot;, &quot;ReactionC&quot;], lower=[-2.1, -50.05], upper=[4.2, 100.1])</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/macros/change_bounds.jl#L44-L59">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.change_bounds-Tuple{CoreModel, AbstractVector{Int64}}" href="#COBREXA.change_bounds-Tuple{CoreModel, AbstractVector{Int64}}"><code>COBREXA.change_bounds</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">change_bounds(
     model::CoreModel,
     rxn_idxs::AbstractVector{Int64};
     lower = (nothing for _ = rxn_idxs),
     upper = (nothing for _ = rxn_idxs),
-)</code></pre><p>Change the specified reaction flux bounds in the model and return the modified model.</p><p><strong>Example</strong></p><pre><code class="language-none">change_bounds(model, [123, 234], lower=[-2.1, -50.05], upper=[4.2, 100.1])</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/macros/change_bounds.jl#L44-L59">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.change_bounds-Tuple{CoreModel, AbstractVector{String}}" href="#COBREXA.change_bounds-Tuple{CoreModel, AbstractVector{String}}"><code>COBREXA.change_bounds</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">change_bounds(
+)</code></pre><p>Change the specified reaction flux bounds in the model and return the modified model.</p><p><strong>Example</strong></p><pre><code class="language-none">change_bounds(model, [123, 234], lower=[-2.1, -50.05], upper=[4.2, 100.1])</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/macros/change_bounds.jl#L44-L59">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.change_bounds-Tuple{CoreModel, AbstractVector{String}}" href="#COBREXA.change_bounds-Tuple{CoreModel, AbstractVector{String}}"><code>COBREXA.change_bounds</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">change_bounds(
     model::CoreModel,
     rxn_ids::AbstractVector{String};
     lower = (nothing for _ = rxn_ids),
     upper = (nothing for _ = rxn_ids),
-)</code></pre><p>Change the specified reaction flux bounds in the model and return the modified model.</p><p><strong>Example</strong></p><pre><code class="language-none">change_bounds(model, [&quot;ReactionA&quot;, &quot;ReactionC&quot;], lower=[-2.1, -50.05], upper=[4.2, 100.1])</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/macros/change_bounds.jl#L44-L59">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.change_bounds-Tuple{CoreModelCoupled, AbstractVector{Int64}}" href="#COBREXA.change_bounds-Tuple{CoreModelCoupled, AbstractVector{Int64}}"><code>COBREXA.change_bounds</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">change_bounds(
+)</code></pre><p>Change the specified reaction flux bounds in the model and return the modified model.</p><p><strong>Example</strong></p><pre><code class="language-none">change_bounds(model, [&quot;ReactionA&quot;, &quot;ReactionC&quot;], lower=[-2.1, -50.05], upper=[4.2, 100.1])</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/macros/change_bounds.jl#L44-L59">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.change_bounds-Tuple{CoreModelCoupled, AbstractVector{Int64}}" href="#COBREXA.change_bounds-Tuple{CoreModelCoupled, AbstractVector{Int64}}"><code>COBREXA.change_bounds</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">change_bounds(
     model::CoreModelCoupled,
     rxn_idxs::AbstractVector{Int64};
     lower = (nothing for _ = rxn_idxs),
     upper = (nothing for _ = rxn_idxs),
-)</code></pre><p>Change the specified reaction flux bounds in the model and return the modified model.</p><p><strong>Example</strong></p><pre><code class="language-none">change_bounds(model, [123, 234], lower=[-2.1, -50.05], upper=[4.2, 100.1])</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/macros/change_bounds.jl#L44-L59">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.change_bounds-Tuple{CoreModelCoupled, AbstractVector{String}}" href="#COBREXA.change_bounds-Tuple{CoreModelCoupled, AbstractVector{String}}"><code>COBREXA.change_bounds</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">change_bounds(
+)</code></pre><p>Change the specified reaction flux bounds in the model and return the modified model.</p><p><strong>Example</strong></p><pre><code class="language-none">change_bounds(model, [123, 234], lower=[-2.1, -50.05], upper=[4.2, 100.1])</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/macros/change_bounds.jl#L44-L59">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.change_bounds-Tuple{CoreModelCoupled, AbstractVector{String}}" href="#COBREXA.change_bounds-Tuple{CoreModelCoupled, AbstractVector{String}}"><code>COBREXA.change_bounds</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">change_bounds(
     model::CoreModelCoupled,
     rxn_ids::AbstractVector{String};
     lower = (nothing for _ = rxn_ids),
     upper = (nothing for _ = rxn_ids),
-)</code></pre><p>Change the specified reaction flux bounds in the model and return the modified model.</p><p><strong>Example</strong></p><pre><code class="language-none">change_bounds(model, [&quot;ReactionA&quot;, &quot;ReactionC&quot;], lower=[-2.1, -50.05], upper=[4.2, 100.1])</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/macros/change_bounds.jl#L44-L59">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.change_bounds-Tuple{StandardModel, AbstractVector{String}}" href="#COBREXA.change_bounds-Tuple{StandardModel, AbstractVector{String}}"><code>COBREXA.change_bounds</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">change_bounds(
+)</code></pre><p>Change the specified reaction flux bounds in the model and return the modified model.</p><p><strong>Example</strong></p><pre><code class="language-none">change_bounds(model, [&quot;ReactionA&quot;, &quot;ReactionC&quot;], lower=[-2.1, -50.05], upper=[4.2, 100.1])</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/macros/change_bounds.jl#L44-L59">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.change_bounds-Tuple{StandardModel, AbstractVector{String}}" href="#COBREXA.change_bounds-Tuple{StandardModel, AbstractVector{String}}"><code>COBREXA.change_bounds</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia">change_bounds(
     model::StandardModel,
     rxn_ids::AbstractVector{String};
     lower = (nothing for _ = rxn_ids),
     upper = (nothing for _ = rxn_ids),
-)</code></pre><p>Change the specified reaction flux bounds in the model and return the modified model.</p><p><strong>Example</strong></p><pre><code class="language-none">change_bounds(model, [&quot;ReactionA&quot;, &quot;ReactionC&quot;], lower=[-2.1, -50.05], upper=[4.2, 100.1])</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/macros/change_bounds.jl#L44-L59">source</a></section></article><h3 id="Logging-and-debugging-helpers"><a class="docs-heading-anchor" href="#Logging-and-debugging-helpers">Logging and debugging helpers</a><a id="Logging-and-debugging-helpers-1"></a><a class="docs-heading-anchor-permalink" href="#Logging-and-debugging-helpers" title="Permalink"></a></h3><article class="docstring"><header><a class="docstring-binding" id="COBREXA.log_io" href="#COBREXA.log_io"><code>COBREXA.log_io</code></a> — <span class="docstring-category">Function</span></header><section><div><pre><code class="language-julia">log_io(enable::Bool=true)</code></pre><p>Enable (default) or disable (by passing <code>false</code>) output of messages and warnings from model input/output.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/logging/log.jl#L40-L44">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.log_models" href="#COBREXA.log_models"><code>COBREXA.log_models</code></a> — <span class="docstring-category">Function</span></header><section><div><pre><code class="language-julia">log_models(enable::Bool=true)</code></pre><p>Enable (default) or disable (by passing <code>false</code>) output of model-related messages.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/logging/log.jl#L40-L44">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.log_perf" href="#COBREXA.log_perf"><code>COBREXA.log_perf</code></a> — <span class="docstring-category">Function</span></header><section><div><pre><code class="language-julia">log_perf(enable::Bool=true)</code></pre><p>Enable (default) or disable (by passing <code>false</code>) output of performance-related tracing information.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/logging/log.jl#L40-L44">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.@_make_logging_tag-Tuple{Symbol, String}" href="#COBREXA.@_make_logging_tag-Tuple{Symbol, String}"><code>COBREXA.@_make_logging_tag</code></a> — <span class="docstring-category">Macro</span></header><section><div><pre><code class="language-julia">macro _make_logging_group(sym::Symbol, doc::String)</code></pre><p>This creates a group of functions that allow masking out topic-related logging actions. A call that goes as follows:</p><pre><code class="language-none">@_make_logging_tag XYZ</code></pre><p>creates the following tools:</p><ul><li>global variable <code>_XYZ_log_enabled</code> defaulted to false</li><li>function <code>log_XYZ</code> that can be called to turn the logging on/off</li><li>a masking macro <code>@_XYZ_log</code> that can be prepended to commands that should only happen if the logging of tag XYZ is enabled.</li></ul><p>The masking macro is then used as follows:</p><pre><code class="language-none">@_XYZ_log @info &quot;This is the extra verbose information you wanted!&quot; a b c</code></pre><p>The user can direct logging with these:</p><pre><code class="language-none">log_XYZ()
-log_XYZ(false)</code></pre><p><code>doc</code> should be a name of the stuff that is being printed if the corresponding log_XYZ() is enabled – it is used to create a friendly documentation for the logging switch. In this case it could say <code>&quot;X, Y and Z-related messages&quot;</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/e0ef1855145c30180d845bca914dbe878915fbf9/src/base/logging/log.jl#L2-L29">source</a></section></article></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="../notebooks/">« Examples and notebooks</a><a class="docs-footer-nextpage" href="../howToContribute/">How to contribute »</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> on <span class="colophon-date" title="Wednesday 4 August 2021 13:35">Wednesday 4 August 2021</span>. Using Julia version 1.6.0.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
+)</code></pre><p>Change the specified reaction flux bounds in the model and return the modified model.</p><p><strong>Example</strong></p><pre><code class="language-none">change_bounds(model, [&quot;ReactionA&quot;, &quot;ReactionC&quot;], lower=[-2.1, -50.05], upper=[4.2, 100.1])</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/macros/change_bounds.jl#L44-L59">source</a></section></article><h3 id="Logging-and-debugging-helpers"><a class="docs-heading-anchor" href="#Logging-and-debugging-helpers">Logging and debugging helpers</a><a id="Logging-and-debugging-helpers-1"></a><a class="docs-heading-anchor-permalink" href="#Logging-and-debugging-helpers" title="Permalink"></a></h3><article class="docstring"><header><a class="docstring-binding" id="COBREXA.log_io" href="#COBREXA.log_io"><code>COBREXA.log_io</code></a> — <span class="docstring-category">Function</span></header><section><div><pre><code class="language-julia">log_io(enable::Bool=true)</code></pre><p>Enable (default) or disable (by passing <code>false</code>) output of messages and warnings from model input/output.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/logging/log.jl#L40-L44">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.log_models" href="#COBREXA.log_models"><code>COBREXA.log_models</code></a> — <span class="docstring-category">Function</span></header><section><div><pre><code class="language-julia">log_models(enable::Bool=true)</code></pre><p>Enable (default) or disable (by passing <code>false</code>) output of model-related messages.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/logging/log.jl#L40-L44">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.log_perf" href="#COBREXA.log_perf"><code>COBREXA.log_perf</code></a> — <span class="docstring-category">Function</span></header><section><div><pre><code class="language-julia">log_perf(enable::Bool=true)</code></pre><p>Enable (default) or disable (by passing <code>false</code>) output of performance-related tracing information.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/logging/log.jl#L40-L44">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="COBREXA.@_make_logging_tag-Tuple{Symbol, String}" href="#COBREXA.@_make_logging_tag-Tuple{Symbol, String}"><code>COBREXA.@_make_logging_tag</code></a> — <span class="docstring-category">Macro</span></header><section><div><pre><code class="language-julia">macro _make_logging_group(sym::Symbol, doc::String)</code></pre><p>This creates a group of functions that allow masking out topic-related logging actions. A call that goes as follows:</p><pre><code class="language-none">@_make_logging_tag XYZ</code></pre><p>creates the following tools:</p><ul><li>global variable <code>_XYZ_log_enabled</code> defaulted to false</li><li>function <code>log_XYZ</code> that can be called to turn the logging on/off</li><li>a masking macro <code>@_XYZ_log</code> that can be prepended to commands that should only happen if the logging of tag XYZ is enabled.</li></ul><p>The masking macro is then used as follows:</p><pre><code class="language-none">@_XYZ_log @info &quot;This is the extra verbose information you wanted!&quot; a b c</code></pre><p>The user can direct logging with these:</p><pre><code class="language-none">log_XYZ()
+log_XYZ(false)</code></pre><p><code>doc</code> should be a name of the stuff that is being printed if the corresponding log_XYZ() is enabled – it is used to create a friendly documentation for the logging switch. In this case it could say <code>&quot;X, Y and Z-related messages&quot;</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/189fecb2c47d1844363080612d2f13558bfe5152/src/base/logging/log.jl#L2-L29">source</a></section></article></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="../notebooks/">« Examples and notebooks</a><a class="docs-footer-nextpage" href="../howToContribute/">How to contribute »</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> on <span class="colophon-date" title="Wednesday 4 August 2021 13:58">Wednesday 4 August 2021</span>. Using Julia version 1.6.0.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
diff --git a/dev/howToContribute/index.html b/dev/howToContribute/index.html
index f1abb220f5b845b0cdc43dbd1e967f6d9ed3bcb8..1ae321eea20748f9248e61e8d687cb61b0681895 100644
--- a/dev/howToContribute/index.html
+++ b/dev/howToContribute/index.html
@@ -5,4 +5,4 @@
 $ julia</code></pre><p>With Julia, you can install the development version of the package from the directory as follows:</p><pre><code class="language-julia">(v1.6) pkg&gt; add .</code></pre><p>(press <code>]</code> to get into the packaging environment)</p><p>This adds the <code>COBREXA.jl</code> package and all its dependencies. You can verify that the installation worked by typing:</p><pre><code class="language-julia">(v1.6) pkg&gt; status</code></pre><p>If you are planning to develop the package, it is often easier to install the package in development mode, with <code>dev</code> command:</p><pre><code class="language-julia">(v1.6) pkg&gt; dev .</code></pre><p>That causes the package to always load with whatever code changes that you added to the source directory.</p><h4 id="Finally:-load-COBREXA.jl"><a class="docs-heading-anchor" href="#Finally:-load-COBREXA.jl">Finally: load COBREXA.jl</a><a id="Finally:-load-COBREXA.jl-1"></a><a class="docs-heading-anchor-permalink" href="#Finally:-load-COBREXA.jl" title="Permalink"></a></h4><p>With both of above options, you should get COBREXA.jl installed, which means that the following command should, without errors, load the package and make COBREXA.jl functions available for testing:</p><pre><code class="language-julia">julia&gt; using COBREXA</code></pre><p>You may now freely modify the code and test the result.</p><p>Remember that if you want to work in the environment of the package, you need to <em>activate</em> it. That causes, among other, that the additional dependencies specified with packaging <code>add</code> command will be written automaticaly to <code>Project.toml</code> file of your local COBREXA.jl clone, not to your global environment. Activation is simple: when in the directory of the package, just type the command into the packaging shell:</p><pre><code class="language-julia">(v1.6) pkg&gt; activate</code></pre><h3 id="Step-2:-Publish-your-changes"><a class="docs-heading-anchor" href="#Step-2:-Publish-your-changes">Step 2: Publish your changes</a><a id="Step-2:-Publish-your-changes-1"></a><a class="docs-heading-anchor-permalink" href="#Step-2:-Publish-your-changes" title="Permalink"></a></h3><p>You are expected to make a fork of the main COBREXA.jl repository, and open a pull request from that one to the <code>master</code> branch of the main repository. For creating the fork, just hit the &quot;Fork&quot; button on GitHub.</p><p>After that, change the directory to your repository and adjust the remotes:</p><pre><code class="language-bash">$ cd ~/.julia/dev/COBREXA             # or any other directory, as needed
 $ git remote rename origin upstream   # renames the origin (the main COBREXA.jl repo) to upstream
 $ git remote add origin git@github.com:yourUsername/COBREXA.jl.git  # adds the link to your clone as new origin
-$ git fetch origin                    # fetches the refs from your repo</code></pre><p>In the above code, change <code>yourUsername</code> is your GitHub username.</p><p>When the renaming is done, start a new branch at <code>upstream/master</code>. In the code snippet, substitute <code>yn</code> for your initials (Your Name here) and give the new feature a better name than <code>somefeature</code>:</p><pre><code class="language-bash">$ git checkout -b yn-somefeature origin/master</code></pre><p>Commit any changes and features that you like to the new branch. When the commits look complete to you, push the branch to your repository fork:</p><pre><code class="language-bash">$ git push -u origin yn-somefeature</code></pre><p>This makes your changes visible in your repository. After that, you can navigate to <a href="https://github.com/LCSB-BioCore/COBREXA.jl/pulls">GitHub&#39;s pull request page</a>, where you should immediately see a big green button that helps you to create a pull request for this branch. Read the section below for precise details and guidelines on submitting the pull requests.</p><h2 id="How-to-submit-a-pull-request-(PR)-with-your-modification/enhancement?"><a class="docs-heading-anchor" href="#How-to-submit-a-pull-request-(PR)-with-your-modification/enhancement?">How to submit a pull request (PR) with your modification/enhancement?</a><a id="How-to-submit-a-pull-request-(PR)-with-your-modification/enhancement?-1"></a><a class="docs-heading-anchor-permalink" href="#How-to-submit-a-pull-request-(PR)-with-your-modification/enhancement?" title="Permalink"></a></h2><ol><li><strong>Make a fork of the repository</strong>, commit the modifications in a <strong>separate branch</strong> and push the branch to your fork.</li><li>Make a pull request where you describe the motivation and expected outcome for the users. Specifically, consider any possible incompatibilities, and the necessity to increment the version number after your changes are applied. Label your pull request with a <a href="https://gitmoji.dev/">semantic emoji</a> in the title to indicate what it addresses.</li><li>After submitting the pull request, verify that all status checks (tests, documentation) are passing. Make sure any new contribution is properly documented and tested (you may want to check with coverage tools, using <code>test --coverage</code> from the Julia packaging shell)</li></ol><p>After you submitted a pull request, a label might be assigned that allows us to track and manage issues and pull requests.</p><h3 id="Code-culture-and-style-recommendations"><a class="docs-heading-anchor" href="#Code-culture-and-style-recommendations">Code culture and style recommendations</a><a id="Code-culture-and-style-recommendations-1"></a><a class="docs-heading-anchor-permalink" href="#Code-culture-and-style-recommendations" title="Permalink"></a></h3><p>Follow basic rules for software maintainability and extensibility:</p><ul><li>Do not reimplement functionality that is available in other packages, unless the reimplementation is either trivial and short, or there is a grave need to do so because the other implementations are deficient in some manner.</li><li>Try to keep the function names and interfaces consistent with ecosystem standards and the other functions in the package. Consistency reduces the amount of surprise on the user side, thus lowers the need to reach for documentation, and in turn makes the software much easier and faster to use.</li><li>Code less. Shorter code is almost always better unless demonstrated otherwise, e.g. with a benchmark. Avoid repetitive boilerplate (there should be ways to generate it, if needed).</li><li>Keep the functionality &quot;open&quot; and composable. In particular, avoid all unnecessarily opaque and leaky abstractions (common in object-oriented programming).</li><li>Avoid producing lots of &quot;informative&quot; text side-output by default, unless that is what the user asked for.</li><li>Adhere to the code formatting rules defined by <a href="https://github.com/domluna/JuliaFormatter.jl">JuliaFormatter</a>. We usually have a bot running that checks all PRs and reports whether the code is properly formatted.</li></ul><p>Follow the common rules for making easily mergable and reviewable PRs:</p><ul><li>Create one PR for each logical &quot;feature&quot; you want to merge. If your change is more complex and contains multiple &quot;stages&quot;, open multiple PRs.</li><li>Keep the test coverage reasonably high.</li><li>If you commit many small, partial changes in a PR, you may help us save energy by prefixing your commit names with <code>[skip ci]</code>, which deactivates the CI trigger on that commit. With each skipped CI, you save a few watt-hours of energy. Testing just the &quot;final&quot; commit of the pull-request branch is sufficient.</li></ul><h2 id="For-developers:-What-is-the-expected-branch-management/workflow?"><a class="docs-heading-anchor" href="#For-developers:-What-is-the-expected-branch-management/workflow?">For developers: What is the expected branch management/workflow?</a><a id="For-developers:-What-is-the-expected-branch-management/workflow?-1"></a><a class="docs-heading-anchor-permalink" href="#For-developers:-What-is-the-expected-branch-management/workflow?" title="Permalink"></a></h2><p>The workflow is based on <a href="https://docs.gitlab.com/ee/topics/gitlab_flow.html">GitLab flow</a>, i.e., a <code>master</code> branch with <code>feature</code> branches being merged into the <code>master</code> branch. Depending on your access rights, you may open the <code>feature</code> branch in this repository, on in your fork.</p><p>The guidelines can be summarized as such:</p><ul><li>when making a contribution, create one new branch and open one new PR for each new independent feature or bugfix</li><li>do not push to another branch unless it is your own</li><li>try to get a review before merging unless the change is trivial and non-impacting</li><li>consider prefixing your branch names with your initials, so that one can easily see who owns which branch (e.g. <code>ad-somefeature</code> would be committed by Arthur Dent)</li></ul></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="../functions/">« Function reference</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> on <span class="colophon-date" title="Wednesday 4 August 2021 13:35">Wednesday 4 August 2021</span>. Using Julia version 1.6.0.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
+$ git fetch origin                    # fetches the refs from your repo</code></pre><p>In the above code, change <code>yourUsername</code> is your GitHub username.</p><p>When the renaming is done, start a new branch at <code>upstream/master</code>. In the code snippet, substitute <code>yn</code> for your initials (Your Name here) and give the new feature a better name than <code>somefeature</code>:</p><pre><code class="language-bash">$ git checkout -b yn-somefeature origin/master</code></pre><p>Commit any changes and features that you like to the new branch. When the commits look complete to you, push the branch to your repository fork:</p><pre><code class="language-bash">$ git push -u origin yn-somefeature</code></pre><p>This makes your changes visible in your repository. After that, you can navigate to <a href="https://github.com/LCSB-BioCore/COBREXA.jl/pulls">GitHub&#39;s pull request page</a>, where you should immediately see a big green button that helps you to create a pull request for this branch. Read the section below for precise details and guidelines on submitting the pull requests.</p><h2 id="How-to-submit-a-pull-request-(PR)-with-your-modification/enhancement?"><a class="docs-heading-anchor" href="#How-to-submit-a-pull-request-(PR)-with-your-modification/enhancement?">How to submit a pull request (PR) with your modification/enhancement?</a><a id="How-to-submit-a-pull-request-(PR)-with-your-modification/enhancement?-1"></a><a class="docs-heading-anchor-permalink" href="#How-to-submit-a-pull-request-(PR)-with-your-modification/enhancement?" title="Permalink"></a></h2><ol><li><strong>Make a fork of the repository</strong>, commit the modifications in a <strong>separate branch</strong> and push the branch to your fork.</li><li>Make a pull request where you describe the motivation and expected outcome for the users. Specifically, consider any possible incompatibilities, and the necessity to increment the version number after your changes are applied. Label your pull request with a <a href="https://gitmoji.dev/">semantic emoji</a> in the title to indicate what it addresses.</li><li>After submitting the pull request, verify that all status checks (tests, documentation) are passing. Make sure any new contribution is properly documented and tested (you may want to check with coverage tools, using <code>test --coverage</code> from the Julia packaging shell)</li></ol><p>After you submitted a pull request, a label might be assigned that allows us to track and manage issues and pull requests.</p><h3 id="Code-culture-and-style-recommendations"><a class="docs-heading-anchor" href="#Code-culture-and-style-recommendations">Code culture and style recommendations</a><a id="Code-culture-and-style-recommendations-1"></a><a class="docs-heading-anchor-permalink" href="#Code-culture-and-style-recommendations" title="Permalink"></a></h3><p>Follow basic rules for software maintainability and extensibility:</p><ul><li>Do not reimplement functionality that is available in other packages, unless the reimplementation is either trivial and short, or there is a grave need to do so because the other implementations are deficient in some manner.</li><li>Try to keep the function names and interfaces consistent with ecosystem standards and the other functions in the package. Consistency reduces the amount of surprise on the user side, thus lowers the need to reach for documentation, and in turn makes the software much easier and faster to use.</li><li>Code less. Shorter code is almost always better unless demonstrated otherwise, e.g. with a benchmark. Avoid repetitive boilerplate (there should be ways to generate it, if needed).</li><li>Keep the functionality &quot;open&quot; and composable. In particular, avoid all unnecessarily opaque and leaky abstractions (common in object-oriented programming).</li><li>Avoid producing lots of &quot;informative&quot; text side-output by default, unless that is what the user asked for.</li><li>Adhere to the code formatting rules defined by <a href="https://github.com/domluna/JuliaFormatter.jl">JuliaFormatter</a>. We usually have a bot running that checks all PRs and reports whether the code is properly formatted.</li></ul><p>Follow the common rules for making easily mergable and reviewable PRs:</p><ul><li>Create one PR for each logical &quot;feature&quot; you want to merge. If your change is more complex and contains multiple &quot;stages&quot;, open multiple PRs.</li><li>Keep the test coverage reasonably high.</li><li>If you commit many small, partial changes in a PR, you may help us save energy by prefixing your commit names with <code>[skip ci]</code>, which deactivates the CI trigger on that commit. With each skipped CI, you save a few watt-hours of energy. Testing just the &quot;final&quot; commit of the pull-request branch is sufficient.</li></ul><h2 id="For-developers:-What-is-the-expected-branch-management/workflow?"><a class="docs-heading-anchor" href="#For-developers:-What-is-the-expected-branch-management/workflow?">For developers: What is the expected branch management/workflow?</a><a id="For-developers:-What-is-the-expected-branch-management/workflow?-1"></a><a class="docs-heading-anchor-permalink" href="#For-developers:-What-is-the-expected-branch-management/workflow?" title="Permalink"></a></h2><p>The workflow is based on <a href="https://docs.gitlab.com/ee/topics/gitlab_flow.html">GitLab flow</a>, i.e., a <code>master</code> branch with <code>feature</code> branches being merged into the <code>master</code> branch. Depending on your access rights, you may open the <code>feature</code> branch in this repository, on in your fork.</p><p>The guidelines can be summarized as such:</p><ul><li>when making a contribution, create one new branch and open one new PR for each new independent feature or bugfix</li><li>do not push to another branch unless it is your own</li><li>try to get a review before merging unless the change is trivial and non-impacting</li><li>consider prefixing your branch names with your initials, so that one can easily see who owns which branch (e.g. <code>ad-somefeature</code> would be committed by Arthur Dent)</li></ul></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="../functions/">« Function reference</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> on <span class="colophon-date" title="Wednesday 4 August 2021 13:58">Wednesday 4 August 2021</span>. Using Julia version 1.6.0.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
diff --git a/dev/index.html b/dev/index.html
index b3e154a684f4fe2c866101cc7dc629e15df068bb..1e3c5a32c686b00bec8588e4c4ffeee8bf8a81eb 100644
--- a/dev/index.html
+++ b/dev/index.html
@@ -28,4 +28,4 @@ fluxes = flux_balance_analysis_dict(model, Tulip.Optimizer)</code></pre><p>The v
   &quot;R_O2t&quot;         =&gt; 21.7995
   &quot;R_G6PDH2r&quot;     =&gt; 4.95999
   &quot;R_TALA&quot;        =&gt; 1.49698
-  ⋮               =&gt; ⋮</code></pre><h2 id="Basic-and-quick-start-tutorials"><a class="docs-heading-anchor" href="#Basic-and-quick-start-tutorials">Basic and quick-start tutorials</a><a id="Basic-and-quick-start-tutorials-1"></a><a class="docs-heading-anchor-permalink" href="#Basic-and-quick-start-tutorials" title="Permalink"></a></h2><p>Detailed tutorial content is <a href="tutorials/">available here</a>.</p><ul><li><a href="tutorials/1_loading/#Loading-and-converting-model-data">Loading and converting model data</a></li><li><a href="tutorials/2_analysis/#Basic-analysis-of-constraint-based-models">Basic analysis of constraint-based models</a></li><li><a href="tutorials/3_hpc/#Distributed-processing-and-HPC-environments">Distributed processing and HPC environments</a></li><li><a href="tutorials/4_modifying/#Modifying-and-saving-the-models">Modifying and saving the models</a></li></ul><h2 id="Advanced-tutorials"><a class="docs-heading-anchor" href="#Advanced-tutorials">Advanced tutorials</a><a id="Advanced-tutorials-1"></a><a class="docs-heading-anchor-permalink" href="#Advanced-tutorials" title="Permalink"></a></h2><p>Detailed listing of advanced tutorials is <a href="advanced/">available here</a>.</p><ul><li><a href="advanced/1_variants/#Exploring-many-model-variants">Exploring many model variants</a></li><li><a href="advanced/2_custom_model/#Working-with-custom-models">Working with custom models</a></li></ul><h2 id="Example-notebooks-and-workflows"><a class="docs-heading-anchor" href="#Example-notebooks-and-workflows">Example notebooks and workflows</a><a id="Example-notebooks-and-workflows-1"></a><a class="docs-heading-anchor-permalink" href="#Example-notebooks-and-workflows" title="Permalink"></a></h2><p>Detailed notebook content is <a href="notebooks/">available here</a>.</p><ul><li><a href="notebooks/1_loading_converting_saving/#Loading,-converting,-and-saving-models">Loading, converting, and saving models</a></li><li><a href="notebooks/2_finding_balance/#Finding-balance-and-variability-of-constraint-based-models">Finding balance and variability of constraint-based models</a></li><li><a href="notebooks/3_basic_stdmodel_usage/#Basic-usage-of-StandardModel">Basic usage of <code>StandardModel</code></a></li><li><a href="notebooks/4_basic_core_coupled_usage/#Basic-usage-of-CoreModel-and-CoreModelCoupled">Basic usage of <code>CoreModel</code> and <code>CoreModelCoupled</code></a></li><li><a href="notebooks/5_basic_stdmodel_construction/#Model-construction-and-modification">Model construction and modification</a></li><li><a href="notebooks/6_screening/#Exploring-model-variants-with-screen">Exploring model variants with <code>screen</code></a></li><li><a href="notebooks/7_community_model/#Building-and-analysing-a-small-community-model">Building and analysing a small community model</a></li><li><a href="notebooks/8_custom_model/#Using-a-custom-model-data-structure">Using a custom model data structure</a></li></ul><h2 id="Functions-reference"><a class="docs-heading-anchor" href="#Functions-reference">Functions reference</a><a id="Functions-reference-1"></a><a class="docs-heading-anchor-permalink" href="#Functions-reference" title="Permalink"></a></h2><ul><li><a href="functions/#Functions">Functions</a></li><ul><li><a href="functions/#Base-Types">Base Types</a></li><li><a href="functions/#Model-types-and-contents">Model types and contents</a></li><li><a href="functions/#Base-functions">Base functions</a></li><li><a href="functions/#File-I/O-and-serialization">File I/O and serialization</a></li><li><a href="functions/#Model-reconstruction">Model reconstruction</a></li><li><a href="functions/#Analysis-functions">Analysis functions</a></li><li><a href="functions/#Miscellaneous-utilities">Miscellaneous utilities</a></li></ul></ul><h2 id="Contribution-guide"><a class="docs-heading-anchor" href="#Contribution-guide">Contribution guide</a><a id="Contribution-guide-1"></a><a class="docs-heading-anchor-permalink" href="#Contribution-guide" title="Permalink"></a></h2><p>If you wish to contribute code, patches or improvements to <code>COBREXA.jl</code>, please read the basic <a href="howToContribute/">contribution guidelines and hints.</a>.</p><h2 id="Acknowledgements"><a class="docs-heading-anchor" href="#Acknowledgements">Acknowledgements</a><a id="Acknowledgements-1"></a><a class="docs-heading-anchor-permalink" href="#Acknowledgements" title="Permalink"></a></h2><p><code>COBREXA.jl</code> is developed at the Luxembourg Centre for Systems Biomedicine of the University of Luxembourg (<a href="https://wwwen.uni.lu/lcsb">uni.lu/lcsb</a>), cooperating with the Institute for Quantitative and Theoretical Biology at the Heinrich Heine University in Düsseldorf (<a href="https://www.qtb.hhu.de/">qtb.hhu.de</a>).</p><p>The development was supported by European Union&#39;s Horizon 2020 Programme under PerMedCoE project (<a href="https://permedcoe.eu/">permedcoe.eu</a>) agreement no. 951773.</p><img src="https://lcsb-biocore.github.io/COBREXA.jl/stable/assets/cobrexa.svg" alt="COBREXA logo" height="64px" style="height:64px; width:auto">   <img src="https://lcsb-biocore.github.io/COBREXA.jl/stable/assets/unilu.svg" alt="Uni.lu logo" height="64px" style="height:64px; width:auto">   <img src="https://lcsb-biocore.github.io/COBREXA.jl/stable/assets/lcsb.svg" alt="LCSB logo" height="64px" style="height:64px; width:auto">   <img src="https://lcsb-biocore.github.io/COBREXA.jl/stable/assets/hhu.svg" alt="HHU logo" height="64px" style="height:64px; width:auto">   <img src="https://lcsb-biocore.github.io/COBREXA.jl/stable/assets/qtb.svg" alt="QTB logo" height="64px" style="height:64px; width:auto">   <img src="https://lcsb-biocore.github.io/COBREXA.jl/stable/assets/permedcoe.svg" alt="PerMedCoE logo" height="64px" style="height:64px; width:auto"></article><nav class="docs-footer"><a class="docs-footer-nextpage" href="tutorials/">Quickstart tutorials »</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> on <span class="colophon-date" title="Wednesday 4 August 2021 13:35">Wednesday 4 August 2021</span>. Using Julia version 1.6.0.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
+  ⋮               =&gt; ⋮</code></pre><h2 id="Basic-and-quick-start-tutorials"><a class="docs-heading-anchor" href="#Basic-and-quick-start-tutorials">Basic and quick-start tutorials</a><a id="Basic-and-quick-start-tutorials-1"></a><a class="docs-heading-anchor-permalink" href="#Basic-and-quick-start-tutorials" title="Permalink"></a></h2><p>Detailed tutorial content is <a href="tutorials/">available here</a>.</p><ul><li><a href="tutorials/1_loading/#Loading-and-converting-model-data">Loading and converting model data</a></li><li><a href="tutorials/2_analysis/#Basic-analysis-of-constraint-based-models">Basic analysis of constraint-based models</a></li><li><a href="tutorials/3_hpc/#Distributed-processing-and-HPC-environments">Distributed processing and HPC environments</a></li><li><a href="tutorials/4_modifying/#Modifying-and-saving-the-models">Modifying and saving the models</a></li></ul><h2 id="Advanced-tutorials"><a class="docs-heading-anchor" href="#Advanced-tutorials">Advanced tutorials</a><a id="Advanced-tutorials-1"></a><a class="docs-heading-anchor-permalink" href="#Advanced-tutorials" title="Permalink"></a></h2><p>Detailed listing of advanced tutorials is <a href="advanced/">available here</a>.</p><ul><li><a href="advanced/1_variants/#Exploring-many-model-variants">Exploring many model variants</a></li><li><a href="advanced/2_custom_model/#Working-with-custom-models">Working with custom models</a></li></ul><h2 id="Example-notebooks-and-workflows"><a class="docs-heading-anchor" href="#Example-notebooks-and-workflows">Example notebooks and workflows</a><a id="Example-notebooks-and-workflows-1"></a><a class="docs-heading-anchor-permalink" href="#Example-notebooks-and-workflows" title="Permalink"></a></h2><p>Detailed notebook content is <a href="notebooks/">available here</a>.</p><ul><li><a href="notebooks/1_loading_converting_saving/#Loading,-converting,-and-saving-models">Loading, converting, and saving models</a></li><li><a href="notebooks/2_finding_balance/#Finding-balance-and-variability-of-constraint-based-models">Finding balance and variability of constraint-based models</a></li><li><a href="notebooks/3_basic_stdmodel_usage/#Basic-usage-of-StandardModel">Basic usage of <code>StandardModel</code></a></li><li><a href="notebooks/4_basic_core_coupled_usage/#Basic-usage-of-CoreModel-and-CoreModelCoupled">Basic usage of <code>CoreModel</code> and <code>CoreModelCoupled</code></a></li><li><a href="notebooks/5_basic_stdmodel_construction/#Model-construction-and-modification">Model construction and modification</a></li><li><a href="notebooks/6_screening/#Exploring-model-variants-with-screen">Exploring model variants with <code>screen</code></a></li><li><a href="notebooks/7_community_model/#Building-and-analysing-a-small-community-model">Building and analysing a small community model</a></li><li><a href="notebooks/8_custom_model/#Using-a-custom-model-data-structure">Using a custom model data structure</a></li></ul><h2 id="Functions-reference"><a class="docs-heading-anchor" href="#Functions-reference">Functions reference</a><a id="Functions-reference-1"></a><a class="docs-heading-anchor-permalink" href="#Functions-reference" title="Permalink"></a></h2><ul><li><a href="functions/#Functions">Functions</a></li><ul><li><a href="functions/#Base-Types">Base Types</a></li><li><a href="functions/#Model-types-and-contents">Model types and contents</a></li><li><a href="functions/#Base-functions">Base functions</a></li><li><a href="functions/#File-I/O-and-serialization">File I/O and serialization</a></li><li><a href="functions/#Model-reconstruction">Model reconstruction</a></li><li><a href="functions/#Analysis-functions">Analysis functions</a></li><li><a href="functions/#Miscellaneous-utilities">Miscellaneous utilities</a></li></ul></ul><h2 id="Contribution-guide"><a class="docs-heading-anchor" href="#Contribution-guide">Contribution guide</a><a id="Contribution-guide-1"></a><a class="docs-heading-anchor-permalink" href="#Contribution-guide" title="Permalink"></a></h2><p>If you wish to contribute code, patches or improvements to <code>COBREXA.jl</code>, please read the basic <a href="howToContribute/">contribution guidelines and hints.</a>.</p><h2 id="Acknowledgements"><a class="docs-heading-anchor" href="#Acknowledgements">Acknowledgements</a><a id="Acknowledgements-1"></a><a class="docs-heading-anchor-permalink" href="#Acknowledgements" title="Permalink"></a></h2><p><code>COBREXA.jl</code> is developed at the Luxembourg Centre for Systems Biomedicine of the University of Luxembourg (<a href="https://wwwen.uni.lu/lcsb">uni.lu/lcsb</a>), cooperating with the Institute for Quantitative and Theoretical Biology at the Heinrich Heine University in Düsseldorf (<a href="https://www.qtb.hhu.de/">qtb.hhu.de</a>).</p><p>The development was supported by European Union&#39;s Horizon 2020 Programme under PerMedCoE project (<a href="https://permedcoe.eu/">permedcoe.eu</a>) agreement no. 951773.</p><img src="https://lcsb-biocore.github.io/COBREXA.jl/stable/assets/cobrexa.svg" alt="COBREXA logo" height="64px" style="height:64px; width:auto">   <img src="https://lcsb-biocore.github.io/COBREXA.jl/stable/assets/unilu.svg" alt="Uni.lu logo" height="64px" style="height:64px; width:auto">   <img src="https://lcsb-biocore.github.io/COBREXA.jl/stable/assets/lcsb.svg" alt="LCSB logo" height="64px" style="height:64px; width:auto">   <img src="https://lcsb-biocore.github.io/COBREXA.jl/stable/assets/hhu.svg" alt="HHU logo" height="64px" style="height:64px; width:auto">   <img src="https://lcsb-biocore.github.io/COBREXA.jl/stable/assets/qtb.svg" alt="QTB logo" height="64px" style="height:64px; width:auto">   <img src="https://lcsb-biocore.github.io/COBREXA.jl/stable/assets/permedcoe.svg" alt="PerMedCoE logo" height="64px" style="height:64px; width:auto"></article><nav class="docs-footer"><a class="docs-footer-nextpage" href="tutorials/">Quickstart tutorials »</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> on <span class="colophon-date" title="Wednesday 4 August 2021 13:58">Wednesday 4 August 2021</span>. Using Julia version 1.6.0.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
diff --git a/dev/notebooks/1_loading_converting_saving.ipynb b/dev/notebooks/1_loading_converting_saving.ipynb
index afcd0e8828ae4540d20b17d0fb0f7613a7cfee56..dbfd319b1bd81b7db5926d60ce796dcb4ec3ee7d 100644
Binary files a/dev/notebooks/1_loading_converting_saving.ipynb and b/dev/notebooks/1_loading_converting_saving.ipynb differ
diff --git a/dev/notebooks/1_loading_converting_saving/index.html b/dev/notebooks/1_loading_converting_saving/index.html
index d2432f16872874a5e87f950162e69cd5ed5023dc..a472f56e2724fe6d9a5fb396aac91efa5ec0800d 100644
--- a/dev/notebooks/1_loading_converting_saving/index.html
+++ b/dev/notebooks/1_loading_converting_saving/index.html
@@ -223,4 +223,4 @@ sm = convert(StandardModel, m)
 
 open(f -&gt; serialize(f, sm), &quot;myModel.stdmodel&quot;, &quot;w&quot;)</code></pre><p>The models can then be loaded back using <code>deserialize</code>:</p><pre><code class="language-julia">sm2 = deserialize(&quot;myModel.stdmodel&quot;)
 issetequal(metabolites(sm), metabolites(sm2))</code></pre><pre class="documenter-example-output">true</pre><p>This form of loading operation is usually pretty quick:</p><pre><code class="language-julia">t = @elapsed deserialize(&quot;myModel.stdmodel&quot;)
-@info &quot;Deserialization took $t seconds&quot;</code></pre><pre class="documenter-example-output">[ Info: Deserialization took 0.002351943 seconds</pre><p>Notably, large and complicated models with thousands of reactions and annotations can take seconds to decode properly. Serialization allows you to almost completely remove this overhead, and scales well to tens of millions of reactions.</p><hr/><p><em>This page was generated using <a href="https://github.com/fredrikekre/Literate.jl">Literate.jl</a>.</em></p></article><nav class="docs-footer"><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> on <span class="colophon-date" title="Wednesday 4 August 2021 13:35">Wednesday 4 August 2021</span>. Using Julia version 1.6.0.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
+@info &quot;Deserialization took $t seconds&quot;</code></pre><pre class="documenter-example-output">[ Info: Deserialization took 0.002321177 seconds</pre><p>Notably, large and complicated models with thousands of reactions and annotations can take seconds to decode properly. Serialization allows you to almost completely remove this overhead, and scales well to tens of millions of reactions.</p><hr/><p><em>This page was generated using <a href="https://github.com/fredrikekre/Literate.jl">Literate.jl</a>.</em></p></article><nav class="docs-footer"><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> on <span class="colophon-date" title="Wednesday 4 August 2021 13:58">Wednesday 4 August 2021</span>. Using Julia version 1.6.0.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
diff --git a/dev/notebooks/2_finding_balance.ipynb b/dev/notebooks/2_finding_balance.ipynb
index c1f6b7355f00f3af5045bb91e85590540284eef6..2d75678911142f3cdf1f0bee5f6b279b9bf843fe 100644
Binary files a/dev/notebooks/2_finding_balance.ipynb and b/dev/notebooks/2_finding_balance.ipynb differ
diff --git a/dev/notebooks/2_finding_balance/index.html b/dev/notebooks/2_finding_balance/index.html
index b3891e6653e2a35f16056fc1989de3a8ae14f2f6..9ecd1e6b004641379f998dc21d658326d46d9077 100644
--- a/dev/notebooks/2_finding_balance/index.html
+++ b/dev/notebooks/2_finding_balance/index.html
@@ -116,7 +116,7 @@ Number of metabolites: 72
     model,
     OSQP.Optimizer;
     modifications = [
-        change_optimizer_attribute(&quot;verbose&quot;, false), # silence the optimizer (OSQP is very verbose by default)
+        silence, # silence the optimizer (OSQP is very verbose by default)
         change_constraint(&quot;R_EX_glc__D_e&quot;, -12, -12),
     ],
 )</code></pre><pre class="documenter-example-output">Dict{String, Float64} with 95 entries:
@@ -148,7 +148,7 @@ Number of metabolites: 72
     ],
     qp_modifications = [
         change_optimizer(OSQP.Optimizer), # now switch to OSQP (Tulip wouldn&#39;t be able to finish the computation)
-        change_optimizer_attribute(&quot;verbose&quot;, false), # and silence it.
+        silence, # and make it quiet.
     ],
 )</code></pre><pre class="documenter-example-output">95-element Vector{Float64}:
   -0.006231402533094581
@@ -170,4 +170,4 @@ Number of metabolites: 72
  -25.642083259145206
    0.0161569956400718
    0.004729690379188246
-   3.8887743479784547</pre><hr/><p><em>This page was generated using <a href="https://github.com/fredrikekre/Literate.jl">Literate.jl</a>.</em></p></article><nav class="docs-footer"><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> on <span class="colophon-date" title="Wednesday 4 August 2021 13:35">Wednesday 4 August 2021</span>. Using Julia version 1.6.0.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
+   3.8887743479784547</pre><hr/><p><em>This page was generated using <a href="https://github.com/fredrikekre/Literate.jl">Literate.jl</a>.</em></p></article><nav class="docs-footer"><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> on <span class="colophon-date" title="Wednesday 4 August 2021 13:58">Wednesday 4 August 2021</span>. Using Julia version 1.6.0.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
diff --git a/dev/notebooks/3_basic_stdmodel_usage.ipynb b/dev/notebooks/3_basic_stdmodel_usage.ipynb
index a556ad74b44bad37513141f59c22cc7ec8c37f39..4a697f3ffa1baac8ec5c8705433b65f85d904dd1 100644
Binary files a/dev/notebooks/3_basic_stdmodel_usage.ipynb and b/dev/notebooks/3_basic_stdmodel_usage.ipynb differ
diff --git a/dev/notebooks/3_basic_stdmodel_usage/index.html b/dev/notebooks/3_basic_stdmodel_usage/index.html
index 6074cdd3ff4330571fc4a5e5951d92ec0db26169..8467822fb0b63fc2dfb7acce2c63eed69c0b42db 100644
--- a/dev/notebooks/3_basic_stdmodel_usage/index.html
+++ b/dev/notebooks/3_basic_stdmodel_usage/index.html
@@ -178,4 +178,4 @@ Reaction.notes: ---
 Reaction.annotations: ---
 Reaction.objective_coefficient: 0.0
 </pre><pre><code class="language-julia">check_duplicate_reaction(pgm_duplicate, model.reactions; only_metabolites = false) # can also just check if only the metabolites are the same but different stoichiometry is used</code></pre><pre class="documenter-example-output">&quot;PGM&quot;</pre><h2 id="Checking-the-internals-of-StandardModels:-is_mass_balanced"><a class="docs-heading-anchor" href="#Checking-the-internals-of-StandardModels:-is_mass_balanced">Checking the internals of <code>StandardModel</code>s: <code>is_mass_balanced</code></a><a id="Checking-the-internals-of-StandardModels:-is_mass_balanced-1"></a><a class="docs-heading-anchor-permalink" href="#Checking-the-internals-of-StandardModels:-is_mass_balanced" title="Permalink"></a></h2><p>Finally, <a href="../../functions/#COBREXA.is_mass_balanced-Tuple{StandardModel, Reaction}"><code>is_mass_balanced</code></a> can be used to check if a reaction is mass balanced based on the formulas of the reaction equation.</p><pre><code class="language-julia">pgm_duplicate.metabolites = Dict{String,Float64}(&quot;3pg_c&quot; =&gt; 1, &quot;2pg_c&quot; =&gt; -1, &quot;h2o_c&quot; =&gt; 1) # not mass balanced now
-is_bal, extra_atoms = is_mass_balanced(model, pgm_duplicate) # extra_atoms shows which atoms are in excess/deficit</code></pre><pre class="documenter-example-output">(false, Dict(&quot;C&quot; =&gt; 0.0, &quot;P&quot; =&gt; 0.0, &quot;H&quot; =&gt; 2.0, &quot;O&quot; =&gt; 1.0))</pre><hr/><p><em>This page was generated using <a href="https://github.com/fredrikekre/Literate.jl">Literate.jl</a>.</em></p></article><nav class="docs-footer"><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> on <span class="colophon-date" title="Wednesday 4 August 2021 13:35">Wednesday 4 August 2021</span>. Using Julia version 1.6.0.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
+is_bal, extra_atoms = is_mass_balanced(model, pgm_duplicate) # extra_atoms shows which atoms are in excess/deficit</code></pre><pre class="documenter-example-output">(false, Dict(&quot;C&quot; =&gt; 0.0, &quot;P&quot; =&gt; 0.0, &quot;H&quot; =&gt; 2.0, &quot;O&quot; =&gt; 1.0))</pre><hr/><p><em>This page was generated using <a href="https://github.com/fredrikekre/Literate.jl">Literate.jl</a>.</em></p></article><nav class="docs-footer"><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> on <span class="colophon-date" title="Wednesday 4 August 2021 13:58">Wednesday 4 August 2021</span>. Using Julia version 1.6.0.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
diff --git a/dev/notebooks/4_basic_core_coupled_usage/index.html b/dev/notebooks/4_basic_core_coupled_usage/index.html
index d57d1f44e93b7aa069874c132f0f19989cc60052..765f58f6746f3eef84620914bb77baa66f33fd36 100644
--- a/dev/notebooks/4_basic_core_coupled_usage/index.html
+++ b/dev/notebooks/4_basic_core_coupled_usage/index.html
@@ -105,4 +105,4 @@ Number of reactions: 95
 Number of metabolites: 72
 </pre><pre><code class="language-julia">d = flux_balance_analysis_dict(model, Tulip.Optimizer)
 d[&quot;R_BIOMASS_Ecoli_core_w_GAM&quot;]</code></pre><pre class="documenter-example-output">0.8739215022661532</pre><pre><code class="language-julia">dc = flux_balance_analysis_dict(cmodel, Tulip.Optimizer)
-dc[&quot;R_BIOMASS_Ecoli_core_w_GAM&quot;]</code></pre><pre class="documenter-example-output">0.6655856992982552</pre><hr/><p><em>This page was generated using <a href="https://github.com/fredrikekre/Literate.jl">Literate.jl</a>.</em></p></article><nav class="docs-footer"><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> on <span class="colophon-date" title="Wednesday 4 August 2021 13:35">Wednesday 4 August 2021</span>. Using Julia version 1.6.0.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
+dc[&quot;R_BIOMASS_Ecoli_core_w_GAM&quot;]</code></pre><pre class="documenter-example-output">0.6655856992982552</pre><hr/><p><em>This page was generated using <a href="https://github.com/fredrikekre/Literate.jl">Literate.jl</a>.</em></p></article><nav class="docs-footer"><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> on <span class="colophon-date" title="Wednesday 4 August 2021 13:58">Wednesday 4 August 2021</span>. Using Julia version 1.6.0.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
diff --git a/dev/notebooks/5_basic_stdmodel_construction/index.html b/dev/notebooks/5_basic_stdmodel_construction/index.html
index 6f76575bcbc1a03dc7bc740049f8eac2513d0cbe..9934fe9bbf5b0eab679be012637bdc6d1e34eaa9 100644
--- a/dev/notebooks/5_basic_stdmodel_construction/index.html
+++ b/dev/notebooks/5_basic_stdmodel_construction/index.html
@@ -58,4 +58,4 @@ model</code></pre><pre class="documenter-example-output">Metabolic model of type
    â‹…     â‹…     â‹…     â‹…    1.0    â‹…   -1.0  -1.0
 Number of reactions: 8
 Number of metabolites: 4
-</pre><hr/><p><em>This page was generated using <a href="https://github.com/fredrikekre/Literate.jl">Literate.jl</a>.</em></p></article><nav class="docs-footer"><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> on <span class="colophon-date" title="Wednesday 4 August 2021 13:35">Wednesday 4 August 2021</span>. Using Julia version 1.6.0.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
+</pre><hr/><p><em>This page was generated using <a href="https://github.com/fredrikekre/Literate.jl">Literate.jl</a>.</em></p></article><nav class="docs-footer"><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> on <span class="colophon-date" title="Wednesday 4 August 2021 13:58">Wednesday 4 August 2021</span>. Using Julia version 1.6.0.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
diff --git a/dev/notebooks/6_screening.ipynb b/dev/notebooks/6_screening.ipynb
index 50a03d539cead8433e4e67c07633a447be6cc16f..fb9aa797c5c962db1cb4e7e2f9bb441e715f482e 100644
Binary files a/dev/notebooks/6_screening.ipynb and b/dev/notebooks/6_screening.ipynb differ
diff --git a/dev/notebooks/6_screening/index.html b/dev/notebooks/6_screening/index.html
index 3f9238dac1ee793f35709a8bf31a2d2fc1a30158..c281e5d9530375d52c92d05a423c5c21dc95bb25 100644
--- a/dev/notebooks/6_screening/index.html
+++ b/dev/notebooks/6_screening/index.html
@@ -94,4 +94,4 @@ ax = Axis(
 )
 hm = heatmap!(ax, productions[disp_rxns, disp_rxns])
 Colorbar(f[1, 2], hm, label = &quot;Flux [mmol/gDW/h]&quot;)
-f</code></pre><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAyAAAAJYCAIAAAAVFBUnAAAABmJLR0QA/wD/AP+gvaeTAAAgAElEQVR4nOzdeVgT1/4/8DOAElkCgoCCIMgVRRFrvS5QrBgEoVhRe5Vaqv601rqEgqhQxQWrrKJSiWvrgoiK9d6K1YIUI7YqoNatKsjVXnYUREgU2TO/P/K9uTEghmTC+n498/QhZ8585jMI5fPMnDmHommaAAAAAABz1Do6AQAAAIDuBgUWAAAAAMNQYAEAAAAwDAUWAAAAAMNQYAEAAAAwDAUWAAAAAMNQYAEAAAAwDAUWAAAAAMNQYAEAAAAwDAUWAAAAAMNQYAEAAAAwDAUWAAAAAMNQYAEAAAAwDAUWAAAAAMM0OjoBaLOYmJg7d+5YWlp2dCIAANBN5OXlvffee/7+/krGSU9PT09Pb9Mhzs7Ozs7OSp63E0KB1fXcuXMnL/fUoH59GIyZ10gxGI0QYqlBMxsQGJFwYiSzAX3m/slswB6oZ/72Mf6jWGOsyWzAxS43mQ24N3MsswGXTbjBYLS83BpG4qSnp6enRk1ylPcv1OVrNYQQFFjQKVhaWg7q12fTakMGY6bXMvy/eGdWF/hffA+UedmZ2YCbVpcwG7AH6pm/fYz/KL6wYzMbcOPqv5gNeDpmKrMBN/kzmeHm6ApKx5KRUJMc2/AXanN0BSMn7YQwBgsAAACAYSiwAAAAABiGR4QAAADAGJrQTUQkf2eGn5F3Gl3sDhaPx6MoysTEpLq6WtKYl5dHUdS+fftkOi9evJiiqICAgBaDiGlra1tZWc2aNev06dM0TRNCXr16Rb2dnZ2dTARNTU0bG5vNmzc3NDTInCInJ0f6vEVFRRRFRUREyJMGAABAVyQidBMtknMTkW77J6+LFVhiZWVlu3btar1PTU3Njz/+yGKxEhISGhsbm3fIzs6mabqioiIlJWX8+PELFy50d3evra3V0dGhpZiYmHh5eUk+3r9/XyZCWVlZQEDA5s2bN27cqMC1vC0NBUIBAABAJ9ElCyxXV9dt27YJBIJW+vz0009CoTA0NLSsrCwlJeVt3Vgs1tChQ4OCglJTU/l8flBQUFuT0dPTW7p06ZQpU/bu3dvWYxlMAwAAADqPLllgbdy4sbq6eseOHa30iYuLGzJkiL+/f//+/Y8ePfrOmA4ODl5eXgcOHHj9+rUCKQ0ePFggELx48UKBYxlMAwAAADqDLllgWVpafvHFFzt37qyoaHn+jJKSkrS0NG9vbzU1tdmzZ589e7aysvKdYV1cXGpra2/eVGRyucePH/fp00dPT0+BYxlMAwAAoGOJaLqBbpJzE3XfYcddssAihKxfv76hoSEqKqrFvfHx8SKRyNvbmxDi7e1dV1eXmJj4zpimpqaEkNLS0jZlIhAI9uzZc/HiRS6Xq66uLr3L1tZWeoC8ubm5PAFl0qipqal4U4tDygAAADoDmtBt2jo6X1XpqgWWqanpsmXLeDzes2fPmu89evTo8OHDxW/8OTo6mpuby/OUUPz6HkXJ+8aouH7S19dfsWLF0qVLJa8HSogHsEsUFhbKE1YmjdjYWJs3ZWVlyZkhAAAAdIiuWmARQtauXUtRVFhYmEz7jRs3Hj58OGfOHPFHiqLmzJmTkZGRm5vbesCSkhJCyIABA+RMQFw/PXv2bNmyZYcOHWrr8pZyphEYGChzB+uDDz5g5EQAAACgIl24wDIyMvr666/3799fVFQk3R4XF0cICQkJkTyb2759OyHknTex+Hw+i8UaM2ZMm9IwNjbevXu3vb39F198UVdX18aLYCwNAACAzoAmRERoObdu+4CwSxdYhJA1a9awWKwtW7ZIWurr60+ePDlz5kz6Te7u7vHx8a3M4ZmZmZmUlLRkyRItLa22piG+kZaXl/f9998reCVMpAEAANDhRIRukHvDRKOdVN++fQMCAlJTUyUt586dq6io8PHxkenp4+NTUFDQ/CleXV1dbm5uVFSUq6srh8OJjIxULBNXV1cHB4fIyMj6+noFDmcqDQAAAOgMunaBRQhZuXKloaGh5GNcXBybzfb09JTpNmPGDC0tLfHTQzHxEPW+ffu6ubllZmYePnw4JSWFxWIpnMmmTZuKiooOHTrUpqMYTwMAAAA6XBdb7JnL5XK5XOkWXV3d58+fSz4mJSW1eKCOjo5k+cLmQVrx9OlTedIghEydOlXyCLLFDgMHDpR+RtmmNAAAAKAL6WIFFgAAAHRmIkIa5R68LlJpKh0KBRYAAAAwhm5L2dRth7h3gzFYAAAAAJ0NCiwAAAAAhuERIQAAADCGbsuDv278iBAFVpf0e02/0Aqbjs6iNVerOzoDaEmFPZvZgKEVQ5kNCMrrEr99jP8o9j2cwWzAsNXDmA346Tw+swHdzd9nMNoT0f15G5gJ1UTT9XIPcm/qvnO54xEhAAAAAMNQYAEAAAAwDAUWAAAAAMMwBgsAAAAYIyJUI03J31mlyXQg3MFSHI/Ho5pJSUmR2aWurj5w4MC5c+c+fvy4eZDFixdTFBUQENDu6QMAADCPJqSJUHJu3XaIOwos5WVnZ9NS3N3dZXbV1dUlJyfn5ua6uLi8fPlS+tiampoff/yRxWIlJCQ0Nja2e+4AAACgEiiwVE5DQ2PkyJGbNm0qKCjIyHjjReKffvpJKBSGhoaWlZWJb30BAABAN4ACq12JRG8s0BQXFzdkyBB/f//+/fsfPXq0o7ICAABgCt3GrbtCgaVyTU1NDx482Lp165AhQ5ydnSXtJSUlaWlp3t7eampqs2fPPnv2bGVlZcelCQAAwAARTTXQanJuIjmGw5eVlc2bN8/AwEBHR2fq1KkPHjxopTOfz+dwOP369WOz2WPHjj127BhzV9Y2KLCUZWtrKxnPPmHChOa7NDQ07Ozsnj9/fvr0aRaLJdkbHx8vEom8vb0JId7e3nV1dYmJic3jFxYWXnuTUChU9UUBAAB0Bg0NDW5ubo8fP75161Z+fr6hoaGzs3NpaWmLnbOystzd3S0tLe/fv19YWDhz5sx58+Z11AMiTNOgrOzs7GHDWl5RQbyLpunCwsINGzY4Ozv//vvvI0aMEO89evTo8OHD7ezsCCGOjo7m5uZHjx5dunSpTJDU1NSDBw9KtxgZGZGBKrgSAACATub48eN37959+PChpaUlIeTAgQNmZmbbtm3bsWNH886JiYlNTU08Hk9LS4sQsm7duvj4+ISEhPnz57dz2gR3sNoBRVEWFhb79+9vaGgIDQ0VN964cePhw4dz5syR9JkzZ05GRkZubq7M4V988YXMHazRo0e36wUAAAB0kLNnz1pbW9va2oo/6ujocDicpKSkFjtraGhQ1BvPHGma1tDomHtJKLDaCYvFMjU1zc7OFn+Mi4sjhISEhEgeL27fvp0QgqHuAADQpYnkngSriVDvnGj0wYMHNjY20i1Dhw79z3/+U1NT07zzsmXL+vXrx+Vynz17JhAIwsPDCwoKAgMDmbw8uaHAaie1tbUlJSUmJiaEkPr6+pMnT86cOZN+k7u7e3x8PN19lxYHAIBuT0SoRlpNzu2dBdaLFy/09PSkW/T19Wmarqqqat7ZysoqKSnpwoUL/fv319fX37p16+HDhydNmsTk5ckNBZbK0TRdUFDw1VdfVVdX+/r6EkLOnTtXUVHh4+Mj09PHx6egoCA9Pb0DsgQAAOgI169fH/YmHo8n2dv8pkMrtyEyMjKmTJni5eVVXFz84sWLLVu2+Pj4iB8ZtT8MclchyTNjExMTe3v7S5cuievouLg4Npvt6ekp03/GjBlaWlpxcXGTJ09u71wBAAA6gp2dncyI9X79+km+NjAwEAgE0nsFAgFFUfr6+s1Dbdy40cTEhMfjqampEUICAgIuX768evXqBQsWqCb31qDAUhyXy+VyuW3dRQh52+g8HR2d6upqZpIDAADoCrS0tN72Mj4hZMSIEffu3ZNuefTokZWVVZ8+fZp3zs3NtbOzE1dXksPPnj1bVVXVYkGmUnhECAAAAIxpoql6Wl3OreldE41Onz79yZMnklfEXr16xefzp0+f3mJnc3PzR48eSS+a8uDBAzabzWazmbo6+aHAAgAAAAZRtNwbedcgdx8fn5EjRy5atCgvL6+iomLJkiW9evVavXq1eG9KSgpFUZLp2v38/J48eeLn5/f06dPKysodO3acPXv266+/lr6n1W5QYAEAAEAn1atXr19//dXa2nr06NEWFhbPnz9PT083MzNrsfPs2bOTk5Pv3btnZ2dnaWmZkJDwww8/bN68uZ1zFsMYLAAAAOi8TExM3rakoLu7u8xLhe7u7u7u7u2S1zugwAIAAADG0IS8c3Yr6c7dFQqsLmlCn2crDWoZDNhANzEYjRDSi1JnNiAwIokwPAOIv8G9d3dqC3n/r9yN9MzfPsZ/FKsWODAbcKXBd8wGrBQ1MBtwZUEvBqOFbRe8u5N8mgjVQMs7AKmp+/7SYwwWAAAAAMNQYAEAAAAwDAUWAAAAAMMwBgsAAAAYI6LVGmh5qwuR3KO1upxue2HyWLx4MUVRAQEBMu08Ho+iqJycHEnLrVu3DA0NR40aVV5eLm65efOmj4+PhYWFpqZm//79x40bt2nTpoKCApkgYtra2lZWVrNmzTp9+rT0C6XNT0QIKSoqoigqIiKC+QsGAABQMZpQIrk3GoPcu5+ampoff/yRxWIlJCQ0Nja20jMrK8vFxWXw4MGXLl0yMjIihPB4vAkTJujp6Z07d04gENy/fz8gIODkyZNz5syROTY7O5um6YqKipSUlPHjxy9cuNDd3b22lskXAAEAAKCz6bkF1k8//SQUCkNDQ8vKylJSUt7W7ffff3d1dR0+fHhaWpqBgQEh5Nq1a35+fhs2bNizZ4+9vT2LxerXr9+nn3569+7dadOmtRiExWINHTo0KCgoNTWVz+cHBQWp6qoAAACgE+i5BVZcXNyQIUP8/f379+9/9OjRFvvw+XwPD48xY8ZcuHBBT09P3BgVFaWnp/fNN9/IdGaxWOvXr2/9pA4ODl5eXgcOHHj9+rXylwAAANDZ0ITIvxZhN55otIcWWCUlJWlpad7e3mpqarNnzz579mxlZaVMn5SUFE9PTycnp19++UVHR0fcSNM0n893cnLS1NRU7NQuLi61tbU3b95U6gIAAAA6pSaiVk+ry7k1dd86pIe+RRgfHy8Siby9vQkh3t7esbGxiYmJS5cule6zcuVKa2vrpKQk6VpKKBS+fPnybctMysPU1JQQUlpaKmmxtbVtpf+dO3fu3Lkj3fL06VMDHYXPDwAAACrXbSvH1h09enT48OF2dnaEEEdHR3Nz8+ZPCT09PZ88eRIeHi7dKH4HkKL+99bDq1evKClPnz5t/dTNI4gHwksUFhZK98/Ly0t/U1VVlSLXDAAAAO2lJ97BunHjxsOHD0NCQsQfKYqaM2fO9u3bc3NzbWxsJN22bdtmamq6efNmFoslGXGlp6enq6tbVFQk6aajoyOumSIiItauXfvOs5eUlBBCBgwYIGe2M2bMmDFjhnRLSEhI/au3jsoHAACADtcT72DFxcURQkJCQiS3nbZv304IkbmJRVHU/v3758+fv3bt2piYGEkjh8O5cuVKXV2dYmfn8/ksFmvMmDHKXQQAAEBnJKKpRlpdzk1EYx6s7qK+vv7kyZMzZ86k3+Tu7h4fHy89CyghhKKoQ4cOeXt7r1y5ct++feLGwMBAgUCwbds2Bc6emZmZlJS0ZMkSLS0tBi4GAACgk6EJ1UTU5Nww0Wj3ce7cuYqKCh8fH5l2Hx+fgoKC9PR0mXZ1dfVjx47NmDFj+fLlhw8fJoQ4Ojp+9913ISEhXC73/v37dXV1VVVVV65cEU+mJT24SqKuri43NzcqKsrV1ZXD4URGRqrk2gAAAKBz6HEFVlxcHJvN9vT0lGmfMWOGlpaW+OmhDA0NjcTERA8Pj8WLFx8/fpwQwuVyMzIyXrx44eHhwWazhwwZwuVybW1ts7KyTExMpI+1tbWlKKpv375ubm6ZmZmHDx9OSUlhsViqu0AAAADocD1ukHtSUlKL7To6OtXV1eKvuVwul8uV3tu7d+/z589Lt4wdO1ZcbL1N8yBy9hk4cKDMk0oAAICugiZE/r9h3fivXY8rsAAAAEB1REStgZa3uhB13ydp3fbCAAAAADoKCiwAAAAAhqHAAgAAAGAYxmABAAAAY0SEkn8JZ1H3nQcLBVaXdOz8uN+euHV0Fl2bWiPDL6+INJj/3wTjSfY9n8FswBl/LX13p7ao0+/FbEDonPomMfyjWOM1ntmA7st9mQ3YJymL2YDMXnJBTuoib2ZCiWiqkZa7wMJM7gAAAAAgJxRYAAAAAAxDgQUAAADAMIzBAgAAAMY00Wr1Inmriya5R2t1Od32wtokKyvL29vbzMxMU1PTwsLC1dX1xIkTDQ0N06ZNMzY2fv78uXTn69eva2hoUG9nZ2dHCOHxeJIWdXX1gQMHzp079/Hjx5I40h20tbWtrKxmzZp1+vRprJMDAABdGUXLvZHu+xYhCizC4/EcHR2NjY3T0tKEQuGVK1ecnZ0XLVp0/vz5/fv319fX+/r+712S+vr6RYsW2dvbNzQ00P9lYmLi5eUl+Xj//n1J/+zsbJqm6+rqkpOTc3NzXVxcXr58KX12cYeKioqUlJTx48cvXLjQ3d29tra2/a4fAAAAmNbTC6yMjAw/P7/g4ODY2FhbW1vxHazg4OD09HQ2m21mZhYdHX3y5MmzZ8+K+4eGhj569OjQoUMaGm14uqqhoTFy5MhNmzYVFBRkZLTwcjKLxRo6dGhQUFBqaiqfzw8KCmLm8gAAAKAj9PQCKyoqis1mr1u3TqZ9/PjxHA6HELJ48eIpU6YsXbq0qqrqzz//DA8P/+abb9577z2FzygSiVrZ6+Dg4OXldeDAgdevXyt8CgAAgI5CEyIilJxbNx4T09MLLD6f7+TkxGKxWunz/fffv3z50s/Pb9GiRTY2Nhs2bGjrWZqamh48eLB169YhQ4Y4Ozu33tnFxaW2tvbmzZttPQsAAECHExG1Rlpdzk3UfeuQHv0WoUAgEAqFAwcObL2bpaVleHi4r6+vurr6tWvXevfuLf8pbG1tJV9bWVmdOXOm9WKOEGJqakoIKS0tFX+8ePHixYsXpTsUFxfLnwAAAAC0v25bOcqPot79CsOKFSsMDAzc3NzGjRvXpuDiMewikSg/P3/ixInOzs4PHjxo/RDxW4SSrHr37q3zJnV19TblAAAAAO2sR9/B0tPTY7PZhYWF7+xJUVSvXr3adO9K5nALC4v9+/f/61//Cg0NPX78eCudS0pKCCEDBgwQf5w4ceLEiROlO4SEhJCMIsUyAQAAgHbQowssQgiHw0lPT6+trX3nkzvlsVgsU1PT7Ozs1rvx+XwWizVmzBhV5wMAAMC4JppqoOV90tKExZ67q8DAQKFQGBkZKdN+/fp1Pp/P7Llqa2tLSkpMTExa6ZOZmZmUlLRkyRItLS1mzw4AANAOaEKJaHk3GhONdlcODg4xMTHffvutn59fTk5OfX19YWFhWFjYpEmThEIhU2ehabqgoOCrr76qrq6WnrZUoq6uLjc3NyoqytXVlcPhNC/4AAAAoAvp6Y8ICSG+vr5jx47dsWMHh8N5/vy5iYnJsGHDDh486OnpqXxwyVuEJiYm9vb2ly5dmjRpUvMOffr0MTY2fv/99w8fPvzJJ5/IM+4eAAAAOi0UWIQQMmHChFOnTrXe5+nTp23axeVyuVxuKwHf2QEAAKAr6sYP/uSHAgsAAAAY00SrtWWQe7cdqtRtLwwAAACgo6DAAgAAAGAYCiwAAAAAhmEMVpfUK7dU68kfHZ0FdEEaDP/Kq1+9x2xAzP/WUzD9o9gnKYvZgBTTGXbyS+5FM7bKrYhQjXKPrBJ13+HwKLAAAACAMTRNieQusGjM5A4AAAAAckKBBQAAAMAwPCIEAAAAJtEdnUBngDtYiuDxeFQzOjo60ntNTEyqq6slh+Tl5VEUtW/fPuk46enp06ZN69evn6amprW1tb+/f1lZWbteCQAAAKOaaLV6kYacGyYahRZkZ2fTUl69eiW9t6ysbNeuXa0cvmPHDhcXF3t7+9u3bwuFwoSEhKysrNGjRz969EjFiQMAAIBqocBSFVdX123btgkEghb3Xrt2bc2aNRs2bAgLCzM3N9fU1JwwYUJaWlqvXr3mzJkjEonaOVsAAABgEAosVdm4cWN1dfWOHTta3Ltt2zZdXd2goCDpRm1t7dWrV9+7dy85ObldcgQAAACVQIGlKpaWll988cXOnTsrKipkdtE0zefznZyc+vTpI7PLzc2NEMLn89spSwAAAEaJCGkilJxbN35egwJLcba2ttKD3KdNmybTYf369Q0NDVFRUTLtQqFQKBSam5s3j2lhYUFRVGFhoaqSBgAAUCWaUE20mpwbjZncobns7Oxhw4a10sHU1HTZsmU8Hi8gIEC6naZpQghFtfxTJd4rcerUqcTEROkWNTWUxQAAAJ0aCizVWrt27YEDB8LCwlauXClp1NPT09XVLSgoaN5f3Ch9c2vkyJHq6urSfS5dukRIjspSBgAAAGWhwFItIyOjr7/+eseOHbNnz5Y0UhTF4XDS09Nra2tZLJZ0/9TUVEIIh8ORtNja2tra2kr3+fPPP1WcNQAAACgFD5tUbs2aNSwWa8uWLdKNq1evFgqFERER0o3V1dXR0dEjR4708PBo3xwBAACYIaLVGkXqcm7yLwvd5XTbC+s8+vbtGxAQIL41JeHk5BQREbFly5bg4OCioqK6urqsrCxXV9e6urrExESMsgIAgC6KJoQmlNxbt4U/5IqTeYuQoqinT5+22HPlypWGhoYyjYGBgampqXfu3Bk1ahSbzZ47d+7YsWNv374t80AQAAAAuhyMwVIEl8vlcrny79XV1X3+/Hnzni4uLi4uLsznBwAAAB0KBRYAAAAwhqYpES3v7Fa03D27HBRYAAAAwBgRoRrlHrou6r4TjWIMFgAAAADDUGABAAAAMAwFFgAAAADDMAarS/p8Zcmm1XUMBhSIXjMYjRCip6bFbEBgxLjgpcwGvB66j9mAPVDP/O1j/EeREjEbj2SG72U2YElTNbMBzdR1GIy2ObqCqVAiui1jsDDIHQAAAOCd6LaUTZhoFAAAAADkhQILAAAAgGF4RAgAAAAMoug2zG7Vbcdgdc87WDweT7I+oLa2tpWV1axZs06fPk3T737aKz42JyenlT6LFy+mKCogIKDFvVlZWd7e3mZmZpqamhYWFq6uridOnGhoaHhbtIKCgnXr1o0cOVJbW/tvf/vb119/XVHB2GBDAACA9iSiqUaRmpxbNx7k3j0LLLHs7GyapisqKlJSUsaPH79w4UJ3d/fa2lolw9bU1Pz4448sFishIaGxsVFmL4/Hc3R0NDY2TktLEwqFV65ccXZ2XrRo0fnz5wkh69ev19fXlzlk/vz5Z86ciY6OLisrO3HiBJ/Pd3R0fP2a4ReLAAAAoN105wJLjMViDR06NCgoKDU1lc/nBwUFKRnwp59+EgqFoaGhZWVlKSkp0rsyMjL8/PyCg4NjY2NtbW3Fd7CCg4PT09PZbPbbArq6ut64cWPq1Kna2tpjx47dt29fbm7u6dOnlcwTAAAAOkr3L7AkHBwcvLy8Dhw4oOTNobi4uCFDhvj7+/fv3//o0aPSu6Kioths9rp162QOGT9+PIfD8ff3Dw0NFQgE4meXAwcOFO8NDg7W1taWdB48eDAhJD8/X5kkAQAAoAP1oAKLEOLi4lJbW3vz5k2FI5SUlKSlpXl7e6upqc2ePfvs2bOVlZWSvXw+38nJicVitXhsTExMcHCwnp4eTdM0TRcVFbXYTXxXTFxmAQAAdC0immqi1eTcMAarmzA1NSWElJaWKhwhPj5eJBJ5e3sTQry9vevq6hITE8W7BAKBUCiU3JdSzPPnzzds2GBubj5r1ixl4gAAAHQI8USjcm7deKLRnjVNg/gtQopSvF4+evTo8OHD7ezsCCGOjo7m5uZHjx5duvR/az4oE7yhocHb27u8vDw1NbVPnz7ixr179+7Zs0e626BBg8YMU/gkAAAAoHI9q8AqKSkhhAwYMECxw2/cuPHw4cOQkBDxR4qi5syZs3379tzcXBsbGz09PTabXVhYqFhwmqYXLFhw6dKlY8eOOTs7S9o/+eQTJycn6Z5Hjx4ldIZiZwEAAIB20LMKLD6fz2KxxowZo9jhcXFxhJCQkBBJjSV29OjRrVu3EkI4HE56enptbe3bhmG1IiAg4MSJEzwe77PPPpNuNzY2NjY2lm7R1tamXymQPgAAQHvoxg/+5NeDxmBlZmYmJSUtWbJES0uRpebr6+tPnjw5c+ZM+k3u7u7x8fHih4+BgYFCoTAyMlLm2OvXr/P5fEKIlpZWfX198+Dh4eExMTFbt25dsWKFArkBAAB0Ek20WoNIXc6tie62dUi3vTCJurq63NzcqKgoV1dXDofTvPqR07lz5yoqKnx8fGTafXx8CgoK0tPTCSEODg4xMTHffvutn59fTk5OfX19YWFhWFjYpEmThEIhIcTW1rampubSpUsikUgS4fDhw+vWrVu1alVwcLCCFwkAAACdSXcusGxtbSmK6tu3r5ubW2Zm5uHDh1NSUuR8eCc+VsLOzi4uLo7NZnt6esr0nDFjhpaWlvjpISHE19f36tWrpaWlHA5HR0fH0dHx0qVLBw8eFB/o5eW1aNGiTz75RF1dXfK+4fbt28X/lT4jl8tl7BsBAAAA7at7jsHicrkKFyhtPVZHR6e6ulq6ZcKECadOnWqxs5qa2sGDBw8ePCjdeP/+fQXyBAAAgE6rexZYAAAA0CFomsg/fSjdfcfDo8ACAAAAxtCEEsk9dJ0mmMm9G8nJyaHeIicnp6OzAwAAgC6vJ97BGjZsGN2Nb0oCAABAR+uJd7AAAAAAVAoFFgAAADBGRKs1itTl3OQZrVVWVjZv3jwDAwMdHZ2pU6c+eFu9XEQAACAASURBVPCg9f6//PLLpEmTdHV1zc3NAwMDX758ydCVtQ0KLAAAAGASLff2Tg0NDW5ubo8fP75161Z+fr6hoaGzs3Npaenb+u/fv3/u3LmLFy8uLi6+e/du//79f/rpJwYvTX49cQwWAAAAdAnHjx+/e/fuw4cPLS0tCSEHDhwwMzPbtm3bjh07mnfOy8vz9/f/4YcfJMuuBAQEtGe20nAHCwAAADqps2fPWltb29raij/q6OhwOJykpKQWOx86dEhTU9Pb27sdE3wrFFgAAADAGPFEo3Ju73yn/8GDBzY2NtItQ4cO/c9//lNTU9O885UrV+zs7KKioiwtLTU1NYcNG7Znzx4GL61NUGApjsfjURSlrq5eXFws3f7LL7+IZ9USrwAt6SlDR0dHvFckEl28eHHhwoVsNpuiqLy8vPa9DgAAAMaICNVEy7uJCFVVVcV/03/+8x9JtBcvXujp6UnH19fXp2m6qqqq+alLSkoyMzOPHDny448/Pnv2bNmyZStWrIiOjlb5NbcEY7CUxWKxTp48uWrVKknL8ePHtbS0Xr9+LdMzOzt72LBhzSNkZWWFhYX5+PhYWVlt2rRJtekCAAB0Jvn5+Vu3bpVuWbBggZWVlfjr5vNWtjKTpUgkampqio2NHTt2LCHEz88vLS0tPDw8ICBATa297yjhDpaypk+fnpCQIPn4+vXrM2fOeHl5yR/BwcHh4sWLixYtYrPZKkgQAACg8xo1apTMHawFCxZI9hoYGAgEAun+AoGAoih9ff3moQwNDQkhH3zwgaTlgw8+ePHiRX5+vsrSfysUWMr67LPPbt++nZ2dLf545swZQkibCiwAAABo0YgRI3Jzc6VbHj16ZGVl1adPnxY7y7R04MItKLCUNXr0aFtb2+PHj4s/Hj9+3MvLS1tbu2OzAgAA6BA0TZpElJzbO+uf6dOnP3nyRHIX49WrV3w+f/r06S12njlzJiHk2rVrkpaMjAwjI6NBgwYxc21tgQKLAZ999pm4wHr+/Hlqaupnn33WYjdbW1vpQe7Tpk1r3zQBAABUjqapNm2tR/Px8Rk5cuSiRYvy8vIqKiqWLFnSq1ev1atXi/empKRQFHXs2DHxx48++mjy5Mm+vr5//PGHQCCIjY09d+7c5s2b238AFkGBxYjPPvvsr7/+ysjIOHXqlJ6enpubW4vdsrOzaSnnzp2TJ/iWLVt6v+m3335jNH0AAIBOqlevXr/++qu1tfXo0aMtLCyeP3+enp5uZmbWYmeKos6cOePq6urp6WlsbHzgwIEjR44sW7asnXMWw1uEDBg8ePCECRMSEhJu3749e/bsXr16MRh83bp1QUFB0i2hoaGk+i6DpwAAAOi0TExMJPeoZLi7u8uMsmKz2Twej8fjtUtqrUGBxQwfH5/169cLhcKoqChmI6urq6urq0u3UBTVYWP2AAAA3oUm73jw1xOgwGKGt7f3ypUrLSwsHB0dOzoXAACADiOiqSaRvAOQRO8ag6VS4vUN5aHAHOAosJhhZGTU0NDQ0VkAAACAvPLz81esWPHObrt371YgOAqs9iNZq1KitLS0f//+jY2N0sO2xNPXenp6yjkKHgAAABQjz2gtxQosvEWoOC6XS9P0wIEDm++aNm0aTdPOzs7SPZvr378/IURDQ6P5LlRXAAAAKrVz504Gu8nAHSwAAABgDE0o+UdWdexweH9/fwa7yUCBBQAAAMyhyTunD5Xu3F2hwAIAAICeLiMj48iRI3l5eTJrS2dmZioWEAUWAAAA9Gi7du3y8/MbPHjwsGHD5J+7oXUosAAAAIAxdFue+3WSJ4SRkZHR0dGrVq1iMCYKrC7p+BHb6+ecOjoL6HqMSBmzAT2dZzEbEHoIxn8UGTfN+ZOOTqFdPX5+xYfLTCi6LRONtmG0lipVVVV9+eWXzMbENA0AAADQo7m5ud27d4/ZmCiwAAAAoEf7/vvv9+3bl5yc3NjYyFRMPCIEAACAnkg83bcYTdMJCQnq6uqGhoYU9b8Hl0+fPlUsOAosAAAAYAxNCC332PWOHeT++eefqy549y+wFi9efPDgwZUrV+7YsaP53qysrB07dly5cuX58+cmJiZDhw5dtGjRP/7xD8nigOnp6dHR0ZmZmS9fvhw4cODHH3+8bt06Y2Nj8V4ej+fr62tsbPzXX39pa2uLG/Py8qysrPbu3fv555/r6uq+LbERI0bcv39/9erVx44dU7hABgAA6FRomhKJ5J7JvUMHuUdHR6sueDcfg1VTU/Pjjz+yWKyEhITmD1Z5PJ6jo6OxsXFaWppQKLxy5Yqzs/OiRYvOnz8v7rBjxw4XFxd7e/vbt28LhcKEhISsrKzRo0c/evRIOk5ZWdmuXbuan11HR0d6eUETExMvLy/Jx/v376voqgEAAOCdrl69KhKJVBS8mxdYP/30k1AoDA0NLSsrS0lJkd6VkZHh5+cXHBwcGxtra2urqalpYWERHBycnp7OZrMJIdeuXVuzZs2GDRvCwsLMzc01NTUnTJiQlpbWq1evOXPmSP+TuLq6btu2TWbuVwAAAOjMJk6cOGDAgC+//PL8+fN1dXXMBu/mBVZcXNyQIUP8/f379+9/9OhR6V1RUVFsNnvdunUyh4wfP57D4RBCtm3bpqurGxQUJL1XW1t79erV9+7dS05OljRu3Lixurq6xUeQciopKfHw8NDW1h40aJBiq3YDAABAmxQVFYWEhBQUFMyaNatfv36zZ89OSEioqqpiJHh3LrBKSkrS0tK8vb3V1NRmz5599uzZyspKyV4+n+/k5MRisVo8lqZpcYc+ffrI7HJzcxMfLmmxtLT84osvdu7cWVFRoUCeNE37+voGBwcXFxevX78+MDDw+++/VyAOAABAhxNPNCrn1rFjsExNTZctW3bhwoXy8vIDBw6oqaktX77c2NjY1dV19+7dRUVFygTvzgVWfHy8SCTy9vYmhHh7e9fV1SUmJop3CQQCoVA4cODAtx0rFAqFQqG5uXnzXRYWFhRFFRYWSjeuX7++oaEhKipKgTzLysrmz5/v5OSkr6//5ZdfLliwICQkRDJirKqqKu9NtbW1CpwFAAAAWsRms+fOnZuYmFheXp6UlDR48ODQ0FBzc/OxY8eGhoYqFrM7F1hHjx4dPny4nZ0dIcTR0dHc3FzmKaH0RBcyaJpupQPd7A1UcRXM4/GePXvW1jwpivLw8JB89PT0LCkpycvLE388cuSI85vu3LnT1lMAAADAO/Xu3dvDw2P//v3FxcXXrl3jcDjx8fGKheq2BdaNGzcePnw4Z84c8UeKoubMmZORkZGbm0sI0dPTY7PZMnehpOnp6enq6hYUFDTfJW5sfnNr7dq1FEWFhYW1NVU9Pb3evXtLPorngCguLhZ/9Pf3l7mDNWHChLaeAgAAAGTcv3+/+R0TMYqiHBwcIiMjc3JyFAvebQusuLg4QkhISAj1X9u3byeESG5icTicK1euvO1xG0VRb+uQmpoqPlym3cjI6Ouvv96/f39bn9oKBIL6+nrJx7KyMkKImZlZm4IAAAB0BjRNaJqSe+vIVEeOHGlkZDRz5sydO3f+8ccfTU1NDAbvngVWfX39yZMnZ86cSb/J3d09Pj5eXK4GBgYKhcLIyEiZY69fvy4ewL569WqhUBgRESG9t7q6Ojo6euTIkdIP9STWrFnDYrG2bNnSpmxpmpaeQuKXX34ZMGCApaVlm4IAAAB0DvJXVxQhHTnIncfjubi4ZGVlBQQE/P3vfzcwMPjoo48iIiIyMjIaGhqUDN49C6xz585VVFT4+PjItPv4+BQUFKSnpxNCHBwcYmJivv32Wz8/v5ycnPr6+sLCwrCwsEmTJgmFQkKIk5NTRETEli1bgoODi4qK6urqsrKyXF1dxYPl1dRa+Nb17ds3ICBAfItLfkZGRkePHr169apAIDh48GBcXNymTZs0NLr/JPsAAAAdaMWKFYmJiSUlJbm5uT/88MOMGTOys7PXrl3r6Oior6/v4uLy7bffKhy8exZYcXFxbDbb09NTpn3GjBlaWlrip4eEEF9f36tXr5aWlnI4HB0dHUdHx0uXLh08eFByYGBgYGpq6p07d0aNGiV+xWDs2LG3b9+2tbV926lXrlxpaGjYpmzV1NTEpd6AAQNCQkLCw8O/+uqrNkUAAAAAhQ0ZMuSLL76Ii4v7z3/+U1hYeOzYsSlTply6dGnTpk0Kx+yet0mSkpJabNfR0amurpZumTBhwqlTp1oJ5eLi4uLi8ra9XC6Xy+VKt+jq6j5//rzFzi0uOBgdHS1eC+nChQutpAEAAAAqlZeX99t//fvf/9bR0VHmrbLuWWABAABAh6BpQrdhsWeV5vJuOTk5kqKqsLDQ2NjYyclp+fLlTk5Oo0ePVldXVzgyCiwAAABgDt2WsqlDCyxjY+Py8nJra2snJ6dNmzZNnDjRxsaGqeCKF1gikSg5OZnP54tnkzI3N+dwOB4eHi2O/gYAAADoVMrLy7W0tGxtbYcPHz58+HBm399XsMDKzs729vb+888/xR8piqJpeseOHfb29qdOnRo6dChzGQIAAAAw7+nTp+KHgwkJCWvXrtXU1Bw/fvzEiRMnTpzo4OCgo6OjTHBF7jY9ffqUw+EIhcLY2NhHjx7V1NS8fv360aNHsbGxAoGAw+GIp8oEAAAA6LRMTExmz54dGxt79+7dioqKxMTEv//97xcuXPjoo4/09fXHjh0bEBCgcHBF7mCFh4dbWVn9+uuv2trakkYbGxsbG5uFCxdOmTIlLCwsJiZG4ZzgnT77f9mbVjNZxQpErxmMRgjRU9NiNiAwYlzwUmYDXg/dx2zAHqhn/vYx/qNIiZiNRzLD9zIbsKSp+t2d2sJMXan7KzI2R1cQMoWRUDRNidowyL0jJxqVpq+v//HHH3/88cc0TWdmZkZERPz88883b97csWOHYgEVKbB+/vnnEydOSFdXEtra2jt37vTx8UGBBQAAAF1CY2PjrVu3xI8Lr1y5UllZSQgxNjaeOHGiwjEVKbCKi4vfe++9t+0dPXp0WxfjAwAAAGhnkgkarl27Jp4m09zc3MPD48MPP5w0adKwYcOUCa5IgaWjo1NeXj5w4MAW95aVlSk5LgwAAABA1SZNmkQIGTx48Jw5cz788MMPP/xw8ODBTAVXpMCaMGHC3r17Q0NDW9y7d+9eZWY+BQAAgK6LbsvIqo6dZ/T48eOTJk0yNTVVRXBF3iIMCAiIiIgICQmpra2Vbq+pqQkJCYmMjFy1ahVD6anQzZs3fXx8LCwsNDU1+/fvP27cuE2bNhUUFEg68Hg8iqJycnKaH7t48eLmizGnpaVRFHX69Om3nbGgoGDdunUjR47U1tb+29/+9vXXX1dUVDB1OQAAAJ0CTbVt6zhz584VV1evX7/+7bffEhMTT5069fvvv79+zcCrJ4rcwXJxcYmIiAgKCoqJiXFycrKwsKBpurCw8MqVK0KhMDIyksPhKJ+ZSvF4PH9//yVLlpw7d87GxubVq1dpaWmbNm26cOFCZmam8vHXr1/P4/GqqqqkG+fPn19WVrZz504nJ6eHDx8uXLjwwoULt2/f1tLqAq/8AAAAdD+1tbVBQUEHDhyQvmfEYrG++uqriIgIFoulcGQFJxpds2aNg4NDdHQ0n89/+fIlIURXV5fD4axevdrJyUnhbNrHtWvX/Pz8Nm7cKFklm8ViffrppzNmzBCvu6wirq6u/v7+4rcvx44du2/fvokTJ54+fXr+/PmqOykAAAC0iKbp6dOnX7p0ycvLy8XFxdTUlKbpkpISPp+/e/fu7OzslJQUilLwHpsiBVZ5ebmRkZGTk5OTkxNN0wKBgKIoNpstSeL48eOfffaZYgm1g6ioKD09vW+++UamncVirV+/Xvn4/v7+3333HSFE/A0xMzMTv1YZHBws3U08ki4/P1/8cfXq1ceOHbtz585XX33F5/MXLFjA4/GUTwYAAABadPr06YyMjN9//11m7Pjy5cszMjLc3Nz+9a9/ffLJJ4oFV2QM1pQpU168eCH+mqIofX19PT09SXV1+PDhefPmKZZNO6Bpms/nOzk5aWpqqugUMTExwcHBenp6NE3TNP22SStSUlLIf8ssSW6+vr6rV69+8eIFqisAAOiSaEI3UXJuHTvK/cSJExs2bGjxzTwHB4f169cfP35c4eCK3MEqKiqaOnXqxYsX2Wy2zK69e/euWLHCw8ND4YRUTSgUvnz50szMrGPTeP78+YYNG8zNzWfNmiVpLCsr+/zzz2WmNXvy5MmTJ0+kWyorK/V7tVOeAAAA3dWtW7ciIiLetnfGjBn79im+WIUiBdavv/7K4XA8PDwuXLggPeVVTEzMypUrZ86cefLkSYUTUjWapsl/H96JvXr1SldXV/KxtLS0f//+Ks2hoaHB29u7vLw8NTW1T58+knaKotzd3WU6X7t2LT4+XrpFR0dHn7F5OgAAAHqosrKyQYMGvW3voEGDlFlbWZFHhO+//35KSsqff/45ffr0mpoacWNERMTKlSu9vb1PnTrVu3dvhRNSNT09PV1dXenHdjo6OuJneeHh4XIGUVNTExdq0kQiESFEXV299WNpml6wYMGlS5eOHDni7Owsvatv377NH1zOmzcv9U329vZy5gkAAABvU1NT08p4IRaLpcx8DQq+RThhwoTz58+7u7vPnDkzKSkpPDx88+bN8+fPP3To0DsrjI5FURSHw/ntt9/q6uoUHoZlaGgoEokqKyv79u0raXz+/Ll4V+vHBgQEnDhxgsfjNX8PoFcvPPkDAIAujm7L/KEdO9MoIS3OdskIBQssQsjEiRN//vlnT0/PESNGPHnyZMmSJfv27VP4bcb2FBgY+PPPP2/btk3hdwbFU1FcunRJegTVxYsXtbW133//fUKIlpZWfX198wPDw8NjYmK2bt26YsUKxU4NAADQmdGEastM7h1cNtja2qoosiIFlqTcMzU1DQ8PX7lypaenp7+//6NHjyR9lFwiUaUcHR2/++47f3//p0+fLl26dMiQITU1Nffv3xe/1idPjSheCdLX17d3794TJ06srq5OSEiIi4vbunWreFCara1tTU3NpUuXJk2apKb2f89hDx8+vG7dulWrVsnM1wAAAADtLzY2VnXBFSmwmpd758+fP3/+vHRL8yFKnQqXyx0/fvzOnTs9PDzKysrYbLaZmZmDg0NUVJSJiYl0T5mLHTFixP3799XU1JKTk0NDQwMCAvLz83v16mVnZ3fkyJHPP/9c3M3Ly2vRokWffPJJZWWlZB6s7du3i/8r/kJsxYoVmJEBAACg/XG5XNUFV6TAUmnF127Gjh3b+vwWXC63lW+9lpZWaGjo21a8VlNTO3jw4MGDB6Ub79+/38rpoqOjVTqPPAAAALQbRQoslVZ8AAAA0IWJCGmSe2SVSJWZyG3atGkttrNYLBsbm8WLF0vPCi4nRaZpAAAAAOg2amtrnz17lpyc/OTJE4FA8OTJk+Tk5GfPnpWWlu7bt8/e3v7mzZttjYkCCwAAAHq0bdu2mZubP378ODs7+/fff8/Ozv73v/9tZmbG4/EKCwtdXFw2btzY1pgosAAAAKBHW7p0aVhYmJWVlaRl8ODB4eHhy5Yt09bWDg8Pz8jIaGtMxefBAgAAAGhBp55IoAV37941MjKSaTQyMrp79y4hxNLSsqGhoa0xcQcLAAAAmENTbds6AUtLy927d8s08ng8S0tLQsijR4/s7OzaGhN3sAAAAKBH27x589y5cy9evOjm5mZkZFReXp6SknL16tWTJ08SQnbt2qXA+isosAAAAKBH8/b2NjY2DgkJ2bJli3ip4vHjx1+8eHHy5MmEkJiYGD09vbbGVLbAysjIOHLkSF5enkAgkG7PzMxUMjIAAABA+5g8efLkyZNpmn7x4oWBgYH0unkKVFdEyQJr165dfn5+gwcPHjZsmPg5JQAAAPRodFumD+3Q4fBXr151cHCQLBlMCKEoytDQkJHgSg1yj4yMjI6OfvLkyfnz50++iZHk2gGPx6MoSrJ8dfNdYtra2lZWVrNmzTp9+rT0MostHl5UVERRVEREhDynbj0+AAAAqMjEiRMHDBjw5Zdfnj9/vq6ujtngShVYVVVVX375JVOpdE7Z2dk0TVdUVKSkpIwfP37hwoXu7u61tbVdJT4AAAC0qKioKCQkpKCgYNasWf369Zs9e3ZCQkJVVRUjwZUqsNzc3O7du8dIHp0ci8UaOnRoUFBQamoqn88PCgrqWvEBAABAhqmp6bJlyy5cuFBeXn7gwAE1NbXly5cbGxu7urru3r27qKhImeBKFVjff//9vn37kpOTGxsblYnThTg4OHh5eR04cOD169ddMT4AAIDK0XJvnQObzZ47d25iYmJ5eXlSUtLgwYNDQ0PNzc3Hjh0bGhqqWEylCiw7O7tff/31o48+YrFYJiYm/aUoE7aTc3Fxqa2tVWDdx04SHwAAQIVoQkSUvFunqbHEevfu7eHhsX///uLi4mvXrnE4nPj4eMVCKfUW4eeff67M4V2UqakpIaS0tFTSYmtrq7r4169fz8rKku5QXFxsqsgbowAAACAXiqIcHBwcHBwiIyMVi6BUgRUdHa3M4V2U+C0/6RkysrOzhw0bJvlYVFRkbm7OVPyKiorc3FzpDjU1NQQFFgAAgHJ0dHTe2efVq1eKBVd2otH8/PyoqKjLly9XVFQYGho6OzsHBgZaWFgoGbYzKykpIYQMGDCgfeJ7eHh4eHhIdwgJCaEV/OcGAACA//PNN9+oLrhSBdbDhw8/+OCDhoaGDz74YPTo0WVlZUeOHDlx4sTVq1el7+h0M3w+n8VijRkzpovGBwAAUB2Kpii5l3CWv6cqrF+/XnXBlSqwgoKCxo0bd+LECQMDA3HLixcv5s6dGxgYePbsWSbS63QyMzOTkpKWL1+upaXVFeMDAACoXCcbut4hlHqL8PLly3v37pVUV4QQAwODPXv2XL58WenEOpe6urrc3NyoqChXV1cOh6PwkLeOig8AAACtyM/PX7FihZ2d3YABA+zs7LhcbkFBgTIBlbqD1dDQoK2tLdOoo6PT0NCgTNj2J/Ma4IgRI+7fvy+9q0+fPsbGxu+///7hw4c/+eQT6RHujJxadfEBAACgdaoY8qRUgfX++++HhYV999130o0RERHvv/++MmHbE5fL5XK5bd3Vep+BAwfKs56gPPEBAABA1VQx5EmpAiskJMTDwyM9PX3atGnGxsbl5eXnz5//888/L1y4oExYAAAA6KpEhDS1pXMncPny5Tt37jQf8qTMDSOlCixXV9fk5OSNGzdGRESIRCI1NbVx48ZduHDBxcVFmbAAAAAA7UYVQ56UGuROCHF1dc3IyKiuri4tLa2urs7IyEB1JZGTk0O9RU5OTkdnBwAAAIT8d8iTTKOSQ56UnWhUjMVide/1BxUzbNgweQZjAQAAQAdSxZAnZgosAAAAALGOnT5UAaoY8qRIgSVeu+fVq1etLOKj8No9AAAA0IXRbZlotNM85nF1dXV1da2tra2qqtLX12exWEoGVKTAkqzdo9JFfAAAAADajUAgKCgoEAgE0o1OTk6KRVOkwJKs3aPSRXwAAAAA2kFhYSGXyz137pxIJDtvhMJjqZUagzVw4MCioiL52wEAAAA6m/nz5xcXF8fGxtrY2LQy/KlNlJqmobi4uHmjSCQqKSlRJmynwuPxmk+ykJKSIrNLU1PTxsZm8+bN0nNmSHfQ1ta2srKaNWvW6dOnZcrhGTNmND/F2LFj2/tSAQAAlEbRhGqSe+scY7AyMjJ++eWX5cuXT5kyZcKbFI6p7DxYzV2+fLlv376Mh+1Y2dnZtBR3d3eZXWVlZQEBAZs3b964cWOLx1ZUVKSkpIwfP37hwoXu7u61tbWSDmfOnJEOnpaWRgjx8PBon0sDAADo4aytrfv06cNsTAULLH19fX19fckXElpaWhwOZ+bMmYwm2QXo6ektXbp0ypQpe/fubbEDi8UaOnRoUFBQamoqn88PCgp6W6hjx44RQhYsWKCqXAEAAEBKVFTUxo0b6+vrGYyp4Bgs8SrFoaGhMssVa2lp2draenl5MZBaFzR48OBff/31xYsX0usZyXBwcPDy8jpw4EB4eLiWlpbM3pqamn/+858TJ060trZWcbIAAABACCGenp4sFmvEiBFjxowxMTGhqP/N4xUTE6NYTAULrK1btxJCXr16Jf4CxB4/ftynTx89Pb3Wu7m4uPzzn/+8efPmhx9+KLPrzJkzL1++/H//7/+pKkUAAACV6oLzYKWnp8+ePbuqqqqyslJmkHt7F1hKnrXLsbW1lXw9fvz4zMxMmQ4CgSAhIeHixYtr1qxRV1dvPZqpqSkhpLS0tPmuY8eOaWlpzZ49W+mUAQAAOkYnGbouv2XLlnl7e2/dutXQ0JCpmEoVWH/88ce+ffu+//576cbFixcvX75cmfURO6Hs7Oxhw4a1uEu69lq6dGlERMQ7o4nfIpS+AylWVlaWmpo6d+5cXV1dSWNycvIvv/wi3a2ystIaCz8CAAAwpKCgIDw8XDy4nClKvUW4du3aTz/9VKbx008/XbdunTJhuxbxS4LPnj1btmzZoUOH0tPT33mIeBqLAQMGyLSfOHGisbFRZni7oaGhzZsYf9MBAACgJ5s8eXJubi6zMZUqsDIzM8eNGyfT2OITtG7P2Nh49+7d9vb2X3zxRV1dXeud+Xw+i8UaM2aMTHt8fLyFhQWHw5FuHDdunO+bzMzMGM4eAACgsyorK5s3b56BgYGOjs7UqVMfPHggz1EzZ86kKErOMc0//PBDbGxsWlpaU1OTUrlKUarA0tDQaD7XaFFRUfOHXz0BRVFhYWF5eXkyz0xlZGZmJiUlLVmyROYVwpycnD/++GP+/Pk987sHAADdA0VTlEjujX7Hn7yGhgY3N7fHjx/funUrPz/f0NDQNfnnRwAAIABJREFU2dm5xUHM0k6dOnX58uXevXvLmfN7772Xmprq6uqqqalpYmLSX4qcEZpTagzWpEmT1q1bd+rUKQ2N/4vT2NgYHBzc/OW4HsLV1dXBwSEyMnLJkiUy/651dXX5+flnzpzZsmULh8OJjIyUOTY+Pp5g+isAAAApx48fv3v37sOHDy0tLQkhBw4cMDMz27Zt244dO952SEVFha+vb1hY2OrVq+U8y+eff85IttKUKrA2b97s4OAwfPjwWbNm9e/f/+nTp//617+Ki4szMjKYyq/L2bRpk7u7+6FDh5YuXSpuEY+C79Onj7Gx8fvvv3/48OFPPvlE5jYVTdMJCQlOTk5/+9vfOiBpAACATuns2bPW1taS98l0dHQ4HE5SUlIrBZa/v/+gQYOWLFkif4EVHR3NQK5vUqrAsre3/+233wIDA6Ojo5uamjQ0ND788MOTJ0/a29szlV+H43K5MpOptr5r6tSpkqUGWzlWBkVReXl5SqQJAADQDT148MDGxka6ZejQoUlJSTU1NS2+8pWcnHz8+PGsrCw1NeYXA2wTpQosQsiYMWMuXrxYV1dXVVWlr6+vqanJSFoAAADQJTE60eiLFy9Gjx4t3aKvr0/TdFVVVfMC6+XLl1999dXSpUv//ve/y53B/wgEgoKCAoFAIN3o5OSkQCiifIElJh4UxkgoAAAA6MJoQona0PnBgwf/+Mc/pNvmzJkzZ86c/9tPy5ZgzVskAgMD6+rqQkND5U9WrLCwkMvlnjt3TiSSTb2V07VO2QKroaHhzp07f/31V0NDg3S7KsaLAQAAQDdjbGw8efJk6Zbhw4dLvjYwMJC5pSQQCCiKaj4p6KNHj/bv3x8XF6fAfKHz588vLi6OjY21sbGRWSpHYUoVWIWFhdOmTbt3717zXSiwAAAA4J2MjIxk7mBJGzFihEyZ8ejRIysrq+bPBysrK2manj9//vz58yWNcXFxcXFxycnJ7u7ureSQkZFx//59Zt8zU2oIWHBwcP/+/R89ekQIKSoqunr1qq+v7z/+8Y+ioiKG0gMAAICea/r06U+ePMnOzhZ/fPXqFZ/Pnz59evOeEyZMoN+kra29YMECmqZbr64IIdbW1oyvkqLUHaz09PQLFy6Ih/ebmZmZmZk5OjoePnw4LCxs9+7dDGUILWgionq6saOzaE0nTw+Ygn/oTqhn/qNoP2P4qmvphnd36lDM/kM3EREzg7IJodqy2PM7Z9b28fHZsWPHokWLTpw4oaur6+vr26tXL8n8CykpKR4eHvHx8Uo+N4uKitq4cePevXvln5v0nZT6fhYXFw8ZMoQQoq2tLRQK2Ww2IcTb23vNmjUosAAAAHoiRt8i7NWr16+//rpq1arRo0fX19d/8MEH6enpjC8Z5+npyWKxRowYMWbMGBMTE+m5KmNiYhSLqVSBJRKJxHO4Dxo06OrVqx4eHoSQnJyc5oPwAQAAABRgYmJy7NixFne5u7u38pbfq1ev5DxFenr67Nmzq6qqKisrZQa5d0yBJeHj4zNv3rwVK1Zoamru27fvnQ87AQAAADqJZcuWeXt7b9261dDQkKmYShVYklWNV61aVVpaumfPntevX3t4eOzatYuJ3AAAAABUrqCgIDw8XIH5HVqh1FuEixcvFn+hqakZGxtbXl7+6tWr06dP9+vXj4ncugYej0f9l66u7qhRo7777rvGxkZCyLRp04yNjZ8/fy7d//r16xoaGuJp0MTH5uTkSPbeunXL0NBw1KhR5eXl7XwhAAAADKAJaZJ7U3AWT4ZNnjw5NzeX2ZjKrtRz48YNLy+vfv36iRf9oShKfDeLidy6kuzsbJqmCwsL58+f7+/vv3HjRkLI/v376+vrfX19Jd3q6+sXLVpkb28fFBTUPEhWVpaLi8vgwYMvXbpkZGTUftkDAAD0YD/88ENsbGxaWlpTUxNTMZUqsC5duvTBBx9UVVUtX75cMsps4MCBCo8I6+r09fVXrVrl7Oy8Z88eQoiZmVl0dPTJkyfPnj0r7hAaGvro0aNDhw6JXw6Q9vvvv7u6ug4fPjwtLc3AwKC9UwcAAOip3nvvvdTUVFdXV/HSf/2lKBxTqTFY69atW79+vfhuzZYtW8SNHh4eH330UWRkpDKRuzQbG5v09PTKysq+ffsuXrw4MTFx6dKlH374YWFhYXh4+DfffPPee+/JHCKeNm3s2LE///wzU5P0AwAAgDxUsfyMUgXW7du3z58/L9NoYWHRw2dyz83NZbPZffv2FX/8/vvvR44c6efn9/DhQxsbmw0bNsj0T0lJWbt27aRJk3766SfGZ5IFAABoV3QbJhrtJGOwoqOjGY+pVIHFYrEEAoHM86y8vDxJbdHTCASCw4cPp6enSw+xsrS0DA8P9/X1VVdXv3btWvNZYleuXGltbZ2UlKSpqdm++QIAAKhA5yibOpZSY7AmTZq0ceNG6RFhTU1N3377rYuLi9KJdTG2trYURZmZmR08eDA6OlrywFRsxYoVBgYGbm5u48aNa36sp6fnkydPwsPDW4wcHx/v9qYWV9cGAACANpkxYwaD3WQodQdry5Ytjo6Of/zxx8cff0wI+fbbb5OSkh4/fnzjxg1lwnZF2dnZw4YNe9teiqJ69er1thWOtm3bZmpqunnzZhaL9c0338jsdXR0NDExkW5p/lgWAAAA2iopKYnBbjKUKrDs7e2vXr0aGBi4c+dOQsi3337r7Ox85coV8fLPICeKovbv319XV7d27VoWi+Xv7y+919ra2traWrrl2rVrjfLO/g8AAABv1fy1M6You1TOqFGjLly4UF9fX1lZqaenx2KxGEmrp6Eo6tChQ3V1dStXrmSxWEuXLu3ojAAAABRB0YSSe0XiNgyHV4EFCxbI002xIoyZtQh79+4t8xgL2kpdXf3YsWN1dXXLly/X1NRcuHBhR2cEAADQnR05ckR1wZWdyb25+vr6ffv2MR62J9DQ0EhMTPTw8Fi8ePHx48c7Oh0AAABQkFIF1osXL6RfIaytreXxeNbW1suWLVM6sS6Dy+XSNN3KCHexp0+fnjlz5p3H9u7d+/z5801NTZ999hnzuQIAAEC7UKTAamhoWLt2rb6+vqGhoa6u7jfffEPT9MWLF21tbX19fS0sLJKTkxlPFAAAALoAuo1bN6XIGKzQ0NDIyMgpU6YMHjz48ePHkZGRAoHg4MGDo0aNOnDggKurK+NZAgAAQNfQlkHuKLDekJCQsGfPHsmbbnv27FmxYsWyZct2795NURSj6QEAAAB0PYo8IszPz5ceIeTj40MICQkJQXUFAAAAQBQeg8VmsyUf9fT0CCHGxsaMJQUAAADQXnbv3t28saamRpmX9hScBysnJ6f1lne+VQfKOLFz4PVddh2dBXQ9BoThZaymx49nNiD0EIz/KNKNjcwGnDnIgdmAjGP2kv+iH87bxEyoLjTRqISvr29qaurBgwf79esnbrl3796nn36an5+/d+9exWIqWGDZ2tq23kLTneN7BgAAANCqlJSU+fPnjxo1Kj4+fvLkybt27QoKCho+fPitW7cUjqlIgRUbG6vw+QD+P3t3HtbEtf8P/IyAgCAgKqAIoqCAyrXiBlQLYllcqlar3EqLtqK9XsEiIlZRQbG4AEorta5VEJfWpWq1pVSButStCG6AO4JKi1qBgggB5vfH/G6+04Qkk2SyEN6vh8fHzJycnDA5kw9nznwOAACAVvH397927dqMGTP8/Pzc3NyuX78eERGxdu3a9u3bK1ynIgFWWFiYwq8HAAAAoG2sra0XLlyYm5t77dq1wYMHL1++XJnoiqhiqRwAAABo01pbllGBQPDZZ58FBAT4+vru27evtLT0X//616+//qpMnQiwFJGamkqJMTU1Ze+1traura0VPqWkpISiKJFVGnNzc8ePH9+lSxdDQ0NHR8eIiIiKigq1vhMAAAB+0YRq5vqjJTGWl5fXxo0bk5OTT548+f7771+/fr1fv36+vr7Lly9XuE4EWIorKiqiWWpqath7KyoqvvzySylP37Bhw+jRo//1r3/l5+dXV1fv3bv30qVLgwYNun37toobDgAAAP/n77//vnjx4oIFC5iMnjY2NpmZmevXr1+/fr3CdSLAUhU/P7/ExMSqqqoW9/7222+LFi1avnx5QkKCnZ2doaGhh4fHqVOnDAwMpk2b1tzMfZUBAAAAUEpeXt6gQYPYWyiKWrhw4YULFxSuEwGWqqxYsaK2tnbDhg0t7k1MTOzYsePixYvZG01MTKKioq5fv47VsgEAANTGxMSkxe3u7u4K16lgHiyQycHBYdasWRs3bpw/f37nzp3Zu2iazs7OHjlypLGxsciz/P39CSHZ2dnjxo1TX1sBAAB4QtFypA/VkkSjkyZNkrTr6NGjitWJESzFubq6sie5jx8/XqTAsmXLBAKB+BXc6urq6upqOzs78Trt7e0piiorK1NV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" /><hr/><p><em>This page was generated using <a href="https://github.com/fredrikekre/Literate.jl">Literate.jl</a>.</em></p></article><nav class="docs-footer"><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> on <span class="colophon-date" title="Wednesday 4 August 2021 13:35">Wednesday 4 August 2021</span>. Using Julia version 1.6.0.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
+f</code></pre><img src="data:image/png;base64,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795NURSj6QEAAAB0PYo8IszPz5ceIeTj40MICQkJQXUFAAAAQBQeg8VmsyUf9fT0CCHGxsaMJQUAAADQXnbv3t28saamRpmX9hScBysnJ6f1lne+VQfKOLFz4PVddh2dBXQ9BoThZaymx49nNiD0EIz/KNKNjcwGnDnIgdmAjGP2kv+iH87bxEyoLjTRqISvr29qaurBgwf79esnbrl3796nn36an5+/d+9exWIqWGDZ2tq23kLTneN7BgAAANCqlJSU+fPnjxo1Kj4+fvLkybt27QoKCho+fPitW7cUjqlIgRUbG6vw+QD+P3t3HtbEtf8P/IyAgCAgKqAIoqCAyrXiBlQLYllcqlar3EqLtqK9XsEiIlZRQbG4AEorta5VEJfWpWq1pVSButStCG6AO4JKi1qBgggB5vfH/G6+04Qkk2SyEN6vh8fHzJycnDA5kw9nznwOAACAVvH397927dqMGTP8/Pzc3NyuX78eERGxdu3a9u3bK1ynIgFWWFiYwq8HAAAAoG2sra0XLlyYm5t77dq1wYMHL1++XJnoiqhiqRwAAABo01pbllGBQPDZZ58FBAT4+vru27evtLT0X//616+//qpMnQiwFJGamkqJMTU1Ze+1traura0VPqWkpISiKJFVGnNzc8ePH9+lSxdDQ0NHR8eIiIiKigq1vhMAAAB+0YRq5vqjJTGWl5fXxo0bk5OTT548+f7771+/fr1fv36+vr7Lly9XuE4EWIorKiqiWWpqath7KyoqvvzySylP37Bhw+jRo//1r3/l5+dXV1fv3bv30qVLgwYNun37toobDgAAAP/n77//vnjx4oIFC5iMnjY2NpmZmevXr1+/fr3CdSLAUhU/P7/ExMSqqqoW9/7222+LFi1avnx5QkKCnZ2doaGhh4fHqVOnDAwMpk2b1tzMfZUBAAAAUEpeXt6gQYPYWyiKWrhw4YULFxSuEwGWqqxYsaK2tnbDhg0t7k1MTOzYsePixYvZG01MTKKioq5fv47VsgEAANTGxMSkxe3u7u4K16lgHiyQycHBYdasWRs3bpw/f37nzp3Zu2iazs7OHjlypLGxsciz/P39CSHZ2dnjxo1TX1sBAAB4QtFypA/VkkSjkyZNkrTr6NGjitWJESzFubq6sie5jx8/XqTAsmXLBAKB+BXc6urq6upqOzs78Trt7e0piiorK1NV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" /><hr/><p><em>This page was generated using <a href="https://github.com/fredrikekre/Literate.jl">Literate.jl</a>.</em></p></article><nav class="docs-footer"><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> on <span class="colophon-date" title="Wednesday 4 August 2021 13:58">Wednesday 4 August 2021</span>. Using Julia version 1.6.0.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
diff --git a/dev/notebooks/7_community_model/index.html b/dev/notebooks/7_community_model/index.html
index e0d9ce56e6917176dd8d3c55599e0562ea0b677a..45aff22a0f1ccc4220d7acc6b43b30657586390c 100644
--- a/dev/notebooks/7_community_model/index.html
+++ b/dev/notebooks/7_community_model/index.html
@@ -133,4 +133,4 @@ d = flux_balance_analysis_dict(
     Tulip.Optimizer;
     modifications = [change_optimizer_attribute(&quot;IPM_IterationsLimit&quot;, 1000)],
 )
-d[&quot;community_biomass&quot;] # community μ</code></pre><pre class="documenter-example-output">0.23607110796208797</pre><p>Notice that the growth rate is now above 0! Nutrient sharing saved the day!</p><hr/><p><em>This page was generated using <a href="https://github.com/fredrikekre/Literate.jl">Literate.jl</a>.</em></p></article><nav class="docs-footer"><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> on <span class="colophon-date" title="Wednesday 4 August 2021 13:35">Wednesday 4 August 2021</span>. Using Julia version 1.6.0.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
+d[&quot;community_biomass&quot;] # community μ</code></pre><pre class="documenter-example-output">0.23607110796208797</pre><p>Notice that the growth rate is now above 0! Nutrient sharing saved the day!</p><hr/><p><em>This page was generated using <a href="https://github.com/fredrikekre/Literate.jl">Literate.jl</a>.</em></p></article><nav class="docs-footer"><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> on <span class="colophon-date" title="Wednesday 4 August 2021 13:58">Wednesday 4 August 2021</span>. Using Julia version 1.6.0.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
diff --git a/dev/notebooks/8_custom_model/index.html b/dev/notebooks/8_custom_model/index.html
index c9b60c3ac157b17a0aef2a50d591d468770a73b8..40ba675513928dd6b2f1d353dbd08c9acd01d381 100644
--- a/dev/notebooks/8_custom_model/index.html
+++ b/dev/notebooks/8_custom_model/index.html
@@ -126,4 +126,4 @@ reactions_to_remove .=&gt; screen_variants(
  &quot;Reaction W&quot; =&gt; 0.3044596423819445
  &quot;Reaction X&quot; =&gt; 0.3044596423819445
  &quot;Reaction Y&quot; =&gt; 0.3044596260552588
- &quot;Reaction Z&quot; =&gt; 0.3044596424137387</pre><hr/><p><em>This page was generated using <a href="https://github.com/fredrikekre/Literate.jl">Literate.jl</a>.</em></p></article><nav class="docs-footer"><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> on <span class="colophon-date" title="Wednesday 4 August 2021 13:35">Wednesday 4 August 2021</span>. Using Julia version 1.6.0.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
+ &quot;Reaction Z&quot; =&gt; 0.3044596424137387</pre><hr/><p><em>This page was generated using <a href="https://github.com/fredrikekre/Literate.jl">Literate.jl</a>.</em></p></article><nav class="docs-footer"><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> on <span class="colophon-date" title="Wednesday 4 August 2021 13:58">Wednesday 4 August 2021</span>. Using Julia version 1.6.0.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
diff --git a/dev/notebooks/index.html b/dev/notebooks/index.html
index cea82b2bc42d809ff05512ba8b63d6f103692778..b0fa47234f67758bd7de812adc51bdfe18d3c6aa 100644
--- a/dev/notebooks/index.html
+++ b/dev/notebooks/index.html
@@ -1,2 +1,2 @@
 <!DOCTYPE html>
-<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>Examples and notebooks · COBREXA.jl</title><link href="https://fonts.googleapis.com/css?family=Lato|Roboto+Mono" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.0/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.0/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.0/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.11.1/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL=".."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="../assets/documenter.js"></script><script src="../siteinfo.js"></script><script src="../../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/documenter-dark.css" data-theme-name="documenter-dark" data-theme-primary-dark/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="../assets/themeswap.js"></script><link href="../assets/favicon.ico" rel="icon" type="image/x-icon"/></head><body><div id="documenter"><nav class="docs-sidebar"><a class="docs-logo" href="../"><img class="docs-light-only" src="../assets/logo.svg" alt="COBREXA.jl logo"/><img class="docs-dark-only" src="../assets/logo-dark.svg" alt="COBREXA.jl logo"/></a><div class="docs-package-name"><span class="docs-autofit">COBREXA.jl</span></div><form class="docs-search" action="../search/"><input class="docs-search-query" id="documenter-search-query" name="q" type="text" placeholder="Search docs"/></form><ul class="docs-menu"><li><a class="tocitem" href="../">Home</a></li><li><a class="tocitem" href="../tutorials/">Quickstart tutorials</a></li><li><a class="tocitem" href="../advanced/">Advanced tutorials</a></li><li class="is-active"><a class="tocitem" href>Examples and notebooks</a></li><li><a class="tocitem" href="../functions/">Function reference</a></li><li><a class="tocitem" href="../howToContribute/">How to contribute</a></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><nav class="breadcrumb"><ul class="is-hidden-mobile"><li class="is-active"><a href>Examples and notebooks</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href>Examples and notebooks</a></li></ul></nav><div class="docs-right"><a class="docs-edit-link" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/master/docs/src/notebooks.md" title="Edit on GitHub"><span class="docs-icon fab"></span><span class="docs-label is-hidden-touch">Edit on GitHub</span></a><a class="docs-settings-button fas fa-cog" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-sidebar-button fa fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a></div></header><article class="content" id="documenter-page"><h1 id="Notebooks-and-example-workflows"><a class="docs-heading-anchor" href="#Notebooks-and-example-workflows">Notebooks and example workflows</a><a id="Notebooks-and-example-workflows-1"></a><a class="docs-heading-anchor-permalink" href="#Notebooks-and-example-workflows" title="Permalink"></a></h1><ul><li><a href="1_loading_converting_saving/#Loading,-converting,-and-saving-models">Loading, converting, and saving models</a></li><ul><li><a href="1_loading_converting_saving/#Loading-models">Loading models</a></li><li><a href="1_loading_converting_saving/#Using-the-generic-interface-to-access-model-details">Using the generic interface to access model details</a></li><li><a href="1_loading_converting_saving/#Converting-between-model-types">Converting between model types</a></li><li><a href="1_loading_converting_saving/#Saving-and-exporting-models">Saving and exporting models</a></li></ul><li><a href="2_finding_balance/#Finding-balance-and-variability-of-constraint-based-models">Finding balance and variability of constraint-based models</a></li><ul><li><a href="2_finding_balance/#Optimization-solvers-in-COBREXA">Optimization solvers in <code>COBREXA</code></a></li><li><a href="2_finding_balance/#Flux-balance-analysis-(FBA)">Flux balance analysis (FBA)</a></li><li><a href="2_finding_balance/#Modifications">Modifications</a></li><li><a href="2_finding_balance/#Flux-variability-analysis-(FVA)">Flux variability analysis (FVA)</a></li><li><a href="2_finding_balance/#Parsimonious-flux-balance-analysis-(pFBA)">Parsimonious flux balance analysis (pFBA)</a></li></ul><li><a href="3_basic_stdmodel_usage/#Basic-usage-of-StandardModel">Basic usage of <code>StandardModel</code></a></li><ul><li><a href="3_basic_stdmodel_usage/#Loading-a-model">Loading a model</a></li><li><a href="3_basic_stdmodel_usage/#Basic-analysis">Basic analysis</a></li><li><a href="3_basic_stdmodel_usage/#Inspecting-the-flux-solution:-atom_exchange">Inspecting the flux solution: <code>atom_exchange</code></a></li><li><a href="3_basic_stdmodel_usage/#Inspecting-the-flux-solution:-metabolite_fluxes">Inspecting the flux solution: <code>metabolite_fluxes</code></a></li><li><a href="3_basic_stdmodel_usage/#Internals-of-StandardModel">Internals of <code>StandardModel</code></a></li><li><a href="3_basic_stdmodel_usage/#Genes,-Reactions,-and-Metabolites"><code>Gene</code>s, <code>Reaction</code>s, and <code>Metabolite</code>s</a></li><li><a href="3_basic_stdmodel_usage/#Checking-the-internals-of-StandardModels:-annotation_index">Checking the internals of <code>StandardModel</code>s: <code>annotation_index</code></a></li><li><a href="3_basic_stdmodel_usage/#Checking-the-internals-of-StandardModels:-check_duplicate_reaction">Checking the internals of <code>StandardModel</code>s: <code>check_duplicate_reaction</code></a></li><li><a href="3_basic_stdmodel_usage/#Checking-the-internals-of-StandardModels:-is_mass_balanced">Checking the internals of <code>StandardModel</code>s: <code>is_mass_balanced</code></a></li></ul><li><a href="4_basic_core_coupled_usage/#Basic-usage-of-CoreModel-and-CoreModelCoupled">Basic usage of <code>CoreModel</code> and <code>CoreModelCoupled</code></a></li><ul><li><a href="4_basic_core_coupled_usage/#Loading-a-CoreModel">Loading a <code>CoreModel</code></a></li><li><a href="4_basic_core_coupled_usage/#Basic-analysis-on-CoreModel">Basic analysis on <code>CoreModel</code></a></li><li><a href="4_basic_core_coupled_usage/#Structure-of-CoreModel">Structure of <code>CoreModel</code></a></li><li><a href="4_basic_core_coupled_usage/#CoreModelCoupled-adds-coupling-constraints-to-CoreModel"><code>CoreModelCoupled</code> adds coupling constraints to <code>CoreModel</code></a></li></ul><li><a href="5_basic_stdmodel_construction/#Model-construction-and-modification">Model construction and modification</a></li><ul><li><a href="5_basic_stdmodel_construction/#Model-construction">Model construction</a></li><li><a href="5_basic_stdmodel_construction/#Modifying-existing-models">Modifying existing models</a></li></ul><li><a href="6_screening/#Exploring-model-variants-with-screen">Exploring model variants with <code>screen</code></a></li><ul><li><a href="6_screening/#Preparing-the-functions">Preparing the functions</a></li><li><a href="6_screening/#Knocking-out-single-reactions">Knocking out single reactions</a></li><li><a href="6_screening/#Knocking-out-reaction-combinations">Knocking out reaction combinations</a></li></ul><li><a href="7_community_model/#Building-and-analysing-a-small-community-model">Building and analysing a small community model</a></li><ul><li><a href="7_community_model/#Load-the-base-model">Load the base model</a></li><li><a href="7_community_model/#Load-the-models-and-inspect-fba-solutions">Load the models and inspect fba solutions</a></li><li><a href="7_community_model/#Build-a-community-model-of-the-cytochrome-oxidase-knockout-and-the-ATP-synthase-knockout-models">Build a community model of the cytochrome oxidase knockout and the ATP synthase knockout models</a></li><li><a href="7_community_model/#Set-exchange-reaction-bounds-of-community-model-based-on-the-bounds-of-the-individual-models">Set exchange reaction bounds of community model based on the bounds of the individual models</a></li><li><a href="7_community_model/#Add-objective-function-to-community-model">Add objective function to community model`</a></li><li><a href="7_community_model/#Perform-community-FBA">Perform community FBA</a></li><li><a href="7_community_model/#Add-the-enolase-knockout-to-the-community-model">Add the enolase knockout to the community model</a></li><li><a href="7_community_model/#Allow-the-mutants-to-rescue-each-other-by-sharing-pyruvate">Allow the mutants to rescue each other by sharing pyruvate</a></li></ul><li><a href="8_custom_model/#Using-a-custom-model-data-structure">Using a custom model data structure</a></li></ul></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="../advanced/">« Advanced tutorials</a><a class="docs-footer-nextpage" href="../functions/">Function reference »</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> on <span class="colophon-date" title="Wednesday 4 August 2021 13:35">Wednesday 4 August 2021</span>. Using Julia version 1.6.0.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
+<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>Examples and notebooks · COBREXA.jl</title><link href="https://fonts.googleapis.com/css?family=Lato|Roboto+Mono" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.0/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.0/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.0/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.11.1/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL=".."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="../assets/documenter.js"></script><script src="../siteinfo.js"></script><script src="../../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/documenter-dark.css" data-theme-name="documenter-dark" data-theme-primary-dark/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="../assets/themeswap.js"></script><link href="../assets/favicon.ico" rel="icon" type="image/x-icon"/></head><body><div id="documenter"><nav class="docs-sidebar"><a class="docs-logo" href="../"><img class="docs-light-only" src="../assets/logo.svg" alt="COBREXA.jl logo"/><img class="docs-dark-only" src="../assets/logo-dark.svg" alt="COBREXA.jl logo"/></a><div class="docs-package-name"><span class="docs-autofit">COBREXA.jl</span></div><form class="docs-search" action="../search/"><input class="docs-search-query" id="documenter-search-query" name="q" type="text" placeholder="Search docs"/></form><ul class="docs-menu"><li><a class="tocitem" href="../">Home</a></li><li><a class="tocitem" href="../tutorials/">Quickstart tutorials</a></li><li><a class="tocitem" href="../advanced/">Advanced tutorials</a></li><li class="is-active"><a class="tocitem" href>Examples and notebooks</a></li><li><a class="tocitem" href="../functions/">Function reference</a></li><li><a class="tocitem" href="../howToContribute/">How to contribute</a></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><nav class="breadcrumb"><ul class="is-hidden-mobile"><li class="is-active"><a href>Examples and notebooks</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href>Examples and notebooks</a></li></ul></nav><div class="docs-right"><a class="docs-edit-link" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/master/docs/src/notebooks.md" title="Edit on GitHub"><span class="docs-icon fab"></span><span class="docs-label is-hidden-touch">Edit on GitHub</span></a><a class="docs-settings-button fas fa-cog" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-sidebar-button fa fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a></div></header><article class="content" id="documenter-page"><h1 id="Notebooks-and-example-workflows"><a class="docs-heading-anchor" href="#Notebooks-and-example-workflows">Notebooks and example workflows</a><a id="Notebooks-and-example-workflows-1"></a><a class="docs-heading-anchor-permalink" href="#Notebooks-and-example-workflows" title="Permalink"></a></h1><ul><li><a href="1_loading_converting_saving/#Loading,-converting,-and-saving-models">Loading, converting, and saving models</a></li><ul><li><a href="1_loading_converting_saving/#Loading-models">Loading models</a></li><li><a href="1_loading_converting_saving/#Using-the-generic-interface-to-access-model-details">Using the generic interface to access model details</a></li><li><a href="1_loading_converting_saving/#Converting-between-model-types">Converting between model types</a></li><li><a href="1_loading_converting_saving/#Saving-and-exporting-models">Saving and exporting models</a></li></ul><li><a href="2_finding_balance/#Finding-balance-and-variability-of-constraint-based-models">Finding balance and variability of constraint-based models</a></li><ul><li><a href="2_finding_balance/#Optimization-solvers-in-COBREXA">Optimization solvers in <code>COBREXA</code></a></li><li><a href="2_finding_balance/#Flux-balance-analysis-(FBA)">Flux balance analysis (FBA)</a></li><li><a href="2_finding_balance/#Modifications">Modifications</a></li><li><a href="2_finding_balance/#Flux-variability-analysis-(FVA)">Flux variability analysis (FVA)</a></li><li><a href="2_finding_balance/#Parsimonious-flux-balance-analysis-(pFBA)">Parsimonious flux balance analysis (pFBA)</a></li></ul><li><a href="3_basic_stdmodel_usage/#Basic-usage-of-StandardModel">Basic usage of <code>StandardModel</code></a></li><ul><li><a href="3_basic_stdmodel_usage/#Loading-a-model">Loading a model</a></li><li><a href="3_basic_stdmodel_usage/#Basic-analysis">Basic analysis</a></li><li><a href="3_basic_stdmodel_usage/#Inspecting-the-flux-solution:-atom_exchange">Inspecting the flux solution: <code>atom_exchange</code></a></li><li><a href="3_basic_stdmodel_usage/#Inspecting-the-flux-solution:-metabolite_fluxes">Inspecting the flux solution: <code>metabolite_fluxes</code></a></li><li><a href="3_basic_stdmodel_usage/#Internals-of-StandardModel">Internals of <code>StandardModel</code></a></li><li><a href="3_basic_stdmodel_usage/#Genes,-Reactions,-and-Metabolites"><code>Gene</code>s, <code>Reaction</code>s, and <code>Metabolite</code>s</a></li><li><a href="3_basic_stdmodel_usage/#Checking-the-internals-of-StandardModels:-annotation_index">Checking the internals of <code>StandardModel</code>s: <code>annotation_index</code></a></li><li><a href="3_basic_stdmodel_usage/#Checking-the-internals-of-StandardModels:-check_duplicate_reaction">Checking the internals of <code>StandardModel</code>s: <code>check_duplicate_reaction</code></a></li><li><a href="3_basic_stdmodel_usage/#Checking-the-internals-of-StandardModels:-is_mass_balanced">Checking the internals of <code>StandardModel</code>s: <code>is_mass_balanced</code></a></li></ul><li><a href="4_basic_core_coupled_usage/#Basic-usage-of-CoreModel-and-CoreModelCoupled">Basic usage of <code>CoreModel</code> and <code>CoreModelCoupled</code></a></li><ul><li><a href="4_basic_core_coupled_usage/#Loading-a-CoreModel">Loading a <code>CoreModel</code></a></li><li><a href="4_basic_core_coupled_usage/#Basic-analysis-on-CoreModel">Basic analysis on <code>CoreModel</code></a></li><li><a href="4_basic_core_coupled_usage/#Structure-of-CoreModel">Structure of <code>CoreModel</code></a></li><li><a href="4_basic_core_coupled_usage/#CoreModelCoupled-adds-coupling-constraints-to-CoreModel"><code>CoreModelCoupled</code> adds coupling constraints to <code>CoreModel</code></a></li></ul><li><a href="5_basic_stdmodel_construction/#Model-construction-and-modification">Model construction and modification</a></li><ul><li><a href="5_basic_stdmodel_construction/#Model-construction">Model construction</a></li><li><a href="5_basic_stdmodel_construction/#Modifying-existing-models">Modifying existing models</a></li></ul><li><a href="6_screening/#Exploring-model-variants-with-screen">Exploring model variants with <code>screen</code></a></li><ul><li><a href="6_screening/#Preparing-the-functions">Preparing the functions</a></li><li><a href="6_screening/#Knocking-out-single-reactions">Knocking out single reactions</a></li><li><a href="6_screening/#Knocking-out-reaction-combinations">Knocking out reaction combinations</a></li></ul><li><a href="7_community_model/#Building-and-analysing-a-small-community-model">Building and analysing a small community model</a></li><ul><li><a href="7_community_model/#Load-the-base-model">Load the base model</a></li><li><a href="7_community_model/#Load-the-models-and-inspect-fba-solutions">Load the models and inspect fba solutions</a></li><li><a href="7_community_model/#Build-a-community-model-of-the-cytochrome-oxidase-knockout-and-the-ATP-synthase-knockout-models">Build a community model of the cytochrome oxidase knockout and the ATP synthase knockout models</a></li><li><a href="7_community_model/#Set-exchange-reaction-bounds-of-community-model-based-on-the-bounds-of-the-individual-models">Set exchange reaction bounds of community model based on the bounds of the individual models</a></li><li><a href="7_community_model/#Add-objective-function-to-community-model">Add objective function to community model`</a></li><li><a href="7_community_model/#Perform-community-FBA">Perform community FBA</a></li><li><a href="7_community_model/#Add-the-enolase-knockout-to-the-community-model">Add the enolase knockout to the community model</a></li><li><a href="7_community_model/#Allow-the-mutants-to-rescue-each-other-by-sharing-pyruvate">Allow the mutants to rescue each other by sharing pyruvate</a></li></ul><li><a href="8_custom_model/#Using-a-custom-model-data-structure">Using a custom model data structure</a></li></ul></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="../advanced/">« Advanced tutorials</a><a class="docs-footer-nextpage" href="../functions/">Function reference »</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> on <span class="colophon-date" title="Wednesday 4 August 2021 13:58">Wednesday 4 August 2021</span>. Using Julia version 1.6.0.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
diff --git a/dev/search/index.html b/dev/search/index.html
index 59f83ba1270f390d547d89970359ce7833d592ae..614d49067810ad8eb602958df6fdcd7688b57c2a 100644
--- a/dev/search/index.html
+++ b/dev/search/index.html
@@ -1,2 +1,2 @@
 <!DOCTYPE html>
-<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>Search · COBREXA.jl</title><link href="https://fonts.googleapis.com/css?family=Lato|Roboto+Mono" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.0/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.0/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.0/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.11.1/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL=".."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="../assets/documenter.js"></script><script src="../siteinfo.js"></script><script src="../../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/documenter-dark.css" data-theme-name="documenter-dark" data-theme-primary-dark/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="../assets/themeswap.js"></script><link href="../assets/favicon.ico" rel="icon" type="image/x-icon"/></head><body><div id="documenter"><nav class="docs-sidebar"><a class="docs-logo" href="../"><img class="docs-light-only" src="../assets/logo.svg" alt="COBREXA.jl logo"/><img class="docs-dark-only" src="../assets/logo-dark.svg" alt="COBREXA.jl logo"/></a><div class="docs-package-name"><span class="docs-autofit">COBREXA.jl</span></div><form class="docs-search" action><input class="docs-search-query" id="documenter-search-query" name="q" type="text" placeholder="Search docs"/></form><ul class="docs-menu"><li><a class="tocitem" href="../">Home</a></li><li><a class="tocitem" href="../tutorials/">Quickstart tutorials</a></li><li><a class="tocitem" href="../advanced/">Advanced tutorials</a></li><li><a class="tocitem" href="../notebooks/">Examples and notebooks</a></li><li><a class="tocitem" href="../functions/">Function reference</a></li><li><a class="tocitem" href="../howToContribute/">How to contribute</a></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><nav class="breadcrumb"><ul class="is-hidden-mobile"><li class="is-active"><a href>Search</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href>Search</a></li></ul></nav><div class="docs-right"><a class="docs-settings-button fas fa-cog" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-sidebar-button fa fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a></div></header><article><p id="documenter-search-info">Loading search...</p><ul id="documenter-search-results"></ul></article><nav class="docs-footer"><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> on <span class="colophon-date" title="Wednesday 4 August 2021 13:35">Wednesday 4 August 2021</span>. Using Julia version 1.6.0.</p></section><footer class="modal-card-foot"></footer></div></div></div></body><script src="../search_index.js"></script><script src="../assets/search.js"></script></html>
+<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>Search · COBREXA.jl</title><link href="https://fonts.googleapis.com/css?family=Lato|Roboto+Mono" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.0/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.0/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.0/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.11.1/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL=".."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="../assets/documenter.js"></script><script src="../siteinfo.js"></script><script src="../../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/documenter-dark.css" data-theme-name="documenter-dark" data-theme-primary-dark/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="../assets/themeswap.js"></script><link href="../assets/favicon.ico" rel="icon" type="image/x-icon"/></head><body><div id="documenter"><nav class="docs-sidebar"><a class="docs-logo" href="../"><img class="docs-light-only" src="../assets/logo.svg" alt="COBREXA.jl logo"/><img class="docs-dark-only" src="../assets/logo-dark.svg" alt="COBREXA.jl logo"/></a><div class="docs-package-name"><span class="docs-autofit">COBREXA.jl</span></div><form class="docs-search" action><input class="docs-search-query" id="documenter-search-query" name="q" type="text" placeholder="Search docs"/></form><ul class="docs-menu"><li><a class="tocitem" href="../">Home</a></li><li><a class="tocitem" href="../tutorials/">Quickstart tutorials</a></li><li><a class="tocitem" href="../advanced/">Advanced tutorials</a></li><li><a class="tocitem" href="../notebooks/">Examples and notebooks</a></li><li><a class="tocitem" href="../functions/">Function reference</a></li><li><a class="tocitem" href="../howToContribute/">How to contribute</a></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><nav class="breadcrumb"><ul class="is-hidden-mobile"><li class="is-active"><a href>Search</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href>Search</a></li></ul></nav><div class="docs-right"><a class="docs-settings-button fas fa-cog" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-sidebar-button fa fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a></div></header><article><p id="documenter-search-info">Loading search...</p><ul id="documenter-search-results"></ul></article><nav class="docs-footer"><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> on <span class="colophon-date" title="Wednesday 4 August 2021 13:58">Wednesday 4 August 2021</span>. Using Julia version 1.6.0.</p></section><footer class="modal-card-foot"></footer></div></div></div></body><script src="../search_index.js"></script><script src="../assets/search.js"></script></html>
diff --git a/dev/search_index.js b/dev/search_index.js
index 7bc071d85a2ab79ea8965409ccf23ca9deaedfd9..9122b1dc10bea5063fd4b06604a639c0fca258a8 100644
--- a/dev/search_index.js
+++ b/dev/search_index.js
@@ -1,3 +1,3 @@
 var documenterSearchIndex = {"docs":
-[{"location":"tutorials/1_loading/#Loading-and-converting-model-data","page":"Loading and converting model data","title":"Loading and converting model data","text":"","category":"section"},{"location":"tutorials/1_loading/","page":"Loading and converting model data","title":"Loading and converting model data","text":"COBREXA.jl supports several constraint-based model formats that can be loaded with built-in functions. You can load SBML models that are compatible with libsbml, JSON models (such as the ones from CobraPy), and MATLAB-style models (such as those from COBRA Toolbox).","category":"page"},{"location":"tutorials/1_loading/","page":"Loading and converting model data","title":"Loading and converting model data","text":"These formats are commonly available from many model repositories, such as from BIGG, as seen e.g. on the BIGG entry for the core E. Coli entry. Here, we show how to load the basic formats and work with such models.","category":"page"},{"location":"tutorials/1_loading/","page":"Loading and converting model data","title":"Loading and converting model data","text":"tip: Notebook available!\nExample code for this tutorial is available here.","category":"page"},{"location":"tutorials/1_loading/#Loading-models-from-files","page":"Loading and converting model data","title":"Loading models from files","text":"","category":"section"},{"location":"tutorials/1_loading/","page":"Loading and converting model data","title":"Loading and converting model data","text":"For most purposes, you should be able to open and load any model with load_model, which detects the file type from the extension (.xml, .json and .mat), and calls the appropriate loading function. After loading the COBREXA.jl library with using COBREXA and you may load the downloaded model data into Julia as follows:","category":"page"},{"location":"tutorials/1_loading/","page":"Loading and converting model data","title":"Loading and converting model data","text":"my_model = load_model(\"e_coli_core.xml\")","category":"page"},{"location":"tutorials/1_loading/","page":"Loading and converting model data","title":"Loading and converting model data","text":"You should see some information about the loaded model, possibly looking like this:","category":"page"},{"location":"tutorials/1_loading/","page":"Loading and converting model data","title":"Loading and converting model data","text":"Metabolic model of type JSONModel\n\n  [9 ,  1]  =  1.0\n  [51,  1]  =  1.0\n  ⋮\n  [57, 95]  =  1.0\n  [59, 95]  =  -1.0\nNumber of reactions: 95\nNumber of metabolites: 72","category":"page"},{"location":"tutorials/1_loading/","page":"Loading and converting model data","title":"Loading and converting model data","text":"If the file type can not be guessed from the file extension, use any of the specific loader functions:","category":"page"},{"location":"tutorials/1_loading/","page":"Loading and converting model data","title":"Loading and converting model data","text":"load_sbml_model for SBML\nload_json_model for JSON\nload_mat_model for MATLAB models","category":"page"},{"location":"tutorials/1_loading/","page":"Loading and converting model data","title":"Loading and converting model data","text":"All formats may store slightly different information. By default, COBREXA attempts not to discard any information unless a conversion to a more strict format is required. For example, the JSONModel (which is returned by load_json_model) still holds the original JSON structure that you can freely access for any specific purposes:","category":"page"},{"location":"tutorials/1_loading/","page":"Loading and converting model data","title":"Loading and converting model data","text":"jm = load_json_model(\"e_coli_core.json\")\njm.json[\"reactions\"][1]","category":"page"},{"location":"tutorials/1_loading/","page":"Loading and converting model data","title":"Loading and converting model data","text":"That should print out the first reaction in the model in a JSON-style scheme, in our case the process catalyzed by phosphofructokinase:","category":"page"},{"location":"tutorials/1_loading/","page":"Loading and converting model data","title":"Loading and converting model data","text":"Dict{String,Any} with 9 entries:\n  \"name\"               => \"Phosphofructokinase\"\n  \"metabolites\"        => Dict{String,Any}(\"adp_c\"=>1.0,\"atp_c\"=>-1.0,\"f6p_c\"=>…\n  \"lower_bound\"        => 0.0\n  \"id\"                 => \"PFK\"\n  \"notes\"              => Dict{String,Any}(\"original_bigg_ids\"=>Any[\"PFK\"])\n  \"gene_reaction_rule\" => \"b3916 or b1723\"\n  \"upper_bound\"        => 1000.0\n  \"subsystem\"          => \"Glycolysis/Gluconeogenesis\"\n  \"annotation\"         => Dict{String,Any}(\"ec-code\"=>Any[\"2.7.1.11\"],\"metanetx…","category":"page"},{"location":"tutorials/1_loading/","page":"Loading and converting model data","title":"Loading and converting model data","text":"MATModel and SBMLModel (returned by the respective loading functions) contain similar \"full\" model information – you can access the whole MATLAB and SBML data and build on them without any restrictions.","category":"page"},{"location":"tutorials/1_loading/#Converting-to-other-model-types","page":"Loading and converting model data","title":"Converting to other model types","text":"","category":"section"},{"location":"tutorials/1_loading/","page":"Loading and converting model data","title":"Loading and converting model data","text":"Despite JSON and SBML are great for storing and exchanging the models, the data representation is not very suitable for analyzing the model and processing it mathematically.","category":"page"},{"location":"tutorials/1_loading/","page":"Loading and converting model data","title":"Loading and converting model data","text":"COBREXA.jl contains several model types that are much better suited  for supporting the analysis tasks. You can use the following:","category":"page"},{"location":"tutorials/1_loading/","page":"Loading and converting model data","title":"Loading and converting model data","text":"CoreModel, which represents the \"core\" of the optimization problem and the corresponding linear programming problem – a sparse representation of the stoichiometric matrix, flux bounds vectors, objective vector, etc.\nStandardModel (a \"standard\" for COBREXA.jl), which represents a highly flexible, object-like, dictionary-based representation of a model that contains individual Reactions, Metabolites, Genes, and other things.","category":"page"},{"location":"tutorials/1_loading/","page":"Loading and converting model data","title":"Loading and converting model data","text":"note: Conversion limitations and possible data loss\nBecause of the specifics of the format of each model structure, the conversion is not always able to preserve all information from the source data. You may need to check if any complicated and less-standard annotations are still present. If you require them, and either use a more complicated model, or collect them manually.","category":"page"},{"location":"tutorials/1_loading/","page":"Loading and converting model data","title":"Loading and converting model data","text":"A loaded model can be converted to any other model type using the standard Julia conversion:","category":"page"},{"location":"tutorials/1_loading/","page":"Loading and converting model data","title":"Loading and converting model data","text":"cm = convert(CoreModel, jm)","category":"page"},{"location":"tutorials/1_loading/","page":"Loading and converting model data","title":"Loading and converting model data","text":"You can also use a shortcut in load_model to convert the model to the desired format in one command:","category":"page"},{"location":"tutorials/1_loading/","page":"Loading and converting model data","title":"Loading and converting model data","text":"cm = load_model(CoreModel, \"e_coli_core.xml\")","category":"page"},{"location":"tutorials/1_loading/","page":"Loading and converting model data","title":"Loading and converting model data","text":"With CoreModel, the information is easily accessible in matrix form. For example, cm.S now contains the sparse stoichiometric matrix, which you can convert to a dense matrix and manipulate it in Julia as any other matrix:","category":"page"},{"location":"tutorials/1_loading/","page":"Loading and converting model data","title":"Loading and converting model data","text":"Matrix(cm.S)","category":"page"},{"location":"tutorials/1_loading/","page":"Loading and converting model data","title":"Loading and converting model data","text":"...should show you the (relatively empty) stoichiometry of the model.","category":"page"},{"location":"tutorials/1_loading/","page":"Loading and converting model data","title":"Loading and converting model data","text":"StandardModel is more suitable for fine-grained access to individual items of the model, perhaps closer to the SBML-style models. For example, you can view and set reaction bounds as follows:","category":"page"},{"location":"tutorials/1_loading/","page":"Loading and converting model data","title":"Loading and converting model data","text":"sm = load_model(StandardModel, \"e_coli_core.json\")\nsm.reactions[\"PGI\"].ub","category":"page"},{"location":"tutorials/1_loading/","page":"Loading and converting model data","title":"Loading and converting model data","text":"...this prints the upper bound of the reaction (in this case, 1000.0); you can change it the usual way:","category":"page"},{"location":"tutorials/1_loading/","page":"Loading and converting model data","title":"Loading and converting model data","text":"sm.reactions[\"PGI\"].ub = 500","category":"page"},{"location":"tutorials/1_loading/","page":"Loading and converting model data","title":"Loading and converting model data","text":"This change will naturally project to future analysis results.","category":"page"},{"location":"tutorials/#COBREXA-Tutorials","page":"Quickstart tutorials","title":"COBREXA Tutorials","text":"","category":"section"},{"location":"tutorials/","page":"Quickstart tutorials","title":"Quickstart tutorials","text":"Pages = joinpath.(\"tutorials\", filter(x -> endswith(x, \".md\"), readdir(\"tutorials\")))\nDepth = 2","category":"page"},{"location":"advanced/2_custom_model/#Working-with-custom-models","page":"Working with custom models","title":"Working with custom models","text":"","category":"section"},{"location":"advanced/2_custom_model/","page":"Working with custom models","title":"Working with custom models","text":"It may happen that the intuitive representation of your data does not really match what is supported by a given COBRA package. COBREXA.jl attempts to avoid this problem by providing a flexible framework for containing any data structure that can, somehow, represent the constraint-based model.","category":"page"},{"location":"advanced/2_custom_model/","page":"Working with custom models","title":"Working with custom models","text":"The task of having such a polymorphic model definition can be split into 2 separate concerns:","category":"page"},{"location":"advanced/2_custom_model/","page":"Working with custom models","title":"Working with custom models","text":"How to allow the analysis functions to gather the required information from any user-specified model data structure?\nHow to make the reconstruction functions (i.e., reaction or gene deletions) work properly on any data structure?","category":"page"},{"location":"advanced/2_custom_model/","page":"Working with custom models","title":"Working with custom models","text":"To solve the first concern, COBREXA.jl specifies a set of generic accessors that work over the abstract type MetabolicModel. To use your data structure in a model, you just make it a subtype of MetabolicModel and overload the required accessors. The accessors are functions that extract some relevant information, such as stoichiometry and bounds, returning a fixed simple data type that can be further used by COBREXA.  You may see a complete list of accessors here.","category":"page"},{"location":"advanced/2_custom_model/","page":"Working with custom models","title":"Working with custom models","text":"A good solution to the second concern is a slightly more involved, as writing generic data modifiers is notoriously hard. Still, there is support for easily making small changes to the model using the modifications system, with functions such as with_added_reactions and with_changed_bound.","category":"page"},{"location":"advanced/2_custom_model/","page":"Working with custom models","title":"Working with custom models","text":"tip: Notebook available\nA better example of using a custom model structure is available in a separate notebook.","category":"page"},{"location":"advanced/2_custom_model/#Writing-the-generic-accessors","page":"Working with custom models","title":"Writing the generic accessors","text":"","category":"section"},{"location":"advanced/2_custom_model/","page":"Working with custom models","title":"Working with custom models","text":"Let's write a data structure that represents a very small model that contains N metabolites that are converted in a circle through N linear, coupled reactions. (E.g., for N=3, we would have a conversion of metabolites A, B and C ordered as A → B → C → A.) This may be useful for testing purposes; we will use it for a simple demonstration.","category":"page"},{"location":"advanced/2_custom_model/","page":"Working with custom models","title":"Working with custom models","text":"The whole model can thus be specified with a single integer N that represents the length of the reaction cycle:","category":"page"},{"location":"advanced/2_custom_model/","page":"Working with custom models","title":"Working with custom models","text":"struct CircularModel <: MetabolicModel\n    size::Int\nend","category":"page"},{"location":"advanced/2_custom_model/","page":"Working with custom models","title":"Working with custom models","text":"First, define the reactions and metabolites:","category":"page"},{"location":"advanced/2_custom_model/","page":"Working with custom models","title":"Working with custom models","text":"COBREXA.n_reactions(m::CircularModel) = m.size\nCOBREXA.n_metabolites(m::CircularModel) = m.size\n\nCOBREXA.reactions(m::CircularModel) = [\"rxn$i\" for i in 1:n_reactions(m)]\nCOBREXA.metabolites(m::CircularModel) = [\"met$i\" for i in 1:n_metabolites(m)]","category":"page"},{"location":"advanced/2_custom_model/","page":"Working with custom models","title":"Working with custom models","text":"It is useful to re-use the already defined functions, as that improves the code maintainability.","category":"page"},{"location":"advanced/2_custom_model/","page":"Working with custom models","title":"Working with custom models","text":"We can continue with the actual linear model properties:","category":"page"},{"location":"advanced/2_custom_model/","page":"Working with custom models","title":"Working with custom models","text":"function COBREXA.objective(m::CircularModel)\n    c = spzeros(n_reactions(m))\n    c[1] = 1 #optimize the first reaction\n    return c\nend\n\nCOBREXA.bounds(m::CircularModel) = (\n    spzeros(n_reactions(m)), # lower bounds\n    sparse(ones(n_reactions(m))), # upper bounds\n)\n\nfunction COBREXA.stoichiometry(m::CircularModel)\n    nr = n_reactions(m)\n    stoi(i,j) =\n        i == j ? 1.0 :\n        (i % nr + 1) == j  ? -1.0 :\n        0.0\n\n    sparse([stoi(i,j) for i in 1:nr, j in 1:nr])\nend","category":"page"},{"location":"advanced/2_custom_model/","page":"Working with custom models","title":"Working with custom models","text":"You may check that the result now works just as with CoreModel and StandardModel:","category":"page"},{"location":"advanced/2_custom_model/","page":"Working with custom models","title":"Working with custom models","text":"julia> m = CircularModel(5)\nMetabolic model of type CircularModel\n\n  1.0  -1.0    ⋅     ⋅     ⋅\n   ⋅    1.0  -1.0    ⋅     ⋅\n   ⋅     ⋅    1.0  -1.0    ⋅\n   ⋅     ⋅     ⋅    1.0  -1.0\n -1.0    ⋅     ⋅     ⋅    1.0\nNumber of reactions: 5\nNumber of metabolites: 5\n","category":"page"},{"location":"advanced/2_custom_model/","page":"Working with custom models","title":"Working with custom models","text":"This interface is sufficient to run most of the basic analyses, especially the flux balance finding ones:","category":"page"},{"location":"advanced/2_custom_model/","page":"Working with custom models","title":"Working with custom models","text":"julia> flux_balance_analysis_dict(m, Tulip.Optimizer)\nDict{String, Float64} with 5 entries:\n  \"rxn5\" => 1.0\n  \"rxn2\" => 1.0\n  \"rxn1\" => 1.0\n  \"rxn3\" => 1.0\n  \"rxn4\" => 1.0\n","category":"page"},{"location":"advanced/2_custom_model/#Writing-generic-model-modifications","page":"Working with custom models","title":"Writing generic model modifications","text":"","category":"section"},{"location":"advanced/2_custom_model/","page":"Working with custom models","title":"Working with custom models","text":"The custom model structure can also be made compatible with many of the existing variant-generating functions and analysis modifiers.","category":"page"},{"location":"advanced/2_custom_model/","page":"Working with custom models","title":"Working with custom models","text":"The functions prepared for use as \"variants\" in screen, usually prefixed by with_, have their generic variants that only call simpler, overloadable functions for each specific model. This choice is based on the overloading dispatch system of Julia. For example,with_removed_metabolites is implemented very generically by reducing the problem to some specific remove_metabolites functions selected by the dispatch, as follows:","category":"page"},{"location":"advanced/2_custom_model/","page":"Working with custom models","title":"Working with custom models","text":"with_removed_metabolites(args...; kwargs...) =\n    m -> remove_metabolites(m, args...; kwargs...)","category":"page"},{"location":"advanced/2_custom_model/","page":"Working with custom models","title":"Working with custom models","text":"To be able to use with_removed_metabolites in your model, we can just overload the actual inner function. For the simple circular model, the modification might as well look like this:","category":"page"},{"location":"advanced/2_custom_model/","page":"Working with custom models","title":"Working with custom models","text":"COBREXA.remove_metabolites(m::CircularModel, n::Int) =\n    return CircularModel(m.size - n)","category":"page"},{"location":"advanced/2_custom_model/","page":"Working with custom models","title":"Working with custom models","text":"danger: Functions that generate model variants must be pure\nNotice that the function is \"pure\", i.e., does not make any in-place modifications to the original model structure. That property is required for screen and other functions to properly and predictably apply the modifications to the model. To expose potential in-place modifications to your codebase, you should instead overload the \"bang\" counterpart of remove metabolites, called remove_metabolites!.","category":"page"},{"location":"tutorials/2_analysis/#Basic-analysis-of-constraint-based-models","page":"Basic analysis of constraint-based models","title":"Basic analysis of constraint-based models","text":"","category":"section"},{"location":"tutorials/2_analysis/","page":"Basic analysis of constraint-based models","title":"Basic analysis of constraint-based models","text":"COBREXA.jl supports several common analysis methods that are often used for exploring the biological models. The currently supported methods include","category":"page"},{"location":"tutorials/2_analysis/","page":"Basic analysis of constraint-based models","title":"Basic analysis of constraint-based models","text":"Flux balance analysis (FBA), in function flux_balance_analysis\nFlux variability analysis (FVA), in flux_variability_analysis\nFlux sampling by linearized hit-and-run algorithm, in affine_hit_and_run\nParsimonious flux balance analysis (pFBA), in parsimonious_flux_balance_analysis","category":"page"},{"location":"tutorials/2_analysis/","page":"Basic analysis of constraint-based models","title":"Basic analysis of constraint-based models","text":"Other analysis methods are either in development and testing, or may be specified or customized by the user. Implementing new analyses is generally feasible; you may want to watch the COBREXA.jl repository for newly incoming analysis methods.","category":"page"},{"location":"tutorials/2_analysis/","page":"Basic analysis of constraint-based models","title":"Basic analysis of constraint-based models","text":"COBREXA.jl additionally exports several helper functions that may help you in running custom analysis methods:","category":"page"},{"location":"tutorials/2_analysis/","page":"Basic analysis of constraint-based models","title":"Basic analysis of constraint-based models","text":"you can convert all types of MetabolicModels to JuMP.jl models using make_optimization_model, then you may explore and analyze the models independently of COBREXA.jl using the tools provided by JuMP.jl\nthere is a system of analysis modifications that allows you to easily specify various adjustments to the existing analysis methods","category":"page"},{"location":"tutorials/2_analysis/","page":"Basic analysis of constraint-based models","title":"Basic analysis of constraint-based models","text":"tip: Notebook available!\nExamples of running the analysis functions are available here.","category":"page"},{"location":"tutorials/2_analysis/#Optimization-problem-solvers","page":"Basic analysis of constraint-based models","title":"Optimization problem solvers","text":"","category":"section"},{"location":"tutorials/2_analysis/","page":"Basic analysis of constraint-based models","title":"Basic analysis of constraint-based models","text":"For solving most analysis tasks, you need an optimization problem solver that is compatible with JuMP.jl. You may refer to the official list of supported solvers, but we generally recommend to use either of these:","category":"page"},{"location":"tutorials/2_analysis/","page":"Basic analysis of constraint-based models","title":"Basic analysis of constraint-based models","text":"Tulip (pure Julia implementation) for linear problems\nGLPK (based on a C library) for linear and mixed-integer problems\nGurobi (based on an external library, but requires a license that is free for academic use) for linear, mixed-integer and quadratic problems","category":"page"},{"location":"tutorials/2_analysis/","page":"Basic analysis of constraint-based models","title":"Basic analysis of constraint-based models","text":"All solvers can be installed using the Julia package manger.","category":"page"},{"location":"tutorials/2_analysis/#Flux-balance-analysis","page":"Basic analysis of constraint-based models","title":"Flux balance analysis","text":"","category":"section"},{"location":"tutorials/2_analysis/","page":"Basic analysis of constraint-based models","title":"Basic analysis of constraint-based models","text":"The above methods generally accept 2 arguments: the model, and the optimizer.","category":"page"},{"location":"tutorials/2_analysis/","page":"Basic analysis of constraint-based models","title":"Basic analysis of constraint-based models","text":"In particular, having installed e.g. GLPK from the above optimizers, you can run FBA on your favorite E. Coli core model as follows:","category":"page"},{"location":"tutorials/2_analysis/","page":"Basic analysis of constraint-based models","title":"Basic analysis of constraint-based models","text":"using COBREXA\nm = load_model(CoreModel, \"e_coli_core.xml\")\n\nusing GLPK\nopt_model = flux_balance_analysis(m, GLPK.Optimizer)","category":"page"},{"location":"tutorials/2_analysis/","page":"Basic analysis of constraint-based models","title":"Basic analysis of constraint-based models","text":"After a short while (the solver machinery usually needs to get precompiled before the first use), you should get opt_model, which is now an optimized JuMP.jl model. It may print out information like this:","category":"page"},{"location":"tutorials/2_analysis/","page":"Basic analysis of constraint-based models","title":"Basic analysis of constraint-based models","text":"A JuMP Model\nMaximization problem with:\nVariables: 95\nObjective function type: JuMP.GenericAffExpr{Float64,JuMP.VariableRef}\n`JuMP.GenericAffExpr{Float64,JuMP.VariableRef}`-in-`MathOptInterface.EqualTo{Float64}`: 73 constraints\n`JuMP.GenericAffExpr{Float64,JuMP.VariableRef}`-in-`MathOptInterface.LessThan{Float64}`: 192 constraints\nModel mode: AUTOMATIC\nCachingOptimizer state: ATTACHED_OPTIMIZER\nSolver name: GLPK\nNames registered in the model: lbs, mb, ubs, x","category":"page"},{"location":"tutorials/2_analysis/","page":"Basic analysis of constraint-based models","title":"Basic analysis of constraint-based models","text":"From that, you can extract the required information with the JuMP interface, loaded with using JuMP. With that,","category":"page"},{"location":"tutorials/2_analysis/","page":"Basic analysis of constraint-based models","title":"Basic analysis of constraint-based models","text":"objective_value(opt_model) prints roughly 0.87,\nvalue.(opt_model[:x]) prints the vector of individual reaction fluxes.","category":"page"},{"location":"tutorials/2_analysis/","page":"Basic analysis of constraint-based models","title":"Basic analysis of constraint-based models","text":"For convenience, you can get the results nicely formatted without manually getting them out of the optimized models:","category":"page"},{"location":"tutorials/2_analysis/","page":"Basic analysis of constraint-based models","title":"Basic analysis of constraint-based models","text":"flux_balance_analysis_vec works like flux_balance_analysis, but returns the vector of fluxes directly (in the same order as in reactions(m))\nflux_balance_analysis_dict returns a dictionary with the fluxes, keyed by reaction identifier","category":"page"},{"location":"tutorials/2_analysis/#Flux-variability-analysis","page":"Basic analysis of constraint-based models","title":"Flux variability analysis","text":"","category":"section"},{"location":"tutorials/2_analysis/","page":"Basic analysis of constraint-based models","title":"Basic analysis of constraint-based models","text":"FVA is implemented in flux_variability_analysis, which returns the usual matrix of minimal and maximal feasible fluxes for each reaction in the model.","category":"page"},{"location":"tutorials/2_analysis/","page":"Basic analysis of constraint-based models","title":"Basic analysis of constraint-based models","text":"The result of calling flux_variability_analysis(m, GLPK.Optimizer) may look like this (possibly showing minor numeric errors in the GLPK optimizer):","category":"page"},{"location":"tutorials/2_analysis/","page":"Basic analysis of constraint-based models","title":"Basic analysis of constraint-based models","text":"95×2 Array{Float64,2}:\n   0.0            0.0\n   6.00725        6.00725\n   ⋮\n   3.64414e-13    3.17348e-13\n   3.2149         3.2149","category":"page"},{"location":"tutorials/2_analysis/","page":"Basic analysis of constraint-based models","title":"Basic analysis of constraint-based models","text":"You can relax the optimality requirement of the reactions by specifying a wider objective bound, getting a wider range of reaction fluxes, e.g. using gamma_bounds (for COBRA-like γ-bound) and objective_bounds (for a multiplicative bound around the original optimal objective).","category":"page"},{"location":"tutorials/2_analysis/","page":"Basic analysis of constraint-based models","title":"Basic analysis of constraint-based models","text":"As a result, flux_variability_analysis(m, GLPK.Optimizer; bounds=gamma_bounds(0.8)) will return a much less constrained system:","category":"page"},{"location":"tutorials/2_analysis/","page":"Basic analysis of constraint-based models","title":"Basic analysis of constraint-based models","text":"95×2 Array{Float64,2}:\n   0.0            0.0\n   0.754299      10.1285\n   ⋮\n  -4.42865        0.0\n   2.57192        3.2149","category":"page"},{"location":"tutorials/2_analysis/","page":"Basic analysis of constraint-based models","title":"Basic analysis of constraint-based models","text":"You may additionally restrict the analysis to a list of reactions (passing the list as the second argument, see documentation of flux_variability_analysis), or retrieve a dictionary of the resulting fluxes with flux_variability_analysis_dict.","category":"page"},{"location":"tutorials/2_analysis/#Parsimonious-flux-balance-analysis","page":"Basic analysis of constraint-based models","title":"Parsimonious flux balance analysis","text":"","category":"section"},{"location":"tutorials/2_analysis/","page":"Basic analysis of constraint-based models","title":"Basic analysis of constraint-based models","text":"Parsimonious flux balance analysis (pFBA) requires a solver that can handle quadratic problems. Some examples include, e.g. OSQP, Gurobi, Mosek, etc.","category":"page"},{"location":"tutorials/2_analysis/","page":"Basic analysis of constraint-based models","title":"Basic analysis of constraint-based models","text":"Otherwise, the function behaves just like flux_balance_analysis:","category":"page"},{"location":"tutorials/2_analysis/","page":"Basic analysis of constraint-based models","title":"Basic analysis of constraint-based models","text":"parsimonious_flux_balance_analysis(m, OSQP.Optimizer) will return a JuMP.jl model optimized to a slightly more realistic (parsimonious) optimum than plain FBA,\nparsimonious_flux_balance_analysis_vec will return the fluxes in a vector,\nparsimonious_flux_balance_analysis_dict will return a reaction-keyed dictionary.","category":"page"},{"location":"tutorials/2_analysis/#Flux-sampling","page":"Basic analysis of constraint-based models","title":"Flux sampling","text":"","category":"section"},{"location":"tutorials/2_analysis/","page":"Basic analysis of constraint-based models","title":"Basic analysis of constraint-based models","text":"For the affine_hit_and_run, you need a previously optimized and constrained model from another analysis function, such as flux_balance_analysis, or created by make_optimization_model. You may need to carefully choose the number of iterations and sample sizes to match your model; see the documentation of affine_hit_and_run for details.","category":"page"},{"location":"tutorials/2_analysis/","page":"Basic analysis of constraint-based models","title":"Basic analysis of constraint-based models","text":"As an example, you can run the sampling for 100 thousand iterations with:","category":"page"},{"location":"tutorials/2_analysis/","page":"Basic analysis of constraint-based models","title":"Basic analysis of constraint-based models","text":"affine_hit_and_run(100_000, make_optimization_model(m, GLPK.Optimizer))","category":"page"},{"location":"tutorials/2_analysis/","page":"Basic analysis of constraint-based models","title":"Basic analysis of constraint-based models","text":"You should receive a matching flux sample with the (default) 1000 samples in a matrix that may look like this one:","category":"page"},{"location":"tutorials/2_analysis/","page":"Basic analysis of constraint-based models","title":"Basic analysis of constraint-based models","text":"95×1000 Array{Float64,2}:\n   0.0           0.0         …   0.0\n   7.82669       9.38895         3.30653\n   7.13016       4.36813         9.64434\n  -0.290925     -9.3037         -0.0908829\n  24.1294       17.4794          0.0511032\n   ⋮                         ⋱\n -16.243       -37.4763         -5.57301\n   0.0           0.0             0.0\n  -0.310819     -1.20057e-7     -2.13126\n   5.71597e-5    0.00990677      0.692399","category":"page"},{"location":"notebooks/#Notebooks-and-example-workflows","page":"Examples and notebooks","title":"Notebooks and example workflows","text":"","category":"section"},{"location":"notebooks/","page":"Examples and notebooks","title":"Examples and notebooks","text":"Pages = joinpath.(\"notebooks\", filter(x -> endswith(x, \".md\"), readdir(\"notebooks\")))\nDepth = 2","category":"page"},{"location":"notebooks/5_basic_stdmodel_construction/","page":"Model construction and modification","title":"Model construction and modification","text":"EditURL = \"https://github.com/LCSB-BioCore/COBREXA.jl/blob/master/docs/src/notebooks/5_basic_stdmodel_construction.jl\"","category":"page"},{"location":"notebooks/5_basic_stdmodel_construction/#Model-construction-and-modification","page":"Model construction and modification","title":"Model construction and modification","text":"","category":"section"},{"location":"notebooks/5_basic_stdmodel_construction/","page":"Model construction and modification","title":"Model construction and modification","text":"(Image: ) (Image: )","category":"page"},{"location":"notebooks/5_basic_stdmodel_construction/","page":"Model construction and modification","title":"Model construction and modification","text":"COBREXA can load models stored in .mat, .json, and .xml formats; and convert these into StandardModels. However, it is also possible to construct models from scratch, and modify existing models. This will be demonstrated here.","category":"page"},{"location":"notebooks/5_basic_stdmodel_construction/#Model-construction","page":"Model construction and modification","title":"Model construction","text":"","category":"section"},{"location":"notebooks/5_basic_stdmodel_construction/","page":"Model construction and modification","title":"Model construction and modification","text":"In COBREXA, model construction is primarily supported through StandardModels. To begin, create an empty StandardModel.","category":"page"},{"location":"notebooks/5_basic_stdmodel_construction/","page":"Model construction and modification","title":"Model construction and modification","text":"using COBREXA\n\nmodel = StandardModel(\"FirstModel\") # assign model id = \"FirstModel\"","category":"page"},{"location":"notebooks/5_basic_stdmodel_construction/","page":"Model construction and modification","title":"Model construction and modification","text":"Next, genes, metabolites and reactions need to be added to the model.","category":"page"},{"location":"notebooks/5_basic_stdmodel_construction/#Add-genes-to-the-model","page":"Model construction and modification","title":"Add genes to the model","text":"","category":"section"},{"location":"notebooks/5_basic_stdmodel_construction/","page":"Model construction and modification","title":"Model construction and modification","text":"gene_list = [Gene(string(\"g\", num)) for num = 1:8]","category":"page"},{"location":"notebooks/5_basic_stdmodel_construction/","page":"Model construction and modification","title":"Model construction and modification","text":"warning: Warning: Don't accidentally overwrite the generic accessors\nIt may be tempting to call a variable genes, metabolites, or   reactions. However, these names conflict with generic accessors   functions and will create problems downstream.","category":"page"},{"location":"notebooks/5_basic_stdmodel_construction/","page":"Model construction and modification","title":"Model construction and modification","text":"add_genes!(model, gene_list)","category":"page"},{"location":"notebooks/5_basic_stdmodel_construction/#Add-metabolites-to-the-model","page":"Model construction and modification","title":"Add metabolites to the model","text":"","category":"section"},{"location":"notebooks/5_basic_stdmodel_construction/","page":"Model construction and modification","title":"Model construction and modification","text":"metabolite_list = [Metabolite(string(\"m\", num)) for num = 1:4]\n\nmetabolite_list[1].formula = \"C6H12O6\" # can edit metabolites, etc. directly\n\nadd_metabolites!(model, metabolite_list)","category":"page"},{"location":"notebooks/5_basic_stdmodel_construction/#Add-reactions-to-the-model","page":"Model construction and modification","title":"Add reactions to the model","text":"","category":"section"},{"location":"notebooks/5_basic_stdmodel_construction/","page":"Model construction and modification","title":"Model construction and modification","text":"There are two ways to create and add reactions to a model. These are using functions, or macros.","category":"page"},{"location":"notebooks/5_basic_stdmodel_construction/","page":"Model construction and modification","title":"Model construction and modification","text":"r_m1 = Reaction(\"EX_m1\", Dict(\"m1\" => -1.0), :bidirectional) # exchange reaction: m1 <-> (is the same as m1 ↔ nothing)\nr1 = Reaction(\"r1\", Dict(\"m1\" => -1.0, \"m2\" => 1.0), :forward)\nr1.grr = [[\"g1\", \"g2\"], [\"g3\"]] # add some gene reaction rules\nr2 = Reaction(\"r2\", Dict(\"m2\" => -1.0, \"m1\" => 1.0), :backward)\nr3 = Reaction(\"r3\", Dict(\"m2\" => -1.0, \"m3\" => 1.0), :bidirectional)\n\nadd_reactions!(model, [r1, r2, r3, r_m1]) # function approach\n\nm1 = metabolite_list[1]\nm2 = metabolite_list[2]\nm3 = metabolite_list[3]\nm4 = metabolite_list[4]\n\n@add_reactions! model begin # macro approach\n    \"r4\", m2 → m4, 0, 1000\n    \"r_m3\", m3 ↔ nothing, -1000, 1000\n    \"r_m4\", m4 → nothing\n    \"r5\", m4 → m2\nend\n\nmodel.reactions[\"r4\"].grr = [[\"g5\"], [\"g6\", \"g7\"], [\"g8\"]]","category":"page"},{"location":"notebooks/5_basic_stdmodel_construction/","page":"Model construction and modification","title":"Model construction and modification","text":"note: Note: Writing unicode arrows\nThe reaction arrows can be easily written by using the LaTeX completions built into Julia shell (and many Julia-compatible editors). You can type:→ as \\rightarrow (press Tab to complete)\n← as \\leftarrow\n↔ as \\leftrightarrow","category":"page"},{"location":"notebooks/5_basic_stdmodel_construction/","page":"Model construction and modification","title":"Model construction and modification","text":"The constructed model can now be inspected.","category":"page"},{"location":"notebooks/5_basic_stdmodel_construction/","page":"Model construction and modification","title":"Model construction and modification","text":"model","category":"page"},{"location":"notebooks/5_basic_stdmodel_construction/#Modifying-existing-models","page":"Model construction and modification","title":"Modifying existing models","text":"","category":"section"},{"location":"notebooks/5_basic_stdmodel_construction/","page":"Model construction and modification","title":"Model construction and modification","text":"It is also possible to modify a model by deleting certain genes. This is simply achieved by calling remove_genes!.","category":"page"},{"location":"notebooks/5_basic_stdmodel_construction/","page":"Model construction and modification","title":"Model construction and modification","text":"remove_genes!(model, [\"g1\", \"g2\"]; knockout_reactions = false)\nmodel","category":"page"},{"location":"notebooks/5_basic_stdmodel_construction/","page":"Model construction and modification","title":"Model construction and modification","text":"","category":"page"},{"location":"notebooks/5_basic_stdmodel_construction/","page":"Model construction and modification","title":"Model construction and modification","text":"This page was generated using Literate.jl.","category":"page"},{"location":"advanced/1_variants/#Exploring-many-model-variants","page":"Exploring many model variants","title":"Exploring many model variants","text":"","category":"section"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"A major goal of COBREXA.jl is to make exploring of many model variants easy and fast.","category":"page"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"One main concept that can be utilized for doing that is implemented in the function screen, which takes your model, a list of model variants that you want to explore by some specified analysis, and schedules the analysis of the model variants parallely on the available distributed workers.","category":"page"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"In its most basic form, the \"screening\" may use the slightly simplified variant of screen that is called screen_variants, which works as follows:","category":"page"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"m = load_model(StandardModel, \"e_coli_core.json\")\n\nscreen_variants(\n    m,    # the model for screening\n    [\n        [],    # a variant with no modifications\n        [with_changed_bound(\"CO2t\", lb = 0, ub = 0)],  # disable CO2 transport\n        [with_changed_bound(\"O2t\", lb = 0, ub = 0)],  # disable O2 transport\n        [with_changed_bound(\"CO2t\", lb = 0, ub = 0), with_changed_bound(\"O2t\", lb = 0, ub = 0)],  # disable both transports\n    ],\n    m -> flux_balance_analysis_dict(m, Tulip.Optimizer)[\"BIOMASS_Ecoli_core_w_GAM\"],\n)","category":"page"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"The call specifies a model (the m that we have loaded) that is being tested, then a vector of model variants to be created and tested, and then the analysis that is being run on each variant – in this case, we find an optimal steady state of each of the variants, and check out the biomass production rate at that state. In this particular case, we are checking what will be the effect of disabling combinations of CO2 transport and O2 transport in the cells. For that, we get the following result:","category":"page"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"4-element Vector{Float64}:\n 0.8739215022678488\n 0.46166961413944896\n 0.21166294973372135\n 0.21114065173865518","category":"page"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"The numbers are the biomass production rates for the specified variants. We can see that disabling O2 transport really does not help the organism much.","category":"page"},{"location":"advanced/1_variants/#Variant-specification","page":"Exploring many model variants","title":"Variant specification","text":"","category":"section"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"In the above example, we have specified 4 variants, thus the analysis returned 4 different results that correspond with the specifications. Let us have a look at the precise format of the specification and result.","category":"page"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"Importantly, the variants argument is of type Array{Vector{Any}}, meaning that it can be an array of any dimensionality that contains vectors. Each of the vectors specifies precisely one variant, possibly with more modifications applied to the model in sequence.","category":"page"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"For example:","category":"page"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"[] specifies no modifications at all\n[with_changed_bound(\"CO2t\", lb=0, ub=10)] limits the CO2 transport\n[with_changed_bound(\"CO2t\", lb=0, ub=2), with_changed_bound(\"O2t\", lb=0, ub=100)] severely limits the CO2 transport and slightly restricts the transport of O2","category":"page"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"note: Variants are single-parameter model-transforming functions\nBecause the variants are just generators of single parameter functions that take the model and return its modified version, you can also use identity to specify a variant that does nothing – [identity] is perfectly same as []","category":"page"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"The shape of the variants array is important too, because it is precisely retained in the result (just as with pmap). If you pass in a matrix of variants, you will receive a matrix of analysis results of the same size. That can be exploited for easily exploring many combinations of possible model properties. Let's try exploring a \"cube\" of possible restricted reactions:","category":"page"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"using IterTools # for cartesian products\n\nres = screen_variants(m,\n    [\n        # for each variant we restricts 2 reactions\n        [with_changed_bound(r1, lb=-3, ub=3), with_changed_bound(r2, lb=-1, ub=1)]\n\n        # the reaction pair will be chosen from a cartesian product\n        for (r1,r2) in product(\n            [\"H2Ot\", \"CO2t\", \"O2t\", \"NH4t\"], # of this set of transport reactions\n            [\"EX_h2o_e\", \"EX_co2_e\", \"EX_o2_e\", \"EX_nh4_e\"], # and this set of exchanges\n        )\n    ],\n    m -> flux_balance_analysis_dict(m, Tulip.Optimizer)[\"BIOMASS_Ecoli_core_w_GAM\"],\n)","category":"page"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"As a result, we will receive a full matrix of the biomass productions:","category":"page"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"4×4 Matrix{Float64}:\n 0.407666  0.454097  0.240106  0.183392\n 0.407666  0.485204  0.24766   0.183392\n 0.314923  0.319654  0.24766   0.183392\n 0.407666  0.485204  0.24766   0.183392","category":"page"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"Notably, this shows that O2 transport and NH4 exchange may be serious bottlenecks for biomass production.","category":"page"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"For clarity, you may always annotate the result by zipping it with the specification structure you have used and collecting the data:","category":"page"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"collect(zip(\n    product(\n        [\"H2Ot\", \"CO2t\", \"O2t\", \"NH4t\"],\n        [\"EX_h2o_e\", \"EX_co2_e\", \"EX_o2_e\", \"EX_nh4_e\"],\n    ),\n    res,\n))","category":"page"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"...which gives the following annotated result:","category":"page"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"4×4 Matrix{Tuple{Tuple{String, String}, Float64}}:\n ((\"H2Ot\", \"EX_h2o_e\"), 0.407666)  ((\"H2Ot\", \"EX_co2_e\"), 0.454097)  ((\"H2Ot\", \"EX_o2_e\"), 0.240106)  ((\"H2Ot\", \"EX_nh4_e\"), 0.183392)\n ((\"CO2t\", \"EX_h2o_e\"), 0.407666)  ((\"CO2t\", \"EX_co2_e\"), 0.485204)  ((\"CO2t\", \"EX_o2_e\"), 0.24766)   ((\"CO2t\", \"EX_nh4_e\"), 0.183392)\n ((\"O2t\", \"EX_h2o_e\"), 0.314923)   ((\"O2t\", \"EX_co2_e\"), 0.319654)   ((\"O2t\", \"EX_o2_e\"), 0.24766)    ((\"O2t\", \"EX_nh4_e\"), 0.183392)\n ((\"NH4t\", \"EX_h2o_e\"), 0.407666)  ((\"NH4t\", \"EX_co2_e\"), 0.485204)  ((\"NH4t\", \"EX_o2_e\"), 0.24766)   ((\"NH4t\", \"EX_nh4_e\"), 0.183392)","category":"page"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"This may be easily used for e.g. scrutinizing all possible reaction pairs, to find the ones that are redundant and not.","category":"page"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"tip: Notebook available\nA notebook is available that demonstrates the screening on a larger scale.","category":"page"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"There are many other variant \"specifications\" to choose from. You may use with_added_reactions, with_removed_reactions, with_removed_metabolites, and others. Function reference contains a complete list; as a convention, names of the specifications all start with with_.","category":"page"},{"location":"advanced/1_variants/#Writing-custom-variant-functions","page":"Exploring many model variants","title":"Writing custom variant functions","text":"","category":"section"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"It is actually very easy to create custom specifications that do any modification that you can implement, to be later used with screen_variants and screen.","category":"page"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"Generally, the \"specifications\" are supposed to return a function that creates a modified copy of the model. The copy of the model may be shallow, but the functions should always prevent modifying the original model structure – screen is keeping a single copy of the original model at each worker to prevent unnecessary bulk data transport, and if that is changed in-place, all following analyses of the model will work on inconsistent data, usually returning wrong results (even randomly changing ones, because of the asynchronous nature of screen execution).","category":"page"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"Despite of that, writing a modification is easy. The simplest modification that \"does nothing\" (isomorphic to standard identity) can be formatted as follows:","category":"page"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"with_no_change = model -> model","category":"page"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"The modifications may change the model, provided it is copied properly. The following modification will remove a reaction called \"O2t\", effectively removing the possibility to transport oxygen. We require a specific type of model where this change is easy to perform (generally, not all variants may be feasible on all model types).","category":"page"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"with_disabled_oxygen_transport = (model::StandardModel) -> begin\n\n    # make \"as shallow as possible\" copy of the `model`.\n    # Utilizing `deepcopy` is also possible, but inefficient.\n    new_model = copy(model)\n    new_model.reactions = copy(model.reactions)\n\n    # remove the O2 transport from the model copy\n    delete!(new_model.reactions, \"O2t\")\n\n    return new_model #return the newly created variant\nend","category":"page"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"Finally, the whole definition may be parametrized as a normal function. The following variant removes any user-selected reaction:","category":"page"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"with_disabled_reaction(reaction_id) = (model::StandardModel) -> begin\n    new_model = copy(model)\n    new_model.reactions = copy(model.reactions)\n    delete!(new_model.reactions, reaction_id) # use the parameter from the specification\n    return new_model\nend","category":"page"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"In turn, these variants can be used in screen_variants just as we used with_changed_bound above:","category":"page"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"screen_variants(\n    m,    # the model for screening\n    [\n        [with_no_change],\n        [with_disabled_oxygen_transport],\n        [with_disabled_reaction(\"NH4t\")],\n    ],\n    m -> flux_balance_analysis_dict(m, Tulip.Optimizer)[\"BIOMASS_Ecoli_core_w_GAM\"],\n)","category":"page"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"That should get you the results for all new variants of the model:","category":"page"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"3-element Vector{Float64}:\n 0.8739215022674809\n 0.21166294865468896\n 1.2907224478973395e-15","category":"page"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"warning: Custom variants with distributed processing\nIf using distributed evaluation, remember the variant-generating functions need to be defined on all used workers (generating the variants in parallel on the workers allows COBREXA to run the screening process very efficiently, without unnecessary sending of bulk model data). Prefixing the definition with @everywhere is usually sufficient for that purpose.","category":"page"},{"location":"advanced/1_variants/#Passing-extra-arguments-to-the-analysis-function","page":"Exploring many model variants","title":"Passing extra arguments to the analysis function","text":"","category":"section"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"Some analysis functions may take additional arguments, which you might want to vary for the analysis. modifications argument of flux_balance_analysis_dict is one example of such argument, allowing you to specify details of the optimization procedure.","category":"page"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"screen function allows you to do precisely that – apart from variants, you may also specify an array of args of the same shape as variants, the entries of which will get passed together with the generated model variants to your specified analysis function. If either of the arguments is missing (or set to nothing), it is defaulted to \"no modifications\" or \"no arguments\".","category":"page"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"The arguments must be tuples; you may need to make 1-tuples from your data (e.g. using (value,)) if you want to pass just a single argument.","category":"page"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"Let's try to use that functionality for trying to find a sufficient amount of iterations needed for Tulip solver to find a feasible solution:","category":"page"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"screen(m,\n    args = [(i,) for i in 5:15],  # the iteration counts, packed in 1-tuples\n    analysis = (m,a) -> # `args` elements get passed as the extra parameter here\n        flux_balance_analysis_vec(m,\n            Tulip.Optimizer;\n            modifications=[change_optimizer_attribute(\"IPM_IterationsLimit\", a)],\n        ),\n)","category":"page"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"From the result, we can see that Tulip would need at least 14 iterations to find a feasible region:","category":"page"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"11-element Vector{Union{Nothing, Vector{Float64}}}:\n nothing\n nothing\n nothing\n nothing\n nothing\n nothing\n nothing\n nothing\n nothing\n [7.47738193404817, 1.8840414375838503e-8, 4.860861010127701, -16.023526104614593, … ]\n [7.47738193404817, 1.8840414375838503e-8, 4.860861010127701, -16.023526104614593, … ]","category":"page"},{"location":"tutorials/3_hpc/#Distributed-processing-and-HPC-environments","page":"Distributed processing and HPC environments","title":"Distributed processing and HPC environments","text":"","category":"section"},{"location":"tutorials/3_hpc/","page":"Distributed processing and HPC environments","title":"Distributed processing and HPC environments","text":"Distributed processing in Julia is represented mainly by the package Distributed.jl.","category":"page"},{"location":"tutorials/3_hpc/","page":"Distributed processing and HPC environments","title":"Distributed processing and HPC environments","text":"COBREXA.jl is able to utilize this existing system to almost transparently run the large parallelizable analyses on multiple CPU cores and multiple computers connected through the network. Ultimately, the approach scales to thousands of computing nodes in large HPC facilities.","category":"page"},{"location":"tutorials/3_hpc/","page":"Distributed processing and HPC environments","title":"Distributed processing and HPC environments","text":"Here, we give a short overview of how to work in the distributed environment and utilize the resources for COBREXA.jl analyses.","category":"page"},{"location":"tutorials/3_hpc/#Starting-the-distributed-workers","page":"Distributed processing and HPC environments","title":"Starting the distributed workers","text":"","category":"section"},{"location":"tutorials/3_hpc/","page":"Distributed processing and HPC environments","title":"Distributed processing and HPC environments","text":"COBREXA.jl follows the structure imposed by the Distributed package: You operate a main (usually called \"master\") computation node, connect to multiple other computers and start worker Julia processes there, and distribute the workload across this cluster.","category":"page"},{"location":"tutorials/3_hpc/","page":"Distributed processing and HPC environments","title":"Distributed processing and HPC environments","text":"To start, you need to load the package and add a few processes. This starts 5 processes locally:","category":"page"},{"location":"tutorials/3_hpc/","page":"Distributed processing and HPC environments","title":"Distributed processing and HPC environments","text":"using Distributed\naddprocs(5)","category":"page"},{"location":"tutorials/3_hpc/","page":"Distributed processing and HPC environments","title":"Distributed processing and HPC environments","text":"note: `Distributed.jl` installation\nDistributed.jl usually comes pre-installed with Julia distribution, but you may still need to \"enable\" it by typing ] add Distributed.","category":"page"},{"location":"tutorials/3_hpc/","page":"Distributed processing and HPC environments","title":"Distributed processing and HPC environments","text":"You may check that the workers are really there, using workers(). In this case, it should give you a vector of worker IDs, very likely equal to [2,3,4,5,6].","category":"page"},{"location":"tutorials/3_hpc/","page":"Distributed processing and HPC environments","title":"Distributed processing and HPC environments","text":"If you have compute resources available via a network, you may connect these as well, provided you have a secure shell (ssh) access to them. You will likely want to establish a key-based authentication (refer to ssh documentation) to make the connection easier.","category":"page"},{"location":"tutorials/3_hpc/","page":"Distributed processing and HPC environments","title":"Distributed processing and HPC environments","text":"With shell, check that you can ssh to a remote node and run Julia there:","category":"page"},{"location":"tutorials/3_hpc/","page":"Distributed processing and HPC environments","title":"Distributed processing and HPC environments","text":"user@pc> ssh server\n...\nuser@server> julia\n...\njulia> _","category":"page"},{"location":"tutorials/3_hpc/","page":"Distributed processing and HPC environments","title":"Distributed processing and HPC environments","text":"top: Running shell commands from Julia\nIf you don't want to quit your Julia session to try out the ssh connection from the shell, press ; in the Julia prompt on the beginning of the line. The interpreter will execute your next line as a shell command.","category":"page"},{"location":"tutorials/3_hpc/","page":"Distributed processing and HPC environments","title":"Distributed processing and HPC environments","text":"If this works for you, you can add some workers that run on the server from your Julia shell running on your pc. For example, the following starts 20 workers on the remote server and 10 workers on your friend's computer called joe_pc:","category":"page"},{"location":"tutorials/3_hpc/","page":"Distributed processing and HPC environments","title":"Distributed processing and HPC environments","text":"addprocs([('server', 20), ('joe_pc', 10)])","category":"page"},{"location":"tutorials/3_hpc/","page":"Distributed processing and HPC environments","title":"Distributed processing and HPC environments","text":"With this, you can schedule various computation on the workers; see the Julia manual of Distributed for basic details. You may try various convenience packages, such as DistributedArrays.jl and DistributedData.jl, to process any data in a distributed fashion.","category":"page"},{"location":"tutorials/3_hpc/#Running-a-distributed-analysis","page":"Distributed processing and HPC environments","title":"Running a distributed analysis","text":"","category":"section"},{"location":"tutorials/3_hpc/","page":"Distributed processing and HPC environments","title":"Distributed processing and HPC environments","text":"While not all COBREXA functions may be parallelized naturally, these that do will accept a special workers argument that specifies a list of worker IDs where the computation should be distributed. For the value, you can specify your desired worker IDs manually (e.g. [2,3,4]), or simply use workers().","category":"page"},{"location":"tutorials/3_hpc/","page":"Distributed processing and HPC environments","title":"Distributed processing and HPC environments","text":"For example, flux_variability_analysis can naturally parallelize the computation of all reactions's minima and maxima to finish the computation faster. To enable the parallelization, you first need to make sure that all workers have loaded both the COBREXA package and the optimizer:","category":"page"},{"location":"tutorials/3_hpc/","page":"Distributed processing and HPC environments","title":"Distributed processing and HPC environments","text":"using COBREXA, GLPK, Distributed\naddprocs(10)                       # add any kind and number of processes here\n@everywhere using COBREXA, GLPK    # loads the necessary packages on all workers","category":"page"},{"location":"tutorials/3_hpc/","page":"Distributed processing and HPC environments","title":"Distributed processing and HPC environments","text":"When the package is loaded and precompiled everywhere, you may load your model and run the FVA with the workers parameter:","category":"page"},{"location":"tutorials/3_hpc/","page":"Distributed processing and HPC environments","title":"Distributed processing and HPC environments","text":"model = load_model(\"e_coli_core.xml\")\nresult = flux_variability_analysis(model, GLPK.Optimizer; workers=workers())","category":"page"},{"location":"tutorials/3_hpc/","page":"Distributed processing and HPC environments","title":"Distributed processing and HPC environments","text":"With the extra computing capacity from N workers available, the FVA should be computed roughly N-times faster.","category":"page"},{"location":"tutorials/3_hpc/","page":"Distributed processing and HPC environments","title":"Distributed processing and HPC environments","text":"note: Distribution and parallelization overhead\nCommunication of the workers with your Julia shell is not free. If the task that you are parallelizing is small and the model structure is very large, the distributed computation will actually spend most computation time just distributing the large model to the workers, and almost no time in executing the small parallel task. In such case, the performance will not improve by adding additional resources. You may want to check that the computation task is sufficiently large before investing the extra resources into the distributed execution. Amdahl's and Gustafson's laws can give you a better overview of the consequences of this overhead.","category":"page"},{"location":"tutorials/3_hpc/#Interacting-with-HPC-schedulers","page":"Distributed processing and HPC environments","title":"Interacting with HPC schedulers","text":"","category":"section"},{"location":"tutorials/3_hpc/","page":"Distributed processing and HPC environments","title":"Distributed processing and HPC environments","text":"Many researchers have access to institutional HPC facilities that allow time-sharing of the capacity of a large computer cluster between many researchers. Julia and COBREXA.jl work well within this environment; but your programs require some additional customization to be able to find and utilize the resources available from the HPC.","category":"page"},{"location":"tutorials/3_hpc/","page":"Distributed processing and HPC environments","title":"Distributed processing and HPC environments","text":"In our case, this reduces to a relatively complex task: You need to find out how many resources were allocated for your task, and you need to add the remote workers precisely at places that were allocated for your. Fortunately, the package ClusterManagers.jl can do precisely that.","category":"page"},{"location":"tutorials/3_hpc/","page":"Distributed processing and HPC environments","title":"Distributed processing and HPC environments","text":"For simplicily, we will assume that your HPC is scheduled by Slurm.","category":"page"},{"location":"tutorials/3_hpc/","page":"Distributed processing and HPC environments","title":"Distributed processing and HPC environments","text":"Adding of the workers from Slurm is done as follows:","category":"page"},{"location":"tutorials/3_hpc/","page":"Distributed processing and HPC environments","title":"Distributed processing and HPC environments","text":"you import the ClusterManagers package\nyou find how many processes to spawn from the environment from SLURM_NTASKS environment variable\nyou use the function addprocs_slurm to precisely connect to your allocated computational resources","category":"page"},{"location":"tutorials/3_hpc/","page":"Distributed processing and HPC environments","title":"Distributed processing and HPC environments","text":"The Julia script that does a parallel analysis may then start as follows:","category":"page"},{"location":"tutorials/3_hpc/","page":"Distributed processing and HPC environments","title":"Distributed processing and HPC environments","text":"using COBREXA, Distributed, ClusterManagers\n\navailable_workers = parse(Int, ENV[\"SLURM_NTASKS\"])\n\naddprocs_slurm(available_workers)\n\n...\nresult = flux_variability_analysis(...; workers=workers())\n...","category":"page"},{"location":"tutorials/3_hpc/","page":"Distributed processing and HPC environments","title":"Distributed processing and HPC environments","text":"After adding the Slurm workers, you may continue as if the workers were added using normal addprocs, and (for example) run the flux_variability_analysis as shown above.","category":"page"},{"location":"tutorials/3_hpc/","page":"Distributed processing and HPC environments","title":"Distributed processing and HPC environments","text":"tip: What about the other HPC schedulers?\nClusterManagers.jl supports many other common HPC scheduling systems, including LFS, Sun Grid, SGE, PBS, and Scyld, in a way almost identical to Slurm. See the package documentation for details.","category":"page"},{"location":"tutorials/3_hpc/#Wrapping-your-script-in-a-Slurm-job","page":"Distributed processing and HPC environments","title":"Wrapping your script in a Slurm job","text":"","category":"section"},{"location":"tutorials/3_hpc/","page":"Distributed processing and HPC environments","title":"Distributed processing and HPC environments","text":"To be able to submit your script for later processing using the sbatch Slurm command, you need to wrap it in a small \"batch\" script that tells Slurm how many resources the process needs.","category":"page"},{"location":"tutorials/3_hpc/","page":"Distributed processing and HPC environments","title":"Distributed processing and HPC environments","text":"Assuming you have a Julia computation script written down in myJob.jl and saved on your HPC cluster's access node, the corresponding Slurm batch script (let's call it myJob.sbatch) may look as follows:","category":"page"},{"location":"tutorials/3_hpc/","page":"Distributed processing and HPC environments","title":"Distributed processing and HPC environments","text":"#!/bin/bash -l\n#SBATCH -n 100           # the job will require 100 individual workers\n#SBATCH -c 1             # each worker will sit on a single CPU\n#SBATCH -t 30            # the whole job will take less than 30 minutes\n#SBATCH -J myJob         # the name of the job\n\nmodule load lang/Julia   # this is usually required to make Julia available to your job\n\njulia myJob.jl","category":"page"},{"location":"tutorials/3_hpc/","page":"Distributed processing and HPC environments","title":"Distributed processing and HPC environments","text":"To run the computation, simply run sbatch myJob.sbatch on the access node. The job will be scheduled and eventually executed. You may watch sacct and squeue in the meantime, to see the progress.","category":"page"},{"location":"tutorials/3_hpc/","page":"Distributed processing and HPC environments","title":"Distributed processing and HPC environments","text":"Remember that you need to explicitly save the result of your Julia script computation to files, to be able to retrieve them later. Standard outputs of the jobs are often mangled and discarded. If you still want to collect the standard output, you may change the last line of the batch script to","category":"page"},{"location":"tutorials/3_hpc/","page":"Distributed processing and HPC environments","title":"Distributed processing and HPC environments","text":"julia myJob.jl > myJob.log","category":"page"},{"location":"tutorials/3_hpc/","page":"Distributed processing and HPC environments","title":"Distributed processing and HPC environments","text":"and collect the output from the log later. This is convenient especially if logging various computation details using the @info and similar macros.","category":"page"},{"location":"functions/#Functions","page":"Function reference","title":"Functions","text":"","category":"section"},{"location":"functions/#Base-Types","page":"Function reference","title":"Base Types","text":"","category":"section"},{"location":"functions/","page":"Function reference","title":"Function reference","text":"Modules = [COBREXA]\nPages = map(file -> joinpath(\"base\", \"types\", \"abstract\", file), readdir(\"../src/base/types/abstract\"))","category":"page"},{"location":"functions/#COBREXA.Maybe","page":"Function reference","title":"COBREXA.Maybe","text":"Maybe{T} = Union{Nothing, T}\n\nA nice name for \"nullable\" type.\n\n\n\n\n\n","category":"type"},{"location":"functions/#COBREXA._default-Union{Tuple{T}, Tuple{T, Union{Nothing, T}}} where T","page":"Function reference","title":"COBREXA._default","text":"_default(d::T, x::Maybe{T})::T where {T}\n\nFold the Maybe{T} down to T by defaulting.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA._maybemap-Tuple{Any, Union{Nothing, T} where T}","page":"Function reference","title":"COBREXA._maybemap","text":"_maybemap(f, x::Maybe)::Maybe\n\nApply a function to x only if it is not nothing.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.Annotations","page":"Function reference","title":"COBREXA.Annotations","text":"Annotations = Dict{String,Vector{String}}\n\nDictionary used to store (possible multiple) standardized annotations of something, such as a Metabolite and a Reaction.\n\nExample\n\nAnnotations(\"PubChem\" => [\"CID12345\", \"CID54321\"])\n\n\n\n\n\n","category":"type"},{"location":"functions/#COBREXA.GeneAssociation","page":"Function reference","title":"COBREXA.GeneAssociation","text":"GeneAssociation = Vector{Vector{String}}\n\nAn association to genes, represented as a logical formula in a positive disjunctive normal form (DNF). (The 2nd-level vectors of strings are connected by \"and\" to form conjunctions, and the 1st-level vectors of these conjunctions are connected by \"or\" to form the DNF.)\n\n\n\n\n\n","category":"type"},{"location":"functions/#COBREXA.MetabolicModel","page":"Function reference","title":"COBREXA.MetabolicModel","text":"abstract type MetabolicModel end\n\nA helper supertype that wraps everything usable as a linear-like model for COBREXA functions.\n\nIf you want your model type to work with COBREXA, add the MetabolicModel as its supertype, and implement the accessor functions. Accessors reactions, metabolites, stoichiometry, bounds and objective must be implemented; others are not mandatory and default to safe \"empty\" values.\n\n\n\n\n\n","category":"type"},{"location":"functions/#COBREXA.MetaboliteFormula","page":"Function reference","title":"COBREXA.MetaboliteFormula","text":"MetaboliteFormula = Dict{String,Int}\n\nDictionary of atoms and their abundances in a molecule.\n\n\n\n\n\n","category":"type"},{"location":"functions/#COBREXA.Notes","page":"Function reference","title":"COBREXA.Notes","text":"Notes = Dict{String,Vector{String}}\n\nFree-form notes about something (e.g. a Gene), categorized by \"topic\".\n\n\n\n\n\n","category":"type"},{"location":"functions/#COBREXA.balance-Tuple{MetabolicModel}","page":"Function reference","title":"COBREXA.balance","text":"balance(a::MetabolicModel)::SparseVec\n\nGet the sparse balance vector of a model (ie. the b from S x = b).\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.bounds-Tuple{MetabolicModel}","page":"Function reference","title":"COBREXA.bounds","text":"bounds(a::MetabolicModel)::Tuple{SparseVec,SparseVec}\n\nGet the lower and upper flux bounds of a model.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.coupling-Tuple{MetabolicModel}","page":"Function reference","title":"COBREXA.coupling","text":"coupling(a::MetabolicModel)::SparseMat\n\nGet a matrix of coupling constraint definitions of a model. By default, there is no coupling in the models.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.coupling_bounds-Tuple{MetabolicModel}","page":"Function reference","title":"COBREXA.coupling_bounds","text":"coupling_bounds(a::MetabolicModel)::Tuple{SparseVec,SparseVec}\n\nGet the lower and upper bounds for each coupling bound in a model, as specified by coupling. By default, the model does not have any coupling bounds.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.gene_annotations-Tuple{MetabolicModel, String}","page":"Function reference","title":"COBREXA.gene_annotations","text":"gene_annotations(a::MetabolicModel, gene_id::String)::Annotations\n\nReturn standardized names that identify the corresponding gene or product. The dictionary assigns vectors of possible identifiers to identifier system names, e.g. \"PDB\" => [\"PROT01\"].\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.gene_notes-Tuple{MetabolicModel, String}","page":"Function reference","title":"COBREXA.gene_notes","text":"gene_notes(model::MetabolicModel, gene_id::String)::Notes\n\nReturn the notes associated with the gene gene_id in model.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.genes-Tuple{MetabolicModel}","page":"Function reference","title":"COBREXA.genes","text":"genes(a::MetabolicModel)::Vector{String}\n\nReturn identifiers of all genes contained in the model. By default, there are no genes.\n\nIn SBML, these are usually called \"gene products\" but we write genes for simplicity.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.metabolite_annotations-Tuple{MetabolicModel, String}","page":"Function reference","title":"COBREXA.metabolite_annotations","text":"metabolite_annotations(a::MetabolicModel, metabolite_id::String)::Annotations\n\nReturn standardized names that may help to reliably identify the metabolite. The dictionary assigns vectors of possible identifiers to identifier system names, e.g. \"ChEMBL\" => [\"123\"] or \"PubChem\" => [\"CID123\", \"CID654645645\"].\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.metabolite_charge-Tuple{MetabolicModel, String}","page":"Function reference","title":"COBREXA.metabolite_charge","text":"metabolitecharge(model::MetabolicModel, metaboliteid::String)::Maybe{Int}\n\nReturn the charge associated with metabolite metabolite_id in model. Returns nothing if charge not present.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.metabolite_compartment-Tuple{MetabolicModel, String}","page":"Function reference","title":"COBREXA.metabolite_compartment","text":"metabolite_compartment(model::MetabolicModel, metabolite_id::String)::Maybe{String}\n\nReturn the compartment of metabolite metabolite_id in model if it is assigned. If not, return nothing.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.metabolite_formula-Tuple{MetabolicModel, String}","page":"Function reference","title":"COBREXA.metabolite_formula","text":"metabolite_formula(\n    a::MetabolicModel,\n    metabolite_id::String,\n)::Maybe{MetaboliteFormula}\n\nReturn the formula of metabolite metabolite_id in model. Return nothing in case the formula is not known or irrelevant.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.metabolite_notes-Tuple{MetabolicModel, String}","page":"Function reference","title":"COBREXA.metabolite_notes","text":"metabolite_notes(model::MetabolicModel, metabolite_id::String)::Notes\n\nReturn the notes associated with metabolite reaction_id in model.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.metabolites-Tuple{MetabolicModel}","page":"Function reference","title":"COBREXA.metabolites","text":"metabolites(a::MetabolicModel)::Vector{String}\n\nReturn a vector of metabolite identifiers in a model.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.n_coupling_constraints-Tuple{MetabolicModel}","page":"Function reference","title":"COBREXA.n_coupling_constraints","text":"n_coupling_constraints(a::MetabolicModel)::Int\n\nGet the number of coupling constraints in a model.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.n_genes-Tuple{MetabolicModel}","page":"Function reference","title":"COBREXA.n_genes","text":"n_genes(a::MetabolicModel)::Int\n\nReturn the number of genes in the model (as returned by genes). If you just need the number of the genes, this may be much more efficient than calling genes and measuring the array.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.n_metabolites-Tuple{MetabolicModel}","page":"Function reference","title":"COBREXA.n_metabolites","text":"n_metabolites(a::MetabolicModel)::Int\n\nGet the number of metabolites in a model.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.n_reactions-Tuple{MetabolicModel}","page":"Function reference","title":"COBREXA.n_reactions","text":"n_reactions(a::MetabolicModel)::Int\n\nGet the number of reactions in a model.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.objective-Tuple{MetabolicModel}","page":"Function reference","title":"COBREXA.objective","text":"objective(a::MetabolicModel)::SparseVec\n\nGet the objective vector of a model.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.precache!-Tuple{MetabolicModel}","page":"Function reference","title":"COBREXA.precache!","text":"precache!(a::MetabolicModel)::Nothing\n\nDo whatever is feasible to get the model into a state that can be read from as-quickly-as-possible. This may include e.g. generating helper index structures and loading delayed parts of the model from disk. The model should be modified \"transparently\" in-place. Analysis functions call this right before applying modifications or converting the model to the optimization model using make_optimization_model; usually on the same machine where the optimizers (and, generally, the core analysis algorithms) will run. The calls are done in a good hope that the performance will be improved.\n\nBy default, it should be safe to do nothing.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.reaction_annotations-Tuple{MetabolicModel, String}","page":"Function reference","title":"COBREXA.reaction_annotations","text":"reaction_annotations(a::MetabolicModel, reaction_id::String)::Annotations\n\nReturn standardized names that may help identifying the reaction. The dictionary assigns vectors of possible identifiers to identifier system names, e.g. \"Reactome\" => [\"reactomeID123\"].\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.reaction_gene_association-Tuple{MetabolicModel, String}","page":"Function reference","title":"COBREXA.reaction_gene_association","text":"reaction_gene_association(a::MetabolicModel, gene_id::String)::Maybe{GeneAssociation}\n\nReturns the sets of genes that need to be present so that the reaction can work (technically, a DNF on gene availability, with positive atoms only).\n\nFor simplicity, nothing may be returned, meaning that the reaction always takes place. (in DNF, that would be equivalent to returning [[]].)\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.reaction_notes-Tuple{MetabolicModel, String}","page":"Function reference","title":"COBREXA.reaction_notes","text":"reaction_notes(model::MetabolicModel, reaction_id::String)::Notes\n\nReturn the notes associated with reaction reaction_id in model.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.reaction_stoichiometry-Tuple{MetabolicModel, String}","page":"Function reference","title":"COBREXA.reaction_stoichiometry","text":"reaction_stoichiometry(model::MetaboliteModel, rid::String)::Dict{String, Float64}\n\nReturn the stoichiometry of reaction with ID rid in the model. The dictionary maps the metabolite IDs to their stoichiometric coefficients.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.reaction_subsystem-Tuple{MetabolicModel, String}","page":"Function reference","title":"COBREXA.reaction_subsystem","text":"reaction_subsystem(model::MetabolicModel, reaction_id::String)::Maybe{String}\n\nReturn the subsystem of reaction reaction_id in model if it is assigned. If not, return nothing.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.reactions-Tuple{MetabolicModel}","page":"Function reference","title":"COBREXA.reactions","text":"reactions(a::MetabolicModel)::Vector{String}\n\nReturn a vector of reaction identifiers in a model.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.stoichiometry-Tuple{MetabolicModel}","page":"Function reference","title":"COBREXA.stoichiometry","text":"stoichiometry(a::MetabolicModel)::SparseMat\n\nGet the sparse stoichiometry matrix of a model.\n\n\n\n\n\n","category":"method"},{"location":"functions/#Model-types-and-contents","page":"Function reference","title":"Model types and contents","text":"","category":"section"},{"location":"functions/","page":"Function reference","title":"Function reference","text":"Modules = [COBREXA]\nPages = map(file -> joinpath(\"base\", \"types\", file), readdir(\"../src/base/types\"))","category":"page"},{"location":"functions/#COBREXA.CoreModel","page":"Function reference","title":"COBREXA.CoreModel","text":"struct CoreModel <: MetabolicModel\n\nA \"bare bones\" core linear optimization problem of the form, with reaction and metabolite names.\n\nmin c^T x\ns.t. S x = b\n      xₗ ≤ x ≤ xᵤ\n\n\n\n\n\n","category":"type"},{"location":"functions/#Base.convert-Union{Tuple{M}, Tuple{Type{CoreModel}, M}} where M<:MetabolicModel","page":"Function reference","title":"Base.convert","text":"Base.convert(::Type{CoreModel}, m::M) where {M <: MetabolicModel}\n\nMake a CoreModel out of any compatible model type.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.balance-Tuple{CoreModel}","page":"Function reference","title":"COBREXA.balance","text":"balance(a::CoreModel)::SparseVec\n\nCoreModel target flux balance.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.bounds-Tuple{CoreModel}","page":"Function reference","title":"COBREXA.bounds","text":"bounds(a::CoreModel)::Tuple{SparseVec,SparseVec}\n\nCoreModel flux bounds.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.metabolites-Tuple{CoreModel}","page":"Function reference","title":"COBREXA.metabolites","text":"metabolites(a::CoreModel)::Vector{String}\n\nMetabolites in a CoreModel.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.objective-Tuple{CoreModel}","page":"Function reference","title":"COBREXA.objective","text":"objective(a::CoreModel)::SparseVec\n\nCoreModel objective vector.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.reaction_stoichiometry-Tuple{CoreModel, Any}","page":"Function reference","title":"COBREXA.reaction_stoichiometry","text":"reaction_stoichiometry(model::CoreModel, ridx)::Dict{String, Float64}\n\nReturn the stoichiometry of reaction at index ridx.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.reaction_stoichiometry-Tuple{CoreModel, String}","page":"Function reference","title":"COBREXA.reaction_stoichiometry","text":"reaction_stoichiometry(model::CoreModel, rid::String)::Dict{String, Float64}\n\nReturn the stoichiometry of reaction with ID rid.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.reactions-Tuple{CoreModel}","page":"Function reference","title":"COBREXA.reactions","text":"reactions(a::CoreModel)::Vector{String}\n\nGet the reactions in a CoreModel.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.stoichiometry-Tuple{CoreModel}","page":"Function reference","title":"COBREXA.stoichiometry","text":"stoichiometry(a::CoreModel)::SparseMat\n\nCoreModel stoichiometry matrix.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.CoreModelCoupled","page":"Function reference","title":"COBREXA.CoreModelCoupled","text":"struct CoreModelCoupled <: MetabolicModel\n\nThe linear model with additional coupling constraints in the form\n\n    cₗ ≤ C x ≤ cᵤ\n\n\n\n\n\n","category":"type"},{"location":"functions/#Base.convert-Tuple{Type{CoreModelCoupled}, MetabolicModel}","page":"Function reference","title":"Base.convert","text":"Base.convert(::Type{CoreModelCoupled}, mm::MetabolicModel)\n\nMake a CoreModelCoupled out of any compatible model type.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.balance-Tuple{CoreModelCoupled}","page":"Function reference","title":"COBREXA.balance","text":"balance(a::CoreModelCoupled)\n\nExtract balance from CoreModelCoupled (uses the internal CoreModel).\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.bounds-Tuple{CoreModelCoupled}","page":"Function reference","title":"COBREXA.bounds","text":"bounds(a::CoreModelCoupled)\n\nExtract bounds from CoreModelCoupled (uses the internal CoreModel).\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.coupling-Tuple{CoreModelCoupled}","page":"Function reference","title":"COBREXA.coupling","text":"coupling(a::CoreModelCoupled)::SparseMat\n\nCoupling constraint matrix for a CoreModelCoupled.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.coupling_bounds-Tuple{CoreModelCoupled}","page":"Function reference","title":"COBREXA.coupling_bounds","text":"coupling_bounds(a::CoreModelCoupled)::Tuple{SparseVec,SparseVec}\n\nCoupling bounds for a CoreModelCoupled.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.metabolites-Tuple{CoreModelCoupled}","page":"Function reference","title":"COBREXA.metabolites","text":"metabolites(a::CoreModelCoupled)\n\nExtract metabolites from CoreModelCoupled (uses the internal CoreModel).\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.n_coupling_constraints-Tuple{CoreModelCoupled}","page":"Function reference","title":"COBREXA.n_coupling_constraints","text":"n_coupling_constraints(a::CoreModelCoupled)::Int\n\nThe number of coupling constraints in a CoreModelCoupled.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.objective-Tuple{CoreModelCoupled}","page":"Function reference","title":"COBREXA.objective","text":"objective(a::CoreModelCoupled)\n\nExtract objective from CoreModelCoupled (uses the internal CoreModel).\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.reaction_stoichiometry-Tuple{CoreModelCoupled, Any}","page":"Function reference","title":"COBREXA.reaction_stoichiometry","text":"reaction_stoichiometry(model::CoreModelCoupled, ridx)::Dict{String, Float64}\n\nReturn the stoichiometry of reaction at index ridx.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.reaction_stoichiometry-Tuple{CoreModelCoupled, String}","page":"Function reference","title":"COBREXA.reaction_stoichiometry","text":"reaction_stoichiometry(model::CoreModelCoupled, rid::String)::Dict{String, Float64}\n\nReturn the stoichiometry of reaction with ID rid.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.reactions-Tuple{CoreModelCoupled}","page":"Function reference","title":"COBREXA.reactions","text":"reactions(a::CoreModelCoupled)\n\nExtract reactions from CoreModelCoupled (uses the internal CoreModel).\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.stoichiometry-Tuple{CoreModelCoupled}","page":"Function reference","title":"COBREXA.stoichiometry","text":"stoichiometry(a::CoreModelCoupled)\n\nExtract stoichiometry from CoreModelCoupled (uses the internal CoreModel).\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.FluxSummary","page":"Function reference","title":"COBREXA.FluxSummary","text":"FluxSummary\n\nA struct used to store summary information about the solution of a constraint based analysis result.\n\n\n\n\n\n","category":"type"},{"location":"functions/#COBREXA.flux_summary-Tuple{Dict{String, Float64}}","page":"Function reference","title":"COBREXA.flux_summary","text":"flux_summary(flux_result::Dict{String, Float64};\n            exclude_exchanges = false,\n            exchange_prefixes = _constants.exchange_prefixes,\n            biomass_strings = _constants.biomass_strings,\n            exclude_biomass = false,\n            small_flux_bound = 1.0/_constants.default_reaction_bound^2,\n            large_flux_bound = _constants.default_reaction_bound,\n            keep_unbounded = false,\n            )::FluxSummary\n\nSummarize a dictionary of fluxes into small, useful representation of the most important information contained. Useful for pretty-printing and quickly exploring the results. Internally this function uses looks_like_biomass_reaction and looks_like_exchange_reaction. The corresponding keyword arguments passed to these functions. Use this if your model has non-standard ids for reactions. Fluxes smaller than small_flux_bound are not stored, while fluxes larger than large_flux_bound are only stored if keep_unbounded is true.\n\nExample\n\njulia> sol = flux_balance_analysis_dict(model, Tulip.Optimizer)\njulia> fr = flux_summary(sol)\nBiomass:\n  BIOMASS_Ecoli_core_w_GAM: 0.8739\nImport:\n  EX_o2_e:     -21.7995\n  EX_glc__D_e: -10.0\n  EX_nh4_e:    -4.7653\n  EX_pi_e:     -3.2149\nExport:\n  EX_h_e:      17.5309\n  EX_co2_e:    22.8098\n  EX_h2o_e:    29.1758\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.FluxVariabilitySummary","page":"Function reference","title":"COBREXA.FluxVariabilitySummary","text":"FluxVariabilitySummary\n\nA struct used to store summary information about the solution of a flux variability analysis result.\n\n\n\n\n\n","category":"type"},{"location":"functions/#COBREXA.flux_variability_summary-Tuple{Tuple{Dict{String, Dict{String, Float64}}, Dict{String, Dict{String, Float64}}}}","page":"Function reference","title":"COBREXA.flux_variability_summary","text":"flux_variability_summary(flux_result::Tuple{Dict{String, Dict{String, Float64}}, Dict{String, Dict{String, Float64}}};\n    exclude_exchanges = false,\n    exchange_prefixes = _constants.exchange_prefixes,\n    biomass_strings = _constants.biomass_strings,\n    exclude_biomass = false,\n    )::FluxVariabilitySummary\n\nSummarize a dictionary of flux dictionaries obtained eg. from fluxvariabilityanalysisdict. The simplified summary representation is useful for pretty-printing and easily showing the most important results. Internally this function uses [`lookslikebiomassreaction](@ref) and [lookslikeexchange_reaction`](@ref). The corresponding keyword arguments passed to these functions. Use this if your model has non-standard ids for reactions.\n\nExample\n\njulia> sol = flux_variability_analysis_dict(model, Gurobi.Optimizer; bounds = objective_bounds(0.99))\njulia> flux_res = flux_variability_summary(sol)\nBiomass                     Lower bound   Upper bound\n  BIOMASS_Ecoli_core_w_GAM: 0.8652        0.8652\nExchange\n  EX_h2o_e:                 28.34         28.34\n  EX_co2_e:                 22.0377       22.0377\n  EX_o2_e:                  -22.1815      -22.1815\n  EX_h_e:                   17.3556       17.3556\n  EX_glc__D_e:              -10.0         -10.0\n  EX_nh4_e:                 -4.8448       -4.8448\n  EX_pi_e:                  -3.2149       -3.2149\n  EX_for_e:                 0.0           0.0\n  ...                       ...           ...\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.Gene","page":"Function reference","title":"COBREXA.Gene","text":"Gene struct.\n\nFields\n\nid :: String\nnotes :: Dict{String, Vector{String}}\nannotation :: Dict{String, Union{Vector{String}, String}}\n\n\n\n\n\n","category":"type"},{"location":"functions/#COBREXA.JSONModel","page":"Function reference","title":"COBREXA.JSONModel","text":"struct JSONModel <: MetabolicModel\n    json::Dict{String,Any}\n    rxn_index::Dict{String,Int}\n    rxns::Vector{Any}\n    met_index::Dict{String,Int}\n    mets::Vector{Any}\n    gene_index::Dict{String,Int}\n    genes::Vector{Any}\nend\n\nA struct used to store the contents of a JSON model, i.e. a model read from a file ending with .json. These model files typically store all the model data in arrays of JSON objects (represented in Julia as vectors of dictionaries).\n\nUsually, not all of the fields of the input JSON can be easily represented when converting to other models, care should be taken to avoid losing information.\n\nDirect work with the json structure is not very efficient; the model structure therefore caches some of the internal structure in the extra fields. The single-parameter JSONModel constructor creates these caches correctly from the json. The model structure is designed as read-only, and changes in json invalidate the cache.\n\nExample\n\nmodel = load_json_model(\"some_model.json\")\nmodel.json # see the actual underlying JSON\nreactions(model) # see the list of reactions\n\n\n\n\n\n","category":"type"},{"location":"functions/#Base.convert-Tuple{Type{JSONModel}, MetabolicModel}","page":"Function reference","title":"Base.convert","text":"Base.convert(::Type{JSONModel}, mm::MetabolicModel)\n\nConvert any MetabolicModel to JSONModel.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.bounds-Tuple{JSONModel}","page":"Function reference","title":"COBREXA.bounds","text":"bounds(model::JSONModel)\n\nGet the bounds for reactions, assuming the information is stored in .lower_bound and .upper_bound.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.gene_annotations-Tuple{JSONModel, String}","page":"Function reference","title":"COBREXA.gene_annotations","text":"gene_annotations(model::JSONModel, gid::String)::Annotations\n\nGene annotations from the JSONModel.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.gene_notes-Tuple{JSONModel, String}","page":"Function reference","title":"COBREXA.gene_notes","text":"gene_notes(model::JSONModel, gid::String)::Notes\n\nGene notes from the JSONModel.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.genes-Tuple{JSONModel}","page":"Function reference","title":"COBREXA.genes","text":"genes(model::JSONModel)\n\nExtract gene names from a JSON model.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.metabolite_annotations-Tuple{JSONModel, String}","page":"Function reference","title":"COBREXA.metabolite_annotations","text":"metabolite_annotations(model::JSONModel, mid::String)::Annotations\n\nMetabolite annotations from the JSONModel.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.metabolite_charge-Tuple{JSONModel, String}","page":"Function reference","title":"COBREXA.metabolite_charge","text":"metabolite_charge(model::JSONModel, mid::String)\n\nReturn the metabolite .charge\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.metabolite_compartment-Tuple{JSONModel, String}","page":"Function reference","title":"COBREXA.metabolite_compartment","text":"metabolite_compartment(model::JSONModel, mid::String)\n\nReturn the metabolite .compartment\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.metabolite_formula-Tuple{JSONModel, String}","page":"Function reference","title":"COBREXA.metabolite_formula","text":"metabolite_formula(model::JSONModel, mid::String)\n\nParse and return the metabolite .formula\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.metabolite_notes-Tuple{JSONModel, String}","page":"Function reference","title":"COBREXA.metabolite_notes","text":"metabolite_notes(model::JSONModel, mid::String)::Notes\n\nMetabolite notes from the JSONModel.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.metabolites-Tuple{JSONModel}","page":"Function reference","title":"COBREXA.metabolites","text":"metabolites(model::JSONModel)\n\nExtract metabolite names (stored as .id) from JSON model.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.objective-Tuple{JSONModel}","page":"Function reference","title":"COBREXA.objective","text":"objective(model::JSONModel)\n\nCollect .objective_coefficient keys from model reactions.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.reaction_annotations-Tuple{JSONModel, String}","page":"Function reference","title":"COBREXA.reaction_annotations","text":"reaction_annotations(model::JSONModel, rid::String)::Annotations\n\nReaction annotations from the JSONModel.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.reaction_gene_association-Tuple{JSONModel, String}","page":"Function reference","title":"COBREXA.reaction_gene_association","text":"reaction_gene_associaton(model::JSONModel, rid::String)\n\nParses the .gene_reaction_rule from reactions.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.reaction_notes-Tuple{JSONModel, String}","page":"Function reference","title":"COBREXA.reaction_notes","text":"reaction_notes(model::JSONModel, rid::String)::Notes\n\nReaction notes from the JSONModel.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.reaction_stoichiometry-Tuple{JSONModel, String}","page":"Function reference","title":"COBREXA.reaction_stoichiometry","text":"reaction_stoichiometry(model::JSONModel, rid::String)::Dict{String, Float64}\n\nReturn the stoichiometry of reaction with ID rid.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.reaction_subsystem-Tuple{JSONModel, String}","page":"Function reference","title":"COBREXA.reaction_subsystem","text":"reaction_subsystem(model::JSONModel, rid::String)\n\nParses the .subsystem out from reactions.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.reactions-Tuple{JSONModel}","page":"Function reference","title":"COBREXA.reactions","text":"reactions(model::JSONModel)\n\nExtract reaction names (stored as .id) from JSON model.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.stoichiometry-Tuple{JSONModel}","page":"Function reference","title":"COBREXA.stoichiometry","text":"stoichiometry(model::JSONModel)\n\nGet the stoichiometry. Assuming the information is stored in reaction object under key .metabolites.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.MATModel","page":"Function reference","title":"COBREXA.MATModel","text":"struct MATModel\n\nWrapper around the models loaded in dictionaries from the MATLAB representation.\n\n\n\n\n\n","category":"type"},{"location":"functions/#Base.convert-Tuple{Type{MATModel}, MetabolicModel}","page":"Function reference","title":"Base.convert","text":"Base.convert(::Type{MATModel}, m::MetabolicModel)\n\nConvert any metabolic model to MATModel.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA._mat_has_squashed_coupling-Tuple{Any}","page":"Function reference","title":"COBREXA._mat_has_squashed_coupling","text":"_mat_has_squashed_coupling(mat)\n\nGuesses whether C in the MAT file is stored in A=[S;C].\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.balance-Tuple{MATModel}","page":"Function reference","title":"COBREXA.balance","text":"balance(m::MATModel)\n\nExtracts balance from the MAT model, defaulting to zeroes if not present.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.bounds-Tuple{MATModel}","page":"Function reference","title":"COBREXA.bounds","text":"bounds(m::MATModel)\n\nExtracts bounds from the MAT file, saved under lb and ub.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.coupling-Tuple{MATModel}","page":"Function reference","title":"COBREXA.coupling","text":"coupling(m::MATModel)\n\nExtract coupling matrix stored, in C key.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.coupling_bounds-Tuple{MATModel}","page":"Function reference","title":"COBREXA.coupling_bounds","text":"coupling_bounds(m::MATModel)\n\nExtracts the coupling constraints. Currently, there are several accepted ways to store these in MATLAB models; this takes the constraints from vectors cl and cu.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.genes-Tuple{MATModel}","page":"Function reference","title":"COBREXA.genes","text":"genes(m::MATModel)\n\nExtracts the possible gene list from genes key.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.metabolite_charge-Tuple{MATModel, String}","page":"Function reference","title":"COBREXA.metabolite_charge","text":"metabolite_charge(m::MATModel, mid::String)\n\nExtract metabolite charge from metCharge or metCharges.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.metabolite_compartment-Tuple{MATModel, String}","page":"Function reference","title":"COBREXA.metabolite_compartment","text":"metabolite_compartment(m::MATModel, mid::String)\n\nExtract metabolite compartment from metCompartment or metCompartments.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.metabolite_formula-Tuple{MATModel, String}","page":"Function reference","title":"COBREXA.metabolite_formula","text":"metabolite_formula(m::MATModel, mid::String)\n\nExtract metabolite formula from key metFormula or metFormulas.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.metabolites-Tuple{MATModel}","page":"Function reference","title":"COBREXA.metabolites","text":"metabolites(m::MATModel)::Vector{String}\n\nExtracts metabolite names from mets key in the MAT file.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.objective-Tuple{MATModel}","page":"Function reference","title":"COBREXA.objective","text":"objective(m::MATModel)\n\nExtracts the objective from the MAT model (defaults to zeroes).\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.reaction_gene_association-Tuple{MATModel, String}","page":"Function reference","title":"COBREXA.reaction_gene_association","text":"reaction_gene_association(m::MATModel, rid::String)\n\nExtracts the associations from grRules key, if present.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.reaction_stoichiometry-Tuple{MATModel, Any}","page":"Function reference","title":"COBREXA.reaction_stoichiometry","text":"reaction_stoichiometry(model::MATModel, ridx)::Dict{String, Float64}\n\nReturn the stoichiometry of reaction at index ridx.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.reaction_stoichiometry-Tuple{MATModel, String}","page":"Function reference","title":"COBREXA.reaction_stoichiometry","text":"reaction_stoichiometry(model::MATModel, rid::String)::Dict{String, Float64}\n\nReturn the stoichiometry of reaction with ID rid.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.reactions-Tuple{MATModel}","page":"Function reference","title":"COBREXA.reactions","text":"reactions(m::MATModel)::Vector{String}\n\nExtracts reaction names from rxns key in the MAT file.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.stoichiometry-Tuple{MATModel}","page":"Function reference","title":"COBREXA.stoichiometry","text":"stoichiometry(m::MATModel)\n\nExtract the stoichiometry matrix, stored under key S.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.Metabolite","page":"Function reference","title":"COBREXA.Metabolite","text":"Metabolite structure.\n\nFields\n\nid :: String\nformula :: String\ncharge :: Int\ncompartment :: String\nnotes :: Dict{String, Vector{String}}\nannotation :: Dict{String, Union{Vector{String}, String}}\n\n\n\n\n\n","category":"type"},{"location":"functions/#COBREXA.Reaction","page":"Function reference","title":"COBREXA.Reaction","text":"mutable struct Reaction\n    id::String\n    metabolites::Dict{String,Float64}\n    lb::Float64\n    ub::Float64\n    grr::Maybe{GeneAssociation}\n    subsystem::Maybe{String}\n    notes::Notes\n    annotations::Annotations\n    objective_coefficient::Float64\nend\n\nA structure for representing a single reaction in a StandardModel.\n\n\n\n\n\n","category":"type"},{"location":"functions/#COBREXA.Reaction-2","page":"Function reference","title":"COBREXA.Reaction","text":"Reaction(\n    id = \"\";\n    metabolites = Dict{String,Float64}(),\n    lb = -_constants.default_reaction_bound,\n    ub = _constants.default_reaction_bound,\n    grr = nothing,\n    subsystem = nothing,\n    notes = Notes(),\n    annotations = Annotations(),\n    objective_coefficient = 0.0,\n)\n\nA constructor for Reaction that only takes a reaction id and assigns default/uninformative values to all the fields that are not explicitely assigned.\n\n\n\n\n\n","category":"type"},{"location":"functions/#COBREXA.Reaction-3","page":"Function reference","title":"COBREXA.Reaction","text":"Reaction(\n    id::String,\n    metabolites::Dict{String,Union{Int, Float64}},\n    dir = :bidirectional;\n    default_bound = _constants.default_reaction_bound,\n)\n\nConvenience constructor for Reaction. The reaction equation is specified using metabolites, which is a dictionary mapping metabolite ids to stoichiometric coefficients. The direcion of the reaction is set through dir which can take :bidirectional, :forward, and :reverse as values. Finally, the default_bound is the value taken to mean infinity in the context of constraint based models, often this is set to a very high flux value like 1000.\n\n\n\n\n\n","category":"type"},{"location":"functions/#COBREXA.ReactionStatus","page":"Function reference","title":"COBREXA.ReactionStatus","text":"Used for concise reporting of modeling results.\n\n\n\n\n\n","category":"type"},{"location":"functions/#COBREXA.SBMLModel","page":"Function reference","title":"COBREXA.SBMLModel","text":"struct SBMLModel\n\nThin wrapper around the model from SBML.jl library. Allows easy conversion from SBML to any other model format.\n\n\n\n\n\n","category":"type"},{"location":"functions/#Base.convert-Tuple{Type{SBMLModel}, MetabolicModel}","page":"Function reference","title":"Base.convert","text":"Base.convert(::Type{SBMLModel}, mm::MetabolicModel)\n\nConvert any metabolic model to SBMLModel.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.balance-Tuple{SBMLModel}","page":"Function reference","title":"COBREXA.balance","text":"balance(model::SBMLModel)::SparseVec\n\nBalance vector of a SBMLModel. This is always zero.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.bounds-Tuple{SBMLModel}","page":"Function reference","title":"COBREXA.bounds","text":"bounds(model::SBMLModel)::Tuple{SparseVec,SparseVec}\n\nGet the lower and upper flux bounds of model SBMLModel. Throws DomainError in case if the SBML contains mismatching units.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.genes-Tuple{SBMLModel}","page":"Function reference","title":"COBREXA.genes","text":"genes(model::SBMLModel)::Vector{String}\n\nGet genes of a SBMLModel.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.metabolite_charge-Tuple{SBMLModel, String}","page":"Function reference","title":"COBREXA.metabolite_charge","text":"metabolite_charge(model::SBMLModel, mid::String)::Maybe{Int}\n\nGet charge of a chosen metabolite from SBMLModel.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.metabolite_formula-Tuple{SBMLModel, String}","page":"Function reference","title":"COBREXA.metabolite_formula","text":"metabolite_formula(model::SBMLModel, mid::String)::Maybe{MetaboliteFormula}\n\nGet MetaboliteFormula from a chosen metabolite from SBMLModel.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.metabolites-Tuple{SBMLModel}","page":"Function reference","title":"COBREXA.metabolites","text":"metabolites(model::SBMLModel)::Vector{String}\n\nGet metabolites from a SBMLModel.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.n_genes-Tuple{SBMLModel}","page":"Function reference","title":"COBREXA.n_genes","text":"n_genes(model::SBMLModel)::Int\n\nGet number of genes in SBMLModel.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.n_metabolites-Tuple{SBMLModel}","page":"Function reference","title":"COBREXA.n_metabolites","text":"n_metabolites(model::SBMLModel)::Int\n\nEfficient counting of metabolites in SBMLModel.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.n_reactions-Tuple{SBMLModel}","page":"Function reference","title":"COBREXA.n_reactions","text":"n_reactions(model::SBMLModel)::Int\n\nEfficient counting of reactions in SBMLModel.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.objective-Tuple{SBMLModel}","page":"Function reference","title":"COBREXA.objective","text":"objective(model::SBMLModel)::SparseVec\n\nObjective of the SBMLModel.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.reaction_gene_association-Tuple{SBMLModel, String}","page":"Function reference","title":"COBREXA.reaction_gene_association","text":"reaction_gene_association(model::SBMLModel, rid::String)::Maybe{GeneAssociation}\n\nRetrieve the GeneAssociation from SBMLModel.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.reaction_stoichiometry-Tuple{SBMLModel, String}","page":"Function reference","title":"COBREXA.reaction_stoichiometry","text":"reaction_stoichiometry(model::SBMLModel, rid::String)::Dict{String, Float64}\n\nReturn the stoichiometry of reaction with ID rid.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.reactions-Tuple{SBMLModel}","page":"Function reference","title":"COBREXA.reactions","text":"reactions(model::SBMLModel)::Vector{String}\n\nGet reactions from a SBMLModel.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.stoichiometry-Tuple{SBMLModel}","page":"Function reference","title":"COBREXA.stoichiometry","text":"stoichiometry(model::SBMLModel)::SparseMat\n\nRecreate the stoichiometry matrix from the SBMLModel.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.Serialized","page":"Function reference","title":"COBREXA.Serialized","text":"mutable struct Serialized{M <: MetabolicModel}\n    m::Maybe{M}\n    filename::String\nend\n\nA meta-model that represents a model that is serialized on the disk. The internal model will be loaded on-demand by using any accessor, or by calling precache! directly.\n\n\n\n\n\n","category":"type"},{"location":"functions/#COBREXA.precache!-Tuple{Serialized}","page":"Function reference","title":"COBREXA.precache!","text":"precache!(model::Serialized{MetabolicModel})::Nothing\n\nLoad the Serialized model from disk in case it's not alreadly loaded.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.StandardModel","page":"Function reference","title":"COBREXA.StandardModel","text":"mutable struct StandardModel\n\nStandardModel is used to store a constraint based metabolic model with meta-information.  Meta-information is defined as annotation details, which include gene-reaction-rules, formulas, etc.\n\nThis model type seeks to keep as much meta-information as possible, as opposed to CoreModel and CoreModelCoupled, which keep the bare neccessities only. When merging models and keeping meta-information is important, use this as the model type.  If meta-information is not important, use the more efficient core model types.  See CoreModel and CoreModelCoupled for comparison.\n\nIn this model, reactions, metabolites, and genes are stored in ordered dictionaries indexed by each struct's id field.  For example, model.reactions[\"rxn1_id\"] returns a Reaction where the field id equals \"rxn1_id\".  This makes adding and removing reactions efficient.\n\nNote that the stoichiometric matrix (or any other core data, e.g. flux bounds) is not stored directly as in CoreModel.  When this model type is used in analysis functions, these core data structures are built from scratch each time an analysis function is called.  This can cause performance issues if you run many small analysis functions sequentially.  Consider using the core model types if performance is critical.\n\nSee also: Reaction, Metabolite, Gene\n\nFields\n\nid :: String\nreactions :: OrderedDict{String, Reaction}\nmetabolites :: OrderedDict{String, Metabolite}\ngenes :: OrderedDict{String, Gene}\n\nExample\n\nmodel = load_model(StandardModel, \"my_model.json\")\nkeys(model.reactions)\n\n\n\n\n\n","category":"type"},{"location":"functions/#Base.convert-Tuple{Type{StandardModel}, MetabolicModel}","page":"Function reference","title":"Base.convert","text":"Base.convert(::Type{StandardModel}, model::MetabolicModel)\n\nConvert any MetabolicModel into a StandardModel. Note, some data loss may occur since only the generic interface is used during the conversion process.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.balance-Tuple{StandardModel}","page":"Function reference","title":"COBREXA.balance","text":"balance(model::StandardModel)\n\nReturn the balance of the linear problem, i.e. b in Sv = 0 where S is the stoichiometric matrix and v is the flux vector.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.bounds-Tuple{StandardModel}","page":"Function reference","title":"COBREXA.bounds","text":"bounds(model::StandardModel)\n\nReturn the lower and upper bounds, respectively, for reactions in model. Order matches that of the reaction ids returned in reactions().\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.gene_annotations-Tuple{StandardModel, String}","page":"Function reference","title":"COBREXA.gene_annotations","text":"gene_annotations(model::StandardModel, id::String)::Annotations\n\nReturn the annotation associated with gene id in model. Return an empty Dict if not present.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.gene_notes-Tuple{StandardModel, String}","page":"Function reference","title":"COBREXA.gene_notes","text":"gene_notes(model::StandardModel, id::String)::Notes\n\nReturn the notes associated with gene id in model. Return an empty Dict if not present.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.genes-Tuple{StandardModel}","page":"Function reference","title":"COBREXA.genes","text":"genes(model::StandardModel)\n\nReturn a vector of gene id strings in model.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.lower_bounds-Tuple{StandardModel}","page":"Function reference","title":"COBREXA.lower_bounds","text":"lower_bounds(model::StandardModel)\n\nReturn the lower bounds for all reactions in model in sparse format.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.metabolite_annotations-Tuple{StandardModel, String}","page":"Function reference","title":"COBREXA.metabolite_annotations","text":"metabolite_annotations(model::StandardModel, id::String)::Annotations\n\nReturn the annotation associated with metabolite id in model. Return an empty Dict if not present.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.metabolite_charge-Tuple{StandardModel, String}","page":"Function reference","title":"COBREXA.metabolite_charge","text":"metabolite_charge(model::StandardModel, id::String)\n\nReturn the charge associated with metabolite id in model. Return nothing if not present.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.metabolite_compartment-Tuple{StandardModel, String}","page":"Function reference","title":"COBREXA.metabolite_compartment","text":"metabolite_compartment(model::StandardModel, id::String)\n\nReturn compartment associated with metabolite id in model. Return nothing if not present.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.metabolite_formula-Tuple{StandardModel, String}","page":"Function reference","title":"COBREXA.metabolite_formula","text":"metabolite_formula(model::StandardModel, id::String)\n\nReturn the formula of reaction id in model. Return nothing if not present.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.metabolite_notes-Tuple{StandardModel, String}","page":"Function reference","title":"COBREXA.metabolite_notes","text":"metabolite_notes(model::StandardModel, id::String)::Notes\n\nReturn the notes associated with metabolite id in model. Return an empty Dict if not present.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.metabolites-Tuple{StandardModel}","page":"Function reference","title":"COBREXA.metabolites","text":"metabolites(model::StandardModel)\n\nReturn a vector of metabolite id strings contained in model. The order of metabolite strings returned here matches the order used to construct the stoichiometric matrix.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.n_genes-Tuple{StandardModel}","page":"Function reference","title":"COBREXA.n_genes","text":"n_genes(model::StandardModel)\n\nReturn the number of genes in model.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.n_metabolites-Tuple{StandardModel}","page":"Function reference","title":"COBREXA.n_metabolites","text":"n_metabolites(model::StandardModel)\n\nReturn the number of metabolites in model.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.n_reactions-Tuple{StandardModel}","page":"Function reference","title":"COBREXA.n_reactions","text":"n_reactions(model::StandardModel)\n\nReturn the number of reactions contained in model.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.objective-Tuple{StandardModel}","page":"Function reference","title":"COBREXA.objective","text":"objective(model::StandardModel)\n\nReturn sparse objective vector for model.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.reaction_annotations-Tuple{StandardModel, String}","page":"Function reference","title":"COBREXA.reaction_annotations","text":"reaction_annotations(model::StandardModel, id::String)::Annotations\n\nReturn the annotation associated with reaction id in model. Return an empty Dict if not present.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.reaction_gene_association-Tuple{StandardModel, String}","page":"Function reference","title":"COBREXA.reaction_gene_association","text":"reaction_gene_association(model::StandardModel, id::String)\n\nReturn the gene reaction rule in string format for reaction with id in model. Return nothing if not available.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.reaction_notes-Tuple{StandardModel, String}","page":"Function reference","title":"COBREXA.reaction_notes","text":"reaction_notes(model::StandardModel, id::String)::Notes\n\nReturn the notes associated with reaction id in model. Return an empty Dict if not present.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.reaction_stoichiometry-Tuple{StandardModel, String}","page":"Function reference","title":"COBREXA.reaction_stoichiometry","text":"reaction_stoichiometry(model::StandardModel, rid::String)::Dict{String, Float64}\n\nReturn the stoichiometry of reaction with ID rid.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.reaction_subsystem-Tuple{StandardModel, String}","page":"Function reference","title":"COBREXA.reaction_subsystem","text":"reaction_subsystem(id::String, model::StandardModel)\n\nReturn the subsystem associated with reaction id in model. Return nothing if not present.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.reactions-Tuple{StandardModel}","page":"Function reference","title":"COBREXA.reactions","text":"reactions(model::StandardModel)\n\nReturn a vector of reaction id strings contained in model. The order of reaction ids returned here matches the order used to construct the stoichiometric matrix.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.stoichiometry-Tuple{StandardModel}","page":"Function reference","title":"COBREXA.stoichiometry","text":"stoichiometry(model::StandardModel)\n\nReturn the stoichiometric matrix associated with model in sparse format.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.upper_bounds-Tuple{StandardModel}","page":"Function reference","title":"COBREXA.upper_bounds","text":"upper_bounds(model::StandardModel)\n\nReturn the upper bounds for all reactions in model in sparse format. Order matches that of the reaction ids returned in reactions().\n\n\n\n\n\n","category":"method"},{"location":"functions/#Base-functions","page":"Function reference","title":"Base functions","text":"","category":"section"},{"location":"functions/","page":"Function reference","title":"Function reference","text":"Modules = [COBREXA]\nPages = map(file -> joinpath(\"base\", file), readdir(\"../src/base\"))","category":"page"},{"location":"functions/#COBREXA._constants","page":"Function reference","title":"COBREXA._constants","text":"A named tuple that contains the magic values that are used globally for whatever purposes.\n\n\n\n\n\n","category":"constant"},{"location":"functions/#COBREXA.get_optmodel_bounds-Tuple{Any}","page":"Function reference","title":"COBREXA.get_optmodel_bounds","text":"get_optmodel_bounds(opt_model)\n\nReturns vectors of the lower and upper bounds of opt_model constraints, where opt_model is a JuMP model constructed by e.g. make_optimization_model or flux_balance_analysis.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.is_solved-Tuple{Any}","page":"Function reference","title":"COBREXA.is_solved","text":"is_solved(optmodel)\n\nReturn true if optmodel solved successfully (solution is optimal or locally optimal).  Return false if any other termination status is reached. Termination status is defined in the documentation of JuMP.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.make_optimization_model-Tuple{MetabolicModel, Any}","page":"Function reference","title":"COBREXA.make_optimization_model","text":"make_optimization_model(\n    model::MetabolicModel,\n    optimizer;\n    sense = MOI.MAX_SENSE,\n)\n\nConvert MetabolicModels to a JuMP model, place objectives and the equality constraint.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.optimize_objective-Tuple{Any}","page":"Function reference","title":"COBREXA.optimize_objective","text":"optimize_objective(optmodel)::Union{Float64,Nothing}\n\nShortcut for running JuMP optimize! on a model and returning the objective value, if solved.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.set_optmodel_bound!-Tuple{Any, Any}","page":"Function reference","title":"COBREXA.set_optmodel_bound!","text":"set_optmodel_bound!(index, optimization_model;\n    ub=_constants.default_reaction_rate,\n    lb=-_constants.default_reaction_rate)\n\nHelper function to set the bounds of variables. The JuMP set_normalized_rhs function is a little confusing, so this function simplifies setting constraints. In short, JuMP uses a normalized right hand side representation of constraints, which means that lower bounds have their sign flipped. This function does this for you, so you don't have to remember to do this whenever you change the constraints.\n\nJust supply the constraint index and the JuMP model (opt_model) that will be solved, and the variable's bounds will be set to ub and lb.\n\n\n\n\n\n","category":"method"},{"location":"functions/#File-I/O-and-serialization","page":"Function reference","title":"File I/O and serialization","text":"","category":"section"},{"location":"functions/","page":"Function reference","title":"Function reference","text":"Modules = [COBREXA]\nPages = map(file -> joinpath(\"io\", file), readdir(\"../src/io\"))","category":"page"},{"location":"functions/#COBREXA.load_model-Tuple{String}","page":"Function reference","title":"COBREXA.load_model","text":"load_model(file_name::String)::MetabolicModel\n\nGeneric function for loading models that chooses a specific loader function from the file_name extension, or throws an error.\n\nCurrently, these model types are supported:\n\nSBML models (*.xml, loaded with load_sbml_model)\nJSON models (*.json, loaded with load_json_model)\nMATLAB models (*.mat, loaded with load_mat_model)\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.load_model-Union{Tuple{T}, Tuple{Type{T}, String}} where T<:MetabolicModel","page":"Function reference","title":"COBREXA.load_model","text":"load_model(type::Type{T}, file_name::String)::T where T\n\nHelper function tht loads the model using load_model and return it converted to type.\n\nExample:\n\nload_model(CoreModel, \"mySBMLModel.xml\")\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.save_model-Tuple{MetabolicModel, String}","page":"Function reference","title":"COBREXA.save_model","text":"save_model(model::MetabolicModel, file_name::String)\n\nGeneric function for saving models that chooses a specific writer function from the file_name extension, or throws an error.\n\nCurrently, these model types are supported:\n\nJSON models (*.json, loaded with save_json_model)\nMATLAB models (*.mat, loaded with save_mat_model)\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.load_json_model-Tuple{String}","page":"Function reference","title":"COBREXA.load_json_model","text":"load_json_model(filename::String)::JSONModel\n\nLoad and return a JSON-formatted model that is stored in file_name.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.save_json_model-Tuple{MetabolicModel, String}","page":"Function reference","title":"COBREXA.save_json_model","text":"save_json_model(model::MetabolicModel, file_name::String)\n\nSave a JSONModel in model to a JSON file file_name.\n\nIn case the model is not JSONModel, it will be converted automatically.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.load_mat_model-Tuple{String}","page":"Function reference","title":"COBREXA.load_mat_model","text":"load_mat_model(file_name::String)\n\nLoad and return a MATLAB file file_name that contains a COBRA-compatible model.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.save_mat_model-Tuple{MetabolicModel, String}","page":"Function reference","title":"COBREXA.save_mat_model","text":"save_mat_model(model::MetabolicModel, file_name::String; model_name::String=\"model\")\n\nSave a MATModel in model to a MATLAB file file_name in a format compatible with other MATLAB-based COBRA software.\n\nIn case the model is not MATModel, it will be converted automatically.\n\nmodel_name is the identifier name for the whole model written to the MATLAB file; defaults to just \"model\".\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.load_sbml_model-Tuple{String}","page":"Function reference","title":"COBREXA.load_sbml_model","text":"load_sbml_model(file_name::String)::SBMLModel\n\nLoad and return a SBML XML model in file_name.\n\n\n\n\n\n","category":"method"},{"location":"functions/#Pretty-printing","page":"Function reference","title":"Pretty printing","text":"","category":"section"},{"location":"functions/","page":"Function reference","title":"Function reference","text":"Modules = [COBREXA]\nPages = map(file -> joinpath(\"io\", \"show\", file), readdir(\"../src/io/show\"))","category":"page"},{"location":"functions/#Base.show-Tuple{IO, MIME{Symbol(\"text/plain\")}, MetabolicModel}","page":"Function reference","title":"Base.show","text":"Pretty printing of everything metabolic-modelish.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA._pretty_substances-Tuple{Vector{String}}","page":"Function reference","title":"COBREXA._pretty_substances","text":"_pretty_substances(ss::Vector{String})::String\n\nNicely format a substance list.\n\n\n\n\n\n","category":"method"},{"location":"functions/#Base.show-Union{Tuple{M}, Tuple{IO, MIME{Symbol(\"text/plain\")}, Serialized{M}}} where M","page":"Function reference","title":"Base.show","text":"Base.show(io::IO, ::MIME\"text/plain\", m::Serialized{M}) where {M}\n\nShow the Serialized model without unnecessarily loading it.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA._pretty_print_keyvals-Tuple{Any, String, Any}","page":"Function reference","title":"COBREXA._pretty_print_keyvals","text":"_pretty_print_keyvals(io, def::String, payload; kwargs...)\n\nNicely prints keys and values.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA._pretty_print_keyvals-Tuple{Any, String, Dict}","page":"Function reference","title":"COBREXA._pretty_print_keyvals","text":"_pretty_print_keyvals(\n    io,\n    def::String,\n    payload::Dict\n)\n\nSpecialization of _pretty_print_keyvals for dictionaries.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA._pretty_print_keyvals-Tuple{Any, String, String}","page":"Function reference","title":"COBREXA._pretty_print_keyvals","text":"_pretty_print_keyvals(\n    io,\n    def::String,\n    payload::String\n)\n\nSpecialization of _pretty_print_keyvals for plain strings.\n\n\n\n\n\n","category":"method"},{"location":"functions/#Model-reconstruction","page":"Function reference","title":"Model reconstruction","text":"","category":"section"},{"location":"functions/","page":"Function reference","title":"Function reference","text":"Modules = [COBREXA]\nPages = map(file -> joinpath(\"reconstruction\", file), readdir(\"../src/reconstruction\"))","category":"page"},{"location":"functions/#COBREXA.add_reactions-Tuple{CoreModel, CoreModel}","page":"Function reference","title":"COBREXA.add_reactions","text":"add_reactions(m1::CoreModel, m2::CoreModel; check_consistency = false)\n\nAdd all reactions from m2 to m1.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.add_reactions-Union{Tuple{K}, Tuple{V2}, Tuple{V1}, Tuple{CoreModel, V1, V2, AbstractFloat, AbstractFloat, AbstractFloat, String, K}} where {V1<:AbstractVector{Float64}, V2<:AbstractVector{Float64}, K<:AbstractVector{String}}","page":"Function reference","title":"COBREXA.add_reactions","text":"add_reactions(\n    m::CoreModel,\n    s::V1,\n    b::V2,\n    c::AbstractFloat,\n    xl::AbstractFloat,\n    xu::AbstractFloat,\n    rxn::String,\n    mets::K;\n    check_consistency = false,\n) where {V1<:VecType,V2<:VecType,K<:StringVecType}\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.add_reactions-Union{Tuple{K}, Tuple{V}, Tuple{M}, Tuple{CoreModel, M, V, V, V, V, K, K}} where {M<:AbstractMatrix{Float64}, V<:AbstractVector{Float64}, K<:AbstractVector{String}}","page":"Function reference","title":"COBREXA.add_reactions","text":"add_reactions(\n    m::CoreModel,\n    Sp::M,\n    b::V,\n    c::V,\n    xl::V,\n    xu::V,\n    rxns::K,\n    mets::K;\n    check_consistency = false,\n) where {M<:MatType,V<:VecType,K<:StringVecType}\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.add_reactions-Union{Tuple{V2}, Tuple{V1}, Tuple{CoreModel, V1, V2, AbstractFloat, AbstractFloat, AbstractFloat}} where {V1<:AbstractVector{Float64}, V2<:AbstractVector{Float64}}","page":"Function reference","title":"COBREXA.add_reactions","text":"add_reactions(\n    m::CoreModel,\n    s::V1,\n    b::V2,\n    c::AbstractFloat,\n    xl::AbstractFloat,\n    xu::AbstractFloat;\n    check_consistency = false,\n) where {V1<:VecType,V2<:VecType}\n\nAdd reaction(s) to a CoreModel model m.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.add_reactions-Union{Tuple{V}, Tuple{M}, Tuple{CoreModel, M, V, V, V, V}} where {M<:AbstractMatrix{Float64}, V<:AbstractVector{Float64}}","page":"Function reference","title":"COBREXA.add_reactions","text":"add_reactions(\n    m::CoreModel,\n    Sp::M,\n    b::V,\n    c::V,\n    xl::V,\n    xu::V;\n    check_consistency = false,\n) where {M<:MatType,V<:VecType}\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.remove_metabolites-Tuple{CoreModel, Any}","page":"Function reference","title":"COBREXA.remove_metabolites","text":"remove_metabolites(model::CoreModel, metabolites)\n\nRemoves a set of metabolites from the model of type CoreModel and returns a new CoreModel without those metabolites. Here, metabolites can be either a string, a vector of strings, an index or a vector of indices. Also removes any reactions that have no associated metabolites after the metabolites have been removed.\n\nExample\n\nmodel = load_model(CoreModel, \"e_coli_core.json\")\n\nm1 = remove_metabolites(model, [\"glc__D_e\", \"for_c\"])\nm2 = remove_metabolites(model, \"glc__D_e\")\nm3 = remove_metabolites(model, indexin([\"glc__D_e\", \"for_c\"], metabolites(model)))\nm4 = remove_metabolites(model, first(indexin([\"glc__D_e\"], metabolites(model))))\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.remove_reactions-Tuple{CoreModel, Int64}","page":"Function reference","title":"COBREXA.remove_reactions","text":"remove_reactions(m::CoreModel, rxn::Int)\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.remove_reactions-Tuple{CoreModel, String}","page":"Function reference","title":"COBREXA.remove_reactions","text":"remove_reactions(m::CoreModel, rxn::String)\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.remove_reactions-Tuple{CoreModel, Vector{Int64}}","page":"Function reference","title":"COBREXA.remove_reactions","text":"remove_reactions(m::CoreModel, rxns::Vector{Int})\n\nRemoves a set of reactions from a CoreModel. Also removes the metabolites not involved in any reaction.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.remove_reactions-Tuple{CoreModel, Vector{String}}","page":"Function reference","title":"COBREXA.remove_reactions","text":"remove_reactions(m::CoreModel, rxns::Vector{String})\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.verify_consistency-Union{Tuple{K}, Tuple{V}, Tuple{M}, Tuple{CoreModel, M, V, V, V, V, K, K, Any, Any}} where {M<:AbstractMatrix{Float64}, V<:AbstractVector{Float64}, K<:AbstractVector{String}}","page":"Function reference","title":"COBREXA.verify_consistency","text":"verify_consistency(\n    m::CoreModel,\n    Sp::M,\n    b::V,\n    c::V,\n    xl::V,\n    xu::V,\n    names::K,\n    mets::K,\n    new_reactions,\n    new_metabolites,\n) where {M<:MatType,V<:VecType,K<:StringVecType}\n\nCheck the consistency of given reactions with existing reactions in m.\n\nTODO: work in progress, doesn't return consistency status.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.add_coupling_constraints!-Tuple{CoreModelCoupled, AbstractVector{Float64}, AbstractFloat, AbstractFloat}","page":"Function reference","title":"COBREXA.add_coupling_constraints!","text":"add_coupling_constraints!(\n    m::CoreModelCoupled,\n    c::VecType,\n    cl::AbstractFloat,\n    cu::AbstractFloat,\n)\n\nOverload for adding a single coupling constraint.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.add_coupling_constraints!-Union{Tuple{V}, Tuple{CoreModelCoupled, AbstractMatrix{Float64}, V, V}} where V<:AbstractVector{Float64}","page":"Function reference","title":"COBREXA.add_coupling_constraints!","text":"add_coupling_constraints!(\n    m::CoreModelCoupled,\n    C::MatType,\n    cl::V,\n    cu::V,\n) where {V<:VecType}\n\nIn-place add a single coupling constraint in form\n\n    cₗ ≤ C x ≤ cᵤ\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.add_coupling_constraints-Tuple{CoreModel, Vararg{Any, N} where N}","page":"Function reference","title":"COBREXA.add_coupling_constraints","text":"add_coupling_constraints(m::CoreModel, args...)\n\nAdd coupling constraints to a plain CoreModel (returns a CoreModelCoupled).\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.add_coupling_constraints-Tuple{CoreModelCoupled, Vararg{Any, N} where N}","page":"Function reference","title":"COBREXA.add_coupling_constraints","text":"Add constraints of the following form to a CoreModelCoupled and return a modified one.\n\nAdd constraints to a CoreModelCoupled and return a modified one.\n\nThe arguments are same as for in-place add_coupling_constraints!.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.add_reactions-Tuple{CoreModelCoupled, CoreModel}","page":"Function reference","title":"COBREXA.add_reactions","text":"add_reactions(m1::CoreModelCoupled, m2::CoreModel; check_consistency = false)\n\nAdd all reactions from m2 to m1.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.add_reactions-Union{Tuple{K}, Tuple{V2}, Tuple{V1}, Tuple{CoreModelCoupled, V1, V2, AbstractFloat, AbstractFloat, AbstractFloat, String, K}} where {V1<:AbstractVector{Float64}, V2<:AbstractVector{Float64}, K<:AbstractVector{String}}","page":"Function reference","title":"COBREXA.add_reactions","text":"add_reactions(\n    m::CoreModelCoupled,\n    s::V1,\n    b::V2,\n    c::AbstractFloat,\n    xl::AbstractFloat,\n    xu::AbstractFloat,\n    rxn::String,\n    mets::K;\n    check_consistency = false,\n) where {V1<:VecType,V2<:VecType,K<:StringVecType}\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.add_reactions-Union{Tuple{K}, Tuple{V}, Tuple{M}, Tuple{CoreModelCoupled, M, V, V, V, V, K, K}} where {M<:AbstractMatrix{Float64}, V<:AbstractVector{Float64}, K<:AbstractVector{String}}","page":"Function reference","title":"COBREXA.add_reactions","text":"add_reactions(\n    m::CoreModelCoupled,\n    Sp::M,\n    b::V,\n    c::V,\n    xl::V,\n    xu::V,\n    rxns::K,\n    mets::K;\n    check_consistency = false,\n) where {M<:MatType,V<:VecType,K<:StringVecType}\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.add_reactions-Union{Tuple{V2}, Tuple{V1}, Tuple{CoreModelCoupled, V1, V2, AbstractFloat, AbstractFloat, AbstractFloat}} where {V1<:AbstractVector{Float64}, V2<:AbstractVector{Float64}}","page":"Function reference","title":"COBREXA.add_reactions","text":"add_reactions(\n    m::CoreModelCoupled,\n    s::V1,\n    b::V2,\n    c::AbstractFloat,\n    xl::AbstractFloat,\n    xu::AbstractFloat;\n    check_consistency = false,\n) where {V1<:VecType,V2<:VecType}\n\nAdd reaction(s) to a CoreModelCoupled model m.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.add_reactions-Union{Tuple{V}, Tuple{M}, Tuple{CoreModelCoupled, M, V, V, V, V}} where {M<:AbstractMatrix{Float64}, V<:AbstractVector{Float64}}","page":"Function reference","title":"COBREXA.add_reactions","text":"add_reactions(\n    m::CoreModelCoupled,\n    Sp::M,\n    b::V,\n    c::V,\n    xl::V,\n    xu::V;\n    check_consistency = false,\n) where {M<:MatType,V<:VecType}\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.change_coupling_bounds!-Union{Tuple{V}, Tuple{CoreModelCoupled, Vector{Int64}}} where V<:AbstractVector{Float64}","page":"Function reference","title":"COBREXA.change_coupling_bounds!","text":"change_coupling_bounds!(\n    model::CoreModelCoupled,\n    constraints::Vector{Int};\n    cl::V = Float64[],\n    cu::V = Float64[],\n) where {V<:VecType}\n\nChange the lower and/or upper bounds (cl and cu) for the given list of coupling constraints.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.remove_coupling_constraints!-Tuple{CoreModelCoupled, Int64}","page":"Function reference","title":"COBREXA.remove_coupling_constraints!","text":"remove_coupling_constraints!(m::CoreModelCoupled, constraint::Int)\n\nRemoves a single coupling constraints from a CoreModelCoupled in-place.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.remove_coupling_constraints!-Tuple{CoreModelCoupled, Vector{Int64}}","page":"Function reference","title":"COBREXA.remove_coupling_constraints!","text":"remove_coupling_constraints!(m::CoreModelCoupled, constraints::Vector{Int})\n\nRemoves a set of coupling constraints from a CoreModelCoupled in-place.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.remove_coupling_constraints-Tuple{CoreModelCoupled, Vararg{Any, N} where N}","page":"Function reference","title":"COBREXA.remove_coupling_constraints","text":"remove_coupling_constraints(m::CoreModelCoupled, args...)\n\nRemove coupling constraints from the linear model, and return the modified model. Arguments are the same as for in-place version remove_coupling_constraints!.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.remove_reactions-Tuple{CoreModelCoupled, Int64}","page":"Function reference","title":"COBREXA.remove_reactions","text":"remove_reactions(m::CoreModelCoupled, rxn::Int)\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.remove_reactions-Tuple{CoreModelCoupled, String}","page":"Function reference","title":"COBREXA.remove_reactions","text":"remove_reactions(m::CoreModelCoupled, rxn::String)\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.remove_reactions-Tuple{CoreModelCoupled, Vector{Int64}}","page":"Function reference","title":"COBREXA.remove_reactions","text":"remove_reactions(m::CoreModelCoupled, rxns::Vector{Int})\n\nRemove reaction(s) from a CoreModelCoupled.\n\nAlso removes any metabolites not involved in any reaction after the deletion.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.remove_reactions-Tuple{CoreModelCoupled, Vector{String}}","page":"Function reference","title":"COBREXA.remove_reactions","text":"remove_reactions(m::CoreModelCoupled, rxns::Vector{String})\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.:←-Tuple{Union{Nothing, Metabolite, MetaboliteWithCoefficient, Vector{MetaboliteWithCoefficient}}, Union{Nothing, Metabolite, MetaboliteWithCoefficient, Vector{MetaboliteWithCoefficient}}}","page":"Function reference","title":"COBREXA.:←","text":"←(\n    substrates::Union{\n        Nothing,\n        Metabolite,\n        MetaboliteWithCoefficient,\n        Vector{MetaboliteWithCoefficient},\n    },\n    products::Union{\n        Nothing,\n        Metabolite,\n        MetaboliteWithCoefficient,\n        Vector{MetaboliteWithCoefficient}\n    },\n)\n\nMake a reverse-only Reaction from substrates and products.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.:→-Tuple{Union{Nothing, Metabolite, MetaboliteWithCoefficient, Vector{MetaboliteWithCoefficient}}, Union{Nothing, Metabolite, MetaboliteWithCoefficient, Vector{MetaboliteWithCoefficient}}}","page":"Function reference","title":"COBREXA.:→","text":"→(\n    substrates::Union{\n        Nothing,\n        Metabolite,\n        MetaboliteWithCoefficient,\n        Vector{MetaboliteWithCoefficient},\n    },\n    products::Union{\n        Nothing,\n        Metabolite,\n        MetaboliteWithCoefficient,\n        Vector{MetaboliteWithCoefficient}\n    },\n)\n\nMake a forward-only Reaction from substrates and products.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.:↔-Tuple{Union{Nothing, Metabolite, MetaboliteWithCoefficient, Vector{MetaboliteWithCoefficient}}, Union{Nothing, Metabolite, MetaboliteWithCoefficient, Vector{MetaboliteWithCoefficient}}}","page":"Function reference","title":"COBREXA.:↔","text":"↔(\n    substrates::Union{\n        Nothing,\n        Metabolite,\n        MetaboliteWithCoefficient,\n        Vector{MetaboliteWithCoefficient},\n    },\n    products::Union{\n        Nothing,\n        Metabolite,\n        MetaboliteWithCoefficient,\n        Vector{MetaboliteWithCoefficient}\n    },\n)\n\nMake a bidirectional (reversible) Reaction from substrates and products.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.add_gene!-Tuple{StandardModel, Gene}","page":"Function reference","title":"COBREXA.add_gene!","text":"add_gene!(model::StandardModel, genes::Gene)\n\nAdd gene to model based on gene id.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.add_genes!-Tuple{StandardModel, Vector{Gene}}","page":"Function reference","title":"COBREXA.add_genes!","text":"add_genes!(model::StandardModel, genes::Vector{Gene})\n\nAdd genes to model based on gene id.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.add_metabolite!-Tuple{StandardModel, Metabolite}","page":"Function reference","title":"COBREXA.add_metabolite!","text":"add_metabolite!(model::StandardModel, met::Metabolite)\n\nAdd met to model based on metabolite id.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.add_metabolites!-Tuple{StandardModel, Vector{Metabolite}}","page":"Function reference","title":"COBREXA.add_metabolites!","text":"add_metabolites!(model::StandardModel, mets::Vector{Metabolite})\n\nAdd mets to model based on metabolite id.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.add_reaction!-Tuple{StandardModel, Reaction}","page":"Function reference","title":"COBREXA.add_reaction!","text":"add_reaction!(model::StandardModel, rxn::Reaction)\n\nAdd rxn to model based on reaction id.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.add_reactions!-Tuple{StandardModel, Vector{Reaction}}","page":"Function reference","title":"COBREXA.add_reactions!","text":"add_reactions!(model::StandardModel, rxns::Vector{Reaction})\n\nAdd rxns to model based on reaction id.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.remove_gene!-Tuple{StandardModel, String}","page":"Function reference","title":"COBREXA.remove_gene!","text":"remove_gene!(\n    model::StandardModel,\n    id::Vector{String};\n    knockout_reactions::Bool = false,\n)\n\nRemove gene with id from model. If knockout_reactions is true, then also constrain reactions that require the genes to function to carry zero flux.\n\nExample\n\nremove_gene!(model, \"g1\")\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.remove_genes!-Tuple{StandardModel, Vector{String}}","page":"Function reference","title":"COBREXA.remove_genes!","text":"remove_genes!(\n    model::StandardModel,\n    ids::Vector{String};\n    knockout_reactions::Bool = false,\n)\n\nRemove all genes with ids from model. If knockout_reactions is true, then also constrain reactions that require the genes to function to carry zero flux.\n\nExample\n\nremove_genes!(model, [\"g1\", \"g2\"])\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.remove_metabolite!-Tuple{StandardModel, String}","page":"Function reference","title":"COBREXA.remove_metabolite!","text":"remove_metabolite!(model::StandardModel, id::String)\n\nRemove metabolite with id from model. Warning, this could leave the model inconsistent, e.g. a reaction might require the deleted metabolite, in which case analysis functions will error.\n\nExample\n\nremove_metabolite!(model, \"atp_c\")\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.remove_metabolites!-Tuple{StandardModel, Vector{String}}","page":"Function reference","title":"COBREXA.remove_metabolites!","text":"remove_metabolites!(model::StandardModel, ids::Vector{String})\n\nRemove all metabolites with ids from model. Warning, this could leave the model inconsistent, e.g. a reaction might require the deleted metabolite, in which case analysis functions will error.\n\nExample\n\nremove_metabolites!(model, [\"atp_c\", \"adp_c\"])\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.remove_reaction!-Tuple{StandardModel, String}","page":"Function reference","title":"COBREXA.remove_reaction!","text":"remove_reaction!(model::StandardModel, id::String)\n\nRemove reaction with id from model. Note, may result in orphan metabolites.\n\nExample\n\nremove_reaction!(model, \"EX_glc__D_e\")\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.remove_reactions!-Tuple{StandardModel, Vector{String}}","page":"Function reference","title":"COBREXA.remove_reactions!","text":"remove_reactions!(model::StandardModel, ids::Vector{String})\n\nRemove all reactions with ids from model. Note, may result in orphan metabolites.\n\nExample\n\nremove_reactions!(model, [\"EX_glc__D_e\", \"fba\"])\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.@add_reactions!-Tuple{Symbol, Expr}","page":"Function reference","title":"COBREXA.@add_reactions!","text":"@add_reactions!(model::Symbol, ex::Expr)\n\nShortcut to add multiple reactions and their lower and upper bounds\n\nCall variants\n\n@add_reactions! model begin\n    reaction_name, reaction\nend\n\n@add_reactions! model begin\n    reaction_name, reaction, lower_bound\nend\n\n@add_reactions! model begin\n    reaction_name, reaction, lower_bound, upper_bound\nend\n\nExamples\n\n@add_reactions! model begin\n    \"v1\", nothing → A, 0, 500\n    \"v2\", A ↔ B + C, -500\n    \"v3\", B + C → nothing\nend\n\n\n\n\n\n","category":"macro"},{"location":"functions/#COBREXA.add_model_with_exchanges-Tuple{CoreModel, MetabolicModel, Vector{String}, Vector{String}}","page":"Function reference","title":"COBREXA.add_model_with_exchanges","text":"add_model_with_exchanges(\n    community::CoreModel,\n    model::MetabolicModel,\n    exchange_rxn_ids::Vector{String},\n    exchange_met_ids::Vector{String};\n    model_name = \"unknown_species\",\n    biomass_id = nothing,\n)::CoreModel\n\nAdd model to community, which is a pre-existing community model with exchange_rxn_ids and exchange_met_ids. The model_name is appended to each reaction and metabolite, see join_with_exchanges. If biomass_id is specified then a biomass metabolite for model is also added to the resulting model. The column corresponding to the biomass_id reaction then produces this new biomass metabolite with unit coefficient. Note, exchange_rxn_ids and exchange_met_ids must already exist in the community model.\n\nExample\n\ncommunity = add_model_with_exchanges(community, model, exchange_rxn_ids, exchange_met_ids; model_name=\"species_2\", biomass_id=\"BIOMASS_Ecoli_core_w_GAM\")\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.add_objective!-Tuple{CoreModel, Vector{String}}","page":"Function reference","title":"COBREXA.add_objective!","text":"add_objective!(\n    community::CoreModel,\n    objective_mets::Vector{String};\n    objective_weights = Float64[],\n    objective_column_index = 0,\n)\n\nAdd an objective to the community model. Supply the string names of the objective metabolites in objective_mets. Optionally specify the weight to assign each metabolite in the objective function, if unassigned then equal weight is assumed. Also, optionally specify whether the objective already exists in the model by assigning objective_column_index. If unassigned then an objective column will be added, otherwise the column at objective_column_index will be updated.\n\nNote, the weights are negated inside the function so that the objective metabolites are seen as reagents/substrates, not products in the reaction equation.\n\nExample\n\nadd_objective!(model, [\"met1\", \"met2\"]) # adds a new column with weights = [1,1]\nadd_objective!(model, [\"met1\", \"met2\"]; objective_weights=[0.1, 0.9]) # adds a new column\nadd_objective!(model, [\"met1\", \"met2\"]; objective_weights=[0.1, 0.9], objective_column_index=10) # updates column 10\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.join_with_exchanges-Union{Tuple{M}, Tuple{Vector{M}, Vector{String}, Vector{String}}} where M<:MetabolicModel","page":"Function reference","title":"COBREXA.join_with_exchanges","text":"join_with_exchanges(models::Vector{M},\n    exchange_rxn_ids::Vector{String},\n    exchange_met_ids::Vector{String};\n    add_biomass_objective=false,\n    biomass_ids::Vector{String},\n    model_names=String[]\n)\n\nReturn a CoreModel representing the community model of models joined through their exchange_rxn_ids and exchange_met_ids. These exchange reactions and metabolites link to environmental metabolites and reactions. Optionally specify model_names to append a specific name to each reaction and metabolite of an organism for easier reference (default is species_i for each model index i in models). Note, the bounds of the environmental variables are all set to zero. Thus, to run a simulation you need to constrain them appropriately. All the other bounds are inherited from the models used to construct the community model.\n\nIf add_biomass_objective is true then biomass_ids needs to be supplied as well. This creates a model with an extra reaction added to the end of the stoichiometric matrix (last column) that can be assigned as the objective reaction. It also creates biomass \"metabolites\" that can be used in this objective reaction. Note, this reaction is unspecified, further action needs to be taken to specify it, e.g. assign weights to the last column of the stoichiometric matrix in the rows corresponding to the biomass metabolites.\n\nTo further clarify how this join works. Suppose you have 2 organisms with stoichiometric matrices S₁ and S₂ and you want to link them with exchange_met_ids = [em₁, em₂, em₃, ...] and exchange_rxn_ids = [er₁, er₂, er₃, ...]. Then a new community stoichiometric matrix is constructed that looks like this:\n\n            _      er₁  er₂  er₃  ...  b_\n           |S₁                           |\n           |   S₂                        |\n        em₁|                             |\nS   =   em₂|                             |\n        em₃|                             |\n        ...|                             |\n        bm₁|                             |\n        bm₂|_                           _|\n\n\nThe exchange reactions in each model get linked to environmental metabolites, emᵢ, and these get linked to environmental exchanges, erᵢ. These erᵢ behave like normal single organism exchange reactions. When add_biomass_objective is true each model's biomass becomes a pseudo-metabolite (bmᵢ). These can be weighted in column b, called the community_biomass reaction in the community model, if desired. Refer to the tutorial if this is unclear.\n\nExample\n\nm1 = load_model(core_model_path)\nm2 = load_model(CoreModel, core_model_path)\n\n# need to list ALL the exchanges that will form part of the entire model\nexchange_rxn_ids = filter(looks_like_exchange_reaction, reactions(m1))\nexchange_met_ids = [first(keys(reaction_stoichiometry(m1, ex_rxn))) for ex_rxn in exchange_rxn_ids]\n\nbiomass_ids = [\"BIOMASS_Ecoli_core_w_GAM\", \"BIOMASS_Ecoli_core_w_GAM\"]\n\ncommunity = join_with_exchanges(\n    [m1, m2],\n    exchange_rxn_ids,\n    exchange_met_ids;\n    add_biomass_objective = true,\n    biomass_ids = biomass_ids,\n)\n\n\n\n\n\n","category":"method"},{"location":"functions/#Model-variant-specifications","page":"Function reference","title":"Model variant specifications","text":"","category":"section"},{"location":"functions/","page":"Function reference","title":"Function reference","text":"Modules = [COBREXA]\nPages = map(file -> joinpath(\"reconstruction\", \"modifications\", file), readdir(\"../src/reconstruction/modifications\"))","category":"page"},{"location":"functions/#COBREXA.with_added_reactions-Tuple","page":"Function reference","title":"COBREXA.with_added_reactions","text":"with_added_reactions(args...; kwargs...)\n\nSpecifies a model variant with reactions added. Forwards the arguments to add_reactions. Intended to be used with screen.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.with_changed_bound-Tuple","page":"Function reference","title":"COBREXA.with_changed_bound","text":"with_changed_bound(args...; kwargs...)\n\nSpecifies a model variant that has a new bound set. Forwards arguments to change_bound. Intended for usage with screen.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.with_changed_bounds-Tuple","page":"Function reference","title":"COBREXA.with_changed_bounds","text":"with_changed_bounds(args...; kwargs...)\n\nSpecifies a model variant that has new bounds set. Forwards arguments to change_bounds. Intended for usage with screen.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.with_removed_metabolites-Tuple","page":"Function reference","title":"COBREXA.with_removed_metabolites","text":"with_removed_metabolites(args...; kwargs...)\n\nSpecifies a model variant without specified metabolites. Forwards arguments to remove_metabolites. Intended to be used with screen.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.with_removed_reactions-Tuple","page":"Function reference","title":"COBREXA.with_removed_reactions","text":"with_removed_reactions(args...; kwargs...)\n\nSpecifies a model variant with specified reactions removed. Forwards arguments to remove_reactions. Intended to be used with screen.\n\n\n\n\n\n","category":"method"},{"location":"functions/#Analysis-functions","page":"Function reference","title":"Analysis functions","text":"","category":"section"},{"location":"functions/","page":"Function reference","title":"Function reference","text":"Modules = [COBREXA]\nPages = map(file -> joinpath(\"analysis\", file), readdir(\"../src/analysis\"))","category":"page"},{"location":"functions/#COBREXA.envelope_lattice-Tuple{MetabolicModel, Vector{Int64}}","page":"Function reference","title":"COBREXA.envelope_lattice","text":"envelope_lattice(\n    model::MetabolicModel,\n    ridxs::Vector{Int};\n    samples = 10,\n    ranges = collect(zip(bounds(model)...))[ridxs],\n    reaction_samples = fill(samples, length(ridxs)),\n)\n\nCreate a lattice (list of \"tick\" vectors) for reactions at indexes ridxs in a model. Arguments samples, ranges, and reaction_samples may be optionally specified to customize the latice creation process.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.envelope_lattice-Tuple{MetabolicModel, Vector{String}}","page":"Function reference","title":"COBREXA.envelope_lattice","text":"envelope_lattice(model::MetabolicModel, rids::Vector{String}; kwargs...)\n\nVersion of envelope_lattice that works on string reaction IDs instead of integer indexes.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.objective_envelope-Tuple{MetabolicModel, Vector{Int64}, Any}","page":"Function reference","title":"COBREXA.objective_envelope","text":"objective_envelope(\n    model::MetabolicModel,\n    ridxs::Vector{Int},\n    optimizer;\n    lattice = envelope_lattice(model, ridxs),\n    kwargs...,\n)\n\nCompute an array of objective values for the model for rates of reactions specified ridxs fixed to a regular range of values between their respective lower and upper bounds.\n\nThis can be used to compute a \"production envelope\" of a metabolite; but generalizes to any specifiable objective and to multiple dimensions of the examined space. To retrieve a production envelope of any metabolite, set the objective coefficient vector of the model to a vector that contains a single 1 for the exchange reaction that \"outputs\" this metabolite, and run objective_envelope with the exchange reaction of the \"parameter\" metabolite specified in ridxs.\n\nReturns a named tuple that contains lattice with reference values of the metabolites, and an N-dimensional array values with the computed objective values, where N is the number of specified reactions.  Because of the increasing dimensionality, the computation gets very voluminous with increasing length of ridxs.\n\nkwargs are internally forwarded to screen_optmodel_modifications.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.objective_envelope-Tuple{MetabolicModel, Vector{String}, Vararg{Any, N} where N}","page":"Function reference","title":"COBREXA.objective_envelope","text":"objective_envelope(model::MetabolicModel, rids::Vector{String}, args...; kwargs...)\n\nVersioin of objective_envelope that works on string reaction IDs instead of integer indexes.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.flux_balance_analysis-Union{Tuple{M}, Tuple{M, Any}} where M<:MetabolicModel","page":"Function reference","title":"COBREXA.flux_balance_analysis","text":"flux_balance_analysis(\n    model::M,\n    optimizer;\n    modifications = [],\n) where {M<:MetabolicModel}\n\nRun flux balance analysis (FBA) on the model optionally specifying modifications to the problem.  Basically, FBA solves this optimization problem:\n\nmax cᵀx\ns.t. S x = b\n     xₗ ≤ x ≤ xᵤ\n\nSee \"Orth, J., Thiele, I. & Palsson, B. What is flux balance analysis?. Nat Biotechnol 28, 245-248 (2010). https://doi.org/10.1038/nbt.1614\" for more information.\n\nThe optimizer must be set to a JuMP-compatible optimizer, such as GLPK.Optimizer or Tulip.Optimizer\n\nOptionally, you may specify one or more modifications to be applied to the model before the analysis, such as change_optimizer_attribute, change_objective, and change_sense.\n\nReturns an optimized JuMP model.\n\nExample\n\nmodel = load_model(\"e_coli_core.json\")\nsolution = flux_balance_analysis(model, GLPK.optimizer)\nvalue.(solution[:x])  # extract flux steady state from the optimizer\n\nbiomass_reaction_id = findfirst(model.reactions, \"BIOMASS_Ecoli_core_w_GAM\")\n\nmodified_solution = flux_balance_analysis(model, GLPK.optimizer;\n    modifications=[change_objective(biomass_reaction_id)])\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.flux_balance_analysis_dict-Tuple{MetabolicModel, Vararg{Any, N} where N}","page":"Function reference","title":"COBREXA.flux_balance_analysis_dict","text":"flux_balance_analysis_dict(model::MetabolicModel, args...)::Union{Dict{String, Float64},Nothing}\n\nA variant of FBA that returns a dictionary assigning fluxes to reactions, if the solution is found. Arguments are passed to flux_balance_analysis.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.flux_balance_analysis_vec-Tuple","page":"Function reference","title":"COBREXA.flux_balance_analysis_vec","text":"flux_balance_analysis_vec(args...)::Union{Vector{Float64},Nothing}\n\nA variant of FBA that returns a vector of fluxes in the same order as reactions of the model, if the solution is found.\n\nArguments are passed to flux_balance_analysis.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA._FVA_add_constraint-NTuple{4, Any}","page":"Function reference","title":"COBREXA._FVA_add_constraint","text":"_FVA_add_constraint(model, c, x, Z)\n\nInternal helper function for adding constraints to a model. Exists mainly because for avoiding namespace problems on remote workers.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA._FVA_optimize_reaction-Tuple{Any, Any, Any}","page":"Function reference","title":"COBREXA._FVA_optimize_reaction","text":"_FVA_get_opt(model, rid)\n\nInternal helper for creating the optimized model on a remote worker, for avoiding namespace problems.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.flux_variability_analysis-Tuple{MetabolicModel, Any}","page":"Function reference","title":"COBREXA.flux_variability_analysis","text":"flux_variability_analysis(\n    model::MetabolicModel,\n    optimizer;\n    kwargs...\n)\n\nA simpler version of flux_variability_analysis that maximizes and minimizes all reactions in the model. Arguments are forwarded.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.flux_variability_analysis-Tuple{MetabolicModel, Vector{Int64}, Any}","page":"Function reference","title":"COBREXA.flux_variability_analysis","text":"flux_variability_analysis(\n    model::MetabolicModel,\n    reactions::Vector{Int},\n    optimizer;\n    modifications = [],\n    workers = [myid()],\n    bounds = z -> (z,z),\n    ret = objective_value,\n)::Matrix{Float64}\n\nFlux variability analysis solves a pair of optimization problems in model for each flux listed in reactions:\n\n min,max xᵢ\ns.t. S x = b\n    xₗ ≤ x ≤ xᵤ\n     cᵀx ≥ bounds(Z₀)[1]\n     cᵀx ≤ bounds(Z₀)[2]\n\nwhere Z₀:= cᵀx₀ is the objective value of an optimal solution of the associated FBA problem (see flux_balance_analysis for a related analysis, also for explanation of the modifications argument).\n\nThe bounds is a user-supplied function that specifies the objective bounds for the variability optimizations, by default it restricts the flux objective value to the precise optimum reached in FBA. It can return -Inf and Inf in first and second pair to remove the limit. Use gamma_bounds and objective_bounds for simple bounds.\n\noptimizer must be set to a JuMP-compatible optimizer. The computation of the individual optimization problems is transparently distributed to workers (see Distributed.workers()).\n\nret is a function used to extract results from optimized JuMP models of the individual reactions. By default, it calls and returns the value of JuMP.objective_value. More information can be extracted e.g. by setting it to a function that returns a more elaborate data structure; such as m -> (JuMP.objective_value(m), JuMP.value.(m[:x])).\n\nReturns a matrix of extracted ret values for minima and maxima, of total size (length(reactions),2). The optimizer result status is checked with is_solved; nothing is returned if the optimization failed for any reason.\n\nExample\n\nmodel = load_model(\"e_coli_core.json\")\nflux_variability_analysis(model, [1, 2, 3, 42], GLPK.optimizer)\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.flux_variability_analysis_dict-Tuple{MetabolicModel, Any}","page":"Function reference","title":"COBREXA.flux_variability_analysis_dict","text":"flux_variability_analysis_dict(\n    model::MetabolicModel,\n    optimizer;\n    kwargs...\n)\n\nA variant of flux_variability_analysis that returns the individual maximized and minimized fluxes of all reactions as two dictionaries (of dictionaries). All keyword arguments except ret are passed through.\n\nExample\n\nmins, maxs = flux_variability_analysis_dict(\n    model,\n    Tulip.Optimizer;\n    bounds = objective_bounds(0.99),\n    modifications = [\n        change_optimizer_attribute(\"IPM_IterationsLimit\", 500),\n        change_constraint(\"EX_glc__D_e\", -10, -10),\n        change_constraint(\"EX_o2_e\", 0.0, 0.0),\n    ],\n)\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.parsimonious_flux_balance_analysis-Tuple{MetabolicModel, Any}","page":"Function reference","title":"COBREXA.parsimonious_flux_balance_analysis","text":"parsimonious_flux_balance_analysis(\n    model::MetabolicModel,\n    optimizer;\n    modifications = [],\n    qp_modifications = [],\n    relax_bounds=[1.0, 0.999999, 0.99999, 0.9999, 0.999, 0.99],\n)\n\nRun parsimonious flux balance analysis (pFBA) on the model. In short, pFBA runs two consecutive optimization problems. The first is traditional FBA:\n\nmax cᵀx = μ\ns.t. S x = b\n     xₗ ≤ x ≤ xᵤ\n\nAnd the second is a quadratic optimization problem:\n\nmin Σᵢ xᵢ²\ns.t. S x = b\n     xₗ ≤ x ≤ xᵤ\n     μ = μ⁰\n\nWhere the optimal solution of the FBA problem, μ⁰, has been added as an additional constraint. See \"Lewis, Nathan E, Hixson, Kim K, Conrad, Tom M, Lerman, Joshua A, Charusanti, Pep, Polpitiya, Ashoka D, Adkins, Joshua N, Schramm, Gunnar, Purvine, Samuel O, Lopez-Ferrer, Daniel, Weitz, Karl K, Eils, Roland, König, Rainer, Smith, Richard D, Palsson, Bernhard Ø, (2010) Omic data from evolved E. coli are consistent with computed optimal growth from genome-scale models. Molecular Systems Biology, 6. 390. doi: accession:10.1038/msb.2010.47\" for more details.\n\npFBA gets the model optimum by standard FBA (using flux_balance_analysis with optimizer and modifications), then finds a minimal total flux through the model that still satisfies the (slightly relaxed) optimum. This is done using a quadratic problem optimizer. If the original optimizer does not support quadratic optimization, it can be changed using the callback in qp_modifications, which are applied after the FBA. See the documentation of fluxbalanceanalysis for usage examples of modifications.\n\nThhe optimum relaxation sequence can be specified in relax parameter, it defaults to multiplicative range of [1.0, 0.999999, ..., 0.99] of the original bound.\n\nReturns an optimized model that contains the pFBA solution; or nothing if the optimization failed.\n\nExample\n\nmodel = load_model(\"e_coli_core.json\")\noptmodel = parsimonious_flux_balance_analysis(model, biomass, Gurobi.Optimizer)\nvalue.(solution[:x])  # extract the flux from the optimizer\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.parsimonious_flux_balance_analysis_dict-Tuple{MetabolicModel, Vararg{Any, N} where N}","page":"Function reference","title":"COBREXA.parsimonious_flux_balance_analysis_dict","text":"parsimonious_flux_balance_analysis_dict(model::MetabolicModel, args...; kwargs...)\n\nPerform parsimonious flux balance analysis on model using optimizer. Returns a dictionary mapping the reaction IDs to fluxes. Arguments are forwarded to parsimonious_flux_balance_analysis internally.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.parsimonious_flux_balance_analysis_vec-Tuple","page":"Function reference","title":"COBREXA.parsimonious_flux_balance_analysis_vec","text":"parsimonious_flux_balance_analysis_vec(args...; kwargs...)\n\nPerform parsimonious flux balance analysis on model using optimizer. Returns a vector of fluxes in the same order as the reactions in model. Arguments are forwarded to parsimonious_flux_balance_analysis internally.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.screen-Union{Tuple{MetabolicModel}, Tuple{N}, Tuple{T}, Tuple{V}} where {V<:(AbstractVector{T} where T), T<:Tuple, N}","page":"Function reference","title":"COBREXA.screen","text":"function screen(\n    model::MetabolicModel;\n    variants::Maybe{Array{V,N}} = nothing,\n    analysis,\n    args::Maybe{Array{T,N}} = nothing,\n    workers = [myid()],\n)::Array where {V<:AbstractVector, T<:Tuple,N}\n\nTake an array of model-modifying function vectors in variants, and execute the function analysis on all variants of the model specified by variants. The computation is distributed over worker IDs in workers. If args are supplied (as an array of the same size as the variants), they are forwarded as arguments to the corresponding analysis function calls.\n\nThe array of variants must contain vectors of single-parameter functions, these are applied to model in order. The functions must not modify the model, but rather return a modified copy. The copy should be made as shallow as possible, to increase memory efficiency of the process. Variant generators that modify the argument model in-place will cause unpredictable results. Refer to the definition of screen_variant for details.\n\nThe function analysis will receive a single argument (the modified model), together with an expanded tuple of arguments from args.\n\nThe modification and analysis functions are transferred to workers as-is; all packages required to run them (e.g. the optimization solvers) must be loaded there. Typically, you want to use the macro @everywhere using MyFavoriteSolver from Distributed package for loading the solvers.\n\nReturn value\n\nThe results of running analysis are collected in to the resulting array, in a way that preserves the shape of the variants, similarly as with pmap.\n\nThe results of analysis function must be serializable, preferably made only from pure Julia structures, because they may be transferred over the network between the computation nodes. For that reason, functions that return whole JuMP models that contain pointers to allocated C structures (such as flux_balance_analysis used with GLPK or Gurobi otimizers) will generally not in this context.\n\nExample\n\nfunction reverse_reaction(i::Int)\n    (model::CoreModel) -> begin\n        mod = copy(model)\n        mod.S[:,i] .*= -1   # this is unrealistic but sufficient for demonstration\n        mod\n    end\nend\n\nm = load_model(CoreModel, \"e_coli_core.xml\")\n\nscreen_variants(m,\n           [\n               [reverse_reaction(5)],\n               [reverse_reaction(3), reverse_reaction(6)]\n           ],\n           mod -> mod.S[:,3])  # observe the changes in S\n\nscreen_variants(m,\n    [\n        [reverse_reaction(5)],\n        [reverse_reaction(3), reverse_reaction(6)]\n    ],\n    mod -> flux_balance_analysis_vec(mod, GLPK.Optimizer))  # run analysis\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.screen_optimize_objective-Tuple{Any, Any}","page":"Function reference","title":"COBREXA.screen_optimize_objective","text":"screen_optimize_objective(_, optmodel)::Union{Float64,Nothing}\n\nA variant of optimize_objective directly usable in screen_optmodel_modifications.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.screen_optmodel_modifications-Union{Tuple{N}, Tuple{V}, Tuple{MetabolicModel, Any}} where {V<:(AbstractVector{T} where T), N}","page":"Function reference","title":"COBREXA.screen_optmodel_modifications","text":"screen_optmodel_modifications(\n    model::MetabolicModel,\n    optimizer;\n    modifications::Array{V,N},\n    analysis = screen_optimize_objective,\n    workers = [myid()],\n) where {V<:AbstractVector,N}\n\nScreen multiple modifications of the same optimization model.\n\nThis function is potentially more efficient than screen because it avoids making variants of the model structure and remaking of the optimization model. On the other hand, modification functions need to keep the optimization model in a recoverable state (one that leaves the model usable for the next modification), which limits the possible spectrum of modifications applied.\n\nInternally, model is distributed to workers and transformed into the optimization model using make_optimization_model. With that, vectors of functions in modifications are consecutively applied, and the result of analysis function called on model are collected to an array of the same extent as modifications.\n\nBoth the modification functions (in vectors) and the analysis function here have 2 parameters (as opposed to 1 with screen): first is the model (carried through as-is), second is the prepared JuMP optimization model that may be modified and acted upon. As an example, you can use modification change_constraint and analysis screen_optimize_objective.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.screen_variant","page":"Function reference","title":"COBREXA.screen_variant","text":"screen_variant(model::MetabolicModel, variant::Vector, analysis, args = ())\n\nHelper function for screen that applies all single-argument functions in variant to the model (in order from \"first\" to \"last\"), and executes analysis on the result.\n\nCan be used to test model variants locally.\n\n\n\n\n\n","category":"function"},{"location":"functions/#COBREXA.screen_variants-Tuple{Any, Any, Any}","page":"Function reference","title":"COBREXA.screen_variants","text":"screen_variants(model, variants, analysis; workers=[myid()])\n\nA shortcut for screen that only works with model variants.\n\n\n\n\n\n","category":"method"},{"location":"functions/#Analysis-modifications","page":"Function reference","title":"Analysis modifications","text":"","category":"section"},{"location":"functions/","page":"Function reference","title":"Function reference","text":"Modules = [COBREXA]\nPages = map(file -> joinpath(\"analysis\", \"modifications\", file), readdir(\"../src/analysis/modifications\"))","category":"page"},{"location":"functions/#COBREXA._do_knockout-Tuple{MetabolicModel, Any, Vector{String}}","page":"Function reference","title":"COBREXA._do_knockout","text":"_do_knockout(model::MetabolicModel, opt_model)\n\nInternal helper for knockouts on generic MetabolicModels. This can be overloaded so that the knockouts may work differently (more efficiently) with other models.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.knockout-Tuple{String}","page":"Function reference","title":"COBREXA.knockout","text":"knockout(gene_id::String)\n\nA helper variant of knockout for a single gene.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.knockout-Tuple{Vector{String}}","page":"Function reference","title":"COBREXA.knockout","text":"knockout(gene_ids::Vector{String})\n\nA modification that zeroes the bounds of all reactions that would be knocked out by the specified genes (effectively disables the reactions).\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.change_constraint-Tuple{String, Any, Any}","page":"Function reference","title":"COBREXA.change_constraint","text":"change_constraint(id::String, lb, ub)\n\nChange the lower and upper bounds (lb and ub respectively) of reaction id.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.change_objective-Tuple{Union{Int64, String}}","page":"Function reference","title":"COBREXA.change_objective","text":"change_objective(rxn::Union{Int,String}; weight::Float64 = 1.0, sense = MOI.MAX_SENSE)\n\nModification that changes the objective to maximize or minimize the specified reaction (either by index or string ID), optionally specifying the objective weight.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.change_objective-Tuple{Vector{Int64}}","page":"Function reference","title":"COBREXA.change_objective","text":"change_objective(\n    ridxs::Vector{Int};\n    weights::Vector{Float64} = ones(length(ridxs)),\n    sense = MOI.MAX_SENSE,\n)\n\nA potentially more efficient variant of change_objective that works on integer indexes of the reactions.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.change_objective-Tuple{Vector{String}}","page":"Function reference","title":"COBREXA.change_objective","text":"change_objective(\n    rids::Vector{String};\n    weights::Vector{Float64} = ones(length(rids)),\n    sense = MOI.MAX_SENSE,\n)\n\nModification that changes the objective function used in a constraint based analysis function to maximize (or minimize, based on sense) the sum (optionally weighted by weights) of the rates of the reactions specified by string IDs.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.change_optimizer-Tuple{Any}","page":"Function reference","title":"COBREXA.change_optimizer","text":"change_optimizer(optimizer)\n\nChange the JuMP optimizer used to run the optimization.\n\nThis may be used to try different approaches for reaching the optimum, and in problems that may require different optimizers for different parts, such as the parsimonious_flux_balance_analysis.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.change_optimizer_attribute-Tuple{Any, Any}","page":"Function reference","title":"COBREXA.change_optimizer_attribute","text":"change_optimizer_attribute(attribute_key, value)\n\nChange a JuMP optimizer attribute. The attributes are optimizer-specific, refer to the JuMP documentation and the documentation of the specific optimizer for usable keys and values.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.change_sense-Tuple{Any}","page":"Function reference","title":"COBREXA.change_sense","text":"change_sense(objective_sense)\n\nChange the objective sense of optimization. Possible arguments are MOI.MAX_SENSE and MOI.MIN_SENSE.\n\nIf you want to change the objective and sense at the same time, use change_objective instead to do both at once.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.constrain_objective_value-Tuple{Any}","page":"Function reference","title":"COBREXA.constrain_objective_value","text":"constrain_objective_value(tolerance)\n\nLimit the objective value to tolerance-times the current objective value, as with objective_bounds.\n\n\n\n\n\n","category":"method"},{"location":"functions/#Flux-sampling","page":"Function reference","title":"Flux sampling","text":"","category":"section"},{"location":"functions/","page":"Function reference","title":"Function reference","text":"Modules = [COBREXA]\nPages = map(file -> joinpath(\"analysis\", \"sampling\", file), readdir(\"../src/analysis/sampling\"))","category":"page"},{"location":"functions/#COBREXA._affine_hit_and_run_chain-NTuple{5, Any}","page":"Function reference","title":"COBREXA._affine_hit_and_run_chain","text":"_affine_hit_and_run_chain(warmup, lbs, ubs, iters, chain)\n\nInternal helper function for computing a single affine hit-and-run chain. The number of the chain is passed for possible future initialization of stable RNGs.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.affine_hit_and_run-Tuple{Matrix{Float64}, Vector{Float64}, Vector{Float64}}","page":"Function reference","title":"COBREXA.affine_hit_and_run","text":"function affine_hit_and_run(\n    warmup_points::Matrix{Float64},\n    lbs::Vector{Float64},\n    ubs::Vector{Float64};\n    sample_iters = 100 .* (1:5),\n    workers = [myid()],\n    chains = length(workers),\n)\n\nRun a hit-and-run style sampling that starts from warmup_points and uses their affine combinations for generating the run directions to sample the space delimited by lbs and ubs.  The points that represent fluxes in warmup_points should be organized in columns, i.e. warmup_points[:,1] is the first warmup flux.\n\nThere are total chains of hit-and-run runs, each on a batch of size(warmup_points, 2) points. The runs are scheduled on workers, for good load balancing chains should be ideally much greater than length(workers).\n\nEach run continues for maximum(sample_iters) iterations; the numbers in sample_iters represent the iterations at which the whole \"current\" batch of points is collected for output. For example, sample_iters=[1,4,5] causes the process run for 5 iterations, returning the sample batch that was produced by 1st, 4th and last (5th) iteration.\n\nReturns a matrix of sampled fluxes (in columns), with all collected samples horizontally concatenated. The total number of samples (columns) will be size(warmup_points,2) * chains * length(sample_iters).\n\nExample\n\nusing COBREXA\nusing Tulip\n\nmodel = load_model(StandardModel, model_path)\n\nwarmup, lbs, ubs = warmup_from_variability(model, Tulip.Optimizer, 100)\nsamples = affine_hit_and_run(warmup, lbs, ubs, sample_iters = 1:3)\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.warmup_from_variability","page":"Function reference","title":"COBREXA.warmup_from_variability","text":"function warmup_from_variability(\n    model::MetabolicModel,\n    optimizer,\n    min_reactions::Vector{Int}=1:n_reactions(model),\n    max_reactions::Vector{Int}=1:n_reactions(model);\n    modifications = [],\n    workers::Vector{Int} = [myid()],\n)::Tuple{Matrix{Float64}, Vector{Float64}, Vector{Float64}}\n\nGenerate FVA-like warmup points for samplers, by minimizing and maximizing the specified reactions. The result is returned as a matrix, each point occupies as single column in the result.\n\n\n\n\n\n","category":"function"},{"location":"functions/#COBREXA.warmup_from_variability-Tuple{MetabolicModel, Any, Int64}","page":"Function reference","title":"COBREXA.warmup_from_variability","text":"warmup_from_variability(\n    model::MetabolicModel,\n    optimizer,\n    n_points::Int;\n    kwargs...\n)\n\nGenerates FVA-like warmup points for samplers, by selecting random points by minimizing and maximizing reactions. Can not return more than 2 times the number of reactions in the model.\n\n\n\n\n\n","category":"method"},{"location":"functions/#Miscellaneous-utilities","page":"Function reference","title":"Miscellaneous utilities","text":"","category":"section"},{"location":"functions/","page":"Function reference","title":"Function reference","text":"Modules = [COBREXA]\nPages = map(file -> joinpath(\"base\", \"utils\", file), readdir(\"../src/base/utils\"))","category":"page"},{"location":"functions/#COBREXA.ambiguously_identified_items-Tuple{Dict{String, Dict{String, Set{String}}}}","page":"Function reference","title":"COBREXA.ambiguously_identified_items","text":"ambiguously_identified_items(\n    index::Dict{String,Dict{String,[String]}},\n)::Vector{String}\n\nFind items (genes, metabolites, ...) from the annotation index that are identified non-uniquely by at least one of their annotations.\n\nThis often indicates that the items are duplicate or miscategorized.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.annotation_index-Tuple{AbstractDict{String, V} where V}","page":"Function reference","title":"COBREXA.annotation_index","text":"annotation_index(\n    xs::AbstractDict{String};\n    annotations = _annotations,\n)::Dict{String,Dict{String,[String]}}\n\nExtract annotations from a dictionary of items xs and build an index that maps annotation \"kinds\" (e.g. \"PubChem\") to the mapping from the annotations (e.g.  \"COMPOUND_12345\") to item IDs that carry the annotations.\n\nFunction annotations is used to access the Annotations object in the dictionary values.\n\nThis is extremely useful for finding items by annotation data.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.get_atoms-Tuple{Metabolite}","page":"Function reference","title":"COBREXA.get_atoms","text":"get_atoms(met::Metabolite)::MetaboliteFormula\n\nSimple wrapper for getting the atom dictionary count out of a Metabolite.\n\nSee also: metabolite_formula\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.check_duplicate_reaction-Tuple{Reaction, OrderedCollections.OrderedDict{String, Reaction}}","page":"Function reference","title":"COBREXA.check_duplicate_reaction","text":"check_duplicate_reaction(rxn::Reaction, rxns::Dict{String, Reaction}; only_metabolites=true)\n\nCheck if rxn already exists in rxns but has another id. If only_metabolites is true then only the metabolite ids are checked. Otherwise, compares metabolite ids and the absolute value of their stoichiometric coefficients to those of rxn. If rxn has the same reaction equation as another reaction in rxns, the return the id. Otherwise return nothing.\n\nSee also: is_mass_balanced\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.is_boundary-Tuple{Reaction}","page":"Function reference","title":"COBREXA.is_boundary","text":"is_boundary(rxn::Reaction)\n\nReturn true if reaction is a boundary reaction, otherwise return false. Checks if boundary by inspecting number of metabolites in reaction equation. Boundary reactions have only one metabolite, e.g. an exchange reaction, or a sink/demand reaction.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.is_mass_balanced-Tuple{StandardModel, Reaction}","page":"Function reference","title":"COBREXA.is_mass_balanced","text":"is_mass_balanced(model::StandardModel, rxn::Reaction)\n\nChecks if rxn is atom balanced. Returns a boolean for whether the reaction is balanced, and the associated balance of atoms for convenience (useful if not balanced).\n\nSee also: get_atoms, check_duplicate_reaction\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.stoichiometry_string-Tuple{Any}","page":"Function reference","title":"COBREXA.stoichiometry_string","text":"stoichiometry_string(rxn_dict)\n\nReturn the reaction equation as a string.\n\nExample\n\njulia> req = Dict(\"coa_c\" => -1, \"for_c\" => 1, \"accoa_c\" => 1, \"pyr_c\" => -1);\njulia> stoichiometry_string(req)\n\"coa_c + pyr_c = for_c + accoa_c\"\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.serialize_model-Tuple{Serialized, String}","page":"Function reference","title":"COBREXA.serialize_model","text":"serialize_model(model::Serialized, filename::String)::Serialized\n\nSpecialization of serialize_model that prevents nested serialization of already-serialized models.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.serialize_model-Union{Tuple{MM}, Tuple{MM, String}} where MM<:MetabolicModel","page":"Function reference","title":"COBREXA.serialize_model","text":"serialize_model(model::MM, filename::String)::Serialized{MM} where {MM<:MetabolicModel}\n\nSerialize the model to file filename, returning a Serialized model that is able to load itself back automatically upon precaching by precache!.\n\n\n\n\n\n","category":"method"},{"location":"functions/#Base.copy-Tuple{Gene}","page":"Function reference","title":"Base.copy","text":"Base.copy(g::Gene)\n\nShallow copy of a Gene\n\n\n\n\n\n","category":"method"},{"location":"functions/#Base.copy-Tuple{Metabolite}","page":"Function reference","title":"Base.copy","text":"Base.copy(m::Metabolite)\n\nShallow copy of a Metabolite\n\n\n\n\n\n","category":"method"},{"location":"functions/#Base.copy-Tuple{Reaction}","page":"Function reference","title":"Base.copy","text":"Base.copy(r::Reaction)\n\nShallow copy of a Reaction\n\n\n\n\n\n","category":"method"},{"location":"functions/#Base.copy-Tuple{StandardModel}","page":"Function reference","title":"Base.copy","text":"Base.copy(m::StandardModel)\n\nShallow copy of a StandardModel\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.atom_exchange-Tuple{StandardModel, String}","page":"Function reference","title":"COBREXA.atom_exchange","text":"atom_exchange(model::StandardModel, rxn_id::String)\n\nSpecialized version of atom_exchange for StandardModel that quickly returns a dictionary mapping the flux-relative stoichiometry of atoms through a single reaction in model.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.atom_exchange-Tuple{MetabolicModel, Dict{String, Float64}}","page":"Function reference","title":"COBREXA.atom_exchange","text":"atom_exchange(model::MetabolicModel, flux_dict::Dict{String, Float64})\n\nReturn a dictionary mapping the flux of atoms across the boundary of the model given flux_dict (the solution of a constraint based analysis) of reactions in model.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.gamma_bounds-Tuple{Any}","page":"Function reference","title":"COBREXA.gamma_bounds","text":"gamma_bounds(gamma)\n\nA bounds-generating function for flux_variability_analysis that limits the objective value to be at least gamma*Z₀, as usual in COBRA packages. Use as the bounds argument:\n\nflux_variability_analysis(model, some_optimizer; bounds = gamma_bounds(0.9))\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.objective_bounds-Tuple{Any}","page":"Function reference","title":"COBREXA.objective_bounds","text":"objective_bounds(tolerance)\n\nA bounds-generating function for flux_variability_analysis that limits the objective value to a small multiple of Z₀. Use as bounds argument, similarly to gamma_bounds.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA._parse_formula-Tuple{String}","page":"Function reference","title":"COBREXA._parse_formula","text":"_parse_formula(f::String)::MetaboliteFormula\n\nParse a formula in format C2H6O into a MetaboliteFormula, which is basically a dictionary of atom counts in the molecule.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA._unparse_formula-Tuple{Dict{String, Int64}}","page":"Function reference","title":"COBREXA._unparse_formula","text":"_unparse_formula(f::MetaboliteFormula)::String\n\nFormat MetaboliteFormula to String.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.metabolite_fluxes-Tuple{MetabolicModel, Dict{String, Float64}}","page":"Function reference","title":"COBREXA.metabolite_fluxes","text":"metabolite_fluxes(model::MetabolicModel, flux_dict::Dict{String, Float64})\n\nReturn two dictionaries of metabolite ids mapped to reactions that consume or produce them, given the flux distribution supplied in flux_dict.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA._parse_grr-Tuple{SBML.GeneProductAssociation}","page":"Function reference","title":"COBREXA._parse_grr","text":"_parse_grr(gpa::SBML.GeneProductAssociation)::GeneAssociation\n\nParse SBML.GeneProductAssociation structure to the simpler GeneAssociation. The input must be (implicitly) in a positive DNF.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA._parse_grr-Tuple{String}","page":"Function reference","title":"COBREXA._parse_grr","text":"_parse_grr(s::String)::GeneAssociation\n\nParse a DNF gene association rule in format (YIL010W and YLR043C) or (YIL010W and YGR209C) to GeneAssociation. Also acceptsOR,|,||,AND,&, and&&`.\n\nExample\n\njulia> _parse_grr(\"(YIL010W and YLR043C) or (YIL010W and YGR209C)\")\n2-element Array{Array{String,1},1}:\n [\"YIL010W\", \"YLR043C\"]\n [\"YIL010W\", \"YGR209C\"]\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA._unparse_grr-Tuple{Type{SBML.GeneProductAssociation}, Vector{Vector{String}}}","page":"Function reference","title":"COBREXA._unparse_grr","text":"_unparse_grr(\n    ::Type{SBML.GeneProductAssociation},\n    x::GeneAssociation,\n)::SBML.GeneAssociation\n\nConvert a GeneAssociation to the corresponding SBML.jl structure.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA._unparse_grr-Tuple{Type{String}, Vector{Vector{String}}}","page":"Function reference","title":"COBREXA._unparse_grr","text":"unparse_grr(grr::Vector{Vector{Gene}}\n\nConverts a nested string gene reaction array  back into a gene reaction rule string.\n\nExample\n\njulia> _unparse_grr(String, [[\"YIL010W\", \"YLR043C\"], [\"YIL010W\", \"YGR209C\"]])\n\"(YIL010W and YLR043C) or (YIL010W and YGR209C)\"\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA._guesskey-Tuple{Any, Any}","page":"Function reference","title":"COBREXA._guesskey","text":"_guesskey(ks, possibilities)\n\nUnfortunately, many model types that contain dictionares do not have standardized field names, so we need to try a few possibilities and guess the best one. The keys used to look for valid field names should be ideally specified as constants in src/base/constants.jl.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.find_biomass_reaction_ids-Tuple{MetabolicModel}","page":"Function reference","title":"COBREXA.find_biomass_reaction_ids","text":"find_biomass_reaction_ids(m::MetabolicModel; kwargs...)\n\nShortcut for finding biomass reaction identifiers in a model; arguments are forwarded to looks_like_biomass_reaction.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.find_biomass_reactions-Tuple{MetabolicModel}","page":"Function reference","title":"COBREXA.find_biomass_reactions","text":"find_biomass_reactions(m::MetabolicModel; kwargs...)\n\nShortcut for finding biomass reaction indexes in a model; arguments are forwarded to looks_like_biomass_reaction.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.find_exchange_metabolite_ids-Tuple{MetabolicModel}","page":"Function reference","title":"COBREXA.find_exchange_metabolite_ids","text":"find_exchange_metabolite_ids(m::MetabolicModel; kwargs...)\n\nShortcut for finding exchange metabolite identifiers in a model; arguments are forwarded to looks_like_exchange_metabolite.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.find_exchange_metabolites-Tuple{MetabolicModel}","page":"Function reference","title":"COBREXA.find_exchange_metabolites","text":"find_exchange_metabolites(m::MetabolicModel; kwargs...)\n\nShortcut for finding exchange metabolite indexes in a model; arguments are forwarded to looks_like_exchange_metabolite.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.find_exchange_reaction_ids-Tuple{MetabolicModel}","page":"Function reference","title":"COBREXA.find_exchange_reaction_ids","text":"find_exchange_reaction_ids(m::MetabolicModel; kwargs...)\n\nShortcut for finding exchange reaction identifiers in a model; arguments are forwarded to looks_like_exchange_reaction.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.find_exchange_reactions-Tuple{MetabolicModel}","page":"Function reference","title":"COBREXA.find_exchange_reactions","text":"find_exchange_reactions(m::MetabolicModel; kwargs...)\n\nShortcut for finding exchange reaction indexes in a model; arguments are forwarded to looks_like_exchange_reaction.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.looks_like_biomass_reaction-Tuple{String}","page":"Function reference","title":"COBREXA.looks_like_biomass_reaction","text":"looks_like_biomass_reaction(rxn_id::String;\n    exclude_exchanges = false,\n    exchange_prefixes = _constants.exchange_prefixes,\n    biomass_strings = _constants.biomass_strings,\n)::Bool\n\nA predicate that matches reaction identifiers that look like biomass reactions. Biomass reactions are identified by looking for occurences of biomass_strings in the reaction id. If exclude_exchanges is set, the strings that look like exchanges (from looks_like_exchange_reaction) will not match.\n\nExample\n\nfilter(looks_like_biomass_reaction, reactions(model)) # returns strings\nfindall(looks_like_biomass_reaction, reactions(model)) # returns indices\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.looks_like_exchange_metabolite-Tuple{String}","page":"Function reference","title":"COBREXA.looks_like_exchange_metabolite","text":"looks_like_exchange_metabolite(rxn_id::String;\n    exchange_suffixes = _constants.exchange_suffixes,\n    )::Bool\n\nA predicate that matches metabolite identifiers that look like involved in exchange reactions. Exchange metabolites are identified by exchange_suffixes at the end of the metabolite id.\n\nExample\n\nfilter(looks_like_exchange_metabolite, metabolites(model)) # returns strings\nfindall(looks_like_exchange_metabolite, metabolites(model)) # returns indices\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.looks_like_exchange_reaction-Tuple{String}","page":"Function reference","title":"COBREXA.looks_like_exchange_reaction","text":"looks_like_exchange_reaction(rxn_id::String;\n    exclude_biomass = false,\n    biomass_strings = _constants.biomass_strings,\n    exchange_prefixes = _constants.exchange_prefixes,\n)\n\nA predicate that matches reaction identifiers that look like exchange or biomass reactions, given the usual naming schemes in common model repositories. Exchange reactions are identified based on matching prefixes in the set exchange_prefixes and biomass reactions are identified by looking for occurences of biomass_strings in the reaction id.\n\nAlso see find_exchange_reactions.\n\nExample\n\nfindall(looks_like_exchange_reaction, reactions(model)) # returns indices\nfilter(looks_like_exchange_reaction, reactions(model)) # returns Strings\n\n# to use the optional arguments you need to expand the function's arguments\n# using an anonymous function\nfindall(x -> looks_like_exchange_reaction(x; exclude_biomass=true), reactions(model)) # returns indices\nfilter(x -> looks_like_exchange_reaction(x; exclude_biomass=true), reactions(model)) # returns Strings\n\n\n\n\n\n","category":"method"},{"location":"functions/","page":"Function reference","title":"Function reference","text":"Modules = [COBREXA]\nPages = map(file -> joinpath(\"base\", \"macros\", file), readdir(\"../src/base/macros\"))","category":"page"},{"location":"functions/#COBREXA.change_bound!-Tuple{CoreModel, Int64}","page":"Function reference","title":"COBREXA.change_bound!","text":"change_bound!(\n    model::CoreModel,\n    rxn_idx::Int;\n    lower = nothing,\n    upper = nothing,\n)\n\nChange the specified reaction flux bound in the model in-place.\n\nExample\n\nnew_model = change_bound!(model, 123, lower=-21.15, upper=42.3)\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.change_bound!-Tuple{CoreModel, String}","page":"Function reference","title":"COBREXA.change_bound!","text":"change_bound!(\n    model::CoreModel,\n    rxn_id::String;\n    lower = nothing,\n    upper = nothing,\n)\n\nChange the specified reaction flux bound in the model in-place.\n\nExample\n\nnew_model = change_bound!(model, \"ReactionB\", lower=-21.15, upper=42.3)\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.change_bound!-Tuple{CoreModelCoupled, Int64}","page":"Function reference","title":"COBREXA.change_bound!","text":"change_bound!(\n    model::CoreModelCoupled,\n    rxn_idx::Int;\n    lower = nothing,\n    upper = nothing,\n)\n\nChange the specified reaction flux bound in the model in-place.\n\nExample\n\nnew_model = change_bound!(model, 123, lower=-21.15, upper=42.3)\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.change_bound!-Tuple{CoreModelCoupled, String}","page":"Function reference","title":"COBREXA.change_bound!","text":"change_bound!(\n    model::CoreModelCoupled,\n    rxn_id::String;\n    lower = nothing,\n    upper = nothing,\n)\n\nChange the specified reaction flux bound in the model in-place.\n\nExample\n\nnew_model = change_bound!(model, \"ReactionB\", lower=-21.15, upper=42.3)\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.change_bound!-Tuple{StandardModel, String}","page":"Function reference","title":"COBREXA.change_bound!","text":"change_bound!(\n    model::StandardModel,\n    rxn_id::String;\n    lower = nothing,\n    upper = nothing,\n)\n\nChange the specified reaction flux bound in the model in-place.\n\nExample\n\nnew_model = change_bound!(model, \"ReactionB\", lower=-21.15, upper=42.3)\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.change_bound-Tuple{CoreModel, Int64}","page":"Function reference","title":"COBREXA.change_bound","text":"change_bound(\n    model::CoreModel,\n    rxn_idx::Int;\n    lower = nothing,\n    upper = nothing,\n)\n\nChange the specified reaction flux bound in the model and return the modified model.\n\nExample\n\nchange_bound(model, 123, lower=-21.15, upper=42.3)\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.change_bound-Tuple{CoreModel, String}","page":"Function reference","title":"COBREXA.change_bound","text":"change_bound(\n    model::CoreModel,\n    rxn_id::String;\n    lower = nothing,\n    upper = nothing,\n)\n\nChange the specified reaction flux bound in the model and return the modified model.\n\nExample\n\nchange_bound(model, \"ReactionB\", lower=-21.15, upper=42.3)\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.change_bound-Tuple{CoreModelCoupled, Int64}","page":"Function reference","title":"COBREXA.change_bound","text":"change_bound(\n    model::CoreModelCoupled,\n    rxn_idx::Int;\n    lower = nothing,\n    upper = nothing,\n)\n\nChange the specified reaction flux bound in the model and return the modified model.\n\nExample\n\nchange_bound(model, 123, lower=-21.15, upper=42.3)\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.change_bound-Tuple{CoreModelCoupled, String}","page":"Function reference","title":"COBREXA.change_bound","text":"change_bound(\n    model::CoreModelCoupled,\n    rxn_id::String;\n    lower = nothing,\n    upper = nothing,\n)\n\nChange the specified reaction flux bound in the model and return the modified model.\n\nExample\n\nchange_bound(model, \"ReactionB\", lower=-21.15, upper=42.3)\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.change_bound-Tuple{StandardModel, String}","page":"Function reference","title":"COBREXA.change_bound","text":"change_bound(\n    model::StandardModel,\n    rxn_id::String;\n    lower = nothing,\n    upper = nothing,\n)\n\nChange the specified reaction flux bound in the model and return the modified model.\n\nExample\n\nchange_bound(model, \"ReactionB\", lower=-21.15, upper=42.3)\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.change_bounds!-Tuple{CoreModel, AbstractVector{Int64}}","page":"Function reference","title":"COBREXA.change_bounds!","text":"change_bounds!(\n    model::CoreModel,\n    rxn_idxs::AbstractVector{Int64};\n    lower = (nothing for _ = rxn_idxs),\n    upper = (nothing for _ = rxn_idxs),\n)\n\nChange the specified reaction flux bounds in the model in-place.\n\nExample\n\nnew_model = change_bounds!(model, [123, 234], lower=[-2.1, -50.05], upper=[4.2, 100.1])\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.change_bounds!-Tuple{CoreModel, AbstractVector{String}}","page":"Function reference","title":"COBREXA.change_bounds!","text":"change_bounds!(\n    model::CoreModel,\n    rxn_ids::AbstractVector{String};\n    lower = (nothing for _ = rxn_ids),\n    upper = (nothing for _ = rxn_ids),\n)\n\nChange the specified reaction flux bounds in the model in-place.\n\nExample\n\nnew_model = change_bounds!(model, [\"ReactionA\", \"ReactionC\"], lower=[-2.1, -50.05], upper=[4.2, 100.1])\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.change_bounds!-Tuple{CoreModelCoupled, AbstractVector{Int64}}","page":"Function reference","title":"COBREXA.change_bounds!","text":"change_bounds!(\n    model::CoreModelCoupled,\n    rxn_idxs::AbstractVector{Int64};\n    lower = (nothing for _ = rxn_idxs),\n    upper = (nothing for _ = rxn_idxs),\n)\n\nChange the specified reaction flux bounds in the model in-place.\n\nExample\n\nnew_model = change_bounds!(model, [123, 234], lower=[-2.1, -50.05], upper=[4.2, 100.1])\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.change_bounds!-Tuple{CoreModelCoupled, AbstractVector{String}}","page":"Function reference","title":"COBREXA.change_bounds!","text":"change_bounds!(\n    model::CoreModelCoupled,\n    rxn_ids::AbstractVector{String};\n    lower = (nothing for _ = rxn_ids),\n    upper = (nothing for _ = rxn_ids),\n)\n\nChange the specified reaction flux bounds in the model in-place.\n\nExample\n\nnew_model = change_bounds!(model, [\"ReactionA\", \"ReactionC\"], lower=[-2.1, -50.05], upper=[4.2, 100.1])\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.change_bounds!-Tuple{StandardModel, AbstractVector{String}}","page":"Function reference","title":"COBREXA.change_bounds!","text":"change_bounds!(\n    model::StandardModel,\n    rxn_ids::AbstractVector{String};\n    lower = (nothing for _ = rxn_ids),\n    upper = (nothing for _ = rxn_ids),\n)\n\nChange the specified reaction flux bounds in the model in-place.\n\nExample\n\nnew_model = change_bounds!(model, [\"ReactionA\", \"ReactionC\"], lower=[-2.1, -50.05], upper=[4.2, 100.1])\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.change_bounds-Tuple{CoreModel, AbstractVector{Int64}}","page":"Function reference","title":"COBREXA.change_bounds","text":"change_bounds(\n    model::CoreModel,\n    rxn_idxs::AbstractVector{Int64};\n    lower = (nothing for _ = rxn_idxs),\n    upper = (nothing for _ = rxn_idxs),\n)\n\nChange the specified reaction flux bounds in the model and return the modified model.\n\nExample\n\nchange_bounds(model, [123, 234], lower=[-2.1, -50.05], upper=[4.2, 100.1])\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.change_bounds-Tuple{CoreModel, AbstractVector{String}}","page":"Function reference","title":"COBREXA.change_bounds","text":"change_bounds(\n    model::CoreModel,\n    rxn_ids::AbstractVector{String};\n    lower = (nothing for _ = rxn_ids),\n    upper = (nothing for _ = rxn_ids),\n)\n\nChange the specified reaction flux bounds in the model and return the modified model.\n\nExample\n\nchange_bounds(model, [\"ReactionA\", \"ReactionC\"], lower=[-2.1, -50.05], upper=[4.2, 100.1])\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.change_bounds-Tuple{CoreModelCoupled, AbstractVector{Int64}}","page":"Function reference","title":"COBREXA.change_bounds","text":"change_bounds(\n    model::CoreModelCoupled,\n    rxn_idxs::AbstractVector{Int64};\n    lower = (nothing for _ = rxn_idxs),\n    upper = (nothing for _ = rxn_idxs),\n)\n\nChange the specified reaction flux bounds in the model and return the modified model.\n\nExample\n\nchange_bounds(model, [123, 234], lower=[-2.1, -50.05], upper=[4.2, 100.1])\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.change_bounds-Tuple{CoreModelCoupled, AbstractVector{String}}","page":"Function reference","title":"COBREXA.change_bounds","text":"change_bounds(\n    model::CoreModelCoupled,\n    rxn_ids::AbstractVector{String};\n    lower = (nothing for _ = rxn_ids),\n    upper = (nothing for _ = rxn_ids),\n)\n\nChange the specified reaction flux bounds in the model and return the modified model.\n\nExample\n\nchange_bounds(model, [\"ReactionA\", \"ReactionC\"], lower=[-2.1, -50.05], upper=[4.2, 100.1])\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.change_bounds-Tuple{StandardModel, AbstractVector{String}}","page":"Function reference","title":"COBREXA.change_bounds","text":"change_bounds(\n    model::StandardModel,\n    rxn_ids::AbstractVector{String};\n    lower = (nothing for _ = rxn_ids),\n    upper = (nothing for _ = rxn_ids),\n)\n\nChange the specified reaction flux bounds in the model and return the modified model.\n\nExample\n\nchange_bounds(model, [\"ReactionA\", \"ReactionC\"], lower=[-2.1, -50.05], upper=[4.2, 100.1])\n\n\n\n\n\n","category":"method"},{"location":"functions/#Logging-and-debugging-helpers","page":"Function reference","title":"Logging and debugging helpers","text":"","category":"section"},{"location":"functions/","page":"Function reference","title":"Function reference","text":"Modules = [COBREXA]\nPages = map(file -> joinpath(\"base\", \"logging\", file), readdir(\"../src/base/logging\"))","category":"page"},{"location":"functions/#COBREXA.log_io","page":"Function reference","title":"COBREXA.log_io","text":"log_io(enable::Bool=true)\n\nEnable (default) or disable (by passing false) output of messages and warnings from model input/output.\n\n\n\n\n\n","category":"function"},{"location":"functions/#COBREXA.log_models","page":"Function reference","title":"COBREXA.log_models","text":"log_models(enable::Bool=true)\n\nEnable (default) or disable (by passing false) output of model-related messages.\n\n\n\n\n\n","category":"function"},{"location":"functions/#COBREXA.log_perf","page":"Function reference","title":"COBREXA.log_perf","text":"log_perf(enable::Bool=true)\n\nEnable (default) or disable (by passing false) output of performance-related tracing information.\n\n\n\n\n\n","category":"function"},{"location":"functions/#COBREXA.@_make_logging_tag-Tuple{Symbol, String}","page":"Function reference","title":"COBREXA.@_make_logging_tag","text":"macro _make_logging_group(sym::Symbol, doc::String)\n\nThis creates a group of functions that allow masking out topic-related logging actions. A call that goes as follows:\n\n@_make_logging_tag XYZ\n\ncreates the following tools:\n\nglobal variable _XYZ_log_enabled defaulted to false\nfunction log_XYZ that can be called to turn the logging on/off\na masking macro @_XYZ_log that can be prepended to commands that should only happen if the logging of tag XYZ is enabled.\n\nThe masking macro is then used as follows:\n\n@_XYZ_log @info \"This is the extra verbose information you wanted!\" a b c\n\nThe user can direct logging with these:\n\nlog_XYZ()\nlog_XYZ(false)\n\ndoc should be a name of the stuff that is being printed if the corresponding log_XYZ() is enabled – it is used to create a friendly documentation for the logging switch. In this case it could say \"X, Y and Z-related messages\".\n\n\n\n\n\n","category":"macro"},{"location":"advanced/#COBREXA-Advanced-tutorials","page":"Advanced tutorials","title":"COBREXA Advanced tutorials","text":"","category":"section"},{"location":"advanced/","page":"Advanced tutorials","title":"Advanced tutorials","text":"Pages = joinpath.(\"advanced\", filter(x -> endswith(x, \".md\"), readdir(\"advanced\")))\nDepth = 2","category":"page"},{"location":"notebooks/4_basic_core_coupled_usage/","page":"Basic usage of CoreModel and CoreModelCoupled","title":"Basic usage of CoreModel and CoreModelCoupled","text":"EditURL = \"https://github.com/LCSB-BioCore/COBREXA.jl/blob/master/docs/src/notebooks/4_basic_core_coupled_usage.jl\"","category":"page"},{"location":"notebooks/4_basic_core_coupled_usage/#Basic-usage-of-CoreModel-and-CoreModelCoupled","page":"Basic usage of CoreModel and CoreModelCoupled","title":"Basic usage of CoreModel and CoreModelCoupled","text":"","category":"section"},{"location":"notebooks/4_basic_core_coupled_usage/","page":"Basic usage of CoreModel and CoreModelCoupled","title":"Basic usage of CoreModel and CoreModelCoupled","text":"(Image: ) (Image: )","category":"page"},{"location":"notebooks/4_basic_core_coupled_usage/","page":"Basic usage of CoreModel and CoreModelCoupled","title":"Basic usage of CoreModel and CoreModelCoupled","text":"In this tutorial we will introduce COBREXA's CoreModel and CoreModelCoupled. We will use E. coli's toy model to start with.","category":"page"},{"location":"notebooks/4_basic_core_coupled_usage/","page":"Basic usage of CoreModel and CoreModelCoupled","title":"Basic usage of CoreModel and CoreModelCoupled","text":"!isfile(\"e_coli_core.xml\") &&\n    download(\"http://bigg.ucsd.edu/static/models/e_coli_core.xml\", \"e_coli_core.xml\")\n\nusing COBREXA","category":"page"},{"location":"notebooks/4_basic_core_coupled_usage/#Loading-a-CoreModel","page":"Basic usage of CoreModel and CoreModelCoupled","title":"Loading a CoreModel","text":"","category":"section"},{"location":"notebooks/4_basic_core_coupled_usage/","page":"Basic usage of CoreModel and CoreModelCoupled","title":"Basic usage of CoreModel and CoreModelCoupled","text":"model = load_model(CoreModel, \"e_coli_core.xml\") # we specifically want to load a CoreModel from the model file","category":"page"},{"location":"notebooks/4_basic_core_coupled_usage/#Basic-analysis-on-CoreModel","page":"Basic usage of CoreModel and CoreModelCoupled","title":"Basic analysis on CoreModel","text":"","category":"section"},{"location":"notebooks/4_basic_core_coupled_usage/","page":"Basic usage of CoreModel and CoreModelCoupled","title":"Basic usage of CoreModel and CoreModelCoupled","text":"As before, for optimization based analysis we need to load an optimizer. Here we will use Tulip.jl to optimize the linear programs of this tutorial. Refer to the constraint-based analysis basics tutorial if you are confused by any functions in this section.","category":"page"},{"location":"notebooks/4_basic_core_coupled_usage/","page":"Basic usage of CoreModel and CoreModelCoupled","title":"Basic usage of CoreModel and CoreModelCoupled","text":"All the normal analysis functions work on CoreModel, due to it also having the same generic accessor interface as all the other model types.","category":"page"},{"location":"notebooks/4_basic_core_coupled_usage/","page":"Basic usage of CoreModel and CoreModelCoupled","title":"Basic usage of CoreModel and CoreModelCoupled","text":"using Tulip\n\ndict_sol = flux_balance_analysis_dict(\n    model,\n    Tulip.Optimizer;\n    modifications = [\n        change_objective(\"R_BIOMASS_Ecoli_core_w_GAM\"),\n        change_constraint(\"R_EX_glc__D_e\", -12, -12),\n        change_constraint(\"R_EX_o2_e\", 0, 0),\n    ],\n)","category":"page"},{"location":"notebooks/4_basic_core_coupled_usage/#Structure-of-CoreModel","page":"Basic usage of CoreModel and CoreModelCoupled","title":"Structure of CoreModel","text":"","category":"section"},{"location":"notebooks/4_basic_core_coupled_usage/","page":"Basic usage of CoreModel and CoreModelCoupled","title":"Basic usage of CoreModel and CoreModelCoupled","text":"CoreModel is a special COBREXA type that is optimized for large scale analysis of large models. It stores data in a sparse format where possible.","category":"page"},{"location":"notebooks/4_basic_core_coupled_usage/","page":"Basic usage of CoreModel and CoreModelCoupled","title":"Basic usage of CoreModel and CoreModelCoupled","text":"fieldnames(CoreModel)","category":"page"},{"location":"notebooks/4_basic_core_coupled_usage/","page":"Basic usage of CoreModel and CoreModelCoupled","title":"Basic usage of CoreModel and CoreModelCoupled","text":"model.S","category":"page"},{"location":"notebooks/4_basic_core_coupled_usage/#CoreModelCoupled-adds-coupling-constraints-to-CoreModel","page":"Basic usage of CoreModel and CoreModelCoupled","title":"CoreModelCoupled adds coupling constraints to CoreModel","text":"","category":"section"},{"location":"notebooks/4_basic_core_coupled_usage/","page":"Basic usage of CoreModel and CoreModelCoupled","title":"Basic usage of CoreModel and CoreModelCoupled","text":"CoreModelCoupled extends CoreModel by adding coupling constraints.","category":"page"},{"location":"notebooks/4_basic_core_coupled_usage/","page":"Basic usage of CoreModel and CoreModelCoupled","title":"Basic usage of CoreModel and CoreModelCoupled","text":"fieldnames(CoreModelCoupled)","category":"page"},{"location":"notebooks/4_basic_core_coupled_usage/","page":"Basic usage of CoreModel and CoreModelCoupled","title":"Basic usage of CoreModel and CoreModelCoupled","text":"In short, coupling constraints can be used to ensure that fluxes scale with the growth rate (μ) of a model. This reduces the impact of biologically infeasible cycles from occurring. Here we will model coupling constraints by assuming that they have the form: -γ ≤ vᵢ/μ  ≤ γ, where γ is the ratio between each individual flux (vᵢ) in the model and the growth rate.","category":"page"},{"location":"notebooks/4_basic_core_coupled_usage/","page":"Basic usage of CoreModel and CoreModelCoupled","title":"Basic usage of CoreModel and CoreModelCoupled","text":"gamma = 40 # arbitrary\n\nnr = n_reactions(model) # number of reactions\nbiomass_index = first(indexin([\"R_BIOMASS_Ecoli_core_w_GAM\"], reactions(model)))\n\nusing LinearAlgebra, SparseArrays\n\nCf = sparse(1.0I, nr, nr)\nCf[:, biomass_index] .= -gamma\nCb = sparse(1.0I, nr, nr)\nCb[:, biomass_index] .= gamma\nC = [Cf; Cb] # coupling constraint matrix\n\nclb = spzeros(2 * nr)\nclb[1:nr] .= -1000.0\ncub = spzeros(2 * nr)\ncub[nr+1:end] .= 1000\n\ncmodel = CoreModelCoupled(model, C, clb, cub)","category":"page"},{"location":"notebooks/4_basic_core_coupled_usage/","page":"Basic usage of CoreModel and CoreModelCoupled","title":"Basic usage of CoreModel and CoreModelCoupled","text":"d = flux_balance_analysis_dict(model, Tulip.Optimizer)\nd[\"R_BIOMASS_Ecoli_core_w_GAM\"]","category":"page"},{"location":"notebooks/4_basic_core_coupled_usage/","page":"Basic usage of CoreModel and CoreModelCoupled","title":"Basic usage of CoreModel and CoreModelCoupled","text":"dc = flux_balance_analysis_dict(cmodel, Tulip.Optimizer)\ndc[\"R_BIOMASS_Ecoli_core_w_GAM\"]","category":"page"},{"location":"notebooks/4_basic_core_coupled_usage/","page":"Basic usage of CoreModel and CoreModelCoupled","title":"Basic usage of CoreModel and CoreModelCoupled","text":"","category":"page"},{"location":"notebooks/4_basic_core_coupled_usage/","page":"Basic usage of CoreModel and CoreModelCoupled","title":"Basic usage of CoreModel and CoreModelCoupled","text":"This page was generated using Literate.jl.","category":"page"},{"location":"tutorials/4_modifying/#Modifying-and-saving-the-models","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"","category":"section"},{"location":"tutorials/4_modifying/","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"Making a small modification to the model and reanalyzing them is often a useful way to explore how the constraints work together, and to inspect the degrees of freedom in the model.","category":"page"},{"location":"tutorials/4_modifying/","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"With COBREXA.jl, you have two main choices of making model modifications:","category":"page"},{"location":"tutorials/4_modifying/","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"you can manually change the model structures (i.e. permanently change the data in of your model variable)\nyou can use special arguments of analysis functions that allow you to make the modifications in a declarative way and \"on the fly\", without having to manually interact with the model","category":"page"},{"location":"tutorials/4_modifying/","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"tip: Notebook available\nThe available notebooks demonstrate model export and serialization and various model modifications (1, 2, 3).","category":"page"},{"location":"tutorials/4_modifying/#Manual-modifications","page":"Modifying and saving the models","title":"Manual modifications","text":"","category":"section"},{"location":"tutorials/4_modifying/","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"Certain model types, including CoreModel and StandardModel, are built from mutable structs that you are free to modify as you want.","category":"page"},{"location":"tutorials/4_modifying/","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"CoreModel consists of sparse matrices and vectors that describe the model precisely. For example, modifying a bound of the reaction is as simple as writing to the .xl or .xu (lower and upper bound for x) vectors in the structure:","category":"page"},{"location":"tutorials/4_modifying/","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"using COBREXA\nm = load_model(CoreModel, \"e_coli_core.xml\")\nm.xl[3] = 0.0","category":"page"},{"location":"tutorials/4_modifying/","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"The available field names can be listed using e.g. fieldnames(CoreModel), or more conveniently by employing the completion in the shell:","category":"page"},{"location":"tutorials/4_modifying/","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"julia> m.   # press [Tab]\nS    b     c     mets  rxns  xl    xu","category":"page"},{"location":"tutorials/4_modifying/","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"With CoreModel, you may need to find the proper metabolites by identifier. For that, you may examine the reactions and metabolites of the model, e.g. using","category":"page"},{"location":"tutorials/4_modifying/","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"indexin([\"M_nadh_c\", \"M_co2_e\"], metabolites(m))","category":"page"},{"location":"tutorials/4_modifying/","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"...which will return the numeric indexes of NADH and CO₂ metabolites. These can be used to, e.g., change the \"balance\" of the metabolites in the model:","category":"page"},{"location":"tutorials/4_modifying/","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"m.b[64] = -1      # model will be losing 1 flux unit of CO₂","category":"page"},{"location":"tutorials/4_modifying/","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"...or to modify existing reaction (here with index 5) directly in stoichiometry matrix:","category":"page"},{"location":"tutorials/4_modifying/","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"m.S[5,8] = -1\nm.S[5,64] = 1","category":"page"},{"location":"tutorials/4_modifying/","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"While this works well if you are used to working with matrix-like representations of the model, it is not really convenient if you want to change the reactions and models in an easy way. StandardModel is structured in a much more user-friendly way, which makes the manual modifications easier.","category":"page"},{"location":"tutorials/4_modifying/","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"In particular, StandardModel consists of dictionaries of Reaction, Metabolite and Gene objects that may be modified and indexed directly using their names. That way, the above modifications may be written in a cleaner, semantic and declarative fashion, as follows:","category":"page"},{"location":"tutorials/4_modifying/","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"m = load_model(StandardModel, \"e_coli_core.xml\")\nm.reactions[\"R_TPI\"].lb = 0.0                         # change lower bound of the reaction to 0\nm.reactions[\"R_GLNS\"].metabolites[\"M_nadh_c\"] = -1.0  # update stoichiometry\nm.reactions[\"R_GLNS\"].metabolites[\"M_co2_e\"] = 1.0\n...","category":"page"},{"location":"tutorials/4_modifying/","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"There are other functions that may be used to change the StandardModel in a more systematic way. See the documentation of add_reaction!, add_metabolite!, add_gene!, remove_reaction!, remove_metabolite!, [ remove_gene!, and the Model reconstruction reference for more examples.","category":"page"},{"location":"tutorials/4_modifying/#Analysis-modifiers","page":"Modifying and saving the models","title":"Analysis modifiers","text":"","category":"section"},{"location":"tutorials/4_modifying/","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"Some analysis functions, including flux_balance_analysis and flux_variability_analysis, accept a special argument modifications, which is a list of descriptions of small changes that should be applied to the model before modification.","category":"page"},{"location":"tutorials/4_modifying/","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"These include e.g.:","category":"page"},{"location":"tutorials/4_modifying/","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"change_objective that sets a new optimization objective\nchange_optimizer that chooses a different JuMP.jl optimizer for the analysis\nchange_optimizer_attribute that can set various optimizer parameters\nchange_constraint that changes the flux bounds of a reaction\nknockout that disables reactions that depend on genes","category":"page"},{"location":"tutorials/4_modifying/","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"This way, you can easily check out the model state when maximizing the rate of \"TALA\" (transadenolase A) reaction:","category":"page"},{"location":"tutorials/4_modifying/","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"m = load_model(StandardModel, \"e_coli_core.xml\")\nflux_balance_analysis_dict(\n  m, GLPK.Optimizer;\n  modifications=[change_objective(\"R_TALA\")])","category":"page"},{"location":"tutorials/4_modifying/","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"...or knock out a gene combination that disables the transadenolase A completely (see m.reactions[\"R_TALA\"].grr):","category":"page"},{"location":"tutorials/4_modifying/","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"flux_balance_analysis_dict(\n  m, GLPK.Optimizer;\n  modifications=[knockout([\"G_b0008\", \"G_b2464\"])])","category":"page"},{"location":"tutorials/4_modifying/","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"...or do both at once– knock out some other genes, and try to maximize the transadenolase A reaction rate:","category":"page"},{"location":"tutorials/4_modifying/","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"flux_balance_analysis_dict(\n  m, GLPK.Optimizer;\n  modifications=[\n    knockout([\"G_s0001\"]),\n    change_objective(\"R_TALA\"),\n  ])","category":"page"},{"location":"tutorials/4_modifying/#Exporting-the-modified-models-in-native-formats","page":"Modifying and saving the models","title":"Exporting the modified models in native formats","text":"","category":"section"},{"location":"tutorials/4_modifying/","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"Manually modified models can be exported in standard formats so that they can be examined in other environments, or just made accessible for publication.","category":"page"},{"location":"tutorials/4_modifying/","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"COBREXA.jl supports export of MATLAB-like and JSON models. Simply use save_model:","category":"page"},{"location":"tutorials/4_modifying/","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"save_model(m, \"myModel.json\")\nsave_model(m, \"myModel.mat\")","category":"page"},{"location":"tutorials/4_modifying/","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"The function automatically guesses the appropriate model format to write into the file from the file extension. If required, you can choose the model format manually by using save_json_model and save_mat_model.","category":"page"},{"location":"tutorials/4_modifying/#Using-Serialization-for-quick-and-efficient-model-storage","page":"Modifying and saving the models","title":"Using Serialization for quick & efficient model storage","text":"","category":"section"},{"location":"tutorials/4_modifying/","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"If you save the model \"just for yourself\", such as for the use in an immediately following analysis, it may be inconvenient (and unnecessarily inefficient) to encode and decode the models to and from the external format. Moreover, certain model types (such as CoreModelCoupled) cannot be fully represented in all model formats, thus increasing the chance for accidental data loss.","category":"page"},{"location":"tutorials/4_modifying/","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"Instead of that, we recommend using the Serialization package. It provides a straightforward way to save any Julia data structure to the disk, using a very efficient data format that can be written to and read from the disk very quickly.","category":"page"},{"location":"tutorials/4_modifying/","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"With any model in m, you can write it to disk as follows:","category":"page"},{"location":"tutorials/4_modifying/","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"using Serialization\nopen(f -> serialize(f, m), \"myModel\", \"w\")","category":"page"},{"location":"tutorials/4_modifying/","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"...and read it back with:","category":"page"},{"location":"tutorials/4_modifying/","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"m = deserialize(\"myModel\")","category":"page"},{"location":"tutorials/4_modifying/","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"One great advantage of Serialization is speed – models with millions of reactions are usually loaded and saved with minimal overhead in less than a second.","category":"page"},{"location":"tutorials/4_modifying/","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"warning: Limits of `Serialization`\nSerialized models are great for quickly exchanging data objects between analysis steps. The avoided need for re-encoding can save you a great deal of analysis time that can be used for better purposes. Despite that, do not rely on the stability of the serialized format – it often changes between Julia versions, and the data stored in one version may not open easily after an upgrade. In short, use serialized data within one workflow, and use standard and stable external formats for publishing and storing the data beyond the scope of a single analysis workflow.","category":"page"},{"location":"notebooks/7_community_model/","page":"Building and analysing a small community model","title":"Building and analysing a small community model","text":"EditURL = \"https://github.com/LCSB-BioCore/COBREXA.jl/blob/master/docs/src/notebooks/7_community_model.jl\"","category":"page"},{"location":"notebooks/7_community_model/#Building-and-analysing-a-small-community-model","page":"Building and analysing a small community model","title":"Building and analysing a small community model","text":"","category":"section"},{"location":"notebooks/7_community_model/","page":"Building and analysing a small community model","title":"Building and analysing a small community model","text":"(Image: ) (Image: )","category":"page"},{"location":"notebooks/7_community_model/","page":"Building and analysing a small community model","title":"Building and analysing a small community model","text":"Here we will use COBREXA to build and analyze a small community model consisting of three E. coli mutants using the CoreModel. We will use an objective function that enforces equal growth rates.","category":"page"},{"location":"notebooks/7_community_model/","page":"Building and analysing a small community model","title":"Building and analysing a small community model","text":"We will first construct a community of only two mutants to illustrate the effect of the community biomass objective function. Then we will add a third member that has a lethal knockout. Due to the bounds on the exchange reactions these three models are incapable of sharing resources - hence the maximum growth rate will be zero. By changing the bounds we can allow resource sharing, \"saving\" the community.","category":"page"},{"location":"notebooks/7_community_model/#Load-the-base-model","page":"Building and analysing a small community model","title":"Load the base model","text":"","category":"section"},{"location":"notebooks/7_community_model/","page":"Building and analysing a small community model","title":"Building and analysing a small community model","text":"!isfile(\"e_coli_core.json\") &&\n    download(\"http://bigg.ucsd.edu/static/models/e_coli_core.json\", \"e_coli_core.json\");\n\nusing COBREXA\nusing Tulip","category":"page"},{"location":"notebooks/7_community_model/#Load-the-models-and-inspect-fba-solutions","page":"Building and analysing a small community model","title":"Load the models and inspect fba solutions","text":"","category":"section"},{"location":"notebooks/7_community_model/","page":"Building and analysing a small community model","title":"Building and analysing a small community model","text":"base_model = load_model(CoreModel, \"e_coli_core.json\") # base from from which the knockouts will be constructed\n\ncytbd_knockout_model = remove_reactions(base_model, \"CYTBD\") # knockout the CYTBD (cytochrome oxidase) reaction\nsol = flux_balance_analysis_dict(cytbd_knockout_model, Tulip.Optimizer)\nsol[\"BIOMASS_Ecoli_core_w_GAM\"] # Cytochrome oxidase knockout μ (growth rate)","category":"page"},{"location":"notebooks/7_community_model/","page":"Building and analysing a small community model","title":"Building and analysing a small community model","text":"atps4r_knockout_model = remove_reactions(base_model, \"ATPS4r\") # knockout the ATP synthase reaction\nsol = flux_balance_analysis_dict(atps4r_knockout_model, Tulip.Optimizer)\nsol[\"BIOMASS_Ecoli_core_w_GAM\"] # ATP synthase knockout μ","category":"page"},{"location":"notebooks/7_community_model/","page":"Building and analysing a small community model","title":"Building and analysing a small community model","text":"eno_knockout_model = remove_reactions(base_model, \"ENO\") # knockout the enolase reaction\nsol = flux_balance_analysis_dict(eno_knockout_model, Tulip.Optimizer)\nsol[\"BIOMASS_Ecoli_core_w_GAM\"] # Enolase knockout μ, cannot grow by itself","category":"page"},{"location":"notebooks/7_community_model/#Build-a-community-model-of-the-cytochrome-oxidase-knockout-and-the-ATP-synthase-knockout-models","page":"Building and analysing a small community model","title":"Build a community model of the cytochrome oxidase knockout and the ATP synthase knockout models","text":"","category":"section"},{"location":"notebooks/7_community_model/","page":"Building and analysing a small community model","title":"Building and analysing a small community model","text":"ex_rxns = filter(looks_like_exchange_reaction, reactions(base_model)) # identify exchange reactions heuristically\nex_mets = [first(keys(reaction_stoichiometry(base_model, ex_rxn))) for ex_rxn in ex_rxns] # identify exchange metabolites IN THE SAME ORDER as ex_rxns\n[ex_rxns ex_mets]","category":"page"},{"location":"notebooks/7_community_model/","page":"Building and analysing a small community model","title":"Building and analysing a small community model","text":"model_names = [\"cytbd_ko\", \"atps4r_ko\"]\ncommunity_model = join_with_exchanges(\n    [cytbd_knockout_model, atps4r_knockout_model],\n    ex_rxns,\n    ex_mets;\n    add_biomass_objective = true,\n    biomass_ids = [\"BIOMASS_Ecoli_core_w_GAM\", \"BIOMASS_Ecoli_core_w_GAM\"],\n    model_names = model_names,\n)","category":"page"},{"location":"notebooks/7_community_model/#Set-exchange-reaction-bounds-of-community-model-based-on-the-bounds-of-the-individual-models","page":"Building and analysing a small community model","title":"Set exchange reaction bounds of community model based on the bounds of the individual models","text":"","category":"section"},{"location":"notebooks/7_community_model/","page":"Building and analysing a small community model","title":"Building and analysing a small community model","text":"env_ex_rxn_idxs = indexin(ex_rxns, reactions(community_model)) # identify the global (environmental exchange reactions)\ncytbd_ex_rxn_idxs = indexin(ex_rxns, reactions(cytbd_knockout_model)) # identify the indices of the corresponding exchange reactions in the original models\natps4r_ex_rxn_idxs = indexin(ex_rxns, reactions(atps4r_knockout_model))","category":"page"},{"location":"notebooks/7_community_model/","page":"Building and analysing a small community model","title":"Building and analysing a small community model","text":"In case some exchange reactions are not present in both models, set environmental exchange bound to the sum of the individual exchange bounds","category":"page"},{"location":"notebooks/7_community_model/","page":"Building and analysing a small community model","title":"Building and analysing a small community model","text":"for (env_ex, m2_ex, m1_ex) in zip(env_ex_rxn_idxs, cytbd_ex_rxn_idxs, atps4r_ex_rxn_idxs)\n    m2lb = isnothing(m2_ex) ? 0.0 : atps4r_knockout_model.xl[m2_ex]\n    m2ub = isnothing(m2_ex) ? 0.0 : atps4r_knockout_model.xu[m2_ex]\n    m1lb = isnothing(m1_ex) ? 0.0 : cytbd_knockout_model.xl[m1_ex]\n    m1ub = isnothing(m1_ex) ? 0.0 : cytbd_knockout_model.xu[m1_ex]\n    change_bounds!(community_model, [env_ex]; lower = [m1lb + m2lb], upper = [m1ub + m2ub])\nend","category":"page"},{"location":"notebooks/7_community_model/#Add-objective-function-to-community-model","page":"Building and analysing a small community model","title":"Add objective function to community model`","text":"","category":"section"},{"location":"notebooks/7_community_model/","page":"Building and analysing a small community model","title":"Building and analysing a small community model","text":"biomass_ids = model_names .* \"_BIOMASS_Ecoli_core_w_GAM\"\nadd_objective!(\n    community_model,\n    biomass_ids;\n    objective_column_index = first(\n        indexin([\"community_biomass\"], reactions(community_model)),\n    ),\n)","category":"page"},{"location":"notebooks/7_community_model/#Perform-community-FBA","page":"Building and analysing a small community model","title":"Perform community FBA","text":"","category":"section"},{"location":"notebooks/7_community_model/","page":"Building and analysing a small community model","title":"Building and analysing a small community model","text":"d = flux_balance_analysis_dict(\n    community_model,\n    Tulip.Optimizer;\n    modifications = [change_optimizer_attribute(\"IPM_IterationsLimit\", 1000)],\n)\nd[\"community_biomass\"] # community μ","category":"page"},{"location":"notebooks/7_community_model/","page":"Building and analysing a small community model","title":"Building and analysing a small community model","text":"Notice, the growth rate is limited to the slowest organism as per the objective function","category":"page"},{"location":"notebooks/7_community_model/#Add-the-enolase-knockout-to-the-community-model","page":"Building and analysing a small community model","title":"Add the enolase knockout to the community model","text":"","category":"section"},{"location":"notebooks/7_community_model/","page":"Building and analysing a small community model","title":"Building and analysing a small community model","text":"community_model = add_model_with_exchanges(\n    community_model,\n    eno_knockout_model,\n    ex_rxns,\n    ex_mets;\n    model_name = \"eno_ko\",\n    biomass_id = \"BIOMASS_Ecoli_core_w_GAM\",\n)\n\npush!(model_names, \"eno_ko\")\nbiomass_ids = model_names .* \"_BIOMASS_Ecoli_core_w_GAM\"\nadd_objective!(\n    community_model,\n    biomass_ids;\n    objective_column_index = first(\n        indexin([\"community_biomass\"], reactions(community_model)),\n    ),\n)\n\nd = flux_balance_analysis_dict(\n    community_model,\n    Tulip.Optimizer;\n    modifications = [change_optimizer_attribute(\"IPM_IterationsLimit\", 1000)],\n)\nprintln(\"Community μ = \", d[\"community_biomass\"])","category":"page"},{"location":"notebooks/7_community_model/","page":"Building and analysing a small community model","title":"Building and analysing a small community model","text":"Notice that the high communal growth rate is 0, due to the enolase knockout. The reason for this behaviour: enolase is a central reaction in glycolysis - without it the organism cannot access the lower glycolysis pathways or the TCA cycle, hence the model predicts no growth for the knockout, and hence no growth for the system since they all have to have the same growth rate.","category":"page"},{"location":"notebooks/7_community_model/#Allow-the-mutants-to-rescue-each-other-by-sharing-pyruvate","page":"Building and analysing a small community model","title":"Allow the mutants to rescue each other by sharing pyruvate","text":"","category":"section"},{"location":"notebooks/7_community_model/","page":"Building and analysing a small community model","title":"Building and analysing a small community model","text":"pyr_exs = model_names .* \"_EX_pyr_e\"\nchange_bounds!(community_model, pyr_exs; lower = fill(-1000.0, 3), upper = fill(1000.0, 3))\n\nd = flux_balance_analysis_dict(\n    community_model,\n    Tulip.Optimizer;\n    modifications = [change_optimizer_attribute(\"IPM_IterationsLimit\", 1000)],\n)\nd[\"community_biomass\"] # community μ","category":"page"},{"location":"notebooks/7_community_model/","page":"Building and analysing a small community model","title":"Building and analysing a small community model","text":"Notice that the growth rate is now above 0! Nutrient sharing saved the day!","category":"page"},{"location":"notebooks/7_community_model/","page":"Building and analysing a small community model","title":"Building and analysing a small community model","text":"","category":"page"},{"location":"notebooks/7_community_model/","page":"Building and analysing a small community model","title":"Building and analysing a small community model","text":"This page was generated using Literate.jl.","category":"page"},{"location":"notebooks/6_screening/","page":"Exploring model variants with screen","title":"Exploring model variants with screen","text":"EditURL = \"https://github.com/LCSB-BioCore/COBREXA.jl/blob/master/docs/src/notebooks/6_screening.jl\"","category":"page"},{"location":"notebooks/6_screening/#Exploring-model-variants-with-screen","page":"Exploring model variants with screen","title":"Exploring model variants with screen","text":"","category":"section"},{"location":"notebooks/6_screening/","page":"Exploring model variants with screen","title":"Exploring model variants with screen","text":"(Image: ) (Image: )","category":"page"},{"location":"notebooks/6_screening/","page":"Exploring model variants with screen","title":"Exploring model variants with screen","text":"This notebooks demonstrates a simple use of screen to explore large number of model variants. On the toy E. Coli model, we try to map the impact of knocking out single reactions and 2-reaction combinations.","category":"page"},{"location":"notebooks/6_screening/","page":"Exploring model variants with screen","title":"Exploring model variants with screen","text":"First, let's download the data and load the packages and the model","category":"page"},{"location":"notebooks/6_screening/","page":"Exploring model variants with screen","title":"Exploring model variants with screen","text":"!isfile(\"e_coli_core.json\") &&\n    download(\"http://bigg.ucsd.edu/static/models/e_coli_core.json\", \"e_coli_core.json\");\n\nusing COBREXA, Tulip\n\nmodel = load_model(StandardModel, \"e_coli_core.json\")","category":"page"},{"location":"notebooks/6_screening/#Preparing-the-functions","page":"Exploring model variants with screen","title":"Preparing the functions","text":"","category":"section"},{"location":"notebooks/6_screening/","page":"Exploring model variants with screen","title":"Exploring model variants with screen","text":"While we could use the with_changed_bound to limit the reaction rates, but we will make a slightly more precise, usage-tailored modification. This is a straightforward modification of the with_changed_bound that does not set bounds \"outside\" of the original bounds:","category":"page"},{"location":"notebooks/6_screening/","page":"Exploring model variants with screen","title":"Exploring model variants with screen","text":"with_limited_rate(reaction_id::String, limit) =\n    model::StandardModel -> begin\n        m = copy(model)\n        m.reactions = copy(model.reactions)\n        r = m.reactions[reaction_id] = copy(model.reactions[reaction_id])\n        if -limit > r.lb\n            r.lb = -limit\n        end\n        if limit < r.ub\n            r.ub = limit\n        end\n        m\n    end","category":"page"},{"location":"notebooks/6_screening/#Knocking-out-single-reactions","page":"Exploring model variants with screen","title":"Knocking out single reactions","text":"","category":"section"},{"location":"notebooks/6_screening/","page":"Exploring model variants with screen","title":"Exploring model variants with screen","text":"This can be applied to see how much biomass can the model produce with certain reactions limited to almost zero:","category":"page"},{"location":"notebooks/6_screening/","page":"Exploring model variants with screen","title":"Exploring model variants with screen","text":"get_biomass(x) = isnothing(x) ? 0 : x[\"BIOMASS_Ecoli_core_w_GAM\"]\n\nproductions = screen_variants(\n    model,\n    [[with_limited_rate(rxn, 0.1)] for rxn in reactions(model)],\n    model -> get_biomass(flux_balance_analysis_dict(model, Tulip.Optimizer)),\n)","category":"page"},{"location":"notebooks/6_screening/","page":"Exploring model variants with screen","title":"Exploring model variants with screen","text":"This can be nicely plotted to give a more comprehensive overview of which reactions are critical or not:","category":"page"},{"location":"notebooks/6_screening/","page":"Exploring model variants with screen","title":"Exploring model variants with screen","text":"using CairoMakie\n\ndisp_rxns = rand(1:95, 20) # only display 20 random fluxes to save space\nbarplot(\n    productions[disp_rxns],\n    direction = :x,\n    axis = (\n        yticks = (1:20, reactions(model)[disp_rxns]),\n        xlabel = \"Flux [mmol/gDW/h]\",\n        ylabel = \"Reaction ID\",\n    ),\n)","category":"page"},{"location":"notebooks/6_screening/#Knocking-out-reaction-combinations","page":"Exploring model variants with screen","title":"Knocking out reaction combinations","text":"","category":"section"},{"location":"notebooks/6_screening/","page":"Exploring model variants with screen","title":"Exploring model variants with screen","text":"It is very easy to prepare matrices of biomass productions from all possible two-reaction knockouts. To make it more interesting, we will restrict one of the reactions of the pair a bit less, to see more possible outcomes.","category":"page"},{"location":"notebooks/6_screening/","page":"Exploring model variants with screen","title":"Exploring model variants with screen","text":"We do not process all reactions here to make the notebook rendering efficient, but you can easily remove the restriction, and speed the process up using parallel execution, by specifying workers argument (see documentation of screen for details)","category":"page"},{"location":"notebooks/6_screening/","page":"Exploring model variants with screen","title":"Exploring model variants with screen","text":"rxns = reactions(model)\n\nproductions = screen_variants(\n    model,\n    [\n        [with_limited_rate(rxn1, 3), with_limited_rate(rxn2, 0.1)] for rxn1 in rxns,\n        rxn2 in rxns\n    ],\n    model -> get_biomass(flux_balance_analysis_dict(model, Tulip.Optimizer)),\n)\n\nf = Figure()\nax = Axis(\n    f[1, 1],\n    ylabel = \"Reaction KO\",\n    xlabel = \"Reaction KO\",\n    yticks = (1:20, reactions(model)[disp_rxns]),\n    xticks = (1:20, reactions(model)[disp_rxns]),\n    xticklabelrotation = -pi / 4,\n)\nhm = heatmap!(ax, productions[disp_rxns, disp_rxns])\nColorbar(f[1, 2], hm, label = \"Flux [mmol/gDW/h]\")\nf","category":"page"},{"location":"notebooks/6_screening/","page":"Exploring model variants with screen","title":"Exploring model variants with screen","text":"","category":"page"},{"location":"notebooks/6_screening/","page":"Exploring model variants with screen","title":"Exploring model variants with screen","text":"This page was generated using Literate.jl.","category":"page"},{"location":"howToContribute/#Contributing-to-COBREXA.jl","page":"How to contribute","title":"Contributing to COBREXA.jl","text":"","category":"section"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":":+1::tada: Thanks for taking the time to contribute to COBREXA.jl! :tada::+1:","category":"page"},{"location":"howToContribute/#How-to-report-a-bug-or-suggest-an-enhancement","page":"How to contribute","title":"How to report a bug or suggest an enhancement","text":"","category":"section"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"Please use the GitHub issue tracker to report any problems with the software, and discuss any potential questions about COBREXA use.","category":"page"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"Before creating bug reports, please check the open issues, you might find out that the issue is already reported and known.","category":"page"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"General guidelines for reporting issues:","category":"page"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"If creating a bug report, include a complete description of how we can reproduce the bug, including e.g. links to datasets and any external scripts used. Ideally, try to create a code snippet that causes the problem on a fresh installation of COBREXA.jl (often called the \"minimal crashing example\")\nIf possible, use the supplied issue templates and fill in all fields.\nIf your issue is already described in an issue that is \"closed\", do not reopen it. Instead, open a new issue and include a link to the original issue. (The fact that the original issue might have been mistakenly closed may be an issue on its own.)\nEnhancement proposals should refer a viable way for implementing the enhancement. If there are multiple possibilities for implementation, we will welcome a discussion about which one is optimal for COBREXA.jl.","category":"page"},{"location":"howToContribute/#How-to-test-a-development-version-of-the-package?","page":"How to contribute","title":"How to test a development version of the package?","text":"","category":"section"},{"location":"howToContribute/#Step-1:-Load-COBREXA.jl-from-the-source-from-the-git-repository","page":"How to contribute","title":"Step 1: Load COBREXA.jl from the source from the git repository","text":"","category":"section"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"There are two ways that you can retrieve a local copy of the development repo: you can either clone the repository manually, or use Julia package manager to get a development version for you.","category":"page"},{"location":"howToContribute/#Option-1:-Using-Julia-package-manager","page":"How to contribute","title":"Option 1: Using Julia package manager","text":"","category":"section"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"When you are used to using the Julia package manager for developing or contributing to packages, you can type:","category":"page"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"(v1.6) pkg> dev COBREXA","category":"page"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"This will install the COBREXA package locally and check it out for development. You can check the location of the package with:","category":"page"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"(v1.6) pkg> status\n    Status `~/.julia/environments/v1.4/Project.toml`\n  [a03a9c34] COBREXA v0.0.5 [`~/.julia/dev/COBREXA`]","category":"page"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"The default location of the package is ~/.julia/dev/COBREXA.","category":"page"},{"location":"howToContribute/#Option-2:-Cloning-with-git-manually","page":"How to contribute","title":"Option 2: Cloning with git manually","text":"","category":"section"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"You can use git to get the sources as follows:","category":"page"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"$ git clone git@github.com:LCSB-BioCore/COBREXA.jl.git","category":"page"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"When the cloning process finishes, you shold see the package cloned in a new directory COBREXA.jl. To install this version to your Julia, change to the directory first, and start Julia:","category":"page"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"$ cd COBREXA.jl\n$ julia","category":"page"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"With Julia, you can install the development version of the package from the directory as follows:","category":"page"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"(v1.6) pkg> add .","category":"page"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"(press ] to get into the packaging environment)","category":"page"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"This adds the COBREXA.jl package and all its dependencies. You can verify that the installation worked by typing:","category":"page"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"(v1.6) pkg> status","category":"page"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"If you are planning to develop the package, it is often easier to install the package in development mode, with dev command:","category":"page"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"(v1.6) pkg> dev .","category":"page"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"That causes the package to always load with whatever code changes that you added to the source directory.","category":"page"},{"location":"howToContribute/#Finally:-load-COBREXA.jl","page":"How to contribute","title":"Finally: load COBREXA.jl","text":"","category":"section"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"With both of above options, you should get COBREXA.jl installed, which means that the following command should, without errors, load the package and make COBREXA.jl functions available for testing:","category":"page"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"julia> using COBREXA","category":"page"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"You may now freely modify the code and test the result.","category":"page"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"Remember that if you want to work in the environment of the package, you need to activate it. That causes, among other, that the additional dependencies specified with packaging add command will be written automaticaly to Project.toml file of your local COBREXA.jl clone, not to your global environment. Activation is simple: when in the directory of the package, just type the command into the packaging shell:","category":"page"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"(v1.6) pkg> activate","category":"page"},{"location":"howToContribute/#Step-2:-Publish-your-changes","page":"How to contribute","title":"Step 2: Publish your changes","text":"","category":"section"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"You are expected to make a fork of the main COBREXA.jl repository, and open a pull request from that one to the master branch of the main repository. For creating the fork, just hit the \"Fork\" button on GitHub.","category":"page"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"After that, change the directory to your repository and adjust the remotes:","category":"page"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"$ cd ~/.julia/dev/COBREXA             # or any other directory, as needed\n$ git remote rename origin upstream   # renames the origin (the main COBREXA.jl repo) to upstream\n$ git remote add origin git@github.com:yourUsername/COBREXA.jl.git  # adds the link to your clone as new origin\n$ git fetch origin                    # fetches the refs from your repo","category":"page"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"In the above code, change yourUsername is your GitHub username.","category":"page"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"When the renaming is done, start a new branch at upstream/master. In the code snippet, substitute yn for your initials (Your Name here) and give the new feature a better name than somefeature:","category":"page"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"$ git checkout -b yn-somefeature origin/master","category":"page"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"Commit any changes and features that you like to the new branch. When the commits look complete to you, push the branch to your repository fork:","category":"page"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"$ git push -u origin yn-somefeature","category":"page"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"This makes your changes visible in your repository. After that, you can navigate to GitHub's pull request page, where you should immediately see a big green button that helps you to create a pull request for this branch. Read the section below for precise details and guidelines on submitting the pull requests.","category":"page"},{"location":"howToContribute/#How-to-submit-a-pull-request-(PR)-with-your-modification/enhancement?","page":"How to contribute","title":"How to submit a pull request (PR) with your modification/enhancement?","text":"","category":"section"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"Make a fork of the repository, commit the modifications in a separate branch and push the branch to your fork.\nMake a pull request where you describe the motivation and expected outcome for the users. Specifically, consider any possible incompatibilities, and the necessity to increment the version number after your changes are applied. Label your pull request with a semantic emoji in the title to indicate what it addresses.\nAfter submitting the pull request, verify that all status checks (tests, documentation) are passing. Make sure any new contribution is properly documented and tested (you may want to check with coverage tools, using test --coverage from the Julia packaging shell)","category":"page"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"After you submitted a pull request, a label might be assigned that allows us to track and manage issues and pull requests.","category":"page"},{"location":"howToContribute/#Code-culture-and-style-recommendations","page":"How to contribute","title":"Code culture and style recommendations","text":"","category":"section"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"Follow basic rules for software maintainability and extensibility:","category":"page"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"Do not reimplement functionality that is available in other packages, unless the reimplementation is either trivial and short, or there is a grave need to do so because the other implementations are deficient in some manner.\nTry to keep the function names and interfaces consistent with ecosystem standards and the other functions in the package. Consistency reduces the amount of surprise on the user side, thus lowers the need to reach for documentation, and in turn makes the software much easier and faster to use.\nCode less. Shorter code is almost always better unless demonstrated otherwise, e.g. with a benchmark. Avoid repetitive boilerplate (there should be ways to generate it, if needed).\nKeep the functionality \"open\" and composable. In particular, avoid all unnecessarily opaque and leaky abstractions (common in object-oriented programming).\nAvoid producing lots of \"informative\" text side-output by default, unless that is what the user asked for.\nAdhere to the code formatting rules defined by JuliaFormatter. We usually have a bot running that checks all PRs and reports whether the code is properly formatted.","category":"page"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"Follow the common rules for making easily mergable and reviewable PRs:","category":"page"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"Create one PR for each logical \"feature\" you want to merge. If your change is more complex and contains multiple \"stages\", open multiple PRs.\nKeep the test coverage reasonably high.\nIf you commit many small, partial changes in a PR, you may help us save energy by prefixing your commit names with [skip ci], which deactivates the CI trigger on that commit. With each skipped CI, you save a few watt-hours of energy. Testing just the \"final\" commit of the pull-request branch is sufficient.","category":"page"},{"location":"howToContribute/#For-developers:-What-is-the-expected-branch-management/workflow?","page":"How to contribute","title":"For developers: What is the expected branch management/workflow?","text":"","category":"section"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"The workflow is based on GitLab flow, i.e., a master branch with feature branches being merged into the master branch. Depending on your access rights, you may open the feature branch in this repository, on in your fork.","category":"page"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"The guidelines can be summarized as such:","category":"page"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"when making a contribution, create one new branch and open one new PR for each new independent feature or bugfix\ndo not push to another branch unless it is your own\ntry to get a review before merging unless the change is trivial and non-impacting\nconsider prefixing your branch names with your initials, so that one can easily see who owns which branch (e.g. ad-somefeature would be committed by Arthur Dent)","category":"page"},{"location":"notebooks/2_finding_balance/","page":"Finding balance and variability of constraint-based models","title":"Finding balance and variability of constraint-based models","text":"EditURL = \"https://github.com/LCSB-BioCore/COBREXA.jl/blob/master/docs/src/notebooks/2_finding_balance.jl\"","category":"page"},{"location":"notebooks/2_finding_balance/#Finding-balance-and-variability-of-constraint-based-models","page":"Finding balance and variability of constraint-based models","title":"Finding balance and variability of constraint-based models","text":"","category":"section"},{"location":"notebooks/2_finding_balance/","page":"Finding balance and variability of constraint-based models","title":"Finding balance and variability of constraint-based models","text":"(Image: ) (Image: )","category":"page"},{"location":"notebooks/2_finding_balance/","page":"Finding balance and variability of constraint-based models","title":"Finding balance and variability of constraint-based models","text":"Here we use flux_balance_analysis, flux_variability_analysis, and parsimonious_flux_balance_analysis of COBREXA.jl functions to analyze a toy model of E. coli.","category":"page"},{"location":"notebooks/2_finding_balance/","page":"Finding balance and variability of constraint-based models","title":"Finding balance and variability of constraint-based models","text":"If it is not already present, download the model.","category":"page"},{"location":"notebooks/2_finding_balance/","page":"Finding balance and variability of constraint-based models","title":"Finding balance and variability of constraint-based models","text":"!isfile(\"e_coli_core.xml\") &&\n    download(\"http://bigg.ucsd.edu/static/models/e_coli_core.xml\", \"e_coli_core.xml\")\n\nusing COBREXA","category":"page"},{"location":"notebooks/2_finding_balance/","page":"Finding balance and variability of constraint-based models","title":"Finding balance and variability of constraint-based models","text":"tip: Tip: use `?` to get quick help about functions\nWhen you are unsure about how a function works, write ?   function_name to see the function reference documentation.","category":"page"},{"location":"notebooks/2_finding_balance/","page":"Finding balance and variability of constraint-based models","title":"Finding balance and variability of constraint-based models","text":"model = load_model(\"e_coli_core.xml\")","category":"page"},{"location":"notebooks/2_finding_balance/#Optimization-solvers-in-COBREXA","page":"Finding balance and variability of constraint-based models","title":"Optimization solvers in COBREXA","text":"","category":"section"},{"location":"notebooks/2_finding_balance/","page":"Finding balance and variability of constraint-based models","title":"Finding balance and variability of constraint-based models","text":"To actually perform any optimization based analysis we need to load an optimizer. Any JuMP.jl-supported optimizers will work. Here, we will use Tulip.jl to optimize linear programs and OSQP.jl to optimize quadratic programs.","category":"page"},{"location":"notebooks/2_finding_balance/","page":"Finding balance and variability of constraint-based models","title":"Finding balance and variability of constraint-based models","text":"note: Note: OSQP can be sensitive\nWe recommend reading the docs of OSQP before using it, since   it may give inconsistent results depending on what settings   you use. Commercial solvers like Gurobi, Mosek, CPLEX, etc.   require less user engagement.","category":"page"},{"location":"notebooks/2_finding_balance/","page":"Finding balance and variability of constraint-based models","title":"Finding balance and variability of constraint-based models","text":"using Tulip, OSQP","category":"page"},{"location":"notebooks/2_finding_balance/#Flux-balance-analysis-(FBA)","page":"Finding balance and variability of constraint-based models","title":"Flux balance analysis (FBA)","text":"","category":"section"},{"location":"notebooks/2_finding_balance/","page":"Finding balance and variability of constraint-based models","title":"Finding balance and variability of constraint-based models","text":"Most analysis functions come in several variants that produce different types of output. All of them usually require a model and JuMP.jl-compatible optimizer to work in the model.","category":"page"},{"location":"notebooks/2_finding_balance/","page":"Finding balance and variability of constraint-based models","title":"Finding balance and variability of constraint-based models","text":"In the case of FBA, you may choose from these variants (here using the Tulip optimizer):","category":"page"},{"location":"notebooks/2_finding_balance/","page":"Finding balance and variability of constraint-based models","title":"Finding balance and variability of constraint-based models","text":"vec_soln = flux_balance_analysis_vec(model, Tulip.Optimizer)","category":"page"},{"location":"notebooks/2_finding_balance/","page":"Finding balance and variability of constraint-based models","title":"Finding balance and variability of constraint-based models","text":"dict_soln = flux_balance_analysis_dict(model, Tulip.Optimizer)","category":"page"},{"location":"notebooks/2_finding_balance/#Modifications","page":"Finding balance and variability of constraint-based models","title":"Modifications","text":"","category":"section"},{"location":"notebooks/2_finding_balance/","page":"Finding balance and variability of constraint-based models","title":"Finding balance and variability of constraint-based models","text":"Often it is desirable to add a slight modififaction to the problem before performing analysis, to see e.g. differences of the model behavior caused by the change introduced.","category":"page"},{"location":"notebooks/2_finding_balance/","page":"Finding balance and variability of constraint-based models","title":"Finding balance and variability of constraint-based models","text":"COBREXA.jl supports several modifications by default, which include changing objective sense, optimizer attributes, flux constraints, optimization objective, reaction and gene knockouts, and others.","category":"page"},{"location":"notebooks/2_finding_balance/","page":"Finding balance and variability of constraint-based models","title":"Finding balance and variability of constraint-based models","text":"dict_soln = flux_balance_analysis_dict(\n    model,\n    OSQP.Optimizer;\n    modifications = [ # modifications are applied in order\n        # this changes the objective to maximize the biomass production\n        change_objective(\"R_BIOMASS_Ecoli_core_w_GAM\"),\n\n        # this fixes a specific rate of the glucose exchange\n        change_constraint(\"R_EX_glc__D_e\", -12, -12),\n\n        # this knocks out two genes, i.e. constrains their associated reactions to zero.\n        knockout([\"b0978\", \"b0734\"]), ## the gene IDs are cytochrome oxidase (CYTBD)\n\n        # ignore the optimizer specified above and change it to Tulip\n        change_optimizer(Tulip.Optimizer),\n\n        # set a custom attribute of the Tulip optimizer (see Tulip docs for more possibilities)\n        change_optimizer_attribute(\"IPM_IterationsLimit\", 110),\n\n        # explicitly tell the optimizer to maximize the new objective\n        change_sense(MAX_SENSE),\n    ],\n)","category":"page"},{"location":"notebooks/2_finding_balance/#Flux-variability-analysis-(FVA)","page":"Finding balance and variability of constraint-based models","title":"Flux variability analysis (FVA)","text":"","category":"section"},{"location":"notebooks/2_finding_balance/","page":"Finding balance and variability of constraint-based models","title":"Finding balance and variability of constraint-based models","text":"The default FVA in flux_variability_analysis returns maximized and minimized reaction fluxes in a matrix. Here we use the dictionary variant in fluxvariabilityanalysis_dict, to show how to easily access specific fluxes from its results.","category":"page"},{"location":"notebooks/2_finding_balance/","page":"Finding balance and variability of constraint-based models","title":"Finding balance and variability of constraint-based models","text":"fva_mins, fva_maxs = flux_variability_analysis_dict(\n    model,\n    Tulip.Optimizer;\n    bounds = objective_bounds(0.99), # the objective function is allowed to vary by ~1% from the FBA optimum\n    modifications = [\n        change_optimizer_attribute(\"IPM_IterationsLimit\", 500),\n        change_constraint(\"R_EX_glc__D_e\", -10, -10),\n        change_constraint(\"R_EX_o2_e\", 0.0, 0.0),\n    ],\n)","category":"page"},{"location":"notebooks/2_finding_balance/","page":"Finding balance and variability of constraint-based models","title":"Finding balance and variability of constraint-based models","text":"fva_maxs[\"R_EX_ac_e\"][\"R_EX_ac_e\"] # get the maximal acetate exchange flux","category":"page"},{"location":"notebooks/2_finding_balance/#Parsimonious-flux-balance-analysis-(pFBA)","page":"Finding balance and variability of constraint-based models","title":"Parsimonious flux balance analysis (pFBA)","text":"","category":"section"},{"location":"notebooks/2_finding_balance/","page":"Finding balance and variability of constraint-based models","title":"Finding balance and variability of constraint-based models","text":"Parsimonious flux balance analysis (here in parsimonious_flux_balance_analysis finds a unique flux solution that minimizes the squared sum of fluxes of the system subject, while maintaining the same objective value as the flux balance analysis solution. Since we are optimizing a quadratic objective, we also need to switch to a quadratic optimizer. In this case, OSQP will work. We demonstrate it on the dictionary-returning variant of pFBA, parsimonious_flux_balance_analysis_dict:","category":"page"},{"location":"notebooks/2_finding_balance/","page":"Finding balance and variability of constraint-based models","title":"Finding balance and variability of constraint-based models","text":"dict_soln = parsimonious_flux_balance_analysis_dict(\n    model,\n    OSQP.Optimizer;\n    modifications = [\n        change_optimizer_attribute(\"verbose\", false), # silence the optimizer (OSQP is very verbose by default)\n        change_constraint(\"R_EX_glc__D_e\", -12, -12),\n    ],\n)","category":"page"},{"location":"notebooks/2_finding_balance/","page":"Finding balance and variability of constraint-based models","title":"Finding balance and variability of constraint-based models","text":"The function also has the expectable second variant that returns a vector of solutions, in parsimonious_flux_balance_analysis_vec. Here, we utilize it to show how to use different optimizers for finding the optimum and for solving the quadratic problem. That may be preferable if the optimizer qualities differ for the differing tasks. pFBA allows you to specify qp_modifications that are applied after the original optimum is found, and before the quadratic part of the problem solving begins.","category":"page"},{"location":"notebooks/2_finding_balance/","page":"Finding balance and variability of constraint-based models","title":"Finding balance and variability of constraint-based models","text":"vec_soln = parsimonious_flux_balance_analysis_vec(\n    model,\n    Tulip.Optimizer; # start with Tulip\n    modifications = [\n        change_constraint(\"R_EX_glc__D_e\", -12, -12),\n        change_optimizer_attribute(\"IPM_IterationsLimit\", 500), # we may change Tulip-specific attributes here\n    ],\n    qp_modifications = [\n        change_optimizer(OSQP.Optimizer), # now switch to OSQP (Tulip wouldn't be able to finish the computation)\n        change_optimizer_attribute(\"verbose\", false), # and silence it.\n    ],\n)","category":"page"},{"location":"notebooks/2_finding_balance/","page":"Finding balance and variability of constraint-based models","title":"Finding balance and variability of constraint-based models","text":"","category":"page"},{"location":"notebooks/2_finding_balance/","page":"Finding balance and variability of constraint-based models","title":"Finding balance and variability of constraint-based models","text":"This page was generated using Literate.jl.","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"EditURL = \"https://github.com/LCSB-BioCore/COBREXA.jl/blob/master/docs/src/notebooks/1_loading_converting_saving.jl\"","category":"page"},{"location":"notebooks/1_loading_converting_saving/#Loading,-converting,-and-saving-models","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"","category":"section"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"(Image: ) (Image: )","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"COBREXA can load models stored in .mat, .json, and .xml formats (with the latter denoting SBML formatted models).","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"We will primarily use the E. Coli \"core\" model to demonstrate the utilities found in COBREXA. First, let's download the model in several formats.","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"# Downloads the model files if they don't already exist\n!isfile(\"e_coli_core.mat\") &&\n    download(\"http://bigg.ucsd.edu/static/models/e_coli_core.mat\", \"e_coli_core.mat\");\n!isfile(\"e_coli_core.json\") &&\n    download(\"http://bigg.ucsd.edu/static/models/e_coli_core.json\", \"e_coli_core.json\");\n!isfile(\"e_coli_core.xml\") &&\n    download(\"http://bigg.ucsd.edu/static/models/e_coli_core.xml\", \"e_coli_core.xml\");\nnothing #hide","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"Now, load the package:","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"using COBREXA","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"tip: Save bandwidth!\nThe published models usually do not change very often. It is therefore pretty useful to save them to a central location and load them from there. That saves your time, and does not unnecessarily consume the connectivity resources of the model repository.","category":"page"},{"location":"notebooks/1_loading_converting_saving/#Loading-models","page":"Loading, converting, and saving models","title":"Loading models","text":"","category":"section"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"Load the models using the load_model function. Each model is able to \"pretty-print\" itself, hiding the inner complexity.","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"mat_model = load_model(\"e_coli_core.mat\")","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"json_model = load_model(\"e_coli_core.json\")","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"sbml_model = load_model(\"e_coli_core.xml\")","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"note: Note: `load_model` infers the output type from the file extension\nNotice how each model was read into memory as a model type corresponding   to its file type, i.e. the file ending with .json loaded as a   JSONModel, the file ending with .mat loaded as MATModel, and the   file ending with .xml loaded as an SBMLModel.","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"You can directly inspect the model objects, although only with a specific way for each specific type.","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"JSON models contain their corresponding JSON:","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"json_model.json","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"SBML models contain a complicated structure from SBML.jl package:","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"typeof(sbml_model.sbml)","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"MAT models contain MATLAB data:","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"mat_model.mat","category":"page"},{"location":"notebooks/1_loading_converting_saving/#Using-the-generic-interface-to-access-model-details","page":"Loading, converting, and saving models","title":"Using the generic interface to access model details","text":"","category":"section"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"To prevent the complexities of object representation, COBREXA.jl uses a set of generic interface functions that extract various important information from all supported model types. This approach ensures that the analysis functions can work on any data.","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"For example, you can check the reactions and metabolites contained in SBML and JSON models using the same accessor:","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"reactions(json_model)","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"reactions(sbml_model)","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"issetequal(reactions(json_model), reactions(mat_model)) # do models contain the same reactions?","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"All accessors are defined in a single file in COBREXA source code; you may therefore get a list of all accessors as follows:","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"using InteractiveUtils\n\nfor method in filter(\n    x -> endswith(string(x.file), \"MetabolicModel.jl\"),\n    InteractiveUtils.methodswith(MetabolicModel, COBREXA),\n)\n    println(method.name)\nend","category":"page"},{"location":"notebooks/1_loading_converting_saving/#Converting-between-model-types","page":"Loading, converting, and saving models","title":"Converting between model types","text":"","category":"section"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"It is possible to convert model types to-and-fro. To do this, use the convert function, which is overloaded from Julia's Base.","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"danger: Data loss may occur when converting between models\nThe conversion of models only uses the data accessible through the generic accessors. Other data may get lost.","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"m = convert(MATModel, json_model)","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"m will now contain the MATLAB-style matrix representation of the model:","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"Matrix(m.mat[\"S\"])","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"The loading and conversion can be combined using a shortcut:","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"m = load_model(MATModel, \"e_coli_core.json\")","category":"page"},{"location":"notebooks/1_loading_converting_saving/#Saving-and-exporting-models","page":"Loading, converting, and saving models","title":"Saving and exporting models","text":"","category":"section"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"COBREXA.jl supports exporting the models in JSON and MAT format, using save_model.","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"save_model(m, \"converted_model.json\")\nsave_model(m, \"converted_model.mat\")","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"If you need a non-standard suffix, use the type-specific saving functions:","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"save_json_model(m, \"file.without.a.good.suffix\")\nsave_mat_model(m, \"another.file.matlab\")","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"If you are saving the models only for future processing in Julia environment, it is often wasteful to encode the models to external formats and decode them back. Instead, you can use the \"native\" Julia data format, accessible with package Serialization.","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"This way, you can use serialize to save even the StandardModel that has no file format associated:","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"using Serialization\n\nsm = convert(StandardModel, m)\n\nopen(f -> serialize(f, sm), \"myModel.stdmodel\", \"w\")","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"The models can then be loaded back using deserialize:","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"sm2 = deserialize(\"myModel.stdmodel\")\nissetequal(metabolites(sm), metabolites(sm2))","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"This form of loading operation is usually pretty quick:","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"t = @elapsed deserialize(\"myModel.stdmodel\")\n@info \"Deserialization took $t seconds\"","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"Notably, large and complicated models with thousands of reactions and annotations can take seconds to decode properly. Serialization allows you to almost completely remove this overhead, and scales well to tens of millions of reactions.","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"This page was generated using Literate.jl.","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"EditURL = \"https://github.com/LCSB-BioCore/COBREXA.jl/blob/master/docs/src/notebooks/3_basic_stdmodel_usage.jl\"","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/#Basic-usage-of-StandardModel","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"","category":"section"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"(Image: ) (Image: )","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"In this tutorial we will use COBREXA's StandardModel and functions that specifically operate on it. As usual we will use the toy model of E. coli for demonstration.","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"!isfile(\"e_coli_core.json\") &&\n    download(\"http://bigg.ucsd.edu/static/models/e_coli_core.json\", \"e_coli_core.json\")\n\nusing COBREXA","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/#Loading-a-model","page":"Basic usage of StandardModel","title":"Loading a model","text":"","category":"section"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"model = load_model(StandardModel, \"e_coli_core.json\") # we specifically want to load a StandardModel from the model file","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"note: Note: Loading `StandardModel`s implicitly uses `convert`\nWhen using load_model(StandardModel, file_location) the model at   file_location is first loaded into its inferred format and is then   converted to a StandardModel using the generic accessor interface.   Thus, data loss may occur. Always check your model to ensure that   nothing important has been lost.","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/#Basic-analysis","page":"Basic usage of StandardModel","title":"Basic analysis","text":"","category":"section"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"As before, for optimization based analysis we need to load an optimizer. Here we will use Tulip.jl to solve the linear programs of this tutorial. Refer to the basic constraint-based analysis tutorial for more informaiton.","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"All the normal analysis functions work on StandardModel, due to it also having the same generic accessor interface as all the other model types.","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"using Tulip\n\nfluxes = flux_balance_analysis_dict(\n    model,\n    Tulip.Optimizer;\n    modifications = [\n        change_objective(\"BIOMASS_Ecoli_core_w_GAM\"),\n        change_constraint(\"EX_glc__D_e\", -12, -12),\n        change_constraint(\"EX_o2_e\", 0, 0),\n    ],\n)","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"This is not very exciting yet, since every other model type can also do this. However, deeper inspection of flux results is possible when using StandardModel.","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/#Inspecting-the-flux-solution:-atom_exchange","page":"Basic usage of StandardModel","title":"Inspecting the flux solution: atom_exchange","text":"","category":"section"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"It is sometimes interesting to keep track of the atoms entering and leaving the system through boundary reactions. This can be inspected by calling atom_exchange. That gives you the flux of individual atoms getting consumed and produced by all reactions, based on fluxes. We erase the reaction that consumes the atoms for creating biomass, to see how much mass the \"rest\" of the reaction produces for it:","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"fluxes_without_biomass = copy(fluxes);\ndelete!(fluxes_without_biomass, \"BIOMASS_Ecoli_core_w_GAM\");\natom_exchange(model, fluxes_without_biomass)","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/#Inspecting-the-flux-solution:-metabolite_fluxes","page":"Basic usage of StandardModel","title":"Inspecting the flux solution: metabolite_fluxes","text":"","category":"section"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"Another useful flux result analysis function is metabolite_fluxes. This function gives an overview of reactions consuming and producing each metabolite.","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"consuming, producing = metabolite_fluxes(model, fluxes)\n\nconsuming[\"atp_c\"] # reactions consuming `atp_c`","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/#Internals-of-StandardModel","page":"Basic usage of StandardModel","title":"Internals of StandardModel","text":"","category":"section"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"Another benefit of StandardModel is that it supports a richer internal infrastructure that can be used to manipulate internal model attributes in a systematic way. Specifically, the genes, reactions, and metabolites with of a model each have a type. This is particularly useful when modifying or even constructing a model from scratch.","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/#Genes,-Reactions,-and-Metabolites","page":"Basic usage of StandardModel","title":"Genes, Reactions, and Metabolites","text":"","category":"section"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"StandardModel is composed of ordered dictionaries of Genes, Metabolites and Reactions. Ordered dictionaries are used because the order of the reactions and metabolites are important for constructing a stoichiometric matrix since the rows and columns should correspond to the order of the metabolites and reactions returned by calling the accessors metabolites and reactions.","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"Each StandardModel is composed of the following fields:","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"fieldnames(StandardModel) # fields of a StandardModel","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"The :genes field of a StandardModel contains an ordered dictionary of gene ids mapped to Genes.","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"model.genes # the keys of this dictionary are the same as genes(model)","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"The Gene type is a struct that can be used to store information about genes in a StandardModel. Each Gene is composed of the following fields:","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"fieldnames(Gene)","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"tip: Tip: Use <tab> complete to explore the structure of types\nUse <tab> to quickly explore the fields of a struct. For example,   Gene.<tab> will list all the fields shown above.","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"The keys used in the ordered dictionaries in model.genes are the ids returned using the generic accessor genes. Genes have pretty printing, as demonstrated below for a random gene drawn from the model:","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"random_gene_id = genes(model)[rand(1:n_genes(model))]\nmodel.genes[random_gene_id]","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"The same idea holds for both metabolites (stored as Metabolites) and reactions (stored as Reactions). This is demonstrated below.","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"random_metabolite_id = metabolites(model)[rand(1:n_metabolites(model))]\nmodel.metabolites[random_metabolite_id]","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"random_reaction_id = reactions(model)[rand(1:n_reactions(model))]\nmodel.reactions[random_reaction_id]","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"StandardModel can be used to build your own metabolic model or modify an existing one. One of the main use cases for StandardModel is that it can be used to merge multiple models or parts of multiple models together. Since the internals are uniform inside each StandardModel, attributes of other model types are squashed into the required format (using the generic accessors). This ensures that the internals of all StandardModels are the same - allowing easy systematic evaluation.","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"warning: Warning: Combining models with different namespaces is tricky\nCombining models that use different namespaces requires care.   For example, in some models the water exchange reaction is called   EX_h2o_e, while in others it is called R_EX_h2o_s. This needs to   manually addressed (for now) to prevent duplicate, e.g. reactions,   from being added.","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/#Checking-the-internals-of-StandardModels:-annotation_index","page":"Basic usage of StandardModel","title":"Checking the internals of StandardModels: annotation_index","text":"","category":"section"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"Often when models are automatically reconstructed duplicate genes, reactions or metabolites end up in a model. COBREXA exports annotation_index to check for cases where the id of a struct may be different, but the annotations the same (possibly suggesting a duplication). annotation_index builds a dictionary mapping annotation features to the ids of whatever struct you are inspecting. This makes it easy to find structs that share certain annotation features.","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"rxn_annotations = annotation_index(model.reactions)","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"rxn_annotations[\"ec-code\"]","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"The annotation_index function can also be used on Reactions and Genes in the same way.","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/#Checking-the-internals-of-StandardModels:-check_duplicate_reaction","page":"Basic usage of StandardModel","title":"Checking the internals of StandardModels: check_duplicate_reaction","text":"","category":"section"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"Another useful function is check_duplicate_reaction, which checks for reactions that have duplicate (or similar) reaction equations.","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"pgm_duplicate = Reaction()\npgm_duplicate.id = \"pgm2\" # Phosphoglycerate mutase\npgm_duplicate.metabolites = Dict{String,Float64}(\"3pg_c\" => 1, \"2pg_c\" => -1)\npgm_duplicate","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"check_duplicate_reaction(pgm_duplicate, model.reactions; only_metabolites = false) # can also just check if only the metabolites are the same but different stoichiometry is used","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/#Checking-the-internals-of-StandardModels:-is_mass_balanced","page":"Basic usage of StandardModel","title":"Checking the internals of StandardModels: is_mass_balanced","text":"","category":"section"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"Finally, is_mass_balanced can be used to check if a reaction is mass balanced based on the formulas of the reaction equation.","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"pgm_duplicate.metabolites = Dict{String,Float64}(\"3pg_c\" => 1, \"2pg_c\" => -1, \"h2o_c\" => 1) # not mass balanced now\nis_bal, extra_atoms = is_mass_balanced(model, pgm_duplicate) # extra_atoms shows which atoms are in excess/deficit","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"This page was generated using Literate.jl.","category":"page"},{"location":"","page":"Home","title":"Home","text":"<br>\n<div align=\"center\">\n    <img class=\"docs-light-only\" src=\"assets/header.svg?maxAge=0\" width=\"80%\">\n    <img class=\"docs-dark-only\" src=\"assets/header-dark.svg?maxAge=0\" width=\"80%\">\n</div>\n<br>","category":"page"},{"location":"#Constraint-Based-Reconstruction-and-EXascale-Analysis","page":"Home","title":"Constraint-Based Reconstruction and EXascale Analysis","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"Repository Tests Coverage How to contribute?\n(Image: GitHub) (Image: CI) (Image: codecov) (Image: contrib)","category":"page"},{"location":"","page":"Home","title":"Home","text":"COBREXA is a toolkit for working with large constraint-based metabolic models, and a running very large number of analysis tasks on these models in parallel. Its main purpose is to make the methods of Constraint-based Reconstruction and Analysis (COBRA) scale to problem sizes that require the use of huge computer clusters and HPC environments, which allows them to be realistically applied to pre-exascale-sized models.","category":"page"},{"location":"","page":"Home","title":"Home","text":"In this package, you will find the usual COBRA-like functions that interface to underlying linear programming solvers. We use JuMP.jl as the unified interface for many solvers; you can plug in whichever compatible solver you want, including the popular Tulip.jl, GLPK.jl, OSQP.jl, and Gurobi.jl.","category":"page"},{"location":"","page":"Home","title":"Home","text":"<div align=\"center\">\n<img style=\"width:300px;margin:10px;border-offset:15px;border: 1px solid #eee;border-radius: 50%;padding: 10px;-webkit-border-radius: 50%;-moz-border-radius: 50%;\" src=\"https://git-r3lab.uni.lu/lcsb-biocore/COBREXA.jl/-/jobs/artifacts/master/raw/output.gif?job=generator:gource\" alt=\"history\"><br>\nDevelopment history of COBREXA.jl.\n</div>","category":"page"},{"location":"#Quick-start-guide","page":"Home","title":"Quick start guide","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"You can install COBREXA from Julia repositories. Start julia, press ] to switch to the Packaging environment, and type:","category":"page"},{"location":"","page":"Home","title":"Home","text":"add COBREXA","category":"page"},{"location":"","page":"Home","title":"Home","text":"You also need to install your favorite solver supported by JuMP.jl, typing e.g.:","category":"page"},{"location":"","page":"Home","title":"Home","text":"add Tulip","category":"page"},{"location":"","page":"Home","title":"Home","text":"When the packages are installed, switch back to the \"normal\" julia shell by pressing Backspace (the prompt should change color back to green). After that, you can download a SBML model from the internet and perform a flux balance analysis as follows:","category":"page"},{"location":"","page":"Home","title":"Home","text":"using COBREXA   # loads the package\nusing Tulip     # loads the optimization solver\n\n# download the model\ndownload(\"http://bigg.ucsd.edu/static/models/e_coli_core.xml\", \"e_coli_core.xml\")\n\n# open the SBML file and load the contents\nmodel = load_model(\"e_coli_core.xml\")\n\n# run a FBA\nfluxes = flux_balance_analysis_dict(model, Tulip.Optimizer)","category":"page"},{"location":"","page":"Home","title":"Home","text":"The variable fluxes will now contain a dictionary of the computed optimal flux of each reaction in the model:","category":"page"},{"location":"","page":"Home","title":"Home","text":"Dict{String,Float64} with 95 entries:\n  \"R_EX_fum_e\"    => 0.0\n  \"R_ACONTb\"      => 6.00725\n  \"R_TPI\"         => 7.47738\n  \"R_SUCOAS\"      => -5.06438\n  \"R_GLNS\"        => 0.223462\n  \"R_EX_pi_e\"     => -3.2149\n  \"R_PPC\"         => 2.50431\n  \"R_O2t\"         => 21.7995\n  \"R_G6PDH2r\"     => 4.95999\n  \"R_TALA\"        => 1.49698\n  ⋮               => ⋮","category":"page"},{"location":"#Basic-and-quick-start-tutorials","page":"Home","title":"Basic and quick-start tutorials","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"Detailed tutorial content is available here.","category":"page"},{"location":"","page":"Home","title":"Home","text":"Pages = joinpath.(\"tutorials\", filter(x -> endswith(x, \".md\"), readdir(\"tutorials\")))\nDepth = 1","category":"page"},{"location":"#Advanced-tutorials","page":"Home","title":"Advanced tutorials","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"Detailed listing of advanced tutorials is available here.","category":"page"},{"location":"","page":"Home","title":"Home","text":"Pages = joinpath.(\"advanced\", filter(x -> endswith(x, \".md\"), readdir(\"advanced\")))\nDepth = 1","category":"page"},{"location":"#Example-notebooks-and-workflows","page":"Home","title":"Example notebooks and workflows","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"Detailed notebook content is available here.","category":"page"},{"location":"","page":"Home","title":"Home","text":"Pages = joinpath.(\"notebooks\", filter(x -> endswith(x, \".md\"), readdir(\"notebooks\")))\nDepth = 1","category":"page"},{"location":"#Functions-reference","page":"Home","title":"Functions reference","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"Pages = [\"functions.md\"]","category":"page"},{"location":"#Contribution-guide","page":"Home","title":"Contribution guide","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"If you wish to contribute code, patches or improvements to COBREXA.jl, please read the basic contribution guidelines and hints..","category":"page"},{"location":"#Acknowledgements","page":"Home","title":"Acknowledgements","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"COBREXA.jl is developed at the Luxembourg Centre for Systems Biomedicine of the University of Luxembourg (uni.lu/lcsb), cooperating with the Institute for Quantitative and Theoretical Biology at the Heinrich Heine University in Düsseldorf (qtb.hhu.de).","category":"page"},{"location":"","page":"Home","title":"Home","text":"The development was supported by European Union's Horizon 2020 Programme under PerMedCoE project (permedcoe.eu) agreement no. 951773.","category":"page"},{"location":"","page":"Home","title":"Home","text":"<img src=\"https://lcsb-biocore.github.io/COBREXA.jl/stable/assets/cobrexa.svg\" alt=\"COBREXA logo\" height=\"64px\" style=\"height:64px; width:auto\">   <img src=\"https://lcsb-biocore.github.io/COBREXA.jl/stable/assets/unilu.svg\" alt=\"Uni.lu logo\" height=\"64px\" style=\"height:64px; width:auto\">   <img src=\"https://lcsb-biocore.github.io/COBREXA.jl/stable/assets/lcsb.svg\" alt=\"LCSB logo\" height=\"64px\" style=\"height:64px; width:auto\">   <img src=\"https://lcsb-biocore.github.io/COBREXA.jl/stable/assets/hhu.svg\" alt=\"HHU logo\" height=\"64px\" style=\"height:64px; width:auto\">   <img src=\"https://lcsb-biocore.github.io/COBREXA.jl/stable/assets/qtb.svg\" alt=\"QTB logo\" height=\"64px\" style=\"height:64px; width:auto\">   <img src=\"https://lcsb-biocore.github.io/COBREXA.jl/stable/assets/permedcoe.svg\" alt=\"PerMedCoE logo\" height=\"64px\" style=\"height:64px; width:auto\">","category":"page"},{"location":"notebooks/8_custom_model/","page":"Using a custom model data structure","title":"Using a custom model data structure","text":"EditURL = \"https://github.com/LCSB-BioCore/COBREXA.jl/blob/master/docs/src/notebooks/8_custom_model.jl\"","category":"page"},{"location":"notebooks/8_custom_model/#Using-a-custom-model-data-structure","page":"Using a custom model data structure","title":"Using a custom model data structure","text":"","category":"section"},{"location":"notebooks/8_custom_model/","page":"Using a custom model data structure","title":"Using a custom model data structure","text":"(Image: ) (Image: )","category":"page"},{"location":"notebooks/8_custom_model/","page":"Using a custom model data structure","title":"Using a custom model data structure","text":"This notebooks shows how to utilize the generic accessors and modification functions in COBREXA.jl to run the analysis on any custom model type. We will create a simple dictionary-style structure that describes the model, allow COBREXA to run a FVA on it, and create a simple reaction-removing modification.","category":"page"},{"location":"notebooks/8_custom_model/","page":"Using a custom model data structure","title":"Using a custom model data structure","text":"First, let's define a very simple stoichiometry-only structure for the model:","category":"page"},{"location":"notebooks/8_custom_model/","page":"Using a custom model data structure","title":"Using a custom model data structure","text":"using COBREXA\n\nmutable struct MyReaction\n    max_rate::Float64 # maximum absolute conversion rate\n    stoi::Dict{String,Float64} # stoichimetry of the reaction\n\n    MyReaction() = new(0.0, Dict{String,Float64}())\nend\n\nmutable struct MyModel <: MetabolicModel\n    optimization_target::String # the \"objective\" reaction name\n    reactions::Dict{String,MyReaction} # dictionary of reactions\n\n    MyModel() = new(\"\", Dict{String,MyReaction}())\n    MyModel(o, r) = new(o, r)\nend","category":"page"},{"location":"notebooks/8_custom_model/","page":"Using a custom model data structure","title":"Using a custom model data structure","text":"With this, we can start defining the accessors:","category":"page"},{"location":"notebooks/8_custom_model/","page":"Using a custom model data structure","title":"Using a custom model data structure","text":"COBREXA.n_reactions(m::MyModel) = length(m.reactions)\nCOBREXA.reactions(m::MyModel) = sort(collect(keys(m.reactions)))","category":"page"},{"location":"notebooks/8_custom_model/","page":"Using a custom model data structure","title":"Using a custom model data structure","text":"Metabolites are defined only very implicitly, so let's just make a function that collects all names. n_metabolites can be left at the default definition that just measures the output of metabolites.","category":"page"},{"location":"notebooks/8_custom_model/","page":"Using a custom model data structure","title":"Using a custom model data structure","text":"function COBREXA.metabolites(m::MyModel)\n    mets = Set{String}()\n    for (_, r) in m.reactions\n        for (m, _) in r.stoi\n            push!(mets, m)\n        end\n    end\n    return sort(collect(mets))\nend","category":"page"},{"location":"notebooks/8_custom_model/","page":"Using a custom model data structure","title":"Using a custom model data structure","text":"Now, the extraction of the linear model. Remember the order of element in the vectors must match the order in the output of reactions and metabolites.","category":"page"},{"location":"notebooks/8_custom_model/","page":"Using a custom model data structure","title":"Using a custom model data structure","text":"using SparseArrays\n\nfunction COBREXA.bounds(m::MyModel)\n    max_rates = [m.reactions[r].max_rate for r in reactions(m)]\n    (sparse(-max_rates), sparse(max_rates))\nend\n\nfunction COBREXA.objective(m::MyModel)\n    if m.optimization_target in keys(m.reactions)\n        c = spzeros(n_reactions(m))\n        c[first(indexin([m.optimization_target], reactions(m)))] = 1.0\n        c\n    else\n        throw(\n            DomainError(\n                m.optimization_target,\n                \"The target reaction for flux optimization not found\",\n            ),\n        )\n    end\nend\n\nfunction COBREXA.stoichiometry(m::MyModel)\n    sparse([\n        get(m.reactions[rxn].stoi, met, 0.0) for met in metabolites(m), rxn in reactions(m)\n    ])\nend","category":"page"},{"location":"notebooks/8_custom_model/","page":"Using a custom model data structure","title":"Using a custom model data structure","text":"Now the model is complete! We can generate a random one and see how it performs","category":"page"},{"location":"notebooks/8_custom_model/","page":"Using a custom model data structure","title":"Using a custom model data structure","text":"import Random\nRandom.seed!(123)\n\nrxn_names = [\"Reaction $i\" for i = 'A':'Z'];\nmetabolite_names = [\"Metabolite $i\" for i = 1:20];\n\nm = MyModel();\nfor i in rxn_names\n    m.reactions[i] = MyReaction()\nend\n\nfor i = 1:50\n    rxn = rand(rxn_names)\n    met = rand(metabolite_names)\n    m.reactions[rxn].stoi[met] = rand([-3, -2, -1, 1, 2, 3])\n    m.reactions[rxn].max_rate = rand()\nend","category":"page"},{"location":"notebooks/8_custom_model/","page":"Using a custom model data structure","title":"Using a custom model data structure","text":"Let's see what the model looks like now:","category":"page"},{"location":"notebooks/8_custom_model/","page":"Using a custom model data structure","title":"Using a custom model data structure","text":"m","category":"page"},{"location":"notebooks/8_custom_model/","page":"Using a custom model data structure","title":"Using a custom model data structure","text":"We can run most of the standard function on the model data right away:","category":"page"},{"location":"notebooks/8_custom_model/","page":"Using a custom model data structure","title":"Using a custom model data structure","text":"using Tulip\nm.optimization_target = \"Reaction A\"\nflux_balance_analysis_dict(m, Tulip.Optimizer)","category":"page"},{"location":"notebooks/8_custom_model/","page":"Using a custom model data structure","title":"Using a custom model data structure","text":"To be able to use the model conveniently in functions such as screen, you usually want to be able to easily specify the modifications. In this example, we enable use of with_removed_reactions by overloading the internal remove_reactions for this specific model type:","category":"page"},{"location":"notebooks/8_custom_model/","page":"Using a custom model data structure","title":"Using a custom model data structure","text":"We need to make an as-shallow-as-possible copy of the model that allows us to remove the reactions without breaking the original model.","category":"page"},{"location":"notebooks/8_custom_model/","page":"Using a custom model data structure","title":"Using a custom model data structure","text":"function COBREXA.remove_reactions(m::MyModel, rxns::AbstractVector{String})\n    m = MyModel(m.optimization_target, copy(m.reactions))\n    delete!.(Ref(m.reactions), rxns)\n    return m\nend","category":"page"},{"location":"notebooks/8_custom_model/","page":"Using a custom model data structure","title":"Using a custom model data structure","text":"The screening is ready now!","category":"page"},{"location":"notebooks/8_custom_model/","page":"Using a custom model data structure","title":"Using a custom model data structure","text":"reactions_to_remove = (\"Reaction $i\" for i = 'B':'Z')\n\nreactions_to_remove .=> screen_variants(\n    m,\n    [[with_removed_reactions([r])] for r in reactions_to_remove],\n    m -> flux_balance_analysis_dict(m, Tulip.Optimizer)[\"Reaction A\"],\n)","category":"page"},{"location":"notebooks/8_custom_model/","page":"Using a custom model data structure","title":"Using a custom model data structure","text":"","category":"page"},{"location":"notebooks/8_custom_model/","page":"Using a custom model data structure","title":"Using a custom model data structure","text":"This page was generated using Literate.jl.","category":"page"}]
+[{"location":"tutorials/1_loading/#Loading-and-converting-model-data","page":"Loading and converting model data","title":"Loading and converting model data","text":"","category":"section"},{"location":"tutorials/1_loading/","page":"Loading and converting model data","title":"Loading and converting model data","text":"COBREXA.jl supports several constraint-based model formats that can be loaded with built-in functions. You can load SBML models that are compatible with libsbml, JSON models (such as the ones from CobraPy), and MATLAB-style models (such as those from COBRA Toolbox).","category":"page"},{"location":"tutorials/1_loading/","page":"Loading and converting model data","title":"Loading and converting model data","text":"These formats are commonly available from many model repositories, such as from BIGG, as seen e.g. on the BIGG entry for the core E. Coli entry. Here, we show how to load the basic formats and work with such models.","category":"page"},{"location":"tutorials/1_loading/","page":"Loading and converting model data","title":"Loading and converting model data","text":"tip: Notebook available!\nExample code for this tutorial is available here.","category":"page"},{"location":"tutorials/1_loading/#Loading-models-from-files","page":"Loading and converting model data","title":"Loading models from files","text":"","category":"section"},{"location":"tutorials/1_loading/","page":"Loading and converting model data","title":"Loading and converting model data","text":"For most purposes, you should be able to open and load any model with load_model, which detects the file type from the extension (.xml, .json and .mat), and calls the appropriate loading function. After loading the COBREXA.jl library with using COBREXA and you may load the downloaded model data into Julia as follows:","category":"page"},{"location":"tutorials/1_loading/","page":"Loading and converting model data","title":"Loading and converting model data","text":"my_model = load_model(\"e_coli_core.xml\")","category":"page"},{"location":"tutorials/1_loading/","page":"Loading and converting model data","title":"Loading and converting model data","text":"You should see some information about the loaded model, possibly looking like this:","category":"page"},{"location":"tutorials/1_loading/","page":"Loading and converting model data","title":"Loading and converting model data","text":"Metabolic model of type JSONModel\n\n  [9 ,  1]  =  1.0\n  [51,  1]  =  1.0\n  ⋮\n  [57, 95]  =  1.0\n  [59, 95]  =  -1.0\nNumber of reactions: 95\nNumber of metabolites: 72","category":"page"},{"location":"tutorials/1_loading/","page":"Loading and converting model data","title":"Loading and converting model data","text":"If the file type can not be guessed from the file extension, use any of the specific loader functions:","category":"page"},{"location":"tutorials/1_loading/","page":"Loading and converting model data","title":"Loading and converting model data","text":"load_sbml_model for SBML\nload_json_model for JSON\nload_mat_model for MATLAB models","category":"page"},{"location":"tutorials/1_loading/","page":"Loading and converting model data","title":"Loading and converting model data","text":"All formats may store slightly different information. By default, COBREXA attempts not to discard any information unless a conversion to a more strict format is required. For example, the JSONModel (which is returned by load_json_model) still holds the original JSON structure that you can freely access for any specific purposes:","category":"page"},{"location":"tutorials/1_loading/","page":"Loading and converting model data","title":"Loading and converting model data","text":"jm = load_json_model(\"e_coli_core.json\")\njm.json[\"reactions\"][1]","category":"page"},{"location":"tutorials/1_loading/","page":"Loading and converting model data","title":"Loading and converting model data","text":"That should print out the first reaction in the model in a JSON-style scheme, in our case the process catalyzed by phosphofructokinase:","category":"page"},{"location":"tutorials/1_loading/","page":"Loading and converting model data","title":"Loading and converting model data","text":"Dict{String,Any} with 9 entries:\n  \"name\"               => \"Phosphofructokinase\"\n  \"metabolites\"        => Dict{String,Any}(\"adp_c\"=>1.0,\"atp_c\"=>-1.0,\"f6p_c\"=>…\n  \"lower_bound\"        => 0.0\n  \"id\"                 => \"PFK\"\n  \"notes\"              => Dict{String,Any}(\"original_bigg_ids\"=>Any[\"PFK\"])\n  \"gene_reaction_rule\" => \"b3916 or b1723\"\n  \"upper_bound\"        => 1000.0\n  \"subsystem\"          => \"Glycolysis/Gluconeogenesis\"\n  \"annotation\"         => Dict{String,Any}(\"ec-code\"=>Any[\"2.7.1.11\"],\"metanetx…","category":"page"},{"location":"tutorials/1_loading/","page":"Loading and converting model data","title":"Loading and converting model data","text":"MATModel and SBMLModel (returned by the respective loading functions) contain similar \"full\" model information – you can access the whole MATLAB and SBML data and build on them without any restrictions.","category":"page"},{"location":"tutorials/1_loading/#Converting-to-other-model-types","page":"Loading and converting model data","title":"Converting to other model types","text":"","category":"section"},{"location":"tutorials/1_loading/","page":"Loading and converting model data","title":"Loading and converting model data","text":"Despite JSON and SBML are great for storing and exchanging the models, the data representation is not very suitable for analyzing the model and processing it mathematically.","category":"page"},{"location":"tutorials/1_loading/","page":"Loading and converting model data","title":"Loading and converting model data","text":"COBREXA.jl contains several model types that are much better suited  for supporting the analysis tasks. You can use the following:","category":"page"},{"location":"tutorials/1_loading/","page":"Loading and converting model data","title":"Loading and converting model data","text":"CoreModel, which represents the \"core\" of the optimization problem and the corresponding linear programming problem – a sparse representation of the stoichiometric matrix, flux bounds vectors, objective vector, etc.\nStandardModel (a \"standard\" for COBREXA.jl), which represents a highly flexible, object-like, dictionary-based representation of a model that contains individual Reactions, Metabolites, Genes, and other things.","category":"page"},{"location":"tutorials/1_loading/","page":"Loading and converting model data","title":"Loading and converting model data","text":"note: Conversion limitations and possible data loss\nBecause of the specifics of the format of each model structure, the conversion is not always able to preserve all information from the source data. You may need to check if any complicated and less-standard annotations are still present. If you require them, and either use a more complicated model, or collect them manually.","category":"page"},{"location":"tutorials/1_loading/","page":"Loading and converting model data","title":"Loading and converting model data","text":"A loaded model can be converted to any other model type using the standard Julia conversion:","category":"page"},{"location":"tutorials/1_loading/","page":"Loading and converting model data","title":"Loading and converting model data","text":"cm = convert(CoreModel, jm)","category":"page"},{"location":"tutorials/1_loading/","page":"Loading and converting model data","title":"Loading and converting model data","text":"You can also use a shortcut in load_model to convert the model to the desired format in one command:","category":"page"},{"location":"tutorials/1_loading/","page":"Loading and converting model data","title":"Loading and converting model data","text":"cm = load_model(CoreModel, \"e_coli_core.xml\")","category":"page"},{"location":"tutorials/1_loading/","page":"Loading and converting model data","title":"Loading and converting model data","text":"With CoreModel, the information is easily accessible in matrix form. For example, cm.S now contains the sparse stoichiometric matrix, which you can convert to a dense matrix and manipulate it in Julia as any other matrix:","category":"page"},{"location":"tutorials/1_loading/","page":"Loading and converting model data","title":"Loading and converting model data","text":"Matrix(cm.S)","category":"page"},{"location":"tutorials/1_loading/","page":"Loading and converting model data","title":"Loading and converting model data","text":"...should show you the (relatively empty) stoichiometry of the model.","category":"page"},{"location":"tutorials/1_loading/","page":"Loading and converting model data","title":"Loading and converting model data","text":"StandardModel is more suitable for fine-grained access to individual items of the model, perhaps closer to the SBML-style models. For example, you can view and set reaction bounds as follows:","category":"page"},{"location":"tutorials/1_loading/","page":"Loading and converting model data","title":"Loading and converting model data","text":"sm = load_model(StandardModel, \"e_coli_core.json\")\nsm.reactions[\"PGI\"].ub","category":"page"},{"location":"tutorials/1_loading/","page":"Loading and converting model data","title":"Loading and converting model data","text":"...this prints the upper bound of the reaction (in this case, 1000.0); you can change it the usual way:","category":"page"},{"location":"tutorials/1_loading/","page":"Loading and converting model data","title":"Loading and converting model data","text":"sm.reactions[\"PGI\"].ub = 500","category":"page"},{"location":"tutorials/1_loading/","page":"Loading and converting model data","title":"Loading and converting model data","text":"This change will naturally project to future analysis results.","category":"page"},{"location":"tutorials/#COBREXA-Tutorials","page":"Quickstart tutorials","title":"COBREXA Tutorials","text":"","category":"section"},{"location":"tutorials/","page":"Quickstart tutorials","title":"Quickstart tutorials","text":"Pages = joinpath.(\"tutorials\", filter(x -> endswith(x, \".md\"), readdir(\"tutorials\")))\nDepth = 2","category":"page"},{"location":"advanced/2_custom_model/#Working-with-custom-models","page":"Working with custom models","title":"Working with custom models","text":"","category":"section"},{"location":"advanced/2_custom_model/","page":"Working with custom models","title":"Working with custom models","text":"It may happen that the intuitive representation of your data does not really match what is supported by a given COBRA package. COBREXA.jl attempts to avoid this problem by providing a flexible framework for containing any data structure that can, somehow, represent the constraint-based model.","category":"page"},{"location":"advanced/2_custom_model/","page":"Working with custom models","title":"Working with custom models","text":"The task of having such a polymorphic model definition can be split into 2 separate concerns:","category":"page"},{"location":"advanced/2_custom_model/","page":"Working with custom models","title":"Working with custom models","text":"How to allow the analysis functions to gather the required information from any user-specified model data structure?\nHow to make the reconstruction functions (i.e., reaction or gene deletions) work properly on any data structure?","category":"page"},{"location":"advanced/2_custom_model/","page":"Working with custom models","title":"Working with custom models","text":"To solve the first concern, COBREXA.jl specifies a set of generic accessors that work over the abstract type MetabolicModel. To use your data structure in a model, you just make it a subtype of MetabolicModel and overload the required accessors. The accessors are functions that extract some relevant information, such as stoichiometry and bounds, returning a fixed simple data type that can be further used by COBREXA.  You may see a complete list of accessors here.","category":"page"},{"location":"advanced/2_custom_model/","page":"Working with custom models","title":"Working with custom models","text":"A good solution to the second concern is a slightly more involved, as writing generic data modifiers is notoriously hard. Still, there is support for easily making small changes to the model using the modifications system, with functions such as with_added_reactions and with_changed_bound.","category":"page"},{"location":"advanced/2_custom_model/","page":"Working with custom models","title":"Working with custom models","text":"tip: Notebook available\nA better example of using a custom model structure is available in a separate notebook.","category":"page"},{"location":"advanced/2_custom_model/#Writing-the-generic-accessors","page":"Working with custom models","title":"Writing the generic accessors","text":"","category":"section"},{"location":"advanced/2_custom_model/","page":"Working with custom models","title":"Working with custom models","text":"Let's write a data structure that represents a very small model that contains N metabolites that are converted in a circle through N linear, coupled reactions. (E.g., for N=3, we would have a conversion of metabolites A, B and C ordered as A → B → C → A.) This may be useful for testing purposes; we will use it for a simple demonstration.","category":"page"},{"location":"advanced/2_custom_model/","page":"Working with custom models","title":"Working with custom models","text":"The whole model can thus be specified with a single integer N that represents the length of the reaction cycle:","category":"page"},{"location":"advanced/2_custom_model/","page":"Working with custom models","title":"Working with custom models","text":"struct CircularModel <: MetabolicModel\n    size::Int\nend","category":"page"},{"location":"advanced/2_custom_model/","page":"Working with custom models","title":"Working with custom models","text":"First, define the reactions and metabolites:","category":"page"},{"location":"advanced/2_custom_model/","page":"Working with custom models","title":"Working with custom models","text":"COBREXA.n_reactions(m::CircularModel) = m.size\nCOBREXA.n_metabolites(m::CircularModel) = m.size\n\nCOBREXA.reactions(m::CircularModel) = [\"rxn$i\" for i in 1:n_reactions(m)]\nCOBREXA.metabolites(m::CircularModel) = [\"met$i\" for i in 1:n_metabolites(m)]","category":"page"},{"location":"advanced/2_custom_model/","page":"Working with custom models","title":"Working with custom models","text":"It is useful to re-use the already defined functions, as that improves the code maintainability.","category":"page"},{"location":"advanced/2_custom_model/","page":"Working with custom models","title":"Working with custom models","text":"We can continue with the actual linear model properties:","category":"page"},{"location":"advanced/2_custom_model/","page":"Working with custom models","title":"Working with custom models","text":"function COBREXA.objective(m::CircularModel)\n    c = spzeros(n_reactions(m))\n    c[1] = 1 #optimize the first reaction\n    return c\nend\n\nCOBREXA.bounds(m::CircularModel) = (\n    spzeros(n_reactions(m)), # lower bounds\n    sparse(ones(n_reactions(m))), # upper bounds\n)\n\nfunction COBREXA.stoichiometry(m::CircularModel)\n    nr = n_reactions(m)\n    stoi(i,j) =\n        i == j ? 1.0 :\n        (i % nr + 1) == j  ? -1.0 :\n        0.0\n\n    sparse([stoi(i,j) for i in 1:nr, j in 1:nr])\nend","category":"page"},{"location":"advanced/2_custom_model/","page":"Working with custom models","title":"Working with custom models","text":"You may check that the result now works just as with CoreModel and StandardModel:","category":"page"},{"location":"advanced/2_custom_model/","page":"Working with custom models","title":"Working with custom models","text":"julia> m = CircularModel(5)\nMetabolic model of type CircularModel\n\n  1.0  -1.0    ⋅     ⋅     ⋅\n   ⋅    1.0  -1.0    ⋅     ⋅\n   ⋅     ⋅    1.0  -1.0    ⋅\n   ⋅     ⋅     ⋅    1.0  -1.0\n -1.0    ⋅     ⋅     ⋅    1.0\nNumber of reactions: 5\nNumber of metabolites: 5\n","category":"page"},{"location":"advanced/2_custom_model/","page":"Working with custom models","title":"Working with custom models","text":"This interface is sufficient to run most of the basic analyses, especially the flux balance finding ones:","category":"page"},{"location":"advanced/2_custom_model/","page":"Working with custom models","title":"Working with custom models","text":"julia> flux_balance_analysis_dict(m, Tulip.Optimizer)\nDict{String, Float64} with 5 entries:\n  \"rxn5\" => 1.0\n  \"rxn2\" => 1.0\n  \"rxn1\" => 1.0\n  \"rxn3\" => 1.0\n  \"rxn4\" => 1.0\n","category":"page"},{"location":"advanced/2_custom_model/#Writing-generic-model-modifications","page":"Working with custom models","title":"Writing generic model modifications","text":"","category":"section"},{"location":"advanced/2_custom_model/","page":"Working with custom models","title":"Working with custom models","text":"The custom model structure can also be made compatible with many of the existing variant-generating functions and analysis modifiers.","category":"page"},{"location":"advanced/2_custom_model/","page":"Working with custom models","title":"Working with custom models","text":"The functions prepared for use as \"variants\" in screen, usually prefixed by with_, have their generic variants that only call simpler, overloadable functions for each specific model. This choice is based on the overloading dispatch system of Julia. For example,with_removed_metabolites is implemented very generically by reducing the problem to some specific remove_metabolites functions selected by the dispatch, as follows:","category":"page"},{"location":"advanced/2_custom_model/","page":"Working with custom models","title":"Working with custom models","text":"with_removed_metabolites(args...; kwargs...) =\n    m -> remove_metabolites(m, args...; kwargs...)","category":"page"},{"location":"advanced/2_custom_model/","page":"Working with custom models","title":"Working with custom models","text":"To be able to use with_removed_metabolites in your model, we can just overload the actual inner function. For the simple circular model, the modification might as well look like this:","category":"page"},{"location":"advanced/2_custom_model/","page":"Working with custom models","title":"Working with custom models","text":"COBREXA.remove_metabolites(m::CircularModel, n::Int) =\n    return CircularModel(m.size - n)","category":"page"},{"location":"advanced/2_custom_model/","page":"Working with custom models","title":"Working with custom models","text":"danger: Functions that generate model variants must be pure\nNotice that the function is \"pure\", i.e., does not make any in-place modifications to the original model structure. That property is required for screen and other functions to properly and predictably apply the modifications to the model. To expose potential in-place modifications to your codebase, you should instead overload the \"bang\" counterpart of remove metabolites, called remove_metabolites!.","category":"page"},{"location":"tutorials/2_analysis/#Basic-analysis-of-constraint-based-models","page":"Basic analysis of constraint-based models","title":"Basic analysis of constraint-based models","text":"","category":"section"},{"location":"tutorials/2_analysis/","page":"Basic analysis of constraint-based models","title":"Basic analysis of constraint-based models","text":"COBREXA.jl supports several common analysis methods that are often used for exploring the biological models. The currently supported methods include","category":"page"},{"location":"tutorials/2_analysis/","page":"Basic analysis of constraint-based models","title":"Basic analysis of constraint-based models","text":"Flux balance analysis (FBA), in function flux_balance_analysis\nFlux variability analysis (FVA), in flux_variability_analysis\nFlux sampling by linearized hit-and-run algorithm, in affine_hit_and_run\nParsimonious flux balance analysis (pFBA), in parsimonious_flux_balance_analysis","category":"page"},{"location":"tutorials/2_analysis/","page":"Basic analysis of constraint-based models","title":"Basic analysis of constraint-based models","text":"Other analysis methods are either in development and testing, or may be specified or customized by the user. Implementing new analyses is generally feasible; you may want to watch the COBREXA.jl repository for newly incoming analysis methods.","category":"page"},{"location":"tutorials/2_analysis/","page":"Basic analysis of constraint-based models","title":"Basic analysis of constraint-based models","text":"COBREXA.jl additionally exports several helper functions that may help you in running custom analysis methods:","category":"page"},{"location":"tutorials/2_analysis/","page":"Basic analysis of constraint-based models","title":"Basic analysis of constraint-based models","text":"you can convert all types of MetabolicModels to JuMP.jl models using make_optimization_model, then you may explore and analyze the models independently of COBREXA.jl using the tools provided by JuMP.jl\nthere is a system of analysis modifications that allows you to easily specify various adjustments to the existing analysis methods","category":"page"},{"location":"tutorials/2_analysis/","page":"Basic analysis of constraint-based models","title":"Basic analysis of constraint-based models","text":"tip: Notebook available!\nExamples of running the analysis functions are available here.","category":"page"},{"location":"tutorials/2_analysis/#Optimization-problem-solvers","page":"Basic analysis of constraint-based models","title":"Optimization problem solvers","text":"","category":"section"},{"location":"tutorials/2_analysis/","page":"Basic analysis of constraint-based models","title":"Basic analysis of constraint-based models","text":"For solving most analysis tasks, you need an optimization problem solver that is compatible with JuMP.jl. You may refer to the official list of supported solvers, but we generally recommend to use either of these:","category":"page"},{"location":"tutorials/2_analysis/","page":"Basic analysis of constraint-based models","title":"Basic analysis of constraint-based models","text":"Tulip (pure Julia implementation) for linear problems\nGLPK (based on a C library) for linear and mixed-integer problems\nGurobi (based on an external library, but requires a license that is free for academic use) for linear, mixed-integer and quadratic problems","category":"page"},{"location":"tutorials/2_analysis/","page":"Basic analysis of constraint-based models","title":"Basic analysis of constraint-based models","text":"All solvers can be installed using the Julia package manger.","category":"page"},{"location":"tutorials/2_analysis/#Flux-balance-analysis","page":"Basic analysis of constraint-based models","title":"Flux balance analysis","text":"","category":"section"},{"location":"tutorials/2_analysis/","page":"Basic analysis of constraint-based models","title":"Basic analysis of constraint-based models","text":"The above methods generally accept 2 arguments: the model, and the optimizer.","category":"page"},{"location":"tutorials/2_analysis/","page":"Basic analysis of constraint-based models","title":"Basic analysis of constraint-based models","text":"In particular, having installed e.g. GLPK from the above optimizers, you can run FBA on your favorite E. Coli core model as follows:","category":"page"},{"location":"tutorials/2_analysis/","page":"Basic analysis of constraint-based models","title":"Basic analysis of constraint-based models","text":"using COBREXA\nm = load_model(CoreModel, \"e_coli_core.xml\")\n\nusing GLPK\nopt_model = flux_balance_analysis(m, GLPK.Optimizer)","category":"page"},{"location":"tutorials/2_analysis/","page":"Basic analysis of constraint-based models","title":"Basic analysis of constraint-based models","text":"After a short while (the solver machinery usually needs to get precompiled before the first use), you should get opt_model, which is now an optimized JuMP.jl model. It may print out information like this:","category":"page"},{"location":"tutorials/2_analysis/","page":"Basic analysis of constraint-based models","title":"Basic analysis of constraint-based models","text":"A JuMP Model\nMaximization problem with:\nVariables: 95\nObjective function type: JuMP.GenericAffExpr{Float64,JuMP.VariableRef}\n`JuMP.GenericAffExpr{Float64,JuMP.VariableRef}`-in-`MathOptInterface.EqualTo{Float64}`: 73 constraints\n`JuMP.GenericAffExpr{Float64,JuMP.VariableRef}`-in-`MathOptInterface.LessThan{Float64}`: 192 constraints\nModel mode: AUTOMATIC\nCachingOptimizer state: ATTACHED_OPTIMIZER\nSolver name: GLPK\nNames registered in the model: lbs, mb, ubs, x","category":"page"},{"location":"tutorials/2_analysis/","page":"Basic analysis of constraint-based models","title":"Basic analysis of constraint-based models","text":"From that, you can extract the required information with the JuMP interface, loaded with using JuMP. With that,","category":"page"},{"location":"tutorials/2_analysis/","page":"Basic analysis of constraint-based models","title":"Basic analysis of constraint-based models","text":"objective_value(opt_model) prints roughly 0.87,\nvalue.(opt_model[:x]) prints the vector of individual reaction fluxes.","category":"page"},{"location":"tutorials/2_analysis/","page":"Basic analysis of constraint-based models","title":"Basic analysis of constraint-based models","text":"For convenience, you can get the results nicely formatted without manually getting them out of the optimized models:","category":"page"},{"location":"tutorials/2_analysis/","page":"Basic analysis of constraint-based models","title":"Basic analysis of constraint-based models","text":"flux_balance_analysis_vec works like flux_balance_analysis, but returns the vector of fluxes directly (in the same order as in reactions(m))\nflux_balance_analysis_dict returns a dictionary with the fluxes, keyed by reaction identifier","category":"page"},{"location":"tutorials/2_analysis/#Flux-variability-analysis","page":"Basic analysis of constraint-based models","title":"Flux variability analysis","text":"","category":"section"},{"location":"tutorials/2_analysis/","page":"Basic analysis of constraint-based models","title":"Basic analysis of constraint-based models","text":"FVA is implemented in flux_variability_analysis, which returns the usual matrix of minimal and maximal feasible fluxes for each reaction in the model.","category":"page"},{"location":"tutorials/2_analysis/","page":"Basic analysis of constraint-based models","title":"Basic analysis of constraint-based models","text":"The result of calling flux_variability_analysis(m, GLPK.Optimizer) may look like this (possibly showing minor numeric errors in the GLPK optimizer):","category":"page"},{"location":"tutorials/2_analysis/","page":"Basic analysis of constraint-based models","title":"Basic analysis of constraint-based models","text":"95×2 Array{Float64,2}:\n   0.0            0.0\n   6.00725        6.00725\n   ⋮\n   3.64414e-13    3.17348e-13\n   3.2149         3.2149","category":"page"},{"location":"tutorials/2_analysis/","page":"Basic analysis of constraint-based models","title":"Basic analysis of constraint-based models","text":"You can relax the optimality requirement of the reactions by specifying a wider objective bound, getting a wider range of reaction fluxes, e.g. using gamma_bounds (for COBRA-like γ-bound) and objective_bounds (for a multiplicative bound around the original optimal objective).","category":"page"},{"location":"tutorials/2_analysis/","page":"Basic analysis of constraint-based models","title":"Basic analysis of constraint-based models","text":"As a result, flux_variability_analysis(m, GLPK.Optimizer; bounds=gamma_bounds(0.8)) will return a much less constrained system:","category":"page"},{"location":"tutorials/2_analysis/","page":"Basic analysis of constraint-based models","title":"Basic analysis of constraint-based models","text":"95×2 Array{Float64,2}:\n   0.0            0.0\n   0.754299      10.1285\n   ⋮\n  -4.42865        0.0\n   2.57192        3.2149","category":"page"},{"location":"tutorials/2_analysis/","page":"Basic analysis of constraint-based models","title":"Basic analysis of constraint-based models","text":"You may additionally restrict the analysis to a list of reactions (passing the list as the second argument, see documentation of flux_variability_analysis), or retrieve a dictionary of the resulting fluxes with flux_variability_analysis_dict.","category":"page"},{"location":"tutorials/2_analysis/#Parsimonious-flux-balance-analysis","page":"Basic analysis of constraint-based models","title":"Parsimonious flux balance analysis","text":"","category":"section"},{"location":"tutorials/2_analysis/","page":"Basic analysis of constraint-based models","title":"Basic analysis of constraint-based models","text":"Parsimonious flux balance analysis (pFBA) requires a solver that can handle quadratic problems. Some examples include, e.g. OSQP, Gurobi, Mosek, etc.","category":"page"},{"location":"tutorials/2_analysis/","page":"Basic analysis of constraint-based models","title":"Basic analysis of constraint-based models","text":"Otherwise, the function behaves just like flux_balance_analysis:","category":"page"},{"location":"tutorials/2_analysis/","page":"Basic analysis of constraint-based models","title":"Basic analysis of constraint-based models","text":"parsimonious_flux_balance_analysis(m, OSQP.Optimizer) will return a JuMP.jl model optimized to a slightly more realistic (parsimonious) optimum than plain FBA,\nparsimonious_flux_balance_analysis_vec will return the fluxes in a vector,\nparsimonious_flux_balance_analysis_dict will return a reaction-keyed dictionary.","category":"page"},{"location":"tutorials/2_analysis/#Flux-sampling","page":"Basic analysis of constraint-based models","title":"Flux sampling","text":"","category":"section"},{"location":"tutorials/2_analysis/","page":"Basic analysis of constraint-based models","title":"Basic analysis of constraint-based models","text":"For the affine_hit_and_run, you need a previously optimized and constrained model from another analysis function, such as flux_balance_analysis, or created by make_optimization_model. You may need to carefully choose the number of iterations and sample sizes to match your model; see the documentation of affine_hit_and_run for details.","category":"page"},{"location":"tutorials/2_analysis/","page":"Basic analysis of constraint-based models","title":"Basic analysis of constraint-based models","text":"As an example, you can run the sampling for 100 thousand iterations with:","category":"page"},{"location":"tutorials/2_analysis/","page":"Basic analysis of constraint-based models","title":"Basic analysis of constraint-based models","text":"affine_hit_and_run(100_000, make_optimization_model(m, GLPK.Optimizer))","category":"page"},{"location":"tutorials/2_analysis/","page":"Basic analysis of constraint-based models","title":"Basic analysis of constraint-based models","text":"You should receive a matching flux sample with the (default) 1000 samples in a matrix that may look like this one:","category":"page"},{"location":"tutorials/2_analysis/","page":"Basic analysis of constraint-based models","title":"Basic analysis of constraint-based models","text":"95×1000 Array{Float64,2}:\n   0.0           0.0         …   0.0\n   7.82669       9.38895         3.30653\n   7.13016       4.36813         9.64434\n  -0.290925     -9.3037         -0.0908829\n  24.1294       17.4794          0.0511032\n   ⋮                         ⋱\n -16.243       -37.4763         -5.57301\n   0.0           0.0             0.0\n  -0.310819     -1.20057e-7     -2.13126\n   5.71597e-5    0.00990677      0.692399","category":"page"},{"location":"notebooks/#Notebooks-and-example-workflows","page":"Examples and notebooks","title":"Notebooks and example workflows","text":"","category":"section"},{"location":"notebooks/","page":"Examples and notebooks","title":"Examples and notebooks","text":"Pages = joinpath.(\"notebooks\", filter(x -> endswith(x, \".md\"), readdir(\"notebooks\")))\nDepth = 2","category":"page"},{"location":"notebooks/5_basic_stdmodel_construction/","page":"Model construction and modification","title":"Model construction and modification","text":"EditURL = \"https://github.com/LCSB-BioCore/COBREXA.jl/blob/master/docs/src/notebooks/5_basic_stdmodel_construction.jl\"","category":"page"},{"location":"notebooks/5_basic_stdmodel_construction/#Model-construction-and-modification","page":"Model construction and modification","title":"Model construction and modification","text":"","category":"section"},{"location":"notebooks/5_basic_stdmodel_construction/","page":"Model construction and modification","title":"Model construction and modification","text":"(Image: ) (Image: )","category":"page"},{"location":"notebooks/5_basic_stdmodel_construction/","page":"Model construction and modification","title":"Model construction and modification","text":"COBREXA can load models stored in .mat, .json, and .xml formats; and convert these into StandardModels. However, it is also possible to construct models from scratch, and modify existing models. This will be demonstrated here.","category":"page"},{"location":"notebooks/5_basic_stdmodel_construction/#Model-construction","page":"Model construction and modification","title":"Model construction","text":"","category":"section"},{"location":"notebooks/5_basic_stdmodel_construction/","page":"Model construction and modification","title":"Model construction and modification","text":"In COBREXA, model construction is primarily supported through StandardModels. To begin, create an empty StandardModel.","category":"page"},{"location":"notebooks/5_basic_stdmodel_construction/","page":"Model construction and modification","title":"Model construction and modification","text":"using COBREXA\n\nmodel = StandardModel(\"FirstModel\") # assign model id = \"FirstModel\"","category":"page"},{"location":"notebooks/5_basic_stdmodel_construction/","page":"Model construction and modification","title":"Model construction and modification","text":"Next, genes, metabolites and reactions need to be added to the model.","category":"page"},{"location":"notebooks/5_basic_stdmodel_construction/#Add-genes-to-the-model","page":"Model construction and modification","title":"Add genes to the model","text":"","category":"section"},{"location":"notebooks/5_basic_stdmodel_construction/","page":"Model construction and modification","title":"Model construction and modification","text":"gene_list = [Gene(string(\"g\", num)) for num = 1:8]","category":"page"},{"location":"notebooks/5_basic_stdmodel_construction/","page":"Model construction and modification","title":"Model construction and modification","text":"warning: Warning: Don't accidentally overwrite the generic accessors\nIt may be tempting to call a variable genes, metabolites, or   reactions. However, these names conflict with generic accessors   functions and will create problems downstream.","category":"page"},{"location":"notebooks/5_basic_stdmodel_construction/","page":"Model construction and modification","title":"Model construction and modification","text":"add_genes!(model, gene_list)","category":"page"},{"location":"notebooks/5_basic_stdmodel_construction/#Add-metabolites-to-the-model","page":"Model construction and modification","title":"Add metabolites to the model","text":"","category":"section"},{"location":"notebooks/5_basic_stdmodel_construction/","page":"Model construction and modification","title":"Model construction and modification","text":"metabolite_list = [Metabolite(string(\"m\", num)) for num = 1:4]\n\nmetabolite_list[1].formula = \"C6H12O6\" # can edit metabolites, etc. directly\n\nadd_metabolites!(model, metabolite_list)","category":"page"},{"location":"notebooks/5_basic_stdmodel_construction/#Add-reactions-to-the-model","page":"Model construction and modification","title":"Add reactions to the model","text":"","category":"section"},{"location":"notebooks/5_basic_stdmodel_construction/","page":"Model construction and modification","title":"Model construction and modification","text":"There are two ways to create and add reactions to a model. These are using functions, or macros.","category":"page"},{"location":"notebooks/5_basic_stdmodel_construction/","page":"Model construction and modification","title":"Model construction and modification","text":"r_m1 = Reaction(\"EX_m1\", Dict(\"m1\" => -1.0), :bidirectional) # exchange reaction: m1 <-> (is the same as m1 ↔ nothing)\nr1 = Reaction(\"r1\", Dict(\"m1\" => -1.0, \"m2\" => 1.0), :forward)\nr1.grr = [[\"g1\", \"g2\"], [\"g3\"]] # add some gene reaction rules\nr2 = Reaction(\"r2\", Dict(\"m2\" => -1.0, \"m1\" => 1.0), :backward)\nr3 = Reaction(\"r3\", Dict(\"m2\" => -1.0, \"m3\" => 1.0), :bidirectional)\n\nadd_reactions!(model, [r1, r2, r3, r_m1]) # function approach\n\nm1 = metabolite_list[1]\nm2 = metabolite_list[2]\nm3 = metabolite_list[3]\nm4 = metabolite_list[4]\n\n@add_reactions! model begin # macro approach\n    \"r4\", m2 → m4, 0, 1000\n    \"r_m3\", m3 ↔ nothing, -1000, 1000\n    \"r_m4\", m4 → nothing\n    \"r5\", m4 → m2\nend\n\nmodel.reactions[\"r4\"].grr = [[\"g5\"], [\"g6\", \"g7\"], [\"g8\"]]","category":"page"},{"location":"notebooks/5_basic_stdmodel_construction/","page":"Model construction and modification","title":"Model construction and modification","text":"note: Note: Writing unicode arrows\nThe reaction arrows can be easily written by using the LaTeX completions built into Julia shell (and many Julia-compatible editors). You can type:→ as \\rightarrow (press Tab to complete)\n← as \\leftarrow\n↔ as \\leftrightarrow","category":"page"},{"location":"notebooks/5_basic_stdmodel_construction/","page":"Model construction and modification","title":"Model construction and modification","text":"The constructed model can now be inspected.","category":"page"},{"location":"notebooks/5_basic_stdmodel_construction/","page":"Model construction and modification","title":"Model construction and modification","text":"model","category":"page"},{"location":"notebooks/5_basic_stdmodel_construction/#Modifying-existing-models","page":"Model construction and modification","title":"Modifying existing models","text":"","category":"section"},{"location":"notebooks/5_basic_stdmodel_construction/","page":"Model construction and modification","title":"Model construction and modification","text":"It is also possible to modify a model by deleting certain genes. This is simply achieved by calling remove_genes!.","category":"page"},{"location":"notebooks/5_basic_stdmodel_construction/","page":"Model construction and modification","title":"Model construction and modification","text":"remove_genes!(model, [\"g1\", \"g2\"]; knockout_reactions = false)\nmodel","category":"page"},{"location":"notebooks/5_basic_stdmodel_construction/","page":"Model construction and modification","title":"Model construction and modification","text":"","category":"page"},{"location":"notebooks/5_basic_stdmodel_construction/","page":"Model construction and modification","title":"Model construction and modification","text":"This page was generated using Literate.jl.","category":"page"},{"location":"advanced/1_variants/#Exploring-many-model-variants","page":"Exploring many model variants","title":"Exploring many model variants","text":"","category":"section"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"A major goal of COBREXA.jl is to make exploring of many model variants easy and fast.","category":"page"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"One main concept that can be utilized for doing that is implemented in the function screen, which takes your model, a list of model variants that you want to explore by some specified analysis, and schedules the analysis of the model variants parallely on the available distributed workers.","category":"page"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"In its most basic form, the \"screening\" may use the slightly simplified variant of screen that is called screen_variants, which works as follows:","category":"page"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"m = load_model(StandardModel, \"e_coli_core.json\")\n\nscreen_variants(\n    m,    # the model for screening\n    [\n        [],    # a variant with no modifications\n        [with_changed_bound(\"CO2t\", lb = 0, ub = 0)],  # disable CO2 transport\n        [with_changed_bound(\"O2t\", lb = 0, ub = 0)],  # disable O2 transport\n        [with_changed_bound(\"CO2t\", lb = 0, ub = 0), with_changed_bound(\"O2t\", lb = 0, ub = 0)],  # disable both transports\n    ],\n    m -> flux_balance_analysis_dict(m, Tulip.Optimizer)[\"BIOMASS_Ecoli_core_w_GAM\"],\n)","category":"page"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"The call specifies a model (the m that we have loaded) that is being tested, then a vector of model variants to be created and tested, and then the analysis that is being run on each variant – in this case, we find an optimal steady state of each of the variants, and check out the biomass production rate at that state. In this particular case, we are checking what will be the effect of disabling combinations of CO2 transport and O2 transport in the cells. For that, we get the following result:","category":"page"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"4-element Vector{Float64}:\n 0.8739215022678488\n 0.46166961413944896\n 0.21166294973372135\n 0.21114065173865518","category":"page"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"The numbers are the biomass production rates for the specified variants. We can see that disabling O2 transport really does not help the organism much.","category":"page"},{"location":"advanced/1_variants/#Variant-specification","page":"Exploring many model variants","title":"Variant specification","text":"","category":"section"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"In the above example, we have specified 4 variants, thus the analysis returned 4 different results that correspond with the specifications. Let us have a look at the precise format of the specification and result.","category":"page"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"Importantly, the variants argument is of type Array{Vector{Any}}, meaning that it can be an array of any dimensionality that contains vectors. Each of the vectors specifies precisely one variant, possibly with more modifications applied to the model in sequence.","category":"page"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"For example:","category":"page"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"[] specifies no modifications at all\n[with_changed_bound(\"CO2t\", lb=0, ub=10)] limits the CO2 transport\n[with_changed_bound(\"CO2t\", lb=0, ub=2), with_changed_bound(\"O2t\", lb=0, ub=100)] severely limits the CO2 transport and slightly restricts the transport of O2","category":"page"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"note: Variants are single-parameter model-transforming functions\nBecause the variants are just generators of single parameter functions that take the model and return its modified version, you can also use identity to specify a variant that does nothing – [identity] is perfectly same as []","category":"page"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"The shape of the variants array is important too, because it is precisely retained in the result (just as with pmap). If you pass in a matrix of variants, you will receive a matrix of analysis results of the same size. That can be exploited for easily exploring many combinations of possible model properties. Let's try exploring a \"cube\" of possible restricted reactions:","category":"page"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"using IterTools # for cartesian products\n\nres = screen_variants(m,\n    [\n        # for each variant we restricts 2 reactions\n        [with_changed_bound(r1, lb=-3, ub=3), with_changed_bound(r2, lb=-1, ub=1)]\n\n        # the reaction pair will be chosen from a cartesian product\n        for (r1,r2) in product(\n            [\"H2Ot\", \"CO2t\", \"O2t\", \"NH4t\"], # of this set of transport reactions\n            [\"EX_h2o_e\", \"EX_co2_e\", \"EX_o2_e\", \"EX_nh4_e\"], # and this set of exchanges\n        )\n    ],\n    m -> flux_balance_analysis_dict(m, Tulip.Optimizer)[\"BIOMASS_Ecoli_core_w_GAM\"],\n)","category":"page"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"As a result, we will receive a full matrix of the biomass productions:","category":"page"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"4×4 Matrix{Float64}:\n 0.407666  0.454097  0.240106  0.183392\n 0.407666  0.485204  0.24766   0.183392\n 0.314923  0.319654  0.24766   0.183392\n 0.407666  0.485204  0.24766   0.183392","category":"page"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"Notably, this shows that O2 transport and NH4 exchange may be serious bottlenecks for biomass production.","category":"page"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"For clarity, you may always annotate the result by zipping it with the specification structure you have used and collecting the data:","category":"page"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"collect(zip(\n    product(\n        [\"H2Ot\", \"CO2t\", \"O2t\", \"NH4t\"],\n        [\"EX_h2o_e\", \"EX_co2_e\", \"EX_o2_e\", \"EX_nh4_e\"],\n    ),\n    res,\n))","category":"page"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"...which gives the following annotated result:","category":"page"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"4×4 Matrix{Tuple{Tuple{String, String}, Float64}}:\n ((\"H2Ot\", \"EX_h2o_e\"), 0.407666)  ((\"H2Ot\", \"EX_co2_e\"), 0.454097)  ((\"H2Ot\", \"EX_o2_e\"), 0.240106)  ((\"H2Ot\", \"EX_nh4_e\"), 0.183392)\n ((\"CO2t\", \"EX_h2o_e\"), 0.407666)  ((\"CO2t\", \"EX_co2_e\"), 0.485204)  ((\"CO2t\", \"EX_o2_e\"), 0.24766)   ((\"CO2t\", \"EX_nh4_e\"), 0.183392)\n ((\"O2t\", \"EX_h2o_e\"), 0.314923)   ((\"O2t\", \"EX_co2_e\"), 0.319654)   ((\"O2t\", \"EX_o2_e\"), 0.24766)    ((\"O2t\", \"EX_nh4_e\"), 0.183392)\n ((\"NH4t\", \"EX_h2o_e\"), 0.407666)  ((\"NH4t\", \"EX_co2_e\"), 0.485204)  ((\"NH4t\", \"EX_o2_e\"), 0.24766)   ((\"NH4t\", \"EX_nh4_e\"), 0.183392)","category":"page"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"This may be easily used for e.g. scrutinizing all possible reaction pairs, to find the ones that are redundant and not.","category":"page"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"tip: Notebook available\nA notebook is available that demonstrates the screening on a larger scale.","category":"page"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"There are many other variant \"specifications\" to choose from. You may use with_added_reactions, with_removed_reactions, with_removed_metabolites, and others. Function reference contains a complete list; as a convention, names of the specifications all start with with_.","category":"page"},{"location":"advanced/1_variants/#Writing-custom-variant-functions","page":"Exploring many model variants","title":"Writing custom variant functions","text":"","category":"section"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"It is actually very easy to create custom specifications that do any modification that you can implement, to be later used with screen_variants and screen.","category":"page"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"Generally, the \"specifications\" are supposed to return a function that creates a modified copy of the model. The copy of the model may be shallow, but the functions should always prevent modifying the original model structure – screen is keeping a single copy of the original model at each worker to prevent unnecessary bulk data transport, and if that is changed in-place, all following analyses of the model will work on inconsistent data, usually returning wrong results (even randomly changing ones, because of the asynchronous nature of screen execution).","category":"page"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"Despite of that, writing a modification is easy. The simplest modification that \"does nothing\" (isomorphic to standard identity) can be formatted as follows:","category":"page"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"with_no_change = model -> model","category":"page"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"The modifications may change the model, provided it is copied properly. The following modification will remove a reaction called \"O2t\", effectively removing the possibility to transport oxygen. We require a specific type of model where this change is easy to perform (generally, not all variants may be feasible on all model types).","category":"page"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"with_disabled_oxygen_transport = (model::StandardModel) -> begin\n\n    # make \"as shallow as possible\" copy of the `model`.\n    # Utilizing `deepcopy` is also possible, but inefficient.\n    new_model = copy(model)\n    new_model.reactions = copy(model.reactions)\n\n    # remove the O2 transport from the model copy\n    delete!(new_model.reactions, \"O2t\")\n\n    return new_model #return the newly created variant\nend","category":"page"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"Finally, the whole definition may be parametrized as a normal function. The following variant removes any user-selected reaction:","category":"page"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"with_disabled_reaction(reaction_id) = (model::StandardModel) -> begin\n    new_model = copy(model)\n    new_model.reactions = copy(model.reactions)\n    delete!(new_model.reactions, reaction_id) # use the parameter from the specification\n    return new_model\nend","category":"page"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"In turn, these variants can be used in screen_variants just as we used with_changed_bound above:","category":"page"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"screen_variants(\n    m,    # the model for screening\n    [\n        [with_no_change],\n        [with_disabled_oxygen_transport],\n        [with_disabled_reaction(\"NH4t\")],\n    ],\n    m -> flux_balance_analysis_dict(m, Tulip.Optimizer)[\"BIOMASS_Ecoli_core_w_GAM\"],\n)","category":"page"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"That should get you the results for all new variants of the model:","category":"page"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"3-element Vector{Float64}:\n 0.8739215022674809\n 0.21166294865468896\n 1.2907224478973395e-15","category":"page"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"warning: Custom variants with distributed processing\nIf using distributed evaluation, remember the variant-generating functions need to be defined on all used workers (generating the variants in parallel on the workers allows COBREXA to run the screening process very efficiently, without unnecessary sending of bulk model data). Prefixing the definition with @everywhere is usually sufficient for that purpose.","category":"page"},{"location":"advanced/1_variants/#Passing-extra-arguments-to-the-analysis-function","page":"Exploring many model variants","title":"Passing extra arguments to the analysis function","text":"","category":"section"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"Some analysis functions may take additional arguments, which you might want to vary for the analysis. modifications argument of flux_balance_analysis_dict is one example of such argument, allowing you to specify details of the optimization procedure.","category":"page"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"screen function allows you to do precisely that – apart from variants, you may also specify an array of args of the same shape as variants, the entries of which will get passed together with the generated model variants to your specified analysis function. If either of the arguments is missing (or set to nothing), it is defaulted to \"no modifications\" or \"no arguments\".","category":"page"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"The arguments must be tuples; you may need to make 1-tuples from your data (e.g. using (value,)) if you want to pass just a single argument.","category":"page"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"Let's try to use that functionality for trying to find a sufficient amount of iterations needed for Tulip solver to find a feasible solution:","category":"page"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"screen(m,\n    args = [(i,) for i in 5:15],  # the iteration counts, packed in 1-tuples\n    analysis = (m,a) -> # `args` elements get passed as the extra parameter here\n        flux_balance_analysis_vec(m,\n            Tulip.Optimizer;\n            modifications=[change_optimizer_attribute(\"IPM_IterationsLimit\", a)],\n        ),\n)","category":"page"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"From the result, we can see that Tulip would need at least 14 iterations to find a feasible region:","category":"page"},{"location":"advanced/1_variants/","page":"Exploring many model variants","title":"Exploring many model variants","text":"11-element Vector{Union{Nothing, Vector{Float64}}}:\n nothing\n nothing\n nothing\n nothing\n nothing\n nothing\n nothing\n nothing\n nothing\n [7.47738193404817, 1.8840414375838503e-8, 4.860861010127701, -16.023526104614593, … ]\n [7.47738193404817, 1.8840414375838503e-8, 4.860861010127701, -16.023526104614593, … ]","category":"page"},{"location":"tutorials/3_hpc/#Distributed-processing-and-HPC-environments","page":"Distributed processing and HPC environments","title":"Distributed processing and HPC environments","text":"","category":"section"},{"location":"tutorials/3_hpc/","page":"Distributed processing and HPC environments","title":"Distributed processing and HPC environments","text":"Distributed processing in Julia is represented mainly by the package Distributed.jl.","category":"page"},{"location":"tutorials/3_hpc/","page":"Distributed processing and HPC environments","title":"Distributed processing and HPC environments","text":"COBREXA.jl is able to utilize this existing system to almost transparently run the large parallelizable analyses on multiple CPU cores and multiple computers connected through the network. Ultimately, the approach scales to thousands of computing nodes in large HPC facilities.","category":"page"},{"location":"tutorials/3_hpc/","page":"Distributed processing and HPC environments","title":"Distributed processing and HPC environments","text":"Here, we give a short overview of how to work in the distributed environment and utilize the resources for COBREXA.jl analyses.","category":"page"},{"location":"tutorials/3_hpc/#Starting-the-distributed-workers","page":"Distributed processing and HPC environments","title":"Starting the distributed workers","text":"","category":"section"},{"location":"tutorials/3_hpc/","page":"Distributed processing and HPC environments","title":"Distributed processing and HPC environments","text":"COBREXA.jl follows the structure imposed by the Distributed package: You operate a main (usually called \"master\") computation node, connect to multiple other computers and start worker Julia processes there, and distribute the workload across this cluster.","category":"page"},{"location":"tutorials/3_hpc/","page":"Distributed processing and HPC environments","title":"Distributed processing and HPC environments","text":"To start, you need to load the package and add a few processes. This starts 5 processes locally:","category":"page"},{"location":"tutorials/3_hpc/","page":"Distributed processing and HPC environments","title":"Distributed processing and HPC environments","text":"using Distributed\naddprocs(5)","category":"page"},{"location":"tutorials/3_hpc/","page":"Distributed processing and HPC environments","title":"Distributed processing and HPC environments","text":"note: `Distributed.jl` installation\nDistributed.jl usually comes pre-installed with Julia distribution, but you may still need to \"enable\" it by typing ] add Distributed.","category":"page"},{"location":"tutorials/3_hpc/","page":"Distributed processing and HPC environments","title":"Distributed processing and HPC environments","text":"You may check that the workers are really there, using workers(). In this case, it should give you a vector of worker IDs, very likely equal to [2,3,4,5,6].","category":"page"},{"location":"tutorials/3_hpc/","page":"Distributed processing and HPC environments","title":"Distributed processing and HPC environments","text":"If you have compute resources available via a network, you may connect these as well, provided you have a secure shell (ssh) access to them. You will likely want to establish a key-based authentication (refer to ssh documentation) to make the connection easier.","category":"page"},{"location":"tutorials/3_hpc/","page":"Distributed processing and HPC environments","title":"Distributed processing and HPC environments","text":"With shell, check that you can ssh to a remote node and run Julia there:","category":"page"},{"location":"tutorials/3_hpc/","page":"Distributed processing and HPC environments","title":"Distributed processing and HPC environments","text":"user@pc> ssh server\n...\nuser@server> julia\n...\njulia> _","category":"page"},{"location":"tutorials/3_hpc/","page":"Distributed processing and HPC environments","title":"Distributed processing and HPC environments","text":"top: Running shell commands from Julia\nIf you don't want to quit your Julia session to try out the ssh connection from the shell, press ; in the Julia prompt on the beginning of the line. The interpreter will execute your next line as a shell command.","category":"page"},{"location":"tutorials/3_hpc/","page":"Distributed processing and HPC environments","title":"Distributed processing and HPC environments","text":"If this works for you, you can add some workers that run on the server from your Julia shell running on your pc. For example, the following starts 20 workers on the remote server and 10 workers on your friend's computer called joe_pc:","category":"page"},{"location":"tutorials/3_hpc/","page":"Distributed processing and HPC environments","title":"Distributed processing and HPC environments","text":"addprocs([('server', 20), ('joe_pc', 10)])","category":"page"},{"location":"tutorials/3_hpc/","page":"Distributed processing and HPC environments","title":"Distributed processing and HPC environments","text":"With this, you can schedule various computation on the workers; see the Julia manual of Distributed for basic details. You may try various convenience packages, such as DistributedArrays.jl and DistributedData.jl, to process any data in a distributed fashion.","category":"page"},{"location":"tutorials/3_hpc/#Running-a-distributed-analysis","page":"Distributed processing and HPC environments","title":"Running a distributed analysis","text":"","category":"section"},{"location":"tutorials/3_hpc/","page":"Distributed processing and HPC environments","title":"Distributed processing and HPC environments","text":"While not all COBREXA functions may be parallelized naturally, these that do will accept a special workers argument that specifies a list of worker IDs where the computation should be distributed. For the value, you can specify your desired worker IDs manually (e.g. [2,3,4]), or simply use workers().","category":"page"},{"location":"tutorials/3_hpc/","page":"Distributed processing and HPC environments","title":"Distributed processing and HPC environments","text":"For example, flux_variability_analysis can naturally parallelize the computation of all reactions's minima and maxima to finish the computation faster. To enable the parallelization, you first need to make sure that all workers have loaded both the COBREXA package and the optimizer:","category":"page"},{"location":"tutorials/3_hpc/","page":"Distributed processing and HPC environments","title":"Distributed processing and HPC environments","text":"using COBREXA, GLPK, Distributed\naddprocs(10)                       # add any kind and number of processes here\n@everywhere using COBREXA, GLPK    # loads the necessary packages on all workers","category":"page"},{"location":"tutorials/3_hpc/","page":"Distributed processing and HPC environments","title":"Distributed processing and HPC environments","text":"When the package is loaded and precompiled everywhere, you may load your model and run the FVA with the workers parameter:","category":"page"},{"location":"tutorials/3_hpc/","page":"Distributed processing and HPC environments","title":"Distributed processing and HPC environments","text":"model = load_model(\"e_coli_core.xml\")\nresult = flux_variability_analysis(model, GLPK.Optimizer; workers=workers())","category":"page"},{"location":"tutorials/3_hpc/","page":"Distributed processing and HPC environments","title":"Distributed processing and HPC environments","text":"With the extra computing capacity from N workers available, the FVA should be computed roughly N-times faster.","category":"page"},{"location":"tutorials/3_hpc/","page":"Distributed processing and HPC environments","title":"Distributed processing and HPC environments","text":"note: Distribution and parallelization overhead\nCommunication of the workers with your Julia shell is not free. If the task that you are parallelizing is small and the model structure is very large, the distributed computation will actually spend most computation time just distributing the large model to the workers, and almost no time in executing the small parallel task. In such case, the performance will not improve by adding additional resources. You may want to check that the computation task is sufficiently large before investing the extra resources into the distributed execution. Amdahl's and Gustafson's laws can give you a better overview of the consequences of this overhead.","category":"page"},{"location":"tutorials/3_hpc/#Interacting-with-HPC-schedulers","page":"Distributed processing and HPC environments","title":"Interacting with HPC schedulers","text":"","category":"section"},{"location":"tutorials/3_hpc/","page":"Distributed processing and HPC environments","title":"Distributed processing and HPC environments","text":"Many researchers have access to institutional HPC facilities that allow time-sharing of the capacity of a large computer cluster between many researchers. Julia and COBREXA.jl work well within this environment; but your programs require some additional customization to be able to find and utilize the resources available from the HPC.","category":"page"},{"location":"tutorials/3_hpc/","page":"Distributed processing and HPC environments","title":"Distributed processing and HPC environments","text":"In our case, this reduces to a relatively complex task: You need to find out how many resources were allocated for your task, and you need to add the remote workers precisely at places that were allocated for your. Fortunately, the package ClusterManagers.jl can do precisely that.","category":"page"},{"location":"tutorials/3_hpc/","page":"Distributed processing and HPC environments","title":"Distributed processing and HPC environments","text":"For simplicily, we will assume that your HPC is scheduled by Slurm.","category":"page"},{"location":"tutorials/3_hpc/","page":"Distributed processing and HPC environments","title":"Distributed processing and HPC environments","text":"Adding of the workers from Slurm is done as follows:","category":"page"},{"location":"tutorials/3_hpc/","page":"Distributed processing and HPC environments","title":"Distributed processing and HPC environments","text":"you import the ClusterManagers package\nyou find how many processes to spawn from the environment from SLURM_NTASKS environment variable\nyou use the function addprocs_slurm to precisely connect to your allocated computational resources","category":"page"},{"location":"tutorials/3_hpc/","page":"Distributed processing and HPC environments","title":"Distributed processing and HPC environments","text":"The Julia script that does a parallel analysis may then start as follows:","category":"page"},{"location":"tutorials/3_hpc/","page":"Distributed processing and HPC environments","title":"Distributed processing and HPC environments","text":"using COBREXA, Distributed, ClusterManagers\n\navailable_workers = parse(Int, ENV[\"SLURM_NTASKS\"])\n\naddprocs_slurm(available_workers)\n\n...\nresult = flux_variability_analysis(...; workers=workers())\n...","category":"page"},{"location":"tutorials/3_hpc/","page":"Distributed processing and HPC environments","title":"Distributed processing and HPC environments","text":"After adding the Slurm workers, you may continue as if the workers were added using normal addprocs, and (for example) run the flux_variability_analysis as shown above.","category":"page"},{"location":"tutorials/3_hpc/","page":"Distributed processing and HPC environments","title":"Distributed processing and HPC environments","text":"tip: What about the other HPC schedulers?\nClusterManagers.jl supports many other common HPC scheduling systems, including LFS, Sun Grid, SGE, PBS, and Scyld, in a way almost identical to Slurm. See the package documentation for details.","category":"page"},{"location":"tutorials/3_hpc/#Wrapping-your-script-in-a-Slurm-job","page":"Distributed processing and HPC environments","title":"Wrapping your script in a Slurm job","text":"","category":"section"},{"location":"tutorials/3_hpc/","page":"Distributed processing and HPC environments","title":"Distributed processing and HPC environments","text":"To be able to submit your script for later processing using the sbatch Slurm command, you need to wrap it in a small \"batch\" script that tells Slurm how many resources the process needs.","category":"page"},{"location":"tutorials/3_hpc/","page":"Distributed processing and HPC environments","title":"Distributed processing and HPC environments","text":"Assuming you have a Julia computation script written down in myJob.jl and saved on your HPC cluster's access node, the corresponding Slurm batch script (let's call it myJob.sbatch) may look as follows:","category":"page"},{"location":"tutorials/3_hpc/","page":"Distributed processing and HPC environments","title":"Distributed processing and HPC environments","text":"#!/bin/bash -l\n#SBATCH -n 100           # the job will require 100 individual workers\n#SBATCH -c 1             # each worker will sit on a single CPU\n#SBATCH -t 30            # the whole job will take less than 30 minutes\n#SBATCH -J myJob         # the name of the job\n\nmodule load lang/Julia   # this is usually required to make Julia available to your job\n\njulia myJob.jl","category":"page"},{"location":"tutorials/3_hpc/","page":"Distributed processing and HPC environments","title":"Distributed processing and HPC environments","text":"To run the computation, simply run sbatch myJob.sbatch on the access node. The job will be scheduled and eventually executed. You may watch sacct and squeue in the meantime, to see the progress.","category":"page"},{"location":"tutorials/3_hpc/","page":"Distributed processing and HPC environments","title":"Distributed processing and HPC environments","text":"Remember that you need to explicitly save the result of your Julia script computation to files, to be able to retrieve them later. Standard outputs of the jobs are often mangled and discarded. If you still want to collect the standard output, you may change the last line of the batch script to","category":"page"},{"location":"tutorials/3_hpc/","page":"Distributed processing and HPC environments","title":"Distributed processing and HPC environments","text":"julia myJob.jl > myJob.log","category":"page"},{"location":"tutorials/3_hpc/","page":"Distributed processing and HPC environments","title":"Distributed processing and HPC environments","text":"and collect the output from the log later. This is convenient especially if logging various computation details using the @info and similar macros.","category":"page"},{"location":"functions/#Functions","page":"Function reference","title":"Functions","text":"","category":"section"},{"location":"functions/#Base-Types","page":"Function reference","title":"Base Types","text":"","category":"section"},{"location":"functions/","page":"Function reference","title":"Function reference","text":"Modules = [COBREXA]\nPages = map(file -> joinpath(\"base\", \"types\", \"abstract\", file), readdir(\"../src/base/types/abstract\"))","category":"page"},{"location":"functions/#COBREXA.Maybe","page":"Function reference","title":"COBREXA.Maybe","text":"Maybe{T} = Union{Nothing, T}\n\nA nice name for \"nullable\" type.\n\n\n\n\n\n","category":"type"},{"location":"functions/#COBREXA._default-Union{Tuple{T}, Tuple{T, Union{Nothing, T}}} where T","page":"Function reference","title":"COBREXA._default","text":"_default(d::T, x::Maybe{T})::T where {T}\n\nFold the Maybe{T} down to T by defaulting.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA._maybemap-Tuple{Any, Union{Nothing, T} where T}","page":"Function reference","title":"COBREXA._maybemap","text":"_maybemap(f, x::Maybe)::Maybe\n\nApply a function to x only if it is not nothing.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.Annotations","page":"Function reference","title":"COBREXA.Annotations","text":"Annotations = Dict{String,Vector{String}}\n\nDictionary used to store (possible multiple) standardized annotations of something, such as a Metabolite and a Reaction.\n\nExample\n\nAnnotations(\"PubChem\" => [\"CID12345\", \"CID54321\"])\n\n\n\n\n\n","category":"type"},{"location":"functions/#COBREXA.GeneAssociation","page":"Function reference","title":"COBREXA.GeneAssociation","text":"GeneAssociation = Vector{Vector{String}}\n\nAn association to genes, represented as a logical formula in a positive disjunctive normal form (DNF). (The 2nd-level vectors of strings are connected by \"and\" to form conjunctions, and the 1st-level vectors of these conjunctions are connected by \"or\" to form the DNF.)\n\n\n\n\n\n","category":"type"},{"location":"functions/#COBREXA.MetabolicModel","page":"Function reference","title":"COBREXA.MetabolicModel","text":"abstract type MetabolicModel end\n\nA helper supertype that wraps everything usable as a linear-like model for COBREXA functions.\n\nIf you want your model type to work with COBREXA, add the MetabolicModel as its supertype, and implement the accessor functions. Accessors reactions, metabolites, stoichiometry, bounds and objective must be implemented; others are not mandatory and default to safe \"empty\" values.\n\n\n\n\n\n","category":"type"},{"location":"functions/#COBREXA.MetaboliteFormula","page":"Function reference","title":"COBREXA.MetaboliteFormula","text":"MetaboliteFormula = Dict{String,Int}\n\nDictionary of atoms and their abundances in a molecule.\n\n\n\n\n\n","category":"type"},{"location":"functions/#COBREXA.Notes","page":"Function reference","title":"COBREXA.Notes","text":"Notes = Dict{String,Vector{String}}\n\nFree-form notes about something (e.g. a Gene), categorized by \"topic\".\n\n\n\n\n\n","category":"type"},{"location":"functions/#COBREXA.balance-Tuple{MetabolicModel}","page":"Function reference","title":"COBREXA.balance","text":"balance(a::MetabolicModel)::SparseVec\n\nGet the sparse balance vector of a model (ie. the b from S x = b).\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.bounds-Tuple{MetabolicModel}","page":"Function reference","title":"COBREXA.bounds","text":"bounds(a::MetabolicModel)::Tuple{SparseVec,SparseVec}\n\nGet the lower and upper flux bounds of a model.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.coupling-Tuple{MetabolicModel}","page":"Function reference","title":"COBREXA.coupling","text":"coupling(a::MetabolicModel)::SparseMat\n\nGet a matrix of coupling constraint definitions of a model. By default, there is no coupling in the models.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.coupling_bounds-Tuple{MetabolicModel}","page":"Function reference","title":"COBREXA.coupling_bounds","text":"coupling_bounds(a::MetabolicModel)::Tuple{SparseVec,SparseVec}\n\nGet the lower and upper bounds for each coupling bound in a model, as specified by coupling. By default, the model does not have any coupling bounds.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.gene_annotations-Tuple{MetabolicModel, String}","page":"Function reference","title":"COBREXA.gene_annotations","text":"gene_annotations(a::MetabolicModel, gene_id::String)::Annotations\n\nReturn standardized names that identify the corresponding gene or product. The dictionary assigns vectors of possible identifiers to identifier system names, e.g. \"PDB\" => [\"PROT01\"].\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.gene_notes-Tuple{MetabolicModel, String}","page":"Function reference","title":"COBREXA.gene_notes","text":"gene_notes(model::MetabolicModel, gene_id::String)::Notes\n\nReturn the notes associated with the gene gene_id in model.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.genes-Tuple{MetabolicModel}","page":"Function reference","title":"COBREXA.genes","text":"genes(a::MetabolicModel)::Vector{String}\n\nReturn identifiers of all genes contained in the model. By default, there are no genes.\n\nIn SBML, these are usually called \"gene products\" but we write genes for simplicity.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.metabolite_annotations-Tuple{MetabolicModel, String}","page":"Function reference","title":"COBREXA.metabolite_annotations","text":"metabolite_annotations(a::MetabolicModel, metabolite_id::String)::Annotations\n\nReturn standardized names that may help to reliably identify the metabolite. The dictionary assigns vectors of possible identifiers to identifier system names, e.g. \"ChEMBL\" => [\"123\"] or \"PubChem\" => [\"CID123\", \"CID654645645\"].\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.metabolite_charge-Tuple{MetabolicModel, String}","page":"Function reference","title":"COBREXA.metabolite_charge","text":"metabolitecharge(model::MetabolicModel, metaboliteid::String)::Maybe{Int}\n\nReturn the charge associated with metabolite metabolite_id in model. Returns nothing if charge not present.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.metabolite_compartment-Tuple{MetabolicModel, String}","page":"Function reference","title":"COBREXA.metabolite_compartment","text":"metabolite_compartment(model::MetabolicModel, metabolite_id::String)::Maybe{String}\n\nReturn the compartment of metabolite metabolite_id in model if it is assigned. If not, return nothing.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.metabolite_formula-Tuple{MetabolicModel, String}","page":"Function reference","title":"COBREXA.metabolite_formula","text":"metabolite_formula(\n    a::MetabolicModel,\n    metabolite_id::String,\n)::Maybe{MetaboliteFormula}\n\nReturn the formula of metabolite metabolite_id in model. Return nothing in case the formula is not known or irrelevant.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.metabolite_notes-Tuple{MetabolicModel, String}","page":"Function reference","title":"COBREXA.metabolite_notes","text":"metabolite_notes(model::MetabolicModel, metabolite_id::String)::Notes\n\nReturn the notes associated with metabolite reaction_id in model.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.metabolites-Tuple{MetabolicModel}","page":"Function reference","title":"COBREXA.metabolites","text":"metabolites(a::MetabolicModel)::Vector{String}\n\nReturn a vector of metabolite identifiers in a model.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.n_coupling_constraints-Tuple{MetabolicModel}","page":"Function reference","title":"COBREXA.n_coupling_constraints","text":"n_coupling_constraints(a::MetabolicModel)::Int\n\nGet the number of coupling constraints in a model.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.n_genes-Tuple{MetabolicModel}","page":"Function reference","title":"COBREXA.n_genes","text":"n_genes(a::MetabolicModel)::Int\n\nReturn the number of genes in the model (as returned by genes). If you just need the number of the genes, this may be much more efficient than calling genes and measuring the array.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.n_metabolites-Tuple{MetabolicModel}","page":"Function reference","title":"COBREXA.n_metabolites","text":"n_metabolites(a::MetabolicModel)::Int\n\nGet the number of metabolites in a model.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.n_reactions-Tuple{MetabolicModel}","page":"Function reference","title":"COBREXA.n_reactions","text":"n_reactions(a::MetabolicModel)::Int\n\nGet the number of reactions in a model.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.objective-Tuple{MetabolicModel}","page":"Function reference","title":"COBREXA.objective","text":"objective(a::MetabolicModel)::SparseVec\n\nGet the objective vector of a model.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.precache!-Tuple{MetabolicModel}","page":"Function reference","title":"COBREXA.precache!","text":"precache!(a::MetabolicModel)::Nothing\n\nDo whatever is feasible to get the model into a state that can be read from as-quickly-as-possible. This may include e.g. generating helper index structures and loading delayed parts of the model from disk. The model should be modified \"transparently\" in-place. Analysis functions call this right before applying modifications or converting the model to the optimization model using make_optimization_model; usually on the same machine where the optimizers (and, generally, the core analysis algorithms) will run. The calls are done in a good hope that the performance will be improved.\n\nBy default, it should be safe to do nothing.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.reaction_annotations-Tuple{MetabolicModel, String}","page":"Function reference","title":"COBREXA.reaction_annotations","text":"reaction_annotations(a::MetabolicModel, reaction_id::String)::Annotations\n\nReturn standardized names that may help identifying the reaction. The dictionary assigns vectors of possible identifiers to identifier system names, e.g. \"Reactome\" => [\"reactomeID123\"].\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.reaction_gene_association-Tuple{MetabolicModel, String}","page":"Function reference","title":"COBREXA.reaction_gene_association","text":"reaction_gene_association(a::MetabolicModel, gene_id::String)::Maybe{GeneAssociation}\n\nReturns the sets of genes that need to be present so that the reaction can work (technically, a DNF on gene availability, with positive atoms only).\n\nFor simplicity, nothing may be returned, meaning that the reaction always takes place. (in DNF, that would be equivalent to returning [[]].)\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.reaction_notes-Tuple{MetabolicModel, String}","page":"Function reference","title":"COBREXA.reaction_notes","text":"reaction_notes(model::MetabolicModel, reaction_id::String)::Notes\n\nReturn the notes associated with reaction reaction_id in model.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.reaction_stoichiometry-Tuple{MetabolicModel, String}","page":"Function reference","title":"COBREXA.reaction_stoichiometry","text":"reaction_stoichiometry(model::MetaboliteModel, rid::String)::Dict{String, Float64}\n\nReturn the stoichiometry of reaction with ID rid in the model. The dictionary maps the metabolite IDs to their stoichiometric coefficients.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.reaction_subsystem-Tuple{MetabolicModel, String}","page":"Function reference","title":"COBREXA.reaction_subsystem","text":"reaction_subsystem(model::MetabolicModel, reaction_id::String)::Maybe{String}\n\nReturn the subsystem of reaction reaction_id in model if it is assigned. If not, return nothing.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.reactions-Tuple{MetabolicModel}","page":"Function reference","title":"COBREXA.reactions","text":"reactions(a::MetabolicModel)::Vector{String}\n\nReturn a vector of reaction identifiers in a model.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.stoichiometry-Tuple{MetabolicModel}","page":"Function reference","title":"COBREXA.stoichiometry","text":"stoichiometry(a::MetabolicModel)::SparseMat\n\nGet the sparse stoichiometry matrix of a model.\n\n\n\n\n\n","category":"method"},{"location":"functions/#Model-types-and-contents","page":"Function reference","title":"Model types and contents","text":"","category":"section"},{"location":"functions/","page":"Function reference","title":"Function reference","text":"Modules = [COBREXA]\nPages = map(file -> joinpath(\"base\", \"types\", file), readdir(\"../src/base/types\"))","category":"page"},{"location":"functions/#COBREXA.CoreModel","page":"Function reference","title":"COBREXA.CoreModel","text":"struct CoreModel <: MetabolicModel\n\nA \"bare bones\" core linear optimization problem of the form, with reaction and metabolite names.\n\nmin c^T x\ns.t. S x = b\n      xₗ ≤ x ≤ xᵤ\n\n\n\n\n\n","category":"type"},{"location":"functions/#Base.convert-Union{Tuple{M}, Tuple{Type{CoreModel}, M}} where M<:MetabolicModel","page":"Function reference","title":"Base.convert","text":"Base.convert(::Type{CoreModel}, m::M) where {M <: MetabolicModel}\n\nMake a CoreModel out of any compatible model type.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.balance-Tuple{CoreModel}","page":"Function reference","title":"COBREXA.balance","text":"balance(a::CoreModel)::SparseVec\n\nCoreModel target flux balance.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.bounds-Tuple{CoreModel}","page":"Function reference","title":"COBREXA.bounds","text":"bounds(a::CoreModel)::Tuple{SparseVec,SparseVec}\n\nCoreModel flux bounds.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.metabolites-Tuple{CoreModel}","page":"Function reference","title":"COBREXA.metabolites","text":"metabolites(a::CoreModel)::Vector{String}\n\nMetabolites in a CoreModel.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.objective-Tuple{CoreModel}","page":"Function reference","title":"COBREXA.objective","text":"objective(a::CoreModel)::SparseVec\n\nCoreModel objective vector.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.reaction_stoichiometry-Tuple{CoreModel, Any}","page":"Function reference","title":"COBREXA.reaction_stoichiometry","text":"reaction_stoichiometry(model::CoreModel, ridx)::Dict{String, Float64}\n\nReturn the stoichiometry of reaction at index ridx.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.reaction_stoichiometry-Tuple{CoreModel, String}","page":"Function reference","title":"COBREXA.reaction_stoichiometry","text":"reaction_stoichiometry(model::CoreModel, rid::String)::Dict{String, Float64}\n\nReturn the stoichiometry of reaction with ID rid.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.reactions-Tuple{CoreModel}","page":"Function reference","title":"COBREXA.reactions","text":"reactions(a::CoreModel)::Vector{String}\n\nGet the reactions in a CoreModel.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.stoichiometry-Tuple{CoreModel}","page":"Function reference","title":"COBREXA.stoichiometry","text":"stoichiometry(a::CoreModel)::SparseMat\n\nCoreModel stoichiometry matrix.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.CoreModelCoupled","page":"Function reference","title":"COBREXA.CoreModelCoupled","text":"struct CoreModelCoupled <: MetabolicModel\n\nThe linear model with additional coupling constraints in the form\n\n    cₗ ≤ C x ≤ cᵤ\n\n\n\n\n\n","category":"type"},{"location":"functions/#Base.convert-Tuple{Type{CoreModelCoupled}, MetabolicModel}","page":"Function reference","title":"Base.convert","text":"Base.convert(::Type{CoreModelCoupled}, mm::MetabolicModel)\n\nMake a CoreModelCoupled out of any compatible model type.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.balance-Tuple{CoreModelCoupled}","page":"Function reference","title":"COBREXA.balance","text":"balance(a::CoreModelCoupled)\n\nExtract balance from CoreModelCoupled (uses the internal CoreModel).\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.bounds-Tuple{CoreModelCoupled}","page":"Function reference","title":"COBREXA.bounds","text":"bounds(a::CoreModelCoupled)\n\nExtract bounds from CoreModelCoupled (uses the internal CoreModel).\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.coupling-Tuple{CoreModelCoupled}","page":"Function reference","title":"COBREXA.coupling","text":"coupling(a::CoreModelCoupled)::SparseMat\n\nCoupling constraint matrix for a CoreModelCoupled.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.coupling_bounds-Tuple{CoreModelCoupled}","page":"Function reference","title":"COBREXA.coupling_bounds","text":"coupling_bounds(a::CoreModelCoupled)::Tuple{SparseVec,SparseVec}\n\nCoupling bounds for a CoreModelCoupled.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.metabolites-Tuple{CoreModelCoupled}","page":"Function reference","title":"COBREXA.metabolites","text":"metabolites(a::CoreModelCoupled)\n\nExtract metabolites from CoreModelCoupled (uses the internal CoreModel).\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.n_coupling_constraints-Tuple{CoreModelCoupled}","page":"Function reference","title":"COBREXA.n_coupling_constraints","text":"n_coupling_constraints(a::CoreModelCoupled)::Int\n\nThe number of coupling constraints in a CoreModelCoupled.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.objective-Tuple{CoreModelCoupled}","page":"Function reference","title":"COBREXA.objective","text":"objective(a::CoreModelCoupled)\n\nExtract objective from CoreModelCoupled (uses the internal CoreModel).\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.reaction_stoichiometry-Tuple{CoreModelCoupled, Any}","page":"Function reference","title":"COBREXA.reaction_stoichiometry","text":"reaction_stoichiometry(model::CoreModelCoupled, ridx)::Dict{String, Float64}\n\nReturn the stoichiometry of reaction at index ridx.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.reaction_stoichiometry-Tuple{CoreModelCoupled, String}","page":"Function reference","title":"COBREXA.reaction_stoichiometry","text":"reaction_stoichiometry(model::CoreModelCoupled, rid::String)::Dict{String, Float64}\n\nReturn the stoichiometry of reaction with ID rid.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.reactions-Tuple{CoreModelCoupled}","page":"Function reference","title":"COBREXA.reactions","text":"reactions(a::CoreModelCoupled)\n\nExtract reactions from CoreModelCoupled (uses the internal CoreModel).\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.stoichiometry-Tuple{CoreModelCoupled}","page":"Function reference","title":"COBREXA.stoichiometry","text":"stoichiometry(a::CoreModelCoupled)\n\nExtract stoichiometry from CoreModelCoupled (uses the internal CoreModel).\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.FluxSummary","page":"Function reference","title":"COBREXA.FluxSummary","text":"FluxSummary\n\nA struct used to store summary information about the solution of a constraint based analysis result.\n\n\n\n\n\n","category":"type"},{"location":"functions/#COBREXA.flux_summary-Tuple{Dict{String, Float64}}","page":"Function reference","title":"COBREXA.flux_summary","text":"flux_summary(flux_result::Dict{String, Float64};\n            exclude_exchanges = false,\n            exchange_prefixes = _constants.exchange_prefixes,\n            biomass_strings = _constants.biomass_strings,\n            exclude_biomass = false,\n            small_flux_bound = 1.0/_constants.default_reaction_bound^2,\n            large_flux_bound = _constants.default_reaction_bound,\n            keep_unbounded = false,\n            )::FluxSummary\n\nSummarize a dictionary of fluxes into small, useful representation of the most important information contained. Useful for pretty-printing and quickly exploring the results. Internally this function uses looks_like_biomass_reaction and looks_like_exchange_reaction. The corresponding keyword arguments passed to these functions. Use this if your model has non-standard ids for reactions. Fluxes smaller than small_flux_bound are not stored, while fluxes larger than large_flux_bound are only stored if keep_unbounded is true.\n\nExample\n\njulia> sol = flux_balance_analysis_dict(model, Tulip.Optimizer)\njulia> fr = flux_summary(sol)\nBiomass:\n  BIOMASS_Ecoli_core_w_GAM: 0.8739\nImport:\n  EX_o2_e:     -21.7995\n  EX_glc__D_e: -10.0\n  EX_nh4_e:    -4.7653\n  EX_pi_e:     -3.2149\nExport:\n  EX_h_e:      17.5309\n  EX_co2_e:    22.8098\n  EX_h2o_e:    29.1758\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.FluxVariabilitySummary","page":"Function reference","title":"COBREXA.FluxVariabilitySummary","text":"FluxVariabilitySummary\n\nA struct used to store summary information about the solution of a flux variability analysis result.\n\n\n\n\n\n","category":"type"},{"location":"functions/#COBREXA.flux_variability_summary-Tuple{Tuple{Dict{String, Dict{String, Float64}}, Dict{String, Dict{String, Float64}}}}","page":"Function reference","title":"COBREXA.flux_variability_summary","text":"flux_variability_summary(flux_result::Tuple{Dict{String, Dict{String, Float64}}, Dict{String, Dict{String, Float64}}};\n    exclude_exchanges = false,\n    exchange_prefixes = _constants.exchange_prefixes,\n    biomass_strings = _constants.biomass_strings,\n    exclude_biomass = false,\n    )::FluxVariabilitySummary\n\nSummarize a dictionary of flux dictionaries obtained eg. from fluxvariabilityanalysisdict. The simplified summary representation is useful for pretty-printing and easily showing the most important results. Internally this function uses [`lookslikebiomassreaction](@ref) and [lookslikeexchange_reaction`](@ref). The corresponding keyword arguments passed to these functions. Use this if your model has non-standard ids for reactions.\n\nExample\n\njulia> sol = flux_variability_analysis_dict(model, Gurobi.Optimizer; bounds = objective_bounds(0.99))\njulia> flux_res = flux_variability_summary(sol)\nBiomass                     Lower bound   Upper bound\n  BIOMASS_Ecoli_core_w_GAM: 0.8652        0.8652\nExchange\n  EX_h2o_e:                 28.34         28.34\n  EX_co2_e:                 22.0377       22.0377\n  EX_o2_e:                  -22.1815      -22.1815\n  EX_h_e:                   17.3556       17.3556\n  EX_glc__D_e:              -10.0         -10.0\n  EX_nh4_e:                 -4.8448       -4.8448\n  EX_pi_e:                  -3.2149       -3.2149\n  EX_for_e:                 0.0           0.0\n  ...                       ...           ...\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.Gene","page":"Function reference","title":"COBREXA.Gene","text":"Gene struct.\n\nFields\n\nid :: String\nnotes :: Dict{String, Vector{String}}\nannotation :: Dict{String, Union{Vector{String}, String}}\n\n\n\n\n\n","category":"type"},{"location":"functions/#COBREXA.JSONModel","page":"Function reference","title":"COBREXA.JSONModel","text":"struct JSONModel <: MetabolicModel\n    json::Dict{String,Any}\n    rxn_index::Dict{String,Int}\n    rxns::Vector{Any}\n    met_index::Dict{String,Int}\n    mets::Vector{Any}\n    gene_index::Dict{String,Int}\n    genes::Vector{Any}\nend\n\nA struct used to store the contents of a JSON model, i.e. a model read from a file ending with .json. These model files typically store all the model data in arrays of JSON objects (represented in Julia as vectors of dictionaries).\n\nUsually, not all of the fields of the input JSON can be easily represented when converting to other models, care should be taken to avoid losing information.\n\nDirect work with the json structure is not very efficient; the model structure therefore caches some of the internal structure in the extra fields. The single-parameter JSONModel constructor creates these caches correctly from the json. The model structure is designed as read-only, and changes in json invalidate the cache.\n\nExample\n\nmodel = load_json_model(\"some_model.json\")\nmodel.json # see the actual underlying JSON\nreactions(model) # see the list of reactions\n\n\n\n\n\n","category":"type"},{"location":"functions/#Base.convert-Tuple{Type{JSONModel}, MetabolicModel}","page":"Function reference","title":"Base.convert","text":"Base.convert(::Type{JSONModel}, mm::MetabolicModel)\n\nConvert any MetabolicModel to JSONModel.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.bounds-Tuple{JSONModel}","page":"Function reference","title":"COBREXA.bounds","text":"bounds(model::JSONModel)\n\nGet the bounds for reactions, assuming the information is stored in .lower_bound and .upper_bound.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.gene_annotations-Tuple{JSONModel, String}","page":"Function reference","title":"COBREXA.gene_annotations","text":"gene_annotations(model::JSONModel, gid::String)::Annotations\n\nGene annotations from the JSONModel.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.gene_notes-Tuple{JSONModel, String}","page":"Function reference","title":"COBREXA.gene_notes","text":"gene_notes(model::JSONModel, gid::String)::Notes\n\nGene notes from the JSONModel.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.genes-Tuple{JSONModel}","page":"Function reference","title":"COBREXA.genes","text":"genes(model::JSONModel)\n\nExtract gene names from a JSON model.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.metabolite_annotations-Tuple{JSONModel, String}","page":"Function reference","title":"COBREXA.metabolite_annotations","text":"metabolite_annotations(model::JSONModel, mid::String)::Annotations\n\nMetabolite annotations from the JSONModel.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.metabolite_charge-Tuple{JSONModel, String}","page":"Function reference","title":"COBREXA.metabolite_charge","text":"metabolite_charge(model::JSONModel, mid::String)\n\nReturn the metabolite .charge\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.metabolite_compartment-Tuple{JSONModel, String}","page":"Function reference","title":"COBREXA.metabolite_compartment","text":"metabolite_compartment(model::JSONModel, mid::String)\n\nReturn the metabolite .compartment\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.metabolite_formula-Tuple{JSONModel, String}","page":"Function reference","title":"COBREXA.metabolite_formula","text":"metabolite_formula(model::JSONModel, mid::String)\n\nParse and return the metabolite .formula\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.metabolite_notes-Tuple{JSONModel, String}","page":"Function reference","title":"COBREXA.metabolite_notes","text":"metabolite_notes(model::JSONModel, mid::String)::Notes\n\nMetabolite notes from the JSONModel.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.metabolites-Tuple{JSONModel}","page":"Function reference","title":"COBREXA.metabolites","text":"metabolites(model::JSONModel)\n\nExtract metabolite names (stored as .id) from JSON model.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.objective-Tuple{JSONModel}","page":"Function reference","title":"COBREXA.objective","text":"objective(model::JSONModel)\n\nCollect .objective_coefficient keys from model reactions.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.reaction_annotations-Tuple{JSONModel, String}","page":"Function reference","title":"COBREXA.reaction_annotations","text":"reaction_annotations(model::JSONModel, rid::String)::Annotations\n\nReaction annotations from the JSONModel.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.reaction_gene_association-Tuple{JSONModel, String}","page":"Function reference","title":"COBREXA.reaction_gene_association","text":"reaction_gene_associaton(model::JSONModel, rid::String)\n\nParses the .gene_reaction_rule from reactions.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.reaction_notes-Tuple{JSONModel, String}","page":"Function reference","title":"COBREXA.reaction_notes","text":"reaction_notes(model::JSONModel, rid::String)::Notes\n\nReaction notes from the JSONModel.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.reaction_stoichiometry-Tuple{JSONModel, String}","page":"Function reference","title":"COBREXA.reaction_stoichiometry","text":"reaction_stoichiometry(model::JSONModel, rid::String)::Dict{String, Float64}\n\nReturn the stoichiometry of reaction with ID rid.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.reaction_subsystem-Tuple{JSONModel, String}","page":"Function reference","title":"COBREXA.reaction_subsystem","text":"reaction_subsystem(model::JSONModel, rid::String)\n\nParses the .subsystem out from reactions.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.reactions-Tuple{JSONModel}","page":"Function reference","title":"COBREXA.reactions","text":"reactions(model::JSONModel)\n\nExtract reaction names (stored as .id) from JSON model.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.stoichiometry-Tuple{JSONModel}","page":"Function reference","title":"COBREXA.stoichiometry","text":"stoichiometry(model::JSONModel)\n\nGet the stoichiometry. Assuming the information is stored in reaction object under key .metabolites.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.MATModel","page":"Function reference","title":"COBREXA.MATModel","text":"struct MATModel\n\nWrapper around the models loaded in dictionaries from the MATLAB representation.\n\n\n\n\n\n","category":"type"},{"location":"functions/#Base.convert-Tuple{Type{MATModel}, MetabolicModel}","page":"Function reference","title":"Base.convert","text":"Base.convert(::Type{MATModel}, m::MetabolicModel)\n\nConvert any metabolic model to MATModel.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA._mat_has_squashed_coupling-Tuple{Any}","page":"Function reference","title":"COBREXA._mat_has_squashed_coupling","text":"_mat_has_squashed_coupling(mat)\n\nGuesses whether C in the MAT file is stored in A=[S;C].\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.balance-Tuple{MATModel}","page":"Function reference","title":"COBREXA.balance","text":"balance(m::MATModel)\n\nExtracts balance from the MAT model, defaulting to zeroes if not present.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.bounds-Tuple{MATModel}","page":"Function reference","title":"COBREXA.bounds","text":"bounds(m::MATModel)\n\nExtracts bounds from the MAT file, saved under lb and ub.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.coupling-Tuple{MATModel}","page":"Function reference","title":"COBREXA.coupling","text":"coupling(m::MATModel)\n\nExtract coupling matrix stored, in C key.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.coupling_bounds-Tuple{MATModel}","page":"Function reference","title":"COBREXA.coupling_bounds","text":"coupling_bounds(m::MATModel)\n\nExtracts the coupling constraints. Currently, there are several accepted ways to store these in MATLAB models; this takes the constraints from vectors cl and cu.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.genes-Tuple{MATModel}","page":"Function reference","title":"COBREXA.genes","text":"genes(m::MATModel)\n\nExtracts the possible gene list from genes key.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.metabolite_charge-Tuple{MATModel, String}","page":"Function reference","title":"COBREXA.metabolite_charge","text":"metabolite_charge(m::MATModel, mid::String)\n\nExtract metabolite charge from metCharge or metCharges.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.metabolite_compartment-Tuple{MATModel, String}","page":"Function reference","title":"COBREXA.metabolite_compartment","text":"metabolite_compartment(m::MATModel, mid::String)\n\nExtract metabolite compartment from metCompartment or metCompartments.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.metabolite_formula-Tuple{MATModel, String}","page":"Function reference","title":"COBREXA.metabolite_formula","text":"metabolite_formula(m::MATModel, mid::String)\n\nExtract metabolite formula from key metFormula or metFormulas.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.metabolites-Tuple{MATModel}","page":"Function reference","title":"COBREXA.metabolites","text":"metabolites(m::MATModel)::Vector{String}\n\nExtracts metabolite names from mets key in the MAT file.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.objective-Tuple{MATModel}","page":"Function reference","title":"COBREXA.objective","text":"objective(m::MATModel)\n\nExtracts the objective from the MAT model (defaults to zeroes).\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.reaction_gene_association-Tuple{MATModel, String}","page":"Function reference","title":"COBREXA.reaction_gene_association","text":"reaction_gene_association(m::MATModel, rid::String)\n\nExtracts the associations from grRules key, if present.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.reaction_stoichiometry-Tuple{MATModel, Any}","page":"Function reference","title":"COBREXA.reaction_stoichiometry","text":"reaction_stoichiometry(model::MATModel, ridx)::Dict{String, Float64}\n\nReturn the stoichiometry of reaction at index ridx.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.reaction_stoichiometry-Tuple{MATModel, String}","page":"Function reference","title":"COBREXA.reaction_stoichiometry","text":"reaction_stoichiometry(model::MATModel, rid::String)::Dict{String, Float64}\n\nReturn the stoichiometry of reaction with ID rid.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.reactions-Tuple{MATModel}","page":"Function reference","title":"COBREXA.reactions","text":"reactions(m::MATModel)::Vector{String}\n\nExtracts reaction names from rxns key in the MAT file.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.stoichiometry-Tuple{MATModel}","page":"Function reference","title":"COBREXA.stoichiometry","text":"stoichiometry(m::MATModel)\n\nExtract the stoichiometry matrix, stored under key S.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.Metabolite","page":"Function reference","title":"COBREXA.Metabolite","text":"Metabolite structure.\n\nFields\n\nid :: String\nformula :: String\ncharge :: Int\ncompartment :: String\nnotes :: Dict{String, Vector{String}}\nannotation :: Dict{String, Union{Vector{String}, String}}\n\n\n\n\n\n","category":"type"},{"location":"functions/#COBREXA.Reaction","page":"Function reference","title":"COBREXA.Reaction","text":"mutable struct Reaction\n    id::String\n    metabolites::Dict{String,Float64}\n    lb::Float64\n    ub::Float64\n    grr::Maybe{GeneAssociation}\n    subsystem::Maybe{String}\n    notes::Notes\n    annotations::Annotations\n    objective_coefficient::Float64\nend\n\nA structure for representing a single reaction in a StandardModel.\n\n\n\n\n\n","category":"type"},{"location":"functions/#COBREXA.Reaction-2","page":"Function reference","title":"COBREXA.Reaction","text":"Reaction(\n    id = \"\";\n    metabolites = Dict{String,Float64}(),\n    lb = -_constants.default_reaction_bound,\n    ub = _constants.default_reaction_bound,\n    grr = nothing,\n    subsystem = nothing,\n    notes = Notes(),\n    annotations = Annotations(),\n    objective_coefficient = 0.0,\n)\n\nA constructor for Reaction that only takes a reaction id and assigns default/uninformative values to all the fields that are not explicitely assigned.\n\n\n\n\n\n","category":"type"},{"location":"functions/#COBREXA.Reaction-3","page":"Function reference","title":"COBREXA.Reaction","text":"Reaction(\n    id::String,\n    metabolites::Dict{String,Union{Int, Float64}},\n    dir = :bidirectional;\n    default_bound = _constants.default_reaction_bound,\n)\n\nConvenience constructor for Reaction. The reaction equation is specified using metabolites, which is a dictionary mapping metabolite ids to stoichiometric coefficients. The direcion of the reaction is set through dir which can take :bidirectional, :forward, and :reverse as values. Finally, the default_bound is the value taken to mean infinity in the context of constraint based models, often this is set to a very high flux value like 1000.\n\n\n\n\n\n","category":"type"},{"location":"functions/#COBREXA.ReactionStatus","page":"Function reference","title":"COBREXA.ReactionStatus","text":"Used for concise reporting of modeling results.\n\n\n\n\n\n","category":"type"},{"location":"functions/#COBREXA.SBMLModel","page":"Function reference","title":"COBREXA.SBMLModel","text":"struct SBMLModel\n\nThin wrapper around the model from SBML.jl library. Allows easy conversion from SBML to any other model format.\n\n\n\n\n\n","category":"type"},{"location":"functions/#Base.convert-Tuple{Type{SBMLModel}, MetabolicModel}","page":"Function reference","title":"Base.convert","text":"Base.convert(::Type{SBMLModel}, mm::MetabolicModel)\n\nConvert any metabolic model to SBMLModel.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.balance-Tuple{SBMLModel}","page":"Function reference","title":"COBREXA.balance","text":"balance(model::SBMLModel)::SparseVec\n\nBalance vector of a SBMLModel. This is always zero.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.bounds-Tuple{SBMLModel}","page":"Function reference","title":"COBREXA.bounds","text":"bounds(model::SBMLModel)::Tuple{SparseVec,SparseVec}\n\nGet the lower and upper flux bounds of model SBMLModel. Throws DomainError in case if the SBML contains mismatching units.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.genes-Tuple{SBMLModel}","page":"Function reference","title":"COBREXA.genes","text":"genes(model::SBMLModel)::Vector{String}\n\nGet genes of a SBMLModel.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.metabolite_charge-Tuple{SBMLModel, String}","page":"Function reference","title":"COBREXA.metabolite_charge","text":"metabolite_charge(model::SBMLModel, mid::String)::Maybe{Int}\n\nGet charge of a chosen metabolite from SBMLModel.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.metabolite_formula-Tuple{SBMLModel, String}","page":"Function reference","title":"COBREXA.metabolite_formula","text":"metabolite_formula(model::SBMLModel, mid::String)::Maybe{MetaboliteFormula}\n\nGet MetaboliteFormula from a chosen metabolite from SBMLModel.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.metabolites-Tuple{SBMLModel}","page":"Function reference","title":"COBREXA.metabolites","text":"metabolites(model::SBMLModel)::Vector{String}\n\nGet metabolites from a SBMLModel.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.n_genes-Tuple{SBMLModel}","page":"Function reference","title":"COBREXA.n_genes","text":"n_genes(model::SBMLModel)::Int\n\nGet number of genes in SBMLModel.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.n_metabolites-Tuple{SBMLModel}","page":"Function reference","title":"COBREXA.n_metabolites","text":"n_metabolites(model::SBMLModel)::Int\n\nEfficient counting of metabolites in SBMLModel.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.n_reactions-Tuple{SBMLModel}","page":"Function reference","title":"COBREXA.n_reactions","text":"n_reactions(model::SBMLModel)::Int\n\nEfficient counting of reactions in SBMLModel.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.objective-Tuple{SBMLModel}","page":"Function reference","title":"COBREXA.objective","text":"objective(model::SBMLModel)::SparseVec\n\nObjective of the SBMLModel.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.reaction_gene_association-Tuple{SBMLModel, String}","page":"Function reference","title":"COBREXA.reaction_gene_association","text":"reaction_gene_association(model::SBMLModel, rid::String)::Maybe{GeneAssociation}\n\nRetrieve the GeneAssociation from SBMLModel.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.reaction_stoichiometry-Tuple{SBMLModel, String}","page":"Function reference","title":"COBREXA.reaction_stoichiometry","text":"reaction_stoichiometry(model::SBMLModel, rid::String)::Dict{String, Float64}\n\nReturn the stoichiometry of reaction with ID rid.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.reactions-Tuple{SBMLModel}","page":"Function reference","title":"COBREXA.reactions","text":"reactions(model::SBMLModel)::Vector{String}\n\nGet reactions from a SBMLModel.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.stoichiometry-Tuple{SBMLModel}","page":"Function reference","title":"COBREXA.stoichiometry","text":"stoichiometry(model::SBMLModel)::SparseMat\n\nRecreate the stoichiometry matrix from the SBMLModel.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.Serialized","page":"Function reference","title":"COBREXA.Serialized","text":"mutable struct Serialized{M <: MetabolicModel}\n    m::Maybe{M}\n    filename::String\nend\n\nA meta-model that represents a model that is serialized on the disk. The internal model will be loaded on-demand by using any accessor, or by calling precache! directly.\n\n\n\n\n\n","category":"type"},{"location":"functions/#COBREXA.precache!-Tuple{Serialized}","page":"Function reference","title":"COBREXA.precache!","text":"precache!(model::Serialized{MetabolicModel})::Nothing\n\nLoad the Serialized model from disk in case it's not alreadly loaded.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.StandardModel","page":"Function reference","title":"COBREXA.StandardModel","text":"mutable struct StandardModel\n\nStandardModel is used to store a constraint based metabolic model with meta-information.  Meta-information is defined as annotation details, which include gene-reaction-rules, formulas, etc.\n\nThis model type seeks to keep as much meta-information as possible, as opposed to CoreModel and CoreModelCoupled, which keep the bare neccessities only. When merging models and keeping meta-information is important, use this as the model type.  If meta-information is not important, use the more efficient core model types.  See CoreModel and CoreModelCoupled for comparison.\n\nIn this model, reactions, metabolites, and genes are stored in ordered dictionaries indexed by each struct's id field.  For example, model.reactions[\"rxn1_id\"] returns a Reaction where the field id equals \"rxn1_id\".  This makes adding and removing reactions efficient.\n\nNote that the stoichiometric matrix (or any other core data, e.g. flux bounds) is not stored directly as in CoreModel.  When this model type is used in analysis functions, these core data structures are built from scratch each time an analysis function is called.  This can cause performance issues if you run many small analysis functions sequentially.  Consider using the core model types if performance is critical.\n\nSee also: Reaction, Metabolite, Gene\n\nFields\n\nid :: String\nreactions :: OrderedDict{String, Reaction}\nmetabolites :: OrderedDict{String, Metabolite}\ngenes :: OrderedDict{String, Gene}\n\nExample\n\nmodel = load_model(StandardModel, \"my_model.json\")\nkeys(model.reactions)\n\n\n\n\n\n","category":"type"},{"location":"functions/#Base.convert-Tuple{Type{StandardModel}, MetabolicModel}","page":"Function reference","title":"Base.convert","text":"Base.convert(::Type{StandardModel}, model::MetabolicModel)\n\nConvert any MetabolicModel into a StandardModel. Note, some data loss may occur since only the generic interface is used during the conversion process.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.balance-Tuple{StandardModel}","page":"Function reference","title":"COBREXA.balance","text":"balance(model::StandardModel)\n\nReturn the balance of the linear problem, i.e. b in Sv = 0 where S is the stoichiometric matrix and v is the flux vector.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.bounds-Tuple{StandardModel}","page":"Function reference","title":"COBREXA.bounds","text":"bounds(model::StandardModel)\n\nReturn the lower and upper bounds, respectively, for reactions in model. Order matches that of the reaction ids returned in reactions().\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.gene_annotations-Tuple{StandardModel, String}","page":"Function reference","title":"COBREXA.gene_annotations","text":"gene_annotations(model::StandardModel, id::String)::Annotations\n\nReturn the annotation associated with gene id in model. Return an empty Dict if not present.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.gene_notes-Tuple{StandardModel, String}","page":"Function reference","title":"COBREXA.gene_notes","text":"gene_notes(model::StandardModel, id::String)::Notes\n\nReturn the notes associated with gene id in model. Return an empty Dict if not present.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.genes-Tuple{StandardModel}","page":"Function reference","title":"COBREXA.genes","text":"genes(model::StandardModel)\n\nReturn a vector of gene id strings in model.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.lower_bounds-Tuple{StandardModel}","page":"Function reference","title":"COBREXA.lower_bounds","text":"lower_bounds(model::StandardModel)\n\nReturn the lower bounds for all reactions in model in sparse format.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.metabolite_annotations-Tuple{StandardModel, String}","page":"Function reference","title":"COBREXA.metabolite_annotations","text":"metabolite_annotations(model::StandardModel, id::String)::Annotations\n\nReturn the annotation associated with metabolite id in model. Return an empty Dict if not present.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.metabolite_charge-Tuple{StandardModel, String}","page":"Function reference","title":"COBREXA.metabolite_charge","text":"metabolite_charge(model::StandardModel, id::String)\n\nReturn the charge associated with metabolite id in model. Return nothing if not present.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.metabolite_compartment-Tuple{StandardModel, String}","page":"Function reference","title":"COBREXA.metabolite_compartment","text":"metabolite_compartment(model::StandardModel, id::String)\n\nReturn compartment associated with metabolite id in model. Return nothing if not present.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.metabolite_formula-Tuple{StandardModel, String}","page":"Function reference","title":"COBREXA.metabolite_formula","text":"metabolite_formula(model::StandardModel, id::String)\n\nReturn the formula of reaction id in model. Return nothing if not present.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.metabolite_notes-Tuple{StandardModel, String}","page":"Function reference","title":"COBREXA.metabolite_notes","text":"metabolite_notes(model::StandardModel, id::String)::Notes\n\nReturn the notes associated with metabolite id in model. Return an empty Dict if not present.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.metabolites-Tuple{StandardModel}","page":"Function reference","title":"COBREXA.metabolites","text":"metabolites(model::StandardModel)\n\nReturn a vector of metabolite id strings contained in model. The order of metabolite strings returned here matches the order used to construct the stoichiometric matrix.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.n_genes-Tuple{StandardModel}","page":"Function reference","title":"COBREXA.n_genes","text":"n_genes(model::StandardModel)\n\nReturn the number of genes in model.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.n_metabolites-Tuple{StandardModel}","page":"Function reference","title":"COBREXA.n_metabolites","text":"n_metabolites(model::StandardModel)\n\nReturn the number of metabolites in model.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.n_reactions-Tuple{StandardModel}","page":"Function reference","title":"COBREXA.n_reactions","text":"n_reactions(model::StandardModel)\n\nReturn the number of reactions contained in model.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.objective-Tuple{StandardModel}","page":"Function reference","title":"COBREXA.objective","text":"objective(model::StandardModel)\n\nReturn sparse objective vector for model.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.reaction_annotations-Tuple{StandardModel, String}","page":"Function reference","title":"COBREXA.reaction_annotations","text":"reaction_annotations(model::StandardModel, id::String)::Annotations\n\nReturn the annotation associated with reaction id in model. Return an empty Dict if not present.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.reaction_gene_association-Tuple{StandardModel, String}","page":"Function reference","title":"COBREXA.reaction_gene_association","text":"reaction_gene_association(model::StandardModel, id::String)\n\nReturn the gene reaction rule in string format for reaction with id in model. Return nothing if not available.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.reaction_notes-Tuple{StandardModel, String}","page":"Function reference","title":"COBREXA.reaction_notes","text":"reaction_notes(model::StandardModel, id::String)::Notes\n\nReturn the notes associated with reaction id in model. Return an empty Dict if not present.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.reaction_stoichiometry-Tuple{StandardModel, String}","page":"Function reference","title":"COBREXA.reaction_stoichiometry","text":"reaction_stoichiometry(model::StandardModel, rid::String)::Dict{String, Float64}\n\nReturn the stoichiometry of reaction with ID rid.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.reaction_subsystem-Tuple{StandardModel, String}","page":"Function reference","title":"COBREXA.reaction_subsystem","text":"reaction_subsystem(id::String, model::StandardModel)\n\nReturn the subsystem associated with reaction id in model. Return nothing if not present.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.reactions-Tuple{StandardModel}","page":"Function reference","title":"COBREXA.reactions","text":"reactions(model::StandardModel)\n\nReturn a vector of reaction id strings contained in model. The order of reaction ids returned here matches the order used to construct the stoichiometric matrix.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.stoichiometry-Tuple{StandardModel}","page":"Function reference","title":"COBREXA.stoichiometry","text":"stoichiometry(model::StandardModel)\n\nReturn the stoichiometric matrix associated with model in sparse format.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.upper_bounds-Tuple{StandardModel}","page":"Function reference","title":"COBREXA.upper_bounds","text":"upper_bounds(model::StandardModel)\n\nReturn the upper bounds for all reactions in model in sparse format. Order matches that of the reaction ids returned in reactions().\n\n\n\n\n\n","category":"method"},{"location":"functions/#Base-functions","page":"Function reference","title":"Base functions","text":"","category":"section"},{"location":"functions/","page":"Function reference","title":"Function reference","text":"Modules = [COBREXA]\nPages = map(file -> joinpath(\"base\", file), readdir(\"../src/base\"))","category":"page"},{"location":"functions/#COBREXA._constants","page":"Function reference","title":"COBREXA._constants","text":"A named tuple that contains the magic values that are used globally for whatever purposes.\n\n\n\n\n\n","category":"constant"},{"location":"functions/#COBREXA.get_optmodel_bounds-Tuple{Any}","page":"Function reference","title":"COBREXA.get_optmodel_bounds","text":"get_optmodel_bounds(opt_model)\n\nReturns vectors of the lower and upper bounds of opt_model constraints, where opt_model is a JuMP model constructed by e.g. make_optimization_model or flux_balance_analysis.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.is_solved-Tuple{Any}","page":"Function reference","title":"COBREXA.is_solved","text":"is_solved(optmodel)\n\nReturn true if optmodel solved successfully (solution is optimal or locally optimal).  Return false if any other termination status is reached. Termination status is defined in the documentation of JuMP.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.make_optimization_model-Tuple{MetabolicModel, Any}","page":"Function reference","title":"COBREXA.make_optimization_model","text":"make_optimization_model(\n    model::MetabolicModel,\n    optimizer;\n    sense = MOI.MAX_SENSE,\n)\n\nConvert MetabolicModels to a JuMP model, place objectives and the equality constraint.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.optimize_objective-Tuple{Any}","page":"Function reference","title":"COBREXA.optimize_objective","text":"optimize_objective(optmodel)::Union{Float64,Nothing}\n\nShortcut for running JuMP optimize! on a model and returning the objective value, if solved.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.set_optmodel_bound!-Tuple{Any, Any}","page":"Function reference","title":"COBREXA.set_optmodel_bound!","text":"set_optmodel_bound!(index, optimization_model;\n    ub=_constants.default_reaction_rate,\n    lb=-_constants.default_reaction_rate)\n\nHelper function to set the bounds of variables. The JuMP set_normalized_rhs function is a little confusing, so this function simplifies setting constraints. In short, JuMP uses a normalized right hand side representation of constraints, which means that lower bounds have their sign flipped. This function does this for you, so you don't have to remember to do this whenever you change the constraints.\n\nJust supply the constraint index and the JuMP model (opt_model) that will be solved, and the variable's bounds will be set to ub and lb.\n\n\n\n\n\n","category":"method"},{"location":"functions/#File-I/O-and-serialization","page":"Function reference","title":"File I/O and serialization","text":"","category":"section"},{"location":"functions/","page":"Function reference","title":"Function reference","text":"Modules = [COBREXA]\nPages = map(file -> joinpath(\"io\", file), readdir(\"../src/io\"))","category":"page"},{"location":"functions/#COBREXA.load_model-Tuple{String}","page":"Function reference","title":"COBREXA.load_model","text":"load_model(file_name::String)::MetabolicModel\n\nGeneric function for loading models that chooses a specific loader function from the file_name extension, or throws an error.\n\nCurrently, these model types are supported:\n\nSBML models (*.xml, loaded with load_sbml_model)\nJSON models (*.json, loaded with load_json_model)\nMATLAB models (*.mat, loaded with load_mat_model)\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.load_model-Union{Tuple{T}, Tuple{Type{T}, String}} where T<:MetabolicModel","page":"Function reference","title":"COBREXA.load_model","text":"load_model(type::Type{T}, file_name::String)::T where T\n\nHelper function tht loads the model using load_model and return it converted to type.\n\nExample:\n\nload_model(CoreModel, \"mySBMLModel.xml\")\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.save_model-Tuple{MetabolicModel, String}","page":"Function reference","title":"COBREXA.save_model","text":"save_model(model::MetabolicModel, file_name::String)\n\nGeneric function for saving models that chooses a specific writer function from the file_name extension, or throws an error.\n\nCurrently, these model types are supported:\n\nJSON models (*.json, loaded with save_json_model)\nMATLAB models (*.mat, loaded with save_mat_model)\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.load_json_model-Tuple{String}","page":"Function reference","title":"COBREXA.load_json_model","text":"load_json_model(filename::String)::JSONModel\n\nLoad and return a JSON-formatted model that is stored in file_name.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.save_json_model-Tuple{MetabolicModel, String}","page":"Function reference","title":"COBREXA.save_json_model","text":"save_json_model(model::MetabolicModel, file_name::String)\n\nSave a JSONModel in model to a JSON file file_name.\n\nIn case the model is not JSONModel, it will be converted automatically.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.load_mat_model-Tuple{String}","page":"Function reference","title":"COBREXA.load_mat_model","text":"load_mat_model(file_name::String)\n\nLoad and return a MATLAB file file_name that contains a COBRA-compatible model.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.save_mat_model-Tuple{MetabolicModel, String}","page":"Function reference","title":"COBREXA.save_mat_model","text":"save_mat_model(model::MetabolicModel, file_name::String; model_name::String=\"model\")\n\nSave a MATModel in model to a MATLAB file file_name in a format compatible with other MATLAB-based COBRA software.\n\nIn case the model is not MATModel, it will be converted automatically.\n\nmodel_name is the identifier name for the whole model written to the MATLAB file; defaults to just \"model\".\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.load_sbml_model-Tuple{String}","page":"Function reference","title":"COBREXA.load_sbml_model","text":"load_sbml_model(file_name::String)::SBMLModel\n\nLoad and return a SBML XML model in file_name.\n\n\n\n\n\n","category":"method"},{"location":"functions/#Pretty-printing","page":"Function reference","title":"Pretty printing","text":"","category":"section"},{"location":"functions/","page":"Function reference","title":"Function reference","text":"Modules = [COBREXA]\nPages = map(file -> joinpath(\"io\", \"show\", file), readdir(\"../src/io/show\"))","category":"page"},{"location":"functions/#Base.show-Tuple{IO, MIME{Symbol(\"text/plain\")}, MetabolicModel}","page":"Function reference","title":"Base.show","text":"Pretty printing of everything metabolic-modelish.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA._pretty_substances-Tuple{Vector{String}}","page":"Function reference","title":"COBREXA._pretty_substances","text":"_pretty_substances(ss::Vector{String})::String\n\nNicely format a substance list.\n\n\n\n\n\n","category":"method"},{"location":"functions/#Base.show-Union{Tuple{M}, Tuple{IO, MIME{Symbol(\"text/plain\")}, Serialized{M}}} where M","page":"Function reference","title":"Base.show","text":"Base.show(io::IO, ::MIME\"text/plain\", m::Serialized{M}) where {M}\n\nShow the Serialized model without unnecessarily loading it.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA._pretty_print_keyvals-Tuple{Any, String, Any}","page":"Function reference","title":"COBREXA._pretty_print_keyvals","text":"_pretty_print_keyvals(io, def::String, payload; kwargs...)\n\nNicely prints keys and values.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA._pretty_print_keyvals-Tuple{Any, String, Dict}","page":"Function reference","title":"COBREXA._pretty_print_keyvals","text":"_pretty_print_keyvals(\n    io,\n    def::String,\n    payload::Dict\n)\n\nSpecialization of _pretty_print_keyvals for dictionaries.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA._pretty_print_keyvals-Tuple{Any, String, String}","page":"Function reference","title":"COBREXA._pretty_print_keyvals","text":"_pretty_print_keyvals(\n    io,\n    def::String,\n    payload::String\n)\n\nSpecialization of _pretty_print_keyvals for plain strings.\n\n\n\n\n\n","category":"method"},{"location":"functions/#Model-reconstruction","page":"Function reference","title":"Model reconstruction","text":"","category":"section"},{"location":"functions/","page":"Function reference","title":"Function reference","text":"Modules = [COBREXA]\nPages = map(file -> joinpath(\"reconstruction\", file), readdir(\"../src/reconstruction\"))","category":"page"},{"location":"functions/#COBREXA.add_reactions-Tuple{CoreModel, CoreModel}","page":"Function reference","title":"COBREXA.add_reactions","text":"add_reactions(m1::CoreModel, m2::CoreModel; check_consistency = false)\n\nAdd all reactions from m2 to m1.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.add_reactions-Union{Tuple{K}, Tuple{V2}, Tuple{V1}, Tuple{CoreModel, V1, V2, AbstractFloat, AbstractFloat, AbstractFloat, String, K}} where {V1<:AbstractVector{Float64}, V2<:AbstractVector{Float64}, K<:AbstractVector{String}}","page":"Function reference","title":"COBREXA.add_reactions","text":"add_reactions(\n    m::CoreModel,\n    s::V1,\n    b::V2,\n    c::AbstractFloat,\n    xl::AbstractFloat,\n    xu::AbstractFloat,\n    rxn::String,\n    mets::K;\n    check_consistency = false,\n) where {V1<:VecType,V2<:VecType,K<:StringVecType}\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.add_reactions-Union{Tuple{K}, Tuple{V}, Tuple{M}, Tuple{CoreModel, M, V, V, V, V, K, K}} where {M<:AbstractMatrix{Float64}, V<:AbstractVector{Float64}, K<:AbstractVector{String}}","page":"Function reference","title":"COBREXA.add_reactions","text":"add_reactions(\n    m::CoreModel,\n    Sp::M,\n    b::V,\n    c::V,\n    xl::V,\n    xu::V,\n    rxns::K,\n    mets::K;\n    check_consistency = false,\n) where {M<:MatType,V<:VecType,K<:StringVecType}\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.add_reactions-Union{Tuple{V2}, Tuple{V1}, Tuple{CoreModel, V1, V2, AbstractFloat, AbstractFloat, AbstractFloat}} where {V1<:AbstractVector{Float64}, V2<:AbstractVector{Float64}}","page":"Function reference","title":"COBREXA.add_reactions","text":"add_reactions(\n    m::CoreModel,\n    s::V1,\n    b::V2,\n    c::AbstractFloat,\n    xl::AbstractFloat,\n    xu::AbstractFloat;\n    check_consistency = false,\n) where {V1<:VecType,V2<:VecType}\n\nAdd reaction(s) to a CoreModel model m.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.add_reactions-Union{Tuple{V}, Tuple{M}, Tuple{CoreModel, M, V, V, V, V}} where {M<:AbstractMatrix{Float64}, V<:AbstractVector{Float64}}","page":"Function reference","title":"COBREXA.add_reactions","text":"add_reactions(\n    m::CoreModel,\n    Sp::M,\n    b::V,\n    c::V,\n    xl::V,\n    xu::V;\n    check_consistency = false,\n) where {M<:MatType,V<:VecType}\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.remove_metabolites-Tuple{CoreModel, Any}","page":"Function reference","title":"COBREXA.remove_metabolites","text":"remove_metabolites(model::CoreModel, metabolites)\n\nRemoves a set of metabolites from the model of type CoreModel and returns a new CoreModel without those metabolites. Here, metabolites can be either a string, a vector of strings, an index or a vector of indices. Also removes any reactions that have no associated metabolites after the metabolites have been removed.\n\nExample\n\nmodel = load_model(CoreModel, \"e_coli_core.json\")\n\nm1 = remove_metabolites(model, [\"glc__D_e\", \"for_c\"])\nm2 = remove_metabolites(model, \"glc__D_e\")\nm3 = remove_metabolites(model, indexin([\"glc__D_e\", \"for_c\"], metabolites(model)))\nm4 = remove_metabolites(model, first(indexin([\"glc__D_e\"], metabolites(model))))\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.remove_reactions-Tuple{CoreModel, Int64}","page":"Function reference","title":"COBREXA.remove_reactions","text":"remove_reactions(m::CoreModel, rxn::Int)\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.remove_reactions-Tuple{CoreModel, String}","page":"Function reference","title":"COBREXA.remove_reactions","text":"remove_reactions(m::CoreModel, rxn::String)\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.remove_reactions-Tuple{CoreModel, Vector{Int64}}","page":"Function reference","title":"COBREXA.remove_reactions","text":"remove_reactions(m::CoreModel, rxns::Vector{Int})\n\nRemoves a set of reactions from a CoreModel. Also removes the metabolites not involved in any reaction.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.remove_reactions-Tuple{CoreModel, Vector{String}}","page":"Function reference","title":"COBREXA.remove_reactions","text":"remove_reactions(m::CoreModel, rxns::Vector{String})\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.verify_consistency-Union{Tuple{K}, Tuple{V}, Tuple{M}, Tuple{CoreModel, M, V, V, V, V, K, K, Any, Any}} where {M<:AbstractMatrix{Float64}, V<:AbstractVector{Float64}, K<:AbstractVector{String}}","page":"Function reference","title":"COBREXA.verify_consistency","text":"verify_consistency(\n    m::CoreModel,\n    Sp::M,\n    b::V,\n    c::V,\n    xl::V,\n    xu::V,\n    names::K,\n    mets::K,\n    new_reactions,\n    new_metabolites,\n) where {M<:MatType,V<:VecType,K<:StringVecType}\n\nCheck the consistency of given reactions with existing reactions in m.\n\nTODO: work in progress, doesn't return consistency status.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.add_coupling_constraints!-Tuple{CoreModelCoupled, AbstractVector{Float64}, AbstractFloat, AbstractFloat}","page":"Function reference","title":"COBREXA.add_coupling_constraints!","text":"add_coupling_constraints!(\n    m::CoreModelCoupled,\n    c::VecType,\n    cl::AbstractFloat,\n    cu::AbstractFloat,\n)\n\nOverload for adding a single coupling constraint.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.add_coupling_constraints!-Union{Tuple{V}, Tuple{CoreModelCoupled, AbstractMatrix{Float64}, V, V}} where V<:AbstractVector{Float64}","page":"Function reference","title":"COBREXA.add_coupling_constraints!","text":"add_coupling_constraints!(\n    m::CoreModelCoupled,\n    C::MatType,\n    cl::V,\n    cu::V,\n) where {V<:VecType}\n\nIn-place add a single coupling constraint in form\n\n    cₗ ≤ C x ≤ cᵤ\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.add_coupling_constraints-Tuple{CoreModel, Vararg{Any, N} where N}","page":"Function reference","title":"COBREXA.add_coupling_constraints","text":"add_coupling_constraints(m::CoreModel, args...)\n\nAdd coupling constraints to a plain CoreModel (returns a CoreModelCoupled).\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.add_coupling_constraints-Tuple{CoreModelCoupled, Vararg{Any, N} where N}","page":"Function reference","title":"COBREXA.add_coupling_constraints","text":"Add constraints of the following form to a CoreModelCoupled and return a modified one.\n\nAdd constraints to a CoreModelCoupled and return a modified one.\n\nThe arguments are same as for in-place add_coupling_constraints!.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.add_reactions-Tuple{CoreModelCoupled, CoreModel}","page":"Function reference","title":"COBREXA.add_reactions","text":"add_reactions(m1::CoreModelCoupled, m2::CoreModel; check_consistency = false)\n\nAdd all reactions from m2 to m1.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.add_reactions-Union{Tuple{K}, Tuple{V2}, Tuple{V1}, Tuple{CoreModelCoupled, V1, V2, AbstractFloat, AbstractFloat, AbstractFloat, String, K}} where {V1<:AbstractVector{Float64}, V2<:AbstractVector{Float64}, K<:AbstractVector{String}}","page":"Function reference","title":"COBREXA.add_reactions","text":"add_reactions(\n    m::CoreModelCoupled,\n    s::V1,\n    b::V2,\n    c::AbstractFloat,\n    xl::AbstractFloat,\n    xu::AbstractFloat,\n    rxn::String,\n    mets::K;\n    check_consistency = false,\n) where {V1<:VecType,V2<:VecType,K<:StringVecType}\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.add_reactions-Union{Tuple{K}, Tuple{V}, Tuple{M}, Tuple{CoreModelCoupled, M, V, V, V, V, K, K}} where {M<:AbstractMatrix{Float64}, V<:AbstractVector{Float64}, K<:AbstractVector{String}}","page":"Function reference","title":"COBREXA.add_reactions","text":"add_reactions(\n    m::CoreModelCoupled,\n    Sp::M,\n    b::V,\n    c::V,\n    xl::V,\n    xu::V,\n    rxns::K,\n    mets::K;\n    check_consistency = false,\n) where {M<:MatType,V<:VecType,K<:StringVecType}\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.add_reactions-Union{Tuple{V2}, Tuple{V1}, Tuple{CoreModelCoupled, V1, V2, AbstractFloat, AbstractFloat, AbstractFloat}} where {V1<:AbstractVector{Float64}, V2<:AbstractVector{Float64}}","page":"Function reference","title":"COBREXA.add_reactions","text":"add_reactions(\n    m::CoreModelCoupled,\n    s::V1,\n    b::V2,\n    c::AbstractFloat,\n    xl::AbstractFloat,\n    xu::AbstractFloat;\n    check_consistency = false,\n) where {V1<:VecType,V2<:VecType}\n\nAdd reaction(s) to a CoreModelCoupled model m.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.add_reactions-Union{Tuple{V}, Tuple{M}, Tuple{CoreModelCoupled, M, V, V, V, V}} where {M<:AbstractMatrix{Float64}, V<:AbstractVector{Float64}}","page":"Function reference","title":"COBREXA.add_reactions","text":"add_reactions(\n    m::CoreModelCoupled,\n    Sp::M,\n    b::V,\n    c::V,\n    xl::V,\n    xu::V;\n    check_consistency = false,\n) where {M<:MatType,V<:VecType}\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.change_coupling_bounds!-Union{Tuple{V}, Tuple{CoreModelCoupled, Vector{Int64}}} where V<:AbstractVector{Float64}","page":"Function reference","title":"COBREXA.change_coupling_bounds!","text":"change_coupling_bounds!(\n    model::CoreModelCoupled,\n    constraints::Vector{Int};\n    cl::V = Float64[],\n    cu::V = Float64[],\n) where {V<:VecType}\n\nChange the lower and/or upper bounds (cl and cu) for the given list of coupling constraints.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.remove_coupling_constraints!-Tuple{CoreModelCoupled, Int64}","page":"Function reference","title":"COBREXA.remove_coupling_constraints!","text":"remove_coupling_constraints!(m::CoreModelCoupled, constraint::Int)\n\nRemoves a single coupling constraints from a CoreModelCoupled in-place.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.remove_coupling_constraints!-Tuple{CoreModelCoupled, Vector{Int64}}","page":"Function reference","title":"COBREXA.remove_coupling_constraints!","text":"remove_coupling_constraints!(m::CoreModelCoupled, constraints::Vector{Int})\n\nRemoves a set of coupling constraints from a CoreModelCoupled in-place.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.remove_coupling_constraints-Tuple{CoreModelCoupled, Vararg{Any, N} where N}","page":"Function reference","title":"COBREXA.remove_coupling_constraints","text":"remove_coupling_constraints(m::CoreModelCoupled, args...)\n\nRemove coupling constraints from the linear model, and return the modified model. Arguments are the same as for in-place version remove_coupling_constraints!.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.remove_reactions-Tuple{CoreModelCoupled, Int64}","page":"Function reference","title":"COBREXA.remove_reactions","text":"remove_reactions(m::CoreModelCoupled, rxn::Int)\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.remove_reactions-Tuple{CoreModelCoupled, String}","page":"Function reference","title":"COBREXA.remove_reactions","text":"remove_reactions(m::CoreModelCoupled, rxn::String)\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.remove_reactions-Tuple{CoreModelCoupled, Vector{Int64}}","page":"Function reference","title":"COBREXA.remove_reactions","text":"remove_reactions(m::CoreModelCoupled, rxns::Vector{Int})\n\nRemove reaction(s) from a CoreModelCoupled.\n\nAlso removes any metabolites not involved in any reaction after the deletion.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.remove_reactions-Tuple{CoreModelCoupled, Vector{String}}","page":"Function reference","title":"COBREXA.remove_reactions","text":"remove_reactions(m::CoreModelCoupled, rxns::Vector{String})\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.:←-Tuple{Union{Nothing, Metabolite, MetaboliteWithCoefficient, Vector{MetaboliteWithCoefficient}}, Union{Nothing, Metabolite, MetaboliteWithCoefficient, Vector{MetaboliteWithCoefficient}}}","page":"Function reference","title":"COBREXA.:←","text":"←(\n    substrates::Union{\n        Nothing,\n        Metabolite,\n        MetaboliteWithCoefficient,\n        Vector{MetaboliteWithCoefficient},\n    },\n    products::Union{\n        Nothing,\n        Metabolite,\n        MetaboliteWithCoefficient,\n        Vector{MetaboliteWithCoefficient}\n    },\n)\n\nMake a reverse-only Reaction from substrates and products.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.:→-Tuple{Union{Nothing, Metabolite, MetaboliteWithCoefficient, Vector{MetaboliteWithCoefficient}}, Union{Nothing, Metabolite, MetaboliteWithCoefficient, Vector{MetaboliteWithCoefficient}}}","page":"Function reference","title":"COBREXA.:→","text":"→(\n    substrates::Union{\n        Nothing,\n        Metabolite,\n        MetaboliteWithCoefficient,\n        Vector{MetaboliteWithCoefficient},\n    },\n    products::Union{\n        Nothing,\n        Metabolite,\n        MetaboliteWithCoefficient,\n        Vector{MetaboliteWithCoefficient}\n    },\n)\n\nMake a forward-only Reaction from substrates and products.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.:↔-Tuple{Union{Nothing, Metabolite, MetaboliteWithCoefficient, Vector{MetaboliteWithCoefficient}}, Union{Nothing, Metabolite, MetaboliteWithCoefficient, Vector{MetaboliteWithCoefficient}}}","page":"Function reference","title":"COBREXA.:↔","text":"↔(\n    substrates::Union{\n        Nothing,\n        Metabolite,\n        MetaboliteWithCoefficient,\n        Vector{MetaboliteWithCoefficient},\n    },\n    products::Union{\n        Nothing,\n        Metabolite,\n        MetaboliteWithCoefficient,\n        Vector{MetaboliteWithCoefficient}\n    },\n)\n\nMake a bidirectional (reversible) Reaction from substrates and products.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.add_gene!-Tuple{StandardModel, Gene}","page":"Function reference","title":"COBREXA.add_gene!","text":"add_gene!(model::StandardModel, genes::Gene)\n\nAdd gene to model based on gene id.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.add_genes!-Tuple{StandardModel, Vector{Gene}}","page":"Function reference","title":"COBREXA.add_genes!","text":"add_genes!(model::StandardModel, genes::Vector{Gene})\n\nAdd genes to model based on gene id.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.add_metabolite!-Tuple{StandardModel, Metabolite}","page":"Function reference","title":"COBREXA.add_metabolite!","text":"add_metabolite!(model::StandardModel, met::Metabolite)\n\nAdd met to model based on metabolite id.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.add_metabolites!-Tuple{StandardModel, Vector{Metabolite}}","page":"Function reference","title":"COBREXA.add_metabolites!","text":"add_metabolites!(model::StandardModel, mets::Vector{Metabolite})\n\nAdd mets to model based on metabolite id.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.add_reaction!-Tuple{StandardModel, Reaction}","page":"Function reference","title":"COBREXA.add_reaction!","text":"add_reaction!(model::StandardModel, rxn::Reaction)\n\nAdd rxn to model based on reaction id.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.add_reactions!-Tuple{StandardModel, Vector{Reaction}}","page":"Function reference","title":"COBREXA.add_reactions!","text":"add_reactions!(model::StandardModel, rxns::Vector{Reaction})\n\nAdd rxns to model based on reaction id.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.remove_gene!-Tuple{StandardModel, String}","page":"Function reference","title":"COBREXA.remove_gene!","text":"remove_gene!(\n    model::StandardModel,\n    id::Vector{String};\n    knockout_reactions::Bool = false,\n)\n\nRemove gene with id from model. If knockout_reactions is true, then also constrain reactions that require the genes to function to carry zero flux.\n\nExample\n\nremove_gene!(model, \"g1\")\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.remove_genes!-Tuple{StandardModel, Vector{String}}","page":"Function reference","title":"COBREXA.remove_genes!","text":"remove_genes!(\n    model::StandardModel,\n    ids::Vector{String};\n    knockout_reactions::Bool = false,\n)\n\nRemove all genes with ids from model. If knockout_reactions is true, then also constrain reactions that require the genes to function to carry zero flux.\n\nExample\n\nremove_genes!(model, [\"g1\", \"g2\"])\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.remove_metabolite!-Tuple{StandardModel, String}","page":"Function reference","title":"COBREXA.remove_metabolite!","text":"remove_metabolite!(model::StandardModel, id::String)\n\nRemove metabolite with id from model. Warning, this could leave the model inconsistent, e.g. a reaction might require the deleted metabolite, in which case analysis functions will error.\n\nExample\n\nremove_metabolite!(model, \"atp_c\")\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.remove_metabolites!-Tuple{StandardModel, Vector{String}}","page":"Function reference","title":"COBREXA.remove_metabolites!","text":"remove_metabolites!(model::StandardModel, ids::Vector{String})\n\nRemove all metabolites with ids from model. Warning, this could leave the model inconsistent, e.g. a reaction might require the deleted metabolite, in which case analysis functions will error.\n\nExample\n\nremove_metabolites!(model, [\"atp_c\", \"adp_c\"])\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.remove_reaction!-Tuple{StandardModel, String}","page":"Function reference","title":"COBREXA.remove_reaction!","text":"remove_reaction!(model::StandardModel, id::String)\n\nRemove reaction with id from model. Note, may result in orphan metabolites.\n\nExample\n\nremove_reaction!(model, \"EX_glc__D_e\")\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.remove_reactions!-Tuple{StandardModel, Vector{String}}","page":"Function reference","title":"COBREXA.remove_reactions!","text":"remove_reactions!(model::StandardModel, ids::Vector{String})\n\nRemove all reactions with ids from model. Note, may result in orphan metabolites.\n\nExample\n\nremove_reactions!(model, [\"EX_glc__D_e\", \"fba\"])\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.@add_reactions!-Tuple{Symbol, Expr}","page":"Function reference","title":"COBREXA.@add_reactions!","text":"@add_reactions!(model::Symbol, ex::Expr)\n\nShortcut to add multiple reactions and their lower and upper bounds\n\nCall variants\n\n@add_reactions! model begin\n    reaction_name, reaction\nend\n\n@add_reactions! model begin\n    reaction_name, reaction, lower_bound\nend\n\n@add_reactions! model begin\n    reaction_name, reaction, lower_bound, upper_bound\nend\n\nExamples\n\n@add_reactions! model begin\n    \"v1\", nothing → A, 0, 500\n    \"v2\", A ↔ B + C, -500\n    \"v3\", B + C → nothing\nend\n\n\n\n\n\n","category":"macro"},{"location":"functions/#COBREXA.add_model_with_exchanges-Tuple{CoreModel, MetabolicModel, Vector{String}, Vector{String}}","page":"Function reference","title":"COBREXA.add_model_with_exchanges","text":"add_model_with_exchanges(\n    community::CoreModel,\n    model::MetabolicModel,\n    exchange_rxn_ids::Vector{String},\n    exchange_met_ids::Vector{String};\n    model_name = \"unknown_species\",\n    biomass_id = nothing,\n)::CoreModel\n\nAdd model to community, which is a pre-existing community model with exchange_rxn_ids and exchange_met_ids. The model_name is appended to each reaction and metabolite, see join_with_exchanges. If biomass_id is specified then a biomass metabolite for model is also added to the resulting model. The column corresponding to the biomass_id reaction then produces this new biomass metabolite with unit coefficient. Note, exchange_rxn_ids and exchange_met_ids must already exist in the community model.\n\nExample\n\ncommunity = add_model_with_exchanges(community, model, exchange_rxn_ids, exchange_met_ids; model_name=\"species_2\", biomass_id=\"BIOMASS_Ecoli_core_w_GAM\")\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.add_objective!-Tuple{CoreModel, Vector{String}}","page":"Function reference","title":"COBREXA.add_objective!","text":"add_objective!(\n    community::CoreModel,\n    objective_mets::Vector{String};\n    objective_weights = Float64[],\n    objective_column_index = 0,\n)\n\nAdd an objective to the community model. Supply the string names of the objective metabolites in objective_mets. Optionally specify the weight to assign each metabolite in the objective function, if unassigned then equal weight is assumed. Also, optionally specify whether the objective already exists in the model by assigning objective_column_index. If unassigned then an objective column will be added, otherwise the column at objective_column_index will be updated.\n\nNote, the weights are negated inside the function so that the objective metabolites are seen as reagents/substrates, not products in the reaction equation.\n\nExample\n\nadd_objective!(model, [\"met1\", \"met2\"]) # adds a new column with weights = [1,1]\nadd_objective!(model, [\"met1\", \"met2\"]; objective_weights=[0.1, 0.9]) # adds a new column\nadd_objective!(model, [\"met1\", \"met2\"]; objective_weights=[0.1, 0.9], objective_column_index=10) # updates column 10\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.join_with_exchanges-Union{Tuple{M}, Tuple{Vector{M}, Vector{String}, Vector{String}}} where M<:MetabolicModel","page":"Function reference","title":"COBREXA.join_with_exchanges","text":"join_with_exchanges(models::Vector{M},\n    exchange_rxn_ids::Vector{String},\n    exchange_met_ids::Vector{String};\n    add_biomass_objective=false,\n    biomass_ids::Vector{String},\n    model_names=String[]\n)\n\nReturn a CoreModel representing the community model of models joined through their exchange_rxn_ids and exchange_met_ids. These exchange reactions and metabolites link to environmental metabolites and reactions. Optionally specify model_names to append a specific name to each reaction and metabolite of an organism for easier reference (default is species_i for each model index i in models). Note, the bounds of the environmental variables are all set to zero. Thus, to run a simulation you need to constrain them appropriately. All the other bounds are inherited from the models used to construct the community model.\n\nIf add_biomass_objective is true then biomass_ids needs to be supplied as well. This creates a model with an extra reaction added to the end of the stoichiometric matrix (last column) that can be assigned as the objective reaction. It also creates biomass \"metabolites\" that can be used in this objective reaction. Note, this reaction is unspecified, further action needs to be taken to specify it, e.g. assign weights to the last column of the stoichiometric matrix in the rows corresponding to the biomass metabolites.\n\nTo further clarify how this join works. Suppose you have 2 organisms with stoichiometric matrices S₁ and S₂ and you want to link them with exchange_met_ids = [em₁, em₂, em₃, ...] and exchange_rxn_ids = [er₁, er₂, er₃, ...]. Then a new community stoichiometric matrix is constructed that looks like this:\n\n            _      er₁  er₂  er₃  ...  b_\n           |S₁                           |\n           |   S₂                        |\n        em₁|                             |\nS   =   em₂|                             |\n        em₃|                             |\n        ...|                             |\n        bm₁|                             |\n        bm₂|_                           _|\n\n\nThe exchange reactions in each model get linked to environmental metabolites, emᵢ, and these get linked to environmental exchanges, erᵢ. These erᵢ behave like normal single organism exchange reactions. When add_biomass_objective is true each model's biomass becomes a pseudo-metabolite (bmᵢ). These can be weighted in column b, called the community_biomass reaction in the community model, if desired. Refer to the tutorial if this is unclear.\n\nExample\n\nm1 = load_model(core_model_path)\nm2 = load_model(CoreModel, core_model_path)\n\n# need to list ALL the exchanges that will form part of the entire model\nexchange_rxn_ids = filter(looks_like_exchange_reaction, reactions(m1))\nexchange_met_ids = [first(keys(reaction_stoichiometry(m1, ex_rxn))) for ex_rxn in exchange_rxn_ids]\n\nbiomass_ids = [\"BIOMASS_Ecoli_core_w_GAM\", \"BIOMASS_Ecoli_core_w_GAM\"]\n\ncommunity = join_with_exchanges(\n    [m1, m2],\n    exchange_rxn_ids,\n    exchange_met_ids;\n    add_biomass_objective = true,\n    biomass_ids = biomass_ids,\n)\n\n\n\n\n\n","category":"method"},{"location":"functions/#Model-variant-specifications","page":"Function reference","title":"Model variant specifications","text":"","category":"section"},{"location":"functions/","page":"Function reference","title":"Function reference","text":"Modules = [COBREXA]\nPages = map(file -> joinpath(\"reconstruction\", \"modifications\", file), readdir(\"../src/reconstruction/modifications\"))","category":"page"},{"location":"functions/#COBREXA.with_added_reactions-Tuple","page":"Function reference","title":"COBREXA.with_added_reactions","text":"with_added_reactions(args...; kwargs...)\n\nSpecifies a model variant with reactions added. Forwards the arguments to add_reactions. Intended to be used with screen.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.with_changed_bound-Tuple","page":"Function reference","title":"COBREXA.with_changed_bound","text":"with_changed_bound(args...; kwargs...)\n\nSpecifies a model variant that has a new bound set. Forwards arguments to change_bound. Intended for usage with screen.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.with_changed_bounds-Tuple","page":"Function reference","title":"COBREXA.with_changed_bounds","text":"with_changed_bounds(args...; kwargs...)\n\nSpecifies a model variant that has new bounds set. Forwards arguments to change_bounds. Intended for usage with screen.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.with_removed_metabolites-Tuple","page":"Function reference","title":"COBREXA.with_removed_metabolites","text":"with_removed_metabolites(args...; kwargs...)\n\nSpecifies a model variant without specified metabolites. Forwards arguments to remove_metabolites. Intended to be used with screen.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.with_removed_reactions-Tuple","page":"Function reference","title":"COBREXA.with_removed_reactions","text":"with_removed_reactions(args...; kwargs...)\n\nSpecifies a model variant with specified reactions removed. Forwards arguments to remove_reactions. Intended to be used with screen.\n\n\n\n\n\n","category":"method"},{"location":"functions/#Analysis-functions","page":"Function reference","title":"Analysis functions","text":"","category":"section"},{"location":"functions/","page":"Function reference","title":"Function reference","text":"Modules = [COBREXA]\nPages = map(file -> joinpath(\"analysis\", file), readdir(\"../src/analysis\"))","category":"page"},{"location":"functions/#COBREXA.envelope_lattice-Tuple{MetabolicModel, Vector{Int64}}","page":"Function reference","title":"COBREXA.envelope_lattice","text":"envelope_lattice(\n    model::MetabolicModel,\n    ridxs::Vector{Int};\n    samples = 10,\n    ranges = collect(zip(bounds(model)...))[ridxs],\n    reaction_samples = fill(samples, length(ridxs)),\n)\n\nCreate a lattice (list of \"tick\" vectors) for reactions at indexes ridxs in a model. Arguments samples, ranges, and reaction_samples may be optionally specified to customize the latice creation process.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.envelope_lattice-Tuple{MetabolicModel, Vector{String}}","page":"Function reference","title":"COBREXA.envelope_lattice","text":"envelope_lattice(model::MetabolicModel, rids::Vector{String}; kwargs...)\n\nVersion of envelope_lattice that works on string reaction IDs instead of integer indexes.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.objective_envelope-Tuple{MetabolicModel, Vector{Int64}, Any}","page":"Function reference","title":"COBREXA.objective_envelope","text":"objective_envelope(\n    model::MetabolicModel,\n    ridxs::Vector{Int},\n    optimizer;\n    lattice = envelope_lattice(model, ridxs),\n    kwargs...,\n)\n\nCompute an array of objective values for the model for rates of reactions specified ridxs fixed to a regular range of values between their respective lower and upper bounds.\n\nThis can be used to compute a \"production envelope\" of a metabolite; but generalizes to any specifiable objective and to multiple dimensions of the examined space. To retrieve a production envelope of any metabolite, set the objective coefficient vector of the model to a vector that contains a single 1 for the exchange reaction that \"outputs\" this metabolite, and run objective_envelope with the exchange reaction of the \"parameter\" metabolite specified in ridxs.\n\nReturns a named tuple that contains lattice with reference values of the metabolites, and an N-dimensional array values with the computed objective values, where N is the number of specified reactions.  Because of the increasing dimensionality, the computation gets very voluminous with increasing length of ridxs.\n\nkwargs are internally forwarded to screen_optmodel_modifications.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.objective_envelope-Tuple{MetabolicModel, Vector{String}, Vararg{Any, N} where N}","page":"Function reference","title":"COBREXA.objective_envelope","text":"objective_envelope(model::MetabolicModel, rids::Vector{String}, args...; kwargs...)\n\nVersioin of objective_envelope that works on string reaction IDs instead of integer indexes.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.flux_balance_analysis-Union{Tuple{M}, Tuple{M, Any}} where M<:MetabolicModel","page":"Function reference","title":"COBREXA.flux_balance_analysis","text":"flux_balance_analysis(\n    model::M,\n    optimizer;\n    modifications = [],\n) where {M<:MetabolicModel}\n\nRun flux balance analysis (FBA) on the model optionally specifying modifications to the problem.  Basically, FBA solves this optimization problem:\n\nmax cᵀx\ns.t. S x = b\n     xₗ ≤ x ≤ xᵤ\n\nSee \"Orth, J., Thiele, I. & Palsson, B. What is flux balance analysis?. Nat Biotechnol 28, 245-248 (2010). https://doi.org/10.1038/nbt.1614\" for more information.\n\nThe optimizer must be set to a JuMP-compatible optimizer, such as GLPK.Optimizer or Tulip.Optimizer\n\nOptionally, you may specify one or more modifications to be applied to the model before the analysis, such as change_optimizer_attribute, change_objective, and change_sense.\n\nReturns an optimized JuMP model.\n\nExample\n\nmodel = load_model(\"e_coli_core.json\")\nsolution = flux_balance_analysis(model, GLPK.optimizer)\nvalue.(solution[:x])  # extract flux steady state from the optimizer\n\nbiomass_reaction_id = findfirst(model.reactions, \"BIOMASS_Ecoli_core_w_GAM\")\n\nmodified_solution = flux_balance_analysis(model, GLPK.optimizer;\n    modifications=[change_objective(biomass_reaction_id)])\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.flux_balance_analysis_dict-Tuple{MetabolicModel, Vararg{Any, N} where N}","page":"Function reference","title":"COBREXA.flux_balance_analysis_dict","text":"flux_balance_analysis_dict(model::MetabolicModel, args...)::Union{Dict{String, Float64},Nothing}\n\nA variant of FBA that returns a dictionary assigning fluxes to reactions, if the solution is found. Arguments are passed to flux_balance_analysis.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.flux_balance_analysis_vec-Tuple","page":"Function reference","title":"COBREXA.flux_balance_analysis_vec","text":"flux_balance_analysis_vec(args...)::Union{Vector{Float64},Nothing}\n\nA variant of FBA that returns a vector of fluxes in the same order as reactions of the model, if the solution is found.\n\nArguments are passed to flux_balance_analysis.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA._FVA_add_constraint-NTuple{4, Any}","page":"Function reference","title":"COBREXA._FVA_add_constraint","text":"_FVA_add_constraint(model, c, x, Z)\n\nInternal helper function for adding constraints to a model. Exists mainly because for avoiding namespace problems on remote workers.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA._FVA_optimize_reaction-Tuple{Any, Any, Any}","page":"Function reference","title":"COBREXA._FVA_optimize_reaction","text":"_FVA_get_opt(model, rid)\n\nInternal helper for creating the optimized model on a remote worker, for avoiding namespace problems.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.flux_variability_analysis-Tuple{MetabolicModel, Any}","page":"Function reference","title":"COBREXA.flux_variability_analysis","text":"flux_variability_analysis(\n    model::MetabolicModel,\n    optimizer;\n    kwargs...\n)\n\nA simpler version of flux_variability_analysis that maximizes and minimizes all reactions in the model. Arguments are forwarded.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.flux_variability_analysis-Tuple{MetabolicModel, Vector{Int64}, Any}","page":"Function reference","title":"COBREXA.flux_variability_analysis","text":"flux_variability_analysis(\n    model::MetabolicModel,\n    reactions::Vector{Int},\n    optimizer;\n    modifications = [],\n    workers = [myid()],\n    bounds = z -> (z,z),\n    ret = objective_value,\n)::Matrix{Float64}\n\nFlux variability analysis solves a pair of optimization problems in model for each flux listed in reactions:\n\n min,max xᵢ\ns.t. S x = b\n    xₗ ≤ x ≤ xᵤ\n     cᵀx ≥ bounds(Z₀)[1]\n     cᵀx ≤ bounds(Z₀)[2]\n\nwhere Z₀:= cᵀx₀ is the objective value of an optimal solution of the associated FBA problem (see flux_balance_analysis for a related analysis, also for explanation of the modifications argument).\n\nThe bounds is a user-supplied function that specifies the objective bounds for the variability optimizations, by default it restricts the flux objective value to the precise optimum reached in FBA. It can return -Inf and Inf in first and second pair to remove the limit. Use gamma_bounds and objective_bounds for simple bounds.\n\noptimizer must be set to a JuMP-compatible optimizer. The computation of the individual optimization problems is transparently distributed to workers (see Distributed.workers()).\n\nret is a function used to extract results from optimized JuMP models of the individual reactions. By default, it calls and returns the value of JuMP.objective_value. More information can be extracted e.g. by setting it to a function that returns a more elaborate data structure; such as m -> (JuMP.objective_value(m), JuMP.value.(m[:x])).\n\nReturns a matrix of extracted ret values for minima and maxima, of total size (length(reactions),2). The optimizer result status is checked with is_solved; nothing is returned if the optimization failed for any reason.\n\nExample\n\nmodel = load_model(\"e_coli_core.json\")\nflux_variability_analysis(model, [1, 2, 3, 42], GLPK.optimizer)\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.flux_variability_analysis_dict-Tuple{MetabolicModel, Any}","page":"Function reference","title":"COBREXA.flux_variability_analysis_dict","text":"flux_variability_analysis_dict(\n    model::MetabolicModel,\n    optimizer;\n    kwargs...\n)\n\nA variant of flux_variability_analysis that returns the individual maximized and minimized fluxes of all reactions as two dictionaries (of dictionaries). All keyword arguments except ret are passed through.\n\nExample\n\nmins, maxs = flux_variability_analysis_dict(\n    model,\n    Tulip.Optimizer;\n    bounds = objective_bounds(0.99),\n    modifications = [\n        change_optimizer_attribute(\"IPM_IterationsLimit\", 500),\n        change_constraint(\"EX_glc__D_e\", -10, -10),\n        change_constraint(\"EX_o2_e\", 0.0, 0.0),\n    ],\n)\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.parsimonious_flux_balance_analysis-Tuple{MetabolicModel, Any}","page":"Function reference","title":"COBREXA.parsimonious_flux_balance_analysis","text":"parsimonious_flux_balance_analysis(\n    model::MetabolicModel,\n    optimizer;\n    modifications = [],\n    qp_modifications = [],\n    relax_bounds=[1.0, 0.999999, 0.99999, 0.9999, 0.999, 0.99],\n)\n\nRun parsimonious flux balance analysis (pFBA) on the model. In short, pFBA runs two consecutive optimization problems. The first is traditional FBA:\n\nmax cᵀx = μ\ns.t. S x = b\n     xₗ ≤ x ≤ xᵤ\n\nAnd the second is a quadratic optimization problem:\n\nmin Σᵢ xᵢ²\ns.t. S x = b\n     xₗ ≤ x ≤ xᵤ\n     μ = μ⁰\n\nWhere the optimal solution of the FBA problem, μ⁰, has been added as an additional constraint. See \"Lewis, Nathan E, Hixson, Kim K, Conrad, Tom M, Lerman, Joshua A, Charusanti, Pep, Polpitiya, Ashoka D, Adkins, Joshua N, Schramm, Gunnar, Purvine, Samuel O, Lopez-Ferrer, Daniel, Weitz, Karl K, Eils, Roland, König, Rainer, Smith, Richard D, Palsson, Bernhard Ø, (2010) Omic data from evolved E. coli are consistent with computed optimal growth from genome-scale models. Molecular Systems Biology, 6. 390. doi: accession:10.1038/msb.2010.47\" for more details.\n\npFBA gets the model optimum by standard FBA (using flux_balance_analysis with optimizer and modifications), then finds a minimal total flux through the model that still satisfies the (slightly relaxed) optimum. This is done using a quadratic problem optimizer. If the original optimizer does not support quadratic optimization, it can be changed using the callback in qp_modifications, which are applied after the FBA. See the documentation of fluxbalanceanalysis for usage examples of modifications.\n\nThhe optimum relaxation sequence can be specified in relax parameter, it defaults to multiplicative range of [1.0, 0.999999, ..., 0.99] of the original bound.\n\nReturns an optimized model that contains the pFBA solution; or nothing if the optimization failed.\n\nExample\n\nmodel = load_model(\"e_coli_core.json\")\noptmodel = parsimonious_flux_balance_analysis(model, biomass, Gurobi.Optimizer)\nvalue.(solution[:x])  # extract the flux from the optimizer\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.parsimonious_flux_balance_analysis_dict-Tuple{MetabolicModel, Vararg{Any, N} where N}","page":"Function reference","title":"COBREXA.parsimonious_flux_balance_analysis_dict","text":"parsimonious_flux_balance_analysis_dict(model::MetabolicModel, args...; kwargs...)\n\nPerform parsimonious flux balance analysis on model using optimizer. Returns a dictionary mapping the reaction IDs to fluxes. Arguments are forwarded to parsimonious_flux_balance_analysis internally.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.parsimonious_flux_balance_analysis_vec-Tuple","page":"Function reference","title":"COBREXA.parsimonious_flux_balance_analysis_vec","text":"parsimonious_flux_balance_analysis_vec(args...; kwargs...)\n\nPerform parsimonious flux balance analysis on model using optimizer. Returns a vector of fluxes in the same order as the reactions in model. Arguments are forwarded to parsimonious_flux_balance_analysis internally.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.screen-Union{Tuple{MetabolicModel}, Tuple{N}, Tuple{T}, Tuple{V}} where {V<:(AbstractVector{T} where T), T<:Tuple, N}","page":"Function reference","title":"COBREXA.screen","text":"function screen(\n    model::MetabolicModel;\n    variants::Maybe{Array{V,N}} = nothing,\n    analysis,\n    args::Maybe{Array{T,N}} = nothing,\n    workers = [myid()],\n)::Array where {V<:AbstractVector, T<:Tuple,N}\n\nTake an array of model-modifying function vectors in variants, and execute the function analysis on all variants of the model specified by variants. The computation is distributed over worker IDs in workers. If args are supplied (as an array of the same size as the variants), they are forwarded as arguments to the corresponding analysis function calls.\n\nThe array of variants must contain vectors of single-parameter functions, these are applied to model in order. The functions must not modify the model, but rather return a modified copy. The copy should be made as shallow as possible, to increase memory efficiency of the process. Variant generators that modify the argument model in-place will cause unpredictable results. Refer to the definition of screen_variant for details.\n\nThe function analysis will receive a single argument (the modified model), together with an expanded tuple of arguments from args.\n\nThe modification and analysis functions are transferred to workers as-is; all packages required to run them (e.g. the optimization solvers) must be loaded there. Typically, you want to use the macro @everywhere using MyFavoriteSolver from Distributed package for loading the solvers.\n\nReturn value\n\nThe results of running analysis are collected in to the resulting array, in a way that preserves the shape of the variants, similarly as with pmap.\n\nThe results of analysis function must be serializable, preferably made only from pure Julia structures, because they may be transferred over the network between the computation nodes. For that reason, functions that return whole JuMP models that contain pointers to allocated C structures (such as flux_balance_analysis used with GLPK or Gurobi otimizers) will generally not in this context.\n\nExample\n\nfunction reverse_reaction(i::Int)\n    (model::CoreModel) -> begin\n        mod = copy(model)\n        mod.S[:,i] .*= -1   # this is unrealistic but sufficient for demonstration\n        mod\n    end\nend\n\nm = load_model(CoreModel, \"e_coli_core.xml\")\n\nscreen_variants(m,\n           [\n               [reverse_reaction(5)],\n               [reverse_reaction(3), reverse_reaction(6)]\n           ],\n           mod -> mod.S[:,3])  # observe the changes in S\n\nscreen_variants(m,\n    [\n        [reverse_reaction(5)],\n        [reverse_reaction(3), reverse_reaction(6)]\n    ],\n    mod -> flux_balance_analysis_vec(mod, GLPK.Optimizer))  # run analysis\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.screen_optimize_objective-Tuple{Any, Any}","page":"Function reference","title":"COBREXA.screen_optimize_objective","text":"screen_optimize_objective(_, optmodel)::Union{Float64,Nothing}\n\nA variant of optimize_objective directly usable in screen_optmodel_modifications.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.screen_optmodel_modifications-Union{Tuple{N}, Tuple{V}, Tuple{MetabolicModel, Any}} where {V<:(AbstractVector{T} where T), N}","page":"Function reference","title":"COBREXA.screen_optmodel_modifications","text":"screen_optmodel_modifications(\n    model::MetabolicModel,\n    optimizer;\n    modifications::Array{V,N},\n    analysis = screen_optimize_objective,\n    workers = [myid()],\n) where {V<:AbstractVector,N}\n\nScreen multiple modifications of the same optimization model.\n\nThis function is potentially more efficient than screen because it avoids making variants of the model structure and remaking of the optimization model. On the other hand, modification functions need to keep the optimization model in a recoverable state (one that leaves the model usable for the next modification), which limits the possible spectrum of modifications applied.\n\nInternally, model is distributed to workers and transformed into the optimization model using make_optimization_model. With that, vectors of functions in modifications are consecutively applied, and the result of analysis function called on model are collected to an array of the same extent as modifications.\n\nBoth the modification functions (in vectors) and the analysis function here have 2 parameters (as opposed to 1 with screen): first is the model (carried through as-is), second is the prepared JuMP optimization model that may be modified and acted upon. As an example, you can use modification change_constraint and analysis screen_optimize_objective.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.screen_variant","page":"Function reference","title":"COBREXA.screen_variant","text":"screen_variant(model::MetabolicModel, variant::Vector, analysis, args = ())\n\nHelper function for screen that applies all single-argument functions in variant to the model (in order from \"first\" to \"last\"), and executes analysis on the result.\n\nCan be used to test model variants locally.\n\n\n\n\n\n","category":"function"},{"location":"functions/#COBREXA.screen_variants-Tuple{Any, Any, Any}","page":"Function reference","title":"COBREXA.screen_variants","text":"screen_variants(model, variants, analysis; workers=[myid()])\n\nA shortcut for screen that only works with model variants.\n\n\n\n\n\n","category":"method"},{"location":"functions/#Analysis-modifications","page":"Function reference","title":"Analysis modifications","text":"","category":"section"},{"location":"functions/","page":"Function reference","title":"Function reference","text":"Modules = [COBREXA]\nPages = map(file -> joinpath(\"analysis\", \"modifications\", file), readdir(\"../src/analysis/modifications\"))","category":"page"},{"location":"functions/#COBREXA.change_constraint-Tuple{String, Any, Any}","page":"Function reference","title":"COBREXA.change_constraint","text":"change_constraint(id::String, lb, ub)\n\nChange the lower and upper bounds (lb and ub respectively) of reaction id.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.change_objective-Tuple{Union{String, Vector{String}}}","page":"Function reference","title":"COBREXA.change_objective","text":"change_objective(new_objective::Union{String,Vector{String}}; weights=[], sense=MOI.MAX_SENSE)\n\nModification that changes the objective function used in a constraint based analysis function.  new_objective can be a single reaction identifier, or an array of reactions identifiers.\n\nOptionally, the objective can be weighted by a vector of weights, and a optimization sense can be set.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.constrain_objective_value-Tuple{Any}","page":"Function reference","title":"COBREXA.constrain_objective_value","text":"constrain_objective_value(tolerance)\n\nLimit the objective value to tolerance-times the current objective value, as with objective_bounds.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA._do_knockout-Tuple{MetabolicModel, Any, Vector{String}}","page":"Function reference","title":"COBREXA._do_knockout","text":"_do_knockout(model::MetabolicModel, opt_model)\n\nInternal helper for knockouts on generic MetabolicModels. This can be overloaded so that the knockouts may work differently (more efficiently) with other models.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.knockout-Tuple{String}","page":"Function reference","title":"COBREXA.knockout","text":"knockout(gene_id::String)\n\nA helper variant of knockout for a single gene.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.knockout-Tuple{Vector{String}}","page":"Function reference","title":"COBREXA.knockout","text":"knockout(gene_ids::Vector{String})\n\nA modification that zeroes the bounds of all reactions that would be knocked out by the specified genes (effectively disables the reactions).\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.change_optimizer-Tuple{Any}","page":"Function reference","title":"COBREXA.change_optimizer","text":"change_optimizer(optimizer)\n\nChange the JuMP optimizer used to run the optimization.\n\nThis may be used to try different approaches for reaching the optimum, and in problems that may require different optimizers for different parts, such as the parsimonious_flux_balance_analysis.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.change_optimizer_attribute-Tuple{Any, Any}","page":"Function reference","title":"COBREXA.change_optimizer_attribute","text":"change_optimizer_attribute(attribute_key, value)\n\nChange a JuMP optimizer attribute. The attributes are optimizer-specific, refer to the JuMP documentation and the documentation of the specific optimizer for usable keys and values.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.change_sense-Tuple{Any}","page":"Function reference","title":"COBREXA.change_sense","text":"change_sense(objective_sense)\n\nChange the objective sense of optimization. Possible arguments are MOI.MAX_SENSE and MOI.MIN_SENSE.\n\nIf you want to change the objective and sense at the same time, use change_objective instead to do both at once.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.silence","page":"Function reference","title":"COBREXA.silence","text":"silence\n\nModification that disable all output from the JuMP optimizer (shortcut for set_silent from JuMP).\n\n\n\n\n\n","category":"function"},{"location":"functions/#Flux-sampling","page":"Function reference","title":"Flux sampling","text":"","category":"section"},{"location":"functions/","page":"Function reference","title":"Function reference","text":"Modules = [COBREXA]\nPages = map(file -> joinpath(\"analysis\", \"sampling\", file), readdir(\"../src/analysis/sampling\"))","category":"page"},{"location":"functions/#COBREXA._affine_hit_and_run_chain-NTuple{5, Any}","page":"Function reference","title":"COBREXA._affine_hit_and_run_chain","text":"_affine_hit_and_run_chain(warmup, lbs, ubs, iters, chain)\n\nInternal helper function for computing a single affine hit-and-run chain. The number of the chain is passed for possible future initialization of stable RNGs.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.affine_hit_and_run-Tuple{Matrix{Float64}, Vector{Float64}, Vector{Float64}}","page":"Function reference","title":"COBREXA.affine_hit_and_run","text":"function affine_hit_and_run(\n    warmup_points::Matrix{Float64},\n    lbs::Vector{Float64},\n    ubs::Vector{Float64};\n    sample_iters = 100 .* (1:5),\n    workers = [myid()],\n    chains = length(workers),\n)\n\nRun a hit-and-run style sampling that starts from warmup_points and uses their affine combinations for generating the run directions to sample the space delimited by lbs and ubs.  The points that represent fluxes in warmup_points should be organized in columns, i.e. warmup_points[:,1] is the first warmup flux.\n\nThere are total chains of hit-and-run runs, each on a batch of size(warmup_points, 2) points. The runs are scheduled on workers, for good load balancing chains should be ideally much greater than length(workers).\n\nEach run continues for maximum(sample_iters) iterations; the numbers in sample_iters represent the iterations at which the whole \"current\" batch of points is collected for output. For example, sample_iters=[1,4,5] causes the process run for 5 iterations, returning the sample batch that was produced by 1st, 4th and last (5th) iteration.\n\nReturns a matrix of sampled fluxes (in columns), with all collected samples horizontally concatenated. The total number of samples (columns) will be size(warmup_points,2) * chains * length(sample_iters).\n\nExample\n\nusing COBREXA\nusing Tulip\n\nmodel = load_model(StandardModel, model_path)\n\nwarmup, lbs, ubs = warmup_from_variability(model, Tulip.Optimizer, 100)\nsamples = affine_hit_and_run(warmup, lbs, ubs, sample_iters = 1:3)\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.warmup_from_variability","page":"Function reference","title":"COBREXA.warmup_from_variability","text":"function warmup_from_variability(\n    model::MetabolicModel,\n    optimizer,\n    min_reactions::Vector{Int}=1:n_reactions(model),\n    max_reactions::Vector{Int}=1:n_reactions(model);\n    modifications = [],\n    workers::Vector{Int} = [myid()],\n)::Tuple{Matrix{Float64}, Vector{Float64}, Vector{Float64}}\n\nGenerate FVA-like warmup points for samplers, by minimizing and maximizing the specified reactions. The result is returned as a matrix, each point occupies as single column in the result.\n\n\n\n\n\n","category":"function"},{"location":"functions/#COBREXA.warmup_from_variability-Tuple{MetabolicModel, Any, Int64}","page":"Function reference","title":"COBREXA.warmup_from_variability","text":"warmup_from_variability(\n    model::MetabolicModel,\n    optimizer,\n    n_points::Int;\n    kwargs...\n)\n\nGenerates FVA-like warmup points for samplers, by selecting random points by minimizing and maximizing reactions. Can not return more than 2 times the number of reactions in the model.\n\n\n\n\n\n","category":"method"},{"location":"functions/#Miscellaneous-utilities","page":"Function reference","title":"Miscellaneous utilities","text":"","category":"section"},{"location":"functions/","page":"Function reference","title":"Function reference","text":"Modules = [COBREXA]\nPages = map(file -> joinpath(\"base\", \"utils\", file), readdir(\"../src/base/utils\"))","category":"page"},{"location":"functions/#COBREXA.ambiguously_identified_items-Tuple{Dict{String, Dict{String, Set{String}}}}","page":"Function reference","title":"COBREXA.ambiguously_identified_items","text":"ambiguously_identified_items(\n    index::Dict{String,Dict{String,[String]}},\n)::Vector{String}\n\nFind items (genes, metabolites, ...) from the annotation index that are identified non-uniquely by at least one of their annotations.\n\nThis often indicates that the items are duplicate or miscategorized.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.annotation_index-Tuple{AbstractDict{String, V} where V}","page":"Function reference","title":"COBREXA.annotation_index","text":"annotation_index(\n    xs::AbstractDict{String};\n    annotations = _annotations,\n)::Dict{String,Dict{String,[String]}}\n\nExtract annotations from a dictionary of items xs and build an index that maps annotation \"kinds\" (e.g. \"PubChem\") to the mapping from the annotations (e.g.  \"COMPOUND_12345\") to item IDs that carry the annotations.\n\nFunction annotations is used to access the Annotations object in the dictionary values.\n\nThis is extremely useful for finding items by annotation data.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.get_atoms-Tuple{Metabolite}","page":"Function reference","title":"COBREXA.get_atoms","text":"get_atoms(met::Metabolite)::MetaboliteFormula\n\nSimple wrapper for getting the atom dictionary count out of a Metabolite.\n\nSee also: metabolite_formula\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.check_duplicate_reaction-Tuple{Reaction, OrderedCollections.OrderedDict{String, Reaction}}","page":"Function reference","title":"COBREXA.check_duplicate_reaction","text":"check_duplicate_reaction(rxn::Reaction, rxns::Dict{String, Reaction}; only_metabolites=true)\n\nCheck if rxn already exists in rxns but has another id. If only_metabolites is true then only the metabolite ids are checked. Otherwise, compares metabolite ids and the absolute value of their stoichiometric coefficients to those of rxn. If rxn has the same reaction equation as another reaction in rxns, the return the id. Otherwise return nothing.\n\nSee also: is_mass_balanced\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.is_boundary-Tuple{Reaction}","page":"Function reference","title":"COBREXA.is_boundary","text":"is_boundary(rxn::Reaction)\n\nReturn true if reaction is a boundary reaction, otherwise return false. Checks if boundary by inspecting number of metabolites in reaction equation. Boundary reactions have only one metabolite, e.g. an exchange reaction, or a sink/demand reaction.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.is_mass_balanced-Tuple{StandardModel, Reaction}","page":"Function reference","title":"COBREXA.is_mass_balanced","text":"is_mass_balanced(model::StandardModel, rxn::Reaction)\n\nChecks if rxn is atom balanced. Returns a boolean for whether the reaction is balanced, and the associated balance of atoms for convenience (useful if not balanced).\n\nSee also: get_atoms, check_duplicate_reaction\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.stoichiometry_string-Tuple{Any}","page":"Function reference","title":"COBREXA.stoichiometry_string","text":"stoichiometry_string(rxn_dict)\n\nReturn the reaction equation as a string.\n\nExample\n\njulia> req = Dict(\"coa_c\" => -1, \"for_c\" => 1, \"accoa_c\" => 1, \"pyr_c\" => -1);\njulia> stoichiometry_string(req)\n\"coa_c + pyr_c = for_c + accoa_c\"\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.serialize_model-Tuple{Serialized, String}","page":"Function reference","title":"COBREXA.serialize_model","text":"serialize_model(model::Serialized, filename::String)::Serialized\n\nSpecialization of serialize_model that prevents nested serialization of already-serialized models.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.serialize_model-Union{Tuple{MM}, Tuple{MM, String}} where MM<:MetabolicModel","page":"Function reference","title":"COBREXA.serialize_model","text":"serialize_model(model::MM, filename::String)::Serialized{MM} where {MM<:MetabolicModel}\n\nSerialize the model to file filename, returning a Serialized model that is able to load itself back automatically upon precaching by precache!.\n\n\n\n\n\n","category":"method"},{"location":"functions/#Base.copy-Tuple{Gene}","page":"Function reference","title":"Base.copy","text":"Base.copy(g::Gene)\n\nShallow copy of a Gene\n\n\n\n\n\n","category":"method"},{"location":"functions/#Base.copy-Tuple{Metabolite}","page":"Function reference","title":"Base.copy","text":"Base.copy(m::Metabolite)\n\nShallow copy of a Metabolite\n\n\n\n\n\n","category":"method"},{"location":"functions/#Base.copy-Tuple{Reaction}","page":"Function reference","title":"Base.copy","text":"Base.copy(r::Reaction)\n\nShallow copy of a Reaction\n\n\n\n\n\n","category":"method"},{"location":"functions/#Base.copy-Tuple{StandardModel}","page":"Function reference","title":"Base.copy","text":"Base.copy(m::StandardModel)\n\nShallow copy of a StandardModel\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.atom_exchange-Tuple{StandardModel, String}","page":"Function reference","title":"COBREXA.atom_exchange","text":"atom_exchange(model::StandardModel, rxn_id::String)\n\nSpecialized version of atom_exchange for StandardModel that quickly returns a dictionary mapping the flux-relative stoichiometry of atoms through a single reaction in model.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.atom_exchange-Tuple{MetabolicModel, Dict{String, Float64}}","page":"Function reference","title":"COBREXA.atom_exchange","text":"atom_exchange(model::MetabolicModel, flux_dict::Dict{String, Float64})\n\nReturn a dictionary mapping the flux of atoms across the boundary of the model given flux_dict (the solution of a constraint based analysis) of reactions in model.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.gamma_bounds-Tuple{Any}","page":"Function reference","title":"COBREXA.gamma_bounds","text":"gamma_bounds(gamma)\n\nA bounds-generating function for flux_variability_analysis that limits the objective value to be at least gamma*Z₀, as usual in COBRA packages. Use as the bounds argument:\n\nflux_variability_analysis(model, some_optimizer; bounds = gamma_bounds(0.9))\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.objective_bounds-Tuple{Any}","page":"Function reference","title":"COBREXA.objective_bounds","text":"objective_bounds(tolerance)\n\nA bounds-generating function for flux_variability_analysis that limits the objective value to a small multiple of Z₀. Use as bounds argument, similarly to gamma_bounds.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA._parse_formula-Tuple{String}","page":"Function reference","title":"COBREXA._parse_formula","text":"_parse_formula(f::String)::MetaboliteFormula\n\nParse a formula in format C2H6O into a MetaboliteFormula, which is basically a dictionary of atom counts in the molecule.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA._unparse_formula-Tuple{Dict{String, Int64}}","page":"Function reference","title":"COBREXA._unparse_formula","text":"_unparse_formula(f::MetaboliteFormula)::String\n\nFormat MetaboliteFormula to String.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.metabolite_fluxes-Tuple{MetabolicModel, Dict{String, Float64}}","page":"Function reference","title":"COBREXA.metabolite_fluxes","text":"metabolite_fluxes(model::MetabolicModel, flux_dict::Dict{String, Float64})\n\nReturn two dictionaries of metabolite ids mapped to reactions that consume or produce them, given the flux distribution supplied in flux_dict.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA._parse_grr-Tuple{SBML.GeneProductAssociation}","page":"Function reference","title":"COBREXA._parse_grr","text":"_parse_grr(gpa::SBML.GeneProductAssociation)::GeneAssociation\n\nParse SBML.GeneProductAssociation structure to the simpler GeneAssociation. The input must be (implicitly) in a positive DNF.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA._parse_grr-Tuple{String}","page":"Function reference","title":"COBREXA._parse_grr","text":"_parse_grr(s::String)::GeneAssociation\n\nParse a DNF gene association rule in format (YIL010W and YLR043C) or (YIL010W and YGR209C) to GeneAssociation. Also acceptsOR,|,||,AND,&, and&&`.\n\nExample\n\njulia> _parse_grr(\"(YIL010W and YLR043C) or (YIL010W and YGR209C)\")\n2-element Array{Array{String,1},1}:\n [\"YIL010W\", \"YLR043C\"]\n [\"YIL010W\", \"YGR209C\"]\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA._unparse_grr-Tuple{Type{SBML.GeneProductAssociation}, Vector{Vector{String}}}","page":"Function reference","title":"COBREXA._unparse_grr","text":"_unparse_grr(\n    ::Type{SBML.GeneProductAssociation},\n    x::GeneAssociation,\n)::SBML.GeneAssociation\n\nConvert a GeneAssociation to the corresponding SBML.jl structure.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA._unparse_grr-Tuple{Type{String}, Vector{Vector{String}}}","page":"Function reference","title":"COBREXA._unparse_grr","text":"unparse_grr(grr::Vector{Vector{Gene}}\n\nConverts a nested string gene reaction array  back into a gene reaction rule string.\n\nExample\n\njulia> _unparse_grr(String, [[\"YIL010W\", \"YLR043C\"], [\"YIL010W\", \"YGR209C\"]])\n\"(YIL010W and YLR043C) or (YIL010W and YGR209C)\"\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA._guesskey-Tuple{Any, Any}","page":"Function reference","title":"COBREXA._guesskey","text":"_guesskey(ks, possibilities)\n\nUnfortunately, many model types that contain dictionares do not have standardized field names, so we need to try a few possibilities and guess the best one. The keys used to look for valid field names should be ideally specified as constants in src/base/constants.jl.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.find_biomass_reaction_ids-Tuple{MetabolicModel}","page":"Function reference","title":"COBREXA.find_biomass_reaction_ids","text":"find_biomass_reaction_ids(m::MetabolicModel; kwargs...)\n\nShortcut for finding biomass reaction identifiers in a model; arguments are forwarded to looks_like_biomass_reaction.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.find_biomass_reactions-Tuple{MetabolicModel}","page":"Function reference","title":"COBREXA.find_biomass_reactions","text":"find_biomass_reactions(m::MetabolicModel; kwargs...)\n\nShortcut for finding biomass reaction indexes in a model; arguments are forwarded to looks_like_biomass_reaction.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.find_exchange_metabolite_ids-Tuple{MetabolicModel}","page":"Function reference","title":"COBREXA.find_exchange_metabolite_ids","text":"find_exchange_metabolite_ids(m::MetabolicModel; kwargs...)\n\nShortcut for finding exchange metabolite identifiers in a model; arguments are forwarded to looks_like_exchange_metabolite.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.find_exchange_metabolites-Tuple{MetabolicModel}","page":"Function reference","title":"COBREXA.find_exchange_metabolites","text":"find_exchange_metabolites(m::MetabolicModel; kwargs...)\n\nShortcut for finding exchange metabolite indexes in a model; arguments are forwarded to looks_like_exchange_metabolite.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.find_exchange_reaction_ids-Tuple{MetabolicModel}","page":"Function reference","title":"COBREXA.find_exchange_reaction_ids","text":"find_exchange_reaction_ids(m::MetabolicModel; kwargs...)\n\nShortcut for finding exchange reaction identifiers in a model; arguments are forwarded to looks_like_exchange_reaction.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.find_exchange_reactions-Tuple{MetabolicModel}","page":"Function reference","title":"COBREXA.find_exchange_reactions","text":"find_exchange_reactions(m::MetabolicModel; kwargs...)\n\nShortcut for finding exchange reaction indexes in a model; arguments are forwarded to looks_like_exchange_reaction.\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.looks_like_biomass_reaction-Tuple{String}","page":"Function reference","title":"COBREXA.looks_like_biomass_reaction","text":"looks_like_biomass_reaction(rxn_id::String;\n    exclude_exchanges = false,\n    exchange_prefixes = _constants.exchange_prefixes,\n    biomass_strings = _constants.biomass_strings,\n)::Bool\n\nA predicate that matches reaction identifiers that look like biomass reactions. Biomass reactions are identified by looking for occurences of biomass_strings in the reaction id. If exclude_exchanges is set, the strings that look like exchanges (from looks_like_exchange_reaction) will not match.\n\nExample\n\nfilter(looks_like_biomass_reaction, reactions(model)) # returns strings\nfindall(looks_like_biomass_reaction, reactions(model)) # returns indices\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.looks_like_exchange_metabolite-Tuple{String}","page":"Function reference","title":"COBREXA.looks_like_exchange_metabolite","text":"looks_like_exchange_metabolite(rxn_id::String;\n    exchange_suffixes = _constants.exchange_suffixes,\n    )::Bool\n\nA predicate that matches metabolite identifiers that look like involved in exchange reactions. Exchange metabolites are identified by exchange_suffixes at the end of the metabolite id.\n\nExample\n\nfilter(looks_like_exchange_metabolite, metabolites(model)) # returns strings\nfindall(looks_like_exchange_metabolite, metabolites(model)) # returns indices\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.looks_like_exchange_reaction-Tuple{String}","page":"Function reference","title":"COBREXA.looks_like_exchange_reaction","text":"looks_like_exchange_reaction(rxn_id::String;\n    exclude_biomass = false,\n    biomass_strings = _constants.biomass_strings,\n    exchange_prefixes = _constants.exchange_prefixes,\n)\n\nA predicate that matches reaction identifiers that look like exchange or biomass reactions, given the usual naming schemes in common model repositories. Exchange reactions are identified based on matching prefixes in the set exchange_prefixes and biomass reactions are identified by looking for occurences of biomass_strings in the reaction id.\n\nAlso see find_exchange_reactions.\n\nExample\n\nfindall(looks_like_exchange_reaction, reactions(model)) # returns indices\nfilter(looks_like_exchange_reaction, reactions(model)) # returns Strings\n\n# to use the optional arguments you need to expand the function's arguments\n# using an anonymous function\nfindall(x -> looks_like_exchange_reaction(x; exclude_biomass=true), reactions(model)) # returns indices\nfilter(x -> looks_like_exchange_reaction(x; exclude_biomass=true), reactions(model)) # returns Strings\n\n\n\n\n\n","category":"method"},{"location":"functions/","page":"Function reference","title":"Function reference","text":"Modules = [COBREXA]\nPages = map(file -> joinpath(\"base\", \"macros\", file), readdir(\"../src/base/macros\"))","category":"page"},{"location":"functions/#COBREXA.change_bound!-Tuple{CoreModel, Int64}","page":"Function reference","title":"COBREXA.change_bound!","text":"change_bound!(\n    model::CoreModel,\n    rxn_idx::Int;\n    lower = nothing,\n    upper = nothing,\n)\n\nChange the specified reaction flux bound in the model in-place.\n\nExample\n\nnew_model = change_bound!(model, 123, lower=-21.15, upper=42.3)\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.change_bound!-Tuple{CoreModel, String}","page":"Function reference","title":"COBREXA.change_bound!","text":"change_bound!(\n    model::CoreModel,\n    rxn_id::String;\n    lower = nothing,\n    upper = nothing,\n)\n\nChange the specified reaction flux bound in the model in-place.\n\nExample\n\nnew_model = change_bound!(model, \"ReactionB\", lower=-21.15, upper=42.3)\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.change_bound!-Tuple{CoreModelCoupled, Int64}","page":"Function reference","title":"COBREXA.change_bound!","text":"change_bound!(\n    model::CoreModelCoupled,\n    rxn_idx::Int;\n    lower = nothing,\n    upper = nothing,\n)\n\nChange the specified reaction flux bound in the model in-place.\n\nExample\n\nnew_model = change_bound!(model, 123, lower=-21.15, upper=42.3)\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.change_bound!-Tuple{CoreModelCoupled, String}","page":"Function reference","title":"COBREXA.change_bound!","text":"change_bound!(\n    model::CoreModelCoupled,\n    rxn_id::String;\n    lower = nothing,\n    upper = nothing,\n)\n\nChange the specified reaction flux bound in the model in-place.\n\nExample\n\nnew_model = change_bound!(model, \"ReactionB\", lower=-21.15, upper=42.3)\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.change_bound!-Tuple{StandardModel, String}","page":"Function reference","title":"COBREXA.change_bound!","text":"change_bound!(\n    model::StandardModel,\n    rxn_id::String;\n    lower = nothing,\n    upper = nothing,\n)\n\nChange the specified reaction flux bound in the model in-place.\n\nExample\n\nnew_model = change_bound!(model, \"ReactionB\", lower=-21.15, upper=42.3)\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.change_bound-Tuple{CoreModel, Int64}","page":"Function reference","title":"COBREXA.change_bound","text":"change_bound(\n    model::CoreModel,\n    rxn_idx::Int;\n    lower = nothing,\n    upper = nothing,\n)\n\nChange the specified reaction flux bound in the model and return the modified model.\n\nExample\n\nchange_bound(model, 123, lower=-21.15, upper=42.3)\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.change_bound-Tuple{CoreModel, String}","page":"Function reference","title":"COBREXA.change_bound","text":"change_bound(\n    model::CoreModel,\n    rxn_id::String;\n    lower = nothing,\n    upper = nothing,\n)\n\nChange the specified reaction flux bound in the model and return the modified model.\n\nExample\n\nchange_bound(model, \"ReactionB\", lower=-21.15, upper=42.3)\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.change_bound-Tuple{CoreModelCoupled, Int64}","page":"Function reference","title":"COBREXA.change_bound","text":"change_bound(\n    model::CoreModelCoupled,\n    rxn_idx::Int;\n    lower = nothing,\n    upper = nothing,\n)\n\nChange the specified reaction flux bound in the model and return the modified model.\n\nExample\n\nchange_bound(model, 123, lower=-21.15, upper=42.3)\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.change_bound-Tuple{CoreModelCoupled, String}","page":"Function reference","title":"COBREXA.change_bound","text":"change_bound(\n    model::CoreModelCoupled,\n    rxn_id::String;\n    lower = nothing,\n    upper = nothing,\n)\n\nChange the specified reaction flux bound in the model and return the modified model.\n\nExample\n\nchange_bound(model, \"ReactionB\", lower=-21.15, upper=42.3)\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.change_bound-Tuple{StandardModel, String}","page":"Function reference","title":"COBREXA.change_bound","text":"change_bound(\n    model::StandardModel,\n    rxn_id::String;\n    lower = nothing,\n    upper = nothing,\n)\n\nChange the specified reaction flux bound in the model and return the modified model.\n\nExample\n\nchange_bound(model, \"ReactionB\", lower=-21.15, upper=42.3)\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.change_bounds!-Tuple{CoreModel, AbstractVector{Int64}}","page":"Function reference","title":"COBREXA.change_bounds!","text":"change_bounds!(\n    model::CoreModel,\n    rxn_idxs::AbstractVector{Int64};\n    lower = (nothing for _ = rxn_idxs),\n    upper = (nothing for _ = rxn_idxs),\n)\n\nChange the specified reaction flux bounds in the model in-place.\n\nExample\n\nnew_model = change_bounds!(model, [123, 234], lower=[-2.1, -50.05], upper=[4.2, 100.1])\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.change_bounds!-Tuple{CoreModel, AbstractVector{String}}","page":"Function reference","title":"COBREXA.change_bounds!","text":"change_bounds!(\n    model::CoreModel,\n    rxn_ids::AbstractVector{String};\n    lower = (nothing for _ = rxn_ids),\n    upper = (nothing for _ = rxn_ids),\n)\n\nChange the specified reaction flux bounds in the model in-place.\n\nExample\n\nnew_model = change_bounds!(model, [\"ReactionA\", \"ReactionC\"], lower=[-2.1, -50.05], upper=[4.2, 100.1])\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.change_bounds!-Tuple{CoreModelCoupled, AbstractVector{Int64}}","page":"Function reference","title":"COBREXA.change_bounds!","text":"change_bounds!(\n    model::CoreModelCoupled,\n    rxn_idxs::AbstractVector{Int64};\n    lower = (nothing for _ = rxn_idxs),\n    upper = (nothing for _ = rxn_idxs),\n)\n\nChange the specified reaction flux bounds in the model in-place.\n\nExample\n\nnew_model = change_bounds!(model, [123, 234], lower=[-2.1, -50.05], upper=[4.2, 100.1])\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.change_bounds!-Tuple{CoreModelCoupled, AbstractVector{String}}","page":"Function reference","title":"COBREXA.change_bounds!","text":"change_bounds!(\n    model::CoreModelCoupled,\n    rxn_ids::AbstractVector{String};\n    lower = (nothing for _ = rxn_ids),\n    upper = (nothing for _ = rxn_ids),\n)\n\nChange the specified reaction flux bounds in the model in-place.\n\nExample\n\nnew_model = change_bounds!(model, [\"ReactionA\", \"ReactionC\"], lower=[-2.1, -50.05], upper=[4.2, 100.1])\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.change_bounds!-Tuple{StandardModel, AbstractVector{String}}","page":"Function reference","title":"COBREXA.change_bounds!","text":"change_bounds!(\n    model::StandardModel,\n    rxn_ids::AbstractVector{String};\n    lower = (nothing for _ = rxn_ids),\n    upper = (nothing for _ = rxn_ids),\n)\n\nChange the specified reaction flux bounds in the model in-place.\n\nExample\n\nnew_model = change_bounds!(model, [\"ReactionA\", \"ReactionC\"], lower=[-2.1, -50.05], upper=[4.2, 100.1])\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.change_bounds-Tuple{CoreModel, AbstractVector{Int64}}","page":"Function reference","title":"COBREXA.change_bounds","text":"change_bounds(\n    model::CoreModel,\n    rxn_idxs::AbstractVector{Int64};\n    lower = (nothing for _ = rxn_idxs),\n    upper = (nothing for _ = rxn_idxs),\n)\n\nChange the specified reaction flux bounds in the model and return the modified model.\n\nExample\n\nchange_bounds(model, [123, 234], lower=[-2.1, -50.05], upper=[4.2, 100.1])\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.change_bounds-Tuple{CoreModel, AbstractVector{String}}","page":"Function reference","title":"COBREXA.change_bounds","text":"change_bounds(\n    model::CoreModel,\n    rxn_ids::AbstractVector{String};\n    lower = (nothing for _ = rxn_ids),\n    upper = (nothing for _ = rxn_ids),\n)\n\nChange the specified reaction flux bounds in the model and return the modified model.\n\nExample\n\nchange_bounds(model, [\"ReactionA\", \"ReactionC\"], lower=[-2.1, -50.05], upper=[4.2, 100.1])\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.change_bounds-Tuple{CoreModelCoupled, AbstractVector{Int64}}","page":"Function reference","title":"COBREXA.change_bounds","text":"change_bounds(\n    model::CoreModelCoupled,\n    rxn_idxs::AbstractVector{Int64};\n    lower = (nothing for _ = rxn_idxs),\n    upper = (nothing for _ = rxn_idxs),\n)\n\nChange the specified reaction flux bounds in the model and return the modified model.\n\nExample\n\nchange_bounds(model, [123, 234], lower=[-2.1, -50.05], upper=[4.2, 100.1])\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.change_bounds-Tuple{CoreModelCoupled, AbstractVector{String}}","page":"Function reference","title":"COBREXA.change_bounds","text":"change_bounds(\n    model::CoreModelCoupled,\n    rxn_ids::AbstractVector{String};\n    lower = (nothing for _ = rxn_ids),\n    upper = (nothing for _ = rxn_ids),\n)\n\nChange the specified reaction flux bounds in the model and return the modified model.\n\nExample\n\nchange_bounds(model, [\"ReactionA\", \"ReactionC\"], lower=[-2.1, -50.05], upper=[4.2, 100.1])\n\n\n\n\n\n","category":"method"},{"location":"functions/#COBREXA.change_bounds-Tuple{StandardModel, AbstractVector{String}}","page":"Function reference","title":"COBREXA.change_bounds","text":"change_bounds(\n    model::StandardModel,\n    rxn_ids::AbstractVector{String};\n    lower = (nothing for _ = rxn_ids),\n    upper = (nothing for _ = rxn_ids),\n)\n\nChange the specified reaction flux bounds in the model and return the modified model.\n\nExample\n\nchange_bounds(model, [\"ReactionA\", \"ReactionC\"], lower=[-2.1, -50.05], upper=[4.2, 100.1])\n\n\n\n\n\n","category":"method"},{"location":"functions/#Logging-and-debugging-helpers","page":"Function reference","title":"Logging and debugging helpers","text":"","category":"section"},{"location":"functions/","page":"Function reference","title":"Function reference","text":"Modules = [COBREXA]\nPages = map(file -> joinpath(\"base\", \"logging\", file), readdir(\"../src/base/logging\"))","category":"page"},{"location":"functions/#COBREXA.log_io","page":"Function reference","title":"COBREXA.log_io","text":"log_io(enable::Bool=true)\n\nEnable (default) or disable (by passing false) output of messages and warnings from model input/output.\n\n\n\n\n\n","category":"function"},{"location":"functions/#COBREXA.log_models","page":"Function reference","title":"COBREXA.log_models","text":"log_models(enable::Bool=true)\n\nEnable (default) or disable (by passing false) output of model-related messages.\n\n\n\n\n\n","category":"function"},{"location":"functions/#COBREXA.log_perf","page":"Function reference","title":"COBREXA.log_perf","text":"log_perf(enable::Bool=true)\n\nEnable (default) or disable (by passing false) output of performance-related tracing information.\n\n\n\n\n\n","category":"function"},{"location":"functions/#COBREXA.@_make_logging_tag-Tuple{Symbol, String}","page":"Function reference","title":"COBREXA.@_make_logging_tag","text":"macro _make_logging_group(sym::Symbol, doc::String)\n\nThis creates a group of functions that allow masking out topic-related logging actions. A call that goes as follows:\n\n@_make_logging_tag XYZ\n\ncreates the following tools:\n\nglobal variable _XYZ_log_enabled defaulted to false\nfunction log_XYZ that can be called to turn the logging on/off\na masking macro @_XYZ_log that can be prepended to commands that should only happen if the logging of tag XYZ is enabled.\n\nThe masking macro is then used as follows:\n\n@_XYZ_log @info \"This is the extra verbose information you wanted!\" a b c\n\nThe user can direct logging with these:\n\nlog_XYZ()\nlog_XYZ(false)\n\ndoc should be a name of the stuff that is being printed if the corresponding log_XYZ() is enabled – it is used to create a friendly documentation for the logging switch. In this case it could say \"X, Y and Z-related messages\".\n\n\n\n\n\n","category":"macro"},{"location":"advanced/#COBREXA-Advanced-tutorials","page":"Advanced tutorials","title":"COBREXA Advanced tutorials","text":"","category":"section"},{"location":"advanced/","page":"Advanced tutorials","title":"Advanced tutorials","text":"Pages = joinpath.(\"advanced\", filter(x -> endswith(x, \".md\"), readdir(\"advanced\")))\nDepth = 2","category":"page"},{"location":"notebooks/4_basic_core_coupled_usage/","page":"Basic usage of CoreModel and CoreModelCoupled","title":"Basic usage of CoreModel and CoreModelCoupled","text":"EditURL = \"https://github.com/LCSB-BioCore/COBREXA.jl/blob/master/docs/src/notebooks/4_basic_core_coupled_usage.jl\"","category":"page"},{"location":"notebooks/4_basic_core_coupled_usage/#Basic-usage-of-CoreModel-and-CoreModelCoupled","page":"Basic usage of CoreModel and CoreModelCoupled","title":"Basic usage of CoreModel and CoreModelCoupled","text":"","category":"section"},{"location":"notebooks/4_basic_core_coupled_usage/","page":"Basic usage of CoreModel and CoreModelCoupled","title":"Basic usage of CoreModel and CoreModelCoupled","text":"(Image: ) (Image: )","category":"page"},{"location":"notebooks/4_basic_core_coupled_usage/","page":"Basic usage of CoreModel and CoreModelCoupled","title":"Basic usage of CoreModel and CoreModelCoupled","text":"In this tutorial we will introduce COBREXA's CoreModel and CoreModelCoupled. We will use E. coli's toy model to start with.","category":"page"},{"location":"notebooks/4_basic_core_coupled_usage/","page":"Basic usage of CoreModel and CoreModelCoupled","title":"Basic usage of CoreModel and CoreModelCoupled","text":"!isfile(\"e_coli_core.xml\") &&\n    download(\"http://bigg.ucsd.edu/static/models/e_coli_core.xml\", \"e_coli_core.xml\")\n\nusing COBREXA","category":"page"},{"location":"notebooks/4_basic_core_coupled_usage/#Loading-a-CoreModel","page":"Basic usage of CoreModel and CoreModelCoupled","title":"Loading a CoreModel","text":"","category":"section"},{"location":"notebooks/4_basic_core_coupled_usage/","page":"Basic usage of CoreModel and CoreModelCoupled","title":"Basic usage of CoreModel and CoreModelCoupled","text":"model = load_model(CoreModel, \"e_coli_core.xml\") # we specifically want to load a CoreModel from the model file","category":"page"},{"location":"notebooks/4_basic_core_coupled_usage/#Basic-analysis-on-CoreModel","page":"Basic usage of CoreModel and CoreModelCoupled","title":"Basic analysis on CoreModel","text":"","category":"section"},{"location":"notebooks/4_basic_core_coupled_usage/","page":"Basic usage of CoreModel and CoreModelCoupled","title":"Basic usage of CoreModel and CoreModelCoupled","text":"As before, for optimization based analysis we need to load an optimizer. Here we will use Tulip.jl to optimize the linear programs of this tutorial. Refer to the constraint-based analysis basics tutorial if you are confused by any functions in this section.","category":"page"},{"location":"notebooks/4_basic_core_coupled_usage/","page":"Basic usage of CoreModel and CoreModelCoupled","title":"Basic usage of CoreModel and CoreModelCoupled","text":"All the normal analysis functions work on CoreModel, due to it also having the same generic accessor interface as all the other model types.","category":"page"},{"location":"notebooks/4_basic_core_coupled_usage/","page":"Basic usage of CoreModel and CoreModelCoupled","title":"Basic usage of CoreModel and CoreModelCoupled","text":"using Tulip\n\ndict_sol = flux_balance_analysis_dict(\n    model,\n    Tulip.Optimizer;\n    modifications = [\n        change_objective(\"R_BIOMASS_Ecoli_core_w_GAM\"),\n        change_constraint(\"R_EX_glc__D_e\", -12, -12),\n        change_constraint(\"R_EX_o2_e\", 0, 0),\n    ],\n)","category":"page"},{"location":"notebooks/4_basic_core_coupled_usage/#Structure-of-CoreModel","page":"Basic usage of CoreModel and CoreModelCoupled","title":"Structure of CoreModel","text":"","category":"section"},{"location":"notebooks/4_basic_core_coupled_usage/","page":"Basic usage of CoreModel and CoreModelCoupled","title":"Basic usage of CoreModel and CoreModelCoupled","text":"CoreModel is a special COBREXA type that is optimized for large scale analysis of large models. It stores data in a sparse format where possible.","category":"page"},{"location":"notebooks/4_basic_core_coupled_usage/","page":"Basic usage of CoreModel and CoreModelCoupled","title":"Basic usage of CoreModel and CoreModelCoupled","text":"fieldnames(CoreModel)","category":"page"},{"location":"notebooks/4_basic_core_coupled_usage/","page":"Basic usage of CoreModel and CoreModelCoupled","title":"Basic usage of CoreModel and CoreModelCoupled","text":"model.S","category":"page"},{"location":"notebooks/4_basic_core_coupled_usage/#CoreModelCoupled-adds-coupling-constraints-to-CoreModel","page":"Basic usage of CoreModel and CoreModelCoupled","title":"CoreModelCoupled adds coupling constraints to CoreModel","text":"","category":"section"},{"location":"notebooks/4_basic_core_coupled_usage/","page":"Basic usage of CoreModel and CoreModelCoupled","title":"Basic usage of CoreModel and CoreModelCoupled","text":"CoreModelCoupled extends CoreModel by adding coupling constraints.","category":"page"},{"location":"notebooks/4_basic_core_coupled_usage/","page":"Basic usage of CoreModel and CoreModelCoupled","title":"Basic usage of CoreModel and CoreModelCoupled","text":"fieldnames(CoreModelCoupled)","category":"page"},{"location":"notebooks/4_basic_core_coupled_usage/","page":"Basic usage of CoreModel and CoreModelCoupled","title":"Basic usage of CoreModel and CoreModelCoupled","text":"In short, coupling constraints can be used to ensure that fluxes scale with the growth rate (μ) of a model. This reduces the impact of biologically infeasible cycles from occurring. Here we will model coupling constraints by assuming that they have the form: -γ ≤ vᵢ/μ  ≤ γ, where γ is the ratio between each individual flux (vᵢ) in the model and the growth rate.","category":"page"},{"location":"notebooks/4_basic_core_coupled_usage/","page":"Basic usage of CoreModel and CoreModelCoupled","title":"Basic usage of CoreModel and CoreModelCoupled","text":"gamma = 40 # arbitrary\n\nnr = n_reactions(model) # number of reactions\nbiomass_index = first(indexin([\"R_BIOMASS_Ecoli_core_w_GAM\"], reactions(model)))\n\nusing LinearAlgebra, SparseArrays\n\nCf = sparse(1.0I, nr, nr)\nCf[:, biomass_index] .= -gamma\nCb = sparse(1.0I, nr, nr)\nCb[:, biomass_index] .= gamma\nC = [Cf; Cb] # coupling constraint matrix\n\nclb = spzeros(2 * nr)\nclb[1:nr] .= -1000.0\ncub = spzeros(2 * nr)\ncub[nr+1:end] .= 1000\n\ncmodel = CoreModelCoupled(model, C, clb, cub)","category":"page"},{"location":"notebooks/4_basic_core_coupled_usage/","page":"Basic usage of CoreModel and CoreModelCoupled","title":"Basic usage of CoreModel and CoreModelCoupled","text":"d = flux_balance_analysis_dict(model, Tulip.Optimizer)\nd[\"R_BIOMASS_Ecoli_core_w_GAM\"]","category":"page"},{"location":"notebooks/4_basic_core_coupled_usage/","page":"Basic usage of CoreModel and CoreModelCoupled","title":"Basic usage of CoreModel and CoreModelCoupled","text":"dc = flux_balance_analysis_dict(cmodel, Tulip.Optimizer)\ndc[\"R_BIOMASS_Ecoli_core_w_GAM\"]","category":"page"},{"location":"notebooks/4_basic_core_coupled_usage/","page":"Basic usage of CoreModel and CoreModelCoupled","title":"Basic usage of CoreModel and CoreModelCoupled","text":"","category":"page"},{"location":"notebooks/4_basic_core_coupled_usage/","page":"Basic usage of CoreModel and CoreModelCoupled","title":"Basic usage of CoreModel and CoreModelCoupled","text":"This page was generated using Literate.jl.","category":"page"},{"location":"tutorials/4_modifying/#Modifying-and-saving-the-models","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"","category":"section"},{"location":"tutorials/4_modifying/","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"Making a small modification to the model and reanalyzing them is often a useful way to explore how the constraints work together, and to inspect the degrees of freedom in the model.","category":"page"},{"location":"tutorials/4_modifying/","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"With COBREXA.jl, you have two main choices of making model modifications:","category":"page"},{"location":"tutorials/4_modifying/","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"you can manually change the model structures (i.e. permanently change the data in of your model variable)\nyou can use special arguments of analysis functions that allow you to make the modifications in a declarative way and \"on the fly\", without having to manually interact with the model","category":"page"},{"location":"tutorials/4_modifying/","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"tip: Notebook available\nThe available notebooks demonstrate model export and serialization and various model modifications (1, 2, 3).","category":"page"},{"location":"tutorials/4_modifying/#Manual-modifications","page":"Modifying and saving the models","title":"Manual modifications","text":"","category":"section"},{"location":"tutorials/4_modifying/","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"Certain model types, including CoreModel and StandardModel, are built from mutable structs that you are free to modify as you want.","category":"page"},{"location":"tutorials/4_modifying/","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"CoreModel consists of sparse matrices and vectors that describe the model precisely. For example, modifying a bound of the reaction is as simple as writing to the .xl or .xu (lower and upper bound for x) vectors in the structure:","category":"page"},{"location":"tutorials/4_modifying/","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"using COBREXA\nm = load_model(CoreModel, \"e_coli_core.xml\")\nm.xl[3] = 0.0","category":"page"},{"location":"tutorials/4_modifying/","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"The available field names can be listed using e.g. fieldnames(CoreModel), or more conveniently by employing the completion in the shell:","category":"page"},{"location":"tutorials/4_modifying/","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"julia> m.   # press [Tab]\nS    b     c     mets  rxns  xl    xu","category":"page"},{"location":"tutorials/4_modifying/","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"With CoreModel, you may need to find the proper metabolites by identifier. For that, you may examine the reactions and metabolites of the model, e.g. using","category":"page"},{"location":"tutorials/4_modifying/","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"indexin([\"M_nadh_c\", \"M_co2_e\"], metabolites(m))","category":"page"},{"location":"tutorials/4_modifying/","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"...which will return the numeric indexes of NADH and CO₂ metabolites. These can be used to, e.g., change the \"balance\" of the metabolites in the model:","category":"page"},{"location":"tutorials/4_modifying/","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"m.b[64] = -1      # model will be losing 1 flux unit of CO₂","category":"page"},{"location":"tutorials/4_modifying/","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"...or to modify existing reaction (here with index 5) directly in stoichiometry matrix:","category":"page"},{"location":"tutorials/4_modifying/","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"m.S[5,8] = -1\nm.S[5,64] = 1","category":"page"},{"location":"tutorials/4_modifying/","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"While this works well if you are used to working with matrix-like representations of the model, it is not really convenient if you want to change the reactions and models in an easy way. StandardModel is structured in a much more user-friendly way, which makes the manual modifications easier.","category":"page"},{"location":"tutorials/4_modifying/","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"In particular, StandardModel consists of dictionaries of Reaction, Metabolite and Gene objects that may be modified and indexed directly using their names. That way, the above modifications may be written in a cleaner, semantic and declarative fashion, as follows:","category":"page"},{"location":"tutorials/4_modifying/","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"m = load_model(StandardModel, \"e_coli_core.xml\")\nm.reactions[\"R_TPI\"].lb = 0.0                         # change lower bound of the reaction to 0\nm.reactions[\"R_GLNS\"].metabolites[\"M_nadh_c\"] = -1.0  # update stoichiometry\nm.reactions[\"R_GLNS\"].metabolites[\"M_co2_e\"] = 1.0\n...","category":"page"},{"location":"tutorials/4_modifying/","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"There are other functions that may be used to change the StandardModel in a more systematic way. See the documentation of add_reaction!, add_metabolite!, add_gene!, remove_reaction!, remove_metabolite!, [ remove_gene!, and the Model reconstruction reference for more examples.","category":"page"},{"location":"tutorials/4_modifying/#Analysis-modifiers","page":"Modifying and saving the models","title":"Analysis modifiers","text":"","category":"section"},{"location":"tutorials/4_modifying/","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"Some analysis functions, including flux_balance_analysis and flux_variability_analysis, accept a special argument modifications, which is a list of descriptions of small changes that should be applied to the model before modification.","category":"page"},{"location":"tutorials/4_modifying/","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"These include e.g.:","category":"page"},{"location":"tutorials/4_modifying/","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"change_objective that sets a new optimization objective\nchange_optimizer that chooses a different JuMP.jl optimizer for the analysis\nchange_optimizer_attribute that can set various optimizer parameters\nchange_constraint that changes the flux bounds of a reaction\nknockout that disables reactions that depend on genes","category":"page"},{"location":"tutorials/4_modifying/","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"This way, you can easily check out the model state when maximizing the rate of \"TALA\" (transadenolase A) reaction:","category":"page"},{"location":"tutorials/4_modifying/","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"m = load_model(StandardModel, \"e_coli_core.xml\")\nflux_balance_analysis_dict(\n  m, GLPK.Optimizer;\n  modifications=[change_objective(\"R_TALA\")])","category":"page"},{"location":"tutorials/4_modifying/","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"...or knock out a gene combination that disables the transadenolase A completely (see m.reactions[\"R_TALA\"].grr):","category":"page"},{"location":"tutorials/4_modifying/","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"flux_balance_analysis_dict(\n  m, GLPK.Optimizer;\n  modifications=[knockout([\"G_b0008\", \"G_b2464\"])])","category":"page"},{"location":"tutorials/4_modifying/","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"...or do both at once– knock out some other genes, and try to maximize the transadenolase A reaction rate:","category":"page"},{"location":"tutorials/4_modifying/","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"flux_balance_analysis_dict(\n  m, GLPK.Optimizer;\n  modifications=[\n    knockout([\"G_s0001\"]),\n    change_objective(\"R_TALA\"),\n  ])","category":"page"},{"location":"tutorials/4_modifying/#Exporting-the-modified-models-in-native-formats","page":"Modifying and saving the models","title":"Exporting the modified models in native formats","text":"","category":"section"},{"location":"tutorials/4_modifying/","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"Manually modified models can be exported in standard formats so that they can be examined in other environments, or just made accessible for publication.","category":"page"},{"location":"tutorials/4_modifying/","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"COBREXA.jl supports export of MATLAB-like and JSON models. Simply use save_model:","category":"page"},{"location":"tutorials/4_modifying/","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"save_model(m, \"myModel.json\")\nsave_model(m, \"myModel.mat\")","category":"page"},{"location":"tutorials/4_modifying/","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"The function automatically guesses the appropriate model format to write into the file from the file extension. If required, you can choose the model format manually by using save_json_model and save_mat_model.","category":"page"},{"location":"tutorials/4_modifying/#Using-Serialization-for-quick-and-efficient-model-storage","page":"Modifying and saving the models","title":"Using Serialization for quick & efficient model storage","text":"","category":"section"},{"location":"tutorials/4_modifying/","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"If you save the model \"just for yourself\", such as for the use in an immediately following analysis, it may be inconvenient (and unnecessarily inefficient) to encode and decode the models to and from the external format. Moreover, certain model types (such as CoreModelCoupled) cannot be fully represented in all model formats, thus increasing the chance for accidental data loss.","category":"page"},{"location":"tutorials/4_modifying/","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"Instead of that, we recommend using the Serialization package. It provides a straightforward way to save any Julia data structure to the disk, using a very efficient data format that can be written to and read from the disk very quickly.","category":"page"},{"location":"tutorials/4_modifying/","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"With any model in m, you can write it to disk as follows:","category":"page"},{"location":"tutorials/4_modifying/","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"using Serialization\nopen(f -> serialize(f, m), \"myModel\", \"w\")","category":"page"},{"location":"tutorials/4_modifying/","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"...and read it back with:","category":"page"},{"location":"tutorials/4_modifying/","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"m = deserialize(\"myModel\")","category":"page"},{"location":"tutorials/4_modifying/","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"One great advantage of Serialization is speed – models with millions of reactions are usually loaded and saved with minimal overhead in less than a second.","category":"page"},{"location":"tutorials/4_modifying/","page":"Modifying and saving the models","title":"Modifying and saving the models","text":"warning: Limits of `Serialization`\nSerialized models are great for quickly exchanging data objects between analysis steps. The avoided need for re-encoding can save you a great deal of analysis time that can be used for better purposes. Despite that, do not rely on the stability of the serialized format – it often changes between Julia versions, and the data stored in one version may not open easily after an upgrade. In short, use serialized data within one workflow, and use standard and stable external formats for publishing and storing the data beyond the scope of a single analysis workflow.","category":"page"},{"location":"notebooks/7_community_model/","page":"Building and analysing a small community model","title":"Building and analysing a small community model","text":"EditURL = \"https://github.com/LCSB-BioCore/COBREXA.jl/blob/master/docs/src/notebooks/7_community_model.jl\"","category":"page"},{"location":"notebooks/7_community_model/#Building-and-analysing-a-small-community-model","page":"Building and analysing a small community model","title":"Building and analysing a small community model","text":"","category":"section"},{"location":"notebooks/7_community_model/","page":"Building and analysing a small community model","title":"Building and analysing a small community model","text":"(Image: ) (Image: )","category":"page"},{"location":"notebooks/7_community_model/","page":"Building and analysing a small community model","title":"Building and analysing a small community model","text":"Here we will use COBREXA to build and analyze a small community model consisting of three E. coli mutants using the CoreModel. We will use an objective function that enforces equal growth rates.","category":"page"},{"location":"notebooks/7_community_model/","page":"Building and analysing a small community model","title":"Building and analysing a small community model","text":"We will first construct a community of only two mutants to illustrate the effect of the community biomass objective function. Then we will add a third member that has a lethal knockout. Due to the bounds on the exchange reactions these three models are incapable of sharing resources - hence the maximum growth rate will be zero. By changing the bounds we can allow resource sharing, \"saving\" the community.","category":"page"},{"location":"notebooks/7_community_model/#Load-the-base-model","page":"Building and analysing a small community model","title":"Load the base model","text":"","category":"section"},{"location":"notebooks/7_community_model/","page":"Building and analysing a small community model","title":"Building and analysing a small community model","text":"!isfile(\"e_coli_core.json\") &&\n    download(\"http://bigg.ucsd.edu/static/models/e_coli_core.json\", \"e_coli_core.json\");\n\nusing COBREXA\nusing Tulip","category":"page"},{"location":"notebooks/7_community_model/#Load-the-models-and-inspect-fba-solutions","page":"Building and analysing a small community model","title":"Load the models and inspect fba solutions","text":"","category":"section"},{"location":"notebooks/7_community_model/","page":"Building and analysing a small community model","title":"Building and analysing a small community model","text":"base_model = load_model(CoreModel, \"e_coli_core.json\") # base from from which the knockouts will be constructed\n\ncytbd_knockout_model = remove_reactions(base_model, \"CYTBD\") # knockout the CYTBD (cytochrome oxidase) reaction\nsol = flux_balance_analysis_dict(cytbd_knockout_model, Tulip.Optimizer)\nsol[\"BIOMASS_Ecoli_core_w_GAM\"] # Cytochrome oxidase knockout μ (growth rate)","category":"page"},{"location":"notebooks/7_community_model/","page":"Building and analysing a small community model","title":"Building and analysing a small community model","text":"atps4r_knockout_model = remove_reactions(base_model, \"ATPS4r\") # knockout the ATP synthase reaction\nsol = flux_balance_analysis_dict(atps4r_knockout_model, Tulip.Optimizer)\nsol[\"BIOMASS_Ecoli_core_w_GAM\"] # ATP synthase knockout μ","category":"page"},{"location":"notebooks/7_community_model/","page":"Building and analysing a small community model","title":"Building and analysing a small community model","text":"eno_knockout_model = remove_reactions(base_model, \"ENO\") # knockout the enolase reaction\nsol = flux_balance_analysis_dict(eno_knockout_model, Tulip.Optimizer)\nsol[\"BIOMASS_Ecoli_core_w_GAM\"] # Enolase knockout μ, cannot grow by itself","category":"page"},{"location":"notebooks/7_community_model/#Build-a-community-model-of-the-cytochrome-oxidase-knockout-and-the-ATP-synthase-knockout-models","page":"Building and analysing a small community model","title":"Build a community model of the cytochrome oxidase knockout and the ATP synthase knockout models","text":"","category":"section"},{"location":"notebooks/7_community_model/","page":"Building and analysing a small community model","title":"Building and analysing a small community model","text":"ex_rxns = filter(looks_like_exchange_reaction, reactions(base_model)) # identify exchange reactions heuristically\nex_mets = [first(keys(reaction_stoichiometry(base_model, ex_rxn))) for ex_rxn in ex_rxns] # identify exchange metabolites IN THE SAME ORDER as ex_rxns\n[ex_rxns ex_mets]","category":"page"},{"location":"notebooks/7_community_model/","page":"Building and analysing a small community model","title":"Building and analysing a small community model","text":"model_names = [\"cytbd_ko\", \"atps4r_ko\"]\ncommunity_model = join_with_exchanges(\n    [cytbd_knockout_model, atps4r_knockout_model],\n    ex_rxns,\n    ex_mets;\n    add_biomass_objective = true,\n    biomass_ids = [\"BIOMASS_Ecoli_core_w_GAM\", \"BIOMASS_Ecoli_core_w_GAM\"],\n    model_names = model_names,\n)","category":"page"},{"location":"notebooks/7_community_model/#Set-exchange-reaction-bounds-of-community-model-based-on-the-bounds-of-the-individual-models","page":"Building and analysing a small community model","title":"Set exchange reaction bounds of community model based on the bounds of the individual models","text":"","category":"section"},{"location":"notebooks/7_community_model/","page":"Building and analysing a small community model","title":"Building and analysing a small community model","text":"env_ex_rxn_idxs = indexin(ex_rxns, reactions(community_model)) # identify the global (environmental exchange reactions)\ncytbd_ex_rxn_idxs = indexin(ex_rxns, reactions(cytbd_knockout_model)) # identify the indices of the corresponding exchange reactions in the original models\natps4r_ex_rxn_idxs = indexin(ex_rxns, reactions(atps4r_knockout_model))","category":"page"},{"location":"notebooks/7_community_model/","page":"Building and analysing a small community model","title":"Building and analysing a small community model","text":"In case some exchange reactions are not present in both models, set environmental exchange bound to the sum of the individual exchange bounds","category":"page"},{"location":"notebooks/7_community_model/","page":"Building and analysing a small community model","title":"Building and analysing a small community model","text":"for (env_ex, m2_ex, m1_ex) in zip(env_ex_rxn_idxs, cytbd_ex_rxn_idxs, atps4r_ex_rxn_idxs)\n    m2lb = isnothing(m2_ex) ? 0.0 : atps4r_knockout_model.xl[m2_ex]\n    m2ub = isnothing(m2_ex) ? 0.0 : atps4r_knockout_model.xu[m2_ex]\n    m1lb = isnothing(m1_ex) ? 0.0 : cytbd_knockout_model.xl[m1_ex]\n    m1ub = isnothing(m1_ex) ? 0.0 : cytbd_knockout_model.xu[m1_ex]\n    change_bounds!(community_model, [env_ex]; lower = [m1lb + m2lb], upper = [m1ub + m2ub])\nend","category":"page"},{"location":"notebooks/7_community_model/#Add-objective-function-to-community-model","page":"Building and analysing a small community model","title":"Add objective function to community model`","text":"","category":"section"},{"location":"notebooks/7_community_model/","page":"Building and analysing a small community model","title":"Building and analysing a small community model","text":"biomass_ids = model_names .* \"_BIOMASS_Ecoli_core_w_GAM\"\nadd_objective!(\n    community_model,\n    biomass_ids;\n    objective_column_index = first(\n        indexin([\"community_biomass\"], reactions(community_model)),\n    ),\n)","category":"page"},{"location":"notebooks/7_community_model/#Perform-community-FBA","page":"Building and analysing a small community model","title":"Perform community FBA","text":"","category":"section"},{"location":"notebooks/7_community_model/","page":"Building and analysing a small community model","title":"Building and analysing a small community model","text":"d = flux_balance_analysis_dict(\n    community_model,\n    Tulip.Optimizer;\n    modifications = [change_optimizer_attribute(\"IPM_IterationsLimit\", 1000)],\n)\nd[\"community_biomass\"] # community μ","category":"page"},{"location":"notebooks/7_community_model/","page":"Building and analysing a small community model","title":"Building and analysing a small community model","text":"Notice, the growth rate is limited to the slowest organism as per the objective function","category":"page"},{"location":"notebooks/7_community_model/#Add-the-enolase-knockout-to-the-community-model","page":"Building and analysing a small community model","title":"Add the enolase knockout to the community model","text":"","category":"section"},{"location":"notebooks/7_community_model/","page":"Building and analysing a small community model","title":"Building and analysing a small community model","text":"community_model = add_model_with_exchanges(\n    community_model,\n    eno_knockout_model,\n    ex_rxns,\n    ex_mets;\n    model_name = \"eno_ko\",\n    biomass_id = \"BIOMASS_Ecoli_core_w_GAM\",\n)\n\npush!(model_names, \"eno_ko\")\nbiomass_ids = model_names .* \"_BIOMASS_Ecoli_core_w_GAM\"\nadd_objective!(\n    community_model,\n    biomass_ids;\n    objective_column_index = first(\n        indexin([\"community_biomass\"], reactions(community_model)),\n    ),\n)\n\nd = flux_balance_analysis_dict(\n    community_model,\n    Tulip.Optimizer;\n    modifications = [change_optimizer_attribute(\"IPM_IterationsLimit\", 1000)],\n)\nprintln(\"Community μ = \", d[\"community_biomass\"])","category":"page"},{"location":"notebooks/7_community_model/","page":"Building and analysing a small community model","title":"Building and analysing a small community model","text":"Notice that the high communal growth rate is 0, due to the enolase knockout. The reason for this behaviour: enolase is a central reaction in glycolysis - without it the organism cannot access the lower glycolysis pathways or the TCA cycle, hence the model predicts no growth for the knockout, and hence no growth for the system since they all have to have the same growth rate.","category":"page"},{"location":"notebooks/7_community_model/#Allow-the-mutants-to-rescue-each-other-by-sharing-pyruvate","page":"Building and analysing a small community model","title":"Allow the mutants to rescue each other by sharing pyruvate","text":"","category":"section"},{"location":"notebooks/7_community_model/","page":"Building and analysing a small community model","title":"Building and analysing a small community model","text":"pyr_exs = model_names .* \"_EX_pyr_e\"\nchange_bounds!(community_model, pyr_exs; lower = fill(-1000.0, 3), upper = fill(1000.0, 3))\n\nd = flux_balance_analysis_dict(\n    community_model,\n    Tulip.Optimizer;\n    modifications = [change_optimizer_attribute(\"IPM_IterationsLimit\", 1000)],\n)\nd[\"community_biomass\"] # community μ","category":"page"},{"location":"notebooks/7_community_model/","page":"Building and analysing a small community model","title":"Building and analysing a small community model","text":"Notice that the growth rate is now above 0! Nutrient sharing saved the day!","category":"page"},{"location":"notebooks/7_community_model/","page":"Building and analysing a small community model","title":"Building and analysing a small community model","text":"","category":"page"},{"location":"notebooks/7_community_model/","page":"Building and analysing a small community model","title":"Building and analysing a small community model","text":"This page was generated using Literate.jl.","category":"page"},{"location":"notebooks/6_screening/","page":"Exploring model variants with screen","title":"Exploring model variants with screen","text":"EditURL = \"https://github.com/LCSB-BioCore/COBREXA.jl/blob/master/docs/src/notebooks/6_screening.jl\"","category":"page"},{"location":"notebooks/6_screening/#Exploring-model-variants-with-screen","page":"Exploring model variants with screen","title":"Exploring model variants with screen","text":"","category":"section"},{"location":"notebooks/6_screening/","page":"Exploring model variants with screen","title":"Exploring model variants with screen","text":"(Image: ) (Image: )","category":"page"},{"location":"notebooks/6_screening/","page":"Exploring model variants with screen","title":"Exploring model variants with screen","text":"This notebooks demonstrates a simple use of screen to explore large number of model variants. On the toy E. Coli model, we try to map the impact of knocking out single reactions and 2-reaction combinations.","category":"page"},{"location":"notebooks/6_screening/","page":"Exploring model variants with screen","title":"Exploring model variants with screen","text":"First, let's download the data and load the packages and the model","category":"page"},{"location":"notebooks/6_screening/","page":"Exploring model variants with screen","title":"Exploring model variants with screen","text":"!isfile(\"e_coli_core.json\") &&\n    download(\"http://bigg.ucsd.edu/static/models/e_coli_core.json\", \"e_coli_core.json\");\n\nusing COBREXA, Tulip\n\nmodel = load_model(StandardModel, \"e_coli_core.json\")","category":"page"},{"location":"notebooks/6_screening/#Preparing-the-functions","page":"Exploring model variants with screen","title":"Preparing the functions","text":"","category":"section"},{"location":"notebooks/6_screening/","page":"Exploring model variants with screen","title":"Exploring model variants with screen","text":"While we could use the with_changed_bound to limit the reaction rates, but we will make a slightly more precise, usage-tailored modification. This is a straightforward modification of the with_changed_bound that does not set bounds \"outside\" of the original bounds:","category":"page"},{"location":"notebooks/6_screening/","page":"Exploring model variants with screen","title":"Exploring model variants with screen","text":"with_limited_rate(reaction_id::String, limit) =\n    model::StandardModel -> begin\n        m = copy(model)\n        m.reactions = copy(model.reactions)\n        r = m.reactions[reaction_id] = copy(model.reactions[reaction_id])\n        if -limit > r.lb\n            r.lb = -limit\n        end\n        if limit < r.ub\n            r.ub = limit\n        end\n        m\n    end","category":"page"},{"location":"notebooks/6_screening/#Knocking-out-single-reactions","page":"Exploring model variants with screen","title":"Knocking out single reactions","text":"","category":"section"},{"location":"notebooks/6_screening/","page":"Exploring model variants with screen","title":"Exploring model variants with screen","text":"This can be applied to see how much biomass can the model produce with certain reactions limited to almost zero:","category":"page"},{"location":"notebooks/6_screening/","page":"Exploring model variants with screen","title":"Exploring model variants with screen","text":"get_biomass(x) = isnothing(x) ? 0 : x[\"BIOMASS_Ecoli_core_w_GAM\"]\n\nproductions = screen_variants(\n    model,\n    [[with_limited_rate(rxn, 0.1)] for rxn in reactions(model)],\n    model -> get_biomass(flux_balance_analysis_dict(model, Tulip.Optimizer)),\n)","category":"page"},{"location":"notebooks/6_screening/","page":"Exploring model variants with screen","title":"Exploring model variants with screen","text":"This can be nicely plotted to give a more comprehensive overview of which reactions are critical or not:","category":"page"},{"location":"notebooks/6_screening/","page":"Exploring model variants with screen","title":"Exploring model variants with screen","text":"using CairoMakie\n\ndisp_rxns = rand(1:95, 20) # only display 20 random fluxes to save space\nbarplot(\n    productions[disp_rxns],\n    direction = :x,\n    axis = (\n        yticks = (1:20, reactions(model)[disp_rxns]),\n        xlabel = \"Flux [mmol/gDW/h]\",\n        ylabel = \"Reaction ID\",\n    ),\n)","category":"page"},{"location":"notebooks/6_screening/#Knocking-out-reaction-combinations","page":"Exploring model variants with screen","title":"Knocking out reaction combinations","text":"","category":"section"},{"location":"notebooks/6_screening/","page":"Exploring model variants with screen","title":"Exploring model variants with screen","text":"It is very easy to prepare matrices of biomass productions from all possible two-reaction knockouts. To make it more interesting, we will restrict one of the reactions of the pair a bit less, to see more possible outcomes.","category":"page"},{"location":"notebooks/6_screening/","page":"Exploring model variants with screen","title":"Exploring model variants with screen","text":"We do not process all reactions here to make the notebook rendering efficient, but you can easily remove the restriction, and speed the process up using parallel execution, by specifying workers argument (see documentation of screen for details)","category":"page"},{"location":"notebooks/6_screening/","page":"Exploring model variants with screen","title":"Exploring model variants with screen","text":"rxns = reactions(model)\n\nproductions = screen_variants(\n    model,\n    [\n        [with_limited_rate(rxn1, 3), with_limited_rate(rxn2, 0.1)] for rxn1 in rxns,\n        rxn2 in rxns\n    ],\n    model -> get_biomass(flux_balance_analysis_dict(model, Tulip.Optimizer)),\n)\n\nf = Figure()\nax = Axis(\n    f[1, 1],\n    ylabel = \"Reaction KO\",\n    xlabel = \"Reaction KO\",\n    yticks = (1:20, reactions(model)[disp_rxns]),\n    xticks = (1:20, reactions(model)[disp_rxns]),\n    xticklabelrotation = -pi / 4,\n)\nhm = heatmap!(ax, productions[disp_rxns, disp_rxns])\nColorbar(f[1, 2], hm, label = \"Flux [mmol/gDW/h]\")\nf","category":"page"},{"location":"notebooks/6_screening/","page":"Exploring model variants with screen","title":"Exploring model variants with screen","text":"","category":"page"},{"location":"notebooks/6_screening/","page":"Exploring model variants with screen","title":"Exploring model variants with screen","text":"This page was generated using Literate.jl.","category":"page"},{"location":"howToContribute/#Contributing-to-COBREXA.jl","page":"How to contribute","title":"Contributing to COBREXA.jl","text":"","category":"section"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":":+1::tada: Thanks for taking the time to contribute to COBREXA.jl! :tada::+1:","category":"page"},{"location":"howToContribute/#How-to-report-a-bug-or-suggest-an-enhancement","page":"How to contribute","title":"How to report a bug or suggest an enhancement","text":"","category":"section"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"Please use the GitHub issue tracker to report any problems with the software, and discuss any potential questions about COBREXA use.","category":"page"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"Before creating bug reports, please check the open issues, you might find out that the issue is already reported and known.","category":"page"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"General guidelines for reporting issues:","category":"page"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"If creating a bug report, include a complete description of how we can reproduce the bug, including e.g. links to datasets and any external scripts used. Ideally, try to create a code snippet that causes the problem on a fresh installation of COBREXA.jl (often called the \"minimal crashing example\")\nIf possible, use the supplied issue templates and fill in all fields.\nIf your issue is already described in an issue that is \"closed\", do not reopen it. Instead, open a new issue and include a link to the original issue. (The fact that the original issue might have been mistakenly closed may be an issue on its own.)\nEnhancement proposals should refer a viable way for implementing the enhancement. If there are multiple possibilities for implementation, we will welcome a discussion about which one is optimal for COBREXA.jl.","category":"page"},{"location":"howToContribute/#How-to-test-a-development-version-of-the-package?","page":"How to contribute","title":"How to test a development version of the package?","text":"","category":"section"},{"location":"howToContribute/#Step-1:-Load-COBREXA.jl-from-the-source-from-the-git-repository","page":"How to contribute","title":"Step 1: Load COBREXA.jl from the source from the git repository","text":"","category":"section"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"There are two ways that you can retrieve a local copy of the development repo: you can either clone the repository manually, or use Julia package manager to get a development version for you.","category":"page"},{"location":"howToContribute/#Option-1:-Using-Julia-package-manager","page":"How to contribute","title":"Option 1: Using Julia package manager","text":"","category":"section"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"When you are used to using the Julia package manager for developing or contributing to packages, you can type:","category":"page"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"(v1.6) pkg> dev COBREXA","category":"page"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"This will install the COBREXA package locally and check it out for development. You can check the location of the package with:","category":"page"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"(v1.6) pkg> status\n    Status `~/.julia/environments/v1.4/Project.toml`\n  [a03a9c34] COBREXA v0.0.5 [`~/.julia/dev/COBREXA`]","category":"page"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"The default location of the package is ~/.julia/dev/COBREXA.","category":"page"},{"location":"howToContribute/#Option-2:-Cloning-with-git-manually","page":"How to contribute","title":"Option 2: Cloning with git manually","text":"","category":"section"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"You can use git to get the sources as follows:","category":"page"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"$ git clone git@github.com:LCSB-BioCore/COBREXA.jl.git","category":"page"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"When the cloning process finishes, you shold see the package cloned in a new directory COBREXA.jl. To install this version to your Julia, change to the directory first, and start Julia:","category":"page"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"$ cd COBREXA.jl\n$ julia","category":"page"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"With Julia, you can install the development version of the package from the directory as follows:","category":"page"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"(v1.6) pkg> add .","category":"page"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"(press ] to get into the packaging environment)","category":"page"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"This adds the COBREXA.jl package and all its dependencies. You can verify that the installation worked by typing:","category":"page"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"(v1.6) pkg> status","category":"page"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"If you are planning to develop the package, it is often easier to install the package in development mode, with dev command:","category":"page"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"(v1.6) pkg> dev .","category":"page"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"That causes the package to always load with whatever code changes that you added to the source directory.","category":"page"},{"location":"howToContribute/#Finally:-load-COBREXA.jl","page":"How to contribute","title":"Finally: load COBREXA.jl","text":"","category":"section"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"With both of above options, you should get COBREXA.jl installed, which means that the following command should, without errors, load the package and make COBREXA.jl functions available for testing:","category":"page"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"julia> using COBREXA","category":"page"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"You may now freely modify the code and test the result.","category":"page"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"Remember that if you want to work in the environment of the package, you need to activate it. That causes, among other, that the additional dependencies specified with packaging add command will be written automaticaly to Project.toml file of your local COBREXA.jl clone, not to your global environment. Activation is simple: when in the directory of the package, just type the command into the packaging shell:","category":"page"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"(v1.6) pkg> activate","category":"page"},{"location":"howToContribute/#Step-2:-Publish-your-changes","page":"How to contribute","title":"Step 2: Publish your changes","text":"","category":"section"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"You are expected to make a fork of the main COBREXA.jl repository, and open a pull request from that one to the master branch of the main repository. For creating the fork, just hit the \"Fork\" button on GitHub.","category":"page"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"After that, change the directory to your repository and adjust the remotes:","category":"page"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"$ cd ~/.julia/dev/COBREXA             # or any other directory, as needed\n$ git remote rename origin upstream   # renames the origin (the main COBREXA.jl repo) to upstream\n$ git remote add origin git@github.com:yourUsername/COBREXA.jl.git  # adds the link to your clone as new origin\n$ git fetch origin                    # fetches the refs from your repo","category":"page"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"In the above code, change yourUsername is your GitHub username.","category":"page"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"When the renaming is done, start a new branch at upstream/master. In the code snippet, substitute yn for your initials (Your Name here) and give the new feature a better name than somefeature:","category":"page"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"$ git checkout -b yn-somefeature origin/master","category":"page"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"Commit any changes and features that you like to the new branch. When the commits look complete to you, push the branch to your repository fork:","category":"page"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"$ git push -u origin yn-somefeature","category":"page"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"This makes your changes visible in your repository. After that, you can navigate to GitHub's pull request page, where you should immediately see a big green button that helps you to create a pull request for this branch. Read the section below for precise details and guidelines on submitting the pull requests.","category":"page"},{"location":"howToContribute/#How-to-submit-a-pull-request-(PR)-with-your-modification/enhancement?","page":"How to contribute","title":"How to submit a pull request (PR) with your modification/enhancement?","text":"","category":"section"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"Make a fork of the repository, commit the modifications in a separate branch and push the branch to your fork.\nMake a pull request where you describe the motivation and expected outcome for the users. Specifically, consider any possible incompatibilities, and the necessity to increment the version number after your changes are applied. Label your pull request with a semantic emoji in the title to indicate what it addresses.\nAfter submitting the pull request, verify that all status checks (tests, documentation) are passing. Make sure any new contribution is properly documented and tested (you may want to check with coverage tools, using test --coverage from the Julia packaging shell)","category":"page"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"After you submitted a pull request, a label might be assigned that allows us to track and manage issues and pull requests.","category":"page"},{"location":"howToContribute/#Code-culture-and-style-recommendations","page":"How to contribute","title":"Code culture and style recommendations","text":"","category":"section"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"Follow basic rules for software maintainability and extensibility:","category":"page"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"Do not reimplement functionality that is available in other packages, unless the reimplementation is either trivial and short, or there is a grave need to do so because the other implementations are deficient in some manner.\nTry to keep the function names and interfaces consistent with ecosystem standards and the other functions in the package. Consistency reduces the amount of surprise on the user side, thus lowers the need to reach for documentation, and in turn makes the software much easier and faster to use.\nCode less. Shorter code is almost always better unless demonstrated otherwise, e.g. with a benchmark. Avoid repetitive boilerplate (there should be ways to generate it, if needed).\nKeep the functionality \"open\" and composable. In particular, avoid all unnecessarily opaque and leaky abstractions (common in object-oriented programming).\nAvoid producing lots of \"informative\" text side-output by default, unless that is what the user asked for.\nAdhere to the code formatting rules defined by JuliaFormatter. We usually have a bot running that checks all PRs and reports whether the code is properly formatted.","category":"page"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"Follow the common rules for making easily mergable and reviewable PRs:","category":"page"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"Create one PR for each logical \"feature\" you want to merge. If your change is more complex and contains multiple \"stages\", open multiple PRs.\nKeep the test coverage reasonably high.\nIf you commit many small, partial changes in a PR, you may help us save energy by prefixing your commit names with [skip ci], which deactivates the CI trigger on that commit. With each skipped CI, you save a few watt-hours of energy. Testing just the \"final\" commit of the pull-request branch is sufficient.","category":"page"},{"location":"howToContribute/#For-developers:-What-is-the-expected-branch-management/workflow?","page":"How to contribute","title":"For developers: What is the expected branch management/workflow?","text":"","category":"section"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"The workflow is based on GitLab flow, i.e., a master branch with feature branches being merged into the master branch. Depending on your access rights, you may open the feature branch in this repository, on in your fork.","category":"page"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"The guidelines can be summarized as such:","category":"page"},{"location":"howToContribute/","page":"How to contribute","title":"How to contribute","text":"when making a contribution, create one new branch and open one new PR for each new independent feature or bugfix\ndo not push to another branch unless it is your own\ntry to get a review before merging unless the change is trivial and non-impacting\nconsider prefixing your branch names with your initials, so that one can easily see who owns which branch (e.g. ad-somefeature would be committed by Arthur Dent)","category":"page"},{"location":"notebooks/2_finding_balance/","page":"Finding balance and variability of constraint-based models","title":"Finding balance and variability of constraint-based models","text":"EditURL = \"https://github.com/LCSB-BioCore/COBREXA.jl/blob/master/docs/src/notebooks/2_finding_balance.jl\"","category":"page"},{"location":"notebooks/2_finding_balance/#Finding-balance-and-variability-of-constraint-based-models","page":"Finding balance and variability of constraint-based models","title":"Finding balance and variability of constraint-based models","text":"","category":"section"},{"location":"notebooks/2_finding_balance/","page":"Finding balance and variability of constraint-based models","title":"Finding balance and variability of constraint-based models","text":"(Image: ) (Image: )","category":"page"},{"location":"notebooks/2_finding_balance/","page":"Finding balance and variability of constraint-based models","title":"Finding balance and variability of constraint-based models","text":"Here we use flux_balance_analysis, flux_variability_analysis, and parsimonious_flux_balance_analysis of COBREXA.jl functions to analyze a toy model of E. coli.","category":"page"},{"location":"notebooks/2_finding_balance/","page":"Finding balance and variability of constraint-based models","title":"Finding balance and variability of constraint-based models","text":"If it is not already present, download the model.","category":"page"},{"location":"notebooks/2_finding_balance/","page":"Finding balance and variability of constraint-based models","title":"Finding balance and variability of constraint-based models","text":"!isfile(\"e_coli_core.xml\") &&\n    download(\"http://bigg.ucsd.edu/static/models/e_coli_core.xml\", \"e_coli_core.xml\")\n\nusing COBREXA","category":"page"},{"location":"notebooks/2_finding_balance/","page":"Finding balance and variability of constraint-based models","title":"Finding balance and variability of constraint-based models","text":"tip: Tip: use `?` to get quick help about functions\nWhen you are unsure about how a function works, write ?   function_name to see the function reference documentation.","category":"page"},{"location":"notebooks/2_finding_balance/","page":"Finding balance and variability of constraint-based models","title":"Finding balance and variability of constraint-based models","text":"model = load_model(\"e_coli_core.xml\")","category":"page"},{"location":"notebooks/2_finding_balance/#Optimization-solvers-in-COBREXA","page":"Finding balance and variability of constraint-based models","title":"Optimization solvers in COBREXA","text":"","category":"section"},{"location":"notebooks/2_finding_balance/","page":"Finding balance and variability of constraint-based models","title":"Finding balance and variability of constraint-based models","text":"To actually perform any optimization based analysis we need to load an optimizer. Any JuMP.jl-supported optimizers will work. Here, we will use Tulip.jl to optimize linear programs and OSQP.jl to optimize quadratic programs.","category":"page"},{"location":"notebooks/2_finding_balance/","page":"Finding balance and variability of constraint-based models","title":"Finding balance and variability of constraint-based models","text":"note: Note: OSQP can be sensitive\nWe recommend reading the docs of OSQP before using it, since   it may give inconsistent results depending on what settings   you use. Commercial solvers like Gurobi, Mosek, CPLEX, etc.   require less user engagement.","category":"page"},{"location":"notebooks/2_finding_balance/","page":"Finding balance and variability of constraint-based models","title":"Finding balance and variability of constraint-based models","text":"using Tulip, OSQP","category":"page"},{"location":"notebooks/2_finding_balance/#Flux-balance-analysis-(FBA)","page":"Finding balance and variability of constraint-based models","title":"Flux balance analysis (FBA)","text":"","category":"section"},{"location":"notebooks/2_finding_balance/","page":"Finding balance and variability of constraint-based models","title":"Finding balance and variability of constraint-based models","text":"Most analysis functions come in several variants that produce different types of output. All of them usually require a model and JuMP.jl-compatible optimizer to work in the model.","category":"page"},{"location":"notebooks/2_finding_balance/","page":"Finding balance and variability of constraint-based models","title":"Finding balance and variability of constraint-based models","text":"In the case of FBA, you may choose from these variants (here using the Tulip optimizer):","category":"page"},{"location":"notebooks/2_finding_balance/","page":"Finding balance and variability of constraint-based models","title":"Finding balance and variability of constraint-based models","text":"vec_soln = flux_balance_analysis_vec(model, Tulip.Optimizer)","category":"page"},{"location":"notebooks/2_finding_balance/","page":"Finding balance and variability of constraint-based models","title":"Finding balance and variability of constraint-based models","text":"dict_soln = flux_balance_analysis_dict(model, Tulip.Optimizer)","category":"page"},{"location":"notebooks/2_finding_balance/#Modifications","page":"Finding balance and variability of constraint-based models","title":"Modifications","text":"","category":"section"},{"location":"notebooks/2_finding_balance/","page":"Finding balance and variability of constraint-based models","title":"Finding balance and variability of constraint-based models","text":"Often it is desirable to add a slight modififaction to the problem before performing analysis, to see e.g. differences of the model behavior caused by the change introduced.","category":"page"},{"location":"notebooks/2_finding_balance/","page":"Finding balance and variability of constraint-based models","title":"Finding balance and variability of constraint-based models","text":"COBREXA.jl supports several modifications by default, which include changing objective sense, optimizer attributes, flux constraints, optimization objective, reaction and gene knockouts, and others.","category":"page"},{"location":"notebooks/2_finding_balance/","page":"Finding balance and variability of constraint-based models","title":"Finding balance and variability of constraint-based models","text":"dict_soln = flux_balance_analysis_dict(\n    model,\n    OSQP.Optimizer;\n    modifications = [ # modifications are applied in order\n        # this changes the objective to maximize the biomass production\n        change_objective(\"R_BIOMASS_Ecoli_core_w_GAM\"),\n\n        # this fixes a specific rate of the glucose exchange\n        change_constraint(\"R_EX_glc__D_e\", -12, -12),\n\n        # this knocks out two genes, i.e. constrains their associated reactions to zero.\n        knockout([\"b0978\", \"b0734\"]), ## the gene IDs are cytochrome oxidase (CYTBD)\n\n        # ignore the optimizer specified above and change it to Tulip\n        change_optimizer(Tulip.Optimizer),\n\n        # set a custom attribute of the Tulip optimizer (see Tulip docs for more possibilities)\n        change_optimizer_attribute(\"IPM_IterationsLimit\", 110),\n\n        # explicitly tell the optimizer to maximize the new objective\n        change_sense(MAX_SENSE),\n    ],\n)","category":"page"},{"location":"notebooks/2_finding_balance/#Flux-variability-analysis-(FVA)","page":"Finding balance and variability of constraint-based models","title":"Flux variability analysis (FVA)","text":"","category":"section"},{"location":"notebooks/2_finding_balance/","page":"Finding balance and variability of constraint-based models","title":"Finding balance and variability of constraint-based models","text":"The default FVA in flux_variability_analysis returns maximized and minimized reaction fluxes in a matrix. Here we use the dictionary variant in fluxvariabilityanalysis_dict, to show how to easily access specific fluxes from its results.","category":"page"},{"location":"notebooks/2_finding_balance/","page":"Finding balance and variability of constraint-based models","title":"Finding balance and variability of constraint-based models","text":"fva_mins, fva_maxs = flux_variability_analysis_dict(\n    model,\n    Tulip.Optimizer;\n    bounds = objective_bounds(0.99), # the objective function is allowed to vary by ~1% from the FBA optimum\n    modifications = [\n        change_optimizer_attribute(\"IPM_IterationsLimit\", 500),\n        change_constraint(\"R_EX_glc__D_e\", -10, -10),\n        change_constraint(\"R_EX_o2_e\", 0.0, 0.0),\n    ],\n)","category":"page"},{"location":"notebooks/2_finding_balance/","page":"Finding balance and variability of constraint-based models","title":"Finding balance and variability of constraint-based models","text":"fva_maxs[\"R_EX_ac_e\"][\"R_EX_ac_e\"] # get the maximal acetate exchange flux","category":"page"},{"location":"notebooks/2_finding_balance/#Parsimonious-flux-balance-analysis-(pFBA)","page":"Finding balance and variability of constraint-based models","title":"Parsimonious flux balance analysis (pFBA)","text":"","category":"section"},{"location":"notebooks/2_finding_balance/","page":"Finding balance and variability of constraint-based models","title":"Finding balance and variability of constraint-based models","text":"Parsimonious flux balance analysis (here in parsimonious_flux_balance_analysis finds a unique flux solution that minimizes the squared sum of fluxes of the system subject, while maintaining the same objective value as the flux balance analysis solution. Since we are optimizing a quadratic objective, we also need to switch to a quadratic optimizer. In this case, OSQP will work. We demonstrate it on the dictionary-returning variant of pFBA, parsimonious_flux_balance_analysis_dict:","category":"page"},{"location":"notebooks/2_finding_balance/","page":"Finding balance and variability of constraint-based models","title":"Finding balance and variability of constraint-based models","text":"dict_soln = parsimonious_flux_balance_analysis_dict(\n    model,\n    OSQP.Optimizer;\n    modifications = [\n        silence, # silence the optimizer (OSQP is very verbose by default)\n        change_constraint(\"R_EX_glc__D_e\", -12, -12),\n    ],\n)","category":"page"},{"location":"notebooks/2_finding_balance/","page":"Finding balance and variability of constraint-based models","title":"Finding balance and variability of constraint-based models","text":"The function also has the expectable second variant that returns a vector of solutions, in parsimonious_flux_balance_analysis_vec. Here, we utilize it to show how to use different optimizers for finding the optimum and for solving the quadratic problem. That may be preferable if the optimizer qualities differ for the differing tasks. pFBA allows you to specify qp_modifications that are applied after the original optimum is found, and before the quadratic part of the problem solving begins.","category":"page"},{"location":"notebooks/2_finding_balance/","page":"Finding balance and variability of constraint-based models","title":"Finding balance and variability of constraint-based models","text":"vec_soln = parsimonious_flux_balance_analysis_vec(\n    model,\n    Tulip.Optimizer; # start with Tulip\n    modifications = [\n        change_constraint(\"R_EX_glc__D_e\", -12, -12),\n        change_optimizer_attribute(\"IPM_IterationsLimit\", 500), # we may change Tulip-specific attributes here\n    ],\n    qp_modifications = [\n        change_optimizer(OSQP.Optimizer), # now switch to OSQP (Tulip wouldn't be able to finish the computation)\n        silence, # and make it quiet.\n    ],\n)","category":"page"},{"location":"notebooks/2_finding_balance/","page":"Finding balance and variability of constraint-based models","title":"Finding balance and variability of constraint-based models","text":"","category":"page"},{"location":"notebooks/2_finding_balance/","page":"Finding balance and variability of constraint-based models","title":"Finding balance and variability of constraint-based models","text":"This page was generated using Literate.jl.","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"EditURL = \"https://github.com/LCSB-BioCore/COBREXA.jl/blob/master/docs/src/notebooks/1_loading_converting_saving.jl\"","category":"page"},{"location":"notebooks/1_loading_converting_saving/#Loading,-converting,-and-saving-models","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"","category":"section"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"(Image: ) (Image: )","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"COBREXA can load models stored in .mat, .json, and .xml formats (with the latter denoting SBML formatted models).","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"We will primarily use the E. Coli \"core\" model to demonstrate the utilities found in COBREXA. First, let's download the model in several formats.","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"# Downloads the model files if they don't already exist\n!isfile(\"e_coli_core.mat\") &&\n    download(\"http://bigg.ucsd.edu/static/models/e_coli_core.mat\", \"e_coli_core.mat\");\n!isfile(\"e_coli_core.json\") &&\n    download(\"http://bigg.ucsd.edu/static/models/e_coli_core.json\", \"e_coli_core.json\");\n!isfile(\"e_coli_core.xml\") &&\n    download(\"http://bigg.ucsd.edu/static/models/e_coli_core.xml\", \"e_coli_core.xml\");\nnothing #hide","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"Now, load the package:","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"using COBREXA","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"tip: Save bandwidth!\nThe published models usually do not change very often. It is therefore pretty useful to save them to a central location and load them from there. That saves your time, and does not unnecessarily consume the connectivity resources of the model repository.","category":"page"},{"location":"notebooks/1_loading_converting_saving/#Loading-models","page":"Loading, converting, and saving models","title":"Loading models","text":"","category":"section"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"Load the models using the load_model function. Each model is able to \"pretty-print\" itself, hiding the inner complexity.","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"mat_model = load_model(\"e_coli_core.mat\")","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"json_model = load_model(\"e_coli_core.json\")","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"sbml_model = load_model(\"e_coli_core.xml\")","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"note: Note: `load_model` infers the output type from the file extension\nNotice how each model was read into memory as a model type corresponding   to its file type, i.e. the file ending with .json loaded as a   JSONModel, the file ending with .mat loaded as MATModel, and the   file ending with .xml loaded as an SBMLModel.","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"You can directly inspect the model objects, although only with a specific way for each specific type.","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"JSON models contain their corresponding JSON:","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"json_model.json","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"SBML models contain a complicated structure from SBML.jl package:","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"typeof(sbml_model.sbml)","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"MAT models contain MATLAB data:","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"mat_model.mat","category":"page"},{"location":"notebooks/1_loading_converting_saving/#Using-the-generic-interface-to-access-model-details","page":"Loading, converting, and saving models","title":"Using the generic interface to access model details","text":"","category":"section"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"To prevent the complexities of object representation, COBREXA.jl uses a set of generic interface functions that extract various important information from all supported model types. This approach ensures that the analysis functions can work on any data.","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"For example, you can check the reactions and metabolites contained in SBML and JSON models using the same accessor:","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"reactions(json_model)","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"reactions(sbml_model)","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"issetequal(reactions(json_model), reactions(mat_model)) # do models contain the same reactions?","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"All accessors are defined in a single file in COBREXA source code; you may therefore get a list of all accessors as follows:","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"using InteractiveUtils\n\nfor method in filter(\n    x -> endswith(string(x.file), \"MetabolicModel.jl\"),\n    InteractiveUtils.methodswith(MetabolicModel, COBREXA),\n)\n    println(method.name)\nend","category":"page"},{"location":"notebooks/1_loading_converting_saving/#Converting-between-model-types","page":"Loading, converting, and saving models","title":"Converting between model types","text":"","category":"section"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"It is possible to convert model types to-and-fro. To do this, use the convert function, which is overloaded from Julia's Base.","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"danger: Data loss may occur when converting between models\nThe conversion of models only uses the data accessible through the generic accessors. Other data may get lost.","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"m = convert(MATModel, json_model)","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"m will now contain the MATLAB-style matrix representation of the model:","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"Matrix(m.mat[\"S\"])","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"The loading and conversion can be combined using a shortcut:","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"m = load_model(MATModel, \"e_coli_core.json\")","category":"page"},{"location":"notebooks/1_loading_converting_saving/#Saving-and-exporting-models","page":"Loading, converting, and saving models","title":"Saving and exporting models","text":"","category":"section"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"COBREXA.jl supports exporting the models in JSON and MAT format, using save_model.","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"save_model(m, \"converted_model.json\")\nsave_model(m, \"converted_model.mat\")","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"If you need a non-standard suffix, use the type-specific saving functions:","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"save_json_model(m, \"file.without.a.good.suffix\")\nsave_mat_model(m, \"another.file.matlab\")","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"If you are saving the models only for future processing in Julia environment, it is often wasteful to encode the models to external formats and decode them back. Instead, you can use the \"native\" Julia data format, accessible with package Serialization.","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"This way, you can use serialize to save even the StandardModel that has no file format associated:","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"using Serialization\n\nsm = convert(StandardModel, m)\n\nopen(f -> serialize(f, sm), \"myModel.stdmodel\", \"w\")","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"The models can then be loaded back using deserialize:","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"sm2 = deserialize(\"myModel.stdmodel\")\nissetequal(metabolites(sm), metabolites(sm2))","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"This form of loading operation is usually pretty quick:","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"t = @elapsed deserialize(\"myModel.stdmodel\")\n@info \"Deserialization took $t seconds\"","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"Notably, large and complicated models with thousands of reactions and annotations can take seconds to decode properly. Serialization allows you to almost completely remove this overhead, and scales well to tens of millions of reactions.","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"","category":"page"},{"location":"notebooks/1_loading_converting_saving/","page":"Loading, converting, and saving models","title":"Loading, converting, and saving models","text":"This page was generated using Literate.jl.","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"EditURL = \"https://github.com/LCSB-BioCore/COBREXA.jl/blob/master/docs/src/notebooks/3_basic_stdmodel_usage.jl\"","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/#Basic-usage-of-StandardModel","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"","category":"section"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"(Image: ) (Image: )","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"In this tutorial we will use COBREXA's StandardModel and functions that specifically operate on it. As usual we will use the toy model of E. coli for demonstration.","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"!isfile(\"e_coli_core.json\") &&\n    download(\"http://bigg.ucsd.edu/static/models/e_coli_core.json\", \"e_coli_core.json\")\n\nusing COBREXA","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/#Loading-a-model","page":"Basic usage of StandardModel","title":"Loading a model","text":"","category":"section"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"model = load_model(StandardModel, \"e_coli_core.json\") # we specifically want to load a StandardModel from the model file","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"note: Note: Loading `StandardModel`s implicitly uses `convert`\nWhen using load_model(StandardModel, file_location) the model at   file_location is first loaded into its inferred format and is then   converted to a StandardModel using the generic accessor interface.   Thus, data loss may occur. Always check your model to ensure that   nothing important has been lost.","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/#Basic-analysis","page":"Basic usage of StandardModel","title":"Basic analysis","text":"","category":"section"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"As before, for optimization based analysis we need to load an optimizer. Here we will use Tulip.jl to solve the linear programs of this tutorial. Refer to the basic constraint-based analysis tutorial for more informaiton.","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"All the normal analysis functions work on StandardModel, due to it also having the same generic accessor interface as all the other model types.","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"using Tulip\n\nfluxes = flux_balance_analysis_dict(\n    model,\n    Tulip.Optimizer;\n    modifications = [\n        change_objective(\"BIOMASS_Ecoli_core_w_GAM\"),\n        change_constraint(\"EX_glc__D_e\", -12, -12),\n        change_constraint(\"EX_o2_e\", 0, 0),\n    ],\n)","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"This is not very exciting yet, since every other model type can also do this. However, deeper inspection of flux results is possible when using StandardModel.","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/#Inspecting-the-flux-solution:-atom_exchange","page":"Basic usage of StandardModel","title":"Inspecting the flux solution: atom_exchange","text":"","category":"section"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"It is sometimes interesting to keep track of the atoms entering and leaving the system through boundary reactions. This can be inspected by calling atom_exchange. That gives you the flux of individual atoms getting consumed and produced by all reactions, based on fluxes. We erase the reaction that consumes the atoms for creating biomass, to see how much mass the \"rest\" of the reaction produces for it:","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"fluxes_without_biomass = copy(fluxes);\ndelete!(fluxes_without_biomass, \"BIOMASS_Ecoli_core_w_GAM\");\natom_exchange(model, fluxes_without_biomass)","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/#Inspecting-the-flux-solution:-metabolite_fluxes","page":"Basic usage of StandardModel","title":"Inspecting the flux solution: metabolite_fluxes","text":"","category":"section"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"Another useful flux result analysis function is metabolite_fluxes. This function gives an overview of reactions consuming and producing each metabolite.","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"consuming, producing = metabolite_fluxes(model, fluxes)\n\nconsuming[\"atp_c\"] # reactions consuming `atp_c`","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/#Internals-of-StandardModel","page":"Basic usage of StandardModel","title":"Internals of StandardModel","text":"","category":"section"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"Another benefit of StandardModel is that it supports a richer internal infrastructure that can be used to manipulate internal model attributes in a systematic way. Specifically, the genes, reactions, and metabolites with of a model each have a type. This is particularly useful when modifying or even constructing a model from scratch.","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/#Genes,-Reactions,-and-Metabolites","page":"Basic usage of StandardModel","title":"Genes, Reactions, and Metabolites","text":"","category":"section"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"StandardModel is composed of ordered dictionaries of Genes, Metabolites and Reactions. Ordered dictionaries are used because the order of the reactions and metabolites are important for constructing a stoichiometric matrix since the rows and columns should correspond to the order of the metabolites and reactions returned by calling the accessors metabolites and reactions.","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"Each StandardModel is composed of the following fields:","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"fieldnames(StandardModel) # fields of a StandardModel","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"The :genes field of a StandardModel contains an ordered dictionary of gene ids mapped to Genes.","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"model.genes # the keys of this dictionary are the same as genes(model)","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"The Gene type is a struct that can be used to store information about genes in a StandardModel. Each Gene is composed of the following fields:","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"fieldnames(Gene)","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"tip: Tip: Use <tab> complete to explore the structure of types\nUse <tab> to quickly explore the fields of a struct. For example,   Gene.<tab> will list all the fields shown above.","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"The keys used in the ordered dictionaries in model.genes are the ids returned using the generic accessor genes. Genes have pretty printing, as demonstrated below for a random gene drawn from the model:","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"random_gene_id = genes(model)[rand(1:n_genes(model))]\nmodel.genes[random_gene_id]","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"The same idea holds for both metabolites (stored as Metabolites) and reactions (stored as Reactions). This is demonstrated below.","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"random_metabolite_id = metabolites(model)[rand(1:n_metabolites(model))]\nmodel.metabolites[random_metabolite_id]","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"random_reaction_id = reactions(model)[rand(1:n_reactions(model))]\nmodel.reactions[random_reaction_id]","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"StandardModel can be used to build your own metabolic model or modify an existing one. One of the main use cases for StandardModel is that it can be used to merge multiple models or parts of multiple models together. Since the internals are uniform inside each StandardModel, attributes of other model types are squashed into the required format (using the generic accessors). This ensures that the internals of all StandardModels are the same - allowing easy systematic evaluation.","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"warning: Warning: Combining models with different namespaces is tricky\nCombining models that use different namespaces requires care.   For example, in some models the water exchange reaction is called   EX_h2o_e, while in others it is called R_EX_h2o_s. This needs to   manually addressed (for now) to prevent duplicate, e.g. reactions,   from being added.","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/#Checking-the-internals-of-StandardModels:-annotation_index","page":"Basic usage of StandardModel","title":"Checking the internals of StandardModels: annotation_index","text":"","category":"section"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"Often when models are automatically reconstructed duplicate genes, reactions or metabolites end up in a model. COBREXA exports annotation_index to check for cases where the id of a struct may be different, but the annotations the same (possibly suggesting a duplication). annotation_index builds a dictionary mapping annotation features to the ids of whatever struct you are inspecting. This makes it easy to find structs that share certain annotation features.","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"rxn_annotations = annotation_index(model.reactions)","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"rxn_annotations[\"ec-code\"]","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"The annotation_index function can also be used on Reactions and Genes in the same way.","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/#Checking-the-internals-of-StandardModels:-check_duplicate_reaction","page":"Basic usage of StandardModel","title":"Checking the internals of StandardModels: check_duplicate_reaction","text":"","category":"section"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"Another useful function is check_duplicate_reaction, which checks for reactions that have duplicate (or similar) reaction equations.","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"pgm_duplicate = Reaction()\npgm_duplicate.id = \"pgm2\" # Phosphoglycerate mutase\npgm_duplicate.metabolites = Dict{String,Float64}(\"3pg_c\" => 1, \"2pg_c\" => -1)\npgm_duplicate","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"check_duplicate_reaction(pgm_duplicate, model.reactions; only_metabolites = false) # can also just check if only the metabolites are the same but different stoichiometry is used","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/#Checking-the-internals-of-StandardModels:-is_mass_balanced","page":"Basic usage of StandardModel","title":"Checking the internals of StandardModels: is_mass_balanced","text":"","category":"section"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"Finally, is_mass_balanced can be used to check if a reaction is mass balanced based on the formulas of the reaction equation.","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"pgm_duplicate.metabolites = Dict{String,Float64}(\"3pg_c\" => 1, \"2pg_c\" => -1, \"h2o_c\" => 1) # not mass balanced now\nis_bal, extra_atoms = is_mass_balanced(model, pgm_duplicate) # extra_atoms shows which atoms are in excess/deficit","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"","category":"page"},{"location":"notebooks/3_basic_stdmodel_usage/","page":"Basic usage of StandardModel","title":"Basic usage of StandardModel","text":"This page was generated using Literate.jl.","category":"page"},{"location":"","page":"Home","title":"Home","text":"<br>\n<div align=\"center\">\n    <img class=\"docs-light-only\" src=\"assets/header.svg?maxAge=0\" width=\"80%\">\n    <img class=\"docs-dark-only\" src=\"assets/header-dark.svg?maxAge=0\" width=\"80%\">\n</div>\n<br>","category":"page"},{"location":"#Constraint-Based-Reconstruction-and-EXascale-Analysis","page":"Home","title":"Constraint-Based Reconstruction and EXascale Analysis","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"Repository Tests Coverage How to contribute?\n(Image: GitHub) (Image: CI) (Image: codecov) (Image: contrib)","category":"page"},{"location":"","page":"Home","title":"Home","text":"COBREXA is a toolkit for working with large constraint-based metabolic models, and a running very large number of analysis tasks on these models in parallel. Its main purpose is to make the methods of Constraint-based Reconstruction and Analysis (COBRA) scale to problem sizes that require the use of huge computer clusters and HPC environments, which allows them to be realistically applied to pre-exascale-sized models.","category":"page"},{"location":"","page":"Home","title":"Home","text":"In this package, you will find the usual COBRA-like functions that interface to underlying linear programming solvers. We use JuMP.jl as the unified interface for many solvers; you can plug in whichever compatible solver you want, including the popular Tulip.jl, GLPK.jl, OSQP.jl, and Gurobi.jl.","category":"page"},{"location":"","page":"Home","title":"Home","text":"<div align=\"center\">\n<img style=\"width:300px;margin:10px;border-offset:15px;border: 1px solid #eee;border-radius: 50%;padding: 10px;-webkit-border-radius: 50%;-moz-border-radius: 50%;\" src=\"https://git-r3lab.uni.lu/lcsb-biocore/COBREXA.jl/-/jobs/artifacts/master/raw/output.gif?job=generator:gource\" alt=\"history\"><br>\nDevelopment history of COBREXA.jl.\n</div>","category":"page"},{"location":"#Quick-start-guide","page":"Home","title":"Quick start guide","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"You can install COBREXA from Julia repositories. Start julia, press ] to switch to the Packaging environment, and type:","category":"page"},{"location":"","page":"Home","title":"Home","text":"add COBREXA","category":"page"},{"location":"","page":"Home","title":"Home","text":"You also need to install your favorite solver supported by JuMP.jl, typing e.g.:","category":"page"},{"location":"","page":"Home","title":"Home","text":"add Tulip","category":"page"},{"location":"","page":"Home","title":"Home","text":"When the packages are installed, switch back to the \"normal\" julia shell by pressing Backspace (the prompt should change color back to green). After that, you can download a SBML model from the internet and perform a flux balance analysis as follows:","category":"page"},{"location":"","page":"Home","title":"Home","text":"using COBREXA   # loads the package\nusing Tulip     # loads the optimization solver\n\n# download the model\ndownload(\"http://bigg.ucsd.edu/static/models/e_coli_core.xml\", \"e_coli_core.xml\")\n\n# open the SBML file and load the contents\nmodel = load_model(\"e_coli_core.xml\")\n\n# run a FBA\nfluxes = flux_balance_analysis_dict(model, Tulip.Optimizer)","category":"page"},{"location":"","page":"Home","title":"Home","text":"The variable fluxes will now contain a dictionary of the computed optimal flux of each reaction in the model:","category":"page"},{"location":"","page":"Home","title":"Home","text":"Dict{String,Float64} with 95 entries:\n  \"R_EX_fum_e\"    => 0.0\n  \"R_ACONTb\"      => 6.00725\n  \"R_TPI\"         => 7.47738\n  \"R_SUCOAS\"      => -5.06438\n  \"R_GLNS\"        => 0.223462\n  \"R_EX_pi_e\"     => -3.2149\n  \"R_PPC\"         => 2.50431\n  \"R_O2t\"         => 21.7995\n  \"R_G6PDH2r\"     => 4.95999\n  \"R_TALA\"        => 1.49698\n  ⋮               => ⋮","category":"page"},{"location":"#Basic-and-quick-start-tutorials","page":"Home","title":"Basic and quick-start tutorials","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"Detailed tutorial content is available here.","category":"page"},{"location":"","page":"Home","title":"Home","text":"Pages = joinpath.(\"tutorials\", filter(x -> endswith(x, \".md\"), readdir(\"tutorials\")))\nDepth = 1","category":"page"},{"location":"#Advanced-tutorials","page":"Home","title":"Advanced tutorials","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"Detailed listing of advanced tutorials is available here.","category":"page"},{"location":"","page":"Home","title":"Home","text":"Pages = joinpath.(\"advanced\", filter(x -> endswith(x, \".md\"), readdir(\"advanced\")))\nDepth = 1","category":"page"},{"location":"#Example-notebooks-and-workflows","page":"Home","title":"Example notebooks and workflows","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"Detailed notebook content is available here.","category":"page"},{"location":"","page":"Home","title":"Home","text":"Pages = joinpath.(\"notebooks\", filter(x -> endswith(x, \".md\"), readdir(\"notebooks\")))\nDepth = 1","category":"page"},{"location":"#Functions-reference","page":"Home","title":"Functions reference","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"Pages = [\"functions.md\"]","category":"page"},{"location":"#Contribution-guide","page":"Home","title":"Contribution guide","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"If you wish to contribute code, patches or improvements to COBREXA.jl, please read the basic contribution guidelines and hints..","category":"page"},{"location":"#Acknowledgements","page":"Home","title":"Acknowledgements","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"COBREXA.jl is developed at the Luxembourg Centre for Systems Biomedicine of the University of Luxembourg (uni.lu/lcsb), cooperating with the Institute for Quantitative and Theoretical Biology at the Heinrich Heine University in Düsseldorf (qtb.hhu.de).","category":"page"},{"location":"","page":"Home","title":"Home","text":"The development was supported by European Union's Horizon 2020 Programme under PerMedCoE project (permedcoe.eu) agreement no. 951773.","category":"page"},{"location":"","page":"Home","title":"Home","text":"<img src=\"https://lcsb-biocore.github.io/COBREXA.jl/stable/assets/cobrexa.svg\" alt=\"COBREXA logo\" height=\"64px\" style=\"height:64px; width:auto\">   <img src=\"https://lcsb-biocore.github.io/COBREXA.jl/stable/assets/unilu.svg\" alt=\"Uni.lu logo\" height=\"64px\" style=\"height:64px; width:auto\">   <img src=\"https://lcsb-biocore.github.io/COBREXA.jl/stable/assets/lcsb.svg\" alt=\"LCSB logo\" height=\"64px\" style=\"height:64px; width:auto\">   <img src=\"https://lcsb-biocore.github.io/COBREXA.jl/stable/assets/hhu.svg\" alt=\"HHU logo\" height=\"64px\" style=\"height:64px; width:auto\">   <img src=\"https://lcsb-biocore.github.io/COBREXA.jl/stable/assets/qtb.svg\" alt=\"QTB logo\" height=\"64px\" style=\"height:64px; width:auto\">   <img src=\"https://lcsb-biocore.github.io/COBREXA.jl/stable/assets/permedcoe.svg\" alt=\"PerMedCoE logo\" height=\"64px\" style=\"height:64px; width:auto\">","category":"page"},{"location":"notebooks/8_custom_model/","page":"Using a custom model data structure","title":"Using a custom model data structure","text":"EditURL = \"https://github.com/LCSB-BioCore/COBREXA.jl/blob/master/docs/src/notebooks/8_custom_model.jl\"","category":"page"},{"location":"notebooks/8_custom_model/#Using-a-custom-model-data-structure","page":"Using a custom model data structure","title":"Using a custom model data structure","text":"","category":"section"},{"location":"notebooks/8_custom_model/","page":"Using a custom model data structure","title":"Using a custom model data structure","text":"(Image: ) (Image: )","category":"page"},{"location":"notebooks/8_custom_model/","page":"Using a custom model data structure","title":"Using a custom model data structure","text":"This notebooks shows how to utilize the generic accessors and modification functions in COBREXA.jl to run the analysis on any custom model type. We will create a simple dictionary-style structure that describes the model, allow COBREXA to run a FVA on it, and create a simple reaction-removing modification.","category":"page"},{"location":"notebooks/8_custom_model/","page":"Using a custom model data structure","title":"Using a custom model data structure","text":"First, let's define a very simple stoichiometry-only structure for the model:","category":"page"},{"location":"notebooks/8_custom_model/","page":"Using a custom model data structure","title":"Using a custom model data structure","text":"using COBREXA\n\nmutable struct MyReaction\n    max_rate::Float64 # maximum absolute conversion rate\n    stoi::Dict{String,Float64} # stoichimetry of the reaction\n\n    MyReaction() = new(0.0, Dict{String,Float64}())\nend\n\nmutable struct MyModel <: MetabolicModel\n    optimization_target::String # the \"objective\" reaction name\n    reactions::Dict{String,MyReaction} # dictionary of reactions\n\n    MyModel() = new(\"\", Dict{String,MyReaction}())\n    MyModel(o, r) = new(o, r)\nend","category":"page"},{"location":"notebooks/8_custom_model/","page":"Using a custom model data structure","title":"Using a custom model data structure","text":"With this, we can start defining the accessors:","category":"page"},{"location":"notebooks/8_custom_model/","page":"Using a custom model data structure","title":"Using a custom model data structure","text":"COBREXA.n_reactions(m::MyModel) = length(m.reactions)\nCOBREXA.reactions(m::MyModel) = sort(collect(keys(m.reactions)))","category":"page"},{"location":"notebooks/8_custom_model/","page":"Using a custom model data structure","title":"Using a custom model data structure","text":"Metabolites are defined only very implicitly, so let's just make a function that collects all names. n_metabolites can be left at the default definition that just measures the output of metabolites.","category":"page"},{"location":"notebooks/8_custom_model/","page":"Using a custom model data structure","title":"Using a custom model data structure","text":"function COBREXA.metabolites(m::MyModel)\n    mets = Set{String}()\n    for (_, r) in m.reactions\n        for (m, _) in r.stoi\n            push!(mets, m)\n        end\n    end\n    return sort(collect(mets))\nend","category":"page"},{"location":"notebooks/8_custom_model/","page":"Using a custom model data structure","title":"Using a custom model data structure","text":"Now, the extraction of the linear model. Remember the order of element in the vectors must match the order in the output of reactions and metabolites.","category":"page"},{"location":"notebooks/8_custom_model/","page":"Using a custom model data structure","title":"Using a custom model data structure","text":"using SparseArrays\n\nfunction COBREXA.bounds(m::MyModel)\n    max_rates = [m.reactions[r].max_rate for r in reactions(m)]\n    (sparse(-max_rates), sparse(max_rates))\nend\n\nfunction COBREXA.objective(m::MyModel)\n    if m.optimization_target in keys(m.reactions)\n        c = spzeros(n_reactions(m))\n        c[first(indexin([m.optimization_target], reactions(m)))] = 1.0\n        c\n    else\n        throw(\n            DomainError(\n                m.optimization_target,\n                \"The target reaction for flux optimization not found\",\n            ),\n        )\n    end\nend\n\nfunction COBREXA.stoichiometry(m::MyModel)\n    sparse([\n        get(m.reactions[rxn].stoi, met, 0.0) for met in metabolites(m), rxn in reactions(m)\n    ])\nend","category":"page"},{"location":"notebooks/8_custom_model/","page":"Using a custom model data structure","title":"Using a custom model data structure","text":"Now the model is complete! We can generate a random one and see how it performs","category":"page"},{"location":"notebooks/8_custom_model/","page":"Using a custom model data structure","title":"Using a custom model data structure","text":"import Random\nRandom.seed!(123)\n\nrxn_names = [\"Reaction $i\" for i = 'A':'Z'];\nmetabolite_names = [\"Metabolite $i\" for i = 1:20];\n\nm = MyModel();\nfor i in rxn_names\n    m.reactions[i] = MyReaction()\nend\n\nfor i = 1:50\n    rxn = rand(rxn_names)\n    met = rand(metabolite_names)\n    m.reactions[rxn].stoi[met] = rand([-3, -2, -1, 1, 2, 3])\n    m.reactions[rxn].max_rate = rand()\nend","category":"page"},{"location":"notebooks/8_custom_model/","page":"Using a custom model data structure","title":"Using a custom model data structure","text":"Let's see what the model looks like now:","category":"page"},{"location":"notebooks/8_custom_model/","page":"Using a custom model data structure","title":"Using a custom model data structure","text":"m","category":"page"},{"location":"notebooks/8_custom_model/","page":"Using a custom model data structure","title":"Using a custom model data structure","text":"We can run most of the standard function on the model data right away:","category":"page"},{"location":"notebooks/8_custom_model/","page":"Using a custom model data structure","title":"Using a custom model data structure","text":"using Tulip\nm.optimization_target = \"Reaction A\"\nflux_balance_analysis_dict(m, Tulip.Optimizer)","category":"page"},{"location":"notebooks/8_custom_model/","page":"Using a custom model data structure","title":"Using a custom model data structure","text":"To be able to use the model conveniently in functions such as screen, you usually want to be able to easily specify the modifications. In this example, we enable use of with_removed_reactions by overloading the internal remove_reactions for this specific model type:","category":"page"},{"location":"notebooks/8_custom_model/","page":"Using a custom model data structure","title":"Using a custom model data structure","text":"We need to make an as-shallow-as-possible copy of the model that allows us to remove the reactions without breaking the original model.","category":"page"},{"location":"notebooks/8_custom_model/","page":"Using a custom model data structure","title":"Using a custom model data structure","text":"function COBREXA.remove_reactions(m::MyModel, rxns::AbstractVector{String})\n    m = MyModel(m.optimization_target, copy(m.reactions))\n    delete!.(Ref(m.reactions), rxns)\n    return m\nend","category":"page"},{"location":"notebooks/8_custom_model/","page":"Using a custom model data structure","title":"Using a custom model data structure","text":"The screening is ready now!","category":"page"},{"location":"notebooks/8_custom_model/","page":"Using a custom model data structure","title":"Using a custom model data structure","text":"reactions_to_remove = (\"Reaction $i\" for i = 'B':'Z')\n\nreactions_to_remove .=> screen_variants(\n    m,\n    [[with_removed_reactions([r])] for r in reactions_to_remove],\n    m -> flux_balance_analysis_dict(m, Tulip.Optimizer)[\"Reaction A\"],\n)","category":"page"},{"location":"notebooks/8_custom_model/","page":"Using a custom model data structure","title":"Using a custom model data structure","text":"","category":"page"},{"location":"notebooks/8_custom_model/","page":"Using a custom model data structure","title":"Using a custom model data structure","text":"This page was generated using Literate.jl.","category":"page"}]
 }
diff --git a/dev/tutorials/1_loading/index.html b/dev/tutorials/1_loading/index.html
index 22dc8e1e0f30ec7b78a96972f432572e9510d7f2..55ad051fd3fc318b4eb7fa9891381334a9727cfe 100644
--- a/dev/tutorials/1_loading/index.html
+++ b/dev/tutorials/1_loading/index.html
@@ -18,4 +18,4 @@ jm.json[&quot;reactions&quot;][1]</code></pre><p>That should print out the first
   &quot;upper_bound&quot;        =&gt; 1000.0
   &quot;subsystem&quot;          =&gt; &quot;Glycolysis/Gluconeogenesis&quot;
   &quot;annotation&quot;         =&gt; Dict{String,Any}(&quot;ec-code&quot;=&gt;Any[&quot;2.7.1.11&quot;],&quot;metanetx…</code></pre><p><a href="../../functions/#COBREXA.MATModel"><code>MATModel</code></a> and <a href="../../functions/#COBREXA.SBMLModel"><code>SBMLModel</code></a> (returned by the respective loading functions) contain similar &quot;full&quot; model information – you can access the whole MATLAB and SBML data and build on them without any restrictions.</p><h2 id="Converting-to-other-model-types"><a class="docs-heading-anchor" href="#Converting-to-other-model-types">Converting to other model types</a><a id="Converting-to-other-model-types-1"></a><a class="docs-heading-anchor-permalink" href="#Converting-to-other-model-types" title="Permalink"></a></h2><p>Despite JSON and SBML are great for storing and exchanging the models, the data representation is not very suitable for analyzing the model and processing it mathematically.</p><p>COBREXA.jl contains several model types that are much better suited  for supporting the analysis tasks. You can use the following:</p><ul><li><a href="../../functions/#COBREXA.CoreModel"><code>CoreModel</code></a>, which represents the &quot;core&quot; of the optimization problem and the corresponding linear programming problem – a sparse representation of the stoichiometric matrix, flux bounds vectors, objective vector, etc.</li><li><a href="../../functions/#COBREXA.StandardModel"><code>StandardModel</code></a> (a &quot;standard&quot; for COBREXA.jl), which represents a highly flexible, object-like, dictionary-based representation of a model that contains individual <a href="../../functions/#COBREXA.Reaction"><code>Reaction</code></a>s, <a href="../../functions/#COBREXA.Metabolite"><code>Metabolite</code></a>s, <a href="../../functions/#COBREXA.Gene"><code>Gene</code></a>s, and other things.</li></ul><div class="admonition is-info"><header class="admonition-header">Conversion limitations and possible data loss</header><div class="admonition-body"><p>Because of the specifics of the format of each model structure, the conversion is not always able to preserve all information from the source data. You may need to check if any complicated and less-standard annotations are still present. If you require them, and either use a more complicated model, or collect them manually.</p></div></div><p>A loaded model can be converted to any other model type using the standard Julia conversion:</p><pre><code class="language-none">cm = convert(CoreModel, jm)</code></pre><p>You can also use a shortcut in <a href="../../functions/#COBREXA.load_model-Tuple{String}"><code>load_model</code></a> to convert the model to the desired format in one command:</p><pre><code class="language-none">cm = load_model(CoreModel, &quot;e_coli_core.xml&quot;)</code></pre><p>With <a href="../../functions/#COBREXA.CoreModel"><code>CoreModel</code></a>, the information is easily accessible in matrix form. For example, <code>cm.S</code> now contains the sparse stoichiometric matrix, which you can convert to a dense matrix and manipulate it in Julia as any other matrix:</p><pre><code class="language-none">Matrix(cm.S)</code></pre><p>...should show you the (relatively empty) stoichiometry of the model.</p><p><a href="../../functions/#COBREXA.StandardModel"><code>StandardModel</code></a> is more suitable for fine-grained access to individual items of the model, perhaps closer to the SBML-style models. For example, you can view and set reaction bounds as follows:</p><pre><code class="language-none">sm = load_model(StandardModel, &quot;e_coli_core.json&quot;)
-sm.reactions[&quot;PGI&quot;].ub</code></pre><p>...this prints the upper bound of the reaction (in this case, <code>1000.0</code>); you can change it the usual way:</p><pre><code class="language-none">sm.reactions[&quot;PGI&quot;].ub = 500</code></pre><p>This change will naturally project to future analysis results.</p></article><nav class="docs-footer"><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> on <span class="colophon-date" title="Wednesday 4 August 2021 13:35">Wednesday 4 August 2021</span>. Using Julia version 1.6.0.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
+sm.reactions[&quot;PGI&quot;].ub</code></pre><p>...this prints the upper bound of the reaction (in this case, <code>1000.0</code>); you can change it the usual way:</p><pre><code class="language-none">sm.reactions[&quot;PGI&quot;].ub = 500</code></pre><p>This change will naturally project to future analysis results.</p></article><nav class="docs-footer"><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> on <span class="colophon-date" title="Wednesday 4 August 2021 13:58">Wednesday 4 August 2021</span>. Using Julia version 1.6.0.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
diff --git a/dev/tutorials/2_analysis/index.html b/dev/tutorials/2_analysis/index.html
index 9660c299c5ef6fc3ab86dddf3424e349297022b2..eca81ef282b6808638a2e27cc85d2cb0bfd3ccf4 100644
--- a/dev/tutorials/2_analysis/index.html
+++ b/dev/tutorials/2_analysis/index.html
@@ -32,4 +32,4 @@ Names registered in the model: lbs, mb, ubs, x</code></pre><p>From that, you can
  -16.243       -37.4763         -5.57301
    0.0           0.0             0.0
   -0.310819     -1.20057e-7     -2.13126
-   5.71597e-5    0.00990677      0.692399</code></pre></article><nav class="docs-footer"><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> on <span class="colophon-date" title="Wednesday 4 August 2021 13:35">Wednesday 4 August 2021</span>. Using Julia version 1.6.0.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
+   5.71597e-5    0.00990677      0.692399</code></pre></article><nav class="docs-footer"><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> on <span class="colophon-date" title="Wednesday 4 August 2021 13:58">Wednesday 4 August 2021</span>. Using Julia version 1.6.0.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
diff --git a/dev/tutorials/3_hpc/index.html b/dev/tutorials/3_hpc/index.html
index 489162e6b1695c00879d2199f2dec5e7b0bcd9ee..432694bc33325dd357a23c88ff716327ccdca28e 100644
--- a/dev/tutorials/3_hpc/index.html
+++ b/dev/tutorials/3_hpc/index.html
@@ -23,4 +23,4 @@ result = flux_variability_analysis(...; workers=workers())
 
 module load lang/Julia   # this is usually required to make Julia available to your job
 
-julia myJob.jl</code></pre><p>To run the computation, simply run <code>sbatch myJob.sbatch</code> on the access node. The job will be scheduled and eventually executed. You may watch <code>sacct</code> and <code>squeue</code> in the meantime, to see the progress.</p><p>Remember that you need to explicitly save the result of your Julia script computation to files, to be able to retrieve them later. Standard outputs of the jobs are often mangled and discarded. If you still want to collect the standard output, you may change the last line of the batch script to</p><pre><code class="language-none">julia myJob.jl &gt; myJob.log</code></pre><p>and collect the output from the log later. This is convenient especially if logging various computation details using the <code>@info</code> and similar macros.</p></article><nav class="docs-footer"><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> on <span class="colophon-date" title="Wednesday 4 August 2021 13:35">Wednesday 4 August 2021</span>. Using Julia version 1.6.0.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
+julia myJob.jl</code></pre><p>To run the computation, simply run <code>sbatch myJob.sbatch</code> on the access node. The job will be scheduled and eventually executed. You may watch <code>sacct</code> and <code>squeue</code> in the meantime, to see the progress.</p><p>Remember that you need to explicitly save the result of your Julia script computation to files, to be able to retrieve them later. Standard outputs of the jobs are often mangled and discarded. If you still want to collect the standard output, you may change the last line of the batch script to</p><pre><code class="language-none">julia myJob.jl &gt; myJob.log</code></pre><p>and collect the output from the log later. This is convenient especially if logging various computation details using the <code>@info</code> and similar macros.</p></article><nav class="docs-footer"><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> on <span class="colophon-date" title="Wednesday 4 August 2021 13:58">Wednesday 4 August 2021</span>. Using Julia version 1.6.0.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
diff --git a/dev/tutorials/4_modifying/index.html b/dev/tutorials/4_modifying/index.html
index 854b084fbc60d19377e55dfbe1297955da8832c9..c89be9cffcc633cfe807c68972e22d59fd59ae81 100644
--- a/dev/tutorials/4_modifying/index.html
+++ b/dev/tutorials/4_modifying/index.html
@@ -7,7 +7,7 @@ m.S[5,64] = 1</code></pre><p>While this works well if you are used to working wi
 m.reactions[&quot;R_TPI&quot;].lb = 0.0                         # change lower bound of the reaction to 0
 m.reactions[&quot;R_GLNS&quot;].metabolites[&quot;M_nadh_c&quot;] = -1.0  # update stoichiometry
 m.reactions[&quot;R_GLNS&quot;].metabolites[&quot;M_co2_e&quot;] = 1.0
-...</code></pre><p>There are other functions that may be used to change the <code>StandardModel</code> in a more systematic way. See the documentation of <a href="../../functions/#COBREXA.add_reaction!-Tuple{StandardModel, Reaction}"><code>add_reaction!</code></a>, <a href="../../functions/#COBREXA.add_metabolite!-Tuple{StandardModel, Metabolite}"><code>add_metabolite!</code></a>, <a href="../../functions/#COBREXA.add_gene!-Tuple{StandardModel, Gene}"><code>add_gene!</code></a>, <a href="../../functions/#COBREXA.remove_reaction!-Tuple{StandardModel, String}"><code>remove_reaction!</code></a>, <a href="../../functions/#COBREXA.remove_metabolite!-Tuple{StandardModel, String}"><code>remove_metabolite!</code></a>, [ <a href="../../functions/#COBREXA.remove_gene!-Tuple{StandardModel, String}"><code>remove_gene!</code></a>, and the <a href="../../functions/#Model-reconstruction">Model reconstruction</a> reference for more examples.</p><h2 id="Analysis-modifiers"><a class="docs-heading-anchor" href="#Analysis-modifiers">Analysis modifiers</a><a id="Analysis-modifiers-1"></a><a class="docs-heading-anchor-permalink" href="#Analysis-modifiers" title="Permalink"></a></h2><p>Some analysis functions, including <a href="../../functions/#COBREXA.flux_balance_analysis-Union{Tuple{M}, Tuple{M, Any}} where M&lt;:MetabolicModel"><code>flux_balance_analysis</code></a> and <a href="../../functions/#COBREXA.flux_variability_analysis-Tuple{MetabolicModel, Any}"><code>flux_variability_analysis</code></a>, accept a special argument <code>modifications</code>, which is a list of descriptions of small changes that should be applied to the model before modification.</p><p>These include e.g.:</p><ul><li><a href="../../functions/#COBREXA.change_objective-Tuple{Union{Int64, String}}"><code>change_objective</code></a> that sets a new optimization objective</li><li><a href="../../functions/#COBREXA.change_optimizer-Tuple{Any}"><code>change_optimizer</code></a> that chooses a different <code>JuMP.jl</code> optimizer for the analysis</li><li><a href="../../functions/#COBREXA.change_optimizer_attribute-Tuple{Any, Any}"><code>change_optimizer_attribute</code></a> that can set various optimizer parameters</li><li><a href="../../functions/#COBREXA.change_constraint-Tuple{String, Any, Any}"><code>change_constraint</code></a> that changes the flux bounds of a reaction</li><li><a href="../../functions/#COBREXA.knockout-Tuple{String}"><code>knockout</code></a> that disables reactions that depend on genes</li></ul><p>This way, you can easily check out the model state when maximizing the rate of &quot;TALA&quot; (transadenolase A) reaction:</p><pre><code class="language-none">m = load_model(StandardModel, &quot;e_coli_core.xml&quot;)
+...</code></pre><p>There are other functions that may be used to change the <code>StandardModel</code> in a more systematic way. See the documentation of <a href="../../functions/#COBREXA.add_reaction!-Tuple{StandardModel, Reaction}"><code>add_reaction!</code></a>, <a href="../../functions/#COBREXA.add_metabolite!-Tuple{StandardModel, Metabolite}"><code>add_metabolite!</code></a>, <a href="../../functions/#COBREXA.add_gene!-Tuple{StandardModel, Gene}"><code>add_gene!</code></a>, <a href="../../functions/#COBREXA.remove_reaction!-Tuple{StandardModel, String}"><code>remove_reaction!</code></a>, <a href="../../functions/#COBREXA.remove_metabolite!-Tuple{StandardModel, String}"><code>remove_metabolite!</code></a>, [ <a href="../../functions/#COBREXA.remove_gene!-Tuple{StandardModel, String}"><code>remove_gene!</code></a>, and the <a href="../../functions/#Model-reconstruction">Model reconstruction</a> reference for more examples.</p><h2 id="Analysis-modifiers"><a class="docs-heading-anchor" href="#Analysis-modifiers">Analysis modifiers</a><a id="Analysis-modifiers-1"></a><a class="docs-heading-anchor-permalink" href="#Analysis-modifiers" title="Permalink"></a></h2><p>Some analysis functions, including <a href="../../functions/#COBREXA.flux_balance_analysis-Union{Tuple{M}, Tuple{M, Any}} where M&lt;:MetabolicModel"><code>flux_balance_analysis</code></a> and <a href="../../functions/#COBREXA.flux_variability_analysis-Tuple{MetabolicModel, Any}"><code>flux_variability_analysis</code></a>, accept a special argument <code>modifications</code>, which is a list of descriptions of small changes that should be applied to the model before modification.</p><p>These include e.g.:</p><ul><li><a href="../../functions/#COBREXA.change_objective-Tuple{Union{String, Vector{String}}}"><code>change_objective</code></a> that sets a new optimization objective</li><li><a href="../../functions/#COBREXA.change_optimizer-Tuple{Any}"><code>change_optimizer</code></a> that chooses a different <code>JuMP.jl</code> optimizer for the analysis</li><li><a href="../../functions/#COBREXA.change_optimizer_attribute-Tuple{Any, Any}"><code>change_optimizer_attribute</code></a> that can set various optimizer parameters</li><li><a href="../../functions/#COBREXA.change_constraint-Tuple{String, Any, Any}"><code>change_constraint</code></a> that changes the flux bounds of a reaction</li><li><a href="../../functions/#COBREXA.knockout-Tuple{String}"><code>knockout</code></a> that disables reactions that depend on genes</li></ul><p>This way, you can easily check out the model state when maximizing the rate of &quot;TALA&quot; (transadenolase A) reaction:</p><pre><code class="language-none">m = load_model(StandardModel, &quot;e_coli_core.xml&quot;)
 flux_balance_analysis_dict(
   m, GLPK.Optimizer;
   modifications=[change_objective(&quot;R_TALA&quot;)])</code></pre><p>...or knock out a gene combination that disables the transadenolase A completely (see <code>m.reactions[&quot;R_TALA&quot;].grr</code>):</p><pre><code class="language-none">flux_balance_analysis_dict(
@@ -19,4 +19,4 @@ flux_balance_analysis_dict(
     change_objective(&quot;R_TALA&quot;),
   ])</code></pre><h2 id="Exporting-the-modified-models-in-native-formats"><a class="docs-heading-anchor" href="#Exporting-the-modified-models-in-native-formats">Exporting the modified models in native formats</a><a id="Exporting-the-modified-models-in-native-formats-1"></a><a class="docs-heading-anchor-permalink" href="#Exporting-the-modified-models-in-native-formats" title="Permalink"></a></h2><p>Manually modified models can be exported in standard formats so that they can be examined in other environments, or just made accessible for publication.</p><p><code>COBREXA.jl</code> supports export of MATLAB-like and JSON models. Simply use <a href="../../functions/#COBREXA.save_model-Tuple{MetabolicModel, String}"><code>save_model</code></a>:</p><pre><code class="language-none">save_model(m, &quot;myModel.json&quot;)
 save_model(m, &quot;myModel.mat&quot;)</code></pre><p>The function automatically guesses the appropriate model format to write into the file from the file extension. If required, you can choose the model format manually by using <a href="../../functions/#COBREXA.save_json_model-Tuple{MetabolicModel, String}"><code>save_json_model</code></a> and <a href="../../functions/#COBREXA.save_mat_model-Tuple{MetabolicModel, String}"><code>save_mat_model</code></a>.</p><h2 id="Using-Serialization-for-quick-and-efficient-model-storage"><a class="docs-heading-anchor" href="#Using-Serialization-for-quick-and-efficient-model-storage">Using <code>Serialization</code> for quick &amp; efficient model storage</a><a id="Using-Serialization-for-quick-and-efficient-model-storage-1"></a><a class="docs-heading-anchor-permalink" href="#Using-Serialization-for-quick-and-efficient-model-storage" title="Permalink"></a></h2><p>If you save the model &quot;just for yourself&quot;, such as for the use in an immediately following analysis, it may be inconvenient (and unnecessarily inefficient) to encode and decode the models to and from the external format. Moreover, certain model types (such as <a href="../../functions/#COBREXA.CoreModelCoupled"><code>CoreModelCoupled</code></a>) cannot be fully represented in all model formats, thus increasing the chance for accidental data loss.</p><p>Instead of that, we recommend using the <code>Serialization</code> package. It provides a straightforward way to save <em>any</em> Julia data structure to the disk, using a very efficient data format that can be written to and read from the disk very quickly.</p><p>With any model in <code>m</code>, you can write it to disk as follows:</p><pre><code class="language-none">using Serialization
-open(f -&gt; serialize(f, m), &quot;myModel&quot;, &quot;w&quot;)</code></pre><p>...and read it back with:</p><pre><code class="language-none">m = deserialize(&quot;myModel&quot;)</code></pre><p>One great advantage of <code>Serialization</code> is speed – models with millions of reactions are usually loaded and saved with minimal overhead in less than a second.</p><div class="admonition is-warning"><header class="admonition-header">Limits of `Serialization`</header><div class="admonition-body"><p>Serialized models are great for quickly exchanging data objects between analysis steps. The avoided need for re-encoding can save you a great deal of analysis time that can be used for better purposes. Despite that, do not rely on the stability of the serialized format – it often changes between Julia versions, and the data stored in one version may not open easily after an upgrade. In short, use serialized data within one workflow, and use standard and stable external formats for publishing and storing the data beyond the scope of a single analysis workflow.</p></div></div></article><nav class="docs-footer"><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> on <span class="colophon-date" title="Wednesday 4 August 2021 13:35">Wednesday 4 August 2021</span>. Using Julia version 1.6.0.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
+open(f -&gt; serialize(f, m), &quot;myModel&quot;, &quot;w&quot;)</code></pre><p>...and read it back with:</p><pre><code class="language-none">m = deserialize(&quot;myModel&quot;)</code></pre><p>One great advantage of <code>Serialization</code> is speed – models with millions of reactions are usually loaded and saved with minimal overhead in less than a second.</p><div class="admonition is-warning"><header class="admonition-header">Limits of `Serialization`</header><div class="admonition-body"><p>Serialized models are great for quickly exchanging data objects between analysis steps. The avoided need for re-encoding can save you a great deal of analysis time that can be used for better purposes. Despite that, do not rely on the stability of the serialized format – it often changes between Julia versions, and the data stored in one version may not open easily after an upgrade. In short, use serialized data within one workflow, and use standard and stable external formats for publishing and storing the data beyond the scope of a single analysis workflow.</p></div></div></article><nav class="docs-footer"><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> on <span class="colophon-date" title="Wednesday 4 August 2021 13:58">Wednesday 4 August 2021</span>. Using Julia version 1.6.0.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
diff --git a/dev/tutorials/index.html b/dev/tutorials/index.html
index c82d63741dab55d8d165c7a6022dea85ce9dc6ec..bfab0fff25ff5ec3829b48509f69782f924ac28e 100644
--- a/dev/tutorials/index.html
+++ b/dev/tutorials/index.html
@@ -1,2 +1,2 @@
 <!DOCTYPE html>
-<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>Quickstart tutorials · COBREXA.jl</title><link href="https://fonts.googleapis.com/css?family=Lato|Roboto+Mono" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.0/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.0/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.0/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.11.1/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL=".."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="../assets/documenter.js"></script><script src="../siteinfo.js"></script><script src="../../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/documenter-dark.css" data-theme-name="documenter-dark" data-theme-primary-dark/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="../assets/themeswap.js"></script><link href="../assets/favicon.ico" rel="icon" type="image/x-icon"/></head><body><div id="documenter"><nav class="docs-sidebar"><a class="docs-logo" href="../"><img class="docs-light-only" src="../assets/logo.svg" alt="COBREXA.jl logo"/><img class="docs-dark-only" src="../assets/logo-dark.svg" alt="COBREXA.jl logo"/></a><div class="docs-package-name"><span class="docs-autofit">COBREXA.jl</span></div><form class="docs-search" action="../search/"><input class="docs-search-query" id="documenter-search-query" name="q" type="text" placeholder="Search docs"/></form><ul class="docs-menu"><li><a class="tocitem" href="../">Home</a></li><li class="is-active"><a class="tocitem" href>Quickstart tutorials</a></li><li><a class="tocitem" href="../advanced/">Advanced tutorials</a></li><li><a class="tocitem" href="../notebooks/">Examples and notebooks</a></li><li><a class="tocitem" href="../functions/">Function reference</a></li><li><a class="tocitem" href="../howToContribute/">How to contribute</a></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><nav class="breadcrumb"><ul class="is-hidden-mobile"><li class="is-active"><a href>Quickstart tutorials</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href>Quickstart tutorials</a></li></ul></nav><div class="docs-right"><a class="docs-edit-link" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/master/docs/src/tutorials.md" title="Edit on GitHub"><span class="docs-icon fab"></span><span class="docs-label is-hidden-touch">Edit on GitHub</span></a><a class="docs-settings-button fas fa-cog" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-sidebar-button fa fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a></div></header><article class="content" id="documenter-page"><h1 id="COBREXA-Tutorials"><a class="docs-heading-anchor" href="#COBREXA-Tutorials">COBREXA Tutorials</a><a id="COBREXA-Tutorials-1"></a><a class="docs-heading-anchor-permalink" href="#COBREXA-Tutorials" title="Permalink"></a></h1><ul><li><a href="1_loading/#Loading-and-converting-model-data">Loading and converting model data</a></li><ul><li><a href="1_loading/#Loading-models-from-files">Loading models from files</a></li><li><a href="1_loading/#Converting-to-other-model-types">Converting to other model types</a></li></ul><li><a href="2_analysis/#Basic-analysis-of-constraint-based-models">Basic analysis of constraint-based models</a></li><ul><li><a href="2_analysis/#Optimization-problem-solvers">Optimization problem solvers</a></li><li><a href="2_analysis/#Flux-balance-analysis">Flux balance analysis</a></li><li><a href="2_analysis/#Flux-variability-analysis">Flux variability analysis</a></li><li><a href="2_analysis/#Parsimonious-flux-balance-analysis">Parsimonious flux balance analysis</a></li><li><a href="2_analysis/#Flux-sampling">Flux sampling</a></li></ul><li><a href="3_hpc/#Distributed-processing-and-HPC-environments">Distributed processing and HPC environments</a></li><ul><li><a href="3_hpc/#Starting-the-distributed-workers">Starting the distributed workers</a></li><li><a href="3_hpc/#Running-a-distributed-analysis">Running a distributed analysis</a></li><li><a href="3_hpc/#Interacting-with-HPC-schedulers">Interacting with HPC schedulers</a></li><li><a href="3_hpc/#Wrapping-your-script-in-a-Slurm-job">Wrapping your script in a Slurm job</a></li></ul><li><a href="4_modifying/#Modifying-and-saving-the-models">Modifying and saving the models</a></li><ul><li><a href="4_modifying/#Manual-modifications">Manual modifications</a></li><li><a href="4_modifying/#Analysis-modifiers">Analysis modifiers</a></li><li><a href="4_modifying/#Exporting-the-modified-models-in-native-formats">Exporting the modified models in native formats</a></li><li><a href="4_modifying/#Using-Serialization-for-quick-and-efficient-model-storage">Using <code>Serialization</code> for quick &amp; efficient model storage</a></li></ul></ul></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="../">« Home</a><a class="docs-footer-nextpage" href="../advanced/">Advanced tutorials »</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> on <span class="colophon-date" title="Wednesday 4 August 2021 13:35">Wednesday 4 August 2021</span>. Using Julia version 1.6.0.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
+<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>Quickstart tutorials · COBREXA.jl</title><link href="https://fonts.googleapis.com/css?family=Lato|Roboto+Mono" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.0/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.0/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.0/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.11.1/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL=".."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="../assets/documenter.js"></script><script src="../siteinfo.js"></script><script src="../../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/documenter-dark.css" data-theme-name="documenter-dark" data-theme-primary-dark/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="../assets/themeswap.js"></script><link href="../assets/favicon.ico" rel="icon" type="image/x-icon"/></head><body><div id="documenter"><nav class="docs-sidebar"><a class="docs-logo" href="../"><img class="docs-light-only" src="../assets/logo.svg" alt="COBREXA.jl logo"/><img class="docs-dark-only" src="../assets/logo-dark.svg" alt="COBREXA.jl logo"/></a><div class="docs-package-name"><span class="docs-autofit">COBREXA.jl</span></div><form class="docs-search" action="../search/"><input class="docs-search-query" id="documenter-search-query" name="q" type="text" placeholder="Search docs"/></form><ul class="docs-menu"><li><a class="tocitem" href="../">Home</a></li><li class="is-active"><a class="tocitem" href>Quickstart tutorials</a></li><li><a class="tocitem" href="../advanced/">Advanced tutorials</a></li><li><a class="tocitem" href="../notebooks/">Examples and notebooks</a></li><li><a class="tocitem" href="../functions/">Function reference</a></li><li><a class="tocitem" href="../howToContribute/">How to contribute</a></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><nav class="breadcrumb"><ul class="is-hidden-mobile"><li class="is-active"><a href>Quickstart tutorials</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href>Quickstart tutorials</a></li></ul></nav><div class="docs-right"><a class="docs-edit-link" href="https://github.com/LCSB-BioCore/COBREXA.jl/blob/master/docs/src/tutorials.md" title="Edit on GitHub"><span class="docs-icon fab"></span><span class="docs-label is-hidden-touch">Edit on GitHub</span></a><a class="docs-settings-button fas fa-cog" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-sidebar-button fa fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a></div></header><article class="content" id="documenter-page"><h1 id="COBREXA-Tutorials"><a class="docs-heading-anchor" href="#COBREXA-Tutorials">COBREXA Tutorials</a><a id="COBREXA-Tutorials-1"></a><a class="docs-heading-anchor-permalink" href="#COBREXA-Tutorials" title="Permalink"></a></h1><ul><li><a href="1_loading/#Loading-and-converting-model-data">Loading and converting model data</a></li><ul><li><a href="1_loading/#Loading-models-from-files">Loading models from files</a></li><li><a href="1_loading/#Converting-to-other-model-types">Converting to other model types</a></li></ul><li><a href="2_analysis/#Basic-analysis-of-constraint-based-models">Basic analysis of constraint-based models</a></li><ul><li><a href="2_analysis/#Optimization-problem-solvers">Optimization problem solvers</a></li><li><a href="2_analysis/#Flux-balance-analysis">Flux balance analysis</a></li><li><a href="2_analysis/#Flux-variability-analysis">Flux variability analysis</a></li><li><a href="2_analysis/#Parsimonious-flux-balance-analysis">Parsimonious flux balance analysis</a></li><li><a href="2_analysis/#Flux-sampling">Flux sampling</a></li></ul><li><a href="3_hpc/#Distributed-processing-and-HPC-environments">Distributed processing and HPC environments</a></li><ul><li><a href="3_hpc/#Starting-the-distributed-workers">Starting the distributed workers</a></li><li><a href="3_hpc/#Running-a-distributed-analysis">Running a distributed analysis</a></li><li><a href="3_hpc/#Interacting-with-HPC-schedulers">Interacting with HPC schedulers</a></li><li><a href="3_hpc/#Wrapping-your-script-in-a-Slurm-job">Wrapping your script in a Slurm job</a></li></ul><li><a href="4_modifying/#Modifying-and-saving-the-models">Modifying and saving the models</a></li><ul><li><a href="4_modifying/#Manual-modifications">Manual modifications</a></li><li><a href="4_modifying/#Analysis-modifiers">Analysis modifiers</a></li><li><a href="4_modifying/#Exporting-the-modified-models-in-native-formats">Exporting the modified models in native formats</a></li><li><a href="4_modifying/#Using-Serialization-for-quick-and-efficient-model-storage">Using <code>Serialization</code> for quick &amp; efficient model storage</a></li></ul></ul></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="../">« Home</a><a class="docs-footer-nextpage" href="../advanced/">Advanced tutorials »</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> on <span class="colophon-date" title="Wednesday 4 August 2021 13:58">Wednesday 4 August 2021</span>. Using Julia version 1.6.0.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>