index.html 22.1 KB
Newer Older
Documenter.jl's avatar
Documenter.jl committed
1
<!DOCTYPE html>
Documenter.jl's avatar
Documenter.jl committed
2
<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>Home · 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 class="is-active"><a class="tocitem" href>Home</a><ul class="internal"><li><a class="tocitem" href="#Quick-start-guide"><span>Quick start guide</span></a></li><li><a class="tocitem" href="#Basic-and-quick-start-tutorials"><span>Basic and quick-start tutorials</span></a></li><li><a class="tocitem" href="#Advanced-tutorials"><span>Advanced tutorials</span></a></li><li><a class="tocitem" href="#Example-notebooks-and-workflows"><span>Example notebooks and workflows</span></a></li><li><a class="tocitem" href="#Functions-reference"><span>Functions reference</span></a></li><li><a class="tocitem" href="#Contribution-guide"><span>Contribution guide</span></a></li><li><a class="tocitem" href="#Acknowledgements"><span>Acknowledgements</span></a></li></ul></li><li><span class="tocitem">User guide</span><ul><li><input class="collapse-toggle" id="menuitem-2-1" type="checkbox"/><label class="tocitem" for="menuitem-2-1"><span class="docs-label">Quickstart tutorials</span><i class="docs-chevron"></i></label><ul class="collapsed"><li><a class="tocitem" href="tutorials/">All tutorials</a></li><li><a class="tocitem" href="tutorials/1_loading/">Loading and converting model data</a></li><li><a class="tocitem" href="tutorials/2_analysis/">Basic analysis of constraint-based models</a></li><li><a class="tocitem" href="tutorials/3_hpc/">Distributed processing and HPC environments</a></li><li><a class="tocitem" href="tutorials/4_modifying/">Modifying and saving the models</a></li></ul></li><li><input class="collapse-toggle" id="menuitem-2-2" type="checkbox"/><label class="tocitem" for="menuitem-2-2"><span class="docs-label">Advanced tutorials</span><i class="docs-chevron"></i></label><ul class="collapsed"><li><a class="tocitem" href="advanced/">All advanced tutorials</a></li><li><a class="tocitem" href="advanced/1_variants/">Exploring many model variants</a></li><li><a class="tocitem" href="advanced/2_custom_model/">Working with custom models</a></li></ul></li><li><input class="collapse-toggle" id="menuitem-2-3" type="checkbox"/><label class="tocitem" for="menuitem-2-3"><span class="docs-label">Examples and notebooks</span><i class="docs-chevron"></i></label><ul class="collapsed"><li><a class="tocitem" href="notebooks/">All notebooks</a></li><li><a class="tocitem" href="notebooks/1_loading_converting_saving/">Loading, converting, and saving models</a></li><li><a class="tocitem" href="notebooks/2_finding_balance/">Finding balance and variability of constraint-based models</a></li><li><a class="tocitem" href="notebooks/3_basic_stdmodel_usage/">Basic usage of <code>StandardModel</code></a></li><li><a class="tocitem" href="notebooks/4_basic_core_coupled_usage/">Basic usage of <code>CoreModel</code> and <code>CoreModelCoupled</code></a></li><li><a class="tocitem" href="notebooks/5_basic_stdmodel_construction/">Model construction and modification</a></li><li><a class="tocitem" href="notebooks/6_screening/">Exploring model variants with <code>screen</code></a></li><li><a class="tocitem" href="notebooks/7_community_model/">Building and analysing a small community model</a></li><li><a class="tocitem" href="notebooks/8_custom_model/">Using a custom model data structure</a></li><li><a class="tocitem" href="notebooks/9_max_min_driving_force_analysis/">Maximum-minimum driving force analysis</a></li></ul></li></ul></li><li><span class="tocitem">Types and functions</span><ul><li><a class="tocitem" href="functions/">Contents</a></li><li><a class="tocitem" href="functions/analysis/">Analysis functions</a></li><li><a class="tocitem" href="functions/base/">Base functions</a></li><li><a class="tocitem" href="functions/io/">Input and output</a></li><li><a class="tocitem" href="functions/reconstruction/">Model construction functions</a></li><li><a class="tocitem" href="functions/types/">Types</a></li><li><a class="tocitem" href="functions/utils/">Utilities</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>Home</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href>Home</a></li></ul></nav><div class="docs-right"><a class="docs-edit-link" href="https://github.com/lcsb-biocore/COBREXA.jl/" 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"><br>
Documenter.jl's avatar
Documenter.jl committed
3
4
5
6
<div align="center">
    <img class="docs-light-only" src="assets/header.svg?maxAge=0" width="80%">
    <img class="docs-dark-only" src="assets/header-dark.svg?maxAge=0" width="80%">
