import%20marimo%0A%0A__generated_with%20%3D%20%220.23.16%22%0Aapp%20%3D%20marimo.App(width%3D%22medium%22)%0A%0Aasync%20with%20app.setup(hide_code%3DTrue)%3A%0A%20%20%20%20%23%20Setup%20cell%20for%20marimo%20notebook%2C%20can%20be%20ignored%0A%20%20%20%20import%20marimo%20as%20mo%0A%20%20%20%20import%20sys%0A%0A%20%20%20%20%23%20Import%20packages%20if%20running%20on%20marimo%20playground%0A%20%20%20%20if%20sys.executable%20%3D%3D%20%22%2Fhome%2Fpyodide%2Fthis.program%22%3A%0A%20%20%20%20%20%20%20%20import%20micropip%0A%0A%20%20%20%20%20%20%20%20await%20micropip.install(%0A%20%20%20%20%20%20%20%20%20%20%20%20%5B%22pint_pandas%3C%3D0.7%22%2C%20%22typing_extensions%3E%3D4.15.0%22%2C%20%22simbio%3E%3D1.1.0%22%2C%20%22matplotlib%22%5D%2C%20verbose%20%3D%20False%0A%20%20%20%20%20%20%20%20)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%20Getting%20started%20with%20SimBio%0A%20%20%20%20SimBio%20is%20a%20Python-based%20package%20for%20simulation%20of%20Chemical%20Reaction%20Networks%20(CRNs).%20It%20extends%20%5Bpoincare%5D(https%3A%2F%2Fdyscolab.github.io%2Fpoincare%2F)%2C%20a%20package%20for%20modelling%20dynamical%20systems%2C%20to%20add%20functionality%20for%20CRNs.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20Installation%0A%0A%20%20%20%20Using%20%5Bpixi%5D(https%3A%2F%2Fpixi.sh%2Flatest%2F)%2C%0A%20%20%20%20install%20from%20PyPI%20with%3A%0A%0A%20%20%20%20%60%60%60sh%0A%20%20%20%20pixi%20add%20--pypi%20simbio%0A%20%20%20%20%60%60%60%0A%0A%20%20%20%20or%20install%20the%20latest%20development%20version%20from%20GitHub%20with%3A%0A%0A%20%20%20%20%60%60%60sh%0A%20%20%20%20pixi%20add%20--pypi%20simbio%40https%3A%2F%2Fgithub.com%2Fdyscolab%2Fsimbio.git%0A%20%20%20%20%60%60%60%0A%0A%20%20%20%20Otherwise%2C%0A%20%20%20%20use%20%60pip%60%20or%20your%20%60pip%60-compatible%20package%20manager%3A%0A%0A%20%20%20%20%60%60%60sh%0A%20%20%20%20pip%20install%20simbio%20%20%23%20from%20PyPI%0A%20%20%20%20pip%20install%20git%2Bhttps%3A%2F%2Fgithub.com%2Fdyscolab%2Fsimbio.git%20%20%23%20from%20GitHub%0A%20%20%20%20%60%60%60%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20Creating%20and%20simulating%20a%20Model%0A%20%20%20%20To%20create%20a%20model%20we%20must%20create%20class%20which%20inherits%20from%20%60System%60%2C%20which%20can%20contain%20different%20%60Variables%60%2C%20in%20this%20case%2C%20A%2C%20B%20and%20C.%20We%20can%20define%20a%20%60RateLaw%60%20to%20add%20the%20reaction%202A%20%2B%20B%20%24%5Crightarrow%24%20C.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20from%20simbio%20import%20System%2C%20RateLaw%2C%20Variable%2C%20initial%0A%0A%20%20%20%20class%20Model(System)%3A%0A%20%20%20%20%20%20%20%20%23%20Create%20species%20A%2C%20B%2C%20and%20C%2C%20each%20with%20intial%20value%201%0A%20%20%20%20%20%20%20%20A%3A%20Variable%20%3D%20initial(default%3D1)%0A%20%20%20%20%20%20%20%20B%3A%20Variable%20%3D%20initial(default%3D1)%0A%20%20%20%20%20%20%20%20C%3A%20Variable%20%3D%20initial(default%3D1)%0A%0A%20%20%20%20%20%20%20%20reaction%20%3D%20RateLaw(reactants%3D%5B2%20*%20A%2C%20B%5D%2C%20products%3D%5BC%5D%2C%20rate_law%3D1)%0A%0A%20%20%20%20return%20Model%2C%20RateLaw%2C%20System%2C%20Variable%2C%20initial%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20Would%20be%20equivalent%20to%20the%20equations%3A%0A%20%20%20%20%24%24%0A%20%20%20%20%5Cbegin%7Baligned%7D%0A%20%20%20%20%5Cfrac%7BdA%7D%7Bdt%7D%20%26%3D%20-2%20%5C%5C%0A%20%20%20%20%5Cfrac%7BdB%7D%7Bdt%7D%20%26%3D%20-1%20%5C%5C%0A%20%20%20%20%5Cfrac%7BdC%7D%7Bdt%7D%20%26%3D%201%0A%20%20%20%20%5Cend%7Baligned%7D%0A%20%20%20%20%24%24%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20To%20simulate%20it%20we%20must%20create%20a%20%60Simulator%60%20for%20it%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(Model)%3A%0A%20%20%20%20import%20numpy%20as%20np%0A%20%20%20%20from%20simbio%20import%20Simulator%0A%0A%20%20%20%20sim%20%3D%20Simulator(Model)%0A%20%20%20%20result%20%3D%20sim.solve(save_at%3Dnp.linspace(0%2C%2010%2C%20100))%0A%20%20%20%20result%0A%20%20%20%20return%20Simulator%2C%20np%2C%20result%2C%20sim%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%60Simulator.solve%60%20outputs%20a%20%5Bxarray%5D(https%3A%2F%2Fdocs.xarray.dev%2Fen%2Fstable%2F)%20%60Dataset%60.%20To%20plot%20it%20we%20convert%20it%20to%20a%20pandas%20dataframe%20and%20use%20the%20%60plot()%60%20method.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(result)%3A%0A%20%20%20%20result.to_dataframe()%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20We%20can%20vary%20initial%20conditions%20by%20passing%20a%20%60values%60%20dictionary%20to%20the%20%60solve()%60%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(Model%2C%20sim)%3A%0A%20%20%20%20sim.solve(save_at%3Drange(3)%2C%20values%3D%7BModel.A%3A%202%2C%20Model.B%3A%200.5%7D).to_dataframe().plot()%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20Mass%20action%20reactions%0A%20%20%20%20In%20the%20previous%20example%20the%20reaction%20happened%20at%20a%20constant%20rate.%20We%20can%20also%20implement%20it%20as%20a%20Mass%20action%20reaction%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(System%2C%20Variable%2C%20initial)%3A%0A%20%20%20%20from%20simbio%20import%20MassAction%0A%0A%20%20%20%20class%20ModelMA(System)%3A%0A%20%20%20%20%20%20%20%20%23%20Create%20species%20A%2C%20B%2C%20and%20C%2C%20each%20with%20intial%20value%201%0A%20%20%20%20%20%20%20%20A%3A%20Variable%20%3D%20initial(default%3D1)%0A%20%20%20%20%20%20%20%20B%3A%20Variable%20%3D%20initial(default%3D1)%0A%20%20%20%20%20%20%20%20C%3A%20Variable%20%3D%20initial(default%3D1)%0A%0A%20%20%20%20%20%20%20%20reaction%20%3D%20MassAction(reactants%3D%5B2%20*%20A%2C%20B%5D%2C%20products%3D%5BC%5D%2C%20rate%3D1)%0A%0A%20%20%20%20return%20(ModelMA%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20Corresponds%20to%20the%20equations%3A%0A%20%20%20%20%24%24%0A%20%20%20%20%5Cbegin%7Baligned%7D%0A%20%20%20%20%5Cfrac%7BdA%7D%7Bdt%7D%20%26%3D%20-2A%5E2%20%5C%5C%0A%20%20%20%20%5Cfrac%7BdB%7D%7Bdt%7D%20%26%3D%20-B%5C%5C%0A%20%20%20%20%5Cfrac%7BdC%7D%7Bdt%7D%20%26%3D%20A%5E2B%0A%20%20%20%20%5Cend%7Baligned%7D%0A%20%20%20%20%24%24%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(ModelMA%2C%20Simulator%2C%20np)%3A%0A%20%20%20%20simMA%20%3D%20Simulator(ModelMA)%0A%20%20%20%20result_2%20%3D%20simMA.solve(save_at%3Dnp.linspace(0%2C%2010%2C%20100))%0A%20%20%20%20result_2.to_dataframe().plot()%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20Constants%20and%20Parameters%0A%0A%20%20%20%20Besides%20variables%2C%0A%20%20%20%20we%20can%20define%20parameters%20and%20constants%2C%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%20Constants%0A%0A%20%20%20%20Constants%20allow%20to%20define%20common%20initial%20conditions%20for%20Variables%3A%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(RateLaw%2C%20Simulator%2C%20System%2C%20Variable%2C%20initial)%3A%0A%20%20%20%20from%20simbio%20import%20Constant%2C%20assign%0A%0A%20%20%20%20class%20ModelConst(System)%3A%0A%20%20%20%20%20%20%20%20%23%20Create%20a%20constant%20c%20to%20set%20intial%20conditions%20for%20A%20and%20B%0A%20%20%20%20%20%20%20%20c%3A%20Constant%20%3D%20assign(default%3D1%2C%20constant%3DTrue)%0A%0A%20%20%20%20%20%20%20%20%23%20Create%20species%20A%2C%20B%2C%20and%20C%2C%20each%20with%20intial%20value%201%0A%20%20%20%20%20%20%20%20A%3A%20Variable%20%3D%20initial(default%3Dc)%0A%20%20%20%20%20%20%20%20B%3A%20Variable%20%3D%20initial(default%3D2%20*%20c)%0A%20%20%20%20%20%20%20%20C%3A%20Variable%20%3D%20initial(default%3D1)%0A%0A%20%20%20%20%20%20%20%20reaction%20%3D%20RateLaw(reactants%3D%5B2%20*%20A%2C%20B%5D%2C%20products%3D%5BC%5D%2C%20rate_law%3D1)%0A%0A%20%20%20%20Simulator(ModelConst).solve(save_at%3Drange(3))%0A%20%20%20%20return%20ModelConst%2C%20assign%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20Now%2C%20we%20can%20vary%20their%20initial%20conditions%20jointly%3A%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(ModelConst%2C%20Simulator)%3A%0A%20%20%20%20Simulator(ModelConst).solve(values%3D%7BModelConst.c%3A%202%7D%2C%20save_at%3Drange(3))%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20But%20we%20can%20break%20that%20connection%20by%20passing%20%60y%60's%20initial%20value%20directly%3A%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(ModelConst%2C%20Simulator)%3A%0A%20%20%20%20Simulator(ModelConst).solve(%0A%20%20%20%20%20%20%20%20values%3D%7BModelConst.c%3A%202%2C%20ModelConst.B%3A%203%7D%2C%20save_at%3Drange(3)%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%20Parameters%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20Parameters%20are%20like%20Variables%2C%0A%20%20%20%20but%20their%20time%20evolution%20is%20given%20directly%20as%20a%20function%20of%20time%2C%0A%20%20%20%20Variables%2C%20Constants%20and%20other%20Parameters.%20Their%20default%20value%20can%20also%20be%20changed%20in%20%60values%60%3A%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(RateLaw%2C%20Simulator%2C%20System%2C%20Variable%2C%20assign%2C%20initial)%3A%0A%20%20%20%20from%20simbio%20import%20Parameter%0A%0A%20%20%20%20class%20ModelParametrized(System)%3A%0A%20%20%20%20%20%20%20%20%23%20Create%20species%20A%2C%20B%2C%20and%20C%2C%20each%20with%20intial%20value%201%0A%20%20%20%20%20%20%20%20A%3A%20Variable%20%3D%20initial(default%3D1)%0A%20%20%20%20%20%20%20%20B%3A%20Variable%20%3D%20initial(default%3D1)%0A%20%20%20%20%20%20%20%20C%3A%20Variable%20%3D%20initial(default%3D1)%0A%0A%20%20%20%20%20%20%20%20%23%20Create%20a%20rate%20parameter%20to%20control%20the%20rate%0A%20%20%20%20%20%20%20%20rate%3A%20Parameter%20%3D%20assign(default%3D1)%0A%0A%20%20%20%20%20%20%20%20reaction%20%3D%20RateLaw(reactants%3D%5B2%20*%20A%2C%20B%5D%2C%20products%3D%5BC%5D%2C%20rate_law%3Drate)%0A%0A%20%20%20%20Simulator(ModelParametrized).solve(%0A%20%20%20%20%20%20%20%20save_at%3Drange(3)%2C%20values%3D%7BModelParametrized.rate%3A%203%7D%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20Other%20utilities%0A%20%20%20%20SimBio%20contains%20a%20number%20of%20built%20in%20classes%20to%20represent%20common%20reactions%2C%20which%20can%20be%20found%20in%20%60simbio.reactions.single%60%3A%0A%20%20%20%20-%20%60Creation(A%3A%20Species%2C%20rate%3A%20Parameter)%60%3A%20A%20substance%20%60A%60%20is%20created%20from%20nothing%20at%20a%20given%20rate%2C%20%E2%88%85%20-%3E%20A.%0A%20%20%20%20-%20%60AutoCreation(A%3A%20Species%2C%20rate%3A%20Parameter)%60%3A%20A%20substance%20%60A%60%20is%20created%20at%20a%20rate%20proportional%20to%20its%20abundance%2C%20A%20-%3E%202A.%0A%20%20%20%20-%20%60Destruction(A%3A%20Species%2C%20rate%3A%20Parameter)%60%3A%20A%20substance%20%60A%60%20degrades%20into%20nothing%2C%20A%20-%3E%20%E2%88%85.%0A%20%20%20%20-%20%60Conversion(A%3A%20Species%2C%20B%3A%20Species%2C%20rate%3A%20Parameter)%60%3A%20A%20substance%20%60A%60%20converts%20into%20%60B%60%2C%20A%20-%3E%20B.%0A%20%20%20%20-%20%60Synthesis(A%3A%20Species%2C%20B%3A%20Species%2C%20AB%3A%20Species%2C%20rate%3A%20Parameter)%60%3A%20%20Two%20simple%20substances%20%60A%60%20and%20%60B%60%20combine%20to%20form%20a%20more%20complex%20substance%20%60AB%60%2C%20A%20%2B%20B%20-%3E%20AB.%0A%20%20%20%20-%20%60Dissociation(AB%3A%20Species%2C%20A%3A%20Species%2C%20B%3A%20Species%2C%20rate%3A%20Parameter)%60%3A%20A%20more%20complex%20substance%20%60AB%60%20breaks%20down%20into%20its%20more%20simple%20parts%20%60A%60%20and%20%60B%60%2C%20AB%20-%3E%20A%20%2B%20B.%0A%0A%20%20%20%20All%20rates%20in%20these%20reactions%20are%20set%20according%20to%20%60MassAction%60%20rules%2C%20so%20%60Synthesis(A%20%3D%202*A%2C%20B%3DB%2C%20AB%20%3D%20AB%2C%20rate%3Dk)%60%20would%20represent%3A%0A%20%20%20%20%24%24%0A%20%20%20%20%5Cbegin%7Baligned%7D%0A%20%20%20%20%5Cfrac%7BdA%7D%7Bdt%7D%26%3D-%202%20A%5E%7B2%7D%20B%20k%5C%5C%0A%20%20%20%20%5Cfrac%7BdB%7D%7Bdt%7D%26%3D%20-A%5E%7B2%7D%20B%20k%5C%5C%0A%20%20%20%20%5Cfrac%7BdAB%7D%7Bdt%7D%26%3D%20A%5E%7B2%7D%20B%20k%5C%5C%0A%20%20%20%20%5Cend%7Baligned%7D%0A%20%20%20%20%24%24%0A%0A%20%20%20%20There%20are%20also%20built%20in%20two-way%20reactions%20in%20%60simbio.reactions.compound%60%3A%0A%20%20%20%20-%20%60ReversibleSynthesis(A%3A%20Species%2C%20B%3A%20Species%2C%20AB%3A%20Species%2C%20forward_rate%3A%20Parameter%2C%20reverse_rate%3A%20Parameter)%60%3A%20A%20%60Synthesis%60%20and%20%60Dissociation%60%20reactions%20each%20with%20a%20separate%20%60rate%60%2C%20A%20%2B%20B%20%3C-%3E%20AB.%0A%20%20%20%20-%20%60Equilibration(A%3A%20Species%2C%20B%3A%20Species%2C%20forward_rate%3A%20Parameter%2C%20reverse_rate%3A%20Parameter)%60%3A%20A%20forward%20and%20backward%20%60Conversion%60%2C%20each%20with%20a%20separate%20%60rate%60%2C%20A%20%3C-%3E%20B.%0A%20%20%20%20-%20%60CatalyzeConvert(A%3A%20Species%2C%20B%3A%20Species%2C%20AB%3A%20Species%2C%20P%3A%20Species%2C%20forward_rate%3A%20Parameter%2C%20reverse_rate%3A%20Parameter%2C%20conversion_rate%3A%20Parameter)%60%3A%20A%20%60ReversibleSynthesis%60%20between%20%60A%60%2C%20%60B%60%2C%20and%20%60AB%60%2C%20and%20a%20%60Conversion%60%20from%20%60AB%60%20to%20%60P%60%20with%20%60rate%20%3D%20conversion_rate%60%2C%20A%20%2B%20B%20%3C-%3E%20A%3AB%20-%3E%20P.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20For%20more%20details%20into%20SimBio's%20capabilities%2C%20we%20recommend%20reading%20%5Bpoincare's%20documentation%5D(https%3A%2F%2Fdyscolab.github.io%2Fpoincare%2F).%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20app.run()%0A
acbbef13027ae3a8f4737ba89e966e95