</div>
Documenter.jl's avatar
Documenter.jl committed
7
<br><h1 id="Constraint-Based-Reconstruction-and-EXascale-Analysis"><a class="docs-heading-anchor" href="#Constraint-Based-Reconstruction-and-EXascale-Analysis">Constraint-Based Reconstruction and EXascale Analysis</a><a id="Constraint-Based-Reconstruction-and-EXascale-Analysis-1"></a><a class="docs-heading-anchor-permalink" href="#Constraint-Based-Reconstruction-and-EXascale-Analysis" title="Permalink"></a></h1><table><tr><th style="text-align: center"><strong>Repository</strong></th><th style="text-align: center"><strong>Tests</strong></th><th style="text-align: center"><strong>Coverage</strong></th><th style="text-align: center"><strong>How to contribute?</strong></th></tr><tr><td style="text-align: center"><a href="http://github.com/LCSB-BioCore/COBREXA.jl"><img src="https://img.shields.io/github/stars/LCSB-BioCore/COBREXA.jl?label=COBREXA.jl&amp;style=social" alt="GitHub"/></a></td><td style="text-align: center"><a href="https://github.com/LCSB-BioCore/COBREXA.jl/actions/workflows/ci.yml"><img src="https://github.com/LCSB-BioCore/COBREXA.jl/actions/workflows/ci.yml/badge.svg?branch=master" alt="CI"/></a></td><td style="text-align: center"><a href="https://codecov.io/gh/LCSB-BioCore/COBREXA.jl"><img src="https://codecov.io/gh/LCSB-BioCore/COBREXA.jl/branch/master/graph/badge.svg?token=H3WSWOBD7L" alt="codecov"/></a></td><td style="text-align: center"><a href="howToContribute/"><img src="https://img.shields.io/badge/contributions-start%20here-green" alt="contrib"/></a></td></tr></table><p>COBREXA is a toolkit for working with large constraint-based metabolic models, and running very large numbers 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.</p><p>In this package, you will find the usual COBRA-like functions that interface to underlying linear programming solvers. We use <a href="https://github.com/jump-dev/JuMP.jl"><code>JuMP.jl</code></a> as the unified interface for many solvers; you can plug in whichever compatible solver you want, including the popular <a href="https://github.com/ds4dm/Tulip.jl"><code>Tulip.jl</code></a>, <a href="https://github.com/jump-dev/GLPK.jl"><code>GLPK.jl</code></a>, <a href="https://github.com/osqp/OSQP.jl"><code>OSQP.jl</code></a>, and <a href="https://github.com/jump-dev/Gurobi.jl"><code>Gurobi.jl</code></a>.</p><div align="center">
Documenter.jl's avatar
Documenter.jl committed
8
<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://gitlab.lcsb.uni.lu/lcsb-biocore/COBREXA.jl/-/jobs/artifacts/master/raw/output.gif?job=gource" alt="history"><br>
Documenter.jl's avatar
Documenter.jl committed
9
Development history of COBREXA.jl.
Documenter.jl's avatar
Documenter.jl committed
10
</div><h2 id="Quick-start-guide"><a class="docs-heading-anchor" href="#Quick-start-guide">Quick start guide</a><a id="Quick-start-guide-1"></a><a class="docs-heading-anchor-permalink" href="#Quick-start-guide" title="Permalink"></a></h2><p>You can install COBREXA from Julia repositories. Start <code>julia</code>, <strong>press <code>]</code></strong> to switch to the Packaging environment, and type:</p><pre><code class="language-none">add COBREXA</code></pre><p>You also need to install your favorite solver supported by <code>JuMP.jl</code>, typing e.g.:</p><pre><code class="language-none">add Tulip</code></pre><p>Alternatively, you may use <a href="#prebuilt-images">prebuilt Docker and Apptainer images</a>.</p><p>When the packages are installed, switch back to the &quot;normal&quot; julia shell by pressing Backspace (the prompt should change color back to green). After that, you can download <a href="http://bigg.ucsd.edu/models/e_coli_core">a SBML model from the internet</a> and perform a flux balance analysis as follows:</p><pre><code class="language-julia">using COBREXA   # loads the package
Documenter.jl's avatar
Documenter.jl committed
11
using Tulip     # loads the optimization solver
Documenter.jl's avatar
Documenter.jl committed
12
13
14
15
16
17
18
19

# download the model
download(&quot;http://bigg.ucsd.edu/static/models/e_coli_core.xml&quot;, &quot;e_coli_core.xml&quot;)

# open the SBML file and load the contents
model = load_model(&quot;e_coli_core.xml&quot;)

# run a FBA
Documenter.jl's avatar
Documenter.jl committed
20
fluxes = flux_balance_analysis_dict(model, Tulip.Optimizer)</code></pre><p>The variable <code>fluxes</code> will now contain a dictionary of the computed optimal flux of each reaction in the model:</p><pre><code class="language-none">Dict{String,Float64} with 95 entries:
Documenter.jl's avatar
Documenter.jl committed
21
22
23
24
25
26
27
28
  &quot;R_EX_fum_e&quot;    =&gt; 0.0
  &quot;R_ACONTb&quot;      =&gt; 6.00725
  &quot;R_TPI&quot;         =&gt; 7.47738
  &quot;R_SUCOAS&quot;      =&gt; -5.06438
  &quot;R_GLNS&quot;        =&gt; 0.223462
  &quot;R_EX_pi_e&quot;     =&gt; -3.2149
  &quot;R_PPC&quot;         =&gt; 2.50431
  &quot;R_O2t&quot;         =&gt; 21.7995
Documenter.jl's avatar
Documenter.jl committed
29
  &quot;R_G6PDH2r&quot;     =&gt; 4.95999
Documenter.jl's avatar
Documenter.jl committed
30
  &quot;R_TALA&quot;        =&gt; 1.49698
Documenter.jl's avatar
Documenter.jl committed
31
  ⋮               =&gt;</code></pre><h4 id="Model-variant-processing"><a class="docs-heading-anchor" href="#Model-variant-processing">Model variant processing</a><a id="Model-variant-processing-1"></a><a class="docs-heading-anchor-permalink" href="#Model-variant-processing" title="Permalink"></a></h4><p>The main feature of COBREXA.jl is the ability to easily specify and process many analyses in parallel. To demonstrate, let&#39;s see how the organism would perform if some reactions were disabled independently:</p><pre><code class="language-julia"># convert to a model type that is efficient to modify
Documenter.jl's avatar
Documenter.jl committed
32
m = convert(StandardModel, model)
Documenter.jl's avatar
Documenter.jl committed
33

Documenter.jl's avatar
Documenter.jl committed
34
35
36
37
# find the model objective value if oxygen or carbon dioxide transports are disabled
screen(m, # the base model
    variants=[ # this specifies how to generate the desired model variants
        [], # one with no modifications, i.e. the base case
Documenter.jl's avatar
Documenter.jl committed
38
39
40
41
        [with_changed_bound(&quot;R_O2t&quot;, lower=0.0, upper=0.0)], # disable oxygen
        [with_changed_bound(&quot;R_CO2t&quot;, lower=0.0, upper=0.0)], # disable CO2
        [with_changed_bound(&quot;R_O2t&quot;, lower=0.0, upper=0.0),
	        with_changed_bound(&quot;R_CO2t&quot;, lower=0.0, upper=0.0)], # disable both
Documenter.jl's avatar
Documenter.jl committed
42
43
44
    ],
    # this specifies what to do with the model variants (received as the argument `x`)
    analysis = x -&gt;
Documenter.jl's avatar
Documenter.jl committed
45
        flux_balance_analysis_dict(x, Tulip.Optimizer)[&quot;R_BIOMASS_Ecoli_core_w_GAM&quot;],
Documenter.jl's avatar
Documenter.jl committed
46
47
48
49
)</code></pre><p>You should receive a result showing that missing oxygen transport makes the biomass production much harder:</p><pre><code class="language-julia">4-element Vector{Float64}:
 0.8739215022674809
 0.21166294973372796
 0.46166961413944896
Documenter.jl's avatar
Documenter.jl committed
50
 0.21114065173865457</code></pre><p>Most importantly, such analyses can be easily specified by automatically generating long lists of modifications to be applied to the model, and parallelized.</p><p>Knocking out each reaction in the model is efficiently accomplished:</p><pre><code class="language-julia"># load the task distribution package, add several worker nodes, and load
Documenter.jl's avatar
Documenter.jl committed
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# COBREXA and the solver on the nodes
using Distributed
addprocs(4)
@everywhere using COBREXA, Tulip

# get a list of the workers
worker_list = workers()

# run the processing in parallel for many model variants
res = screen(m,
    variants=[
	# create one variant for each reaction in the model, with that reaction knocked out
        [with_changed_bound(reaction_id, lower=0.0, upper=0.0)]
	for reaction_id in reactions(m)
    ],
    analysis = model -&gt; begin
	# we need to check if the optimizer even found a feasible solution,
	# which may not be the case if we knock out important reactions
    	sol = flux_balance_analysis_dict(model, Tulip.Optimizer)
	isnothing(sol) ? nothing : sol[&quot;BIOMASS_Ecoli_core_w_GAM&quot;]
    end,
    # run the screening in parallel on all workers in the list
    workers = worker_list,
)</code></pre><p>In result, you should get a long list of the biomass production for each reaction knockout. Let&#39;s decorate it with reaction names:</p><pre><code class="language-julia">Dict(reactions(m) .=&gt; res)</code></pre><p>...which should output an easily accessible dictionary with all the objective values named, giving a quick overview of which reactions are critical for the model organism to create biomass:</p><pre><code class="language-julia">Dict{String, Union{Nothing, Float64}} with 95 entries:
  &quot;ACALD&quot;       =&gt; 0.873922
  &quot;PTAr&quot;        =&gt; 0.873922
  &quot;ALCD2x&quot;      =&gt; 0.873922
  &quot;PDH&quot;         =&gt; 0.796696
  &quot;PYK&quot;         =&gt; 0.864926
  &quot;CO2t&quot;        =&gt; 0.46167
  &quot;EX_nh4_e&quot;    =&gt; 1.44677e-15
  &quot;MALt2_2&quot;     =&gt; 0.873922
  &quot;CS&quot;          =&gt; 2.44779e-14
  &quot;PGM&quot;         =&gt; 1.04221e-15
  &quot;TKT1&quot;        =&gt; 0.864759
Documenter.jl's avatar
Documenter.jl committed
86
  ⋮             =&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><li><a href="notebooks/9_max_min_driving_force_analysis/#Maximum-minimum-driving-force-analysis">Maximum-minimum driving force analysis</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/#Types-and-functions">Types and functions</a></li></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/">All 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="Monday 16 May 2022 12:46">Monday 16 May 2022</span>. Using Julia version 1.7.0.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>