From a4438c02ec1439edb16431b86bda890345897987 Mon Sep 17 00:00:00 2001 From: Michiel Stock Date: Tue, 15 Sep 2026 15:16:10 +0200 Subject: [PATCH] Revert "Repo clean-up: single-source exercises, Julia 1.12, notes moved to private repo" --- .github/workflows/CheckNotebooks.yml | 21 +- .github/workflows/ExportNotebooks.yml | 5 +- .gitignore | 721 ++- Manifest.toml | 3883 ----------------- Procfile | 1 + Project.toml | 1 + README.md | 37 +- course/figures_uncertainty/gsa.jl | 40 + course/figures_uncertainty/morris_edit.svg | 1014 +++++ course/figures_uncertainty/uncertainty.jl | 92 + develop.jl | 2 +- examples/insuline_sensitivity backup 1.jl | 372 ++ exercises/README.md | 6 - exercises/launch_pluto.jl | 6 + exercises/solved_notebooks/Project.toml | 2 +- .../model_selection_friction_sol.jl | 1143 +++++ make.jl | 17 + makefigs.jl | 33 + notebook-checks/make.jl | 83 + notebook-checks/sync_exercises.jl | 205 - pluto-deployment-environment/Manifest.toml | 112 +- .../PlutoDeployment.toml | 5 + pluto-deployment-environment/Project.toml | 3 - project/cocktail_draft.jl | 2486 +++++++++++ project/project_assignment.pdf | Bin 151644 -> 0 bytes project/project_cocktails backup 1.jl | 2492 +++++++++++ requirements.txt | 2 + scripts/Expdist_reactions.jl | 1569 +++++++ scripts/MCMC.jl | 1053 +++++ scripts/autodiff backup 1.jl | 2269 ++++++++++ scripts/autodiff.jl | 2974 +++++++++++++ scripts/calibration.jl | 1035 +++++ scripts/hiptobesquare.jl | 2992 +++++++++++++ scripts/image_complexity.jl | 2018 +++++++++ scripts/introduction.jl | 79 + scripts/model_selection.jl | 382 ++ scripts/modelling_ODEs.jl | 917 ++++ scripts/modelling_distributions.jl | 1345 ++++++ scripts/optimization.jl | 458 ++ scripts/sampling_algorithms.jl | 160 + scripts/simulation_tools backup 1.jl | 512 +++ scripts/simulation_tools.jl | 750 ++++ scripts/uncertainty.jl | 474 ++ src/_data/homepage.jl | 2 +- src/_data/tracks.jl | 5 + src/_includes/layout.jlhtml | 18 +- src/assets/scripts/sidebar.js | 19 + src/assets/styles/layout.css | 22 + src/cheat_sheets/cheatsheets.md | 2 +- src/exercises/ode_model_XTRA_tank_T_h_mtk.jl | 2 +- .../ode_model_XTRA_temp_reactors_mtk.jl | 2 +- .../ode_model_XTRA_water_evap_infil_mtk.jl | 2 +- src/exercises/ode_model_catalyst_intro.jl | 2 +- src/exercises/ode_model_diver_mtk.jl | 2 +- src/exercises/ode_model_irrigation_mtk.jl | 2 +- src/exercises/ode_model_mtk_intro.jl | 2 +- src/exercises/ode_model_tank_h_mtk.jl | 2 +- src/exercises/ode_model_tractor_seat_mtk.jl | 2 +- src/homework/hw1.jl | 513 +++ src/mod1_setup_website/basic_info.md | 89 + src/mod1_setup_website/getting_started.md | 46 + src/mod1_setup_website/working_locally.md | 21 + src/mod2_add_material/add_markdown.md | 89 + src/mod2_add_material/add_pluto.jl | 506 +++ src/mod2_add_material/plutoui_showcase.jl | 1021 +++++ src/mod3_publish_website/deploy_static.md | 34 + src/mod3_publish_website/precompute_output.md | 10 + src/mod3_publish_website/setup_server.md | 11 + src/netlify.toml | 4 + src/welcome/installation.md | 4 +- website_maintenance.md | 37 +- 71 files changed, 29966 insertions(+), 4276 deletions(-) delete mode 100644 Manifest.toml create mode 100644 Procfile create mode 100644 course/figures_uncertainty/gsa.jl create mode 100644 course/figures_uncertainty/morris_edit.svg create mode 100644 course/figures_uncertainty/uncertainty.jl create mode 100644 examples/insuline_sensitivity backup 1.jl delete mode 100644 exercises/README.md create mode 100644 exercises/launch_pluto.jl create mode 100644 exercises/student_notebooks/P8_modselect/model_selection_friction_sol.jl create mode 100644 make.jl create mode 100644 makefigs.jl create mode 100644 notebook-checks/make.jl delete mode 100644 notebook-checks/sync_exercises.jl create mode 100644 project/cocktail_draft.jl delete mode 100644 project/project_assignment.pdf create mode 100644 project/project_cocktails backup 1.jl create mode 100644 requirements.txt create mode 100644 scripts/Expdist_reactions.jl create mode 100644 scripts/MCMC.jl create mode 100644 scripts/autodiff backup 1.jl create mode 100644 scripts/autodiff.jl create mode 100644 scripts/calibration.jl create mode 100644 scripts/hiptobesquare.jl create mode 100644 scripts/image_complexity.jl create mode 100644 scripts/introduction.jl create mode 100644 scripts/model_selection.jl create mode 100644 scripts/modelling_ODEs.jl create mode 100644 scripts/modelling_distributions.jl create mode 100644 scripts/optimization.jl create mode 100644 scripts/sampling_algorithms.jl create mode 100644 scripts/simulation_tools backup 1.jl create mode 100644 scripts/simulation_tools.jl create mode 100644 scripts/uncertainty.jl create mode 100644 src/_data/tracks.jl create mode 100644 src/homework/hw1.jl create mode 100644 src/mod1_setup_website/basic_info.md create mode 100644 src/mod1_setup_website/getting_started.md create mode 100644 src/mod1_setup_website/working_locally.md create mode 100644 src/mod2_add_material/add_markdown.md create mode 100644 src/mod2_add_material/add_pluto.jl create mode 100644 src/mod2_add_material/plutoui_showcase.jl create mode 100644 src/mod3_publish_website/deploy_static.md create mode 100644 src/mod3_publish_website/precompute_output.md create mode 100644 src/mod3_publish_website/setup_server.md create mode 100644 src/netlify.toml diff --git a/.github/workflows/CheckNotebooks.yml b/.github/workflows/CheckNotebooks.yml index 26626f22..b903b6b9 100644 --- a/.github/workflows/CheckNotebooks.yml +++ b/.github/workflows/CheckNotebooks.yml @@ -2,21 +2,7 @@ name: Check notebooks on: push: - branches: [main] - paths: - - 'exercises/**' - - 'notebook-checks/**' - - '.github/workflows/CheckNotebooks.yml' pull_request: - branches: [main] - paths: - - 'exercises/**' - - 'notebook-checks/**' - - '.github/workflows/CheckNotebooks.yml' - -concurrency: - group: check-${{ github.ref }} - cancel-in-progress: true jobs: build: @@ -26,10 +12,9 @@ jobs: pull-requests: read statuses: write runs-on: ubuntu-latest - timeout-minutes: 90 steps: - - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - - uses: julia-actions/setup-julia@5c9647d97b78a5debe5164e9eec09d653d29bd71 # v2.6.1 + - uses: actions/checkout@v4 + - uses: julia-actions/setup-julia@v2 with: version: '1.12' - uses: julia-actions/cache@v2 @@ -38,4 +23,4 @@ jobs: - name: Build and deploy run: julia --color=yes notebook-checks/check_notebooks.jl env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file diff --git a/.github/workflows/ExportNotebooks.yml b/.github/workflows/ExportNotebooks.yml index 7595fcc9..46d23427 100644 --- a/.github/workflows/ExportNotebooks.yml +++ b/.github/workflows/ExportNotebooks.yml @@ -22,7 +22,7 @@ jobs: - name: πŸ™Œ Install Julia uses: julia-actions/setup-julia@5c9647d97b78a5debe5164e9eec09d653d29bd71 # v2.6.1 with: - version: '1.12' + version: "1.11.2" - name: ⏱ Cache .julia uses: actions/cache@1bd1e32a3bdc45362d1e726936510720a7c30a57 # v4.2.0 @@ -32,9 +32,6 @@ jobs: restore-keys: | ${{ runner.os }}-dotjulia-v1-${{ hashFiles('pluto-deployment-environment/*.toml') }} - - name: πŸ” Check src/exercises is in sync with student notebooks - run: julia --color=yes notebook-checks/sync_exercises.jl --check - - name: πŸͺ΄ Generate site env: GKSwstype: "100" diff --git a/.gitignore b/.gitignore index d639e45d..3106e164 100644 --- a/.gitignore +++ b/.gitignore @@ -1,36 +1,703 @@ -# --------------------------------------------------------------------------- -# Julia -# --------------------------------------------------------------------------- -# Root Manifest.toml and pluto-deployment-environment/Manifest.toml are tracked -# on purpose (reproducible course environment). Only the throwaway launcher -# environment keeps its Manifest local. +## REPO + +figures/* +notebook-checks/src +notebook-checks/build + +## Julia +Manifest.toml + + +## Core latex/pdflatex auxiliary files: +*.aux +*.lof +*.log +*.lot +*.fls +*.out +*.toc +*.fmt +*.fot +*.cb +*.cb2 +.*.lb + +## Intermediate documents: +*.dvi +*.xdv +*-converted-to.* +# these rules might exclude image files for figures etc. +*.ps +*.eps +*.pdf + +## Generated if empty string is given at "Please type another file name for output:" +.pdf + +## Bibliography auxiliary files (bibtex/biblatex/biber): +*.bbl +*.bcf +*.blg +*-blx.aux +*-blx.bib +*.run.xml + +## Build tool auxiliary files: +*.fdb_latexmk +*.synctex +*.synctex(busy) +*.synctex.gz +*.synctex.gz(busy) +*.pdfsync + +## Build tool directories for auxiliary files +# latexrun +latex.out/ + +## Auxiliary and intermediate files from other packages: +# algorithms +*.alg +*.loa + +# achemso +acs-*.bib + +# amsthm +*.thm + +# beamer +*.nav +*.pre +*.snm +*.vrb + +# changes +*.soc + +# comment +*.cut + +# cprotect +*.cpt + +# elsarticle (documentclass of Elsevier journals) +*.spl + +# endnotes +*.ent + +# fixme +*.lox + +# feynmf/feynmp +*.mf +*.mp +*.t[1-9] +*.t[1-9][0-9] +*.tfm + +#(r)(e)ledmac/(r)(e)ledpar +*.end +*.?end +*.[1-9] +*.[1-9][0-9] +*.[1-9][0-9][0-9] +*.[1-9]R +*.[1-9][0-9]R +*.[1-9][0-9][0-9]R +*.eledsec[1-9] +*.eledsec[1-9]R +*.eledsec[1-9][0-9] +*.eledsec[1-9][0-9]R +*.eledsec[1-9][0-9][0-9] +*.eledsec[1-9][0-9][0-9]R + +# glossaries +*.acn +*.acr +*.glg +*.glo +*.gls +*.glsdefs +*.lzo +*.lzs +*.slg +*.slo +*.sls + +# uncomment this for glossaries-extra (will ignore makeindex's style files!) +# *.ist + +# gnuplot +*.gnuplot +*.table + +# gnuplottex +*-gnuplottex-* + +# gregoriotex +*.gaux +*.glog +*.gtex + +# htlatex +*.4ct +*.4tc +*.idv +*.lg +*.trc +*.xref + +# hyperref +*.brf + +# knitr +*-concordance.tex +# TODO Uncomment the next line if you use knitr and want to ignore its generated tikz files +# *.tikz +*-tikzDictionary + +# listings +*.lol + +# luatexja-ruby +*.ltjruby + +# makeidx +*.idx +*.ilg +*.ind + +# minitoc +*.maf +*.mlf +*.mlt +*.mtc[0-9]* +*.slf[0-9]* +*.slt[0-9]* +*.stc[0-9]* + +# minted +_minted* +*.pyg + +# morewrites +*.mw + +# newpax +*.newpax + +# nomencl +*.nlg +*.nlo +*.nls + +# pax +*.pax + +# pdfpcnotes +*.pdfpc + +# sagetex +*.sagetex.sage +*.sagetex.py +*.sagetex.scmd + +# scrwfile +*.wrt + +# svg +svg-inkscape/ + +# sympy +*.sout +*.sympy +sympy-plots-for-*.tex/ + +# pdfcomment +*.upa +*.upb + +# pythontex +*.pytxcode +pythontex-files-*/ + +# tcolorbox +*.listing + +# thmtools +*.loe + +# TikZ & PGF +*.dpth +*.md5 +*.auxlock + +# titletoc +*.ptc + +# todonotes +*.tdo + +# vhistory +*.hst +*.ver + +# easy-todo +*.lod + +# xcolor +*.xcp + +# xmpincl +*.xmpi + +# xindy +*.xdy + +# xypic precompiled matrices and outlines +*.xyc +*.xyd + +# endfloat +*.ttt +*.fff + +# Latexian +TSWLatexianTemp* + +## Editors: +# WinEdt +*.bak +*.sav + +# Texpad +.texpadtmp + +# LyX +*.lyx~ + +# Kile +*.backup + +# gummi +.*.swp + +# KBibTeX +*~[0-9]* + +# TeXnicCenter +*.tps + +# auto folder when using emacs and auctex +./auto/* +*.el + +# expex forward references with \gathertags +*-tags.tex + +# standalone packages +*.sta + +# Makeindex log files +*.lpz + +# xwatermark package +*.xwm + +# REVTeX puts footnotes in the bibliography by default, unless the nofootinbib +# option is specified. Footnotes are the stored in a file with suffix Notes.bib. +# Uncomment the next line to have this generated file ignored. +#*Notes.bib + +# vscode +.vscode/ + examples/launch_pluto/Manifest.toml -# --------------------------------------------------------------------------- -# Site build outputs (develop.jl / generate.jl / PlutoPages) -- the site is -# built by CI. The build no longer executes notebooks, so there is no notebook -# output cache to seed: _cache is a local leftover and must stay out. -# --------------------------------------------------------------------------- +# Files generated by invoking Julia with --code-coverage +*.jl.cov +*.jl.*.cov + +# Files generated by invoking Julia with --track-allocation +*.jl.mem + +# System-specific files and directories generated by the BinaryProvider and BinDeps packages +# They contain absolute paths specific to the host computer, and so should not be committed +deps/deps.jl +deps/build.log +deps/downloads/ +deps/usr/ +deps/src/ + +# Build artifacts for creating documentation generated by the Documenter package +docs/build/ +docs/site/ + +# File generated by Pkg, the package manager, based on a corresponding Project.toml +# It records a fixed state of all packages used by the project. As such, it should not be +# committed for packages, but should be committed for applications that require a static +# environment. +Manifest.toml + +# images are by default ignored, force add them if you must +*.png +*.jpg +*.svg + +# Local build output from develop.jl / generate.jl β€” the site is built by CI _site/ -_cache/ generation_report.html build.log -# --------------------------------------------------------------------------- -# --------------------------------------------------------------------------- -# --------------------------------------------------------------------------- -# Private material (exams) -- never committed -# --------------------------------------------------------------------------- -examen/ - -# --------------------------------------------------------------------------- -# Misc (.vscode/ is tracked on purpose) -# --------------------------------------------------------------------------- -.DS_Store +## REPO + +figures/* +notebook-checks/src +notebook-checks/build + +## Julia +Manifest.toml + + +## Core latex/pdflatex auxiliary files: +*.aux +*.lof +*.log +*.lot +*.fls +*.out +*.toc +*.fmt +*.fot +*.cb +*.cb2 +.*.lb + +## Intermediate documents: +*.dvi +*.xdv +*-converted-to.* +# these rules might exclude image files for figures etc. +*.ps +*.eps +*.pdf + +## Generated if empty string is given at "Please type another file name for output:" +.pdf + +## Bibliography auxiliary files (bibtex/biblatex/biber): +*.bbl +*.bcf +*.blg +*-blx.aux +*-blx.bib +*.run.xml + +## Build tool auxiliary files: +*.fdb_latexmk +*.synctex +*.synctex(busy) +*.synctex.gz +*.synctex.gz(busy) +*.pdfsync + +## Build tool directories for auxiliary files +# latexrun +latex.out/ + +## Auxiliary and intermediate files from other packages: +# algorithms +*.alg +*.loa + +# achemso +acs-*.bib + +# amsthm +*.thm + +# beamer +*.nav +*.pre +*.snm +*.vrb + +# changes +*.soc + +# comment +*.cut + +# cprotect +*.cpt + +# elsarticle (documentclass of Elsevier journals) +*.spl + +# endnotes +*.ent + +# fixme +*.lox + +# feynmf/feynmp +*.mf +*.mp +*.t[1-9] +*.t[1-9][0-9] +*.tfm + +#(r)(e)ledmac/(r)(e)ledpar +*.end +*.?end +*.[1-9] +*.[1-9][0-9] +*.[1-9][0-9][0-9] +*.[1-9]R +*.[1-9][0-9]R +*.[1-9][0-9][0-9]R +*.eledsec[1-9] +*.eledsec[1-9]R +*.eledsec[1-9][0-9] +*.eledsec[1-9][0-9]R +*.eledsec[1-9][0-9][0-9] +*.eledsec[1-9][0-9][0-9]R + +# glossaries +*.acn +*.acr +*.glg +*.glo +*.gls +*.glsdefs +*.lzo +*.lzs +*.slg +*.slo +*.sls + +# uncomment this for glossaries-extra (will ignore makeindex's style files!) +# *.ist + +# gnuplot +*.gnuplot +*.table + +# gnuplottex +*-gnuplottex-* + +# gregoriotex +*.gaux +*.glog +*.gtex + +# htlatex +*.4ct +*.4tc +*.idv +*.lg +*.trc +*.xref + +# hyperref +*.brf + +# knitr +*-concordance.tex +# TODO Uncomment the next line if you use knitr and want to ignore its generated tikz files +# *.tikz +*-tikzDictionary + +# listings +*.lol + +# luatexja-ruby +*.ltjruby + +# makeidx +*.idx +*.ilg +*.ind + +# minitoc +*.maf +*.mlf +*.mlt +*.mtc[0-9]* +*.slf[0-9]* +*.slt[0-9]* +*.stc[0-9]* + +# minted +_minted* +*.pyg + +# morewrites +*.mw + +# newpax +*.newpax + +# nomencl +*.nlg +*.nlo +*.nls + +# pax +*.pax + +# pdfpcnotes +*.pdfpc + +# sagetex +*.sagetex.sage +*.sagetex.py +*.sagetex.scmd + +# scrwfile +*.wrt + +# svg +svg-inkscape/ + +# sympy +*.sout +*.sympy +sympy-plots-for-*.tex/ + +# pdfcomment +*.upa +*.upb + +# pythontex +*.pytxcode +pythontex-files-*/ + +# tcolorbox +*.listing + +# thmtools +*.loe + +# TikZ & PGF +*.dpth +*.md5 +*.auxlock + +# titletoc +*.ptc + +# todonotes +*.tdo + +# vhistory +*.hst +*.ver + +# easy-todo +*.lod + +# xcolor +*.xcp + +# xmpincl +*.xmpi + +# xindy +*.xdy + +# xypic precompiled matrices and outlines +*.xyc +*.xyd + +# endfloat +*.ttt +*.fff + +# Latexian +TSWLatexianTemp* + +## Editors: +# WinEdt *.bak -*.csv.bak +*.sav + +# Texpad +.texpadtmp + +# LyX +*.lyx~ -# per-run build artefact of CheckNotebooks CI (Pkg.instantiate); the env is resolved fresh -exercises/solved_notebooks/Manifest.toml +# Kile +*.backup -__pycache__/ +# gummi +.*.swp + +# KBibTeX +*~[0-9]* + +# TeXnicCenter +*.tps + +# auto folder when using emacs and auctex +./auto/* +*.el + +# expex forward references with \gathertags +*-tags.tex + +# standalone packages +*.sta + +# Makeindex log files +*.lpz + +# xwatermark package +*.xwm + +# REVTeX puts footnotes in the bibliography by default, unless the nofootinbib +# option is specified. Footnotes are the stored in a file with suffix Notes.bib. +# Uncomment the next line to have this generated file ignored. +#*Notes.bib + +# vscode +.vscode/ + +examples/launch_pluto/Manifest.toml + +# Files generated by invoking Julia with --code-coverage +*.jl.cov +*.jl.*.cov + +# Files generated by invoking Julia with --track-allocation +*.jl.mem + +# System-specific files and directories generated by the BinaryProvider and BinDeps packages +# They contain absolute paths specific to the host computer, and so should not be committed +deps/deps.jl +deps/build.log +deps/downloads/ +deps/usr/ +deps/src/ + +# Build artifacts for creating documentation generated by the Documenter package +docs/build/ +docs/site/ + +# File generated by Pkg, the package manager, based on a corresponding Project.toml +# It records a fixed state of all packages used by the project. As such, it should not be +# committed for packages, but should be committed for applications that require a static +# environment. +Manifest.toml + +# images are by default ignored, force add them if you must +*.png +*.jpg +*.svg +# The site build does not execute notebooks anymore, so there is no notebook +# output cache to seed. _cache is a local leftover and must stay out of the repo. +_cache/ +_site/ +generation_report.html diff --git a/Manifest.toml b/Manifest.toml deleted file mode 100644 index 6c30602d..00000000 --- a/Manifest.toml +++ /dev/null @@ -1,3883 +0,0 @@ -# This file is machine-generated - editing it directly is not advised - -julia_version = "1.12.7" -manifest_format = "2.0" -project_hash = "553abe5f320b8c8f054b8f0a62d556d43e730500" - -[[deps.ADTypes]] -git-tree-sha1 = "27cecae79e5cc9935255f90c53bb831cc3c870d7" -uuid = "47edcb42-4c32-4615-8424-f2b9edc5f35b" -version = "1.18.0" -weakdeps = ["ChainRulesCore", "ConstructionBase", "EnzymeCore"] - - [deps.ADTypes.extensions] - ADTypesChainRulesCoreExt = "ChainRulesCore" - ADTypesConstructionBaseExt = "ConstructionBase" - ADTypesEnzymeCoreExt = "EnzymeCore" - -[[deps.AbstractFFTs]] -deps = ["LinearAlgebra"] -git-tree-sha1 = "d92ad398961a3ed262d8bf04a1a2b8340f915fef" -uuid = "621f4979-c628-5d54-868e-fcf4e3e8185c" -version = "1.5.0" -weakdeps = ["ChainRulesCore", "Test"] - - [deps.AbstractFFTs.extensions] - AbstractFFTsChainRulesCoreExt = "ChainRulesCore" - AbstractFFTsTestExt = "Test" - -[[deps.AbstractMCMC]] -deps = ["BangBang", "ConsoleProgressMonitor", "Distributed", "FillArrays", "LogDensityProblems", "Logging", "LoggingExtras", "ProgressLogging", "Random", "StatsBase", "TerminalLoggers", "Transducers", "UUIDs"] -git-tree-sha1 = "9c7f7697af1eca5c2680e8935fb6e8585fcb0109" -uuid = "80f14c24-f653-4e6a-9b94-39d6b0f70001" -version = "5.9.0" - -[[deps.AbstractPPL]] -deps = ["AbstractMCMC", "Accessors", "DensityInterface", "JSON", "LinearAlgebra", "Random", "StatsBase"] -git-tree-sha1 = "43944cbd64e035e7228eb3e0f024d611058cbc78" -uuid = "7a57a42e-76ec-4ea3-a279-07e840d6d9cf" -version = "0.13.5" -weakdeps = ["Distributions"] - - [deps.AbstractPPL.extensions] - AbstractPPLDistributionsExt = ["Distributions"] - -[[deps.AbstractPlutoDingetjes]] -deps = ["Pkg"] -git-tree-sha1 = "6e1d2a35f2f90a4bc7c2ed98079b2ba09c35b83a" -uuid = "6e696c72-6542-2067-7265-42206c756150" -version = "1.3.2" - -[[deps.AbstractTrees]] -git-tree-sha1 = "2d9c9a55f9c93e8887ad391fbae72f8ef55e1177" -uuid = "1520ce14-60c1-5f80-bbc7-55ef81b5835c" -version = "0.4.5" - -[[deps.Accessors]] -deps = ["CompositionsBase", "ConstructionBase", "Dates", "InverseFunctions", "MacroTools"] -git-tree-sha1 = "3b86719127f50670efe356bc11073d84b4ed7a5d" -uuid = "7d9f7c33-5ae7-4f3b-8dc6-eff91059b697" -version = "0.1.42" - - [deps.Accessors.extensions] - AxisKeysExt = "AxisKeys" - IntervalSetsExt = "IntervalSets" - LinearAlgebraExt = "LinearAlgebra" - StaticArraysExt = "StaticArrays" - StructArraysExt = "StructArrays" - TestExt = "Test" - UnitfulExt = "Unitful" - - [deps.Accessors.weakdeps] - AxisKeys = "94b1ba4f-4ee9-5380-92f1-94cde586c3c5" - IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953" - LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" - StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" - StructArrays = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" - Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" - Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" - -[[deps.Adapt]] -deps = ["LinearAlgebra", "Requires"] -git-tree-sha1 = "7e35fca2bdfba44d797c53dfe63a51fabf39bfc0" -uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" -version = "4.4.0" -weakdeps = ["SparseArrays", "StaticArrays"] - - [deps.Adapt.extensions] - AdaptSparseArraysExt = "SparseArrays" - AdaptStaticArraysExt = "StaticArrays" - -[[deps.AdvancedHMC]] -deps = ["AbstractMCMC", "ArgCheck", "DocStringExtensions", "LinearAlgebra", "LogDensityProblems", "LogDensityProblemsAD", "ProgressMeter", "Random", "Setfield", "Statistics", "StatsBase", "StatsFuns"] -git-tree-sha1 = "e5625ace51e1f11f479b24017193bc7fdfef73a2" -uuid = "0bf59076-c3b1-5ca4-86bd-e02cd72cde3d" -version = "0.8.2" - - [deps.AdvancedHMC.extensions] - AdvancedHMCADTypesExt = "ADTypes" - AdvancedHMCCUDAExt = "CUDA" - AdvancedHMCComponentArraysExt = "ComponentArrays" - AdvancedHMCMCMCChainsExt = "MCMCChains" - AdvancedHMCOrdinaryDiffEqExt = "OrdinaryDiffEq" - - [deps.AdvancedHMC.weakdeps] - ADTypes = "47edcb42-4c32-4615-8424-f2b9edc5f35b" - CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" - ComponentArrays = "b0b7db55-cfe3-40fc-9ded-d10e2dbeff66" - MCMCChains = "c7f686f2-ff18-58e9-bc7b-31028e88f75d" - OrdinaryDiffEq = "1dea7af3-3e70-54e6-95c3-0bf5283fa5ed" - -[[deps.AdvancedMH]] -deps = ["AbstractMCMC", "Distributions", "DocStringExtensions", "FillArrays", "LinearAlgebra", "LogDensityProblems", "Random", "Requires"] -git-tree-sha1 = "0205823d612410230d18c421ed6d9d851a5451b9" -uuid = "5b7e9947-ddc0-4b3f-9b55-0d8042f74170" -version = "0.8.8" -weakdeps = ["DiffResults", "ForwardDiff", "MCMCChains", "StructArrays"] - - [deps.AdvancedMH.extensions] - AdvancedMHForwardDiffExt = ["DiffResults", "ForwardDiff"] - AdvancedMHMCMCChainsExt = "MCMCChains" - AdvancedMHStructArraysExt = "StructArrays" - -[[deps.AdvancedPS]] -deps = ["AbstractMCMC", "Distributions", "Random", "Random123", "Requires", "SSMProblems", "StatsFuns"] -git-tree-sha1 = "5d34d826ece67ce790d4a7f3f97d837e52aba7f8" -uuid = "576499cb-2369-40b2-a588-c64705576edc" -version = "0.7.0" -weakdeps = ["Libtask"] - - [deps.AdvancedPS.extensions] - AdvancedPSLibtaskExt = "Libtask" - -[[deps.AdvancedVI]] -deps = ["ADTypes", "Accessors", "DiffResults", "DifferentiationInterface", "Distributions", "DocStringExtensions", "FillArrays", "Functors", "LinearAlgebra", "LogDensityProblems", "Optimisers", "ProgressMeter", "Random", "StatsBase"] -git-tree-sha1 = "59c9723a71ed815eafec430d4cafa592b5889b96" -uuid = "b5ca4192-6429-45e5-a2d9-87aec30a685c" -version = "0.4.1" -weakdeps = ["Bijectors"] - - [deps.AdvancedVI.extensions] - AdvancedVIBijectorsExt = "Bijectors" - -[[deps.AliasTables]] -deps = ["PtrArrays", "Random"] -git-tree-sha1 = "9876e1e164b144ca45e9e3198d0b689cadfed9ff" -uuid = "66dad0bd-aa9a-41b7-9441-69ab47430ed8" -version = "1.1.3" - -[[deps.AlmostBlockDiagonals]] -deps = ["ConcreteStructs"] -git-tree-sha1 = "743abe5e5fe8cff96dad4123f263c0d8eee281c0" -uuid = "a95523ee-d6da-40b5-98cc-27bc505739d5" -version = "0.1.10" - -[[deps.ArgCheck]] -git-tree-sha1 = "f9e9a66c9b7be1ad7372bbd9b062d9230c30c5ce" -uuid = "dce04be8-c92d-5529-be00-80e4d2c0e197" -version = "2.5.0" - -[[deps.ArgTools]] -uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" -version = "1.1.2" - -[[deps.ArnoldiMethod]] -deps = ["LinearAlgebra", "Random", "StaticArrays"] -git-tree-sha1 = "d57bd3762d308bded22c3b82d033bff85f6195c6" -uuid = "ec485272-7323-5ecc-a04f-4719b315124d" -version = "0.4.0" - -[[deps.Arpack]] -deps = ["Arpack_jll", "Libdl", "LinearAlgebra", "Logging"] -git-tree-sha1 = "9b9b347613394885fd1c8c7729bfc60528faa436" -uuid = "7d9fca2a-8960-54d3-9f78-7d1dccf2cb97" -version = "0.5.4" - -[[deps.Arpack_jll]] -deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "OpenBLAS_jll", "Pkg"] -git-tree-sha1 = "5ba6c757e8feccf03a1554dfaf3e26b3cfc7fd5e" -uuid = "68821587-b530-5797-8361-c406ea357684" -version = "3.5.1+1" - -[[deps.ArrayInterface]] -deps = ["Adapt", "LinearAlgebra"] -git-tree-sha1 = "d81ae5489e13bc03567d4fbbb06c546a5e53c857" -uuid = "4fba245c-0d91-5ea0-9b3e-6abc04ee57a9" -version = "7.22.0" - - [deps.ArrayInterface.extensions] - ArrayInterfaceBandedMatricesExt = "BandedMatrices" - ArrayInterfaceBlockBandedMatricesExt = "BlockBandedMatrices" - ArrayInterfaceCUDAExt = "CUDA" - ArrayInterfaceCUDSSExt = ["CUDSS", "CUDA"] - ArrayInterfaceChainRulesCoreExt = "ChainRulesCore" - ArrayInterfaceChainRulesExt = "ChainRules" - ArrayInterfaceGPUArraysCoreExt = "GPUArraysCore" - ArrayInterfaceMetalExt = "Metal" - ArrayInterfaceReverseDiffExt = "ReverseDiff" - ArrayInterfaceSparseArraysExt = "SparseArrays" - ArrayInterfaceStaticArraysCoreExt = "StaticArraysCore" - ArrayInterfaceTrackerExt = "Tracker" - - [deps.ArrayInterface.weakdeps] - BandedMatrices = "aae01518-5342-5314-be14-df237901396f" - BlockBandedMatrices = "ffab5731-97b5-5995-9138-79e8c1846df0" - CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" - CUDSS = "45b445bb-4962-46a0-9369-b4df9d0f772e" - ChainRules = "082447d4-558c-5d27-93f4-14fc19e9eca2" - ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" - GPUArraysCore = "46192b85-c4d5-4398-a991-12ede77f4527" - Metal = "dde4c033-4e86-420c-a63e-0dd931031962" - ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" - SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" - StaticArraysCore = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" - Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" - -[[deps.ArrayLayouts]] -deps = ["FillArrays", "LinearAlgebra", "StaticArrays"] -git-tree-sha1 = "355ab2d61069927d4247cd69ad0e1f140b31e30d" -uuid = "4c555306-a7a7-4459-81d9-ec55ddd5c99a" -version = "1.12.0" -weakdeps = ["SparseArrays"] - - [deps.ArrayLayouts.extensions] - ArrayLayoutsSparseArraysExt = "SparseArrays" - -[[deps.Artifacts]] -uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" -version = "1.11.0" - -[[deps.AxisAlgorithms]] -deps = ["LinearAlgebra", "Random", "SparseArrays", "WoodburyMatrices"] -git-tree-sha1 = "01b8ccb13d68535d73d2b0c23e39bd23155fb712" -uuid = "13072b0f-2c55-5437-9ae7-d433b7a33950" -version = "1.1.0" - -[[deps.AxisArrays]] -deps = ["Dates", "IntervalSets", "IterTools", "RangeArrays"] -git-tree-sha1 = "4126b08903b777c88edf1754288144a0492c05ad" -uuid = "39de3d68-74b9-583c-8d2d-e117c070f3a9" -version = "0.4.8" - -[[deps.BandedMatrices]] -deps = ["ArrayLayouts", "FillArrays", "LinearAlgebra", "PrecompileTools"] -git-tree-sha1 = "4826c9fe6023a87029e54870ad1a9800c7ea6623" -uuid = "aae01518-5342-5314-be14-df237901396f" -version = "1.10.1" - - [deps.BandedMatrices.extensions] - BandedMatricesSparseArraysExt = "SparseArrays" - CliqueTreesExt = "CliqueTrees" - - [deps.BandedMatrices.weakdeps] - CliqueTrees = "60701a23-6482-424a-84db-faee86b9b1f8" - SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" - -[[deps.BangBang]] -deps = ["Accessors", "ConstructionBase", "InitialValues", "LinearAlgebra"] -git-tree-sha1 = "a49f9342fc60c2a2aaa4e0934f06755464fcf438" -uuid = "198e06fe-97b7-11e9-32a5-e1d131e6ad66" -version = "0.4.6" - - [deps.BangBang.extensions] - BangBangChainRulesCoreExt = "ChainRulesCore" - BangBangDataFramesExt = "DataFrames" - BangBangStaticArraysExt = "StaticArrays" - BangBangStructArraysExt = "StructArrays" - BangBangTablesExt = "Tables" - BangBangTypedTablesExt = "TypedTables" - - [deps.BangBang.weakdeps] - ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" - DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" - StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" - StructArrays = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" - Tables = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" - TypedTables = "9d95f2ec-7b3d-5a63-8d20-e2491e220bb9" - -[[deps.Base64]] -uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" -version = "1.11.0" - -[[deps.Baselet]] -git-tree-sha1 = "aebf55e6d7795e02ca500a689d326ac979aaf89e" -uuid = "9718e550-a3fa-408a-8086-8db961cd8217" -version = "0.1.1" - -[[deps.Bessels]] -git-tree-sha1 = "4435559dc39793d53a9e3d278e185e920b4619ef" -uuid = "0e736298-9ec6-45e8-9647-e4fc86a2fe38" -version = "0.2.8" - -[[deps.BigCombinatorics]] -git-tree-sha1 = "a7d7d6194b3582455be7dd9495561626b3803cc5" -uuid = "7b33fef7-ef1d-5d54-bb67-cf96d4c8a166" -version = "0.3.6" - -[[deps.Bijections]] -git-tree-sha1 = "a2d308fcd4c2fb90e943cf9cd2fbfa9c32b69733" -uuid = "e2ed5e7c-b2de-5872-ae92-c73ca462fb04" -version = "0.2.2" - -[[deps.Bijectors]] -deps = ["ArgCheck", "ChainRulesCore", "ChangesOfVariables", "Distributions", "DocStringExtensions", "Functors", "InverseFunctions", "IrrationalConstants", "LinearAlgebra", "LogExpFunctions", "MappedArrays", "Random", "Reexport", "Roots", "SparseArrays", "Statistics"] -git-tree-sha1 = "642af9e4f33cfe6930088418da4c2b0d2b9de169" -uuid = "76274a88-744f-5084-9051-94815aaf08c4" -version = "0.15.12" - - [deps.Bijectors.extensions] - BijectorsDistributionsADExt = "DistributionsAD" - BijectorsEnzymeCoreExt = "EnzymeCore" - BijectorsForwardDiffExt = "ForwardDiff" - BijectorsLazyArraysExt = "LazyArrays" - BijectorsMooncakeExt = "Mooncake" - BijectorsReverseDiffChainRulesExt = ["ChainRules", "ReverseDiff"] - BijectorsReverseDiffExt = "ReverseDiff" - - [deps.Bijectors.weakdeps] - ChainRules = "082447d4-558c-5d27-93f4-14fc19e9eca2" - DistributionsAD = "ced4e74d-a319-5a8a-b0ac-84af2272839c" - EnzymeCore = "f151be2c-9106-41f4-ab19-57ee4f262869" - ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" - LazyArrays = "5078a376-72f3-5289-bfd5-ec5146d43c02" - Mooncake = "da2b9cff-9c12-43a0-ae48-6db2b0edb7d6" - ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" - -[[deps.BitFlags]] -git-tree-sha1 = "0691e34b3bb8be9307330f88d1a3c3f25466c24d" -uuid = "d1d4a3ce-64b1-5f1a-9ba4-7e7e69966f35" -version = "0.1.9" - -[[deps.BitTwiddlingConvenienceFunctions]] -deps = ["Static"] -git-tree-sha1 = "f21cfd4950cb9f0587d5067e69405ad2acd27b87" -uuid = "62783981-4cbd-42fc-bca8-16325de8dc4b" -version = "0.1.6" - -[[deps.BlockArrays]] -deps = ["ArrayLayouts", "FillArrays", "LinearAlgebra"] -git-tree-sha1 = "bdbfd88331c322502bcf2c368a71fea773333f1d" -uuid = "8e7c35d0-a365-5155-bbbb-fb81a777f24e" -version = "1.9.1" -weakdeps = ["Adapt", "BandedMatrices"] - - [deps.BlockArrays.extensions] - BlockArraysAdaptExt = "Adapt" - BlockArraysBandedMatricesExt = "BandedMatrices" - -[[deps.BoundaryValueDiffEq]] -deps = ["ADTypes", "BoundaryValueDiffEqAscher", "BoundaryValueDiffEqCore", "BoundaryValueDiffEqFIRK", "BoundaryValueDiffEqMIRK", "BoundaryValueDiffEqMIRKN", "BoundaryValueDiffEqShooting", "DiffEqBase", "FastClosures", "ForwardDiff", "LinearAlgebra", "Reexport", "SciMLBase"] -git-tree-sha1 = "d6ec33e4516b2e790a64128afdb54f3b536667a7" -uuid = "764a87c0-6b3e-53db-9096-fe964310641d" -version = "5.18.0" - - [deps.BoundaryValueDiffEq.extensions] - BoundaryValueDiffEqODEInterfaceExt = "ODEInterface" - - [deps.BoundaryValueDiffEq.weakdeps] - ODEInterface = "54ca160b-1b9f-5127-a996-1867f4bc2a2c" - -[[deps.BoundaryValueDiffEqAscher]] -deps = ["ADTypes", "AlmostBlockDiagonals", "BoundaryValueDiffEqCore", "ConcreteStructs", "DiffEqBase", "DifferentiationInterface", "FastClosures", "ForwardDiff", "LinearAlgebra", "PreallocationTools", "RecursiveArrayTools", "Reexport", "SciMLBase", "Setfield"] -git-tree-sha1 = "47c833c459738a3f27c5b458ecf7832a4731ef4d" -uuid = "7227322d-7511-4e07-9247-ad6ff830280e" -version = "1.8.0" - -[[deps.BoundaryValueDiffEqCore]] -deps = ["ADTypes", "Adapt", "ArrayInterface", "ConcreteStructs", "DiffEqBase", "ForwardDiff", "LineSearch", "LinearAlgebra", "Logging", "NonlinearSolveFirstOrder", "PreallocationTools", "RecursiveArrayTools", "Reexport", "SciMLBase", "Setfield", "SparseArrays", "SparseConnectivityTracer", "SparseMatrixColorings"] -git-tree-sha1 = "b7b4d8cc80f116eab2eb6124dba58ea7aef31b85" -uuid = "56b672f2-a5fe-4263-ab2d-da677488eb3a" -version = "1.11.1" - -[[deps.BoundaryValueDiffEqFIRK]] -deps = ["ADTypes", "ArrayInterface", "BandedMatrices", "BoundaryValueDiffEqCore", "ConcreteStructs", "DiffEqBase", "DifferentiationInterface", "FastAlmostBandedMatrices", "FastClosures", "ForwardDiff", "LinearAlgebra", "PreallocationTools", "PrecompileTools", "Preferences", "RecursiveArrayTools", "Reexport", "SciMLBase", "Setfield", "SparseArrays"] -git-tree-sha1 = "325e6981a414cfa5181218936c23f0e16dee8f08" -uuid = "85d9eb09-370e-4000-bb32-543851f73618" -version = "1.9.0" - -[[deps.BoundaryValueDiffEqMIRK]] -deps = ["ADTypes", "ArrayInterface", "BandedMatrices", "BoundaryValueDiffEqCore", "ConcreteStructs", "DiffEqBase", "DifferentiationInterface", "FastAlmostBandedMatrices", "FastClosures", "ForwardDiff", "LinearAlgebra", "PreallocationTools", "PrecompileTools", "Preferences", "RecursiveArrayTools", "Reexport", "SciMLBase", "Setfield", "SparseArrays"] -git-tree-sha1 = "da6ae5e564ad06ced4d7504929c58130558007dd" -uuid = "1a22d4ce-7765-49ea-b6f2-13c8438986a6" -version = "1.9.0" - -[[deps.BoundaryValueDiffEqMIRKN]] -deps = ["ADTypes", "ArrayInterface", "BandedMatrices", "BoundaryValueDiffEqCore", "ConcreteStructs", "DiffEqBase", "DifferentiationInterface", "FastAlmostBandedMatrices", "FastClosures", "ForwardDiff", "LinearAlgebra", "PreallocationTools", "PrecompileTools", "Preferences", "RecursiveArrayTools", "Reexport", "SciMLBase", "Setfield", "SparseArrays"] -git-tree-sha1 = "609c2d03ea024df0d475fee483b93cf0e87c29d6" -uuid = "9255f1d6-53bf-473e-b6bd-23f1ff009da4" -version = "1.8.0" - -[[deps.BoundaryValueDiffEqShooting]] -deps = ["ADTypes", "ArrayInterface", "BandedMatrices", "BoundaryValueDiffEqCore", "ConcreteStructs", "DiffEqBase", "DifferentiationInterface", "FastAlmostBandedMatrices", "FastClosures", "ForwardDiff", "LinearAlgebra", "PreallocationTools", "PrecompileTools", "Preferences", "RecursiveArrayTools", "Reexport", "SciMLBase", "Setfield", "SparseArrays"] -git-tree-sha1 = "ba9bd1f31b58bfd5e48a56da0a426bcbd3462546" -uuid = "ed55bfe0-3725-4db6-871e-a1dc9f42a757" -version = "1.9.0" - -[[deps.BracketingNonlinearSolve]] -deps = ["CommonSolve", "ConcreteStructs", "NonlinearSolveBase", "PrecompileTools", "Reexport", "SciMLBase"] -git-tree-sha1 = "a9014924595b7a2c1dd14aac516e38fa10ada656" -uuid = "70df07ce-3d50-431d-a3e7-ca6ddb60ac1e" -version = "1.3.0" -weakdeps = ["ChainRulesCore", "ForwardDiff"] - - [deps.BracketingNonlinearSolve.extensions] - BracketingNonlinearSolveChainRulesCoreExt = ["ChainRulesCore", "ForwardDiff"] - BracketingNonlinearSolveForwardDiffExt = "ForwardDiff" - -[[deps.Bzip2_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "1b96ea4a01afe0ea4090c5c8039690672dd13f2e" -uuid = "6e34b625-4abd-537c-b88f-471c36dfa7a0" -version = "1.0.9+0" - -[[deps.CEnum]] -git-tree-sha1 = "389ad5c84de1ae7cf0e28e381131c98ea87d54fc" -uuid = "fa961155-64e5-5f13-b03f-caf6b980ea82" -version = "0.5.0" - -[[deps.CPUSummary]] -deps = ["CpuId", "IfElse", "PrecompileTools", "Preferences", "Static"] -git-tree-sha1 = "f3a21d7fc84ba618a779d1ed2fcca2e682865bab" -uuid = "2a0fbf3d-bb9c-48f3-b0a9-814d99fd7ab9" -version = "0.2.7" - -[[deps.Cairo_jll]] -deps = ["Artifacts", "Bzip2_jll", "CompilerSupportLibraries_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "JLLWrappers", "LZO_jll", "Libdl", "Pixman_jll", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Zlib_jll", "libpng_jll"] -git-tree-sha1 = "fde3bf89aead2e723284a8ff9cdf5b551ed700e8" -uuid = "83423d85-b0ee-5818-9007-b63ccbeb887a" -version = "1.18.5+0" - -[[deps.Calculus]] -deps = ["LinearAlgebra"] -git-tree-sha1 = "9cb23bbb1127eefb022b022481466c0f1127d430" -uuid = "49dc2e85-a5d0-5ad3-a950-438e2897f1b9" -version = "0.5.2" - -[[deps.Catalyst]] -deps = ["Combinatorics", "DataStructures", "DiffEqBase", "DocStringExtensions", "DynamicPolynomials", "DynamicQuantities", "EnumX", "Graphs", "JumpProcesses", "LaTeXStrings", "Latexify", "LinearAlgebra", "MacroTools", "ModelingToolkit", "Parameters", "Reexport", "Requires", "RuntimeGeneratedFunctions", "SciMLBase", "Setfield", "SparseArrays", "SymbolicUtils", "Symbolics", "Unitful"] -git-tree-sha1 = "83a85091233ac1d45ae7cbec0c01eb1968b5e5f7" -uuid = "479239e8-5488-4da2-87a7-35f2df7eef83" -version = "15.0.8" - - [deps.Catalyst.extensions] - CatalystBifurcationKitExtension = "BifurcationKit" - CatalystCairoMakieExtension = "CairoMakie" - CatalystGraphMakieExtension = ["GraphMakie", "NetworkLayout", "Makie"] - CatalystHomotopyContinuationExtension = "HomotopyContinuation" - CatalystStructuralIdentifiabilityExtension = "StructuralIdentifiability" - - [deps.Catalyst.weakdeps] - BifurcationKit = "0f109fa4-8a5d-4b75-95aa-f515264e7665" - CairoMakie = "13f3f980-e62b-5c42-98c6-ff1f3baf88f0" - GraphMakie = "1ecd5474-83a3-4783-bb4f-06765db800d2" - HomotopyContinuation = "f213a82b-91d6-5c5d-acf7-10f1c761b327" - Makie = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a" - NetworkLayout = "46757867-2c16-5918-afeb-47bfcb05e46a" - StructuralIdentifiability = "220ca800-aa68-49bb-acd8-6037fa93a544" - -[[deps.ChainRules]] -deps = ["Adapt", "ChainRulesCore", "Compat", "Distributed", "GPUArraysCore", "IrrationalConstants", "LinearAlgebra", "Random", "RealDot", "SparseArrays", "SparseInverseSubset", "Statistics", "StructArrays", "SuiteSparse"] -git-tree-sha1 = "3b704353e517a957323bd3ac70fa7b669b5f48d4" -uuid = "082447d4-558c-5d27-93f4-14fc19e9eca2" -version = "1.72.6" - -[[deps.ChainRulesCore]] -deps = ["Compat", "LinearAlgebra"] -git-tree-sha1 = "e4c6a16e77171a5f5e25e9646617ab1c276c5607" -uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" -version = "1.26.0" -weakdeps = ["SparseArrays"] - - [deps.ChainRulesCore.extensions] - ChainRulesCoreSparseArraysExt = "SparseArrays" - -[[deps.Chairmarks]] -deps = ["Printf", "Random"] -git-tree-sha1 = "9a49491e67e7a4d6f885c43d00bb101e6e5a434b" -uuid = "0ca39b1e-fe0b-4e98-acfc-b1656634c4de" -version = "1.3.1" -weakdeps = ["Statistics"] - - [deps.Chairmarks.extensions] - StatisticsChairmarksExt = ["Statistics"] - -[[deps.ChangesOfVariables]] -deps = ["LinearAlgebra"] -git-tree-sha1 = "3aa4bf1532aa2e14e0374c4fd72bed9a9d0d0f6c" -uuid = "9e997f8a-9a97-42d5-a9f1-ce6bfc15e2c0" -version = "0.1.10" -weakdeps = ["InverseFunctions", "Test"] - - [deps.ChangesOfVariables.extensions] - ChangesOfVariablesInverseFunctionsExt = "InverseFunctions" - ChangesOfVariablesTestExt = "Test" - -[[deps.CloseOpenIntervals]] -deps = ["Static", "StaticArrayInterface"] -git-tree-sha1 = "05ba0d07cd4fd8b7a39541e31a7b0254704ea581" -uuid = "fb6a15b2-703c-40df-9091-08a04967cfa9" -version = "0.1.13" - -[[deps.Clustering]] -deps = ["Distances", "LinearAlgebra", "NearestNeighbors", "Printf", "Random", "SparseArrays", "Statistics", "StatsBase"] -git-tree-sha1 = "3e22db924e2945282e70c33b75d4dde8bfa44c94" -uuid = "aaaa29a8-35af-508c-8bc3-b662a17a0fe5" -version = "0.15.8" - -[[deps.CodecZlib]] -deps = ["TranscodingStreams", "Zlib_jll"] -git-tree-sha1 = "962834c22b66e32aa10f7611c08c8ca4e20749a9" -uuid = "944b1d66-785c-5afd-91f1-9de20f533193" -version = "0.7.8" - -[[deps.ColorSchemes]] -deps = ["ColorTypes", "ColorVectorSpace", "Colors", "FixedPointNumbers", "PrecompileTools", "Random"] -git-tree-sha1 = "b0fd3f56fa442f81e0a47815c92245acfaaa4e34" -uuid = "35d6a980-a343-548e-a6ea-1d62b119f2f4" -version = "3.31.0" - -[[deps.ColorTypes]] -deps = ["FixedPointNumbers", "Random"] -git-tree-sha1 = "67e11ee83a43eb71ddc950302c53bf33f0690dfe" -uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f" -version = "0.12.1" -weakdeps = ["StyledStrings"] - - [deps.ColorTypes.extensions] - StyledStringsExt = "StyledStrings" - -[[deps.ColorVectorSpace]] -deps = ["ColorTypes", "FixedPointNumbers", "LinearAlgebra", "Requires", "Statistics", "TensorCore"] -git-tree-sha1 = "8b3b6f87ce8f65a2b4f857528fd8d70086cd72b1" -uuid = "c3611d14-8923-5661-9e6a-0046d554d3a4" -version = "0.11.0" -weakdeps = ["SpecialFunctions"] - - [deps.ColorVectorSpace.extensions] - SpecialFunctionsExt = "SpecialFunctions" - -[[deps.Colors]] -deps = ["ColorTypes", "FixedPointNumbers", "Reexport"] -git-tree-sha1 = "37ea44092930b1811e666c3bc38065d7d87fcc74" -uuid = "5ae59095-9a9b-59fe-a467-6f913c188581" -version = "0.13.1" - -[[deps.Combinatorics]] -git-tree-sha1 = "08c8b6831dc00bfea825826be0bc8336fc369860" -uuid = "861a8166-3701-5b0c-9a16-15d98fcdc6aa" -version = "1.0.2" - -[[deps.CommonMark]] -deps = ["PrecompileTools"] -git-tree-sha1 = "351d6f4eaf273b753001b2de4dffb8279b100769" -uuid = "a80b9123-70ca-4bc0-993e-6e3bcb318db6" -version = "0.9.1" - -[[deps.CommonSolve]] -git-tree-sha1 = "0eee5eb66b1cf62cd6ad1b460238e60e4b09400c" -uuid = "38540f10-b2f7-11e9-35d8-d573e4eb0ff2" -version = "0.2.4" - -[[deps.CommonSubexpressions]] -deps = ["MacroTools"] -git-tree-sha1 = "cda2cfaebb4be89c9084adaca7dd7333369715c5" -uuid = "bbf7d656-a473-5ed7-a52c-81e309532950" -version = "0.3.1" - -[[deps.CommonWorldInvalidations]] -git-tree-sha1 = "ae52d1c52048455e85a387fbee9be553ec2b68d0" -uuid = "f70d9fcc-98c5-4d4a-abd7-e4cdeebd8ca8" -version = "1.0.0" - -[[deps.Compat]] -deps = ["TOML", "UUIDs"] -git-tree-sha1 = "9d8a54ce4b17aa5bdce0ea5c34bc5e7c340d16ad" -uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" -version = "4.18.1" -weakdeps = ["Dates", "LinearAlgebra"] - - [deps.Compat.extensions] - CompatLinearAlgebraExt = "LinearAlgebra" - -[[deps.CompilerSupportLibraries_jll]] -deps = ["Artifacts", "Libdl"] -uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" -version = "1.3.1+2" - -[[deps.ComplexityMeasures]] -deps = ["Combinatorics", "DelayEmbeddings", "Distances", "FFTW", "LinearAlgebra", "Neighborhood", "QuadGK", "Random", "Reexport", "SparseArrays", "SpecialFunctions", "StateSpaceSets", "StaticArrays", "Statistics", "StatsBase", "StatsFuns", "Wavelets"] -git-tree-sha1 = "df895f2a7fc136d2719eb6934f66d964b2a594af" -uuid = "ab4b797d-85ee-42ba-b621-05d793b346a2" -version = "3.8.5" - -[[deps.CompositeTypes]] -git-tree-sha1 = "bce26c3dab336582805503bed209faab1c279768" -uuid = "b152e2b5-7a66-4b01-a709-34e65c35f657" -version = "0.1.4" - -[[deps.CompositionsBase]] -git-tree-sha1 = "802bb88cd69dfd1509f6670416bd4434015693ad" -uuid = "a33af91c-f02d-484b-be07-31d278c5ca2b" -version = "0.1.2" -weakdeps = ["InverseFunctions"] - - [deps.CompositionsBase.extensions] - CompositionsBaseInverseFunctionsExt = "InverseFunctions" - -[[deps.ConcreteStructs]] -git-tree-sha1 = "f749037478283d372048690eb3b5f92a79432b34" -uuid = "2569d6c7-a4a2-43d3-a901-331e8e4be471" -version = "0.2.3" - -[[deps.ConcurrentUtilities]] -deps = ["Serialization", "Sockets"] -git-tree-sha1 = "d9d26935a0bcffc87d2613ce14c527c99fc543fd" -uuid = "f0e56b4a-5159-44fe-b623-3e5288b988bb" -version = "2.5.0" - -[[deps.Configurations]] -deps = ["ExproniconLite", "OrderedCollections", "TOML"] -git-tree-sha1 = "4358750bb58a3caefd5f37a4a0c5bfdbbf075252" -uuid = "5218b696-f38b-4ac9-8b61-a12ec717816d" -version = "0.17.6" - -[[deps.ConsoleProgressMonitor]] -deps = ["Logging", "ProgressMeter"] -git-tree-sha1 = "3ab7b2136722890b9af903859afcf457fa3059e8" -uuid = "88cd18e8-d9cc-4ea6-8889-5259c0d15c8b" -version = "0.1.2" - -[[deps.ConstructionBase]] -git-tree-sha1 = "b4b092499347b18a015186eae3042f72267106cb" -uuid = "187b0558-2788-49d3-abe0-74a17ed4e7c9" -version = "1.6.0" -weakdeps = ["IntervalSets", "LinearAlgebra", "StaticArrays"] - - [deps.ConstructionBase.extensions] - ConstructionBaseIntervalSetsExt = "IntervalSets" - ConstructionBaseLinearAlgebraExt = "LinearAlgebra" - ConstructionBaseStaticArraysExt = "StaticArrays" - -[[deps.Contour]] -git-tree-sha1 = "439e35b0b36e2e5881738abc8857bd92ad6ff9a8" -uuid = "d38c429a-6771-53c6-b99e-75d170b6e991" -version = "0.6.3" - -[[deps.Copulas]] -deps = ["BigCombinatorics", "Combinatorics", "Distributions", "ForwardDiff", "HCubature", "LambertW", "LinearAlgebra", "LogExpFunctions", "MvNormalCDF", "Optim", "PolyLog", "Printf", "QuadGK", "Random", "Roots", "SpecialFunctions", "Statistics", "StatsBase", "StatsFuns", "TaylorSeries"] -git-tree-sha1 = "ba47eec0ae3968b311bb1fa61736005e7c9829c8" -uuid = "ae264745-0b69-425e-9d9d-cf662c5eec93" -version = "0.1.33" -weakdeps = ["Plots", "RecipesBase"] - - [deps.Copulas.extensions] - CopulasPlotsExt = ["Plots", "RecipesBase"] - -[[deps.CpuId]] -deps = ["Markdown"] -git-tree-sha1 = "fcbb72b032692610bfbdb15018ac16a36cf2e406" -uuid = "adafc99b-e345-5852-983c-f28acb93d879" -version = "0.3.1" - -[[deps.Crayons]] -git-tree-sha1 = "249fe38abf76d48563e2f4556bebd215aa317e15" -uuid = "a8cc5b0e-0ffa-5ad4-8c14-923d3ee1735f" -version = "4.1.1" - -[[deps.DSP]] -deps = ["Bessels", "FFTW", "IterTools", "LinearAlgebra", "Polynomials", "Random", "Reexport", "SpecialFunctions", "Statistics"] -git-tree-sha1 = "5989debfc3b38f736e69724818210c67ffee4352" -uuid = "717857b8-e6f2-59f4-9121-6e50c889abd2" -version = "0.8.4" -weakdeps = ["OffsetArrays"] - - [deps.DSP.extensions] - OffsetArraysExt = "OffsetArrays" - -[[deps.DataAPI]] -git-tree-sha1 = "abe83f3a2f1b857aac70ef8b269080af17764bbe" -uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a" -version = "1.16.0" - -[[deps.DataStructures]] -deps = ["Compat", "InteractiveUtils", "OrderedCollections"] -git-tree-sha1 = "4e1fe97fdaed23e9dc21d4d664bea76b65fc50a0" -uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" -version = "0.18.22" - -[[deps.DataValueInterfaces]] -git-tree-sha1 = "bfc1187b79289637fa0ef6d4436ebdfe6905cbd6" -uuid = "e2d170a0-9d28-54be-80f0-106bbe20a464" -version = "1.0.0" - -[[deps.Dates]] -deps = ["Printf"] -uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" -version = "1.11.0" - -[[deps.Dbus_jll]] -deps = ["Artifacts", "Expat_jll", "JLLWrappers", "Libdl"] -git-tree-sha1 = "473e9afc9cf30814eb67ffa5f2db7df82c3ad9fd" -uuid = "ee1fde0b-3d02-5ea6-8484-8dfef6360eab" -version = "1.16.2+0" - -[[deps.DefineSingletons]] -git-tree-sha1 = "0fba8b706d0178b4dc7fd44a96a92382c9065c2c" -uuid = "244e2a9f-e319-4986-a169-4d1fe445cd52" -version = "0.1.2" - -[[deps.DelayDiffEq]] -deps = ["ArrayInterface", "DataStructures", "DiffEqBase", "FastBroadcast", "ForwardDiff", "LinearAlgebra", "Logging", "OrdinaryDiffEq", "OrdinaryDiffEqCore", "OrdinaryDiffEqDefault", "OrdinaryDiffEqDifferentiation", "OrdinaryDiffEqFunctionMap", "OrdinaryDiffEqNonlinearSolve", "OrdinaryDiffEqRosenbrock", "Printf", "RecursiveArrayTools", "Reexport", "SciMLBase", "SimpleNonlinearSolve", "SimpleUnPack", "SymbolicIndexingInterface"] -git-tree-sha1 = "38a6a29851deae145184e2010eb683d56988fb93" -uuid = "bcd4f6db-9728-5f36-b5f7-82caef46ccdb" -version = "5.59.0" - -[[deps.DelayEmbeddings]] -deps = ["Distances", "Distributions", "LinearAlgebra", "Neighborhood", "Random", "Reexport", "StateSpaceSets", "Statistics", "StatsBase"] -git-tree-sha1 = "a37b1ad1e45b107e5176c8856114a15ee7fe9c6e" -uuid = "5732040d-69e3-5649-938a-b6b4f237613f" -version = "2.9.0" - -[[deps.DelimitedFiles]] -deps = ["Mmap"] -git-tree-sha1 = "9e2f36d3c96a820c678f2f1f1782582fcf685bae" -uuid = "8bb1440f-4735-579b-a4ab-409b98df4dab" -version = "1.9.1" - -[[deps.DensityInterface]] -deps = ["InverseFunctions", "Test"] -git-tree-sha1 = "80c3e8639e3353e5d2912fb3a1916b8455e2494b" -uuid = "b429d917-457f-4dbc-8f4c-0cc954292b1d" -version = "0.4.0" - -[[deps.DiffEqBase]] -deps = ["ArrayInterface", "ConcreteStructs", "DataStructures", "DocStringExtensions", "EnumX", "EnzymeCore", "FastBroadcast", "FastClosures", "FastPower", "FunctionWrappers", "FunctionWrappersWrappers", "LinearAlgebra", "Logging", "Markdown", "MuladdMacro", "Parameters", "PrecompileTools", "Printf", "RecursiveArrayTools", "Reexport", "SciMLBase", "SciMLOperators", "SciMLStructures", "Setfield", "Static", "StaticArraysCore", "Statistics", "SymbolicIndexingInterface", "TruncatedStacktraces"] -git-tree-sha1 = "1b1e070e57681d1176d99a5ec455717e24686612" -uuid = "2b5f629d-d688-5b77-993f-72d75c75574e" -version = "6.183.2" - - [deps.DiffEqBase.extensions] - DiffEqBaseCUDAExt = "CUDA" - DiffEqBaseChainRulesCoreExt = "ChainRulesCore" - DiffEqBaseDistributionsExt = "Distributions" - DiffEqBaseEnzymeExt = ["ChainRulesCore", "Enzyme"] - DiffEqBaseForwardDiffExt = ["ForwardDiff"] - DiffEqBaseGTPSAExt = "GTPSA" - DiffEqBaseGeneralizedGeneratedExt = "GeneralizedGenerated" - DiffEqBaseMPIExt = "MPI" - DiffEqBaseMeasurementsExt = "Measurements" - DiffEqBaseMonteCarloMeasurementsExt = "MonteCarloMeasurements" - DiffEqBaseMooncakeExt = "Mooncake" - DiffEqBaseReverseDiffExt = "ReverseDiff" - DiffEqBaseSparseArraysExt = "SparseArrays" - DiffEqBaseTrackerExt = "Tracker" - DiffEqBaseUnitfulExt = "Unitful" - - [deps.DiffEqBase.weakdeps] - CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" - ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" - Distributions = "31c24e10-a181-5473-b8eb-7969acd0382f" - Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9" - ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" - GTPSA = "b27dd330-f138-47c5-815b-40db9dd9b6e8" - GeneralizedGenerated = "6b9d7cbe-bcb9-11e9-073f-15a7a543e2eb" - MPI = "da04e1cc-30fd-572f-bb4f-1f8673147195" - Measurements = "eff96d63-e80a-5855-80a2-b1b0885c5ab7" - MonteCarloMeasurements = "0987c9cc-fe09-11e8-30f0-b96dd679fdca" - Mooncake = "da2b9cff-9c12-43a0-ae48-6db2b0edb7d6" - ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" - SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" - Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" - Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" - -[[deps.DiffEqCallbacks]] -deps = ["ConcreteStructs", "DataStructures", "DiffEqBase", "DifferentiationInterface", "LinearAlgebra", "Markdown", "RecipesBase", "RecursiveArrayTools", "SciMLBase", "StaticArraysCore"] -git-tree-sha1 = "448d118c4a7763b041fc41cf91c85d23773f1dc2" -uuid = "459566f4-90b8-5000-8ac3-15dfb0a30def" -version = "4.10.1" -weakdeps = ["Functors"] - - [deps.DiffEqCallbacks.extensions] - DiffEqCallbacksFunctorsExt = "Functors" - -[[deps.DiffEqNoiseProcess]] -deps = ["DiffEqBase", "Distributions", "GPUArraysCore", "LinearAlgebra", "Markdown", "Optim", "PoissonRandom", "QuadGK", "Random", "Random123", "RandomNumbers", "RecipesBase", "RecursiveArrayTools", "ResettableStacks", "SciMLBase", "StaticArraysCore", "Statistics"] -git-tree-sha1 = "516d553f5deee7c55b2945b5edf05b6542837887" -uuid = "77a26b50-5914-5dd7-bc55-306e6241c503" -version = "5.24.1" - - [deps.DiffEqNoiseProcess.extensions] - DiffEqNoiseProcessReverseDiffExt = "ReverseDiff" - - [deps.DiffEqNoiseProcess.weakdeps] - ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" - -[[deps.DiffResults]] -deps = ["StaticArraysCore"] -git-tree-sha1 = "782dd5f4561f5d267313f23853baaaa4c52ea621" -uuid = "163ba53b-c6d8-5494-b064-1a9d43ac40c5" -version = "1.1.0" - -[[deps.DiffRules]] -deps = ["IrrationalConstants", "LogExpFunctions", "NaNMath", "Random", "SpecialFunctions"] -git-tree-sha1 = "23163d55f885173722d1e4cf0f6110cdbaf7e272" -uuid = "b552c78f-8df3-52c6-915a-8e097449b14b" -version = "1.15.1" - -[[deps.DifferentialEquations]] -deps = ["BoundaryValueDiffEq", "DelayDiffEq", "DiffEqBase", "DiffEqCallbacks", "DiffEqNoiseProcess", "JumpProcesses", "LinearAlgebra", "LinearSolve", "NonlinearSolve", "OrdinaryDiffEq", "Random", "RecursiveArrayTools", "Reexport", "SciMLBase", "SteadyStateDiffEq", "StochasticDiffEq", "Sundials"] -git-tree-sha1 = "1df783c534cd0c4a865a397b1c4801771b5cbb07" -uuid = "0c46a032-eb83-5123-abaf-570d42b7fbaa" -version = "7.17.0" - -[[deps.DifferentiationInterface]] -deps = ["ADTypes", "LinearAlgebra"] -git-tree-sha1 = "c8d85ecfcbaef899308706bebdd8b00107f3fb43" -uuid = "a0c0ee7d-e4b9-4e03-894e-1c5f64a51d63" -version = "0.6.54" - - [deps.DifferentiationInterface.extensions] - DifferentiationInterfaceChainRulesCoreExt = "ChainRulesCore" - DifferentiationInterfaceDiffractorExt = "Diffractor" - DifferentiationInterfaceEnzymeExt = ["EnzymeCore", "Enzyme"] - DifferentiationInterfaceFastDifferentiationExt = "FastDifferentiation" - DifferentiationInterfaceFiniteDiffExt = "FiniteDiff" - DifferentiationInterfaceFiniteDifferencesExt = "FiniteDifferences" - DifferentiationInterfaceForwardDiffExt = ["ForwardDiff", "DiffResults"] - DifferentiationInterfaceGPUArraysCoreExt = "GPUArraysCore" - DifferentiationInterfaceGTPSAExt = "GTPSA" - DifferentiationInterfaceMooncakeExt = "Mooncake" - DifferentiationInterfacePolyesterForwardDiffExt = ["PolyesterForwardDiff", "ForwardDiff", "DiffResults"] - DifferentiationInterfaceReverseDiffExt = ["ReverseDiff", "DiffResults"] - DifferentiationInterfaceSparseArraysExt = "SparseArrays" - DifferentiationInterfaceSparseConnectivityTracerExt = "SparseConnectivityTracer" - DifferentiationInterfaceSparseMatrixColoringsExt = "SparseMatrixColorings" - DifferentiationInterfaceStaticArraysExt = "StaticArrays" - DifferentiationInterfaceSymbolicsExt = "Symbolics" - DifferentiationInterfaceTrackerExt = "Tracker" - DifferentiationInterfaceZygoteExt = ["Zygote", "ForwardDiff"] - - [deps.DifferentiationInterface.weakdeps] - ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" - DiffResults = "163ba53b-c6d8-5494-b064-1a9d43ac40c5" - Diffractor = "9f5e2b26-1114-432f-b630-d3fe2085c51c" - Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9" - EnzymeCore = "f151be2c-9106-41f4-ab19-57ee4f262869" - FastDifferentiation = "eb9bf01b-bf85-4b60-bf87-ee5de06c00be" - FiniteDiff = "6a86dc24-6348-571c-b903-95158fe2bd41" - FiniteDifferences = "26cc04aa-876d-5657-8c51-4c34ba976000" - ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" - GPUArraysCore = "46192b85-c4d5-4398-a991-12ede77f4527" - GTPSA = "b27dd330-f138-47c5-815b-40db9dd9b6e8" - Mooncake = "da2b9cff-9c12-43a0-ae48-6db2b0edb7d6" - PolyesterForwardDiff = "98d1487c-24ca-40b6-b7ab-df2af84e126b" - ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" - SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" - SparseConnectivityTracer = "9f842d2f-2579-4b1d-911e-f412cf18a3f5" - SparseMatrixColorings = "0a514795-09f3-496d-8182-132a7b665d35" - StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" - Symbolics = "0c5d862f-8b57-4792-8d23-62f2024744c7" - Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" - Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f" - -[[deps.DispatchDoctor]] -deps = ["MacroTools", "Preferences"] -git-tree-sha1 = "fc34127e78323c49984e1a146d577d0f890dd2b4" -uuid = "8d63f2c5-f18a-4cf2-ba9d-b3f60fc568c8" -version = "0.4.26" -weakdeps = ["ChainRulesCore", "EnzymeCore"] - - [deps.DispatchDoctor.extensions] - DispatchDoctorChainRulesCoreExt = "ChainRulesCore" - DispatchDoctorEnzymeCoreExt = "EnzymeCore" - -[[deps.Distances]] -deps = ["LinearAlgebra", "Statistics", "StatsAPI"] -git-tree-sha1 = "c7e3a542b999843086e2f29dac96a618c105be1d" -uuid = "b4f34e82-e78d-54a5-968a-f98e89d6e8f7" -version = "0.10.12" -weakdeps = ["ChainRulesCore", "SparseArrays"] - - [deps.Distances.extensions] - DistancesChainRulesCoreExt = "ChainRulesCore" - DistancesSparseArraysExt = "SparseArrays" - -[[deps.Distributed]] -deps = ["Random", "Serialization", "Sockets"] -uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" -version = "1.11.0" - -[[deps.Distributions]] -deps = ["AliasTables", "FillArrays", "LinearAlgebra", "PDMats", "Printf", "QuadGK", "Random", "SpecialFunctions", "Statistics", "StatsAPI", "StatsBase", "StatsFuns"] -git-tree-sha1 = "3bc002af51045ca3b47d2e1787d6ce02e68b943a" -uuid = "31c24e10-a181-5473-b8eb-7969acd0382f" -version = "0.25.122" -weakdeps = ["ChainRulesCore", "DensityInterface", "Test"] - - [deps.Distributions.extensions] - DistributionsChainRulesCoreExt = "ChainRulesCore" - DistributionsDensityInterfaceExt = "DensityInterface" - DistributionsTestExt = "Test" - -[[deps.DistributionsAD]] -deps = ["Adapt", "ChainRules", "ChainRulesCore", "Compat", "Distributions", "FillArrays", "LinearAlgebra", "PDMats", "Random", "Requires", "SpecialFunctions", "StaticArrays", "StatsFuns", "ZygoteRules"] -git-tree-sha1 = "4acbf909e892ce1f94c39a138541566c1aad5e66" -uuid = "ced4e74d-a319-5a8a-b0ac-84af2272839c" -version = "0.6.58" - - [deps.DistributionsAD.extensions] - DistributionsADForwardDiffExt = "ForwardDiff" - DistributionsADLazyArraysExt = "LazyArrays" - DistributionsADReverseDiffExt = "ReverseDiff" - DistributionsADTrackerExt = "Tracker" - - [deps.DistributionsAD.weakdeps] - ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" - LazyArrays = "5078a376-72f3-5289-bfd5-ec5146d43c02" - ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" - Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" - -[[deps.DocStringExtensions]] -git-tree-sha1 = "7442a5dfe1ebb773c29cc2962a8980f47221d76c" -uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" -version = "0.9.5" - -[[deps.DomainSets]] -deps = ["CompositeTypes", "IntervalSets", "LinearAlgebra", "StaticArrays"] -git-tree-sha1 = "c249d86e97a7e8398ce2068dce4c078a1c3464de" -uuid = "5b8099bc-c8ec-5219-889f-1d9e522a28bf" -version = "0.7.16" - - [deps.DomainSets.extensions] - DomainSetsMakieExt = "Makie" - DomainSetsRandomExt = "Random" - - [deps.DomainSets.weakdeps] - Makie = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a" - Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" - -[[deps.Downloads]] -deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] -uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" -version = "1.7.0" - -[[deps.DynamicPPL]] -deps = ["ADTypes", "AbstractMCMC", "AbstractPPL", "Accessors", "BangBang", "Bijectors", "Chairmarks", "Compat", "ConstructionBase", "DifferentiationInterface", "Distributions", "DocStringExtensions", "InteractiveUtils", "LinearAlgebra", "LogDensityProblems", "MacroTools", "OrderedCollections", "Printf", "Random", "Statistics", "Test"] -git-tree-sha1 = "4824c5704504de58219ba6f31353721f6456edf4" -uuid = "366bfd00-2699-11ea-058f-f148b4cae6d8" -version = "0.38.4" - - [deps.DynamicPPL.extensions] - DynamicPPLChainRulesCoreExt = ["ChainRulesCore"] - DynamicPPLEnzymeCoreExt = ["EnzymeCore"] - DynamicPPLForwardDiffExt = ["ForwardDiff"] - DynamicPPLJETExt = ["JET"] - DynamicPPLMCMCChainsExt = ["MCMCChains"] - DynamicPPLMarginalLogDensitiesExt = ["MarginalLogDensities"] - DynamicPPLMooncakeExt = ["Mooncake"] - - [deps.DynamicPPL.weakdeps] - ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" - EnzymeCore = "f151be2c-9106-41f4-ab19-57ee4f262869" - ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" - JET = "c3a54625-cd67-489e-a8e7-0a5a0ff4e31b" - KernelAbstractions = "63c18a36-062a-441e-b654-da1e3ab1ce7c" - MCMCChains = "c7f686f2-ff18-58e9-bc7b-31028e88f75d" - MarginalLogDensities = "f0c3360a-fb8d-11e9-1194-5521fd7ee392" - Mooncake = "da2b9cff-9c12-43a0-ae48-6db2b0edb7d6" - -[[deps.DynamicPolynomials]] -deps = ["Future", "LinearAlgebra", "MultivariatePolynomials", "MutableArithmetics", "Reexport", "Test"] -git-tree-sha1 = "ca693f8707a77a0e365d49fe4622203b72b6cf1d" -uuid = "7c1d4256-1411-5781-91ec-d7bc3513ac07" -version = "0.6.3" - -[[deps.DynamicQuantities]] -deps = ["DispatchDoctor", "PrecompileTools", "TestItems", "Tricks"] -git-tree-sha1 = "57c48a46e27d67208ad51c564b078a90bbd0dc2c" -uuid = "06fc5a27-2a28-4c7c-a15d-362465fb6821" -version = "1.10.0" - - [deps.DynamicQuantities.extensions] - DynamicQuantitiesLinearAlgebraExt = "LinearAlgebra" - DynamicQuantitiesMeasurementsExt = "Measurements" - DynamicQuantitiesScientificTypesExt = "ScientificTypes" - DynamicQuantitiesUnitfulExt = "Unitful" - - [deps.DynamicQuantities.weakdeps] - LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" - Measurements = "eff96d63-e80a-5855-80a2-b1b0885c5ab7" - ScientificTypes = "321657f4-b219-11e9-178b-2701a2544e81" - Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" - -[[deps.EllipticalSliceSampling]] -deps = ["AbstractMCMC", "ArrayInterface", "Distributions", "Random", "Statistics"] -git-tree-sha1 = "e611b7fdfbfb5b18d5e98776c30daede41b44542" -uuid = "cad2338a-1db2-11e9-3401-43bc07c9ede2" -version = "2.0.0" - -[[deps.EnumX]] -git-tree-sha1 = "bddad79635af6aec424f53ed8aad5d7555dc6f00" -uuid = "4e289a0a-7415-4d19-859d-a7e5c4648b56" -version = "1.0.5" - -[[deps.EnzymeCore]] -git-tree-sha1 = "f91e7cb4c17dae77c490b75328f22a226708557c" -uuid = "f151be2c-9106-41f4-ab19-57ee4f262869" -version = "0.8.15" -weakdeps = ["Adapt"] - - [deps.EnzymeCore.extensions] - AdaptExt = "Adapt" - -[[deps.EpollShim_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "8a4be429317c42cfae6a7fc03c31bad1970c310d" -uuid = "2702e6a9-849d-5ed8-8c21-79e8b8f9ee43" -version = "0.0.20230411+1" - -[[deps.ExceptionUnwrapping]] -deps = ["Test"] -git-tree-sha1 = "d36f682e590a83d63d1c7dbd287573764682d12a" -uuid = "460bff9d-24e4-43bc-9d9f-a8973cb893f4" -version = "0.1.11" - -[[deps.Expat_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "27af30de8b5445644e8ffe3bcb0d72049c089cf1" -uuid = "2e619515-83b5-522b-bb60-26c02a35a201" -version = "2.7.3+0" - -[[deps.ExponentialUtilities]] -deps = ["Adapt", "ArrayInterface", "GPUArraysCore", "GenericSchur", "LinearAlgebra", "PrecompileTools", "Printf", "SparseArrays", "libblastrampoline_jll"] -git-tree-sha1 = "cae251c76f353e32d32d76fae2fea655eab652af" -uuid = "d4d017d3-3776-5f7e-afef-a10c40355c18" -version = "1.27.0" -weakdeps = ["StaticArrays"] - - [deps.ExponentialUtilities.extensions] - ExponentialUtilitiesStaticArraysExt = "StaticArrays" - -[[deps.ExprTools]] -git-tree-sha1 = "27415f162e6028e81c72b82ef756bf321213b6ec" -uuid = "e2ba6199-217a-4e67-a87a-7c52f15ade04" -version = "0.1.10" - -[[deps.ExpressionExplorer]] -git-tree-sha1 = "4a8c0a9eebf807ac42f0f6de758e60a20be25ffb" -uuid = "21656369-7473-754a-2065-74616d696c43" -version = "1.1.3" - -[[deps.ExproniconLite]] -git-tree-sha1 = "c13f0b150373771b0fdc1713c97860f8df12e6c2" -uuid = "55351af7-c7e9-48d6-89ff-24e801d99491" -version = "0.10.14" - -[[deps.FFMPEG]] -deps = ["FFMPEG_jll"] -git-tree-sha1 = "95ecf07c2eea562b5adbd0696af6db62c0f52560" -uuid = "c87230d0-a227-11e9-1b43-d7ebe4e7570a" -version = "0.4.5" - -[[deps.FFMPEG_jll]] -deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "JLLWrappers", "LAME_jll", "Libdl", "Ogg_jll", "OpenSSL_jll", "Opus_jll", "PCRE2_jll", "Zlib_jll", "libaom_jll", "libass_jll", "libfdk_aac_jll", "libvorbis_jll", "x264_jll", "x265_jll"] -git-tree-sha1 = "ccc81ba5e42497f4e76553a5545665eed577a663" -uuid = "b22a6f82-2f65-5046-a5b2-351ab43fb4e5" -version = "8.0.0+0" - -[[deps.FFTW]] -deps = ["AbstractFFTs", "FFTW_jll", "Libdl", "LinearAlgebra", "MKL_jll", "Preferences", "Reexport"] -git-tree-sha1 = "97f08406df914023af55ade2f843c39e99c5d969" -uuid = "7a1cc6ca-52ef-59f5-83cd-3a7055c09341" -version = "1.10.0" - -[[deps.FFTW_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "6d6219a004b8cf1e0b4dbe27a2860b8e04eba0be" -uuid = "f5851436-0d7a-5f13-b9de-f02708fd171a" -version = "3.3.11+0" - -[[deps.FastAlmostBandedMatrices]] -deps = ["ArrayInterface", "ArrayLayouts", "BandedMatrices", "ConcreteStructs", "LazyArrays", "LinearAlgebra", "MatrixFactorizations", "PrecompileTools", "Reexport"] -git-tree-sha1 = "9482a2b4face8ade73792c23a54796c79ed1bcbf" -uuid = "9d29842c-ecb8-4973-b1e9-a27b1157504e" -version = "0.1.5" - -[[deps.FastBroadcast]] -deps = ["ArrayInterface", "LinearAlgebra", "Polyester", "Static", "StaticArrayInterface", "StrideArraysCore"] -git-tree-sha1 = "ab1b34570bcdf272899062e1a56285a53ecaae08" -uuid = "7034ab61-46d4-4ed7-9d0f-46aef9175898" -version = "0.3.5" - -[[deps.FastClosures]] -git-tree-sha1 = "acebe244d53ee1b461970f8910c235b259e772ef" -uuid = "9aa1b823-49e4-5ca5-8b0f-3971ec8bab6a" -version = "0.3.2" - -[[deps.FastGaussQuadrature]] -deps = ["LinearAlgebra", "SpecialFunctions", "StaticArrays"] -git-tree-sha1 = "0044e9f5e49a57e88205e8f30ab73928b05fe5b6" -uuid = "442a2c76-b920-505d-bb47-c5924d526838" -version = "1.1.0" - -[[deps.FastPower]] -git-tree-sha1 = "e47c70bf430175e077d1955d7f04923504acc74c" -uuid = "a4df4552-cc26-4903-aec0-212e50a0e84b" -version = "1.2.0" - - [deps.FastPower.extensions] - FastPowerEnzymeExt = "Enzyme" - FastPowerForwardDiffExt = "ForwardDiff" - FastPowerMeasurementsExt = "Measurements" - FastPowerMonteCarloMeasurementsExt = "MonteCarloMeasurements" - FastPowerMooncakeExt = "Mooncake" - FastPowerReverseDiffExt = "ReverseDiff" - FastPowerTrackerExt = "Tracker" - - [deps.FastPower.weakdeps] - Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9" - ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" - Measurements = "eff96d63-e80a-5855-80a2-b1b0885c5ab7" - MonteCarloMeasurements = "0987c9cc-fe09-11e8-30f0-b96dd679fdca" - Mooncake = "da2b9cff-9c12-43a0-ae48-6db2b0edb7d6" - ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" - Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" - -[[deps.FileWatching]] -uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" -version = "1.11.0" - -[[deps.FillArrays]] -deps = ["LinearAlgebra"] -git-tree-sha1 = "173e4d8f14230a7523ae11b9a3fa9edb3e0efd78" -uuid = "1a297f60-69ca-5386-bcde-b61e274b549b" -version = "1.14.0" -weakdeps = ["PDMats", "SparseArrays", "Statistics"] - - [deps.FillArrays.extensions] - FillArraysPDMatsExt = "PDMats" - FillArraysSparseArraysExt = "SparseArrays" - FillArraysStatisticsExt = "Statistics" - -[[deps.FindFirstFunctions]] -git-tree-sha1 = "544bdc2902fa966900d354510be775f8668a57bd" -uuid = "64ca27bc-2ba2-4a57-88aa-44e436879224" -version = "1.4.2" - -[[deps.FiniteDiff]] -deps = ["ArrayInterface", "LinearAlgebra", "Setfield"] -git-tree-sha1 = "9340ca07ca27093ff68418b7558ca37b05f8aeb1" -uuid = "6a86dc24-6348-571c-b903-95158fe2bd41" -version = "2.29.0" - - [deps.FiniteDiff.extensions] - FiniteDiffBandedMatricesExt = "BandedMatrices" - FiniteDiffBlockBandedMatricesExt = "BlockBandedMatrices" - FiniteDiffSparseArraysExt = "SparseArrays" - FiniteDiffStaticArraysExt = "StaticArrays" - - [deps.FiniteDiff.weakdeps] - BandedMatrices = "aae01518-5342-5314-be14-df237901396f" - BlockBandedMatrices = "ffab5731-97b5-5995-9138-79e8c1846df0" - SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" - StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" - -[[deps.FixedPointNumbers]] -deps = ["Statistics"] -git-tree-sha1 = "05882d6995ae5c12bb5f36dd2ed3f61c98cbb172" -uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" -version = "0.8.5" - -[[deps.Fontconfig_jll]] -deps = ["Artifacts", "Bzip2_jll", "Expat_jll", "FreeType2_jll", "JLLWrappers", "Libdl", "Libuuid_jll", "Zlib_jll"] -git-tree-sha1 = "f85dac9a96a01087df6e3a749840015a0ca3817d" -uuid = "a3f928ae-7b40-5064-980b-68af3947d34b" -version = "2.17.1+0" - -[[deps.Format]] -git-tree-sha1 = "9c68794ef81b08086aeb32eeaf33531668d5f5fc" -uuid = "1fa38f19-a742-5d3f-a2b9-30dd87b9d5f8" -version = "1.3.7" - -[[deps.ForwardDiff]] -deps = ["CommonSubexpressions", "DiffResults", "DiffRules", "LinearAlgebra", "LogExpFunctions", "NaNMath", "Preferences", "Printf", "Random", "SpecialFunctions"] -git-tree-sha1 = "afb7c51ac63e40708a3071f80f5e84a752299d4f" -uuid = "f6369f11-7733-5829-9624-2563aa707210" -version = "0.10.39" -weakdeps = ["StaticArrays"] - - [deps.ForwardDiff.extensions] - ForwardDiffStaticArraysExt = "StaticArrays" - -[[deps.FreeType2_jll]] -deps = ["Artifacts", "Bzip2_jll", "JLLWrappers", "Libdl", "Zlib_jll"] -git-tree-sha1 = "2c5512e11c791d1baed2049c5652441b28fc6a31" -uuid = "d7e528f0-a631-5988-bf34-fe36492bcfd7" -version = "2.13.4+0" - -[[deps.FriBidi_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "7a214fdac5ed5f59a22c2d9a885a16da1c74bbc7" -uuid = "559328eb-81f9-559d-9380-de523a88c83c" -version = "1.0.17+0" - -[[deps.FunctionWrappers]] -git-tree-sha1 = "d62485945ce5ae9c0c48f124a84998d755bae00e" -uuid = "069b7b12-0de2-55c6-9aab-29f3d0a68a2e" -version = "1.1.3" - -[[deps.FunctionWrappersWrappers]] -deps = ["FunctionWrappers"] -git-tree-sha1 = "b104d487b34566608f8b4e1c39fb0b10aa279ff8" -uuid = "77dc65aa-8811-40c2-897b-53d922fa7daf" -version = "0.1.3" - -[[deps.Functors]] -deps = ["Compat", "ConstructionBase", "LinearAlgebra", "Random"] -git-tree-sha1 = "60a0339f28a233601cb74468032b5c302d5067de" -uuid = "d9f16b24-f501-4c13-a1f2-28368ffc5196" -version = "0.5.2" - -[[deps.Future]] -deps = ["Random"] -uuid = "9fa8497b-333b-5362-9e8d-4d0656e87820" -version = "1.11.0" - -[[deps.GLFW_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Libglvnd_jll", "Xorg_libXcursor_jll", "Xorg_libXi_jll", "Xorg_libXinerama_jll", "Xorg_libXrandr_jll", "libdecor_jll", "xkbcommon_jll"] -git-tree-sha1 = "fcb0584ff34e25155876418979d4c8971243bb89" -uuid = "0656b61e-2033-5cc2-a64a-77c0f6c09b89" -version = "3.4.0+2" - -[[deps.GPUArraysCore]] -deps = ["Adapt"] -git-tree-sha1 = "83cf05ab16a73219e5f6bd1bdfa9848fa24ac627" -uuid = "46192b85-c4d5-4398-a991-12ede77f4527" -version = "0.2.0" - -[[deps.GR]] -deps = ["Artifacts", "Base64", "DelimitedFiles", "Downloads", "GR_jll", "HTTP", "JSON", "Libdl", "LinearAlgebra", "Preferences", "Printf", "Qt6Wayland_jll", "Random", "Serialization", "Sockets", "TOML", "Tar", "Test", "p7zip_jll"] -git-tree-sha1 = "f52c27dd921390146624f3aab95f4e8614ad6531" -uuid = "28b8d3ca-fb5f-59d9-8090-bfdbd6d07a71" -version = "0.73.18" - -[[deps.GR_jll]] -deps = ["Artifacts", "Bzip2_jll", "Cairo_jll", "FFMPEG_jll", "Fontconfig_jll", "FreeType2_jll", "GLFW_jll", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Libtiff_jll", "Pixman_jll", "Qt6Base_jll", "Zlib_jll", "libpng_jll"] -git-tree-sha1 = "4b0406b866ea9fdbaf1148bc9c0b887e59f9af68" -uuid = "d2c73de3-f751-5644-a686-071e5b155ba9" -version = "0.73.18+0" - -[[deps.GenericSchur]] -deps = ["LinearAlgebra", "Printf"] -git-tree-sha1 = "a694e2a57394e409f7a11ee0977362a9fafcb8c7" -uuid = "c145ed77-6b09-5dd9-b285-bf645a82121e" -version = "0.5.6" - -[[deps.GettextRuntime_jll]] -deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Libiconv_jll"] -git-tree-sha1 = "45288942190db7c5f760f59c04495064eedf9340" -uuid = "b0724c58-0f36-5564-988d-3bb0596ebc4a" -version = "0.22.4+0" - -[[deps.Ghostscript_jll]] -deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Zlib_jll"] -git-tree-sha1 = "38044a04637976140074d0b0621c1edf0eb531fd" -uuid = "61579ee1-b43e-5ca0-a5da-69d92c66a64b" -version = "9.55.1+0" - -[[deps.Glib_jll]] -deps = ["Artifacts", "GettextRuntime_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Libiconv_jll", "Libmount_jll", "PCRE2_jll", "Zlib_jll"] -git-tree-sha1 = "50c11ffab2a3d50192a228c313f05b5b5dc5acb2" -uuid = "7746bdde-850d-59dc-9ae8-88ece973131d" -version = "2.86.0+0" - -[[deps.Glob]] -git-tree-sha1 = "97285bbd5230dd766e9ef6749b80fc617126d496" -uuid = "c27321d9-0574-5035-807b-f59d2c89b15c" -version = "1.3.1" - -[[deps.GlobalSensitivity]] -deps = ["Combinatorics", "ComplexityMeasures", "Copulas", "Distributions", "FFTW", "ForwardDiff", "KernelDensity", "LinearAlgebra", "Parameters", "QuasiMonteCarlo", "Random", "RecursiveArrayTools", "Statistics", "StatsBase", "ThreadsX", "Trapz"] -git-tree-sha1 = "e9f673523e5b6f731010ea4ba93d0d7f9db78ed6" -uuid = "af5da776-676b-467e-8baf-acd8249e4f0f" -version = "2.8.0" - -[[deps.GracefulPkg]] -deps = ["Compat", "Pkg", "TOML"] -git-tree-sha1 = "9721d7ae22a51439656a73de721d973dbb9d3bad" -uuid = "828d9ff0-206c-6161-646e-6576656f7244" -version = "2.4.2" - -[[deps.Graphite2_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "8a6dbda1fd736d60cc477d99f2e7a042acfa46e8" -uuid = "3b182d85-2403-5c21-9c21-1e1f0cc25472" -version = "1.3.15+0" - -[[deps.Graphs]] -deps = ["ArnoldiMethod", "DataStructures", "Distributed", "Inflate", "LinearAlgebra", "Random", "SharedArrays", "SimpleTraits", "SparseArrays", "Statistics"] -git-tree-sha1 = "7a98c6502f4632dbe9fb1973a4244eaa3324e84d" -uuid = "86223c79-3864-5bf0-83f7-82e725a168b6" -version = "1.13.1" - -[[deps.Grisu]] -git-tree-sha1 = "53bb909d1151e57e2484c3d1b53e19552b887fb2" -uuid = "42e2da0e-8278-4e71-bc24-59509adca0fe" -version = "1.0.2" - -[[deps.HCubature]] -deps = ["Combinatorics", "DataStructures", "LinearAlgebra", "QuadGK", "StaticArrays"] -git-tree-sha1 = "19ef9f0cb324eed957b7fe7257ac84e8ed8a48ec" -uuid = "19dc6840-f33b-545b-b366-655c7e3ffd49" -version = "1.7.0" - -[[deps.HTTP]] -deps = ["Base64", "CodecZlib", "ConcurrentUtilities", "Dates", "ExceptionUnwrapping", "Logging", "LoggingExtras", "MbedTLS", "NetworkOptions", "OpenSSL", "PrecompileTools", "Random", "SimpleBufferStream", "Sockets", "URIs", "UUIDs"] -git-tree-sha1 = "5e6fe50ae7f23d171f44e311c2960294aaa0beb5" -uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3" -version = "1.10.19" - -[[deps.HarfBuzz_jll]] -deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "Graphite2_jll", "JLLWrappers", "Libdl", "Libffi_jll"] -git-tree-sha1 = "f923f9a774fcf3f5cb761bfa43aeadd689714813" -uuid = "2e76f6c2-a576-52d4-95c1-20adfe4de566" -version = "8.5.1+0" - -[[deps.HypergeometricFunctions]] -deps = ["LinearAlgebra", "OpenLibm_jll", "SpecialFunctions"] -git-tree-sha1 = "68c173f4f449de5b438ee67ed0c9c748dc31a2ec" -uuid = "34004b35-14d8-5ef3-9330-4cdb6864b03a" -version = "0.3.28" - -[[deps.Hyperscript]] -deps = ["Test"] -git-tree-sha1 = "179267cfa5e712760cd43dcae385d7ea90cc25a4" -uuid = "47d2ed2b-36de-50cf-bf87-49c2cf4b8b91" -version = "0.0.5" - -[[deps.HypertextLiteral]] -deps = ["Tricks"] -git-tree-sha1 = "7134810b1afce04bbc1045ca1985fbe81ce17653" -uuid = "ac1192a8-f4b3-4bfe-ba22-af5b92cd3ab2" -version = "0.9.5" - -[[deps.IOCapture]] -deps = ["Logging", "Random"] -git-tree-sha1 = "0ee181ec08df7d7c911901ea38baf16f755114dc" -uuid = "b5f81e59-6552-4d32-b1f0-c071b021bf89" -version = "1.0.0" - -[[deps.IRTools]] -deps = ["InteractiveUtils", "MacroTools"] -git-tree-sha1 = "57e9ce6cf68d0abf5cb6b3b4abf9bedf05c939c0" -uuid = "7869d1d1-7146-5819-86e3-90919afe41df" -version = "0.4.15" - -[[deps.IfElse]] -git-tree-sha1 = "debdd00ffef04665ccbb3e150747a77560e8fad1" -uuid = "615f187c-cbe4-4ef1-ba3b-2fcf58d6d173" -version = "0.1.1" - -[[deps.Inflate]] -git-tree-sha1 = "d1b1b796e47d94588b3757fe84fbf65a5ec4a80d" -uuid = "d25df0c9-e2be-5dd7-82c8-3ad0b3e990b9" -version = "0.1.5" - -[[deps.InitialValues]] -git-tree-sha1 = "4da0f88e9a39111c2fa3add390ab15f3a44f3ca3" -uuid = "22cec73e-a1b8-11e9-2c92-598750a2cf9c" -version = "0.3.1" - -[[deps.IntegerMathUtils]] -git-tree-sha1 = "4c1acff2dc6b6967e7e750633c50bc3b8d83e617" -uuid = "18e54dd8-cb9d-406c-a71d-865a43cbb235" -version = "0.1.3" - -[[deps.IntelOpenMP_jll]] -deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl"] -git-tree-sha1 = "ec1debd61c300961f98064cfb21287613ad7f303" -uuid = "1d5cc7b8-4909-519e-a0f8-d0f5ad9712d0" -version = "2025.2.0+0" - -[[deps.InteractiveUtils]] -deps = ["Markdown"] -uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" -version = "1.11.0" - -[[deps.Interpolations]] -deps = ["Adapt", "AxisAlgorithms", "ChainRulesCore", "LinearAlgebra", "OffsetArrays", "Random", "Ratios", "SharedArrays", "SparseArrays", "StaticArrays", "WoodburyMatrices"] -git-tree-sha1 = "65d505fa4c0d7072990d659ef3fc086eb6da8208" -uuid = "a98d9a8b-a2ab-59e6-89dd-64a1c18fca59" -version = "0.16.2" -weakdeps = ["ForwardDiff", "Unitful"] - - [deps.Interpolations.extensions] - InterpolationsForwardDiffExt = "ForwardDiff" - InterpolationsUnitfulExt = "Unitful" - -[[deps.IntervalSets]] -git-tree-sha1 = "5fbb102dcb8b1a858111ae81d56682376130517d" -uuid = "8197267c-284f-5f27-9208-e0e47529a953" -version = "0.7.11" -weakdeps = ["Random", "RecipesBase", "Statistics"] - - [deps.IntervalSets.extensions] - IntervalSetsRandomExt = "Random" - IntervalSetsRecipesBaseExt = "RecipesBase" - IntervalSetsStatisticsExt = "Statistics" - -[[deps.InverseFunctions]] -git-tree-sha1 = "a779299d77cd080bf77b97535acecd73e1c5e5cb" -uuid = "3587e190-3f89-42d0-90ee-14403ec27112" -version = "0.1.17" -weakdeps = ["Dates", "Test"] - - [deps.InverseFunctions.extensions] - InverseFunctionsDatesExt = "Dates" - InverseFunctionsTestExt = "Test" - -[[deps.InvertedIndices]] -git-tree-sha1 = "6da3c4316095de0f5ee2ebd875df8721e7e0bdbe" -uuid = "41ab1584-1d38-5bbf-9106-f11c6c58b48f" -version = "1.3.1" - -[[deps.IrrationalConstants]] -git-tree-sha1 = "b2d91fe939cae05960e760110b328288867b5758" -uuid = "92d709cd-6900-40b7-9082-c6be49f344b6" -version = "0.2.6" - -[[deps.IterTools]] -git-tree-sha1 = "42d5f897009e7ff2cf88db414a389e5ed1bdd023" -uuid = "c8e1da08-722c-5040-9ed9-7db0dc04731e" -version = "1.10.0" - -[[deps.IteratorInterfaceExtensions]] -git-tree-sha1 = "a3f24677c21f5bbe9d2a714f95dcd58337fb2856" -uuid = "82899510-4779-5014-852e-03e436cf321d" -version = "1.0.0" - -[[deps.JLFzf]] -deps = ["REPL", "Random", "fzf_jll"] -git-tree-sha1 = "82f7acdc599b65e0f8ccd270ffa1467c21cb647b" -uuid = "1019f520-868f-41f5-a6de-eb00f4b6a39c" -version = "0.1.11" - -[[deps.JLLWrappers]] -deps = ["Artifacts", "Preferences"] -git-tree-sha1 = "0533e564aae234aff59ab625543145446d8b6ec2" -uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" -version = "1.7.1" - -[[deps.JSON]] -deps = ["Dates", "Mmap", "Parsers", "Unicode"] -git-tree-sha1 = "31e996f0a15c7b280ba9f76636b3ff9e2ae58c9a" -uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" -version = "0.21.4" - -[[deps.Jieko]] -deps = ["ExproniconLite"] -git-tree-sha1 = "2f05ed29618da60c06a87e9c033982d4f71d0b6c" -uuid = "ae98c720-c025-4a4a-838c-29b094483192" -version = "0.2.1" - -[[deps.JpegTurbo_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "4255f0032eafd6451d707a51d5f0248b8a165e4d" -uuid = "aacddb02-875f-59d6-b918-886e6ef4fbf8" -version = "3.1.3+0" - -[[deps.JuliaFormatter]] -deps = ["CommonMark", "Glob", "JuliaSyntax", "PrecompileTools", "TOML"] -git-tree-sha1 = "f512fefd5fdc7dd1ca05778f08f91e9e4c9fdc37" -uuid = "98e50ef6-434e-11e9-1051-2b60c6c9e899" -version = "2.1.6" - -[[deps.JuliaSyntax]] -git-tree-sha1 = "937da4713526b96ac9a178e2035019d3b78ead4a" -uuid = "70703baa-626e-46a2-a12c-08ffd08c73b4" -version = "0.4.10" - -[[deps.JuliaSyntaxHighlighting]] -deps = ["StyledStrings"] -uuid = "ac6e5ff7-fb65-4e79-a425-ec3bc9c03011" -version = "1.12.0" - -[[deps.JumpProcesses]] -deps = ["ArrayInterface", "DataStructures", "DiffEqBase", "DiffEqCallbacks", "DocStringExtensions", "FunctionWrappers", "Graphs", "LinearAlgebra", "PoissonRandom", "Random", "RecursiveArrayTools", "Reexport", "SciMLBase", "Setfield", "StaticArrays", "SymbolicIndexingInterface", "UnPack"] -git-tree-sha1 = "d347adc76ff6dbdec3cb341cb867d9add90bf0d8" -uuid = "ccbc3e58-028d-4f4c-8cd5-9ae44345cda5" -version = "9.18.0" - - [deps.JumpProcesses.extensions] - JumpProcessesKernelAbstractionsExt = ["Adapt", "KernelAbstractions"] - - [deps.JumpProcesses.weakdeps] - Adapt = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" - FastBroadcast = "7034ab61-46d4-4ed7-9d0f-46aef9175898" - KernelAbstractions = "63c18a36-062a-441e-b654-da1e3ab1ce7c" - -[[deps.KernelDensity]] -deps = ["Distributions", "DocStringExtensions", "FFTW", "Interpolations", "StatsBase"] -git-tree-sha1 = "ba51324b894edaf1df3ab16e2cc6bc3280a2f1a7" -uuid = "5ab0869b-81aa-558d-bb23-cbf5423bbe9b" -version = "0.6.10" - -[[deps.Krylov]] -deps = ["LinearAlgebra", "Printf", "SparseArrays"] -git-tree-sha1 = "d1fc961038207e43982851e57ee257adc37be5e8" -uuid = "ba0b0d4f-ebba-5204-a429-3ac8c609bfb7" -version = "0.10.2" - -[[deps.LAME_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "059aabebaa7c82ccb853dd4a0ee9d17796f7e1bc" -uuid = "c1c5ebd0-6772-5130-a774-d5fcae4a789d" -version = "3.100.3+0" - -[[deps.LBFGSB]] -deps = ["L_BFGS_B_jll"] -git-tree-sha1 = "e2e6f53ee20605d0ea2be473480b7480bd5091b5" -uuid = "5be7bae1-8223-5378-bac3-9e7378a2f6e6" -version = "0.4.1" - -[[deps.LERC_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "aaafe88dccbd957a8d82f7d05be9b69172e0cee3" -uuid = "88015f11-f218-50d7-93a8-a6af411a945d" -version = "4.0.1+0" - -[[deps.LLVMOpenMP_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "eb62a3deb62fc6d8822c0c4bef73e4412419c5d8" -uuid = "1d63c593-3942-5779-bab2-d838dc0a180e" -version = "18.1.8+0" - -[[deps.LRUCache]] -git-tree-sha1 = "5519b95a490ff5fe629c4a7aa3b3dfc9160498b3" -uuid = "8ac3fa9e-de4c-5943-b1dc-09c6b5f20637" -version = "1.6.2" -weakdeps = ["Serialization"] - - [deps.LRUCache.extensions] - SerializationExt = ["Serialization"] - -[[deps.LZO_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "1c602b1127f4751facb671441ca72715cc95938a" -uuid = "dd4b983a-f0e5-5f8d-a1b7-129d4a5fb1ac" -version = "2.10.3+0" - -[[deps.L_BFGS_B_jll]] -deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "77feda930ed3f04b2b0fbb5bea89e69d3677c6b0" -uuid = "81d17ec3-03a1-5e46-b53e-bddc35a13473" -version = "3.0.1+0" - -[[deps.LaTeXStrings]] -git-tree-sha1 = "dda21b8cbd6a6c40d9d02a73230f9d70fed6918c" -uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" -version = "1.4.0" - -[[deps.LambertW]] -deps = ["IrrationalConstants"] -git-tree-sha1 = "c6cd4fe119e21ebb1ca8adfaf32c989465c8d920" -uuid = "984bce1d-4616-540c-a9ee-88d1112d94c9" -version = "1.0.0" - -[[deps.Latexify]] -deps = ["Format", "Ghostscript_jll", "InteractiveUtils", "LaTeXStrings", "MacroTools", "Markdown", "OrderedCollections", "Requires"] -git-tree-sha1 = "44f93c47f9cd6c7e431f2f2091fcba8f01cd7e8f" -uuid = "23fbe1c1-3f47-55db-b15f-69d7ec21a316" -version = "0.16.10" - - [deps.Latexify.extensions] - DataFramesExt = "DataFrames" - SparseArraysExt = "SparseArrays" - SymEngineExt = "SymEngine" - TectonicExt = "tectonic_jll" - - [deps.Latexify.weakdeps] - DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" - SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" - SymEngine = "123dc426-2d89-5057-bbad-38513e3affd8" - tectonic_jll = "d7dd28d6-a5e6-559c-9131-7eb760cdacc5" - -[[deps.LatticeRules]] -deps = ["Random"] -git-tree-sha1 = "7f5b02258a3ca0221a6a9710b0a0a2e8fb4957fe" -uuid = "73f95e8e-ec14-4e6a-8b18-0d2e271c4e55" -version = "0.0.1" - -[[deps.LayoutPointers]] -deps = ["ArrayInterface", "LinearAlgebra", "ManualMemory", "SIMDTypes", "Static", "StaticArrayInterface"] -git-tree-sha1 = "a9eaadb366f5493a5654e843864c13d8b107548c" -uuid = "10f19ff3-798f-405d-979b-55457f8fc047" -version = "0.1.17" - -[[deps.LazilyInitializedFields]] -git-tree-sha1 = "0f2da712350b020bc3957f269c9caad516383ee0" -uuid = "0e77f7df-68c5-4e49-93ce-4cd80f5598bf" -version = "1.3.0" - -[[deps.LazyArrays]] -deps = ["ArrayLayouts", "FillArrays", "LinearAlgebra", "MacroTools", "SparseArrays"] -git-tree-sha1 = "79ee64f6ba0a5a49930f51c86f60d7526b5e12c8" -uuid = "5078a376-72f3-5289-bfd5-ec5146d43c02" -version = "2.8.0" - - [deps.LazyArrays.extensions] - LazyArraysBandedMatricesExt = "BandedMatrices" - LazyArraysBlockArraysExt = "BlockArrays" - LazyArraysBlockBandedMatricesExt = "BlockBandedMatrices" - LazyArraysStaticArraysExt = "StaticArrays" - - [deps.LazyArrays.weakdeps] - BandedMatrices = "aae01518-5342-5314-be14-df237901396f" - BlockArrays = "8e7c35d0-a365-5155-bbbb-fb81a777f24e" - BlockBandedMatrices = "ffab5731-97b5-5995-9138-79e8c1846df0" - StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" - -[[deps.LazyArtifacts]] -deps = ["Artifacts", "Pkg"] -uuid = "4af54fe1-eca0-43a8-85a7-787d91b784e3" -version = "1.11.0" - -[[deps.LeftChildRightSiblingTrees]] -deps = ["AbstractTrees"] -git-tree-sha1 = "95ba48564903b43b2462318aa243ee79d81135ff" -uuid = "1d6d02ad-be62-4b6b-8a6d-2f90e265016e" -version = "0.2.1" - -[[deps.LevyArea]] -deps = ["LinearAlgebra", "Random", "SpecialFunctions"] -git-tree-sha1 = "56513a09b8e0ae6485f34401ea9e2f31357958ec" -uuid = "2d8b4e74-eb68-11e8-0fb9-d5eb67b50637" -version = "1.0.0" - -[[deps.LibCURL]] -deps = ["LibCURL_jll", "MozillaCACerts_jll"] -uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" -version = "0.6.4" - -[[deps.LibCURL_jll]] -deps = ["Artifacts", "LibSSH2_jll", "Libdl", "OpenSSL_jll", "Zlib_jll", "nghttp2_jll"] -uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" -version = "8.15.0+0" - -[[deps.LibGit2]] -deps = ["LibGit2_jll", "NetworkOptions", "Printf", "SHA"] -uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" -version = "1.11.0" - -[[deps.LibGit2_jll]] -deps = ["Artifacts", "LibSSH2_jll", "Libdl", "OpenSSL_jll"] -uuid = "e37daf67-58a4-590a-8e99-b0245dd2ffc5" -version = "1.9.0+0" - -[[deps.LibSSH2_jll]] -deps = ["Artifacts", "Libdl", "OpenSSL_jll"] -uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" -version = "1.11.3+1" - -[[deps.Libdl]] -uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" -version = "1.11.0" - -[[deps.Libffi_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "c8da7e6a91781c41a863611c7e966098d783c57a" -uuid = "e9f186c6-92d2-5b65-8a66-fee21dc1b490" -version = "3.4.7+0" - -[[deps.Libglvnd_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll", "Xorg_libXext_jll"] -git-tree-sha1 = "d36c21b9e7c172a44a10484125024495e2625ac0" -uuid = "7e76a0d4-f3c7-5321-8279-8d96eeed0f29" -version = "1.7.1+1" - -[[deps.Libiconv_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "be484f5c92fad0bd8acfef35fe017900b0b73809" -uuid = "94ce4f54-9a6c-5748-9c1c-f9c7231a4531" -version = "1.18.0+0" - -[[deps.Libmount_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "3acf07f130a76f87c041cfb2ff7d7284ca67b072" -uuid = "4b2f31a3-9ecc-558c-b454-b3730dcb73e9" -version = "2.41.2+0" - -[[deps.Libtask]] -deps = ["MistyClosures", "Test"] -git-tree-sha1 = "d87c9a93e94b7e3d4585007ff8dd7ae08fecc66b" -uuid = "6f1fad26-d15e-5dc8-ae53-837a1d7b8c9f" -version = "0.9.6" - -[[deps.Libtiff_jll]] -deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "LERC_jll", "Libdl", "XZ_jll", "Zlib_jll", "Zstd_jll"] -git-tree-sha1 = "f04133fe05eff1667d2054c53d59f9122383fe05" -uuid = "89763e89-9b03-5906-acba-b20f662cd828" -version = "4.7.2+0" - -[[deps.Libuuid_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "2a7a12fc0a4e7fb773450d17975322aa77142106" -uuid = "38a345b3-de98-5d2b-a5d3-14cd9215e700" -version = "2.41.2+0" - -[[deps.LineSearch]] -deps = ["ADTypes", "CommonSolve", "ConcreteStructs", "FastClosures", "LinearAlgebra", "MaybeInplace", "SciMLBase", "SciMLJacobianOperators", "StaticArraysCore"] -git-tree-sha1 = "97d502765cc5cf3a722120f50da03c2474efce04" -uuid = "87fe0de2-c867-4266-b59a-2f0a94fc965b" -version = "0.1.4" -weakdeps = ["LineSearches"] - - [deps.LineSearch.extensions] - LineSearchLineSearchesExt = "LineSearches" - -[[deps.LineSearches]] -deps = ["LinearAlgebra", "NLSolversBase", "NaNMath", "Parameters", "Printf"] -git-tree-sha1 = "4adee99b7262ad2a1a4bbbc59d993d24e55ea96f" -uuid = "d3d80556-e9d4-5f37-9878-2ab0fcc64255" -version = "7.4.0" - -[[deps.LinearAlgebra]] -deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"] -uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" -version = "1.12.0" - -[[deps.LinearSolve]] -deps = ["ArrayInterface", "ChainRulesCore", "ConcreteStructs", "DocStringExtensions", "EnumX", "GPUArraysCore", "InteractiveUtils", "Krylov", "LazyArrays", "Libdl", "LinearAlgebra", "MKL_jll", "Markdown", "OpenBLAS_jll", "PrecompileTools", "Preferences", "RecursiveArrayTools", "Reexport", "SciMLBase", "SciMLLogging", "SciMLOperators", "Setfield", "StaticArraysCore", "UnPack"] -git-tree-sha1 = "b5def83652705bdc00035dff671039e707588a00" -uuid = "7ed4a6bd-45f5-4d41-b270-4a48e9bafcae" -version = "3.46.1" - - [deps.LinearSolve.extensions] - LinearSolveAMDGPUExt = "AMDGPU" - LinearSolveBLISExt = ["blis_jll", "LAPACK_jll"] - LinearSolveBandedMatricesExt = "BandedMatrices" - LinearSolveBlockDiagonalsExt = "BlockDiagonals" - LinearSolveCUDAExt = "CUDA" - LinearSolveCUDSSExt = "CUDSS" - LinearSolveCUSOLVERRFExt = ["CUSOLVERRF", "SparseArrays"] - LinearSolveCliqueTreesExt = ["CliqueTrees", "SparseArrays"] - LinearSolveEnzymeExt = "EnzymeCore" - LinearSolveFastAlmostBandedMatricesExt = "FastAlmostBandedMatrices" - LinearSolveFastLapackInterfaceExt = "FastLapackInterface" - LinearSolveForwardDiffExt = "ForwardDiff" - LinearSolveHYPREExt = "HYPRE" - LinearSolveIterativeSolversExt = "IterativeSolvers" - LinearSolveKernelAbstractionsExt = "KernelAbstractions" - LinearSolveKrylovKitExt = "KrylovKit" - LinearSolveMetalExt = "Metal" - LinearSolveMooncakeExt = "Mooncake" - LinearSolvePardisoExt = ["Pardiso", "SparseArrays"] - LinearSolveRecursiveFactorizationExt = "RecursiveFactorization" - LinearSolveSparseArraysExt = "SparseArrays" - LinearSolveSparspakExt = ["SparseArrays", "Sparspak"] - - [deps.LinearSolve.weakdeps] - AMDGPU = "21141c5a-9bdb-4563-92ae-f87d6854732e" - BandedMatrices = "aae01518-5342-5314-be14-df237901396f" - BlockDiagonals = "0a1fb500-61f7-11e9-3c65-f5ef3456f9f0" - CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" - CUDSS = "45b445bb-4962-46a0-9369-b4df9d0f772e" - CUSOLVERRF = "a8cc9031-bad2-4722-94f5-40deabb4245c" - CliqueTrees = "60701a23-6482-424a-84db-faee86b9b1f8" - EnzymeCore = "f151be2c-9106-41f4-ab19-57ee4f262869" - FastAlmostBandedMatrices = "9d29842c-ecb8-4973-b1e9-a27b1157504e" - FastLapackInterface = "29a986be-02c6-4525-aec4-84b980013641" - ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" - HYPRE = "b5ffcf37-a2bd-41ab-a3da-4bd9bc8ad771" - IterativeSolvers = "42fd0dbc-a981-5370-80f2-aaf504508153" - KernelAbstractions = "63c18a36-062a-441e-b654-da1e3ab1ce7c" - KrylovKit = "0b1a1467-8014-51b9-945f-bf0ae24f4b77" - LAPACK_jll = "51474c39-65e3-53ba-86ba-03b1b862ec14" - Metal = "dde4c033-4e86-420c-a63e-0dd931031962" - Mooncake = "da2b9cff-9c12-43a0-ae48-6db2b0edb7d6" - Pardiso = "46dd5b70-b6fb-5a00-ae2d-e8fea33afaf2" - RecursiveFactorization = "f2c3362d-daeb-58d1-803e-2bc74f2840b4" - SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" - Sparspak = "e56a9233-b9d6-4f03-8d0f-1825330902ac" - blis_jll = "6136c539-28a5-5bf0-87cc-b183200dce32" - -[[deps.LogDensityProblems]] -deps = ["ArgCheck", "DocStringExtensions", "Random"] -git-tree-sha1 = "d9625f27ded4ad726ceca7819394a4cc77ed25b3" -uuid = "6fdf6af0-433a-55f7-b3ed-c6c6e0b8df7c" -version = "2.2.0" - -[[deps.LogDensityProblemsAD]] -deps = ["DocStringExtensions", "LogDensityProblems"] -git-tree-sha1 = "7b83f3ad0a8105f79a067cafbfd124827bb398d0" -uuid = "996a588d-648d-4e1f-a8f0-a84b347e47b1" -version = "1.13.1" - - [deps.LogDensityProblemsAD.extensions] - LogDensityProblemsADADTypesExt = "ADTypes" - LogDensityProblemsADDifferentiationInterfaceExt = ["ADTypes", "DifferentiationInterface"] - LogDensityProblemsADEnzymeExt = "Enzyme" - LogDensityProblemsADFiniteDifferencesExt = "FiniteDifferences" - LogDensityProblemsADForwardDiffBenchmarkToolsExt = ["BenchmarkTools", "ForwardDiff"] - LogDensityProblemsADForwardDiffExt = "ForwardDiff" - LogDensityProblemsADReverseDiffExt = "ReverseDiff" - LogDensityProblemsADTrackerExt = "Tracker" - LogDensityProblemsADZygoteExt = "Zygote" - - [deps.LogDensityProblemsAD.weakdeps] - ADTypes = "47edcb42-4c32-4615-8424-f2b9edc5f35b" - BenchmarkTools = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf" - DifferentiationInterface = "a0c0ee7d-e4b9-4e03-894e-1c5f64a51d63" - Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9" - FiniteDifferences = "26cc04aa-876d-5657-8c51-4c34ba976000" - ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" - ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" - Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" - Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f" - -[[deps.LogExpFunctions]] -deps = ["DocStringExtensions", "IrrationalConstants", "LinearAlgebra"] -git-tree-sha1 = "13ca9e2586b89836fd20cccf56e57e2b9ae7f38f" -uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688" -version = "0.3.29" -weakdeps = ["ChainRulesCore", "ChangesOfVariables", "InverseFunctions"] - - [deps.LogExpFunctions.extensions] - LogExpFunctionsChainRulesCoreExt = "ChainRulesCore" - LogExpFunctionsChangesOfVariablesExt = "ChangesOfVariables" - LogExpFunctionsInverseFunctionsExt = "InverseFunctions" - -[[deps.Logging]] -uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" -version = "1.11.0" - -[[deps.LoggingExtras]] -deps = ["Dates", "Logging"] -git-tree-sha1 = "f00544d95982ea270145636c181ceda21c4e2575" -uuid = "e6f89c97-d47a-5376-807f-9c37f3926c36" -version = "1.2.0" - -[[deps.MCMCChains]] -deps = ["AbstractMCMC", "AxisArrays", "DataAPI", "Dates", "Distributions", "IteratorInterfaceExtensions", "KernelDensity", "LinearAlgebra", "MCMCDiagnosticTools", "MLJModelInterface", "NaturalSort", "OrderedCollections", "PrettyTables", "Random", "RecipesBase", "Statistics", "StatsBase", "StatsFuns", "TableTraits", "Tables"] -git-tree-sha1 = "4f5b84761bbfd1e99c2568815b1108858b760f4c" -uuid = "c7f686f2-ff18-58e9-bc7b-31028e88f75d" -version = "7.6.0" - -[[deps.MCMCDiagnosticTools]] -deps = ["AbstractFFTs", "DataAPI", "DataStructures", "Distributions", "LinearAlgebra", "MLJModelInterface", "Random", "SpecialFunctions", "Statistics", "StatsBase", "StatsFuns", "Tables"] -git-tree-sha1 = "526c98cd41028da22c01cb8a203246799ad853a8" -uuid = "be115224-59cd-429b-ad48-344e309966f0" -version = "0.3.15" - -[[deps.MIMEs]] -git-tree-sha1 = "c64d943587f7187e751162b3b84445bbbd79f691" -uuid = "6c6e2e6c-3030-632d-7369-2d6c69616d65" -version = "1.1.0" - -[[deps.MKL_jll]] -deps = ["Artifacts", "IntelOpenMP_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "oneTBB_jll"] -git-tree-sha1 = "282cadc186e7b2ae0eeadbd7a4dffed4196ae2aa" -uuid = "856f044c-d86e-5d09-b602-aeab76dc8ba7" -version = "2025.2.0+0" - -[[deps.MLJModelInterface]] -deps = ["InteractiveUtils", "REPL", "Random", "ScientificTypesBase", "StatisticalTraits"] -git-tree-sha1 = "ccaa3f7938890ee8042cc970ba275115428bd592" -uuid = "e80e1ace-859a-464e-9ed9-23947d8ae3ea" -version = "1.12.0" - -[[deps.MLStyle]] -git-tree-sha1 = "bc38dff0548128765760c79eb7388a4b37fae2c8" -uuid = "d8e11817-5142-5d16-987a-aa16d5891078" -version = "0.4.17" - -[[deps.MacroTools]] -git-tree-sha1 = "1e0228a030642014fe5cfe68c2c0a818f9e3f522" -uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" -version = "0.5.16" - -[[deps.Malt]] -deps = ["Distributed", "Logging", "RelocatableFolders", "Serialization", "Sockets"] -git-tree-sha1 = "21ab3240653e26c8d54c1389779e260a48174be3" -uuid = "36869731-bdee-424d-aa32-cab38c994e3b" -version = "1.3.0" - -[[deps.ManualMemory]] -git-tree-sha1 = "bcaef4fc7a0cfe2cba636d84cda54b5e4e4ca3cd" -uuid = "d125e4d3-2237-4719-b19c-fa641b8a4667" -version = "0.1.8" - -[[deps.MappedArrays]] -git-tree-sha1 = "2dab0221fe2b0f2cb6754eaa743cc266339f527e" -uuid = "dbb5928d-eab1-5f90-85c2-b9b0edb7c900" -version = "0.4.2" - -[[deps.Markdown]] -deps = ["Base64", "JuliaSyntaxHighlighting", "StyledStrings"] -uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" -version = "1.11.0" - -[[deps.MatrixFactorizations]] -deps = ["ArrayLayouts", "LinearAlgebra", "Printf", "Random"] -git-tree-sha1 = "3bb3cf4685f1c90f22883f4c4bb6d203fa882b79" -uuid = "a3b82374-2e81-5b9e-98ce-41277c0e4c87" -version = "3.1.3" -weakdeps = ["BandedMatrices"] - - [deps.MatrixFactorizations.extensions] - MatrixFactorizationsBandedMatricesExt = "BandedMatrices" - -[[deps.MaybeInplace]] -deps = ["ArrayInterface", "LinearAlgebra", "MacroTools"] -git-tree-sha1 = "54e2fdc38130c05b42be423e90da3bade29b74bd" -uuid = "bb5d69b7-63fc-4a16-80bd-7e42200c7bdb" -version = "0.1.4" -weakdeps = ["SparseArrays"] - - [deps.MaybeInplace.extensions] - MaybeInplaceSparseArraysExt = "SparseArrays" - -[[deps.MbedTLS]] -deps = ["Dates", "MbedTLS_jll", "MozillaCACerts_jll", "NetworkOptions", "Random", "Sockets"] -git-tree-sha1 = "c067a280ddc25f196b5e7df3877c6b226d390aaf" -uuid = "739be429-bea8-5141-9913-cc70e7f3736d" -version = "1.1.9" - -[[deps.MbedTLS_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "3cce3511ca2c6f87b19c34ffc623417ed2798cbd" -uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" -version = "2.28.10+0" - -[[deps.Measurements]] -deps = ["Calculus", "LinearAlgebra", "Printf"] -git-tree-sha1 = "cb47f69a1cab9dcec7ff4a5d6e163410d6905866" -uuid = "eff96d63-e80a-5855-80a2-b1b0885c5ab7" -version = "2.14.1" - - [deps.Measurements.extensions] - MeasurementsBaseTypeExt = "BaseType" - MeasurementsJunoExt = "Juno" - MeasurementsMakieExt = "Makie" - MeasurementsRecipesBaseExt = "RecipesBase" - MeasurementsSpecialFunctionsExt = "SpecialFunctions" - MeasurementsUnitfulExt = "Unitful" - - [deps.Measurements.weakdeps] - BaseType = "7fbed51b-1ef5-4d67-9085-a4a9b26f478c" - Juno = "e5e0dc1b-0480-54bc-9374-aad01c23163d" - Makie = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a" - RecipesBase = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" - SpecialFunctions = "276daf66-3868-5448-9aa4-cd146d93841b" - Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" - -[[deps.Measures]] -git-tree-sha1 = "c13304c81eec1ed3af7fc20e75fb6b26092a1102" -uuid = "442fdcdd-2543-5da2-b0f3-8c86c306513e" -version = "0.3.2" - -[[deps.MicroCollections]] -deps = ["Accessors", "BangBang", "InitialValues"] -git-tree-sha1 = "44d32db644e84c75dab479f1bc15ee76a1a3618f" -uuid = "128add7d-3638-4c79-886c-908ea0c25c34" -version = "0.2.0" - -[[deps.Missings]] -deps = ["DataAPI"] -git-tree-sha1 = "ec4f7fbeab05d7747bdf98eb74d130a2a2ed298d" -uuid = "e1d29d7a-bbdc-5cf2-9ac0-f12de2c33e28" -version = "1.2.0" - -[[deps.MistyClosures]] -git-tree-sha1 = "d1a692e293c2a0dc8fda79c04cad60582f3d4de3" -uuid = "dbe65cb8-6be2-42dd-bbc5-4196aaced4f4" -version = "2.1.0" - -[[deps.Mmap]] -uuid = "a63ad114-7e13-5084-954f-fe012c677804" -version = "1.11.0" - -[[deps.ModelingToolkit]] -deps = ["ADTypes", "AbstractTrees", "ArrayInterface", "BlockArrays", "ChainRulesCore", "Combinatorics", "CommonSolve", "Compat", "ConstructionBase", "DataStructures", "DiffEqBase", "DiffEqCallbacks", "DiffEqNoiseProcess", "DiffRules", "DifferentiationInterface", "Distributed", "Distributions", "DocStringExtensions", "DomainSets", "DynamicQuantities", "EnumX", "ExprTools", "FindFirstFunctions", "ForwardDiff", "FunctionWrappers", "FunctionWrappersWrappers", "Graphs", "InteractiveUtils", "JuliaFormatter", "JumpProcesses", "Latexify", "Libdl", "LinearAlgebra", "MLStyle", "Moshi", "NaNMath", "NonlinearSolve", "OffsetArrays", "OrderedCollections", "PrecompileTools", "RecursiveArrayTools", "Reexport", "RuntimeGeneratedFunctions", "SCCNonlinearSolve", "SciMLBase", "SciMLStructures", "Serialization", "Setfield", "SimpleNonlinearSolve", "SparseArrays", "SpecialFunctions", "StaticArrays", "SymbolicIndexingInterface", "SymbolicUtils", "Symbolics", "URIs", "UnPack", "Unitful"] -git-tree-sha1 = "c323b230fe37eb029771a0670a07a2cf805c2ac2" -uuid = "961ee093-0014-501f-94e3-6117800e7a78" -version = "9.83.0" - - [deps.ModelingToolkit.extensions] - MTKBifurcationKitExt = "BifurcationKit" - MTKCasADiDynamicOptExt = "CasADi" - MTKDeepDiffsExt = "DeepDiffs" - MTKFMIExt = "FMI" - MTKInfiniteOptExt = "InfiniteOpt" - MTKLabelledArraysExt = "LabelledArrays" - - [deps.ModelingToolkit.weakdeps] - BifurcationKit = "0f109fa4-8a5d-4b75-95aa-f515264e7665" - CasADi = "c49709b8-5c63-11e9-2fb2-69db5844192f" - DeepDiffs = "ab62b9b5-e342-54a8-a765-a90f495de1a6" - FMI = "14a09403-18e3-468f-ad8a-74f8dda2d9ac" - InfiniteOpt = "20393b10-9daf-11e9-18c9-8db751c92c57" - LabelledArrays = "2ee39098-c373-598a-b85f-a56591580800" - -[[deps.Moshi]] -deps = ["ExproniconLite", "Jieko"] -git-tree-sha1 = "53f817d3e84537d84545e0ad749e483412dd6b2a" -uuid = "2e0e35c7-a2e4-4343-998d-7ef72827ed2d" -version = "0.3.7" - -[[deps.MozillaCACerts_jll]] -uuid = "14a3606d-f60d-562e-9121-12d972cd8159" -version = "2025.11.4" - -[[deps.MsgPack]] -deps = ["Serialization"] -git-tree-sha1 = "f5db02ae992c260e4826fe78c942954b48e1d9c2" -uuid = "99f44e22-a591-53d1-9472-aa23ef4bd671" -version = "1.2.1" - -[[deps.MuladdMacro]] -git-tree-sha1 = "cac9cc5499c25554cba55cd3c30543cff5ca4fab" -uuid = "46d2c3a1-f734-5fdb-9937-b9b9aeba4221" -version = "0.2.4" - -[[deps.MultivariatePolynomials]] -deps = ["ChainRulesCore", "DataStructures", "LinearAlgebra", "MutableArithmetics"] -git-tree-sha1 = "fade91fe9bee7b142d332fc6ab3f0deea29f637b" -uuid = "102ac46a-7ee4-5c85-9060-abc95bfdeaa3" -version = "0.5.9" - -[[deps.MultivariateStats]] -deps = ["Arpack", "Distributions", "LinearAlgebra", "SparseArrays", "Statistics", "StatsAPI", "StatsBase"] -git-tree-sha1 = "816620e3aac93e5b5359e4fdaf23ca4525b00ddf" -uuid = "6f286f6a-111f-5878-ab1e-185364afe411" -version = "0.10.3" - -[[deps.MutableArithmetics]] -deps = ["LinearAlgebra", "SparseArrays", "Test"] -git-tree-sha1 = "22df8573f8e7c593ac205455ca088989d0a2c7a0" -uuid = "d8a4904e-b15c-11e9-3269-09a3773c0cb0" -version = "1.6.7" - -[[deps.MvNormalCDF]] -deps = ["Distributions", "FillArrays", "LinearAlgebra", "Primes", "Random", "StatsBase"] -git-tree-sha1 = "87ce0f8162ba3a9f1b6410d2180be4f04c0baac1" -uuid = "37188c8d-bc69-4638-b057-733e744175ec" -version = "0.3.2" - -[[deps.NLSolversBase]] -deps = ["ADTypes", "DifferentiationInterface", "Distributed", "FiniteDiff", "ForwardDiff"] -git-tree-sha1 = "25a6638571a902ecfb1ae2a18fc1575f86b1d4df" -uuid = "d41bc354-129a-5804-8e4c-c37616107c6c" -version = "7.10.0" - -[[deps.NLsolve]] -deps = ["Distances", "LineSearches", "LinearAlgebra", "NLSolversBase", "Printf", "Reexport"] -git-tree-sha1 = "019f12e9a1a7880459d0173c182e6a99365d7ac1" -uuid = "2774e3e8-f4cf-5e23-947b-6d7e65073b56" -version = "4.5.1" - -[[deps.NaNMath]] -deps = ["OpenLibm_jll"] -git-tree-sha1 = "9b8215b1ee9e78a293f99797cd31375471b2bcae" -uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" -version = "1.1.3" - -[[deps.NamedArrays]] -deps = ["Combinatorics", "DelimitedFiles", "InvertedIndices", "LinearAlgebra", "OrderedCollections", "Random", "Requires", "SparseArrays", "Statistics"] -git-tree-sha1 = "33d258318d9e049d26c02ca31b4843b2c851c0b0" -uuid = "86f7a689-2022-50b4-a561-43c23ac3c673" -version = "0.10.5" - -[[deps.NaturalSort]] -git-tree-sha1 = "eda490d06b9f7c00752ee81cfa451efe55521e21" -uuid = "c020b1a1-e9b0-503a-9c33-f039bfc54a85" -version = "1.0.0" - -[[deps.NearestNeighbors]] -deps = ["Distances", "StaticArrays"] -git-tree-sha1 = "ca7e18198a166a1f3eb92a3650d53d94ed8ca8a1" -uuid = "b8a86587-4115-5ab1-83bc-aa920d37bbce" -version = "0.4.22" - -[[deps.Neighborhood]] -deps = ["Distances", "NearestNeighbors", "Random", "Test"] -git-tree-sha1 = "fdea60ca30d724e76cc3b3d90d7f9d29d3d5cab5" -uuid = "645ca80c-8b79-4109-87ea-e1f58159d116" -version = "0.2.4" - -[[deps.NetworkOptions]] -uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" -version = "1.3.0" - -[[deps.NonlinearSolve]] -deps = ["ADTypes", "ArrayInterface", "BracketingNonlinearSolve", "CommonSolve", "ConcreteStructs", "DiffEqBase", "DifferentiationInterface", "FastClosures", "FiniteDiff", "ForwardDiff", "LineSearch", "LinearAlgebra", "LinearSolve", "NonlinearSolveBase", "NonlinearSolveFirstOrder", "NonlinearSolveQuasiNewton", "NonlinearSolveSpectralMethods", "PrecompileTools", "Preferences", "Reexport", "SciMLBase", "SimpleNonlinearSolve", "SparseArrays", "SparseMatrixColorings", "StaticArraysCore", "SymbolicIndexingInterface"] -git-tree-sha1 = "d2ec18c1e4eccbb70b64be2435fc3b06fbcdc0a1" -uuid = "8913a72c-1f9b-4ce2-8d82-65094dcecaec" -version = "4.10.0" - - [deps.NonlinearSolve.extensions] - NonlinearSolveFastLevenbergMarquardtExt = "FastLevenbergMarquardt" - NonlinearSolveFixedPointAccelerationExt = "FixedPointAcceleration" - NonlinearSolveLeastSquaresOptimExt = "LeastSquaresOptim" - NonlinearSolveMINPACKExt = "MINPACK" - NonlinearSolveNLSolversExt = "NLSolvers" - NonlinearSolveNLsolveExt = ["NLsolve", "LineSearches"] - NonlinearSolvePETScExt = ["PETSc", "MPI"] - NonlinearSolveSIAMFANLEquationsExt = "SIAMFANLEquations" - NonlinearSolveSpeedMappingExt = "SpeedMapping" - NonlinearSolveSundialsExt = "Sundials" - - [deps.NonlinearSolve.weakdeps] - FastLevenbergMarquardt = "7a0df574-e128-4d35-8cbd-3d84502bf7ce" - FixedPointAcceleration = "817d07cb-a79a-5c30-9a31-890123675176" - LeastSquaresOptim = "0fc2ff8b-aaa3-5acd-a817-1944a5e08891" - LineSearches = "d3d80556-e9d4-5f37-9878-2ab0fcc64255" - MINPACK = "4854310b-de5a-5eb6-a2a5-c1dee2bd17f9" - MPI = "da04e1cc-30fd-572f-bb4f-1f8673147195" - NLSolvers = "337daf1e-9722-11e9-073e-8b9effe078ba" - NLsolve = "2774e3e8-f4cf-5e23-947b-6d7e65073b56" - PETSc = "ace2c81b-2b5f-4b1e-a30d-d662738edfe0" - SIAMFANLEquations = "084e46ad-d928-497d-ad5e-07fa361a48c4" - SpeedMapping = "f1835b91-879b-4a3f-a438-e4baacf14412" - Sundials = "c3572dad-4567-51f8-b174-8c6c989267f4" - -[[deps.NonlinearSolveBase]] -deps = ["ADTypes", "Adapt", "ArrayInterface", "CommonSolve", "Compat", "ConcreteStructs", "DifferentiationInterface", "EnzymeCore", "FastClosures", "LinearAlgebra", "Markdown", "MaybeInplace", "Preferences", "Printf", "RecursiveArrayTools", "SciMLBase", "SciMLJacobianOperators", "SciMLOperators", "StaticArraysCore", "SymbolicIndexingInterface", "TimerOutputs"] -git-tree-sha1 = "1d42a315ba627ca0027d49d0efb44e3d88db24aa" -uuid = "be0214bd-f91f-a760-ac4e-3421ce2b2da0" -version = "1.14.0" -weakdeps = ["BandedMatrices", "DiffEqBase", "ForwardDiff", "LineSearch", "LinearSolve", "SparseArrays", "SparseMatrixColorings"] - - [deps.NonlinearSolveBase.extensions] - NonlinearSolveBaseBandedMatricesExt = "BandedMatrices" - NonlinearSolveBaseDiffEqBaseExt = "DiffEqBase" - NonlinearSolveBaseForwardDiffExt = "ForwardDiff" - NonlinearSolveBaseLineSearchExt = "LineSearch" - NonlinearSolveBaseLinearSolveExt = "LinearSolve" - NonlinearSolveBaseSparseArraysExt = "SparseArrays" - NonlinearSolveBaseSparseMatrixColoringsExt = "SparseMatrixColorings" - -[[deps.NonlinearSolveFirstOrder]] -deps = ["ADTypes", "ArrayInterface", "CommonSolve", "ConcreteStructs", "DiffEqBase", "FiniteDiff", "ForwardDiff", "LineSearch", "LinearAlgebra", "LinearSolve", "MaybeInplace", "NonlinearSolveBase", "PrecompileTools", "Reexport", "SciMLBase", "SciMLJacobianOperators", "Setfield", "StaticArraysCore"] -git-tree-sha1 = "3f1198ae5cbf21e84b8251a9e62fa1f888f3e4cb" -uuid = "5959db7a-ea39-4486-b5fe-2dd0bf03d60d" -version = "1.7.0" - -[[deps.NonlinearSolveQuasiNewton]] -deps = ["ArrayInterface", "CommonSolve", "ConcreteStructs", "DiffEqBase", "LinearAlgebra", "LinearSolve", "MaybeInplace", "NonlinearSolveBase", "PrecompileTools", "Reexport", "SciMLBase", "SciMLOperators", "StaticArraysCore"] -git-tree-sha1 = "40dfaf1bf74f1f700f81d0002d4dd90999598eb2" -uuid = "9a2c21bd-3a47-402d-9113-8faf9a0ee114" -version = "1.8.0" -weakdeps = ["ForwardDiff"] - - [deps.NonlinearSolveQuasiNewton.extensions] - NonlinearSolveQuasiNewtonForwardDiffExt = "ForwardDiff" - -[[deps.NonlinearSolveSpectralMethods]] -deps = ["CommonSolve", "ConcreteStructs", "DiffEqBase", "LineSearch", "MaybeInplace", "NonlinearSolveBase", "PrecompileTools", "Reexport", "SciMLBase"] -git-tree-sha1 = "84de5a469e119eb2c22ae07c543dc4e7f7001ee7" -uuid = "26075421-4e9a-44e1-8bd1-420ed7ad02b2" -version = "1.3.0" -weakdeps = ["ForwardDiff"] - - [deps.NonlinearSolveSpectralMethods.extensions] - NonlinearSolveSpectralMethodsForwardDiffExt = "ForwardDiff" - -[[deps.Observables]] -git-tree-sha1 = "7438a59546cf62428fc9d1bc94729146d37a7225" -uuid = "510215fc-4207-5dde-b226-833fc4488ee2" -version = "0.5.5" - -[[deps.OffsetArrays]] -git-tree-sha1 = "117432e406b5c023f665fa73dc26e79ec3630151" -uuid = "6fe1bfb0-de20-5000-8ca7-80f57d26f881" -version = "1.17.0" -weakdeps = ["Adapt"] - - [deps.OffsetArrays.extensions] - OffsetArraysAdaptExt = "Adapt" - -[[deps.Ogg_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "b6aa4566bb7ae78498a5e68943863fa8b5231b59" -uuid = "e7412a2a-1a6e-54c0-be00-318e2571c051" -version = "1.3.6+0" - -[[deps.OpenBLAS_jll]] -deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] -uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" -version = "0.3.29+0" - -[[deps.OpenLibm_jll]] -deps = ["Artifacts", "Libdl"] -uuid = "05823500-19ac-5b8b-9628-191a04bc5112" -version = "0.8.7+0" - -[[deps.OpenSSL]] -deps = ["BitFlags", "Dates", "MozillaCACerts_jll", "NetworkOptions", "OpenSSL_jll", "Sockets"] -git-tree-sha1 = "386b47442468acfb1add94bf2d85365dea10cbab" -uuid = "4d8831e6-92b7-49fb-bdf8-b643e874388c" -version = "1.6.0" - -[[deps.OpenSSL_jll]] -deps = ["Artifacts", "Libdl"] -uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95" -version = "3.5.6+0" - -[[deps.OpenSpecFun_jll]] -deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl"] -git-tree-sha1 = "1346c9208249809840c91b26703912dff463d335" -uuid = "efe28fd5-8261-553b-a9e1-b2916fc3738e" -version = "0.5.6+0" - -[[deps.Optim]] -deps = ["Compat", "EnumX", "FillArrays", "ForwardDiff", "LineSearches", "LinearAlgebra", "NLSolversBase", "NaNMath", "PositiveFactorizations", "Printf", "SparseArrays", "StatsBase"] -git-tree-sha1 = "61942645c38dd2b5b78e2082c9b51ab315315d10" -uuid = "429524aa-4258-5aef-a3af-852621145aeb" -version = "1.13.2" - - [deps.Optim.extensions] - OptimMOIExt = "MathOptInterface" - - [deps.Optim.weakdeps] - MathOptInterface = "b8f27783-ece8-5eb3-8dc8-9495eed66fee" - -[[deps.Optimisers]] -deps = ["ChainRulesCore", "ConstructionBase", "Functors", "LinearAlgebra", "Random", "Statistics"] -git-tree-sha1 = "131dc319e7c58317e8c6d5170440f6bdaee0a959" -uuid = "3bd65402-5787-11e9-1adc-39752487f4e2" -version = "0.4.6" - - [deps.Optimisers.extensions] - OptimisersAdaptExt = ["Adapt"] - OptimisersEnzymeCoreExt = "EnzymeCore" - OptimisersReactantExt = "Reactant" - - [deps.Optimisers.weakdeps] - Adapt = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" - EnzymeCore = "f151be2c-9106-41f4-ab19-57ee4f262869" - Reactant = "3c362404-f566-11ee-1572-e11a4b42c853" - -[[deps.Optimization]] -deps = ["ADTypes", "ArrayInterface", "ConsoleProgressMonitor", "DocStringExtensions", "LBFGSB", "LinearAlgebra", "Logging", "LoggingExtras", "OptimizationBase", "Printf", "ProgressLogging", "Random", "Reexport", "SciMLBase", "SparseArrays", "TerminalLoggers"] -git-tree-sha1 = "fa2449ce34cc1d7b2191bad4d3356a5376412288" -uuid = "7f7a1694-90dd-40f0-9382-eb1efda571ba" -version = "4.8.0" - -[[deps.OptimizationBase]] -deps = ["ADTypes", "ArrayInterface", "DifferentiationInterface", "DocStringExtensions", "FastClosures", "LinearAlgebra", "PDMats", "Reexport", "Requires", "SciMLBase", "SparseArrays", "SparseConnectivityTracer", "SparseMatrixColorings"] -git-tree-sha1 = "918d9bf579a355222e62ceac955b5382fea7bd61" -uuid = "bca83a33-5cc9-4baa-983d-23429ab6bcbb" -version = "2.7.0" - - [deps.OptimizationBase.extensions] - OptimizationEnzymeExt = "Enzyme" - OptimizationFiniteDiffExt = "FiniteDiff" - OptimizationForwardDiffExt = "ForwardDiff" - OptimizationMLDataDevicesExt = "MLDataDevices" - OptimizationMLUtilsExt = "MLUtils" - OptimizationMTKExt = "ModelingToolkit" - OptimizationReverseDiffExt = "ReverseDiff" - OptimizationSymbolicAnalysisExt = "SymbolicAnalysis" - OptimizationZygoteExt = "Zygote" - - [deps.OptimizationBase.weakdeps] - Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9" - FiniteDiff = "6a86dc24-6348-571c-b903-95158fe2bd41" - ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" - MLDataDevices = "7e8f7934-dd98-4c1a-8fe8-92b47a384d40" - MLUtils = "f1d291b0-491e-4a28-83b9-f70985020b54" - ModelingToolkit = "961ee093-0014-501f-94e3-6117800e7a78" - ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" - SymbolicAnalysis = "4297ee4d-0239-47d8-ba5d-195ecdf594fe" - Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f" - -[[deps.OptimizationOptimJL]] -deps = ["Optim", "Optimization", "PrecompileTools", "Reexport", "SparseArrays"] -git-tree-sha1 = "d9e2cca329ce969a3dc26c9278d77bfeff7012ef" -uuid = "36348300-93cb-4f02-beb5-3c3902f8871e" -version = "0.4.5" - -[[deps.Opus_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "c392fc5dd032381919e3b22dd32d6443760ce7ea" -uuid = "91d4177d-7536-5919-b921-800302f37372" -version = "1.5.2+0" - -[[deps.OrderedCollections]] -git-tree-sha1 = "05868e21324cede2207c6f0f466b4bfef6d5e7ee" -uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" -version = "1.8.1" - -[[deps.OrdinaryDiffEq]] -deps = ["ADTypes", "Adapt", "ArrayInterface", "DataStructures", "DiffEqBase", "DocStringExtensions", "EnumX", "ExponentialUtilities", "FastBroadcast", "FastClosures", "FillArrays", "FiniteDiff", "ForwardDiff", "FunctionWrappersWrappers", "InteractiveUtils", "LineSearches", "LinearAlgebra", "LinearSolve", "Logging", "MacroTools", "MuladdMacro", "NonlinearSolve", "OrdinaryDiffEqAdamsBashforthMoulton", "OrdinaryDiffEqBDF", "OrdinaryDiffEqCore", "OrdinaryDiffEqDefault", "OrdinaryDiffEqDifferentiation", "OrdinaryDiffEqExplicitRK", "OrdinaryDiffEqExponentialRK", "OrdinaryDiffEqExtrapolation", "OrdinaryDiffEqFIRK", "OrdinaryDiffEqFeagin", "OrdinaryDiffEqFunctionMap", "OrdinaryDiffEqHighOrderRK", "OrdinaryDiffEqIMEXMultistep", "OrdinaryDiffEqLinear", "OrdinaryDiffEqLowOrderRK", "OrdinaryDiffEqLowStorageRK", "OrdinaryDiffEqNonlinearSolve", "OrdinaryDiffEqNordsieck", "OrdinaryDiffEqPDIRK", "OrdinaryDiffEqPRK", "OrdinaryDiffEqQPRK", "OrdinaryDiffEqRKN", "OrdinaryDiffEqRosenbrock", "OrdinaryDiffEqSDIRK", "OrdinaryDiffEqSSPRK", "OrdinaryDiffEqStabilizedIRK", "OrdinaryDiffEqStabilizedRK", "OrdinaryDiffEqSymplecticRK", "OrdinaryDiffEqTsit5", "OrdinaryDiffEqVerner", "Polyester", "PreallocationTools", "PrecompileTools", "Preferences", "RecursiveArrayTools", "Reexport", "SciMLBase", "SciMLOperators", "SciMLStructures", "SimpleNonlinearSolve", "SimpleUnPack", "SparseArrays", "Static", "StaticArrayInterface", "StaticArrays", "TruncatedStacktraces"] -git-tree-sha1 = "55c21fdb4626037cdbcb04fec3afa192345a24de" -uuid = "1dea7af3-3e70-54e6-95c3-0bf5283fa5ed" -version = "6.101.0" - -[[deps.OrdinaryDiffEqAdamsBashforthMoulton]] -deps = ["DiffEqBase", "FastBroadcast", "MuladdMacro", "OrdinaryDiffEqCore", "OrdinaryDiffEqLowOrderRK", "Polyester", "RecursiveArrayTools", "Reexport", "SciMLBase", "Static"] -git-tree-sha1 = "09aae1486c767caa6bce9de892455cbdf5a6fbc8" -uuid = "89bda076-bce5-4f1c-845f-551c83cdda9a" -version = "1.5.0" - -[[deps.OrdinaryDiffEqBDF]] -deps = ["ADTypes", "ArrayInterface", "DiffEqBase", "FastBroadcast", "LinearAlgebra", "MacroTools", "MuladdMacro", "OrdinaryDiffEqCore", "OrdinaryDiffEqDifferentiation", "OrdinaryDiffEqNonlinearSolve", "OrdinaryDiffEqSDIRK", "PrecompileTools", "Preferences", "RecursiveArrayTools", "Reexport", "SciMLBase", "StaticArrays", "TruncatedStacktraces"] -git-tree-sha1 = "ce8db53fd1e4e41c020fd53961e7314f75e4c21c" -uuid = "6ad6398a-0878-4a85-9266-38940aa047c8" -version = "1.10.1" - -[[deps.OrdinaryDiffEqCore]] -deps = ["ADTypes", "Accessors", "Adapt", "ArrayInterface", "DataStructures", "DiffEqBase", "DocStringExtensions", "EnumX", "FastBroadcast", "FastClosures", "FastPower", "FillArrays", "FunctionWrappersWrappers", "InteractiveUtils", "LinearAlgebra", "Logging", "MacroTools", "MuladdMacro", "Polyester", "PrecompileTools", "Preferences", "RecursiveArrayTools", "Reexport", "SciMLBase", "SciMLOperators", "SciMLStructures", "SimpleUnPack", "Static", "StaticArrayInterface", "StaticArraysCore", "SymbolicIndexingInterface", "TruncatedStacktraces"] -git-tree-sha1 = "e579c9a4f9102e82da3d97c349a74d6bc11cf8dc" -uuid = "bbf590c4-e513-4bbe-9b18-05decba2e5d8" -version = "1.30.0" - - [deps.OrdinaryDiffEqCore.extensions] - OrdinaryDiffEqCoreEnzymeCoreExt = "EnzymeCore" - OrdinaryDiffEqCoreMooncakeExt = "Mooncake" - - [deps.OrdinaryDiffEqCore.weakdeps] - EnzymeCore = "f151be2c-9106-41f4-ab19-57ee4f262869" - Mooncake = "da2b9cff-9c12-43a0-ae48-6db2b0edb7d6" - -[[deps.OrdinaryDiffEqDefault]] -deps = ["ADTypes", "DiffEqBase", "EnumX", "LinearAlgebra", "LinearSolve", "OrdinaryDiffEqBDF", "OrdinaryDiffEqCore", "OrdinaryDiffEqRosenbrock", "OrdinaryDiffEqTsit5", "OrdinaryDiffEqVerner", "PrecompileTools", "Preferences", "Reexport", "SciMLBase"] -git-tree-sha1 = "7d5ddeee97e1bdcc848f1397cbc3d03bd57f33e7" -uuid = "50262376-6c5a-4cf5-baba-aaf4f84d72d7" -version = "1.8.0" - -[[deps.OrdinaryDiffEqDifferentiation]] -deps = ["ADTypes", "ArrayInterface", "ConcreteStructs", "ConstructionBase", "DiffEqBase", "DifferentiationInterface", "FastBroadcast", "FiniteDiff", "ForwardDiff", "FunctionWrappersWrappers", "LinearAlgebra", "LinearSolve", "OrdinaryDiffEqCore", "SciMLBase", "SciMLOperators", "SparseMatrixColorings", "StaticArrayInterface", "StaticArrays"] -git-tree-sha1 = "320b5f3e4e61ca0ad863c63c803f69973ba6efce" -uuid = "4302a76b-040a-498a-8c04-15b101fed76b" -version = "1.16.1" -weakdeps = ["SparseArrays"] - - [deps.OrdinaryDiffEqDifferentiation.extensions] - OrdinaryDiffEqDifferentiationSparseArraysExt = "SparseArrays" - -[[deps.OrdinaryDiffEqExplicitRK]] -deps = ["DiffEqBase", "FastBroadcast", "LinearAlgebra", "MuladdMacro", "OrdinaryDiffEqCore", "RecursiveArrayTools", "Reexport", "SciMLBase", "TruncatedStacktraces"] -git-tree-sha1 = "4c0633f587395d7aaec0679dc649eb03fcc74e73" -uuid = "9286f039-9fbf-40e8-bf65-aa933bdc4db0" -version = "1.4.0" - -[[deps.OrdinaryDiffEqExponentialRK]] -deps = ["ADTypes", "DiffEqBase", "ExponentialUtilities", "FastBroadcast", "LinearAlgebra", "MuladdMacro", "OrdinaryDiffEqCore", "OrdinaryDiffEqDifferentiation", "RecursiveArrayTools", "Reexport", "SciMLBase"] -git-tree-sha1 = "3b81416ff11e55ea0ae7b449efc818256d9d450b" -uuid = "e0540318-69ee-4070-8777-9e2de6de23de" -version = "1.8.0" - -[[deps.OrdinaryDiffEqExtrapolation]] -deps = ["ADTypes", "DiffEqBase", "FastBroadcast", "FastPower", "LinearSolve", "MuladdMacro", "OrdinaryDiffEqCore", "OrdinaryDiffEqDifferentiation", "Polyester", "RecursiveArrayTools", "Reexport", "SciMLBase"] -git-tree-sha1 = "9e1b11cf448a2c1bca640103c1c848a20aa2f967" -uuid = "becaefa8-8ca2-5cf9-886d-c06f3d2bd2c4" -version = "1.9.0" - -[[deps.OrdinaryDiffEqFIRK]] -deps = ["ADTypes", "DiffEqBase", "FastBroadcast", "FastGaussQuadrature", "FastPower", "LinearAlgebra", "LinearSolve", "MuladdMacro", "OrdinaryDiffEqCore", "OrdinaryDiffEqDifferentiation", "OrdinaryDiffEqNonlinearSolve", "Polyester", "RecursiveArrayTools", "Reexport", "SciMLBase", "SciMLOperators"] -git-tree-sha1 = "b968d66de3de5ffcf18544bc202ca792bad20710" -uuid = "5960d6e9-dd7a-4743-88e7-cf307b64f125" -version = "1.16.0" - -[[deps.OrdinaryDiffEqFeagin]] -deps = ["DiffEqBase", "FastBroadcast", "MuladdMacro", "OrdinaryDiffEqCore", "Polyester", "RecursiveArrayTools", "Reexport", "SciMLBase", "Static"] -git-tree-sha1 = "815b54211201ec42b8829e0275ab3c9632d16cbe" -uuid = "101fe9f7-ebb6-4678-b671-3a81e7194747" -version = "1.4.0" - -[[deps.OrdinaryDiffEqFunctionMap]] -deps = ["DiffEqBase", "FastBroadcast", "MuladdMacro", "OrdinaryDiffEqCore", "RecursiveArrayTools", "Reexport", "SciMLBase", "Static"] -git-tree-sha1 = "fe750e4b8c1b1b9e1c1319ff2e052e83ad57b3ac" -uuid = "d3585ca7-f5d3-4ba6-8057-292ed1abd90f" -version = "1.5.0" - -[[deps.OrdinaryDiffEqHighOrderRK]] -deps = ["DiffEqBase", "FastBroadcast", "MuladdMacro", "OrdinaryDiffEqCore", "RecursiveArrayTools", "Reexport", "SciMLBase", "Static"] -git-tree-sha1 = "42096f72136078fa02804515f1748ddeb1f0d47d" -uuid = "d28bc4f8-55e1-4f49-af69-84c1a99f0f58" -version = "1.5.0" - -[[deps.OrdinaryDiffEqIMEXMultistep]] -deps = ["ADTypes", "DiffEqBase", "FastBroadcast", "OrdinaryDiffEqCore", "OrdinaryDiffEqDifferentiation", "OrdinaryDiffEqNonlinearSolve", "Reexport", "SciMLBase"] -git-tree-sha1 = "a5dcd75959dada0005b1707a5ca9359faa1734ba" -uuid = "9f002381-b378-40b7-97a6-27a27c83f129" -version = "1.7.0" - -[[deps.OrdinaryDiffEqLinear]] -deps = ["DiffEqBase", "ExponentialUtilities", "LinearAlgebra", "OrdinaryDiffEqCore", "RecursiveArrayTools", "Reexport", "SciMLBase", "SciMLOperators"] -git-tree-sha1 = "925fc0136e8128fd19abf126e9358ec1f997390f" -uuid = "521117fe-8c41-49f8-b3b6-30780b3f0fb5" -version = "1.6.0" - -[[deps.OrdinaryDiffEqLowOrderRK]] -deps = ["DiffEqBase", "FastBroadcast", "LinearAlgebra", "MuladdMacro", "OrdinaryDiffEqCore", "RecursiveArrayTools", "Reexport", "SciMLBase", "Static"] -git-tree-sha1 = "3cc4987c8e4725276b55a52e08b56ded4862917e" -uuid = "1344f307-1e59-4825-a18e-ace9aa3fa4c6" -version = "1.6.0" - -[[deps.OrdinaryDiffEqLowStorageRK]] -deps = ["Adapt", "DiffEqBase", "FastBroadcast", "MuladdMacro", "OrdinaryDiffEqCore", "Polyester", "PrecompileTools", "Preferences", "RecursiveArrayTools", "Reexport", "SciMLBase", "Static", "StaticArrays"] -git-tree-sha1 = "e6bd0a7fb6643a57b06a90415608a81aaf7bd772" -uuid = "b0944070-b475-4768-8dec-fb6eb410534d" -version = "1.7.0" - -[[deps.OrdinaryDiffEqNonlinearSolve]] -deps = ["ADTypes", "ArrayInterface", "DiffEqBase", "FastBroadcast", "FastClosures", "ForwardDiff", "LinearAlgebra", "LinearSolve", "MuladdMacro", "NonlinearSolve", "OrdinaryDiffEqCore", "OrdinaryDiffEqDifferentiation", "PreallocationTools", "RecursiveArrayTools", "SciMLBase", "SciMLOperators", "SciMLStructures", "SimpleNonlinearSolve", "StaticArrays"] -git-tree-sha1 = "b05226afc8fa6b8fc6f2258a89987b4f5bd0db4e" -uuid = "127b3ac7-2247-4354-8eb6-78cf4e7c58e8" -version = "1.14.1" - -[[deps.OrdinaryDiffEqNordsieck]] -deps = ["DiffEqBase", "FastBroadcast", "LinearAlgebra", "MuladdMacro", "OrdinaryDiffEqCore", "OrdinaryDiffEqTsit5", "Polyester", "RecursiveArrayTools", "Reexport", "SciMLBase", "Static"] -git-tree-sha1 = "c90aa7fa0d725472c4098096adf6a08266c2f682" -uuid = "c9986a66-5c92-4813-8696-a7ec84c806c8" -version = "1.4.0" - -[[deps.OrdinaryDiffEqPDIRK]] -deps = ["ADTypes", "DiffEqBase", "FastBroadcast", "MuladdMacro", "OrdinaryDiffEqCore", "OrdinaryDiffEqDifferentiation", "OrdinaryDiffEqNonlinearSolve", "Polyester", "Reexport", "SciMLBase", "StaticArrays"] -git-tree-sha1 = "9d599d2eafdf74ab26ea6bf3feb28183a2ade143" -uuid = "5dd0a6cf-3d4b-4314-aa06-06d4e299bc89" -version = "1.6.0" - -[[deps.OrdinaryDiffEqPRK]] -deps = ["DiffEqBase", "FastBroadcast", "MuladdMacro", "OrdinaryDiffEqCore", "Polyester", "Reexport", "SciMLBase"] -git-tree-sha1 = "8e35132689133255be6d63df4190b5fc97b6cf2b" -uuid = "5b33eab2-c0f1-4480-b2c3-94bc1e80bda1" -version = "1.4.0" - -[[deps.OrdinaryDiffEqQPRK]] -deps = ["DiffEqBase", "FastBroadcast", "MuladdMacro", "OrdinaryDiffEqCore", "RecursiveArrayTools", "Reexport", "SciMLBase", "Static"] -git-tree-sha1 = "63fb643a956b27cd0e33a3c6d910c3c118082e0f" -uuid = "04162be5-8125-4266-98ed-640baecc6514" -version = "1.4.0" - -[[deps.OrdinaryDiffEqRKN]] -deps = ["DiffEqBase", "FastBroadcast", "MuladdMacro", "OrdinaryDiffEqCore", "Polyester", "RecursiveArrayTools", "Reexport", "SciMLBase"] -git-tree-sha1 = "a31c41f9dbea7c7179c6e544c25c7e144d63868c" -uuid = "af6ede74-add8-4cfd-b1df-9a4dbb109d7a" -version = "1.5.0" - -[[deps.OrdinaryDiffEqRosenbrock]] -deps = ["ADTypes", "DiffEqBase", "DifferentiationInterface", "FastBroadcast", "FiniteDiff", "ForwardDiff", "LinearAlgebra", "LinearSolve", "MacroTools", "MuladdMacro", "OrdinaryDiffEqCore", "OrdinaryDiffEqDifferentiation", "Polyester", "PrecompileTools", "Preferences", "RecursiveArrayTools", "Reexport", "SciMLBase", "Static"] -git-tree-sha1 = "f34bc2f58656843596d09a4c4de8c20724ebc2f1" -uuid = "43230ef6-c299-4910-a778-202eb28ce4ce" -version = "1.18.1" - -[[deps.OrdinaryDiffEqSDIRK]] -deps = ["ADTypes", "DiffEqBase", "FastBroadcast", "LinearAlgebra", "MacroTools", "MuladdMacro", "OrdinaryDiffEqCore", "OrdinaryDiffEqDifferentiation", "OrdinaryDiffEqNonlinearSolve", "RecursiveArrayTools", "Reexport", "SciMLBase", "TruncatedStacktraces"] -git-tree-sha1 = "20caa72c004414435fb5769fadb711e96ed5bcd4" -uuid = "2d112036-d095-4a1e-ab9a-08536f3ecdbf" -version = "1.7.0" - -[[deps.OrdinaryDiffEqSSPRK]] -deps = ["DiffEqBase", "FastBroadcast", "MuladdMacro", "OrdinaryDiffEqCore", "Polyester", "PrecompileTools", "Preferences", "RecursiveArrayTools", "Reexport", "SciMLBase", "Static", "StaticArrays"] -git-tree-sha1 = "3bce87977264916bd92455754ab336faec68bf8a" -uuid = "669c94d9-1f4b-4b64-b377-1aa079aa2388" -version = "1.7.0" - -[[deps.OrdinaryDiffEqStabilizedIRK]] -deps = ["ADTypes", "DiffEqBase", "FastBroadcast", "MuladdMacro", "OrdinaryDiffEqCore", "OrdinaryDiffEqDifferentiation", "OrdinaryDiffEqNonlinearSolve", "OrdinaryDiffEqStabilizedRK", "RecursiveArrayTools", "Reexport", "SciMLBase", "StaticArrays"] -git-tree-sha1 = "75abe7462f4b0b2a2463bb512c8a5458bbd39185" -uuid = "e3e12d00-db14-5390-b879-ac3dd2ef6296" -version = "1.6.0" - -[[deps.OrdinaryDiffEqStabilizedRK]] -deps = ["DiffEqBase", "FastBroadcast", "MuladdMacro", "OrdinaryDiffEqCore", "RecursiveArrayTools", "Reexport", "SciMLBase", "StaticArrays"] -git-tree-sha1 = "7e94d3d1b3528b4bcf9e0248198ee0a2fd65a697" -uuid = "358294b1-0aab-51c3-aafe-ad5ab194a2ad" -version = "1.4.0" - -[[deps.OrdinaryDiffEqSymplecticRK]] -deps = ["DiffEqBase", "FastBroadcast", "MuladdMacro", "OrdinaryDiffEqCore", "Polyester", "RecursiveArrayTools", "Reexport", "SciMLBase"] -git-tree-sha1 = "e8dd5ab225287947016dc144a5ded1fb83885638" -uuid = "fa646aed-7ef9-47eb-84c4-9443fc8cbfa8" -version = "1.7.0" - -[[deps.OrdinaryDiffEqTsit5]] -deps = ["DiffEqBase", "FastBroadcast", "LinearAlgebra", "MuladdMacro", "OrdinaryDiffEqCore", "PrecompileTools", "Preferences", "RecursiveArrayTools", "Reexport", "SciMLBase", "Static", "TruncatedStacktraces"] -git-tree-sha1 = "778c7d379265f17f40dbe9aaa6f6a2a08bc7fa3e" -uuid = "b1df2697-797e-41e3-8120-5422d3b24e4a" -version = "1.5.0" - -[[deps.OrdinaryDiffEqVerner]] -deps = ["DiffEqBase", "FastBroadcast", "LinearAlgebra", "MuladdMacro", "OrdinaryDiffEqCore", "Polyester", "PrecompileTools", "Preferences", "RecursiveArrayTools", "Reexport", "SciMLBase", "Static", "TruncatedStacktraces"] -git-tree-sha1 = "185578fa7c38119d4318326f9375f1cba0f0ce53" -uuid = "79d7bb75-1356-48c1-b8c0-6832512096c2" -version = "1.6.0" - -[[deps.PCRE2_jll]] -deps = ["Artifacts", "Libdl"] -uuid = "efcefdf7-47ab-520b-bdef-62a2eaa19f15" -version = "10.44.0+1" - -[[deps.PDMats]] -deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"] -git-tree-sha1 = "d922b4d80d1e12c658da7785e754f4796cc1d60d" -uuid = "90014a1f-27ba-587c-ab20-58faa44d9150" -version = "0.11.36" -weakdeps = ["StatsBase"] - - [deps.PDMats.extensions] - StatsBaseExt = "StatsBase" - -[[deps.Pango_jll]] -deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "FriBidi_jll", "Glib_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl"] -git-tree-sha1 = "1f7f9bbd5f7a2e5a9f7d96e51c9754454ea7f60b" -uuid = "36c8627f-9965-5494-a995-c6b170f724f3" -version = "1.56.4+0" - -[[deps.Parameters]] -deps = ["OrderedCollections", "UnPack"] -git-tree-sha1 = "34c0e9ad262e5f7fc75b10a9952ca7692cfc5fbe" -uuid = "d96e819e-fc66-5662-9728-84c9c7592b0a" -version = "0.12.3" - -[[deps.Parsers]] -deps = ["Dates", "PrecompileTools", "UUIDs"] -git-tree-sha1 = "7d2f8f21da5db6a806faf7b9b292296da42b2810" -uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" -version = "2.8.3" - -[[deps.Pixman_jll]] -deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LLVMOpenMP_jll", "Libdl"] -git-tree-sha1 = "db76b1ecd5e9715f3d043cec13b2ec93ce015d53" -uuid = "30392449-352a-5448-841d-b1acce4e97dc" -version = "0.44.2+0" - -[[deps.Pkg]] -deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "Random", "SHA", "TOML", "Tar", "UUIDs", "p7zip_jll"] -uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" -version = "1.12.1" -weakdeps = ["REPL"] - - [deps.Pkg.extensions] - REPLExt = "REPL" - -[[deps.PlotThemes]] -deps = ["PlotUtils", "Statistics"] -git-tree-sha1 = "41031ef3a1be6f5bbbf3e8073f210556daeae5ca" -uuid = "ccf2f8ad-2431-5c83-bf29-c5338b663b6a" -version = "3.3.0" - -[[deps.PlotUtils]] -deps = ["ColorSchemes", "Colors", "Dates", "PrecompileTools", "Printf", "Random", "Reexport", "StableRNGs", "Statistics"] -git-tree-sha1 = "3ca9a356cd2e113c420f2c13bea19f8d3fb1cb18" -uuid = "995b91a9-d308-5afd-9ec6-746e21dbc043" -version = "1.4.3" - -[[deps.Plots]] -deps = ["Base64", "Contour", "Dates", "Downloads", "FFMPEG", "FixedPointNumbers", "GR", "JLFzf", "JSON", "LaTeXStrings", "Latexify", "LinearAlgebra", "Measures", "NaNMath", "Pkg", "PlotThemes", "PlotUtils", "PrecompileTools", "Printf", "REPL", "Random", "RecipesBase", "RecipesPipeline", "Reexport", "RelocatableFolders", "Requires", "Scratch", "Showoff", "SparseArrays", "Statistics", "StatsBase", "TOML", "UUIDs", "UnicodeFun", "Unzip"] -git-tree-sha1 = "12ce661880f8e309569074a61d3767e5756a199f" -uuid = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" -version = "1.41.1" - - [deps.Plots.extensions] - FileIOExt = "FileIO" - GeometryBasicsExt = "GeometryBasics" - IJuliaExt = "IJulia" - ImageInTerminalExt = "ImageInTerminal" - UnitfulExt = "Unitful" - - [deps.Plots.weakdeps] - FileIO = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" - GeometryBasics = "5c1252a2-5f33-56bf-86c9-59e7332b4326" - IJulia = "7073ff75-c697-5162-941a-fcdaad2a7d2a" - ImageInTerminal = "d8c32880-2388-543b-8c61-d9f865259254" - Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" - -[[deps.Pluto]] -deps = ["Base64", "Configurations", "Dates", "Downloads", "ExpressionExplorer", "FileWatching", "GracefulPkg", "HTTP", "HypertextLiteral", "InteractiveUtils", "LRUCache", "Logging", "LoggingExtras", "MIMEs", "Malt", "Markdown", "MsgPack", "Pkg", "PlutoDependencyExplorer", "PrecompileSignatures", "PrecompileTools", "REPL", "Random", "RegistryInstances", "RelocatableFolders", "SHA", "Scratch", "Sockets", "TOML", "Tables", "URIs", "UUIDs"] -git-tree-sha1 = "1c1ce8bab7f044956fc12c355f5dff190afaa421" -uuid = "c3e4b0f8-55cb-11ea-2926-15256bba5781" -version = "0.20.20" - -[[deps.PlutoDependencyExplorer]] -deps = ["ExpressionExplorer", "InteractiveUtils", "Markdown"] -git-tree-sha1 = "c3e5073a977b1c58b2d55c1ec187c3737e64e6af" -uuid = "72656b73-756c-7461-726b-72656b6b696b" -version = "1.2.2" - -[[deps.PlutoUI]] -deps = ["AbstractPlutoDingetjes", "Base64", "ColorTypes", "Dates", "Downloads", "FixedPointNumbers", "Hyperscript", "HypertextLiteral", "IOCapture", "InteractiveUtils", "JSON", "Logging", "MIMEs", "Markdown", "Random", "Reexport", "URIs", "UUIDs"] -git-tree-sha1 = "3faff84e6f97a7f18e0dd24373daa229fd358db5" -uuid = "7f904dfe-b85e-4ff6-b463-dae2292396a8" -version = "0.7.73" - -[[deps.PoissonRandom]] -deps = ["LogExpFunctions", "Random"] -git-tree-sha1 = "67afbcbe9e184d6729a92a022147ed4cf972ca7b" -uuid = "e409e4f3-bfea-5376-8464-e040bb5c01ab" -version = "0.4.7" - -[[deps.PolyLog]] -git-tree-sha1 = "4c1d0f01e381fe73fce9b31a96ea76b49762242f" -uuid = "85e3b03c-9856-11eb-0374-4dc1f8670e7f" -version = "2.6.0" -weakdeps = ["ChainRulesCore", "ForwardDiff"] - - [deps.PolyLog.extensions] - PolyLogChainRulesExt = "ChainRulesCore" - PolyLogForwardDiffExt = "ForwardDiff" - -[[deps.Polyester]] -deps = ["ArrayInterface", "BitTwiddlingConvenienceFunctions", "CPUSummary", "IfElse", "ManualMemory", "PolyesterWeave", "Static", "StaticArrayInterface", "StrideArraysCore", "ThreadingUtilities"] -git-tree-sha1 = "6f7cd22a802094d239824c57d94c8e2d0f7cfc7d" -uuid = "f517fe37-dbe3-4b94-8317-1923a5111588" -version = "0.7.18" - -[[deps.PolyesterWeave]] -deps = ["BitTwiddlingConvenienceFunctions", "CPUSummary", "IfElse", "Static", "ThreadingUtilities"] -git-tree-sha1 = "645bed98cd47f72f67316fd42fc47dee771aefcd" -uuid = "1d0040c9-8b98-4ee7-8388-3f51789ca0ad" -version = "0.2.2" - -[[deps.Polynomials]] -deps = ["LinearAlgebra", "OrderedCollections", "RecipesBase", "Requires", "Setfield", "SparseArrays"] -git-tree-sha1 = "972089912ba299fba87671b025cd0da74f5f54f7" -uuid = "f27b6e38-b328-58d1-80ce-0feddd5e7a45" -version = "4.1.0" - - [deps.Polynomials.extensions] - PolynomialsChainRulesCoreExt = "ChainRulesCore" - PolynomialsFFTWExt = "FFTW" - PolynomialsMakieExt = "Makie" - PolynomialsMutableArithmeticsExt = "MutableArithmetics" - - [deps.Polynomials.weakdeps] - ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" - FFTW = "7a1cc6ca-52ef-59f5-83cd-3a7055c09341" - Makie = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a" - MutableArithmetics = "d8a4904e-b15c-11e9-3269-09a3773c0cb0" - -[[deps.PositiveFactorizations]] -deps = ["LinearAlgebra"] -git-tree-sha1 = "17275485f373e6673f7e7f97051f703ed5b15b20" -uuid = "85a6dd25-e78a-55b7-8502-1745935b8125" -version = "0.2.4" - -[[deps.PreallocationTools]] -deps = ["Adapt", "ArrayInterface", "ForwardDiff"] -git-tree-sha1 = "2cc315bb7f6e4d59081bad744cdb911d6374fc7f" -uuid = "d236fae5-4411-538c-8e31-a6e3d9e00b46" -version = "0.4.29" - - [deps.PreallocationTools.extensions] - PreallocationToolsReverseDiffExt = "ReverseDiff" - PreallocationToolsSparseConnectivityTracerExt = "SparseConnectivityTracer" - - [deps.PreallocationTools.weakdeps] - ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" - SparseConnectivityTracer = "9f842d2f-2579-4b1d-911e-f412cf18a3f5" - -[[deps.PrecompileSignatures]] -git-tree-sha1 = "18ef344185f25ee9d51d80e179f8dad33dc48eb1" -uuid = "91cefc8d-f054-46dc-8f8c-26e11d7c5411" -version = "3.0.3" - -[[deps.PrecompileTools]] -deps = ["Preferences"] -git-tree-sha1 = "07a921781cab75691315adc645096ed5e370cb77" -uuid = "aea7be01-6a6a-4083-8856-8a6e6704d82a" -version = "1.3.3" - -[[deps.Preferences]] -deps = ["TOML"] -git-tree-sha1 = "0f27480397253da18fe2c12a4ba4eb9eb208bf3d" -uuid = "21216c6a-2e73-6563-6e65-726566657250" -version = "1.5.0" - -[[deps.PrettyTables]] -deps = ["Crayons", "LaTeXStrings", "Markdown", "PrecompileTools", "Printf", "REPL", "Reexport", "StringManipulation", "Tables"] -git-tree-sha1 = "6b8e2f0bae3f678811678065c09571c1619da219" -uuid = "08abe8d2-0d0c-5749-adfa-8a2ac140af0d" -version = "3.1.0" - -[[deps.Primes]] -deps = ["IntegerMathUtils"] -git-tree-sha1 = "25cdd1d20cd005b52fc12cb6be3f75faaf59bb9b" -uuid = "27ebfcd6-29c5-5fa9-bf4b-fb8fc14df3ae" -version = "0.5.7" - -[[deps.Printf]] -deps = ["Unicode"] -uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" -version = "1.11.0" - -[[deps.ProgressLogging]] -deps = ["Logging", "SHA", "UUIDs"] -git-tree-sha1 = "d95ed0324b0799843ac6f7a6a85e65fe4e5173f0" -uuid = "33c8b6b6-d38a-422a-b730-caa89a2f386c" -version = "0.1.5" - -[[deps.ProgressMeter]] -deps = ["Distributed", "Printf"] -git-tree-sha1 = "fbb92c6c56b34e1a2c4c36058f68f332bec840e7" -uuid = "92933f4c-e287-5a05-a399-4b506db050ca" -version = "1.11.0" - -[[deps.PtrArrays]] -git-tree-sha1 = "1d36ef11a9aaf1e8b74dacc6a731dd1de8fd493d" -uuid = "43287f4e-b6f4-7ad1-bb20-aadabca52c3d" -version = "1.3.0" - -[[deps.Qt6Base_jll]] -deps = ["Artifacts", "CompilerSupportLibraries_jll", "Fontconfig_jll", "Glib_jll", "JLLWrappers", "Libdl", "Libglvnd_jll", "OpenSSL_jll", "Vulkan_Loader_jll", "Xorg_libSM_jll", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Xorg_libxcb_jll", "Xorg_xcb_util_cursor_jll", "Xorg_xcb_util_image_jll", "Xorg_xcb_util_keysyms_jll", "Xorg_xcb_util_renderutil_jll", "Xorg_xcb_util_wm_jll", "Zlib_jll", "libinput_jll", "xkbcommon_jll"] -git-tree-sha1 = "34f7e5d2861083ec7596af8b8c092531facf2192" -uuid = "c0090381-4147-56d7-9ebc-da0b1113ec56" -version = "6.8.2+2" - -[[deps.Qt6Declarative_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Qt6Base_jll", "Qt6ShaderTools_jll"] -git-tree-sha1 = "da7adf145cce0d44e892626e647f9dcbe9cb3e10" -uuid = "629bc702-f1f5-5709-abd5-49b8460ea067" -version = "6.8.2+1" - -[[deps.Qt6ShaderTools_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Qt6Base_jll"] -git-tree-sha1 = "9eca9fc3fe515d619ce004c83c31ffd3f85c7ccf" -uuid = "ce943373-25bb-56aa-8eca-768745ed7b5a" -version = "6.8.2+1" - -[[deps.Qt6Wayland_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Qt6Base_jll", "Qt6Declarative_jll"] -git-tree-sha1 = "8f528b0851b5b7025032818eb5abbeb8a736f853" -uuid = "e99dba38-086e-5de3-a5b1-6e4c66e897c3" -version = "6.8.2+2" - -[[deps.QuadGK]] -deps = ["DataStructures", "LinearAlgebra"] -git-tree-sha1 = "9da16da70037ba9d701192e27befedefb91ec284" -uuid = "1fd47b50-473d-5c70-9696-f719f8f3bcdc" -version = "2.11.2" - - [deps.QuadGK.extensions] - QuadGKEnzymeExt = "Enzyme" - - [deps.QuadGK.weakdeps] - Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9" - -[[deps.QuasiMonteCarlo]] -deps = ["Accessors", "ConcreteStructs", "LatticeRules", "LinearAlgebra", "Primes", "Random", "Requires", "Sobol", "StatsBase"] -git-tree-sha1 = "cc086f8485bce77b6187141e1413c3b55f9a4341" -uuid = "8a4e6c94-4038-4cdc-81c3-7e6ffdb2a71b" -version = "0.3.3" -weakdeps = ["Distributions"] - - [deps.QuasiMonteCarlo.extensions] - QuasiMonteCarloDistributionsExt = "Distributions" - -[[deps.REPL]] -deps = ["InteractiveUtils", "JuliaSyntaxHighlighting", "Markdown", "Sockets", "StyledStrings", "Unicode"] -uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" -version = "1.11.0" - -[[deps.Random]] -deps = ["SHA"] -uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" -version = "1.11.0" - -[[deps.Random123]] -deps = ["Random", "RandomNumbers"] -git-tree-sha1 = "dbe5fd0b334694e905cb9fda73cd8554333c46e2" -uuid = "74087812-796a-5b5d-8853-05524746bad3" -version = "1.7.1" - -[[deps.RandomNumbers]] -deps = ["Random"] -git-tree-sha1 = "c6ec94d2aaba1ab2ff983052cf6a606ca5985902" -uuid = "e6cf234a-135c-5ec9-84dd-332b85af5143" -version = "1.6.0" - -[[deps.RangeArrays]] -git-tree-sha1 = "b9039e93773ddcfc828f12aadf7115b4b4d225f5" -uuid = "b3c3ace0-ae52-54e7-9d0b-2c1406fd6b9d" -version = "0.3.2" - -[[deps.Ratios]] -deps = ["Requires"] -git-tree-sha1 = "1342a47bf3260ee108163042310d26f2be5ec90b" -uuid = "c84ed2f1-dad5-54f0-aa8e-dbefe2724439" -version = "0.4.5" -weakdeps = ["FixedPointNumbers"] - - [deps.Ratios.extensions] - RatiosFixedPointNumbersExt = "FixedPointNumbers" - -[[deps.RealDot]] -deps = ["LinearAlgebra"] -git-tree-sha1 = "9f0a1b71baaf7650f4fa8a1d168c7fb6ee41f0c9" -uuid = "c1ae055f-0cd5-4b69-90a6-9a35b1a98df9" -version = "0.1.0" - -[[deps.RecipesBase]] -deps = ["PrecompileTools"] -git-tree-sha1 = "5c3d09cc4f31f5fc6af001c250bf1278733100ff" -uuid = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" -version = "1.3.4" - -[[deps.RecipesPipeline]] -deps = ["Dates", "NaNMath", "PlotUtils", "PrecompileTools", "RecipesBase"] -git-tree-sha1 = "45cf9fd0ca5839d06ef333c8201714e888486342" -uuid = "01d81517-befc-4cb6-b9ec-a95719d0359c" -version = "0.6.12" - -[[deps.RecursiveArrayTools]] -deps = ["Adapt", "ArrayInterface", "DocStringExtensions", "GPUArraysCore", "LinearAlgebra", "RecipesBase", "StaticArraysCore", "Statistics", "SymbolicIndexingInterface"] -git-tree-sha1 = "51bdb23afaaa551f923a0e990f7c44a4451a26f1" -uuid = "731186ca-8d62-57ce-b412-fbd966d074cd" -version = "3.39.0" - - [deps.RecursiveArrayTools.extensions] - RecursiveArrayToolsFastBroadcastExt = "FastBroadcast" - RecursiveArrayToolsForwardDiffExt = "ForwardDiff" - RecursiveArrayToolsKernelAbstractionsExt = "KernelAbstractions" - RecursiveArrayToolsMeasurementsExt = "Measurements" - RecursiveArrayToolsMonteCarloMeasurementsExt = "MonteCarloMeasurements" - RecursiveArrayToolsReverseDiffExt = ["ReverseDiff", "Zygote"] - RecursiveArrayToolsSparseArraysExt = ["SparseArrays"] - RecursiveArrayToolsStructArraysExt = "StructArrays" - RecursiveArrayToolsTablesExt = ["Tables"] - RecursiveArrayToolsTrackerExt = "Tracker" - RecursiveArrayToolsZygoteExt = "Zygote" - - [deps.RecursiveArrayTools.weakdeps] - FastBroadcast = "7034ab61-46d4-4ed7-9d0f-46aef9175898" - ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" - KernelAbstractions = "63c18a36-062a-441e-b654-da1e3ab1ce7c" - Measurements = "eff96d63-e80a-5855-80a2-b1b0885c5ab7" - MonteCarloMeasurements = "0987c9cc-fe09-11e8-30f0-b96dd679fdca" - ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" - SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" - StructArrays = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" - Tables = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" - Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" - Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f" - -[[deps.Reexport]] -git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" -uuid = "189a3867-3050-52da-a836-e630ba90ab69" -version = "1.2.2" - -[[deps.Referenceables]] -deps = ["Adapt"] -git-tree-sha1 = "02d31ad62838181c1a3a5fd23a1ce5914a643601" -uuid = "42d2dcc6-99eb-4e98-b66c-637b7d73030e" -version = "0.1.3" - -[[deps.RegistryInstances]] -deps = ["LazilyInitializedFields", "Pkg", "TOML", "Tar"] -git-tree-sha1 = "ffd19052caf598b8653b99404058fce14828be51" -uuid = "2792f1a3-b283-48e8-9a74-f99dce5104f3" -version = "0.1.0" - -[[deps.RelocatableFolders]] -deps = ["SHA", "Scratch"] -git-tree-sha1 = "ffdaf70d81cf6ff22c2b6e733c900c3321cab864" -uuid = "05181044-ff0b-4ac5-8273-598c1e38db00" -version = "1.0.1" - -[[deps.Requires]] -deps = ["UUIDs"] -git-tree-sha1 = "62389eeff14780bfe55195b7204c0d8738436d64" -uuid = "ae029012-a4dd-5104-9daa-d747884805df" -version = "1.3.1" - -[[deps.ResettableStacks]] -deps = ["StaticArrays"] -git-tree-sha1 = "256eeeec186fa7f26f2801732774ccf277f05db9" -uuid = "ae5879a3-cd67-5da8-be7f-38c6eb64a37b" -version = "1.1.1" - -[[deps.Rmath]] -deps = ["Random", "Rmath_jll"] -git-tree-sha1 = "5b3d50eb374cea306873b371d3f8d3915a018f0b" -uuid = "79098fc4-a85e-5d69-aa6a-4863f24498fa" -version = "0.9.0" - -[[deps.Rmath_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "58cdd8fb2201a6267e1db87ff148dd6c1dbd8ad8" -uuid = "f50d1b31-88e8-58de-be2c-1cc44531875f" -version = "0.5.1+0" - -[[deps.Roots]] -deps = ["Accessors", "CommonSolve", "Printf"] -git-tree-sha1 = "8a433b1ede5e9be9a7ba5b1cc6698daa8d718f1d" -uuid = "f2b01f46-fcfa-551c-844a-d8ac1e96c665" -version = "2.2.10" - - [deps.Roots.extensions] - RootsChainRulesCoreExt = "ChainRulesCore" - RootsForwardDiffExt = "ForwardDiff" - RootsIntervalRootFindingExt = "IntervalRootFinding" - RootsSymPyExt = "SymPy" - RootsSymPyPythonCallExt = "SymPyPythonCall" - RootsUnitfulExt = "Unitful" - - [deps.Roots.weakdeps] - ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" - ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" - IntervalRootFinding = "d2bf35a9-74e0-55ec-b149-d360ff49b807" - SymPy = "24249f21-da20-56a4-8eb1-6a02cf4ae2e6" - SymPyPythonCall = "bc8888f7-b21e-4b7c-a06a-5d9c9496438c" - Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" - -[[deps.RuntimeGeneratedFunctions]] -deps = ["ExprTools", "SHA", "Serialization"] -git-tree-sha1 = "86a8a8b783481e1ea6b9c91dd949cb32191f8ab4" -uuid = "7e49a35a-f44a-4d26-94aa-eba1b4ca6b47" -version = "0.5.15" - -[[deps.SCCNonlinearSolve]] -deps = ["CommonSolve", "PrecompileTools", "Reexport", "SciMLBase", "SymbolicIndexingInterface"] -git-tree-sha1 = "5595105cef621942aceb1aa546b883c79ccbfa8f" -uuid = "9dfe8606-65a1-4bb3-9748-cb89d1561431" -version = "1.4.0" - -[[deps.SHA]] -uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" -version = "0.7.0" - -[[deps.SIMDTypes]] -git-tree-sha1 = "330289636fb8107c5f32088d2741e9fd7a061a5c" -uuid = "94e857df-77ce-4151-89e5-788b33177be4" -version = "0.1.0" - -[[deps.SSMProblems]] -deps = ["AbstractMCMC", "Distributions", "Random"] -git-tree-sha1 = "5dd0431563784b468db06335ce8777653092d621" -uuid = "26aad666-b158-4e64-9d35-0e672562fa48" -version = "0.5.2" - -[[deps.SciMLBase]] -deps = ["ADTypes", "Accessors", "Adapt", "ArrayInterface", "CommonSolve", "ConstructionBase", "Distributed", "DocStringExtensions", "EnumX", "FunctionWrappersWrappers", "IteratorInterfaceExtensions", "LinearAlgebra", "Logging", "Markdown", "Moshi", "PrecompileTools", "Preferences", "Printf", "RecipesBase", "RecursiveArrayTools", "Reexport", "RuntimeGeneratedFunctions", "SciMLOperators", "SciMLStructures", "StaticArraysCore", "Statistics", "SymbolicIndexingInterface"] -git-tree-sha1 = "1a1b2ed5178814d32374d98f808163c24d47f1d8" -uuid = "0bca4576-84f4-4d90-8ffe-ffa030f20462" -version = "2.110.0" - - [deps.SciMLBase.extensions] - SciMLBaseChainRulesCoreExt = "ChainRulesCore" - SciMLBaseMLStyleExt = "MLStyle" - SciMLBaseMakieExt = "Makie" - SciMLBasePartialFunctionsExt = "PartialFunctions" - SciMLBasePyCallExt = "PyCall" - SciMLBasePythonCallExt = "PythonCall" - SciMLBaseRCallExt = "RCall" - SciMLBaseZygoteExt = ["Zygote", "ChainRulesCore"] - - [deps.SciMLBase.weakdeps] - ChainRules = "082447d4-558c-5d27-93f4-14fc19e9eca2" - ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" - MLStyle = "d8e11817-5142-5d16-987a-aa16d5891078" - Makie = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a" - PartialFunctions = "570af359-4316-4cb7-8c74-252c00c2016b" - PyCall = "438e738f-606a-5dbb-bf0a-cddfbfd45ab0" - PythonCall = "6099a3de-0909-46bc-b1f4-468b9a2dfc0d" - RCall = "6f49c342-dc21-5d91-9882-a32aef131414" - Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f" - -[[deps.SciMLJacobianOperators]] -deps = ["ADTypes", "ArrayInterface", "ConcreteStructs", "ConstructionBase", "DifferentiationInterface", "FastClosures", "LinearAlgebra", "SciMLBase", "SciMLOperators"] -git-tree-sha1 = "a273b291c90909ba6fe08402dd68e09aae423008" -uuid = "19f34311-ddf3-4b8b-af20-060888a46c0e" -version = "0.1.11" - -[[deps.SciMLLogging]] -deps = ["Logging", "LoggingExtras", "Preferences"] -git-tree-sha1 = "5a026f5549ad167cda34c67b62f8d3dc55754da3" -uuid = "a6db7da4-7206-11f0-1eab-35f2a5dbe1d1" -version = "1.3.1" - -[[deps.SciMLOperators]] -deps = ["Accessors", "ArrayInterface", "DocStringExtensions", "LinearAlgebra", "MacroTools"] -git-tree-sha1 = "c1053ba68ede9e4005fc925dd4e8723fcd96eef8" -uuid = "c0aeaf25-5076-4817-a8d5-81caf7dfa961" -version = "1.9.0" -weakdeps = ["SparseArrays", "StaticArraysCore"] - - [deps.SciMLOperators.extensions] - SciMLOperatorsSparseArraysExt = "SparseArrays" - SciMLOperatorsStaticArraysCoreExt = "StaticArraysCore" - -[[deps.SciMLPublic]] -git-tree-sha1 = "ed647f161e8b3f2973f24979ec074e8d084f1bee" -uuid = "431bcebd-1456-4ced-9d72-93c2757fff0b" -version = "1.0.0" - -[[deps.SciMLStructures]] -deps = ["ArrayInterface"] -git-tree-sha1 = "566c4ed301ccb2a44cbd5a27da5f885e0ed1d5df" -uuid = "53ae85a6-f571-4167-b2af-e1d143709226" -version = "1.7.0" - -[[deps.ScientificTypesBase]] -git-tree-sha1 = "a8e18eb383b5ecf1b5e6fc237eb39255044fd92b" -uuid = "30f210dd-8aff-4c5f-94ba-8e64358c1161" -version = "3.0.0" - -[[deps.Scratch]] -deps = ["Dates"] -git-tree-sha1 = "9b81b8393e50b7d4e6d0a9f14e192294d3b7c109" -uuid = "6c6a2e73-6563-6170-7368-637461726353" -version = "1.3.0" - -[[deps.SentinelArrays]] -deps = ["Dates", "Random"] -git-tree-sha1 = "712fb0231ee6f9120e005ccd56297abbc053e7e0" -uuid = "91c51154-3ec4-41a3-a24f-3f23e20d615c" -version = "1.4.8" - -[[deps.Serialization]] -uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" -version = "1.11.0" - -[[deps.Setfield]] -deps = ["ConstructionBase", "Future", "MacroTools", "StaticArraysCore"] -git-tree-sha1 = "c5391c6ace3bc430ca630251d02ea9687169ca68" -uuid = "efcf1570-3423-57d1-acb7-fd33fddbac46" -version = "1.1.2" - -[[deps.SharedArrays]] -deps = ["Distributed", "Mmap", "Random", "Serialization"] -uuid = "1a1011a3-84de-559e-8e89-a11a2f7dc383" -version = "1.11.0" - -[[deps.Showoff]] -deps = ["Dates", "Grisu"] -git-tree-sha1 = "91eddf657aca81df9ae6ceb20b959ae5653ad1de" -uuid = "992d4aef-0814-514b-bc4d-f2e9a6c4116f" -version = "1.0.3" - -[[deps.SimpleBufferStream]] -git-tree-sha1 = "f305871d2f381d21527c770d4788c06c097c9bc1" -uuid = "777ac1f9-54b0-4bf8-805c-2214025038e7" -version = "1.2.0" - -[[deps.SimpleNonlinearSolve]] -deps = ["ADTypes", "ArrayInterface", "BracketingNonlinearSolve", "CommonSolve", "ConcreteStructs", "DifferentiationInterface", "FastClosures", "FiniteDiff", "ForwardDiff", "LineSearch", "LinearAlgebra", "MaybeInplace", "NonlinearSolveBase", "PrecompileTools", "Reexport", "SciMLBase", "Setfield", "StaticArraysCore"] -git-tree-sha1 = "09d986e27a606f172c5b6cffbd8b8b2f10bf1c75" -uuid = "727e6d20-b764-4bd8-a329-72de5adea6c7" -version = "2.7.0" - - [deps.SimpleNonlinearSolve.extensions] - SimpleNonlinearSolveChainRulesCoreExt = "ChainRulesCore" - SimpleNonlinearSolveDiffEqBaseExt = "DiffEqBase" - SimpleNonlinearSolveReverseDiffExt = "ReverseDiff" - SimpleNonlinearSolveTrackerExt = "Tracker" - - [deps.SimpleNonlinearSolve.weakdeps] - ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" - DiffEqBase = "2b5f629d-d688-5b77-993f-72d75c75574e" - ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" - Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" - -[[deps.SimpleTraits]] -deps = ["InteractiveUtils", "MacroTools"] -git-tree-sha1 = "be8eeac05ec97d379347584fa9fe2f5f76795bcb" -uuid = "699a6c99-e7fa-54fc-8d76-47d257e15c1d" -version = "0.9.5" - -[[deps.SimpleUnPack]] -git-tree-sha1 = "58e6353e72cde29b90a69527e56df1b5c3d8c437" -uuid = "ce78b400-467f-4804-87d8-8f486da07d0a" -version = "1.1.0" - -[[deps.Sobol]] -deps = ["DelimitedFiles", "Random"] -git-tree-sha1 = "5a74ac22a9daef23705f010f72c81d6925b19df8" -uuid = "ed01d8cd-4d21-5b2a-85b4-cc3bdc58bad4" -version = "1.5.0" - -[[deps.Sockets]] -uuid = "6462fe0b-24de-5631-8697-dd941f90decc" -version = "1.11.0" - -[[deps.SortingAlgorithms]] -deps = ["DataStructures"] -git-tree-sha1 = "64d974c2e6fdf07f8155b5b2ca2ffa9069b608d9" -uuid = "a2af1166-a08f-5f64-846c-94a0d3cef48c" -version = "1.2.2" - -[[deps.SparseArrays]] -deps = ["Libdl", "LinearAlgebra", "Random", "Serialization", "SuiteSparse_jll"] -uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" -version = "1.12.0" - -[[deps.SparseConnectivityTracer]] -deps = ["ADTypes", "DocStringExtensions", "FillArrays", "LinearAlgebra", "Random", "SparseArrays"] -git-tree-sha1 = "182990067a09adf950274f97f38f68c76f81d2d0" -uuid = "9f842d2f-2579-4b1d-911e-f412cf18a3f5" -version = "0.6.21" - - [deps.SparseConnectivityTracer.extensions] - SparseConnectivityTracerDataInterpolationsExt = "DataInterpolations" - SparseConnectivityTracerLogExpFunctionsExt = "LogExpFunctions" - SparseConnectivityTracerNNlibExt = "NNlib" - SparseConnectivityTracerNaNMathExt = "NaNMath" - SparseConnectivityTracerSpecialFunctionsExt = "SpecialFunctions" - - [deps.SparseConnectivityTracer.weakdeps] - DataInterpolations = "82cc6244-b520-54b8-b5a6-8a565e85f1d0" - LogExpFunctions = "2ab3a3ac-af41-5b50-aa03-7779005ae688" - NNlib = "872c559c-99b0-510c-b3b7-b6c96a88d5cd" - NaNMath = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" - SpecialFunctions = "276daf66-3868-5448-9aa4-cd146d93841b" - -[[deps.SparseInverseSubset]] -deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"] -git-tree-sha1 = "52962839426b75b3021296f7df242e40ecfc0852" -uuid = "dc90abb0-5640-4711-901d-7e5b23a2fada" -version = "0.1.2" - -[[deps.SparseMatrixColorings]] -deps = ["ADTypes", "DocStringExtensions", "LinearAlgebra", "PrecompileTools", "Random", "SparseArrays"] -git-tree-sha1 = "d3f3b7bb8a561b5ff20ee7cf9574841ee4e4e137" -uuid = "0a514795-09f3-496d-8182-132a7b665d35" -version = "0.4.22" - - [deps.SparseMatrixColorings.extensions] - SparseMatrixColoringsCUDAExt = "CUDA" - SparseMatrixColoringsCliqueTreesExt = "CliqueTrees" - SparseMatrixColoringsColorsExt = "Colors" - - [deps.SparseMatrixColorings.weakdeps] - CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" - CliqueTrees = "60701a23-6482-424a-84db-faee86b9b1f8" - Colors = "5ae59095-9a9b-59fe-a467-6f913c188581" - -[[deps.SpecialFunctions]] -deps = ["IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"] -git-tree-sha1 = "f2685b435df2613e25fc10ad8c26dddb8640f547" -uuid = "276daf66-3868-5448-9aa4-cd146d93841b" -version = "2.6.1" -weakdeps = ["ChainRulesCore"] - - [deps.SpecialFunctions.extensions] - SpecialFunctionsChainRulesCoreExt = "ChainRulesCore" - -[[deps.SplittablesBase]] -deps = ["Setfield", "Test"] -git-tree-sha1 = "e08a62abc517eb79667d0a29dc08a3b589516bb5" -uuid = "171d559e-b47b-412a-8079-5efa626c420e" -version = "0.1.15" - -[[deps.StableRNGs]] -deps = ["Random"] -git-tree-sha1 = "95af145932c2ed859b63329952ce8d633719f091" -uuid = "860ef19b-820b-49d6-a774-d7a799459cd3" -version = "1.0.3" - -[[deps.StateSpaceSets]] -deps = ["Distances", "LinearAlgebra", "Neighborhood", "Random", "StaticArraysCore", "Statistics"] -git-tree-sha1 = "a31b39a45de7bfabf30c0d17eed5a038ddac4b06" -uuid = "40b095a5-5852-4c12-98c7-d43bf788e795" -version = "2.5.2" - -[[deps.Static]] -deps = ["CommonWorldInvalidations", "IfElse", "PrecompileTools", "SciMLPublic"] -git-tree-sha1 = "49440414711eddc7227724ae6e570c7d5559a086" -uuid = "aedffcd0-7271-4cad-89d0-dc628f76c6d3" -version = "1.3.1" - -[[deps.StaticArrayInterface]] -deps = ["ArrayInterface", "Compat", "IfElse", "LinearAlgebra", "PrecompileTools", "Static"] -git-tree-sha1 = "96381d50f1ce85f2663584c8e886a6ca97e60554" -uuid = "0d7ed370-da01-4f52-bd93-41d350b8b718" -version = "1.8.0" -weakdeps = ["OffsetArrays", "StaticArrays"] - - [deps.StaticArrayInterface.extensions] - StaticArrayInterfaceOffsetArraysExt = "OffsetArrays" - StaticArrayInterfaceStaticArraysExt = "StaticArrays" - -[[deps.StaticArrays]] -deps = ["LinearAlgebra", "PrecompileTools", "Random", "StaticArraysCore"] -git-tree-sha1 = "b8693004b385c842357406e3af647701fe783f98" -uuid = "90137ffa-7385-5640-81b9-e52037218182" -version = "1.9.15" -weakdeps = ["ChainRulesCore", "Statistics"] - - [deps.StaticArrays.extensions] - StaticArraysChainRulesCoreExt = "ChainRulesCore" - StaticArraysStatisticsExt = "Statistics" - -[[deps.StaticArraysCore]] -git-tree-sha1 = "6ab403037779dae8c514bad259f32a447262455a" -uuid = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" -version = "1.4.4" - -[[deps.StatisticalTraits]] -deps = ["ScientificTypesBase"] -git-tree-sha1 = "89f86d9376acd18a1a4fbef66a56335a3a7633b8" -uuid = "64bff920-2084-43da-a3e6-9bb72801c0c9" -version = "3.5.0" - -[[deps.Statistics]] -deps = ["LinearAlgebra"] -git-tree-sha1 = "ae3bb1eb3bba077cd276bc5cfc337cc65c3075c0" -uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" -version = "1.11.1" -weakdeps = ["SparseArrays"] - - [deps.Statistics.extensions] - SparseArraysExt = ["SparseArrays"] - -[[deps.StatsAPI]] -deps = ["LinearAlgebra"] -git-tree-sha1 = "9d72a13a3f4dd3795a195ac5a44d7d6ff5f552ff" -uuid = "82ae8749-77ed-4fe6-ae5f-f523153014b0" -version = "1.7.1" - -[[deps.StatsBase]] -deps = ["AliasTables", "DataAPI", "DataStructures", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"] -git-tree-sha1 = "a136f98cefaf3e2924a66bd75173d1c891ab7453" -uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" -version = "0.34.7" - -[[deps.StatsFuns]] -deps = ["HypergeometricFunctions", "IrrationalConstants", "LogExpFunctions", "Reexport", "Rmath", "SpecialFunctions"] -git-tree-sha1 = "91f091a8716a6bb38417a6e6f274602a19aaa685" -uuid = "4c63d2b9-4356-54db-8cca-17b64c39e42c" -version = "1.5.2" -weakdeps = ["ChainRulesCore", "InverseFunctions"] - - [deps.StatsFuns.extensions] - StatsFunsChainRulesCoreExt = "ChainRulesCore" - StatsFunsInverseFunctionsExt = "InverseFunctions" - -[[deps.StatsPlots]] -deps = ["AbstractFFTs", "Clustering", "DataStructures", "Distributions", "Interpolations", "KernelDensity", "LinearAlgebra", "MultivariateStats", "NaNMath", "Observables", "Plots", "RecipesBase", "RecipesPipeline", "Reexport", "StatsBase", "TableOperations", "Tables", "Widgets"] -git-tree-sha1 = "88cf3587711d9ad0a55722d339a013c4c56c5bbc" -uuid = "f3b207a7-027a-5e70-b257-86293d7955fd" -version = "0.15.8" - -[[deps.SteadyStateDiffEq]] -deps = ["ConcreteStructs", "DiffEqBase", "DiffEqCallbacks", "LinearAlgebra", "NonlinearSolveBase", "Reexport", "SciMLBase"] -git-tree-sha1 = "1919936d42482832a4b5d0b678513ad6756c6f00" -uuid = "9672c7b4-1e72-59bd-8a11-6ac3964bc41f" -version = "2.6.0" - -[[deps.StochasticDiffEq]] -deps = ["ADTypes", "Adapt", "ArrayInterface", "DataStructures", "DiffEqBase", "DiffEqNoiseProcess", "DocStringExtensions", "FastPower", "FiniteDiff", "ForwardDiff", "JumpProcesses", "LevyArea", "LinearAlgebra", "Logging", "MuladdMacro", "NLsolve", "OrdinaryDiffEqCore", "OrdinaryDiffEqDifferentiation", "OrdinaryDiffEqNonlinearSolve", "Random", "RandomNumbers", "RecursiveArrayTools", "Reexport", "SciMLBase", "SciMLOperators", "SparseArrays", "StaticArrays", "UnPack"] -git-tree-sha1 = "c3a55a2a1e180e249a0550d30a58c700487aa7ef" -uuid = "789caeaf-c7a9-5a7d-9973-96adeb23e2a0" -version = "6.81.0" - -[[deps.StrideArraysCore]] -deps = ["ArrayInterface", "CloseOpenIntervals", "IfElse", "LayoutPointers", "LinearAlgebra", "ManualMemory", "SIMDTypes", "Static", "StaticArrayInterface", "ThreadingUtilities"] -git-tree-sha1 = "83151ba8065a73f53ca2ae98bc7274d817aa30f2" -uuid = "7792a7ef-975c-4747-a70f-980b88e8d1da" -version = "0.5.8" - -[[deps.StringManipulation]] -deps = ["PrecompileTools"] -git-tree-sha1 = "725421ae8e530ec29bcbdddbe91ff8053421d023" -uuid = "892a3eda-7b42-436c-8928-eab12a02cf0e" -version = "0.4.1" - -[[deps.StructArrays]] -deps = ["ConstructionBase", "DataAPI", "Tables"] -git-tree-sha1 = "a2c37d815bf00575332b7bd0389f771cb7987214" -uuid = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" -version = "0.7.2" - - [deps.StructArrays.extensions] - StructArraysAdaptExt = "Adapt" - StructArraysGPUArraysCoreExt = ["GPUArraysCore", "KernelAbstractions"] - StructArraysLinearAlgebraExt = "LinearAlgebra" - StructArraysSparseArraysExt = "SparseArrays" - StructArraysStaticArraysExt = "StaticArrays" - - [deps.StructArrays.weakdeps] - Adapt = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" - GPUArraysCore = "46192b85-c4d5-4398-a991-12ede77f4527" - KernelAbstractions = "63c18a36-062a-441e-b654-da1e3ab1ce7c" - LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" - SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" - StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" - -[[deps.StyledStrings]] -uuid = "f489334b-da3d-4c2e-b8f0-e476e12c162b" -version = "1.11.0" - -[[deps.SuiteSparse]] -deps = ["Libdl", "LinearAlgebra", "Serialization", "SparseArrays"] -uuid = "4607b0f0-06f3-5cda-b6b1-a6196a1729e9" - -[[deps.SuiteSparse_jll]] -deps = ["Artifacts", "Libdl", "libblastrampoline_jll"] -uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c" -version = "7.8.3+2" - -[[deps.Sundials]] -deps = ["CEnum", "DataStructures", "DiffEqBase", "Libdl", "LinearAlgebra", "Logging", "PrecompileTools", "Reexport", "SciMLBase", "SparseArrays", "Sundials_jll"] -git-tree-sha1 = "7c7a7ee705724b3c80d5451ac49779db36c6f758" -uuid = "c3572dad-4567-51f8-b174-8c6c989267f4" -version = "4.28.0" - -[[deps.Sundials_jll]] -deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "SuiteSparse_jll", "libblastrampoline_jll"] -git-tree-sha1 = "91db7ed92c66f81435fe880947171f1212936b14" -uuid = "fb77eaff-e24c-56d4-86b1-d163f2edb164" -version = "5.2.3+0" - -[[deps.SymbolicIndexingInterface]] -deps = ["Accessors", "ArrayInterface", "RuntimeGeneratedFunctions", "StaticArraysCore"] -git-tree-sha1 = "94c58884e013efff548002e8dc2fdd1cb74dfce5" -uuid = "2efcf032-c050-4f8e-a9bb-153293bab1f5" -version = "0.3.46" -weakdeps = ["PrettyTables"] - - [deps.SymbolicIndexingInterface.extensions] - SymbolicIndexingInterfacePrettyTablesExt = "PrettyTables" - -[[deps.SymbolicLimits]] -deps = ["SymbolicUtils"] -git-tree-sha1 = "f75c7deb7e11eea72d2c1ea31b24070b713ba061" -uuid = "19f23fe9-fdab-4a78-91af-e7b7767979c3" -version = "0.2.3" - -[[deps.SymbolicUtils]] -deps = ["AbstractTrees", "ArrayInterface", "Bijections", "ChainRulesCore", "Combinatorics", "ConstructionBase", "DataStructures", "DocStringExtensions", "DynamicPolynomials", "ExproniconLite", "LinearAlgebra", "MultivariatePolynomials", "NaNMath", "Setfield", "SparseArrays", "SpecialFunctions", "StaticArrays", "SymbolicIndexingInterface", "TaskLocalValues", "TermInterface", "TimerOutputs", "Unityper"] -git-tree-sha1 = "a85b4262a55dbd1af39bb6facf621d79ca6a322d" -uuid = "d1185830-fcd6-423d-90d6-eec64667417b" -version = "3.32.0" - - [deps.SymbolicUtils.extensions] - SymbolicUtilsLabelledArraysExt = "LabelledArrays" - SymbolicUtilsReverseDiffExt = "ReverseDiff" - - [deps.SymbolicUtils.weakdeps] - LabelledArrays = "2ee39098-c373-598a-b85f-a56591580800" - ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" - -[[deps.Symbolics]] -deps = ["ADTypes", "ArrayInterface", "Bijections", "CommonWorldInvalidations", "ConstructionBase", "DataStructures", "DiffRules", "Distributions", "DocStringExtensions", "DomainSets", "DynamicPolynomials", "LaTeXStrings", "Latexify", "Libdl", "LinearAlgebra", "LogExpFunctions", "MacroTools", "Markdown", "NaNMath", "OffsetArrays", "PrecompileTools", "Primes", "RecipesBase", "Reexport", "RuntimeGeneratedFunctions", "SciMLBase", "SciMLPublic", "Setfield", "SparseArrays", "SpecialFunctions", "StaticArraysCore", "SymbolicIndexingInterface", "SymbolicLimits", "SymbolicUtils", "TermInterface"] -git-tree-sha1 = "8206e177903a41519145f577cb7f3793f3b7c960" -uuid = "0c5d862f-8b57-4792-8d23-62f2024744c7" -version = "6.57.0" - - [deps.Symbolics.extensions] - SymbolicsD3TreesExt = "D3Trees" - SymbolicsForwardDiffExt = "ForwardDiff" - SymbolicsGroebnerExt = "Groebner" - SymbolicsLuxExt = "Lux" - SymbolicsNemoExt = "Nemo" - SymbolicsPreallocationToolsExt = ["PreallocationTools", "ForwardDiff"] - SymbolicsSymPyExt = "SymPy" - SymbolicsSymPyPythonCallExt = "SymPyPythonCall" - - [deps.Symbolics.weakdeps] - D3Trees = "e3df1716-f71e-5df9-9e2d-98e193103c45" - ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" - Groebner = "0b43b601-686d-58a3-8a1c-6623616c7cd4" - Lux = "b2108857-7c20-44ae-9111-449ecde12c47" - Nemo = "2edaba10-b0f1-5616-af89-8c11ac63239a" - PreallocationTools = "d236fae5-4411-538c-8e31-a6e3d9e00b46" - SymPy = "24249f21-da20-56a4-8eb1-6a02cf4ae2e6" - SymPyPythonCall = "bc8888f7-b21e-4b7c-a06a-5d9c9496438c" - -[[deps.TOML]] -deps = ["Dates"] -uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" -version = "1.0.3" - -[[deps.TableOperations]] -deps = ["SentinelArrays", "Tables", "Test"] -git-tree-sha1 = "e383c87cf2a1dc41fa30c093b2a19877c83e1bc1" -uuid = "ab02a1b2-a7df-11e8-156e-fb1833f50b87" -version = "1.2.0" - -[[deps.TableTraits]] -deps = ["IteratorInterfaceExtensions"] -git-tree-sha1 = "c06b2f539df1c6efa794486abfb6ed2022561a39" -uuid = "3783bdb8-4a98-5b6b-af9a-565f29a5fe9c" -version = "1.0.1" - -[[deps.Tables]] -deps = ["DataAPI", "DataValueInterfaces", "IteratorInterfaceExtensions", "OrderedCollections", "TableTraits"] -git-tree-sha1 = "f2c1efbc8f3a609aadf318094f8fc5204bdaf344" -uuid = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" -version = "1.12.1" - -[[deps.Tar]] -deps = ["ArgTools", "SHA"] -uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" -version = "1.10.0" - -[[deps.TaskLocalValues]] -git-tree-sha1 = "67e469338d9ce74fc578f7db1736a74d93a49eb8" -uuid = "ed4db957-447d-4319-bfb6-7fa9ae7ecf34" -version = "0.1.3" - -[[deps.TaylorSeries]] -deps = ["LinearAlgebra", "Markdown", "SparseArrays"] -git-tree-sha1 = "dbb2073ed3d0b356405abb7562bfb3326f9cb5fe" -uuid = "6aa5eb33-94cf-58f4-a9d0-e4b2c4fc25ea" -version = "0.20.9" - - [deps.TaylorSeries.extensions] - TaylorSeriesIAExt = "IntervalArithmetic" - TaylorSeriesJLD2Ext = "JLD2" - TaylorSeriesRATExt = "RecursiveArrayTools" - TaylorSeriesSAExt = "StaticArrays" - - [deps.TaylorSeries.weakdeps] - IntervalArithmetic = "d1acc4aa-44c8-5952-acd4-ba5d80a2a253" - JLD2 = "033835bb-8acc-5ee8-8aae-3f567f8a3819" - RecursiveArrayTools = "731186ca-8d62-57ce-b412-fbd966d074cd" - StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" - -[[deps.TensorCore]] -deps = ["LinearAlgebra"] -git-tree-sha1 = "1feb45f88d133a655e001435632f019a9a1bcdb6" -uuid = "62fd8b95-f654-4bbd-a8a5-9c27f68ccd50" -version = "0.1.1" - -[[deps.TermInterface]] -git-tree-sha1 = "d673e0aca9e46a2f63720201f55cc7b3e7169b16" -uuid = "8ea1fca8-c5ef-4a55-8b96-4e9afe9c9a3c" -version = "2.0.0" - -[[deps.TerminalLoggers]] -deps = ["LeftChildRightSiblingTrees", "Logging", "Markdown", "Printf", "ProgressLogging", "UUIDs"] -git-tree-sha1 = "f133fab380933d042f6796eda4e130272ba520ca" -uuid = "5d786b92-1e48-4d6f-9151-6b4477ca9bed" -version = "0.1.7" - -[[deps.Test]] -deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] -uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" -version = "1.11.0" - -[[deps.TestItems]] -git-tree-sha1 = "42fd9023fef18b9b78c8343a4e2f3813ffbcefcb" -uuid = "1c621080-faea-4a02-84b6-bbd5e436b8fe" -version = "1.0.0" - -[[deps.ThreadingUtilities]] -deps = ["ManualMemory"] -git-tree-sha1 = "d969183d3d244b6c33796b5ed01ab97328f2db85" -uuid = "8290d209-cae3-49c0-8002-c8c24d57dab5" -version = "0.5.5" - -[[deps.ThreadsX]] -deps = ["Accessors", "ArgCheck", "BangBang", "ConstructionBase", "InitialValues", "MicroCollections", "Referenceables", "SplittablesBase", "Transducers"] -git-tree-sha1 = "70bd8244f4834d46c3d68bd09e7792d8f571ef04" -uuid = "ac1d9e8a-700a-412c-b207-f0111f4b6c0d" -version = "0.1.12" - -[[deps.TimerOutputs]] -deps = ["ExprTools", "Printf"] -git-tree-sha1 = "3748bd928e68c7c346b52125cf41fff0de6937d0" -uuid = "a759f4b9-e2f1-59dc-863e-4aeb61b1ea8f" -version = "0.5.29" - - [deps.TimerOutputs.extensions] - FlameGraphsExt = "FlameGraphs" - - [deps.TimerOutputs.weakdeps] - FlameGraphs = "08572546-2f56-4bcf-ba4e-bab62c3a3f89" - -[[deps.TranscodingStreams]] -git-tree-sha1 = "0c45878dcfdcfa8480052b6ab162cdd138781742" -uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa" -version = "0.11.3" - -[[deps.Transducers]] -deps = ["Accessors", "ArgCheck", "BangBang", "Baselet", "CompositionsBase", "ConstructionBase", "DefineSingletons", "Distributed", "InitialValues", "Logging", "Markdown", "MicroCollections", "SplittablesBase", "Tables"] -git-tree-sha1 = "4aa1fdf6c1da74661f6f5d3edfd96648321dade9" -uuid = "28d57a85-8fef-5791-bfe6-a80928e7c999" -version = "0.4.85" - - [deps.Transducers.extensions] - TransducersAdaptExt = "Adapt" - TransducersBlockArraysExt = "BlockArrays" - TransducersDataFramesExt = "DataFrames" - TransducersLazyArraysExt = "LazyArrays" - TransducersOnlineStatsBaseExt = "OnlineStatsBase" - TransducersReferenceablesExt = "Referenceables" - - [deps.Transducers.weakdeps] - Adapt = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" - BlockArrays = "8e7c35d0-a365-5155-bbbb-fb81a777f24e" - DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" - LazyArrays = "5078a376-72f3-5289-bfd5-ec5146d43c02" - OnlineStatsBase = "925886fa-5bf2-5e8e-b522-a9147a512338" - Referenceables = "42d2dcc6-99eb-4e98-b66c-637b7d73030e" - -[[deps.Trapz]] -git-tree-sha1 = "79eb0ed763084a3e7de81fe1838379ac6a23b6a0" -uuid = "592b5752-818d-11e9-1e9a-2b8ca4a44cd1" -version = "2.0.3" - -[[deps.Tricks]] -git-tree-sha1 = "372b90fe551c019541fafc6ff034199dc19c8436" -uuid = "410a4b4d-49e4-4fbc-ab6d-cb71b17b3775" -version = "0.1.12" - -[[deps.TruncatedStacktraces]] -deps = ["InteractiveUtils", "MacroTools", "Preferences"] -git-tree-sha1 = "ea3e54c2bdde39062abf5a9758a23735558705e1" -uuid = "781d530d-4396-4725-bb49-402e4bee1e77" -version = "1.4.0" - -[[deps.Turing]] -deps = ["ADTypes", "AbstractMCMC", "AbstractPPL", "Accessors", "AdvancedHMC", "AdvancedMH", "AdvancedPS", "AdvancedVI", "BangBang", "Bijectors", "Compat", "DataStructures", "Distributions", "DistributionsAD", "DocStringExtensions", "DynamicPPL", "EllipticalSliceSampling", "ForwardDiff", "Libtask", "LinearAlgebra", "LogDensityProblems", "MCMCChains", "NamedArrays", "Optimization", "OptimizationOptimJL", "OrderedCollections", "Printf", "Random", "Reexport", "SciMLBase", "SpecialFunctions", "Statistics", "StatsAPI", "StatsBase", "StatsFuns"] -git-tree-sha1 = "3062ce6a48bd5faf5a82a416b55e8d58da44794a" -uuid = "fce5fe82-541a-59a6-adf8-730c64b5f9a0" -version = "0.41.0" - - [deps.Turing.extensions] - TuringDynamicHMCExt = "DynamicHMC" - TuringOptimExt = ["Optim", "AbstractPPL"] - - [deps.Turing.weakdeps] - DynamicHMC = "bbc10e6e-7c05-544b-b16e-64fede858acb" - Optim = "429524aa-4258-5aef-a3af-852621145aeb" - -[[deps.URIs]] -git-tree-sha1 = "bef26fb046d031353ef97a82e3fdb6afe7f21b1a" -uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" -version = "1.6.1" - -[[deps.UUIDs]] -deps = ["Random", "SHA"] -uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" -version = "1.11.0" - -[[deps.UnPack]] -git-tree-sha1 = "387c1f73762231e86e0c9c5443ce3b4a0a9a0c2b" -uuid = "3a884ed6-31ef-47d7-9d2a-63182c4928ed" -version = "1.0.2" - -[[deps.Unicode]] -uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" -version = "1.11.0" - -[[deps.UnicodeFun]] -deps = ["REPL"] -git-tree-sha1 = "53915e50200959667e78a92a418594b428dffddf" -uuid = "1cfade01-22cf-5700-b092-accc4b62d6e1" -version = "0.4.1" - -[[deps.Unitful]] -deps = ["Dates", "LinearAlgebra", "Random"] -git-tree-sha1 = "83360bda12f61c250835830cc40b64f487cc2230" -uuid = "1986cc42-f94f-5a68-af5c-568840ba703d" -version = "1.25.1" -weakdeps = ["ConstructionBase", "ForwardDiff", "InverseFunctions", "LaTeXStrings", "Latexify", "Printf"] - - [deps.Unitful.extensions] - ConstructionBaseUnitfulExt = "ConstructionBase" - ForwardDiffExt = "ForwardDiff" - InverseFunctionsUnitfulExt = "InverseFunctions" - LatexifyExt = ["Latexify", "LaTeXStrings"] - PrintfExt = "Printf" - -[[deps.Unityper]] -deps = ["ConstructionBase"] -git-tree-sha1 = "25008b734a03736c41e2a7dc314ecb95bd6bbdb0" -uuid = "a7c27f48-0311-42f6-a7f8-2c11e75eb415" -version = "0.1.6" - -[[deps.Unzip]] -git-tree-sha1 = "ca0969166a028236229f63514992fc073799bb78" -uuid = "41fe7b60-77ed-43a1-b4f0-825fd5a5650d" -version = "0.2.0" - -[[deps.Vulkan_Loader_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Wayland_jll", "Xorg_libX11_jll", "Xorg_libXrandr_jll", "xkbcommon_jll"] -git-tree-sha1 = "2f0486047a07670caad3a81a075d2e518acc5c59" -uuid = "a44049a8-05dd-5a78-86c9-5fde0876e88c" -version = "1.3.243+0" - -[[deps.Wavelets]] -deps = ["DSP", "FFTW", "LinearAlgebra", "Reexport", "SpecialFunctions", "Statistics"] -git-tree-sha1 = "d0ec97a100abbe47a5e9a02361841da49cce6029" -uuid = "29a6e085-ba6d-5f35-a997-948ac2efa89a" -version = "0.10.1" - -[[deps.Wayland_jll]] -deps = ["Artifacts", "EpollShim_jll", "Expat_jll", "JLLWrappers", "Libdl", "Libffi_jll"] -git-tree-sha1 = "96478df35bbc2f3e1e791bc7a3d0eeee559e60e9" -uuid = "a2964d1f-97da-50d4-b82a-358c7fce9d89" -version = "1.24.0+0" - -[[deps.Widgets]] -deps = ["Colors", "Dates", "Observables", "OrderedCollections"] -git-tree-sha1 = "e9aeb174f95385de31e70bd15fa066a505ea82b9" -uuid = "cc8bc4a8-27d6-5769-a93b-9d913e69aa62" -version = "0.6.7" - -[[deps.WoodburyMatrices]] -deps = ["LinearAlgebra", "SparseArrays"] -git-tree-sha1 = "c1a7aa6219628fcd757dede0ca95e245c5cd9511" -uuid = "efce3f68-66dc-5838-9240-27a6d6f5f9b6" -version = "1.0.0" - -[[deps.XZ_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "fee71455b0aaa3440dfdd54a9a36ccef829be7d4" -uuid = "ffd25f8a-64ca-5728-b0f7-c24cf3aae800" -version = "5.8.1+0" - -[[deps.Xorg_libICE_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "a3ea76ee3f4facd7a64684f9af25310825ee3668" -uuid = "f67eecfb-183a-506d-b269-f58e52b52d7c" -version = "1.1.2+0" - -[[deps.Xorg_libSM_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libICE_jll"] -git-tree-sha1 = "9c7ad99c629a44f81e7799eb05ec2746abb5d588" -uuid = "c834827a-8449-5923-a945-d239c165b7dd" -version = "1.2.6+0" - -[[deps.Xorg_libX11_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxcb_jll", "Xorg_xtrans_jll"] -git-tree-sha1 = "b5899b25d17bf1889d25906fb9deed5da0c15b3b" -uuid = "4f6342f7-b3d2-589e-9d20-edeb45f2b2bc" -version = "1.8.12+0" - -[[deps.Xorg_libXau_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "aa1261ebbac3ccc8d16558ae6799524c450ed16b" -uuid = "0c0b7dd1-d40b-584c-a123-a41640f87eec" -version = "1.0.13+0" - -[[deps.Xorg_libXcursor_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libXfixes_jll", "Xorg_libXrender_jll"] -git-tree-sha1 = "6c74ca84bbabc18c4547014765d194ff0b4dc9da" -uuid = "935fb764-8cf2-53bf-bb30-45bb1f8bf724" -version = "1.2.4+0" - -[[deps.Xorg_libXdmcp_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "52858d64353db33a56e13c341d7bf44cd0d7b309" -uuid = "a3789734-cfe1-5b06-b2d0-1dd0d9d62d05" -version = "1.1.6+0" - -[[deps.Xorg_libXext_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] -git-tree-sha1 = "a4c0ee07ad36bf8bbce1c3bb52d21fb1e0b987fb" -uuid = "1082639a-0dae-5f34-9b06-72781eeb8cb3" -version = "1.3.7+0" - -[[deps.Xorg_libXfixes_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] -git-tree-sha1 = "75e00946e43621e09d431d9b95818ee751e6b2ef" -uuid = "d091e8ba-531a-589c-9de9-94069b037ed8" -version = "6.0.2+0" - -[[deps.Xorg_libXi_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libXext_jll", "Xorg_libXfixes_jll"] -git-tree-sha1 = "a376af5c7ae60d29825164db40787f15c80c7c54" -uuid = "a51aa0fd-4e3c-5386-b890-e753decda492" -version = "1.8.3+0" - -[[deps.Xorg_libXinerama_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libXext_jll"] -git-tree-sha1 = "a5bc75478d323358a90dc36766f3c99ba7feb024" -uuid = "d1454406-59df-5ea1-beac-c340f2130bc3" -version = "1.1.6+0" - -[[deps.Xorg_libXrandr_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libXext_jll", "Xorg_libXrender_jll"] -git-tree-sha1 = "aff463c82a773cb86061bce8d53a0d976854923e" -uuid = "ec84b674-ba8e-5d96-8ba1-2a689ba10484" -version = "1.5.5+0" - -[[deps.Xorg_libXrender_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] -git-tree-sha1 = "7ed9347888fac59a618302ee38216dd0379c480d" -uuid = "ea2f1a96-1ddc-540d-b46f-429655e07cfa" -version = "0.9.12+0" - -[[deps.Xorg_libxcb_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libXau_jll", "Xorg_libXdmcp_jll"] -git-tree-sha1 = "bfcaf7ec088eaba362093393fe11aa141fa15422" -uuid = "c7cfdc94-dc32-55de-ac96-5a1b8d977c5b" -version = "1.17.1+0" - -[[deps.Xorg_libxkbfile_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] -git-tree-sha1 = "e3150c7400c41e207012b41659591f083f3ef795" -uuid = "cc61e674-0454-545c-8b26-ed2c68acab7a" -version = "1.1.3+0" - -[[deps.Xorg_xcb_util_cursor_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_xcb_util_image_jll", "Xorg_xcb_util_jll", "Xorg_xcb_util_renderutil_jll"] -git-tree-sha1 = "9750dc53819eba4e9a20be42349a6d3b86c7cdf8" -uuid = "e920d4aa-a673-5f3a-b3d7-f755a4d47c43" -version = "0.1.6+0" - -[[deps.Xorg_xcb_util_image_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_xcb_util_jll"] -git-tree-sha1 = "f4fc02e384b74418679983a97385644b67e1263b" -uuid = "12413925-8142-5f55-bb0e-6d7ca50bb09b" -version = "0.4.1+0" - -[[deps.Xorg_xcb_util_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxcb_jll"] -git-tree-sha1 = "68da27247e7d8d8dafd1fcf0c3654ad6506f5f97" -uuid = "2def613f-5ad1-5310-b15b-b15d46f528f5" -version = "0.4.1+0" - -[[deps.Xorg_xcb_util_keysyms_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_xcb_util_jll"] -git-tree-sha1 = "44ec54b0e2acd408b0fb361e1e9244c60c9c3dd4" -uuid = "975044d2-76e6-5fbe-bf08-97ce7c6574c7" -version = "0.4.1+0" - -[[deps.Xorg_xcb_util_renderutil_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_xcb_util_jll"] -git-tree-sha1 = "5b0263b6d080716a02544c55fdff2c8d7f9a16a0" -uuid = "0d47668e-0667-5a69-a72c-f761630bfb7e" -version = "0.3.10+0" - -[[deps.Xorg_xcb_util_wm_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_xcb_util_jll"] -git-tree-sha1 = "f233c83cad1fa0e70b7771e0e21b061a116f2763" -uuid = "c22f9ab0-d5fe-5066-847c-f4bb1cd4e361" -version = "0.4.2+0" - -[[deps.Xorg_xkbcomp_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxkbfile_jll"] -git-tree-sha1 = "801a858fc9fb90c11ffddee1801bb06a738bda9b" -uuid = "35661453-b289-5fab-8a00-3d9160c6a3a4" -version = "1.4.7+0" - -[[deps.Xorg_xkeyboard_config_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_xkbcomp_jll"] -git-tree-sha1 = "00af7ebdc563c9217ecc67776d1bbf037dbcebf4" -uuid = "33bec58e-1273-512f-9401-5d533626f822" -version = "2.44.0+0" - -[[deps.Xorg_xtrans_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "a63799ff68005991f9d9491b6e95bd3478d783cb" -uuid = "c5fb5394-a638-5e4d-96e5-b29de1b5cf10" -version = "1.6.0+0" - -[[deps.Zlib_jll]] -deps = ["Libdl"] -uuid = "83775a58-1f1d-513f-b197-d71354ab007a" -version = "1.3.1+2" - -[[deps.Zstd_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "446b23e73536f84e8037f5dce465e92275f6a308" -uuid = "3161d3a3-bdf6-5164-811a-617609db77b4" -version = "1.5.7+1" - -[[deps.Zygote]] -deps = ["AbstractFFTs", "ChainRules", "ChainRulesCore", "DiffRules", "Distributed", "FillArrays", "ForwardDiff", "GPUArraysCore", "IRTools", "InteractiveUtils", "LinearAlgebra", "LogExpFunctions", "MacroTools", "NaNMath", "PrecompileTools", "Random", "SparseArrays", "SpecialFunctions", "Statistics", "ZygoteRules"] -git-tree-sha1 = "a29cbf3968d36022198bcc6f23fdfd70f7caf737" -uuid = "e88e6eb3-aa80-5325-afca-941959d7151f" -version = "0.7.10" - - [deps.Zygote.extensions] - ZygoteAtomExt = "Atom" - ZygoteColorsExt = "Colors" - ZygoteDistancesExt = "Distances" - ZygoteTrackerExt = "Tracker" - - [deps.Zygote.weakdeps] - Atom = "c52e3926-4ff0-5f6e-af25-54175e0327b1" - Colors = "5ae59095-9a9b-59fe-a467-6f913c188581" - Distances = "b4f34e82-e78d-54a5-968a-f98e89d6e8f7" - Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" - -[[deps.ZygoteRules]] -deps = ["ChainRulesCore", "MacroTools"] -git-tree-sha1 = "434b3de333c75fc446aa0d19fc394edafd07ab08" -uuid = "700de1a5-db45-46bc-99cf-38207098b444" -version = "0.2.7" - -[[deps.eudev_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "c3b0e6196d50eab0c5ed34021aaa0bb463489510" -uuid = "35ca27e7-8b34-5b7f-bca9-bdc33f59eb06" -version = "3.2.14+0" - -[[deps.fzf_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "b6a34e0e0960190ac2a4363a1bd003504772d631" -uuid = "214eeab7-80f7-51ab-84ad-2988db7cef09" -version = "0.61.1+0" - -[[deps.libaom_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "371cc681c00a3ccc3fbc5c0fb91f58ba9bec1ecf" -uuid = "a4ae2306-e953-59d6-aa16-d00cac43593b" -version = "3.13.1+0" - -[[deps.libass_jll]] -deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl", "Zlib_jll"] -git-tree-sha1 = "125eedcb0a4a0bba65b657251ce1d27c8714e9d6" -uuid = "0ac62f75-1d6f-5e53-bd7c-93b484bb37c0" -version = "0.17.4+0" - -[[deps.libblastrampoline_jll]] -deps = ["Artifacts", "Libdl"] -uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" -version = "5.15.0+0" - -[[deps.libdecor_jll]] -deps = ["Artifacts", "Dbus_jll", "JLLWrappers", "Libdl", "Libglvnd_jll", "Pango_jll", "Wayland_jll", "xkbcommon_jll"] -git-tree-sha1 = "9bf7903af251d2050b467f76bdbe57ce541f7f4f" -uuid = "1183f4f0-6f2a-5f1a-908b-139f9cdfea6f" -version = "0.2.2+0" - -[[deps.libevdev_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "56d643b57b188d30cccc25e331d416d3d358e557" -uuid = "2db6ffa8-e38f-5e21-84af-90c45d0032cc" -version = "1.13.4+0" - -[[deps.libfdk_aac_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "646634dd19587a56ee2f1199563ec056c5f228df" -uuid = "f638f0a6-7fb0-5443-88ba-1cc74229b280" -version = "2.0.4+0" - -[[deps.libinput_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "eudev_jll", "libevdev_jll", "mtdev_jll"] -git-tree-sha1 = "91d05d7f4a9f67205bd6cf395e488009fe85b499" -uuid = "36db933b-70db-51c0-b978-0f229ee0e533" -version = "1.28.1+0" - -[[deps.libpng_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Zlib_jll"] -git-tree-sha1 = "07b6a107d926093898e82b3b1db657ebe33134ec" -uuid = "b53b4c65-9356-5827-b1ea-8c7a1a84506f" -version = "1.6.50+0" - -[[deps.libvorbis_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Ogg_jll"] -git-tree-sha1 = "11e1772e7f3cc987e9d3de991dd4f6b2602663a5" -uuid = "f27f6e37-5d2b-51aa-960f-b287f2bc3b7a" -version = "1.3.8+0" - -[[deps.mtdev_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "b4d631fd51f2e9cdd93724ae25b2efc198b059b1" -uuid = "009596ad-96f7-51b1-9f1b-5ce2d5e8a71e" -version = "1.1.7+0" - -[[deps.nghttp2_jll]] -deps = ["Artifacts", "Libdl"] -uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" -version = "1.64.0+1" - -[[deps.oneTBB_jll]] -deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl"] -git-tree-sha1 = "1350188a69a6e46f799d3945beef36435ed7262f" -uuid = "1317d2d5-d96f-522e-a858-c73665f53c3e" -version = "2022.0.0+1" - -[[deps.p7zip_jll]] -deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] -uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" -version = "17.7.0+0" - -[[deps.x264_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "14cc7083fc6dff3cc44f2bc435ee96d06ed79aa7" -uuid = "1270edf5-f2f9-52d2-97e9-ab00b5d0237a" -version = "10164.0.1+0" - -[[deps.x265_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "e7b67590c14d487e734dcb925924c5dc43ec85f3" -uuid = "dfaa095f-4041-5dcd-9319-2fabd8486b76" -version = "4.1.0+0" - -[[deps.xkbcommon_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxcb_jll", "Xorg_xkeyboard_config_jll"] -git-tree-sha1 = "fbf139bce07a534df0e699dbb5f5cc9346f95cc1" -uuid = "d8fb68d0-12a3-5cfd-a85a-d49703b185fd" -version = "1.9.2+0" diff --git a/Procfile b/Procfile new file mode 100644 index 00000000..80f7ba1e --- /dev/null +++ b/Procfile @@ -0,0 +1 @@ +web: julia --project="pluto-deployment-environment" -e "import PlutoSliderServer; PlutoSliderServer.run_directory(\".\"; port=$PORT , host=\"0.0.0.0\")" diff --git a/Project.toml b/Project.toml index a0de4fc6..9ecc01f1 100644 --- a/Project.toml +++ b/Project.toml @@ -4,6 +4,7 @@ DifferentialEquations = "0c46a032-eb83-5123-abaf-570d42b7fbaa" Distributions = "31c24e10-a181-5473-b8eb-7969acd0382f" ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" GlobalSensitivity = "af5da776-676b-467e-8baf-acd8249e4f0f" +Interpolations = "a98d9a8b-a2ab-59e6-89dd-64a1c18fca59" LaTeXStrings = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" Latexify = "23fbe1c1-3f47-55db-b15f-69d7ec21a316" Measurements = "eff96d63-e80a-5855-80a2-b1b0885c5ab7" diff --git a/README.md b/README.md index 2fba1a0c..03ee0234 100644 --- a/README.md +++ b/README.md @@ -1,34 +1,21 @@ -# Modelling and Simulation (ModSim) +# Modeling and Simulation -Course material for *Modelling and Simulation of Biosystems* (I002445), Bachelor of Bioscience Engineering, Ghent University: course notes, exercise notebooks, examples and the course website. +Course Modelling and Simulation for Bioscience Engineers at UGent. -## Launching Pluto +🚧 Work in progress till 2025. -To launch Pluto, either: -- open a terminal in the top level folder, and run `julia launch_pluto.jl` -- open a Julia terminal in the top level folder, and run `include("launch_pluto.jl")` +## launching Pluto -## Repository layout +To launch pluto, either: +- open a terminal in the top level folder, and run `julia launch_pluto.jl` +- open a julia terminal in the top level folder, and run `include("launch_pluto.jl")` -- `src/`: source of the course website (see [`website_maintenance.md`](website_maintenance.md)). Every file in here becomes a page. -- `exercises/`: the exercise notebooks. - - `exercises/student_notebooks/` is the **single source of truth** for the exercises handed out to students. - - `exercises/solved_notebooks/` contains the solved versions. - - `src/exercises/*.jl` are **generated** copies for the website; never edit them by hand (see below). -- `notebook-checks/`: tooling around the notebooks. - - `check_notebooks.jl` runs all solved notebooks; executed by CI (`.github/workflows/CheckNotebooks.yml`). - - `sync_exercises.jl` regenerates `src/exercises/` from `exercises/student_notebooks/`; CI runs it with `--check` and fails when the website copies are out of sync. -- `project/`: the course project. -- `examples/`: worked examples used in the lectures. -- The course notes themselves (Typst sources, figures and the notebooks that generate them) live in the **private** repository `ModSim-course-notes`; they are not part of this repo. -- `pluto-deployment-environment/`: the Julia environment used to build the website (Julia 1.12). Keep its `Project.toml` and `Manifest.toml` up to date when you add packages to notebooks that are rendered on the website. +## gh-pages / website -## Website +all the info and files are in the `src` directory. There will be some redundancy between files/scripts in other folders and the ones in the `src` folder. -All website content lives in `src/`; the details are in [`website_maintenance.md`](website_maintenance.md). +see `website_maintenance.md` -- A push to `main` triggers `.github/workflows/ExportNotebooks.yml`, which builds the site and deploys it to the `gh-pages` branch (GitHub Pages). Pull requests get a preview under `previews/PR`. -- To preview locally, run `julia develop.jl` in the top level folder (or use the VS Code task *PlutoPages: run development server*). -- Use Julia 1.12, the version the site environment was resolved with. With juliaup: `juliaup override set 1.12` inside this folder. +Also don't forget to update the toml and manifest files in `pluto-deployment-environment`. Make sure to respect the Julia version, currently this is `1.11.2`. -If you need a more in-depth example of the different pages, usage of tags, etc., check out release [v2425.1](https://github.com/Kermit-UGent/ModSim/releases/tag/v2425.1) and run the server on that code. Alternatively, have a look at the [original github source of the template](https://github.com/JuliaPluto/computational-thinking-template) or [the current website accompanying that repo](https://juliapluto.github.io/computational-thinking-template/). +If you need a more in-depth example of the different pages, usage of tags, etc. Check out release [v2425.1](https://github.com/Kermit-UGent/ModSim/releases/tag/v2425.1) en run the server on that code, alternatively check out the [original github source of the template](https://github.com/JuliaPluto/computational-thinking-template) or (the current website accompanying that repo)[https://juliapluto.github.io/computational-thinking-template/]. \ No newline at end of file diff --git a/course/figures_uncertainty/gsa.jl b/course/figures_uncertainty/gsa.jl new file mode 100644 index 00000000..d245f7eb --- /dev/null +++ b/course/figures_uncertainty/gsa.jl @@ -0,0 +1,40 @@ +using GlobalSensitivity, Plots, Statistics, DifferentialEquations, Catalyst + +# code for the examples in the chapter uncertainty + +sir = @reaction_network begin + @species S(t)=50 I(t)=5 R(t)=0 + Ξ², S + I --> 2I + Ξ³, I --> R +end + +sir_sys = convert(ODESystem, sir, combinatoric_ratelaws=false) + +prob = ODEProblem(sir_sys, [], [0, 100], [0.005, .01]) +plot(solve(prob), lw=2) + +# Now, let's create a function that takes in a parameter set and calculates the maximum of +# the predator population and the average of the prey population for those parameter values. +# To do this, we will make use of the remake function, which creates a new ODEProblem, and +# use the p keyword argument to set the new parameters: +f1 = function (p) + # Ξ², Ξ³ = p + prob1 = remake(prob; p = p) + sol = solve(prob1, Tsit5()) + [mean(sol[1, :]), maximum(sol[2, :])] +end + +p_range = [[1e-5, 1], [1e-5, 1]] # parameter ranges +m = gsa(f1, Morris(total_num_trajectory = 1000, num_trajectory = 150), p_range) + +m.means +m.variances + +scatter( + m.means[1, :], m.variances[1, :], series_annotations = [:Ξ², :Ξ³], color = :gray) + +m = gsa( + f1, Sobol(), + p_range, samples = 1000) + +m.S1, m.ST diff --git a/course/figures_uncertainty/morris_edit.svg b/course/figures_uncertainty/morris_edit.svg new file mode 100644 index 00000000..f8c1d47e --- /dev/null +++ b/course/figures_uncertainty/morris_edit.svg @@ -0,0 +1,1014 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + parameters with nonlinear and/or interaction effects + noninfluential parameters + parameters with linear effects + + diff --git a/course/figures_uncertainty/uncertainty.jl b/course/figures_uncertainty/uncertainty.jl new file mode 100644 index 00000000..6064a1aa --- /dev/null +++ b/course/figures_uncertainty/uncertainty.jl @@ -0,0 +1,92 @@ +using Catalyst, GlobalSensitivity, Statistics, DifferentialEquations, Plots + +# use the SIR model with parameters Ξ² and Ξ³ for the analysis. +sir = @reaction_network begin + @species S(t)=50 I(t)=5 R(t)=0 + Ξ², S + I --> 2I + Ξ³, I --> R +end +# convert the reaction network to an ODE system +sir_sys = convert(ODESystem, sir, combinatoric_ratelaws=false) + +prob = ODEProblem( + sir_sys, + [], + [0, 100], # range for time t + [0.005, .01] # Ξ², Ξ³ +) + +# Now, let's create a function that takes in a parameter set +# and calculates the maximum of the infected population and +# the average of the susceptible population for those parameter values. +# To do this, we will make use of the remake function, which +# creates a new ODEProblem, and uses the p keyword argument +# to set the new parameters: +f1 = function (p) + # Ξ², Ξ³ = p + prob1 = remake(prob; p = p) + sol = solve(prob1, Tsit5(); saveat = 0.1) + [mean(sol[1, :]), maximum(sol[2, :])] +end + +p_range = [[1e-5, 1], [1e-5, 1]] # parameter ranges + +# compute the GSA using Sobol +m = gsa(f1, Sobol(), p_range, samples = 1000) + +m.S1 # first order effects +m.ST # total effects + +m.S1[1, :] # first order effect of Ξ² and Ξ³ on the mean susceptible population +m.S1[2, :] # first order effect of Ξ² and Ξ³ on the maximum infected population + +scatter(m.S1[1, :], ["Ξ²", "Ξ³"], label = "Mean susceptible population (first order effects)", ylabel = "Parameter", xlabel = "Effects") +scatter!(m.ST[1, :], ["Ξ²", "Ξ³"], label = "Mean susceptible population (total effects)") +scatter!(m.S1[2, :], ["Ξ²", "Ξ³"], label = "Maximum infected population (first order effects)") +scatter!(m.ST[2, :], ["Ξ²", "Ξ³"], label = "Maximum infected population (total effects)") +savefig("sobol.pdf") + +# compute the GSA using Morris +m = gsa(f1, Morris(num_trajectory=50), p_range) + +m.means +m.variances + +# TODO check if abs is needed? by definition we should not have negative values +scatter([abs(m.means[1, 1])], [m.variances[1, 1]], label = "beta, Mean susceptible population", xlabel = "ΞΌ*", ylabel = "Οƒ") +scatter!([abs(m.means[1, 2])], [m.variances[1, 2]], label = "gamma, Mean susceptible population") +scatter!([abs(m.means[2, 1])], [m.variances[2, 1]], label = "beta, Maximum infected population") +scatter!([abs(m.means[2, 2])], [m.variances[2, 2]], label = "gamma, Maximum infected population") +savefig("morris.pdf") + +# Morris paths visualisation +# https://uqpyproject.readthedocs.io/en/latest/sensitivity/morris.html +# unit square +plot([0, 1], [0, 0], color=:black) +plot!([0, 1], [1, 1], color=:black) +plot!([0, 0], [0, 1], color=:black) +plot!([1, 1], [0, 1], color=:black) +# lines +plot!([0, 0.2], [0.2, 0.2], color="CornflowerBlue", lw=3) +plot!([0.2, 0.2], [0.2, 0.8], color="CornflowerBlue", lw=3) +plot!([0.2, 0.8], [0.8, 0.8], color="CornflowerBlue", lw=3) + +plot!([0.5, 0.5], [0.9, 0.4], color="DarkOrange", lw=3) +plot!([0.5, 0.7], [0.4, 0.4], color="DarkOrange", lw=3) +plot!([0.7, 0.7], [0.4, 0.2], color="DarkOrange", lw=3) + +plot!([0.3, 0.9], [0.6, 0.6], color="LightPink", lw=3) +plot!([0.9, 0.9], [0.6, 0.1], color="LightPink", lw=3) +plot!(xlabel = "X₁", ylabel = "Xβ‚‚", xlims = (-0.2, 1.2), ylims = (-.2, 1.2), size = (500, 500), legend=false, xticks = 0:1, yticks = 0:1) + +savefig("randomtrajectories.pdf") + +# a plot showcasing uncertainty +plot() +plot!(x -> sin(x), 0, 2pi, label = "sin(x)", lw = 2) +plot!(x -> sin(x)+0.3x, 0, 2pi, label = "upper bound", lw = 2) +plot!(x -> sin(x)-0.3x, 0, 2pi, label = "lower bound", lw = 2) +plot!(x -> sin(x)-0.3x, 0, 2pi, label = "error", lw = 0, fillrange=x -> sin(x)+0.3x, fillalpha=0.1, fillcolor=:red, z_order=:back) +plot!(xlabel="time", ylabel="response") + +savefig("uncertainplot.pdf") diff --git a/develop.jl b/develop.jl index 444e1019..9ad7ee81 100644 --- a/develop.jl +++ b/develop.jl @@ -1,7 +1,7 @@ cd(@__DIR__) notebook_path = joinpath(@__DIR__, "PlutoPages.jl") -@assert VERSION >= v"1.12" +@assert VERSION >= v"1.10.7" begin begin diff --git a/examples/insuline_sensitivity backup 1.jl b/examples/insuline_sensitivity backup 1.jl new file mode 100644 index 00000000..89bf4a58 --- /dev/null +++ b/examples/insuline_sensitivity backup 1.jl @@ -0,0 +1,372 @@ +### A Pluto.jl notebook ### +# v0.20.3 + +using Markdown +using InteractiveUtils + +# This Pluto notebook uses @bind for interactivity. When running this notebook outside of Pluto, the following 'mock version' of @bind gives bound variables a default value (instead of an error). +macro bind(def, element) + #! format: off + quote + local iv = try Base.loaded_modules[Base.PkgId(Base.UUID("6e696c72-6542-2067-7265-42206c756150"), "AbstractPlutoDingetjes")].Bonds.initial_value catch; b -> missing; end + local el = $(esc(element)) + global $(esc(def)) = Core.applicable(Base.get, el) ? Base.get(el) : iv(el) + el + end + #! format: on +end + +# ╔═║ 7bc363b0-9415-4954-807f-81a308bde531 +begin + import Pkg + Pkg.activate("..") +end + +# ╔═║ 52b28a4c-b0bb-11ef-2841-17ecfb596676 +using Plots, PlutoUI, DifferentialEquations, ForwardDiff, Catalyst + +# ╔═║ 77860f25-1b30-4cf1-812a-03ff2100bacd +using Turing + +# ╔═║ c897d6e6-0b33-4dfb-89f3-f7e05bb9f73b +using StatsPlots, Optim + +# ╔═║ e96779da-57c0-4c11-b3ab-40dc5ae81bee +using StatsBase + +# ╔═║ bfcc4b4e-073e-401e-851c-d01ef828028a +md""" +# The minimal glucose model and dynamic compensation + +The Minimal Model of Glucose Regulation is a mathematical model used to describe how the body regulates glucose (sugar) levels in the blood. It was developed by Richard Bergman and Claudio Cobelli in the late 1970s and has become a cornerstone in diabetes research. + +We will use this exercise to study insulin sensitivity. + +The basic model considers only the concentration of glucose $G(t)$ in nM and the concentration of insulin $I(t)$ in nM: + +- glucose is added to a system with a zeroth-order rate of $m$ (later $m(t)$ if we model a non-fixed input); +- glucose is removed from the blood with a rate of $sGI$, where $s$ is the insulin sensitivity; +- insulin decays according to first-order kinetics with a rate parameter $\gamma$ +- $\beta$-cells produce insulin as a response to higher glucose concentrations. This is according to a saturated process, so it is well approximated using a Hill function ($n=2$). The rate of insulin production is given by $qBf(G)$, with $B$ the amount of $\beta$-cells and $q$ the maximal rate of insulin production/unit of cells. + +The following plot gives a fairly realistic response of insulin production as a function of glucose concentration in the blood. +""" + +# ╔═║ e93bc1a5-e0b1-425c-b069-d5ce80756e60 +f_insulin(G) = hill(G, 1, 5, 2) + +# ╔═║ 2ac43184-a393-4d39-9c3b-c299c3371b09 +plot(f_insulin, 0, 30, xlab="G nm", ylab="f(G)", title="Insulin production rate") + +# ╔═║ 75a5b5d9-f8d7-4728-83dc-03dde502dcfb +md"Below is a reaction network implementing this model. All parameters are set to 1 for didactic purposes." + +# ╔═║ f62c2b4a-a9e8-472b-b07b-44072da08ee8 +glucose_insuline_circuit = @reaction_network begin + @parameters q=1 s=1 Ξ³=1 m=1 B=1 Ks=1.0 + m, 0 --> G + s * I, G --> 0 + B * hill(G, q, Ks, 2), 0 --> I + Ξ³, I --> 0 +end + +# ╔═║ 99ccbd1b-b9e4-4afc-8d9a-8c1055bcce0f +convert(ODESystem, glucose_insuline_circuit) + +# ╔═║ c319ae6e-2f02-4a7e-a0b0-4a3f57fdcb66 +md"You can set initial values of glucose and insulin here." + +# ╔═║ 7623a596-d6d4-4e0a-b29c-f2f7de0d2940 +G0 = 5.0 + +# ╔═║ 0621968c-b39a-4346-a86a-42fa2cde724c +I0 = 0.0 + +# ╔═║ 3c1465d2-0886-4b74-baee-55c7dad41f9a +md"Simulate the system over a time interval of 0 to 10 hours with $m=1$. Plot the results. What are the steady state concentrations for the two species? Does this depend on initial glucose levels (given enough time)?" + +# ╔═║ bbbc3335-4190-4bc7-91ba-e96476a75751 +@unpack t, G, I = glucose_insuline_circuit + +# ╔═║ afc40964-0a97-43a6-ab27-5fe96ecd319b +oprob1 = ODEProblem(glucose_insuline_circuit, [G=>G0, I=>I0], (0., 10.), [:m=>1.0]) + +# ╔═║ f050b32e-1a14-4d5e-9fb3-5dbc4dfbf79c +sol1 = solve(oprob1, Tsit5()); + +# ╔═║ 7e35b56b-44a0-46df-a812-f5fb437b672e +plot(sol1) + +# ╔═║ 00db9d76-c4dd-450d-b7e3-cf87f8bfeffb +plot(sol1, idxs=(G, I)) + +# ╔═║ aab02fef-6d84-4f53-aff5-6f94bf2bd460 +md"Now simulate the system but rather than with $m$ being a constant glucose input, we give in a pulse of glucose (i.e., drinking a soda) with a peak at $t=5$h. Note that our parameter now depends on the time!" + +# ╔═║ 8a5ce760-55bb-4610-9226-32c3d8376748 +glucose_pulse(t) = .5 + exp(-(t-5)^2) + +# ╔═║ a2fb8c21-c594-44f3-92df-99e6d3afeba1 +plot(glucose_pulse, 0, 10, label="G [nm]", xlab="t") + +# ╔═║ ba68f740-ba8b-4efa-be2d-ac50c77dfa1a +glucose_pulse(t) + +# ╔═║ 31aaced7-1fe4-4117-80f3-0fa70035822a +md"Up to now, we set $s$, the insulin sensitivity to 1. This parameter represents how sensitive the body is to insuline in taking up glucose. Aging and obesity increase glucose resistance ($1/s$), resulting in diabetes! Explore the effect of this parameter on your plots below." + +# ╔═║ 69e21e9b-7d0e-44e3-8b33-ee7102dadadf +@bind s Slider(0.1:0.1:5, default=1, show_value=true) + +# ╔═║ 6890e3ec-0875-423e-89c1-988411c869e3 +oprob2 = ODEProblem(glucose_insuline_circuit, [G=>0., I=>0.0], (0., 10.), [:m=>glucose_pulse(t), :s=>s]) + +# ╔═║ fb439f9d-ee88-43cd-b91b-44ed8013b27d +sol2 = solve(oprob2, Tsit5()); + +# ╔═║ 095e359a-2ec4-4637-8477-93510bef23ed +plot(sol2) + +# ╔═║ b4073e81-6db8-4be6-a2d1-afa01640dbcf +s + +# ╔═║ 4d58a832-9157-42fe-b578-c3fc29f01ea8 +md"We have made a function here that computes the steady state glucose concentration after 100 hours. Plot this as a function of s." + +# ╔═║ 7cf11e6f-7ef4-478f-8cc7-eae93374cc58 +function glucose_steady_state(s) + oprob = ODEProblem(glucose_insuline_circuit, [G=>0., I=>0.0], (0., 100.), [:m=>1/2, :s=>s]) + sol = solve(oprob, Tsit5()) + return sol[G][end] +end + +# ╔═║ 5eda8c4a-2baa-4987-b408-dbe7383abe95 +glucose_steady_state(s) + +# ╔═║ 34788b1d-1530-4b88-8690-03fe9af52a8b +plot(glucose_steady_state, 0.1, 5, xlab="s", ylab="Gss") + +# ╔═║ f616da2f-b51e-4328-bd3c-47e6d7377cbb +md"Using automatic differentiation (ForwardDiff), compute the absolute and relative sensitity indices. Is this system sensitive to the insuline sensitivity?" + +# ╔═║ 97636a73-4732-4377-b760-c36cef13904b +fsens(s) = ForwardDiff.derivative(glucose_steady_state, s) + +# ╔═║ a67d70ee-c8b5-4f22-926c-f48c5dcf9815 +fsens(s) + +# ╔═║ 1bb5834a-6a4e-40ec-82c1-f2c505ecfeb8 +frelsens(s) = ForwardDiff.derivative(glucose_steady_state, s) * glucose_steady_state(s) / s + +# ╔═║ a3156073-07bd-4f13-be5e-d19483fbad28 +frelsens(s) + +# ╔═║ 0ae57436-0b8c-41ce-9d9d-8c48ed59b820 +md""" +We see that the final glucose concentration is highly dependent on $s$! This seems to be a flaw in the model, as we can imagine that the physiological parameters can greatly differ from person to person (for example, a person can have a large pancreas). + +A mechanism that stabilizes this is called *dynamic compensation*. Simply put, we have assumed here that the amount of beta cells ($B$) is fixed. However, in practice, these cells are capable of dividing, growing, and thus producing more insulin. Their growth rate depends on the concentration of glucose, creating an additional feedback loop that stabilizes the physiological circuit. The growth rate of the $\beta$-cells follows a sigmoid shape, being negative when $G$ is smaller than a threshold and positive if $G$ exceeds this threshold. + +```julia +ΞΌ(G), B --> 2B +``` + +This curve is plotted below. +""" + +# ╔═║ 87d9c826-56af-409a-a884-d784cfa16a64 +ΞΌ(G) = 0.3atan(0.5(G-1)) + +# ╔═║ 4d95e77b-fab0-454b-8319-1fe83e12f9e9 +plot(ΞΌ, 0, 30, xlab="G", label="ΞΌ(G)", title="Glucose-dependend growth rate") + +# ╔═║ ea46f5f9-47a8-4641-a7e3-08a1a29cd04f +md"Add dynamic compensation to the model and show that this greatly reduces the sentitivty w.r.t. $s$." + +# ╔═║ 870e9229-374a-40b8-97f7-1a84d1a857e9 +md""" +Robust version with dynamic compensation +```julia +glucose_insuline_circuit = @reaction_network begin + @parameters q=1 s=1 Ξ³=1 m=1 Ks=1.0 + @species B(t)=1 + m, 0 --> G + s * I, G --> 0 + q * B * hill(G, 1, Ks, 2), 0 --> I + Ξ³, I --> 0 + ΞΌ(G), B --> 2B +end +``` +""" + +# ╔═║ e37ce327-504b-4fe4-baea-493cda834b4a +md" this does not work yet. Split and use different model: https://allendowney.github.io/ModSimPy/chap18.html" + +# ╔═║ e66378f7-8ec8-4f7f-ab40-5c64479f865e +tmeas = 0:2:8 + +# ╔═║ bcafb5c2-4f3c-47f4-b786-8f656969abe6 +length(tmeas) + +# ╔═║ 08d3cf6e-dc0b-4a56-a241-0d0033e79fad +Gmeas = [92, 350, 287, 251, 240] + +# ╔═║ c0d39fc8-d779-465e-91c1-3a6f9b694ee3 +Imeas = [11, 26, 130, 85, 51] + +# ╔═║ c2c18077-add0-4ff9-a122-f248dbd1da79 +begin + scatter(tmeas, Gmeas, xlab="t [h]", label="G [mg/dL]") + scatter!(tmeas, Imeas, label="I [ΞΌU/mL]") +end + +# ╔═║ e93a2495-aa5b-46f6-ae3c-b94559583c60 +@model function glucose_inference(tmeas, Gmeas, Imeas) + @assert length(tmeas) == length(Gmeas) == length(Imeas) + N = length(tmeas) + ΟƒGsq ~ Gamma(5) + ΟƒIsq ~ Gamma(3) + q~10LogNormal() + s~10LogNormal() + Ξ³~10LogNormal() + B=1 + m~10LogNormal() + Ks~10LogNormal() + G0~100LogNormal() + I0~1LogNormal() + prob = remake(oprob1; u0=[G=>G0, I=>I0], tspan=(0., 8.), + p=[:m=>m, :q=>q, :s=>s, + :Ξ³=>Ξ³, :Ks=>Ks, :B=>B]) + sol = solve(prob, saveat=tmeas) + for i in 1:N + Gmeas[i] ~ Normal(sol[G][i], sqrt(ΟƒGsq)) + Imeas[i] ~ Normal(sol[I][i], sqrt(ΟƒIsq)) + end + return sol +end + +# ╔═║ 55e4db93-f376-4cbb-829d-fea9ce3f3998 +glucose_inference(tmeas, Gmeas, Imeas)() + +# ╔═║ 8989e653-e3e8-4e4f-8fc2-596e931ed21c +mod_data = glucose_inference(tmeas, Gmeas, Imeas) + +# ╔═║ b763bb0c-581e-46ec-8104-53df25369642 +mod_data() |> plot + +# ╔═║ 5e187f36-3883-4f08-b08c-a55d24e409cd +chain1 = sample(mod_data, NUTS(), 100) + +# ╔═║ 2bf57ee8-ac1d-412f-a4c8-6e4ce87a74c5 +summarize(chain1) + +# ╔═║ aa32db53-c944-442a-88df-5937f380b54c +#=╠═║ +plot(chain1) + ╠═║ =# + +# ╔═║ 7b247ff1-f873-4b00-90c3-4c7a87485fb2 +#=╠═║ +scatter(chain1[:q], chain1[:B]) + ╠═║ =# + +# ╔═║ e591eff0-fd70-43d3-bf2a-34309a8ecd62 +#=╠═║ +begin + p = scatter(tmeas, Gmeas, xlab="t [h]", label="G [mg/dL]") + scatter!(tmeas, Imeas, label="I [ΞΌU/mL]") + N = length(sample_sols) + for i in 1:10 + n = rand(1:N) + plot!(sample_sols[n], lw=0.5, alpha=0.8, label="", color=[:blue :orange]) + end + p +end + ╠═║ =# + +# ╔═║ 04d6078e-f46b-43f2-988c-d91252b26747 +#=╠═║ +sample_sols = generated_quantities(mod_data, chain1); + ╠═║ =# + +# ╔═║ 851e6a2f-3569-489d-b375-149329c68a7c +mapGI = optimize(mod_data, MAP(), NelderMead()) + +# ╔═║ 246a06ba-ef48-47ba-aef0-51f07ceb96e4 + + +# ╔═║ 403f6e68-e827-4885-830b-cb0d7f872ee0 +coeftable(mapGI) + +# ╔═║ 2f992357-4608-40e6-9954-8306f31e9768 + + +# ╔═║ 6ecda2c4-2a1d-4d24-b7b8-ec956a3e8d70 +#coeftable(mapG) + +# ╔═║ Cell order: +# ╠═52b28a4c-b0bb-11ef-2841-17ecfb596676 +# ╠═7bc363b0-9415-4954-807f-81a308bde531 +# ╠═bfcc4b4e-073e-401e-851c-d01ef828028a +# ╠═e93bc1a5-e0b1-425c-b069-d5ce80756e60 +# ╠═2ac43184-a393-4d39-9c3b-c299c3371b09 +# β•Ÿβ”€75a5b5d9-f8d7-4728-83dc-03dde502dcfb +# ╠═f62c2b4a-a9e8-472b-b07b-44072da08ee8 +# ╠═99ccbd1b-b9e4-4afc-8d9a-8c1055bcce0f +# ╠═c319ae6e-2f02-4a7e-a0b0-4a3f57fdcb66 +# ╠═7623a596-d6d4-4e0a-b29c-f2f7de0d2940 +# ╠═0621968c-b39a-4346-a86a-42fa2cde724c +# ╠═3c1465d2-0886-4b74-baee-55c7dad41f9a +# ╠═afc40964-0a97-43a6-ab27-5fe96ecd319b +# ╠═bbbc3335-4190-4bc7-91ba-e96476a75751 +# ╠═f050b32e-1a14-4d5e-9fb3-5dbc4dfbf79c +# ╠═7e35b56b-44a0-46df-a812-f5fb437b672e +# ╠═00db9d76-c4dd-450d-b7e3-cf87f8bfeffb +# ╠═aab02fef-6d84-4f53-aff5-6f94bf2bd460 +# ╠═8a5ce760-55bb-4610-9226-32c3d8376748 +# β•Ÿβ”€a2fb8c21-c594-44f3-92df-99e6d3afeba1 +# ╠═ba68f740-ba8b-4efa-be2d-ac50c77dfa1a +# ╠═6890e3ec-0875-423e-89c1-988411c869e3 +# ╠═fb439f9d-ee88-43cd-b91b-44ed8013b27d +# ╠═095e359a-2ec4-4637-8477-93510bef23ed +# ╠═31aaced7-1fe4-4117-80f3-0fa70035822a +# ╠═69e21e9b-7d0e-44e3-8b33-ee7102dadadf +# ╠═b4073e81-6db8-4be6-a2d1-afa01640dbcf +# ╠═4d58a832-9157-42fe-b578-c3fc29f01ea8 +# ╠═7cf11e6f-7ef4-478f-8cc7-eae93374cc58 +# ╠═5eda8c4a-2baa-4987-b408-dbe7383abe95 +# ╠═34788b1d-1530-4b88-8690-03fe9af52a8b +# ╠═f616da2f-b51e-4328-bd3c-47e6d7377cbb +# ╠═97636a73-4732-4377-b760-c36cef13904b +# ╠═a67d70ee-c8b5-4f22-926c-f48c5dcf9815 +# ╠═1bb5834a-6a4e-40ec-82c1-f2c505ecfeb8 +# ╠═a3156073-07bd-4f13-be5e-d19483fbad28 +# ╠═0ae57436-0b8c-41ce-9d9d-8c48ed59b820 +# ╠═87d9c826-56af-409a-a884-d784cfa16a64 +# ╠═4d95e77b-fab0-454b-8319-1fe83e12f9e9 +# ╠═ea46f5f9-47a8-4641-a7e3-08a1a29cd04f +# β•Ÿβ”€870e9229-374a-40b8-97f7-1a84d1a857e9 +# ╠═e37ce327-504b-4fe4-baea-493cda834b4a +# ╠═e66378f7-8ec8-4f7f-ab40-5c64479f865e +# ╠═bcafb5c2-4f3c-47f4-b786-8f656969abe6 +# ╠═08d3cf6e-dc0b-4a56-a241-0d0033e79fad +# ╠═c0d39fc8-d779-465e-91c1-3a6f9b694ee3 +# ╠═c2c18077-add0-4ff9-a122-f248dbd1da79 +# ╠═77860f25-1b30-4cf1-812a-03ff2100bacd +# ╠═e93a2495-aa5b-46f6-ae3c-b94559583c60 +# ╠═55e4db93-f376-4cbb-829d-fea9ce3f3998 +# ╠═8989e653-e3e8-4e4f-8fc2-596e931ed21c +# ╠═b763bb0c-581e-46ec-8104-53df25369642 +# ╠═5e187f36-3883-4f08-b08c-a55d24e409cd +# ╠═2bf57ee8-ac1d-412f-a4c8-6e4ce87a74c5 +# ╠═c897d6e6-0b33-4dfb-89f3-f7e05bb9f73b +# ╠═aa32db53-c944-442a-88df-5937f380b54c +# ╠═7b247ff1-f873-4b00-90c3-4c7a87485fb2 +# ╠═e591eff0-fd70-43d3-bf2a-34309a8ecd62 +# ╠═04d6078e-f46b-43f2-988c-d91252b26747 +# ╠═851e6a2f-3569-489d-b375-149329c68a7c +# ╠═246a06ba-ef48-47ba-aef0-51f07ceb96e4 +# ╠═e96779da-57c0-4c11-b3ab-40dc5ae81bee +# ╠═403f6e68-e827-4885-830b-cb0d7f872ee0 +# ╠═2f992357-4608-40e6-9954-8306f31e9768 +# ╠═6ecda2c4-2a1d-4d24-b7b8-ec956a3e8d70 diff --git a/exercises/README.md b/exercises/README.md deleted file mode 100644 index 0d37d9ef..00000000 --- a/exercises/README.md +++ /dev/null @@ -1,6 +0,0 @@ -# Exercises - -- `student_notebooks/P*/` is the **source of truth**: edit the exercise notebooks here. -- `solved_notebooks/P*/` holds the solutions; CI builds every one of them (`.github/workflows/CheckNotebooks.yml`). -- `src/exercises/*.jl` (the website copies) are **generated** from `student_notebooks/` by `julia notebook-checks/sync_exercises.jl` β€” never edit them by hand; rerun the script after changing a student notebook, CI (`--check`) fails otherwise. -- To work on a notebook, start Pluto with the top-level `launch_pluto.jl` (`julia launch_pluto.jl` in the repo root). diff --git a/exercises/launch_pluto.jl b/exercises/launch_pluto.jl new file mode 100644 index 00000000..43f860fa --- /dev/null +++ b/exercises/launch_pluto.jl @@ -0,0 +1,6 @@ +using Pkg +Pkg.activate(".") +Pkg.instantiate() + +using Pluto +Pluto.run() \ No newline at end of file diff --git a/exercises/solved_notebooks/Project.toml b/exercises/solved_notebooks/Project.toml index e3eaa3c3..f2a4b8b7 100644 --- a/exercises/solved_notebooks/Project.toml +++ b/exercises/solved_notebooks/Project.toml @@ -20,4 +20,4 @@ Turing = "fce5fe82-541a-59a6-adf8-730c64b5f9a0" [compat] Turing = "0.41" Catalyst = "15" -julia = "1.12" \ No newline at end of file +julia = "1.10" \ No newline at end of file diff --git a/exercises/student_notebooks/P8_modselect/model_selection_friction_sol.jl b/exercises/student_notebooks/P8_modselect/model_selection_friction_sol.jl new file mode 100644 index 00000000..9d57228e --- /dev/null +++ b/exercises/student_notebooks/P8_modselect/model_selection_friction_sol.jl @@ -0,0 +1,1143 @@ +### A Pluto.jl notebook ### +# v0.20.4 + +using Markdown +using InteractiveUtils + +# This Pluto notebook uses @bind for interactivity. When running this notebook outside of Pluto, the following 'mock version' of @bind gives bound variables a default value (instead of an error). +macro bind(def, element) + #! format: off + quote + local iv = try Base.loaded_modules[Base.PkgId(Base.UUID("6e696c72-6542-2067-7265-42206c756150"), "AbstractPlutoDingetjes")].Bonds.initial_value catch; b -> missing; end + local el = $(esc(element)) + global $(esc(def)) = Core.applicable(Base.get, el) ? Base.get(el) : iv(el) + el + end + #! format: on +end + +# ╔═║ dd4af742-7f4a-4e38-9665-620a13b9d341 +begin + # add this cell if you want the notebook to use the environment from where the Pluto server is launched + using Pkg + Pkg.activate("..") +end + +# ╔═║ be891cc2-f306-4cc8-97d7-1efa7f97ecd6 +using Markdown + +# ╔═║ ef0b5541-3f36-4e79-87eb-0d73ffbd80d4 +using InteractiveUtils + +# ╔═║ bbd6918a-1d4b-442d-81a7-e25c8f48c904 +using Catalyst, OrdinaryDiffEq + +# ╔═║ 09902aca-cb98-41f4-93f4-a7530c4373ba +using Turing, StatsPlots, StatsBase + +# ╔═║ 579e2373-4836-4fd5-83b9-c6715984634c +using LinearAlgebra, Optim + +# ╔═║ f9c07cce-bada-11ef-36af-9f9bf85ccc38 +using PlutoUI; TableOfContents() + +# ╔═║ eb43c9e6-d47e-414f-987e-3dcc7a7c3124 +md""" +# Model selection for air friction terms +""" + +# ╔═║ 66243d50-9a2d-40db-b879-304f182eb46b +md""" +The table below contains data for how long it takes for a badminton projectile to fall a given distance when dropped. The goal is to determine which model for air resistance best describes it, namely: + +$v'(t) = g - \frac{F_r(v)}{m}$ + +where $v$ is the object's speed, $m$ the mass and $F_r(v)$ some function of speed and extra parameters. The goal is also to determine, for such an object falling in air, the model parameters (calibration). +""" + +# ╔═║ 4a5e1692-171c-43fa-8309-b73c8ecd38c5 +t = [0, 0.347, 0.47, 0.519, 0.582, 0.65, 0.674, 0.717, 0.766, 0.823, 0.87, 1.031, 1.193, 1.354, 1.501, 1.726, 1.873] + +# ╔═║ 8a71f11b-3dab-4ee3-bc61-dc5327f37eb9 +d = [0, 0.61, 1.00, 1.22, 1.52, 1.83, 2.00, 2.13, 2.44, 2.74, 3.00, 4.00, 5.00, 6.00, 7.00, 8.50, 9.50] + +# ╔═║ 19bf959c-b385-44d3-8311-8f2d22e67584 +scatter(t, d; xlabel="time (seconds)", ylabel="distance (meters)", legend=:none, title="measurements") + +# ╔═║ cac10b59-aba7-4c0c-a699-02251a349dd4 +md""" +# 1. Mathematical model +""" + +# ╔═║ 16b137b5-466a-4206-8d33-de2bf4a8850a +md""" +The general model, obtained from Newton's second law and an opposing resistance force, follows: + +$v'(t) = g - \frac{F_r(v)}{m}$ + +where $F_r$ will only have an influence when the object is falling, thus we assume $F_r=0$ for $v=0$. + +""" + +# ╔═║ 1dca1d32-42c3-4636-aa86-66bcd3ea2dcd +md""" +From here, the different models can be developed. For example, for a linear model we have: + +$v'(t) = g - \frac{k\,v(t)}{m}$ + +or + +$v'(t) = g - \tilde k\,v(t)$ + +where the constant $m$ is absorbed in the definition of $k$ and calibrated jointly. +""" + +# ╔═║ 211988a4-e589-4b8f-98e0-c1db92fe5030 +md""" +Parameters: $k$, $m$, or simply $k$ if we replace $k/m$ by $\tilde k$ \ + +Constants: $g$ +""" + +# ╔═║ 7daa93a7-7968-4f7f-9e75-d27a412a7362 +g = 9.80136 # m sΒ² + +# ╔═║ 017e4b49-dda4-4be7-a6e9-e5bd09218c36 +md""" +Integrating twice and solving for $v(0)=0$ and $x(0)=0$ we obtain: + +$x(t) = \frac{g}{k^2} \Big(kt + e^{-kt}βˆ’1\Big)$ + +We can use this analytical solution to verify our implementation. +""" + +# ╔═║ 8145a2d1-c771-4530-8683-a057c4a4ad71 +md""" +#### No air resistance +""" + +# ╔═║ cc0130e0-6fb1-482e-8b80-6726d4e7a08c +md""" +For $F(v) = 0$ and initial speed $v(0) = 0$, the position of the projectile would be $x(t) = gt^2/2$, according to classical laws and assuming $x(0)=0$. There are no parameters to estimate here, since $g$ is known. We can simply assess the fit to the data as a least squares problem. +""" + +# ╔═║ d8a642cc-9f5c-4696-8314-20a998498eee +md""" +Computing the sum of squares + +$SSR = \sum_{j=1}^N \big(x(t_j) - x_j\big)^2$ + +where $(t_j, x_j)$ denotes the $j$th time-distance pair from the table above, allows us to assess the fit. +""" + +# ╔═║ 35b9f77a-e939-42ef-9bfa-da2e30ffe659 +md""" +## 1.1 Linear air resistance +""" + +# ╔═║ d2e7a649-2196-4f11-a790-96ce43396821 +md""" +Let's implement the model above in Catalyst, where we 'create' the properties of the system: +""" + +# ╔═║ c27d4852-4852-41ba-a1b6-759b8efde91e +model_linear = @reaction_network begin + @parameters k g + g - k*v, βˆ… β†’ v + v, βˆ… β†’ x +end + +# ╔═║ d4b00278-6933-45d8-bdfd-8d98682fd838 +md""" +We verify the differential equations of the model: +""" + +# ╔═║ a324dda4-c785-4ad0-8f2f-0b1e5ae5445b +convert(ODESystem, model_linear) + +# ╔═║ f01a8cd4-87de-44a1-ba58-d1dd78e4f5f3 +md""" +We will solve the model and plot the solution for different values of $k$ using a slider. See below. +""" + +# ╔═║ a75ce9c0-4e06-4950-a4f9-3baa5027a534 +u0 = [:v => 0.0, :x => 0.0] + +# ╔═║ 4fe4f7bb-aee5-44d7-8503-916e3829ce65 +tspan = (0.0, t[end]) + +# ╔═║ 0fb380cf-ba93-4e01-918a-c052b725fa0e +@bind k_linear Slider(0:0.1:1.5, default=0, show_value=true) + +# ╔═║ bd6a3907-bc0f-4cc0-b35c-e33af1ce9a5a +prob_linear = ODEProblem(model_linear, u0, tspan, [:k => k_linear, :g => g]) + +# ╔═║ 047bced8-8cdd-47c9-a683-4bb5adb208fd +sol_linear = solve(prob_linear); + +# ╔═║ 8c4f63ba-5424-44b0-aa85-3e32e7793fb0 +begin + td = 0:0.1:t[end] # vector to plot analytical solutions + + plot(sol_linear, label=["v, velocity (model)" "x, distance (model)"], lw=2) + + scatter!(t, d, label="d, measured distance", markersize=5) + + plot!(td, g*td.^2/2, ls=:dash, label="x, k=0 (analytical)", lw=2, c=:grey) + plot!(td, @. g/k_linear^2*(k_linear*td + exp(-k_linear*td) - 1); ls=:dashdot, label="x, k>0 (analytical)", lw=1, c=:black) + + ylims!(0, 10) + plot!(legend_position=:bottomright) + title!("Predicted position vs data: linear model") +end + +# ╔═║ 32545342-1704-412f-a898-a3d1f5d3593d +md""" +!!! question + How do we interpret this simulation? Can we decide on the approppriateness of such a model? +""" + +# ╔═║ a490335d-0142-48a8-b3be-656bef552139 +md""" +Answer: +- For $k=0$, the model is equivalent to no air resistance. The velocity increases indefinitely, and thus the distance of the projectile increases quadratically. This doesn't correspond to the data. +- For increasing values of $k>0$, the modeled distance fits much better the measurements. +""" + +# ╔═║ 85471dd1-df76-4718-a7ee-d501bb8a2030 +md""" +## 1.2 Calibration of the model +""" + +# ╔═║ 4bde3bb3-5dcd-42d4-ae48-b922e99a04bc +md""" +We create a Turing model with both parameters $k$ and $g$, where only the first one is calibrated: +""" + +# ╔═║ fa3383e4-f5fa-4d47-b21b-684c6aacbd46 +@model function linear(t) + Οƒ_x ~ InverseGamma() + k ~ LogNormal() + params_linear = [:k => k, :g => g] + oprob_linear = ODEProblem(model_linear, u0, tspan, params_linear) + osol_linear = solve(oprob_linear, Tsit5(), saveat=t) + x ~ MvNormal(osol_linear[:x], Οƒ_x^2 * I) +end + +# ╔═║ 1f36c90e-ec20-4bdb-8bd0-5f44f03a1748 +mod_linear_cond = linear(t) | (x = d,) + +# ╔═║ c4de5cb6-4b84-46b0-acc5-01aea794de3e +results_linear = optimize(mod_linear_cond, MLE(), NelderMead()) + +# ╔═║ 3153b018-57f8-4d7a-bfb9-c4ca2886363a +coeftable(results_linear) + +# ╔═║ 7551a678-2873-4d10-bef7-81fd0e275b9f +k_opt_linear = coef(results_linear)[:k] + +# ╔═║ 621a2943-bb80-414e-babf-b5b2eac7269a +prob_opt_linear = remake(prob_linear, p=[:k => k_opt_linear]) + +# ╔═║ cd8d78e3-18d3-4af1-ac69-71d007d41b7e +sol_opt_linear = solve(prob_opt_linear); + +# ╔═║ 0c9eb9d0-cda4-4f71-ba80-7f16680201d2 +begin + plot() + plot!(sol_linear; idxs=:x, ls=:dash, label="candidate model, k=$k_linear", lw=2) + plot!(sol_opt_linear; idxs=:x, label="calibrated model, k=$k_opt_linear", lw=3) + scatter!(t, d, label="measured data", markersize=5) + xlabel!("time (seconds)") + ylabel!("distance (meters)") + title!("Model prediction vs. measured position") +end + +# ╔═║ 1d5a95fb-2aeb-4a1e-808b-74b086970556 +md""" +!!! note + It seems we have found a good model for the air resistance. *But is this the best model of them all?* +""" + +# ╔═║ 3d2e0801-b075-4f91-a9db-55cdda05477d +md""" +# 2. Model selection criteria +""" + +# ╔═║ 8cc42a7b-ba84-43d0-aafa-344712e882c6 +md""" +## 2.1 Akaike information criterion +""" + +# ╔═║ b78015f8-5edd-4a64-9e9b-b6856c525767 +md""" +We implement here again a function to calculate the AIC criterion based on the calibration results. +""" + +# ╔═║ f5bdb7b0-5a32-42cf-9461-75a8b5b513c2 +function AIC(results, measurements) + L = results.lp + k = length(coef(results)) + n = length(measurements) + + return round(2k - 2L; digits=3) # L = log-likelihood +end + +# ╔═║ 1d8a59eb-67b2-4242-9ab3-96fec2856622 +md""" +## 2.2 Bayesian information criterion +""" + +# ╔═║ d6b22a0e-f2d1-4869-8405-46d163686061 +md""" +The same can be done for the BIC criterion. +""" + +# ╔═║ fb75ff46-58d4-4bb9-a7d9-36b66124ea90 +function BIC(results, measurements) + L = results.lp + k = length(coef(results)) + n = length(measurements) + + return round(k*log(n) - 2L; digits=3) # L = log-likelihood +end + +# ╔═║ a6e960f6-fe3e-4f0e-9ee0-358010da6e39 +md""" +## 2.3 Least squares problem +""" + +# ╔═║ abd8fec6-b1d9-467b-a543-e479506b134f +md""" +The least squares alternative form of both AIC and BIC can also be used. +""" + +# ╔═║ 9db0f7d9-1d0c-40f7-89ef-a4786f8978ea +function AIC_LS(SSR, n, k) + if n > 40 + return 2k + n*log(SSR/n) + else + return 2k + n*log(SSR/n) + 2k*(k+1)/(n-k-1) + end +end + +# ╔═║ a78f8bbb-52c5-45db-90c2-60837eefa6be +function BIC_LS(SSR, n, k) + return k*log(n) + n*log(SSR/n) +end + +# ╔═║ 5e6bc47b-bdf3-4b49-babb-6f3bf795fb7a +md""" +We can thus obtain the squared sum of residuals from the calibrated model prediction and the data: +""" + +# ╔═║ 4d5cd521-bffd-4f30-8a23-a04b3c5b9624 +function SSR(y_pred, y_data) + return sum((y_pred - y_data).^2) # squared sum of residuals +end + +# ╔═║ 2393409e-b5ec-4ce9-a818-c2a89bf50885 +md""" +## 2.4 Posterior probabilities +""" + +# ╔═║ 5c500c1a-a15a-49bf-bd74-53985a484f19 +md""" +We can use the AIC to compute the posterior probabilities of the different candidate models: + +$P(M_i|D) \propto \exp(-AIC(M_i)/2)$ +""" + +# ╔═║ e56041b0-e722-40ae-8310-64d7069446a7 +md""" +The following function will use the supplied AIC of several models to compute the normalized posterior probability that the model is the "true model", explaining the considered data set: +""" + +# ╔═║ ca46ccb7-523c-4540-8daa-f6ee5f134f8f +function posterior(AICs) # AICs vector of AIC values + AICmin = minimum(AICs) + posterior = zeros(length(AICs)) + + for i in 1:length(AICs) + posterior[i] = exp((AICmin-AICs[i])/2) + end + + return round.(posterior/sum(posterior); digits=3) # normalized sum +end + +# ╔═║ c8f0cc9b-ff34-4baa-8234-b828df4fe894 +md""" +# 3. Resistance models +""" + +# ╔═║ d0c9e1f1-ac1a-44c9-aaec-6c1cfd75f80d +md""" +We will examine several different models for the force of air resistance on the projectile as it falls. The models to be examined are: + +(a) No air resistance. \ +(b) Air resistance proportional to speed. \ +(c) Air resistance proportional to the square of speed. \ +(d) Air resistance proportional to a more general quadratic function of speed. \ +(e) Air resistance proportional to an rth power of speed. + +We’ll formulate and solve an ODE model for each possibility and compare how well each model fits the data. To decide which model is best we’ll invoke several **model selection criteria** (AIC, BIC, etc.). +""" + +# ╔═║ 57f02857-1032-4ce2-a4fb-1cbeb6b6ac3d +md""" +$v'(t) = g - F\big(v(t)\big)$ +""" + +# ╔═║ f2f496ab-4354-4d80-888e-89367efa00b0 +md""" +The goal is to determine which type of function for $F$ best models air resistance in this situation by making use of the data in the table above. The choices for air resistance models listed above lead to the following possibilities: + +| Model | $F(v)$| +|:---|:---| +|(a) No air resistance |$F(v) = 0$ | +|(b) Linear air resistance |$F(v) = kv$ for some positive constant $k$ | +|(c) Pure quadratic resistance |$F(v) = kv^2$ for some positive constant $k$ | +|(d) General quadratic resistance |$F(v) = k_1v+k_2v^2$ for positive constants $k_1$ and $k_2$ | +|(e) General power law resistance |$F(v) = kv^r$ for positive constants with $k$ and $r$ | + +""" + +# ╔═║ 06b3ede3-93b4-4784-8298-272f8646b1d5 +md""" +We have already implemented the linear model and, by extension, the no resistance model ($k=0$). +""" + +# ╔═║ d6bba283-75ed-40a4-a7ef-48f74c305ff2 +md""" +For the remaining models, we will need to estimate the different parameters if we want to assess the quality of the fit. This will already provide us some results for the choice of best resistance model. +""" + +# ╔═║ 5d829be3-9bc9-4889-82d5-dc3a755b6435 +md""" +## 3.1 No air resistance +""" + +# ╔═║ 712f8974-ba9f-46b6-b569-fb9741567292 +model_nr = @reaction_network begin + @parameters g + g, βˆ… β†’ v + v, βˆ… β†’ x +end + +# ╔═║ 8ca0791a-3da5-4b08-bf80-8221e4646297 +sys_nr = convert(ODESystem, model_nr) + +# ╔═║ 6652e22c-2600-4ab6-b84a-2205582de261 +prob_nr = ODEProblem(model_nr, u0, tspan, [:g => g]) + +# ╔═║ f72e9d76-76d4-4da6-8c9c-c4fe433d4611 +sol_nr = solve(prob_nr); + +# ╔═║ 90b9a18d-eaa8-4674-a092-82e6cb3ae8b1 +begin + plot() + plot!(sol_nr; idxs=[:x], label="no air resistance", lw=3) + plot!(td, g*td.^2/2, linestyle=:dash, label="analytical solution") + scatter!(t, d, label="measured distance", markersize=5) + xlabel!("time (seconds)") + ylabel!("distance (meters)") + title!("No resistance model") +end + +# ╔═║ 381df36b-1766-4be3-aa32-01d995ab72c0 +md""" +Let's now estimate the distance assuming a noisy error and no calibrated parameters. +""" + +# ╔═║ 965ebc6f-b440-42da-8aa7-00b22e6d0a3f +@model function no_resistance(t) + Οƒ_x ~ InverseGamma() + params_nr = [:g => g] + oprob_nr = ODEProblem(model_nr, u0, tspan, params_nr) + osol_nr = solve(oprob_nr, Tsit5(), saveat=t) + x ~ MvNormal(osol_nr[:x], Οƒ_x^2 * I) +end + +# ╔═║ d7514616-736b-4cc3-a562-c23fb3d6924d +model_nr_cond = no_resistance(t) | (x = d,) + +# ╔═║ 4b953047-0f78-4c06-833f-3302a61882fc +results_nr = optimize(model_nr_cond, MLE(), NelderMead()) + +# ╔═║ 14dca280-a67f-4760-ac3a-dd7d88155754 +md""" +We can obtain the log-probability or likelihood `L` of this model explaining the data from the results: +""" + +# ╔═║ d451a113-249f-4a52-b753-45170c84a593 +L_nr = results_nr.lp + +# ╔═║ 9fe87e80-709e-41dc-b2d2-0569c34aeb5d +md""" +If we obtain the maximum likelihood for the other candidate models, we can use it to compare them. +""" + +# ╔═║ a863f1ae-a06c-4829-9fb5-54c3a2f709aa +md""" +We can also calculate the AIC. For the no resistance model, we include the model error as parameter: +""" + +# ╔═║ eea8f1c3-a852-47d8-af77-588fa6499e84 +k_nr = length(coef(results_nr)) # k here is no. of parameters + +# ╔═║ 4150f328-cf18-4e07-ba35-49f9db3d54fb +md""" +We calculate the AIC and BIC below: +""" + +# ╔═║ 79e107ca-cc86-494f-9f87-f594d9bb874c +AIC_nr = AIC(results_nr, d) + +# ╔═║ ee1909ff-7334-4874-baf6-1f5a4d5e897d +BIC_nr = BIC(results_nr, d) + +# ╔═║ 295db3bc-2007-4d18-928d-e7f67815c538 +md""" +For the sum of square residuals, we need to make sure that model predictions are created at the times for which we have measurements. This is simply enforced by creating simulations at times `t`: +""" + +# ╔═║ 76159175-f38f-4979-9132-dfc4b12d3b30 +sol_opt_nr = solve(prob_nr, Tsit5(), saveat=t); + +# ╔═║ 7cb8b9ac-bb09-424d-a661-12860446a03c +SSR_nr = SSR(sol_opt_nr[:x], d) + +# ╔═║ 8961def3-e608-4aa4-842d-4a4565aa57f2 +n = length(d) + +# ╔═║ 9c083fda-ff0c-438e-abab-32e9845ee299 +AIC_LS_nr = AIC_LS(SSR_nr, n, k_nr) + +# ╔═║ b2dc3596-b7b5-4791-8251-83ca8070afd8 +md""" +## 3.2 Linear air resistance +""" + +# ╔═║ 2d4008e9-45fd-4bad-941d-51acb6c37a36 +results_linear + +# ╔═║ 558e7a9b-85fd-44e0-8e36-5c32e3476964 +coeftable(results_linear) + +# ╔═║ 3601dba1-43f9-4f50-b1fe-37a4f26985a8 +k_lin = length(coef(results_linear)) + +# ╔═║ 99a6cb5b-fe85-4476-abdc-471eadf6add6 +L_linear = results_linear.lp + +# ╔═║ b55eaf74-9e69-4ab7-925c-db973cd0b667 +AIC_linear = AIC(results_linear, d) + +# ╔═║ a85d7e97-9e0a-4e5e-af87-5816f2b0e44a +BIC_linear = BIC(results_linear, d) + +# ╔═║ 43bab8a0-fcb4-496a-8a0b-34beb3dd1766 +sol_linear_t = solve(prob_opt_linear, Tsit5(), saveat=t); + +# ╔═║ 66d87f17-36c5-476f-8696-e69ae55091b4 +SSR_linear = SSR(sol_linear_t[:x], d) + +# ╔═║ c59be115-75b8-4432-8cd0-61c7c4449ac0 +AIC_LS_linear = AIC_LS(SSR_linear, n, k_linear) + +# ╔═║ a3c53584-7f2e-4324-ac45-ef3183a40c47 +md""" +## 3.3 Pure quadratic resistance +""" + +# ╔═║ 17113056-e45f-4977-a022-22de535b1a49 +model_quad = @reaction_network begin + @parameters k g + g - k*v^2, βˆ… β†’ v + v, βˆ… β†’ x +end + +# ╔═║ a0227fba-9aca-46b1-aa78-c56742890e74 +convert(ODESystem, model_quad) + +# ╔═║ 20d5a4d5-3d17-488a-bda6-62a180e459be +prob_quad = ODEProblem(model_quad, u0, tspan, [:k => 1, :g => g]) + +# ╔═║ 250bd1af-97d6-4fd2-bd5f-2b10f3e3e212 +sol_quad = solve(prob_quad); + +# ╔═║ b0908503-1523-4a35-bc2f-5087650e537e +@model function quadratic1(t) + Οƒ_x ~ InverseGamma() + k ~ LogNormal() + params_quad = [:k => k, :g => g] + oprob_quad = ODEProblem(model_quad, u0, tspan, params_quad) + osol_quad = solve(oprob_quad, Tsit5(), saveat=t) + x ~ MvNormal(osol_quad[:x], Οƒ_x^2 * I) +end + +# ╔═║ 8d95ddb9-bd58-4aea-9c8f-28e2f2119be2 +quad_cond1 = quadratic1(t) | (x = d,) + +# ╔═║ 88c228fe-2aca-4058-803f-31d460ad1915 +results_quad1 = optimize(quad_cond1, MLE(), NelderMead()) + +# ╔═║ fec66ee6-88f5-4491-8b80-d5e12d4fec01 +coeftable(results_quad1) + +# ╔═║ 6e804a51-3a8c-45c0-b078-33af8ca96040 +k_opt_quad1 = coef(results_quad1)[:k] + +# ╔═║ 85c68c99-35a8-49e3-bc60-6138e45637fc +model_quad_opt1 = remake(prob_quad, p=[:k => k_opt_quad1]) + +# ╔═║ 2a588744-d5c9-4e95-86e6-847fc9397663 +sol_opt_quad1 = solve(model_quad_opt1); + +# ╔═║ 70369ddb-39b0-4ca0-9524-a12990e3478a +begin + plot() + plot!(sol_quad; idxs=:x, label="initial value, k=1", lw=2, ls=:dash) + plot!(sol_opt_quad1; idxs=:x, label="calibrated model, k=$k_opt_quad1", lw=3) + scatter!(t, d, label="measured distance", markersize=5) + xlabel!("time (seconds)") + ylabel!("distance (meters)") + title!("Pure quadratic model") +end + +# ╔═║ d04ec167-203f-413b-aea5-a1a5cbdc70a2 +k_quad1 = length(coef(results_quad1)) + +# ╔═║ 6ce08886-9271-4628-9afb-5f7f6778fef8 +L_quad1 = results_quad1.lp + +# ╔═║ 3cd13eef-7954-4245-ac76-74eb4cf57b2c +AIC_quad1 = AIC(results_quad1, d) + +# ╔═║ 263d4146-e574-4576-8db4-77aa799d7c1a +BIC_quad1 = BIC(results_quad1, d) + +# ╔═║ 32a9b18f-ed5b-498d-bc49-129f2427616b +sol_quad1 = solve(model_quad_opt1, Tsit5(), saveat=t); + +# ╔═║ 39a435b3-7e9c-4dd5-9027-a751d4b20167 +SSR_quad1 = SSR(sol_quad1[:x], d) + +# ╔═║ 753a58ec-4a82-480b-bcd3-50448ae09503 +AIC_LS_quad1 = AIC_LS(SSR_quad1, n, k_quad1) + +# ╔═║ 9e617891-4a1c-4e56-a7b2-177168d572e0 +BIC_LS_quad1 = BIC_LS(SSR_quad1, n, k_quad1) + +# ╔═║ 42e9c861-a25a-4efc-bc6f-8d63c347c082 +md""" +!!! question + Is this the best resistance model that can fit the data? Can we find a better candidate model? +""" + +# ╔═║ 5d6f4d9a-fbe1-4b03-85de-d02d6f505c63 +md""" +## 3.4 General quadratic resistance +""" + +# ╔═║ e387491c-a191-47cf-b5c4-8ae6ba4f561a +model_quad2 = @reaction_network begin + @parameters k₁ kβ‚‚ g + g - (k₁*v + kβ‚‚*v^2), βˆ… β†’ v + v, βˆ… β†’ x +end + +# ╔═║ 990cd6d9-ef7e-4a62-83b8-7724515dfdcc +parameters(model_quad2) + +# ╔═║ 9c8f06fa-946a-4d2c-af3d-593a58bd0f92 +convert(ODESystem, model_quad2) + +# ╔═║ 4e5f5f05-7f1a-41cb-a7e9-431f53e97bb5 +prob_quad2 = ODEProblem(model_quad2, u0, tspan, [:k₁ => 1.0, :kβ‚‚ => 1.0, :g => g]) + +# ╔═║ 41ea7cc3-fe7e-4114-8725-1180b8eea871 +sol_quad2 = solve(prob_quad2); + +# ╔═║ 926154ef-34d7-452a-8627-bfb1c050a1b1 +begin + scatter(t, d, label="measured data", markersize=5) + plot!(sol_quad2, idxs=:x, label="quadratic model", lw=3) +end + +# ╔═║ ba0a576e-4b9b-49e1-bfbc-33955dcec808 +@model function quadratic2(t) + Οƒ_x ~ InverseGamma() + k₁ ~ LogNormal() + kβ‚‚ ~ LogNormal() + params_quad2 = [:k₁ => k₁, :kβ‚‚ => kβ‚‚, :g => g] + oprob_quad2 = ODEProblem(model_quad2, u0, tspan, params_quad2) + osol_quad2 = solve(oprob_quad2, Tsit5(), saveat=t) + x ~ MvNormal(osol_quad2[:x], Οƒ_x^2 * I) +end + +# ╔═║ edd1c981-56f6-44d8-a805-0b85c963b39b +model_quad_cond2 = quadratic2(t) | (x = d,) + +# ╔═║ bc173213-4ece-4358-9d70-f1f9f7edea8e +results_quad2 = optimize(model_quad_cond2, MLE(), NelderMead()) + +# ╔═║ a94febb7-163e-4f6e-91e5-1a1871e8ea39 +coeftable(results_quad2) + +# ╔═║ ec661503-a2e6-4a3d-a244-a4cafebcff60 +md""" +!!! question + What conclusion can you draw from the calibration? Is the generic quadratic model any better? +""" + +# ╔═║ f8b9f59c-71ef-426c-bf25-880d6660e9aa +md""" +- Answer: +""" + +# ╔═║ 2e8f3065-343f-482c-b3d3-0ace5337343d +k₁_opt = coef(results_quad2)[:k₁] + +# ╔═║ c73544a6-3b24-4f06-8b00-0e0e5059e5ee +kβ‚‚_opt = coef(results_quad2)[:kβ‚‚] + +# ╔═║ beb474e9-0694-457e-861a-e8ec9ddf865b +opt_quad2 = remake(prob_quad2, p=[:k₁ => k₁_opt, :kβ‚‚ => kβ‚‚_opt]) + +# ╔═║ b032789f-9f7a-45a3-a3fd-9186598bab28 +sol_opt_quad2 = solve(opt_quad2); + +# ╔═║ e0690c90-01f7-4e8d-9faf-6f9149a4031d +begin + plot() + plot!(sol_quad2, idxs=:x, label="initial values", ls=:dash, lw=2) + plot!(sol_opt_quad2, idxs=[:x], label="optimal values", lw=2) + scatter!(t, d, label="measured distance") + xlabel!("time (seconds)") + ylabel!("distance (meters)") + title!("General quadratic model") +end + +# ╔═║ 8a6c6123-36a2-4769-8f22-876eeccf3963 +k_quad2 = length(coef(results_quad2)) + +# ╔═║ 65aef305-fdaa-4262-8bc5-a22f5a0b42ca +L_quad2 = results_quad2.lp + +# ╔═║ 4dcbb097-8eda-4d34-8d9f-88ff185ef108 +AIC_quad2 = AIC(results_quad2, d) + +# ╔═║ a6e1fc57-2750-4765-925e-d321b23866e1 +BIC_quad2 = BIC(results_quad2, d) + +# ╔═║ 50213066-8eb4-4d89-a660-da71911104cc +sol_quad2_t = solve(opt_quad2, Tsit5(), saveat=t); + +# ╔═║ a75c3dc3-03bf-4ed4-8fe8-59a63a022030 +SSR_quad2 = SSR(sol_quad2_t[:x], d) + +# ╔═║ 6ec4751a-dd24-4da9-a864-1bde6aa5632d +AIC_LS_quad2 = AIC_LS(SSR_quad2, n, k_quad2) + +# ╔═║ c63dcc08-911f-49c5-9316-af07bc8c36b4 +BIC_LS_quad2 = BIC_LS(SSR_quad2, n, k_quad2) + +# ╔═║ b88b0d16-a178-4395-a54f-836d4090ccec +md""" +## 3.5 General power law resistance +""" + +# ╔═║ 763b603a-f81b-4d9e-a6eb-7dc345e3e2df +model_power = @reaction_network begin + @parameters r k g + g - k*v^r, βˆ… β†’ v + v, βˆ… β†’ x +end + +# ╔═║ 024b9f4e-600d-4d68-962d-a66c9b5a2f23 +parameters(model_power) + +# ╔═║ 343945bd-203d-4a9b-b46d-2a12b46ae32c +prob_power = ODEProblem(model_power, u0, tspan, [:r => 1.0, :k => 1.0, :g => g]) + +# ╔═║ 44a7a892-336f-4e52-a66d-230afbb75a7b +sol_power = solve(prob_power); + +# ╔═║ 4b53805c-c9ed-4708-b8a1-4922ce6d5a5d +@model function power(t) + Οƒ_x ~ InverseGamma() + k ~ LogNormal() + r ~ LogNormal() + params_power = [:k => k, :r => r, :g => g] + oprob_power = ODEProblem(model_power, u0, tspan, params_power) + osol_power = solve(oprob_power, Tsit5(), saveat=t) + x ~ MvNormal(osol_power[:x], Οƒ_x^2 * I) +end + +# ╔═║ 4e579e09-2476-432d-8eb4-7a1080376998 +model_power_cond = power(t) | (x = d,) + +# ╔═║ 02f2f82c-4c69-4fc3-90b1-ea0a8796fe12 +results_power = optimize(model_power_cond, MLE(), NelderMead()) + +# ╔═║ 1943119c-3007-4495-8148-1c346f052a72 +coeftable(results_power) + +# ╔═║ d178630c-289d-4917-a182-8f95409d14c3 +k_opt_power = coef(results_power)[:k] + +# ╔═║ b42769d2-16d2-449d-8925-fd5b71ddced3 +r_opt_power = coef(results_power)[:r] + +# ╔═║ 06b60440-696e-4067-9772-2b91f4be9cbd +opt_power = remake(prob_power, p=[:k => k_opt_power, :r => r_opt_power]) + +# ╔═║ 54e63222-6434-4f63-81fa-ab6d5d8fd7da +sol_opt_power = solve(opt_power); + +# ╔═║ 7ea9a771-d692-4ce1-88d8-0a31047dca3d +begin + plot() + plot!(sol_power, idxs=:x, label="initial values", ls=:dash, lw=2) + plot!(sol_opt_power; idxs=:x, label="optimal values", lw=3) + scatter!(t, d, label="measured distance", markersize=5) + xlabel!("time (seconds)") + ylabel!("distance (meters)") + title!("Power law model") +end + +# ╔═║ f2f65b41-edb4-411f-aa4c-cef53e5aaefe +sol_power_t = solve(opt_power, Tsit5(), saveat=t); + +# ╔═║ 6ee18e30-996b-4e30-b0ec-39cf859d5d5a +k_power = length(coef(results_power)) + +# ╔═║ 8740b8b8-06a9-420b-8526-2adf5f8219a3 +L_power = results_power.lp + +# ╔═║ e49c777a-a2c3-4725-a9ba-abb7d8536d2e +AIC_power = AIC(results_power, d) + +# ╔═║ 8fe403f4-2f3b-482b-91b6-e49672f98d23 +BIC_power = BIC(results_power, d) + +# ╔═║ 88fb0c51-9005-44de-bb15-660ddb9d3165 +SSR_power = SSR(sol_power_t[:x], d) + +# ╔═║ bbd11d02-29ca-4b4d-b08f-2c4b460fd5c5 +AIC_LS_power = AIC_LS(SSR_power, n, k_power) + +# ╔═║ e4c1292a-be82-466f-a586-430f7d34f9bb +BIC_LS_power = BIC_LS(SSR_power, n, k_power) + +# ╔═║ 3a1ce3ee-864b-4144-a9da-3d66bd1870e9 +md""" +# 4. Model comparison +""" + +# ╔═║ da1dc114-8529-4ef8-b3af-2acb066fa02f +md""" +We can compare now all candidate models. Since we have found all calibrated parameters, we can plot all model predictions against the data. +""" + +# ╔═║ e84a0ef5-a6e9-4c66-a44c-81e7ef70351d +begin + # k = k_lin_opt + plot() + plot!(sol_nr, idxs=:x, label="no air resistance", lw=2) + plot!(sol_opt_linear, idxs=:x, label="linear", lw=2, ls=:dot) + plot!(sol_opt_quad1, idxs=:x, label="quadratic 1", lw=2, ls=:dashdot) + plot!(sol_opt_quad2, idxs=:x, label="quadratic 2", lw=2, ls=:dashdot) + plot!(sol_opt_power, idxs=:x, label="power law", lw=2, ls=:dashdot) + scatter!(t, d, label="measured distance", markersize=5) + ylims!(0, 10) + xlabel!("time (seconds)") + ylabel!("distance (meters)") + title!("Comparison all resistance models") +end + +# ╔═║ 9b8392a5-fc9f-433f-9b23-dab2dd472021 +md""" +Both the no resistance and linear models fit worse. The more complex models are indistinguisable. +""" + +# ╔═║ 8d1c2906-f7bf-4557-81af-43b8d9b2a260 +md""" +Since we cannot tell these very similar complex models apart, we will use the model selection criteria to rank them. The following graph should summarize everything once they have all been calculated. +""" + +# ╔═║ 520e22a5-e08f-4718-bf2f-f1e7e627a417 +AIC_nr, AIC_linear, AIC_quad1, AIC_quad2, AIC_power + +# ╔═║ 8fd5f30a-ef31-442f-9124-8ca86a3b9b56 +plot( + bar(1:3, [AIC_quad1, AIC_quad2, AIC_power], title="AIC", ylims=(-78, -70)), + bar(1:3, [BIC_quad1, BIC_quad2, BIC_power], title="BIC", ylims=(-78, -70)), + bar(1:3, [L_quad1, L_quad2, L_power], title="Log-probability", ylims=(38, 40)), + bar(1:3, [k_quad1, k_quad2, k_power], title="k", ylims=(0, 4)), + xticks=(1:3, ["Quad (1)", "Quad (2)", "Power"]), + legend=:none +) + +# ╔═║ 5e8a4a93-7316-4b61-b1e0-bce46597f614 +md""" +!!! question + Draw your conclusions for the best model based on the different criteria. What is your ranking? E.g.: for AIC, quad (1) = quad (2) > power; for Log-p, quad(1) = quad(2) ~Β power, etc. +""" + +# ╔═║ dde10d51-3d75-4152-a7da-c05b1affaa6a +md""" +- Answer: +""" + +# ╔═║ 8becb816-b96c-4df5-8af0-2464c7188d34 +md""" +Since we have calculated the AIC for all models, we can estimate the model posterior probabilities: +""" + +# ╔═║ 9bb200cc-09db-4f19-bf29-5b4a1cc78574 +posteriors = posterior([AIC_nr, AIC_linear, AIC_quad1, AIC_quad2, AIC_power]) + +# ╔═║ 28932b7c-35b0-4e8e-91f2-4dfd5a41407e +md""" +The following table summarizes the model selection criteria for all models. Analyze the ranking. +""" + +# ╔═║ 9dd416bc-eead-4a95-820c-6f0cdf532243 +md""" + +| Model | Resistance term | k | SSR | log(L) | AIC | BIC | $P(M_i\|D)$ | +|:---|:---|:---|:---|:---|:---|:---|:---| +|(a) No resistance |$F(v) = 0$ | $k_nr | $(round(SSR_nr;digits=3)) | $(round(L_nr;digits=3)) | $AIC_nr | $BIC_nr | $(posteriors[1]) +|(b) Linear |$F(v) = kv$ | $k_lin | $(round(SSR_linear;digits=3)) | $(round(L_linear;digits=3)) | $AIC_linear | $BIC_linear | $(posteriors[2]) +|(c) Pure quadratic |$F(v) = kv^2$ | $k_quad1 | $(round(SSR_quad1;digits=3)) | $(round(L_quad1;digits=3)) | $AIC_quad1 | $BIC_quad1 | $(posteriors[3]) +|(d) Gen. quadratic |$F(v) = k_1v+k_2v^2$ | $k_quad2 | $(round(SSR_quad2;digits=3)) | $(round(L_quad2;digits=3)) | $AIC_quad2 | $BIC_quad2 | $(posteriors[4]) +|(e) Gen. power law |$F(v) = kv^r$ | $k_power | $(round(SSR_power;digits=3)) | $(round(L_power;digits=3)) | $AIC_power | $BIC_power | $(posteriors[5]) +""" + +# ╔═║ 077a5018-538c-4c33-b703-f7258849f2f8 +md""" +!!! question + Write your final ranking for the candidate models, e.g. linear > quadratic > ... +""" + +# ╔═║ d00abaf7-10de-4f7a-9bb9-a476bf4b8351 +md""" +- Answer: +""" + +# ╔═║ a4156697-08c0-418f-95cd-bffe4295eb82 +md""" +!!! question + What candidate model would you select and why? Why would you choose it over the second one? +""" + +# ╔═║ 07d655d8-91ba-49d4-8e1d-d738826b8099 +md""" +- Answer: +""" + +# ╔═║ b3fa82ec-6686-40bf-8709-4d281dcb518f +md""" +!!! question + How would you combine the predictions of the different models using the posterior probability? +""" + +# ╔═║ 95aa37fe-3cb1-4a9a-952a-2bb2ea815a1b +md""" +- Answer: +""" + +# ╔═║ Cell order: +# ╠═be891cc2-f306-4cc8-97d7-1efa7f97ecd6 +# ╠═ef0b5541-3f36-4e79-87eb-0d73ffbd80d4 +# ╠═dd4af742-7f4a-4e38-9665-620a13b9d341 +# ╠═bbd6918a-1d4b-442d-81a7-e25c8f48c904 +# ╠═09902aca-cb98-41f4-93f4-a7530c4373ba +# ╠═579e2373-4836-4fd5-83b9-c6715984634c +# ╠═f9c07cce-bada-11ef-36af-9f9bf85ccc38 +# β•Ÿβ”€eb43c9e6-d47e-414f-987e-3dcc7a7c3124 +# β•Ÿβ”€66243d50-9a2d-40db-b879-304f182eb46b +# ╠═4a5e1692-171c-43fa-8309-b73c8ecd38c5 +# ╠═8a71f11b-3dab-4ee3-bc61-dc5327f37eb9 +# ╠═19bf959c-b385-44d3-8311-8f2d22e67584 +# β•Ÿβ”€cac10b59-aba7-4c0c-a699-02251a349dd4 +# β•Ÿβ”€16b137b5-466a-4206-8d33-de2bf4a8850a +# β•Ÿβ”€1dca1d32-42c3-4636-aa86-66bcd3ea2dcd +# β•Ÿβ”€211988a4-e589-4b8f-98e0-c1db92fe5030 +# ╠═7daa93a7-7968-4f7f-9e75-d27a412a7362 +# β•Ÿβ”€017e4b49-dda4-4be7-a6e9-e5bd09218c36 +# β•Ÿβ”€8145a2d1-c771-4530-8683-a057c4a4ad71 +# β•Ÿβ”€cc0130e0-6fb1-482e-8b80-6726d4e7a08c +# β•Ÿβ”€d8a642cc-9f5c-4696-8314-20a998498eee +# β•Ÿβ”€35b9f77a-e939-42ef-9bfa-da2e30ffe659 +# β•Ÿβ”€d2e7a649-2196-4f11-a790-96ce43396821 +# ╠═c27d4852-4852-41ba-a1b6-759b8efde91e +# β•Ÿβ”€d4b00278-6933-45d8-bdfd-8d98682fd838 +# ╠═a324dda4-c785-4ad0-8f2f-0b1e5ae5445b +# β•Ÿβ”€f01a8cd4-87de-44a1-ba58-d1dd78e4f5f3 +# ╠═a75ce9c0-4e06-4950-a4f9-3baa5027a534 +# ╠═4fe4f7bb-aee5-44d7-8503-916e3829ce65 +# ╠═bd6a3907-bc0f-4cc0-b35c-e33af1ce9a5a +# ╠═047bced8-8cdd-47c9-a683-4bb5adb208fd +# ╠═0fb380cf-ba93-4e01-918a-c052b725fa0e +# β•Ÿβ”€8c4f63ba-5424-44b0-aa85-3e32e7793fb0 +# β•Ÿβ”€32545342-1704-412f-a898-a3d1f5d3593d +# β•Ÿβ”€a490335d-0142-48a8-b3be-656bef552139 +# β•Ÿβ”€85471dd1-df76-4718-a7ee-d501bb8a2030 +# β•Ÿβ”€4bde3bb3-5dcd-42d4-ae48-b922e99a04bc +# ╠═fa3383e4-f5fa-4d47-b21b-684c6aacbd46 +# ╠═1f36c90e-ec20-4bdb-8bd0-5f44f03a1748 +# ╠═c4de5cb6-4b84-46b0-acc5-01aea794de3e +# ╠═3153b018-57f8-4d7a-bfb9-c4ca2886363a +# ╠═7551a678-2873-4d10-bef7-81fd0e275b9f +# ╠═621a2943-bb80-414e-babf-b5b2eac7269a +# ╠═cd8d78e3-18d3-4af1-ac69-71d007d41b7e +# β•Ÿβ”€0c9eb9d0-cda4-4f71-ba80-7f16680201d2 +# β•Ÿβ”€1d5a95fb-2aeb-4a1e-808b-74b086970556 +# β•Ÿβ”€3d2e0801-b075-4f91-a9db-55cdda05477d +# β•Ÿβ”€8cc42a7b-ba84-43d0-aafa-344712e882c6 +# β•Ÿβ”€b78015f8-5edd-4a64-9e9b-b6856c525767 +# ╠═f5bdb7b0-5a32-42cf-9461-75a8b5b513c2 +# β•Ÿβ”€1d8a59eb-67b2-4242-9ab3-96fec2856622 +# β•Ÿβ”€d6b22a0e-f2d1-4869-8405-46d163686061 +# ╠═fb75ff46-58d4-4bb9-a7d9-36b66124ea90 +# β•Ÿβ”€a6e960f6-fe3e-4f0e-9ee0-358010da6e39 +# β•Ÿβ”€abd8fec6-b1d9-467b-a543-e479506b134f +# ╠═9db0f7d9-1d0c-40f7-89ef-a4786f8978ea +# ╠═a78f8bbb-52c5-45db-90c2-60837eefa6be +# β•Ÿβ”€5e6bc47b-bdf3-4b49-babb-6f3bf795fb7a +# ╠═4d5cd521-bffd-4f30-8a23-a04b3c5b9624 +# β•Ÿβ”€2393409e-b5ec-4ce9-a818-c2a89bf50885 +# β•Ÿβ”€5c500c1a-a15a-49bf-bd74-53985a484f19 +# β•Ÿβ”€e56041b0-e722-40ae-8310-64d7069446a7 +# ╠═ca46ccb7-523c-4540-8daa-f6ee5f134f8f +# β•Ÿβ”€c8f0cc9b-ff34-4baa-8234-b828df4fe894 +# β•Ÿβ”€d0c9e1f1-ac1a-44c9-aaec-6c1cfd75f80d +# β•Ÿβ”€57f02857-1032-4ce2-a4fb-1cbeb6b6ac3d +# β•Ÿβ”€f2f496ab-4354-4d80-888e-89367efa00b0 +# β•Ÿβ”€06b3ede3-93b4-4784-8298-272f8646b1d5 +# β•Ÿβ”€d6bba283-75ed-40a4-a7ef-48f74c305ff2 +# β•Ÿβ”€5d829be3-9bc9-4889-82d5-dc3a755b6435 +# ╠═712f8974-ba9f-46b6-b569-fb9741567292 +# ╠═8ca0791a-3da5-4b08-bf80-8221e4646297 +# ╠═6652e22c-2600-4ab6-b84a-2205582de261 +# ╠═f72e9d76-76d4-4da6-8c9c-c4fe433d4611 +# β•Ÿβ”€90b9a18d-eaa8-4674-a092-82e6cb3ae8b1 +# β•Ÿβ”€381df36b-1766-4be3-aa32-01d995ab72c0 +# ╠═965ebc6f-b440-42da-8aa7-00b22e6d0a3f +# ╠═d7514616-736b-4cc3-a562-c23fb3d6924d +# ╠═4b953047-0f78-4c06-833f-3302a61882fc +# β•Ÿβ”€14dca280-a67f-4760-ac3a-dd7d88155754 +# ╠═d451a113-249f-4a52-b753-45170c84a593 +# β•Ÿβ”€9fe87e80-709e-41dc-b2d2-0569c34aeb5d +# β•Ÿβ”€a863f1ae-a06c-4829-9fb5-54c3a2f709aa +# ╠═eea8f1c3-a852-47d8-af77-588fa6499e84 +# β•Ÿβ”€4150f328-cf18-4e07-ba35-49f9db3d54fb +# ╠═79e107ca-cc86-494f-9f87-f594d9bb874c +# ╠═ee1909ff-7334-4874-baf6-1f5a4d5e897d +# β•Ÿβ”€295db3bc-2007-4d18-928d-e7f67815c538 +# ╠═76159175-f38f-4979-9132-dfc4b12d3b30 +# ╠═7cb8b9ac-bb09-424d-a661-12860446a03c +# ╠═8961def3-e608-4aa4-842d-4a4565aa57f2 +# ╠═9c083fda-ff0c-438e-abab-32e9845ee299 +# β•Ÿβ”€b2dc3596-b7b5-4791-8251-83ca8070afd8 +# ╠═2d4008e9-45fd-4bad-941d-51acb6c37a36 +# ╠═558e7a9b-85fd-44e0-8e36-5c32e3476964 +# ╠═3601dba1-43f9-4f50-b1fe-37a4f26985a8 +# ╠═99a6cb5b-fe85-4476-abdc-471eadf6add6 +# ╠═b55eaf74-9e69-4ab7-925c-db973cd0b667 +# ╠═a85d7e97-9e0a-4e5e-af87-5816f2b0e44a +# ╠═43bab8a0-fcb4-496a-8a0b-34beb3dd1766 +# ╠═66d87f17-36c5-476f-8696-e69ae55091b4 +# ╠═c59be115-75b8-4432-8cd0-61c7c4449ac0 +# β•Ÿβ”€a3c53584-7f2e-4324-ac45-ef3183a40c47 +# ╠═17113056-e45f-4977-a022-22de535b1a49 +# ╠═a0227fba-9aca-46b1-aa78-c56742890e74 +# ╠═20d5a4d5-3d17-488a-bda6-62a180e459be +# ╠═250bd1af-97d6-4fd2-bd5f-2b10f3e3e212 +# ╠═b0908503-1523-4a35-bc2f-5087650e537e +# ╠═8d95ddb9-bd58-4aea-9c8f-28e2f2119be2 +# ╠═88c228fe-2aca-4058-803f-31d460ad1915 +# ╠═fec66ee6-88f5-4491-8b80-d5e12d4fec01 +# ╠═6e804a51-3a8c-45c0-b078-33af8ca96040 +# ╠═85c68c99-35a8-49e3-bc60-6138e45637fc +# ╠═2a588744-d5c9-4e95-86e6-847fc9397663 +# β•Ÿβ”€70369ddb-39b0-4ca0-9524-a12990e3478a +# ╠═d04ec167-203f-413b-aea5-a1a5cbdc70a2 +# ╠═6ce08886-9271-4628-9afb-5f7f6778fef8 +# ╠═3cd13eef-7954-4245-ac76-74eb4cf57b2c +# ╠═263d4146-e574-4576-8db4-77aa799d7c1a +# ╠═32a9b18f-ed5b-498d-bc49-129f2427616b +# ╠═39a435b3-7e9c-4dd5-9027-a751d4b20167 +# ╠═753a58ec-4a82-480b-bcd3-50448ae09503 +# ╠═9e617891-4a1c-4e56-a7b2-177168d572e0 +# β•Ÿβ”€42e9c861-a25a-4efc-bc6f-8d63c347c082 +# β•Ÿβ”€5d6f4d9a-fbe1-4b03-85de-d02d6f505c63 +# ╠═e387491c-a191-47cf-b5c4-8ae6ba4f561a +# ╠═990cd6d9-ef7e-4a62-83b8-7724515dfdcc +# ╠═9c8f06fa-946a-4d2c-af3d-593a58bd0f92 +# ╠═4e5f5f05-7f1a-41cb-a7e9-431f53e97bb5 +# ╠═41ea7cc3-fe7e-4114-8725-1180b8eea871 +# β•Ÿβ”€926154ef-34d7-452a-8627-bfb1c050a1b1 +# ╠═ba0a576e-4b9b-49e1-bfbc-33955dcec808 +# ╠═edd1c981-56f6-44d8-a805-0b85c963b39b +# ╠═bc173213-4ece-4358-9d70-f1f9f7edea8e +# ╠═a94febb7-163e-4f6e-91e5-1a1871e8ea39 +# β•Ÿβ”€ec661503-a2e6-4a3d-a244-a4cafebcff60 +# ╠═f8b9f59c-71ef-426c-bf25-880d6660e9aa +# ╠═2e8f3065-343f-482c-b3d3-0ace5337343d +# ╠═c73544a6-3b24-4f06-8b00-0e0e5059e5ee +# ╠═beb474e9-0694-457e-861a-e8ec9ddf865b +# ╠═b032789f-9f7a-45a3-a3fd-9186598bab28 +# β•Ÿβ”€e0690c90-01f7-4e8d-9faf-6f9149a4031d +# ╠═8a6c6123-36a2-4769-8f22-876eeccf3963 +# ╠═65aef305-fdaa-4262-8bc5-a22f5a0b42ca +# ╠═4dcbb097-8eda-4d34-8d9f-88ff185ef108 +# ╠═a6e1fc57-2750-4765-925e-d321b23866e1 +# ╠═50213066-8eb4-4d89-a660-da71911104cc +# ╠═a75c3dc3-03bf-4ed4-8fe8-59a63a022030 +# ╠═6ec4751a-dd24-4da9-a864-1bde6aa5632d +# ╠═c63dcc08-911f-49c5-9316-af07bc8c36b4 +# β•Ÿβ”€b88b0d16-a178-4395-a54f-836d4090ccec +# ╠═763b603a-f81b-4d9e-a6eb-7dc345e3e2df +# ╠═024b9f4e-600d-4d68-962d-a66c9b5a2f23 +# ╠═343945bd-203d-4a9b-b46d-2a12b46ae32c +# ╠═44a7a892-336f-4e52-a66d-230afbb75a7b +# ╠═4b53805c-c9ed-4708-b8a1-4922ce6d5a5d +# ╠═4e579e09-2476-432d-8eb4-7a1080376998 +# ╠═02f2f82c-4c69-4fc3-90b1-ea0a8796fe12 +# ╠═1943119c-3007-4495-8148-1c346f052a72 +# ╠═d178630c-289d-4917-a182-8f95409d14c3 +# ╠═b42769d2-16d2-449d-8925-fd5b71ddced3 +# ╠═06b60440-696e-4067-9772-2b91f4be9cbd +# ╠═54e63222-6434-4f63-81fa-ab6d5d8fd7da +# β•Ÿβ”€7ea9a771-d692-4ce1-88d8-0a31047dca3d +# ╠═f2f65b41-edb4-411f-aa4c-cef53e5aaefe +# ╠═6ee18e30-996b-4e30-b0ec-39cf859d5d5a +# ╠═8740b8b8-06a9-420b-8526-2adf5f8219a3 +# ╠═e49c777a-a2c3-4725-a9ba-abb7d8536d2e +# ╠═8fe403f4-2f3b-482b-91b6-e49672f98d23 +# ╠═88fb0c51-9005-44de-bb15-660ddb9d3165 +# ╠═bbd11d02-29ca-4b4d-b08f-2c4b460fd5c5 +# ╠═e4c1292a-be82-466f-a586-430f7d34f9bb +# β•Ÿβ”€3a1ce3ee-864b-4144-a9da-3d66bd1870e9 +# β•Ÿβ”€da1dc114-8529-4ef8-b3af-2acb066fa02f +# β•Ÿβ”€e84a0ef5-a6e9-4c66-a44c-81e7ef70351d +# β•Ÿβ”€9b8392a5-fc9f-433f-9b23-dab2dd472021 +# β•Ÿβ”€8d1c2906-f7bf-4557-81af-43b8d9b2a260 +# ╠═520e22a5-e08f-4718-bf2f-f1e7e627a417 +# ╠═8fd5f30a-ef31-442f-9124-8ca86a3b9b56 +# β•Ÿβ”€5e8a4a93-7316-4b61-b1e0-bce46597f614 +# ╠═dde10d51-3d75-4152-a7da-c05b1affaa6a +# β•Ÿβ”€8becb816-b96c-4df5-8af0-2464c7188d34 +# ╠═9bb200cc-09db-4f19-bf29-5b4a1cc78574 +# β•Ÿβ”€28932b7c-35b0-4e8e-91f2-4dfd5a41407e +# β•Ÿβ”€9dd416bc-eead-4a95-820c-6f0cdf532243 +# β•Ÿβ”€077a5018-538c-4c33-b703-f7258849f2f8 +# ╠═d00abaf7-10de-4f7a-9bb9-a476bf4b8351 +# β•Ÿβ”€a4156697-08c0-418f-95cd-bffe4295eb82 +# ╠═07d655d8-91ba-49d4-8e1d-d738826b8099 +# β•Ÿβ”€b3fa82ec-6686-40bf-8709-4d281dcb518f +# ╠═95aa37fe-3cb1-4a9a-952a-2bb2ea815a1b diff --git a/make.jl b/make.jl new file mode 100644 index 00000000..15e39d7c --- /dev/null +++ b/make.jl @@ -0,0 +1,17 @@ +#= +Created on 12/02/2024 12:04:58 +Last update: - + +@author: Michiel Stock +michielfmstock@gmail.com + +Builds this entire project +=# + +## Run all the scripts + +#inlude("scrips/...") + +## Build Tex file of the course + +run(`pdflatex course/main.tex`) \ No newline at end of file diff --git a/makefigs.jl b/makefigs.jl new file mode 100644 index 00000000..22e1a9fa --- /dev/null +++ b/makefigs.jl @@ -0,0 +1,33 @@ +# A julia script to run the notebooks and save the figures + +using Plots + +fontscale = 1.5 + +notebooks = Dict( + "modelling_distributions.jl" => "probmod", + "MCMC.jl" => "MCMC", + #"simulation_tools.jl" => "simulation_tools", + #"modelling_ODEs.jl" => "ODEs", + #"optimization.jl" => "optimization", + #"calibration.jl" => "calibration", # LV very unstable, might need to rerun several times + #"uncertainty.jl" => "uncertainty", + #"hiptobesquare.jl" => "model_selection", +) + + +for (nb, dir) in notebooks + # run notebook and generate a plots dict + let + println("$dir : $nb") + include(joinpath("scripts", nb)) + for (name, pl) in plots + Plots.scalefontsizes(fontscale) + savefig(pl, joinpath("figures", dir, name * "_sb.pdf")) + Plots.scalefontsizes(1/fontscale) + savefig(pl, joinpath("figures", dir, name * ".pdf")) + end + end +end + +# reset font diff --git a/notebook-checks/make.jl b/notebook-checks/make.jl new file mode 100644 index 00000000..d31314d4 --- /dev/null +++ b/notebook-checks/make.jl @@ -0,0 +1,83 @@ +# use julia 1.10! +using Pkg; Pkg.activate("./exercises/solved_notebooks") +using PlutoStaticHTML +using Documenter + +cd(@__DIR__) + + +# Export notebooks to markdown using PlutoStaticHTML.jl + +notebookdir = "../exercises/solved_notebooks" +outputdir = "./src" +write("log.txt", "") # clean log + +subdirs = readdir(notebookdir, join = true) |> x -> filter(isdir, x) +for subdir in subdirs + # generate documenter-style markdown files from all pluto notebooks + bopts = BuildOptions(subdir, output_format = documenter_output) + oopts = OutputOptions( + show_output_above_code = true, # show output above code rather than below, to mirror OG Pluto.jl + convert_admonitions = false # dont change html style of admonitions like `!!! note Hello I am note`, looks weird + ) + try # prevent error in one practical from stopping the rest + build_notebooks(bopts) + catch e + # log error + open("log.txt", "a") do f + write(f, e.msg, "\n\n\n") + end + end + + # move the markdown files to their designated folder (they are generated in the folder of the pluto notebooks) + md_files = readdir(subdir) |> x -> filter(name -> name[end-2:end] == ".md", x) # get all .md files + subdirname = split(subdir, ['\\', '/'])[end] # get name of subdir from its path + for md_file in md_files + mv(subdir * "/" * md_file, outputdir * "/" * subdirname * "/" * md_file, force = true) + end +end + + +# Generate HTML from markdown files using Documenter.jl + +function get_title(filepath::String) + lines = readlines(filepath) + matches = [match(r"(?<=)", line) for line in lines] |> + x -> filter(!isnothing, x) + firstmatch = first(matches).match + title = split(firstmatch, '>')[2] |> string + return title +end + +subdirnames = split.(subdirs, ['\\', '/']) .|> last .|> string + +exercise_pages = [ + "Practicum $i" => [ + get_title("./src/" * subdirname * "/" * file) => subdirname * "/" * file + for file in readdir("./src/" * subdirname) + ] + for (i, subdirname) in enumerate(subdirnames) +] + +pages = ["Introduction" => "index.md"; exercise_pages] +write("./src/index.md", "# ModSim exercises\n\nProof of concept for static notebook generation.") + +makedocs(; + sitename = "ModSim", + pages, + format = Documenter.HTML( + size_threshold = 2000 * 1024, # Allow generation of large notebooks + mathengine = MathJax3() # for LaTeX equations in notebooks + ), + warnonly = true # Only warn, don't error if notebooks are large +) + + +# Throw error at end if any notebook failed to compile + +if !isempty(readlines("log.txt")) + error("Notebook compilation failed for one or more practicals.") +end + +using LiveServer +serve(dir = "./build", launch_browser = true) \ No newline at end of file diff --git a/notebook-checks/sync_exercises.jl b/notebook-checks/sync_exercises.jl deleted file mode 100644 index 973009e0..00000000 --- a/notebook-checks/sync_exercises.jl +++ /dev/null @@ -1,205 +0,0 @@ -#!/usr/bin/env julia -# Generate src/exercises/*.jl (the website copies) from the student notebooks in -# exercises/student_notebooks/P*/*.jl. The student notebooks are the source of truth; -# NEVER edit src/exercises/*.jl by hand. -# -# julia notebook-checks/sync_exercises.jl # (re)write src/exercises/*.jl -# julia notebook-checks/sync_exercises.jl --check # exit 1 if src/exercises is stale -# -# stdlib only, no --project needed. -# -# What the generated copy adds on top of the student notebook: -# 1. a `#> [frontmatter]` block (order/title/description/author from the table below) -# right after the Pluto header, followed by a blank line; -# 2. in the (unique) `Pkg.activate("..")` cell: two advice comment lines and the -# body normalised to `using Pkg; Pkg.activate("../../pluto-deployment-environment")`. -# Everything else (including the Pluto version stamp on line 2) is copied verbatim. - -const ROOT = normpath(joinpath(@__DIR__, "..")) -const STUDENT_DIR = joinpath(ROOT, "exercises", "student_notebooks") -const SRC_DIR = joinpath(ROOT, "src", "exercises") - -const PDE_ACTIVATE = "using Pkg; Pkg.activate(\"../../pluto-deployment-environment\")" -const ADVICE = [ - "# Running this yourself? Point this at your own environment β€”", - "# we advise one shared project in the parent folder: Pkg.activate(\"..\")", -] -const TAGS = "[\"exercises\"]" -const LAYOUT = "\"layout.jlhtml\"" - -# filename => (order, title, description, author). `author = nothing` omits the author block. -# Order decides the position in the website sidebar. -const FRONTMATTER = Dict{String,NamedTuple}( - # P1_mtk - "ode_model_mtk_intro.jl" => (order = "1", title = "1. ODE_model_MTK_intro", description = "Introduction to ModelingToolkit", author = nothing), - "ode_model_irrigation_mtk.jl" => (order = "2", title = "1. ODE_model_irrigation", description = "Modeling of irrigation with MTK", author = "Gauthier Vanhaelewyn"), - "ode_model_diver_mtk.jl" => (order = "3", title = "1. ODE_model_diver", description = "modeling of pressure on diver with MTK", author = "Gauthier Vanhaelewyn"), - "ode_model_tank_h_mtk.jl" => (order = "4", title = "1. ODE_model_tank_h_mtk", description = "modeling the height of the water in a tank", author = nothing), - "ode_model_tractor_seat_mtk.jl" => (order = "5", title = "1. ODE_model_tractor_seat", description = "modeling the movement of a oscilatory tractor seat", author = nothing), - "ode_model_XTRA_tank_T_h_mtk.jl" => (order = "6", title = "1. ODE_model_Xtra_tank", description = "extra exercises on modeling water height in a tank", author = nothing), - "ode_model_XTRA_temp_reactors_mtk.jl" => (order = "7", title = "1. ODE_model_temp_reactor", description = "modeling temperature in a CSTR", author = nothing), - "ode_model_XTRA_water_evap_infil_mtk.jl" => (order = "8", title = "1. ODE_model_Xtra_evaporation", description = "modeling evaporation and infiltration in ground", author = nothing), - # P2_ode - "ode_model_catalyst_intro.jl" => (order = "9", title = "2. ODE_model_Catalyst_intro", description = "Introduction to Catalyst as an alternative to ModelingToolkit", author = "Gauthier Vanhaelewyn"), - "ode_model_birth_death.jl" => (order = "10", title = "2. ODE_model_birth_death", description = "Simple birth-death model for a mice population", author = "Gauthier Vanhaelewyn"), - "ode_model_fermenter_monod.jl" => (order = "11", title = "2. ODE_model_fermenter_monod", description = "Fermenter with biomass growing on substrate through Monod kinetics", author = "Gauthier Vanhaelewyn"), - "ode_model_infection.jl" => (order = "12", title = "2. ODE_model_infection", description = "Infection model built as a reaction network", author = "Gauthier Vanhaelewyn"), - "ode_model_XTRA_fermenter_firstorder.jl" => (order = "13", title = "2. ODE_model_Xtra_fermenter_firstorder", description = "Extra exercise on a fermenter with first-order kinetics", author = "Gauthier Vanhaelewyn"), - "ode_model_XTRA_anaerobic_fermentation.jl"=> (order = "14", title = "2. ODE_model_Xtra_anaerobic_fermentation", description = "Extra exercise on anaerobic fermentation", author = "Gauthier Vanhaelewyn"), - "ode_model_XTRA_soil_cont_plant_uptake.jl"=> (order = "15", title = "2. ODE_model_Xtra_soil_contamination", description = "Extra exercise on soil contamination with plant uptake", author = "Gauthier Vanhaelewyn"), - "ode_model_XTRA_water_evap_infil.jl" => (order = "16", title = "2. ODE_model_Xtra_evaporation", description = "Extra exercise on water evaporation and infiltration in a reservoir", author = "Gauthier Vanhaelewyn"), - # P3_sde - "sde_model_heston_mtk_intro.jl" => (order = "17", title = "3. SDE_model_Heston_intro", description = "Introduction to solving SDE problems with ModelingToolkit", author = "Gauthier Vanhaelewyn"), - "sde_model_aging_mtk.jl" => (order = "18", title = "3. SDE_model_aging", description = "Aging with saturated repair, modelled as an SDE", author = "Gauthier Vanhaelewyn"), - "sde_model_fermenter_secondorder_mtk.jl" => (order = "19", title = "3. SDE_model_fermenter_secondorder", description = "Fermenter with second-order kinetics, modelled as an SDE", author = "Gauthier Vanhaelewyn"), - "dje_model_catalyst_intro.jl" => (order = "20", title = "3. DJE_model_Catalyst_intro", description = "Introduction to solving discrete jump problems with Catalyst", author = "Gauthier Vanhaelewyn"), - "dje_model_bike_sharing.jl" => (order = "21", title = "3. DJE_model_bike_sharing", description = "Discrete jump model of a simple bike sharing system", author = "Gauthier Vanhaelewyn"), - "dje_model_festival_toilet.jl" => (order = "22", title = "3. DJE_model_festival_toilet", description = "Discrete jump model of a festival toilet queue", author = "Gauthier Vanhaelewyn"), - # P4_probmod - "probmod_1-intro.jl" => (order = "23", title = "4. ProbMod intro", description = "Introduction to the sampling practicals", author = "Bram Spanoghe"), - "probmod_2-basics.jl" => (order = "24", title = "4. ProbMod basics", description = "Basic sampling exercises", author = "Bram Spanoghe"), - "probmod_3-advanced.jl" => (order = "25", title = "4. ProbMod advanced", description = "Advanced sampling exercises", author = "Bram Spanoghe"), - "probmod_4-review.jl" => (order = "26", title = "4. ProbMod review", description = "Review sampling exercise", author = "Bram Spanoghe"), - # P5_mcmc - "MCMC_1-intro.jl" => (order = "27", title = "5. MCMC intro", description = "MCMC intro", author = "Bram Spanoghe"), - "MCMC_2-basics.jl" => (order = "28", title = "5. MCMC basics", description = "MCMC basics", author = "Bram Spanoghe"), - "MCMC_3-advanced.jl" => (order = "29", title = "5. MCMC advanced", description = "MCMC advanced", author = "Bram Spanoghe"), - "MCMC_4-review.jl" => (order = "30", title = "5. MCMC review", description = "MCMC review", author = "Bram Spanoghe"), - # P6_calib - "calib_intro.jl" => (order = "31", title = "6. Calibration intro", description = "Calibration intro", author = "Gauthier Vanhaelewyn"), - "calib_fermenter_monod.jl" => (order = "32", title = "6. Calibration fermenter monod", description = "Calibration fermenter monod", author = "Gauthier Vanhaelewyn"), - "calib_irrigation.jl" => (order = "33", title = "6. Calibration irrigation", description = "Calibration irrigation", author = "Gauthier Vanhaelewyn"), - "optim_wastewater_treatment.jl" => (order = "34", title = "6. Optimisation wastewater treatment", description = "Optimisation wastewater treatment", author = "Gauthier Vanhaelewyn"), - # P7_sens_uncert - "sens_intro.jl" => (order = "35", title = "7. Sensitivity intro", description = "Sensitivity intro", author = "Gauthier Vanhaelewyn"), - "sens_fermenter_monod.jl" => (order = "36", title = "7. Sensitivity fermenter monod", description = "Sensitivity fermenter monod", author = "Gauthier Vanhaelewyn"), - "sens_bitrophic_model.jl" => (order = "37", title = "7. Sensitivity bitrophic model", description = "Sensitivity bitrophic model", author = "Gauthier Vanhaelewyn"), - "sens_insuline.jl" => (order = "38", title = "7. Sensitivity insuline", description = "Sensitivity insuline", author = "Gauthier Vanhaelewyn"), - "uncert_intro.jl" => (order = "39", title = "7. Uncertainty intro", description = "Uncertainty intro", author = "Gauthier Vanhaelewyn"), - "uncert_fermenter_monod.jl" => (order = "40", title = "7. Uncertainty fermenter monod", description = "Uncertainty fermenter monod", author = "Gauthier Vanhaelewyn"), - "uncert_bitrophic_model.jl" => (order = "41", title = "7. Uncertainty bitrophic model", description = "Uncertainty bitrophic model", author = "Gauthier Vanhaelewyn"), - # P8_modselect - "model_selection_intro.jl" => (order = "42", title = "8. Model selection intro", description = "Model selection intro", author = nothing), - "probabilistic_selection.jl" => (order = "43", title = "8. Probability selection", description = "Probability selection", author = nothing), -) - -frontmatter_lines(meta) = begin - lines = [ - "#> [frontmatter]", - "#> order = \"$(meta.order)\"", - "#> title = \"$(meta.title)\"", - "#> tags = $TAGS", - "#> layout = $LAYOUT", - "#> description = \"$(meta.description)\"", - ] - if meta.author !== nothing - append!(lines, ["#> ", "#> [[frontmatter.author]]", "#> name = \"$(meta.author)\""]) - end - lines -end - -""" - render(student_path, meta) -> String - -Build the website copy of a student notebook: insert the frontmatter block and rewrite -the `Pkg.activate("..")` cell. Throws if the student notebook does not have the shape -we expect (so a broken notebook fails loudly instead of producing garbage). -""" -function render(student_path::AbstractString, meta) - src = read(student_path, String) - occursin('\r', src) && error("$student_path: CRLF line endings are not supported") - lines = split(src, '\n') - length(lines) β‰₯ 4 || error("$student_path: file too short to be a Pluto notebook") - lines[1] == "### A Pluto.jl notebook ###" || error("$student_path: line 1 is not the Pluto header") - startswith(lines[2], "# v") || error("$student_path: line 2 is not the Pluto version stamp") - lines[3] == "" || error("$student_path: expected an empty line 3") - any(startswith(l, "#> ") for l in lines) && error("$student_path: student notebook already has a `#>` frontmatter block") - - # Locate the unique activate cell. - act = findall(l -> occursin("Pkg.activate(\"..\")", l), lines) - length(act) == 1 || error("$student_path: expected exactly one `Pkg.activate(\"..\")`, found $(length(act))") - i = act[1] - header = findlast(k -> startswith(lines[k], "# ╔═║ "), 1:i) - header === nothing && error("$student_path: `Pkg.activate` is not inside a Pluto cell") - body_start = header + 1 - while body_start ≀ length(lines) && startswith(lines[body_start], "# ╠═║ ") - body_start += 1 # keep cell metadata lines (e.g. `# ╠═║ show_logs = false`) - end - body_end = findnext(isempty, lines, body_start) # cell body runs until the next empty line - body_end === nothing && error("$student_path: activate cell has no terminating empty line") - body_end > i || error("$student_path: `Pkg.activate` found outside its cell body") - - out = String[] - append!(out, lines[1:3]) - append!(out, frontmatter_lines(meta)) - push!(out, "") - append!(out, lines[4:body_start-1]) - append!(out, ADVICE) - push!(out, PDE_ACTIVATE) - append!(out, lines[body_end:end]) - join(out, '\n') -end - -student_files() = begin - files = Pair{String,String}[] # basename => path - for p in sort(readdir(STUDENT_DIR)) - (startswith(p, "P") && isdir(joinpath(STUDENT_DIR, p))) || continue - for f in sort(readdir(joinpath(STUDENT_DIR, p))) - (endswith(f, ".jl") && !endswith(f, "_sol.jl")) || continue - push!(files, f => joinpath(STUDENT_DIR, p, f)) - end - end - files -end - -function main(args) - check = "--check" in args - fail = false - files = student_files() - produced = Set{String}() - - seen = Set{String}() - for (name, _) in files - name in seen && (println("ERROR $name appears in more than one P*/ folder"); fail = true) - push!(seen, name) - end - for k in sort(collect(keys(FRONTMATTER))) - k in seen || (println("ERROR table entry $k has no student notebook"); fail = true) - end - - for (name, path) in files - rel = relpath(path, ROOT) - haskey(FRONTMATTER, name) || (println("ERROR $rel is not in the FRONTMATTER table of $(relpath(@__FILE__, ROOT))"); fail = true; continue) - rendered = try - render(path, FRONTMATTER[name]) - catch e - println("ERROR $rel: ", sprint(showerror, e)); fail = true; continue - end - push!(produced, name) - target = joinpath(SRC_DIR, name) - current = isfile(target) ? read(target, String) : nothing - if current == rendered - println("OK src/exercises/$name") - elseif check - println("DIFF src/exercises/$name is out of date (run: julia notebook-checks/sync_exercises.jl)"); fail = true - else - write(target, rendered) - println(current === nothing ? "NEW " : "WROTE ", "src/exercises/$name") - end - end - - for f in sort(readdir(SRC_DIR)) - (endswith(f, ".jl") && !(f in produced)) || continue - println("STALE src/exercises/$f has no student notebook (remove it by hand)"); fail = true - end - - if fail - println(check ? "\nsrc/exercises is NOT in sync with exercises/student_notebooks." : "\nsync finished with errors.") - exit(1) - end - println(check ? "\nsrc/exercises is in sync." : "\nsync done.") -end - -if abspath(PROGRAM_FILE) == @__FILE__ - main(ARGS) -end diff --git a/pluto-deployment-environment/Manifest.toml b/pluto-deployment-environment/Manifest.toml index c81596d4..f24f43bf 100644 --- a/pluto-deployment-environment/Manifest.toml +++ b/pluto-deployment-environment/Manifest.toml @@ -1,8 +1,8 @@ # This file is machine-generated - editing it directly is not advised -julia_version = "1.12.7" +julia_version = "1.11.2" manifest_format = "2.0" -project_hash = "af44e881c025ba6f5c97a46436e7c16ccf787eb4" +project_hash = "6005df9327f045bdc35de22e6d0d088f01ae9d52" [[deps.ADTypes]] git-tree-sha1 = "7927b9af540ee964cc5d1b73293f1eb0b761a3a1" @@ -543,7 +543,7 @@ version = "0.1.1" [[deps.CompilerSupportLibraries_jll]] deps = ["Artifacts", "Libdl"] uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" -version = "1.3.1+2" +version = "1.1.1+0" [[deps.CompositeTypes]] git-tree-sha1 = "bce26c3dab336582805503bed209faab1c279768" @@ -851,7 +851,7 @@ version = "0.7.16" [[deps.Downloads]] deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" -version = "1.7.0" +version = "1.6.0" [[deps.DynamicPPL]] deps = ["ADTypes", "AbstractMCMC", "AbstractPPL", "Accessors", "BangBang", "Bijectors", "Chairmarks", "Compat", "ConstructionBase", "DifferentiationInterface", "Distributions", "DocStringExtensions", "InteractiveUtils", "LinearAlgebra", "LogDensityProblems", "MacroTools", "OrderedCollections", "Random", "Requires", "Statistics", "Test"] @@ -913,13 +913,12 @@ version = "1.0.5" [[deps.Enzyme]] deps = ["CEnum", "EnzymeCore", "Enzyme_jll", "GPUCompiler", "InteractiveUtils", "LLVM", "Libdl", "LinearAlgebra", "ObjectFile", "PrecompileTools", "Preferences", "Printf", "Random", "SparseArrays"] -git-tree-sha1 = "66e2c0270b97cb579615a67368813ccfa08751ed" +git-tree-sha1 = "dadf6d1a552d743e8bfb52eefcf8325625b03232" uuid = "7da242da-08ed-463a-9acd-ee780be4f1d9" -version = "0.13.191" +version = "0.13.66" [deps.Enzyme.extensions] EnzymeBFloat16sExt = "BFloat16s" - EnzymeCUDAExt = "CUDA" EnzymeChainRulesCoreExt = "ChainRulesCore" EnzymeGPUArraysCoreExt = "GPUArraysCore" EnzymeLogExpFunctionsExt = "LogExpFunctions" @@ -927,9 +926,7 @@ version = "0.13.191" EnzymeStaticArraysExt = "StaticArrays" [deps.Enzyme.weakdeps] - ADTypes = "47edcb42-4c32-4615-8424-f2b9edc5f35b" BFloat16s = "ab4f0b2a-ad5b-11e8-123f-65d77653426b" - CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" GPUArraysCore = "46192b85-c4d5-4398-a991-12ede77f4527" LogExpFunctions = "2ab3a3ac-af41-5b50-aa03-7779005ae688" @@ -937,20 +934,19 @@ version = "0.13.191" StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" [[deps.EnzymeCore]] -git-tree-sha1 = "971d7831cc85f43bc9f51d615a3f7f21270c2f1d" +git-tree-sha1 = "8272a687bca7b5c601c0c24fc0c71bff10aafdfd" uuid = "f151be2c-9106-41f4-ab19-57ee4f262869" -version = "0.8.21" -weakdeps = ["Adapt", "ChainRulesCore"] +version = "0.8.12" +weakdeps = ["Adapt"] [deps.EnzymeCore.extensions] AdaptExt = "Adapt" - EnzymeCoreChainRulesCoreExt = "ChainRulesCore" [[deps.Enzyme_jll]] deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl", "TOML"] -git-tree-sha1 = "35464c0c51db8a6d5a9bb995a14a8fe390c050f9" +git-tree-sha1 = "a357a553f8dfd461756ff8ed66fd541bdf2d1588" uuid = "7cc45869-7501-5eee-bdea-0790c847d4ef" -version = "0.0.289+0" +version = "0.0.188+0" [[deps.EpollShim_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] @@ -1184,15 +1180,10 @@ uuid = "46192b85-c4d5-4398-a991-12ede77f4527" version = "0.2.0" [[deps.GPUCompiler]] -deps = ["ExprTools", "InteractiveUtils", "LLVM", "Libdl", "Logging", "PrecompileTools", "Preferences", "REPL", "Scratch", "Serialization", "TOML", "Tracy", "UUIDs"] -git-tree-sha1 = "5e54ec63c34bcc878558b173c411b8efe6b08344" +deps = ["ExprTools", "InteractiveUtils", "LLVM", "Libdl", "Logging", "PrecompileTools", "Preferences", "Scratch", "Serialization", "TOML", "Tracy", "UUIDs"] +git-tree-sha1 = "eb1e212e12cc058fa16712082d44be499d23638c" uuid = "61eb1bfa-7361-4325-ad38-22787b887f55" -version = "1.23.0" - - [deps.GPUCompiler.weakdeps] - AMDGPU_LLVM_Backend_jll = "cc5c0156-bd05-5a77-8a68-bb0aafb29019" - LLVMDowngrader_jll = "f52de702-fb25-5922-94ba-81dd59b07444" - NVPTX_LLVM_Backend_jll = "ef6e0fe3-e6ef-59c0-bde6-4989574699e0" +version = "1.6.1" [[deps.GR]] deps = ["Artifacts", "Base64", "DelimitedFiles", "Downloads", "GR_jll", "HTTP", "JSON", "Libdl", "LinearAlgebra", "Preferences", "Printf", "Qt6Wayland_jll", "Random", "Serialization", "Sockets", "TOML", "Tar", "Test", "p7zip_jll"] @@ -1452,11 +1443,6 @@ git-tree-sha1 = "937da4713526b96ac9a178e2035019d3b78ead4a" uuid = "70703baa-626e-46a2-a12c-08ffd08c73b4" version = "0.4.10" -[[deps.JuliaSyntaxHighlighting]] -deps = ["StyledStrings"] -uuid = "ac6e5ff7-fb65-4e79-a425-ec3bc9c03011" -version = "1.12.0" - [[deps.JumpProcesses]] deps = ["ArrayInterface", "DataStructures", "DiffEqBase", "DiffEqCallbacks", "DocStringExtensions", "FunctionWrappers", "Graphs", "LinearAlgebra", "Markdown", "PoissonRandom", "Random", "RecursiveArrayTools", "Reexport", "SciMLBase", "Setfield", "StaticArrays", "SymbolicIndexingInterface", "UnPack"] git-tree-sha1 = "f8da88993c914357031daf0023f18748ff473924" @@ -1507,10 +1493,10 @@ uuid = "88015f11-f218-50d7-93a8-a6af411a945d" version = "4.0.1+0" [[deps.LLVM]] -deps = ["CEnum", "LLVMExtra_jll", "Libdl", "PrecompileTools", "Preferences", "Printf", "Unicode"] -git-tree-sha1 = "d4bfee24427f4f441bd9212a107e375c39663aab" +deps = ["CEnum", "LLVMExtra_jll", "Libdl", "Preferences", "Printf", "Unicode"] +git-tree-sha1 = "9c7c721cfd800d87d48c745d8bfb65144f0a91df" uuid = "929cbde3-209d-540e-8aea-75f648917ca0" -version = "9.13.1" +version = "9.4.2" [deps.LLVM.extensions] BFloat16sExt = "BFloat16s" @@ -1520,9 +1506,9 @@ version = "9.13.1" [[deps.LLVMExtra_jll]] deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl", "TOML"] -git-tree-sha1 = "d77aea19c9a71059a021acd99b0a4343e9661d94" +git-tree-sha1 = "2ea068aac1e7f0337d381b0eae3110581e3f3216" uuid = "dad2f222-ce93-54a1-a47d-0025e8a3acab" -version = "0.0.47+0" +version = "0.0.37+2" [[deps.LLVMOpenMP_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] @@ -1626,24 +1612,24 @@ uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" version = "0.6.4" [[deps.LibCURL_jll]] -deps = ["Artifacts", "LibSSH2_jll", "Libdl", "OpenSSL_jll", "Zlib_jll", "nghttp2_jll"] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" -version = "8.15.0+0" +version = "8.6.0+0" [[deps.LibGit2]] -deps = ["LibGit2_jll", "NetworkOptions", "Printf", "SHA"] +deps = ["Base64", "LibGit2_jll", "NetworkOptions", "Printf", "SHA"] uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" version = "1.11.0" [[deps.LibGit2_jll]] -deps = ["Artifacts", "LibSSH2_jll", "Libdl", "OpenSSL_jll"] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll"] uuid = "e37daf67-58a4-590a-8e99-b0245dd2ffc5" -version = "1.9.0+0" +version = "1.7.2+0" [[deps.LibSSH2_jll]] -deps = ["Artifacts", "Libdl", "OpenSSL_jll"] +deps = ["Artifacts", "Libdl", "MbedTLS_jll"] uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" -version = "1.11.3+1" +version = "1.11.0+1" [[deps.LibTracyClient_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] @@ -1716,7 +1702,7 @@ version = "7.4.0" [[deps.LinearAlgebra]] deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"] uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" -version = "1.12.0" +version = "1.11.0" [[deps.LinearSolve]] deps = ["ArrayInterface", "ChainRulesCore", "ConcreteStructs", "DocStringExtensions", "EnumX", "GPUArraysCore", "InteractiveUtils", "Krylov", "LazyArrays", "Libdl", "LinearAlgebra", "MKL_jll", "Markdown", "PrecompileTools", "Preferences", "RecursiveArrayTools", "Reexport", "SciMLBase", "SciMLOperators", "Setfield", "StaticArraysCore", "UnPack"] @@ -1885,7 +1871,7 @@ uuid = "dbb5928d-eab1-5f90-85c2-b9b0edb7c900" version = "0.4.2" [[deps.Markdown]] -deps = ["Base64", "JuliaSyntaxHighlighting", "StyledStrings"] +deps = ["Base64"] uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" version = "1.11.0" @@ -1912,8 +1898,7 @@ uuid = "739be429-bea8-5141-9913-cc70e7f3736d" version = "1.1.9" [[deps.MbedTLS_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "926c6af3a037c68d02596a44c22ec3595f5f760b" +deps = ["Artifacts", "Libdl"] uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" version = "2.28.6+0" @@ -2001,7 +1986,7 @@ version = "0.3.7" [[deps.MozillaCACerts_jll]] uuid = "14a3606d-f60d-562e-9121-12d972cd8159" -version = "2025.11.4" +version = "2023.12.12" [[deps.MsgPack]] deps = ["Serialization"] @@ -2093,7 +2078,7 @@ version = "0.4.22" [[deps.NetworkOptions]] uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" -version = "1.3.0" +version = "1.2.0" [[deps.NonlinearSolve]] deps = ["ADTypes", "ArrayInterface", "BracketingNonlinearSolve", "CommonSolve", "ConcreteStructs", "DiffEqBase", "DifferentiationInterface", "FastClosures", "FiniteDiff", "ForwardDiff", "LineSearch", "LinearAlgebra", "LinearSolve", "NonlinearSolveBase", "NonlinearSolveFirstOrder", "NonlinearSolveQuasiNewton", "NonlinearSolveSpectralMethods", "PrecompileTools", "Preferences", "Reexport", "SciMLBase", "SimpleNonlinearSolve", "SparseArrays", "SparseMatrixColorings", "StaticArraysCore", "SymbolicIndexingInterface"] @@ -2206,18 +2191,18 @@ version = "1.3.6+0" [[deps.OpenBLAS_jll]] deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" -version = "0.3.29+0" +version = "0.3.27+1" [[deps.OpenLibm_jll]] deps = ["Artifacts", "Libdl"] uuid = "05823500-19ac-5b8b-9628-191a04bc5112" -version = "0.8.7+0" +version = "0.8.1+2" [[deps.OpenSSH_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "OpenSSL_jll", "Zlib_jll"] -git-tree-sha1 = "2da18ab26a6eb38b374c16b157d5a4cc3ab74e02" +git-tree-sha1 = "cb7acd5d10aff809b4d0191dfe1956c2edf35800" uuid = "9bd350c2-7e96-507f-8002-3f2e150b4e1b" -version = "10.5.1+0" +version = "10.0.1+0" [[deps.OpenSSL]] deps = ["BitFlags", "Dates", "MozillaCACerts_jll", "OpenSSL_jll", "Sockets"] @@ -2226,9 +2211,10 @@ uuid = "4d8831e6-92b7-49fb-bdf8-b643e874388c" version = "1.5.0" [[deps.OpenSSL_jll]] -deps = ["Artifacts", "Libdl"] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "87510f7292a2b21aeff97912b0898f9553cc5c2c" uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95" -version = "3.5.6+0" +version = "3.5.1+0" [[deps.OpenSpecFun_jll]] deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl"] @@ -2512,7 +2498,7 @@ version = "1.3.0" [[deps.PCRE2_jll]] deps = ["Artifacts", "Libdl"] uuid = "efcefdf7-47ab-520b-bdef-62a2eaa19f15" -version = "10.44.0+1" +version = "10.42.0+1" [[deps.PDMats]] deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"] @@ -2547,7 +2533,7 @@ version = "0.44.2+0" [[deps.Pkg]] deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "Random", "SHA", "TOML", "Tar", "UUIDs", "p7zip_jll"] uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" -version = "1.12.1" +version = "1.11.0" weakdeps = ["REPL"] [deps.Pkg.extensions] @@ -2742,7 +2728,7 @@ weakdeps = ["Enzyme"] QuadGKEnzymeExt = "Enzyme" [[deps.REPL]] -deps = ["InteractiveUtils", "JuliaSyntaxHighlighting", "Markdown", "Sockets", "StyledStrings", "Unicode"] +deps = ["InteractiveUtils", "Markdown", "Sockets", "StyledStrings", "Unicode"] uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" version = "1.11.0" @@ -3084,7 +3070,7 @@ version = "1.2.2" [[deps.SparseArrays]] deps = ["Libdl", "LinearAlgebra", "Random", "Serialization", "SuiteSparse_jll"] uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" -version = "1.12.0" +version = "1.11.0" [[deps.SparseConnectivityTracer]] deps = ["ADTypes", "DocStringExtensions", "FillArrays", "LinearAlgebra", "Random", "SparseArrays"] @@ -3288,7 +3274,7 @@ uuid = "4607b0f0-06f3-5cda-b6b1-a6196a1729e9" [[deps.SuiteSparse_jll]] deps = ["Artifacts", "Libdl", "libblastrampoline_jll"] uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c" -version = "7.8.3+2" +version = "7.7.0+0" [[deps.SymbolicIndexingInterface]] deps = ["Accessors", "ArrayInterface", "PrettyTables", "RuntimeGeneratedFunctions", "StaticArraysCore"] @@ -3741,7 +3727,7 @@ version = "0.4.14" [[deps.Zlib_jll]] deps = ["Libdl"] uuid = "83775a58-1f1d-513f-b197-d71354ab007a" -version = "1.3.1+2" +version = "1.2.13+1" [[deps.Zstd_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] @@ -3800,7 +3786,7 @@ version = "0.17.4+0" [[deps.libblastrampoline_jll]] deps = ["Artifacts", "Libdl"] uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" -version = "5.15.0+0" +version = "5.11.0+0" [[deps.libdecor_jll]] deps = ["Artifacts", "Dbus_jll", "JLLWrappers", "Libdl", "Libglvnd_jll", "Pango_jll", "Wayland_jll", "xkbcommon_jll"] @@ -3847,18 +3833,18 @@ version = "1.1.7+0" [[deps.nghttp2_jll]] deps = ["Artifacts", "Libdl"] uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" -version = "1.64.0+1" +version = "1.59.0+0" [[deps.oneTBB_jll]] -deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl"] +deps = ["Artifacts", "JLLWrappers", "Libdl"] git-tree-sha1 = "d5a767a3bb77135a99e433afe0eb14cd7f6914c3" uuid = "1317d2d5-d96f-522e-a858-c73665f53c3e" version = "2022.0.0+0" [[deps.p7zip_jll]] -deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] +deps = ["Artifacts", "Libdl"] uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" -version = "17.7.0+0" +version = "17.4.0+2" [[deps.x264_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] diff --git a/pluto-deployment-environment/PlutoDeployment.toml b/pluto-deployment-environment/PlutoDeployment.toml index 3793f7cf..e9ba9d17 100644 --- a/pluto-deployment-environment/PlutoDeployment.toml +++ b/pluto-deployment-environment/PlutoDeployment.toml @@ -12,6 +12,7 @@ ignore_cache = [ create_index = false exclude = [ # these are in the repo but not used on the website + "tools/*", "PlutoPages.jl", ] @@ -20,7 +21,11 @@ port = 8080 host = "0.0.0.0" exclude=[ # these are in the repo but not used on the website + "tools/*", "PlutoPages.jl", # notebooks not interactive + + # don't run homeworks + "*/hw*.jl", ] diff --git a/pluto-deployment-environment/Project.toml b/pluto-deployment-environment/Project.toml index 7669fc03..dffa0591 100644 --- a/pluto-deployment-environment/Project.toml +++ b/pluto-deployment-environment/Project.toml @@ -37,6 +37,3 @@ URIs = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" Unicode = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" YAML = "ddb6d928-2868-570f-bddf-ab3f9cf99eb6" - -[compat] -julia = "1.12" diff --git a/project/cocktail_draft.jl b/project/cocktail_draft.jl new file mode 100644 index 00000000..2bc4bea6 --- /dev/null +++ b/project/cocktail_draft.jl @@ -0,0 +1,2486 @@ +### A Pluto.jl notebook ### +# v0.19.42 + +using Markdown +using InteractiveUtils + +# ╔═║ 268f2426-e2e4-45b5-9d34-279dc5de5182 +using ModelingToolkit, Plots, DifferentialEquations + +# ╔═║ 785a59ba-c716-11ec-3225-e5ec94a651a2 +md""" +# Modelling cocktail shaking + +![](https://github.com/MichielStock/michielstock.github.io/blob/main/images/2022_cocktails/clovis-wood-photography-FT1PJqW0qtE-unsplash.jpg?raw=true) + +Plenty of cool stuff going on in the Julia community. One of the language's strengths is that it allows one to write tools that can work on the language itself (e.g. its metaprogramming capacities). Recently, the community has invested in building [the foundation for a computer algebra system](https://symbolicutils.juliasymbolics.org/), allowing tools that reason about equations. One of the flagship packages is [ModelingToolKit](https://github.com/SciML/ModelingToolkit.jl), a library that can help to construct, modify and analyse complex models. By way of exploration, let us use this software to generate a model for cocktail shaking!""" + +# ╔═║ e85060ec-e334-4b2d-844f-8e748b532b34 +md""" +## Fundamentals of cocktail making + +As I discussed in [an earlier post](https://michielstock.github.io/posts/2020/2020-05-21-compuational-mixology/), cocktail making is quite instructive from a thermodynamics point of view. After mixing, the bartender typically shakes or stirs the cocktail with ice (which is usually discarded afterwards). The reaction with ice has two interconnected effects. Firstly, the ice melts, diluting the cocktail. Secondly, ice melting is a strongly endothermic reaction, absorbing heat from the liquid and cooling your cocktail. Cooling is diluting, and diluting is cooling. This is called the *First Law of Cocktail Making* by Dave Arnolds. + +The dilution and cooling will also impact the perceived flavour of the cocktail. Most of its balance is determined by the sweetness and the acidity. Sweetness, in particular, depends in a complex way on the sucrose concentration and the temperature of the solution. This is why shaken cocktails, which are drunk more chilled, typically contain more sugar. +""" + +# ╔═║ b298c1d2-8ecf-459b-b238-64714923086d +md""" +## Using ModelingToolKit to model how a cocktail changes + +The change of the cocktail while shaking can be described by elementary chemical and physical laws. Typically, one would use the mass and energy balances of the quantities of interest to derive a suitable system of differential equations. Let us try to automate this process using ModelingToolKit. We only provide the conservation laws and some behaviours and let the CAS figure it out for itself. + +To keep it simple, let us treat a cocktail as a mere sugar solution (a virgin cocktail, if you will) with sufficient ice; it cannot completely melt. First, we define the variables. +""" + +# ╔═║ c07f3dd4-8983-4bc9-b864-8df9c664e740 +@variables t I(t) V(t) S(t) Z(t) T(t) + +# ╔═║ 579ced03-c8eb-4fb1-80ac-66c3fba92b7f +md""" +These correspond to: +- the time (in seconds): $t$; +- the amount of ice in kg $I(t)$; +- the volume of the cocktail, in litres: $V(t)$; +- the concencentration of sucrose in grammes per litre: $S(t)$; +- the temperature of the cocktail, in degrees Celcius: $T(t)$. +""" + +# ╔═║ 37d0eb59-1fb7-4832-8aba-dbf4d95aef4e +md"We also define the derivative w.r.t. time operator:" + +# ╔═║ 7e627856-f165-4f29-b500-ea08c8c1330e +D = Differential(t) + +# ╔═║ ce939f44-8fe0-4080-b4c2-8208fc8cd7b9 +md"Firstly, we define the melting of ice. This process depends on shaking intensity and the temperature of the liquid. Based on *Liquid Intelligence*, the following rate works well." + +# ╔═║ 954505b3-77b0-482a-8ad0-71af7288f114 +IΜ‡ = -0.001*I^0.66*T#(-5e-4(T + 7)) #* (I > 0) + +# ╔═║ a84b89dc-18a5-4afe-aae1-1bbe7973dba2 +md"We set this rate equal to the change in ice mass." + +# ╔═║ d54b27c0-2292-4e13-a427-ace53856c119 +melting = D(I) ~ IΜ‡ + +# ╔═║ 08985029-5100-4571-96d4-2d8fba4c7a68 +md"Next, we have our *conservation of water*. Any change in volume $\frac{\text{d}V}{\text{d}t}$ can only take place because a corresponding quantity of ice has melted. So we have:" + +# ╔═║ e6b01aa7-0aa0-42b8-aac4-e95cf167a5e9 +#water_balance = IΜ‡ + D(V) ~ 0 +water_balance = D(I)+D(V) ~ 0 + +# ╔═║ 6f57980d-2cc1-4115-9b9b-eb7c49a8590e +md"Next, we consider the heat balance. During the short time period, the liquid does not absorb heat from the surroundings, the liquid only cools because the melting of ice is endothermic. Our heat balance is given by" + +# ╔═║ 3d183855-d846-4e5b-bfd4-810364418f34 +md"For simplicity's sake, we use the thermodynamic properties of water. Here, `Cmelt` is the [enthalpy of fusion for water](https://en.wikipedia.org/wiki/Enthalpy_of_fusion) while `Cβ‚š` is the [specific heat capacity](https://en.wikipedia.org/wiki/Specific_heat_capacity) of water. Considerting the heat of water-ethanol mixtures correctly is rather [messy](https://en.wikipedia.org/wiki/Ethanol_(data_page))." + +# ╔═║ b2f0dff9-0cb8-4ef3-9642-8ad1645dc61b +const Cmelt = 3.34e5 # J/kg + +# ╔═║ de6c1273-682e-461f-b182-103ad1878580 +const Cβ‚š = 4.187e3 # J/kg * K + +# ╔═║ 2edeadc7-b5ba-4737-8ab9-95036ad5cd1a +heat_balance = Cmelt * IΜ‡ ~ Cβ‚š * V * D(T) + +# ╔═║ 09195d0d-687c-4738-bb20-518b3d4aa8f4 +md"The conservation of sugar is rather simple. Though the concentration might change, the total quanity of sugar is fixed." + +# ╔═║ 2b7fe775-db50-4e83-aa79-334a771d4f0f +#sugar_balance = S * V ~ Vβ‚€ * Sβ‚€ +sugar_balance = D(S) * V + S * D(V)~ 0 + + +# ╔═║ f29fc313-355b-43ac-abca-90445844bf4b +md"Finally, the perceived sweetness depends on the sugar concentration and the temperature. Setting up such a relation is done in the field of psychophysics (e.g. [Steven's law](https://en.wikipedia.org/wiki/Stevens%27s_power_law)). Based on [this article](https://pubmed.ncbi.nlm.nih.gov/7100291/), we obtain a fairly simple emperical relation." + +# ╔═║ dfc5132b-e082-47c5-9a36-fbfaaae396c8 +sweetness = Z ~ 14.9 * (S / 342.30)^(1.422 - 0.0146T) + +# ╔═║ afd38f19-41ee-4c52-aaef-c8239250c92f +md"Let us model a [Bee's Knees](https://www.liquor.com/recipes/bees-knees/) cocktail. Liquid Intelligence kindly provides the intial mixing volume and concentration:" + +# ╔═║ 0066669f-4541-4d32-b13b-fcc98c637de8 +Vβ‚€ = 0.105 # L + +# ╔═║ e78790ab-31f3-46bf-8d62-96fb5b9d0ac6 +Sβ‚€ = 10.1 # g / L + +# ╔═║ 9453473b-4b1a-493b-93b8-f71cf33a78d5 +md"And let us use 150 g of ice." + +# ╔═║ 1c9e5668-8a96-487e-a001-7b041b044205 +Iβ‚€ = 0.2 # kg + +# ╔═║ bf4c7a1c-ac8a-4bab-a2ae-5e4ccb05967a +md"Now for the cool part! Let us piece everything together and use `structural_simplify` to derive a simpler system a solver can handle." + +# ╔═║ cdf1ee0c-b250-45ef-a910-c3aa1aac9d4b +@named sys = ODESystem([melting, + water_balance, + heat_balance, + sugar_balance, + sweetness]) + +# ╔═║ 1afbf3a1-56b3-46bd-b192-d3bbcfb11c6c +equations(sys) + +# ╔═║ 647a62bf-acb6-4008-84c3-0c220b1ef3e1 +states(sys) + +# ╔═║ e13257e4-741b-4b44-be42-dfb1a618db5b +simpsys = structural_simplify(sys, simplify=true) + +# ╔═║ f167eb5a-8eb7-4da2-8cca-044c3318539e +equations(simpsys) + +# ╔═║ d8170974-0e42-49d4-b79e-e0647b9617c0 +states(simpsys) + +# ╔═║ 88de08b6-ac27-4d39-9266-9769eb2d1002 +md""" +We see that by simplification, the five laws are turned into three ODEs and one simple law from which sugar concentration can be derived. Perceived sweetness depends directly on everything above, so it does not need to be taken into account for the solver. + +Now we add the initial conditions and turn the system in an ODE problem we can solve! +""" + +# ╔═║ d5276187-42c4-4e9e-a274-c298964ca53b +prob = ODEProblem(simpsys, [V=>Vβ‚€, S=>Sβ‚€, I=>0.20, T=>20, ModelingToolkit.missing_variable_defaults(simpsys)[end]], (0.0, 20.0)) + +# ╔═║ d3c0b55d-9d6a-4c1b-84f5-cfc5d1f51d25 +solution = solve(prob); + +# ╔═║ 90fe88dc-b8c7-4e36-9fc3-3e5e8d21a511 +md""" +Finally, we plot our states (note that `z(t)` can still be extracted). All processes are simulated as we please, we can see how the composition, temperature and sweetness change with time. Most drinks are in their prime between -5 and -1 degrees of Celcius, so five seconds of shaking would do the trick! πŸ‘Œ +""" + +# ╔═║ 7c9b299f-2b94-4cc9-b05d-611678c311a7 +plot(plot(solution, idxs=[I, V, Z], lw=2), plot(solution, idxs=[T, S], lw=2), title="Cocktail states while shaking") + +# ╔═║ dca7ab9c-0ed8-4352-bab1-64ac891d55ff +let + temps = [44, 36, 28, 20, 12, 4] + slopes = [0.8, 0.89, 1.01, 1.02, 1.4, 1.31] + X = [ones(6) temps] + Ξ²Μ‚ = X \ slopes +end; + +# ╔═║ 53eddad6-e5c3-41fe-8cc7-ab2e7fa33c59 +perceived_sweetness(S, T) = 14.9 * (S / 342.30)^(1.42224 - 0.0146071T) + +# ╔═║ 36ee98f4-2476-470d-bb69-0f9d1d333a30 +heatmap(1:200, 4:40, perceived_sweetness, xlabel="Sugar concentration (g/L)", ylabel="temperature (degree Celcius)", title="perceived sweetness") + +# ╔═║ 00000000-0000-0000-0000-000000000001 +PLUTO_PROJECT_TOML_CONTENTS = """ +[deps] +DifferentialEquations = "0c46a032-eb83-5123-abaf-570d42b7fbaa" +ModelingToolkit = "961ee093-0014-501f-94e3-6117800e7a78" +Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" + +[compat] +DifferentialEquations = "~7.13.0" +ModelingToolkit = "~8.75.0" +Plots = "~1.40.4" +""" + +# ╔═║ 00000000-0000-0000-0000-000000000002 +PLUTO_MANIFEST_TOML_CONTENTS = """ +# This file is machine-generated - editing it directly is not advised + +julia_version = "1.9.0" +manifest_format = "2.0" +project_hash = "cccd71e8b84d64bdfbaab2981ecb0318c2c1be30" + +[[deps.ADTypes]] +git-tree-sha1 = "016833eb52ba2d6bea9fcb50ca295980e728ee24" +uuid = "47edcb42-4c32-4615-8424-f2b9edc5f35b" +version = "0.2.7" + +[[deps.AbstractAlgebra]] +deps = ["GroupsCore", "InteractiveUtils", "LinearAlgebra", "MacroTools", "Preferences", "Random", "RandomExtensions", "SparseArrays", "Test"] +git-tree-sha1 = "d7832de8cf7af26abac741f10372080ac6cb73df" +uuid = "c3fe647b-3220-5bb0-a1ea-a7954cac585d" +version = "0.34.7" + +[[deps.AbstractTrees]] +git-tree-sha1 = "2d9c9a55f9c93e8887ad391fbae72f8ef55e1177" +uuid = "1520ce14-60c1-5f80-bbc7-55ef81b5835c" +version = "0.4.5" + +[[deps.Adapt]] +deps = ["LinearAlgebra", "Requires"] +git-tree-sha1 = "cde29ddf7e5726c9fb511f340244ea3481267608" +uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" +version = "3.7.2" +weakdeps = ["StaticArrays"] + + [deps.Adapt.extensions] + AdaptStaticArraysExt = "StaticArrays" + +[[deps.ArgTools]] +uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" +version = "1.1.1" + +[[deps.ArnoldiMethod]] +deps = ["LinearAlgebra", "Random", "StaticArrays"] +git-tree-sha1 = "d57bd3762d308bded22c3b82d033bff85f6195c6" +uuid = "ec485272-7323-5ecc-a04f-4719b315124d" +version = "0.4.0" + +[[deps.ArrayInterface]] +deps = ["Adapt", "LinearAlgebra", "Requires", "SparseArrays", "SuiteSparse"] +git-tree-sha1 = "c5aeb516a84459e0318a02507d2261edad97eb75" +uuid = "4fba245c-0d91-5ea0-9b3e-6abc04ee57a9" +version = "7.7.1" + + [deps.ArrayInterface.extensions] + ArrayInterfaceBandedMatricesExt = "BandedMatrices" + ArrayInterfaceBlockBandedMatricesExt = "BlockBandedMatrices" + ArrayInterfaceCUDAExt = "CUDA" + ArrayInterfaceGPUArraysCoreExt = "GPUArraysCore" + ArrayInterfaceStaticArraysCoreExt = "StaticArraysCore" + ArrayInterfaceTrackerExt = "Tracker" + + [deps.ArrayInterface.weakdeps] + BandedMatrices = "aae01518-5342-5314-be14-df237901396f" + BlockBandedMatrices = "ffab5731-97b5-5995-9138-79e8c1846df0" + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + GPUArraysCore = "46192b85-c4d5-4398-a991-12ede77f4527" + StaticArraysCore = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" + Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" + +[[deps.ArrayLayouts]] +deps = ["FillArrays", "LinearAlgebra"] +git-tree-sha1 = "33207a8be6267bc389d0701e97a9bce6a4de68eb" +uuid = "4c555306-a7a7-4459-81d9-ec55ddd5c99a" +version = "1.9.2" +weakdeps = ["SparseArrays"] + + [deps.ArrayLayouts.extensions] + ArrayLayoutsSparseArraysExt = "SparseArrays" + +[[deps.Artifacts]] +uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" + +[[deps.BandedMatrices]] +deps = ["ArrayLayouts", "FillArrays", "LinearAlgebra", "PrecompileTools"] +git-tree-sha1 = "c946c5014cf4cdbfacacb363b110e7bffba3e742" +uuid = "aae01518-5342-5314-be14-df237901396f" +version = "1.6.1" +weakdeps = ["SparseArrays"] + + [deps.BandedMatrices.extensions] + BandedMatricesSparseArraysExt = "SparseArrays" + +[[deps.Base64]] +uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" + +[[deps.Bijections]] +git-tree-sha1 = "c9b163bd832e023571e86d0b90d9de92a9879088" +uuid = "e2ed5e7c-b2de-5872-ae92-c73ca462fb04" +version = "0.1.6" + +[[deps.BitFlags]] +git-tree-sha1 = "2dc09997850d68179b69dafb58ae806167a32b1b" +uuid = "d1d4a3ce-64b1-5f1a-9ba4-7e7e69966f35" +version = "0.1.8" + +[[deps.BitTwiddlingConvenienceFunctions]] +deps = ["Static"] +git-tree-sha1 = "0c5f81f47bbbcf4aea7b2959135713459170798b" +uuid = "62783981-4cbd-42fc-bca8-16325de8dc4b" +version = "0.1.5" + +[[deps.BoundaryValueDiffEq]] +deps = ["ADTypes", "Adapt", "ArrayInterface", "BandedMatrices", "ConcreteStructs", "DiffEqBase", "FastAlmostBandedMatrices", "ForwardDiff", "LinearAlgebra", "LinearSolve", "NonlinearSolve", "PreallocationTools", "PrecompileTools", "Preferences", "RecursiveArrayTools", "Reexport", "SciMLBase", "Setfield", "SparseArrays", "SparseDiffTools", "Tricks", "TruncatedStacktraces", "UnPack"] +git-tree-sha1 = "3ff968887be48760b0e9e8650c2d05c96cdea9d8" +uuid = "764a87c0-6b3e-53db-9096-fe964310641d" +version = "5.6.3" + + [deps.BoundaryValueDiffEq.extensions] + BoundaryValueDiffEqODEInterfaceExt = "ODEInterface" + BoundaryValueDiffEqOrdinaryDiffEqExt = "OrdinaryDiffEq" + + [deps.BoundaryValueDiffEq.weakdeps] + ODEInterface = "54ca160b-1b9f-5127-a996-1867f4bc2a2c" + OrdinaryDiffEq = "1dea7af3-3e70-54e6-95c3-0bf5283fa5ed" + +[[deps.Bzip2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "9e2a6b69137e6969bab0152632dcb3bc108c8bdd" +uuid = "6e34b625-4abd-537c-b88f-471c36dfa7a0" +version = "1.0.8+1" + +[[deps.CEnum]] +git-tree-sha1 = "389ad5c84de1ae7cf0e28e381131c98ea87d54fc" +uuid = "fa961155-64e5-5f13-b03f-caf6b980ea82" +version = "0.5.0" + +[[deps.CPUSummary]] +deps = ["CpuId", "IfElse", "PrecompileTools", "Static"] +git-tree-sha1 = "601f7e7b3d36f18790e2caf83a882d88e9b71ff1" +uuid = "2a0fbf3d-bb9c-48f3-b0a9-814d99fd7ab9" +version = "0.2.4" + +[[deps.CSTParser]] +deps = ["Tokenize"] +git-tree-sha1 = "b544d62417a99d091c569b95109bc9d8c223e9e3" +uuid = "00ebfdb7-1f24-5e51-bd34-a7502290713f" +version = "3.4.2" + +[[deps.Cairo_jll]] +deps = ["Artifacts", "Bzip2_jll", "CompilerSupportLibraries_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "JLLWrappers", "LZO_jll", "Libdl", "Pixman_jll", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Zlib_jll", "libpng_jll"] +git-tree-sha1 = "a4c43f59baa34011e303e76f5c8c91bf58415aaf" +uuid = "83423d85-b0ee-5818-9007-b63ccbeb887a" +version = "1.18.0+1" + +[[deps.Calculus]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "f641eb0a4f00c343bbc32346e1217b86f3ce9dad" +uuid = "49dc2e85-a5d0-5ad3-a950-438e2897f1b9" +version = "0.5.1" + +[[deps.ChainRulesCore]] +deps = ["Compat", "LinearAlgebra"] +git-tree-sha1 = "575cd02e080939a33b6df6c5853d14924c08e35b" +uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" +version = "1.23.0" +weakdeps = ["SparseArrays"] + + [deps.ChainRulesCore.extensions] + ChainRulesCoreSparseArraysExt = "SparseArrays" + +[[deps.CloseOpenIntervals]] +deps = ["Static", "StaticArrayInterface"] +git-tree-sha1 = "70232f82ffaab9dc52585e0dd043b5e0c6b714f1" +uuid = "fb6a15b2-703c-40df-9091-08a04967cfa9" +version = "0.1.12" + +[[deps.CodecZlib]] +deps = ["TranscodingStreams", "Zlib_jll"] +git-tree-sha1 = "59939d8a997469ee05c4b4944560a820f9ba0d73" +uuid = "944b1d66-785c-5afd-91f1-9de20f533193" +version = "0.7.4" + +[[deps.ColorSchemes]] +deps = ["ColorTypes", "ColorVectorSpace", "Colors", "FixedPointNumbers", "PrecompileTools", "Random"] +git-tree-sha1 = "67c1f244b991cad9b0aa4b7540fb758c2488b129" +uuid = "35d6a980-a343-548e-a6ea-1d62b119f2f4" +version = "3.24.0" + +[[deps.ColorTypes]] +deps = ["FixedPointNumbers", "Random"] +git-tree-sha1 = "b10d0b65641d57b8b4d5e234446582de5047050d" +uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f" +version = "0.11.5" + +[[deps.ColorVectorSpace]] +deps = ["ColorTypes", "FixedPointNumbers", "LinearAlgebra", "Requires", "Statistics", "TensorCore"] +git-tree-sha1 = "a1f44953f2382ebb937d60dafbe2deea4bd23249" +uuid = "c3611d14-8923-5661-9e6a-0046d554d3a4" +version = "0.10.0" +weakdeps = ["SpecialFunctions"] + + [deps.ColorVectorSpace.extensions] + SpecialFunctionsExt = "SpecialFunctions" + +[[deps.Colors]] +deps = ["ColorTypes", "FixedPointNumbers", "Reexport"] +git-tree-sha1 = "fc08e5930ee9a4e03f84bfb5211cb54e7769758a" +uuid = "5ae59095-9a9b-59fe-a467-6f913c188581" +version = "0.12.10" + +[[deps.Combinatorics]] +git-tree-sha1 = "08c8b6831dc00bfea825826be0bc8336fc369860" +uuid = "861a8166-3701-5b0c-9a16-15d98fcdc6aa" +version = "1.0.2" + +[[deps.CommonMark]] +deps = ["Crayons", "JSON", "PrecompileTools", "URIs"] +git-tree-sha1 = "532c4185d3c9037c0237546d817858b23cf9e071" +uuid = "a80b9123-70ca-4bc0-993e-6e3bcb318db6" +version = "0.8.12" + +[[deps.CommonSolve]] +git-tree-sha1 = "0eee5eb66b1cf62cd6ad1b460238e60e4b09400c" +uuid = "38540f10-b2f7-11e9-35d8-d573e4eb0ff2" +version = "0.2.4" + +[[deps.CommonSubexpressions]] +deps = ["MacroTools", "Test"] +git-tree-sha1 = "7b8a93dba8af7e3b42fecabf646260105ac373f7" +uuid = "bbf7d656-a473-5ed7-a52c-81e309532950" +version = "0.3.0" + +[[deps.Compat]] +deps = ["TOML", "UUIDs"] +git-tree-sha1 = "c955881e3c981181362ae4088b35995446298b80" +uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" +version = "4.14.0" +weakdeps = ["Dates", "LinearAlgebra"] + + [deps.Compat.extensions] + CompatLinearAlgebraExt = "LinearAlgebra" + +[[deps.CompilerSupportLibraries_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" +version = "1.0.2+0" + +[[deps.CompositeTypes]] +git-tree-sha1 = "bce26c3dab336582805503bed209faab1c279768" +uuid = "b152e2b5-7a66-4b01-a709-34e65c35f657" +version = "0.1.4" + +[[deps.ConcreteStructs]] +git-tree-sha1 = "f749037478283d372048690eb3b5f92a79432b34" +uuid = "2569d6c7-a4a2-43d3-a901-331e8e4be471" +version = "0.2.3" + +[[deps.ConcurrentUtilities]] +deps = ["Serialization", "Sockets"] +git-tree-sha1 = "6cbbd4d241d7e6579ab354737f4dd95ca43946e1" +uuid = "f0e56b4a-5159-44fe-b623-3e5288b988bb" +version = "2.4.1" + +[[deps.ConstructionBase]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "260fd2400ed2dab602a7c15cf10c1933c59930a2" +uuid = "187b0558-2788-49d3-abe0-74a17ed4e7c9" +version = "1.5.5" +weakdeps = ["IntervalSets", "StaticArrays"] + + [deps.ConstructionBase.extensions] + ConstructionBaseIntervalSetsExt = "IntervalSets" + ConstructionBaseStaticArraysExt = "StaticArrays" + +[[deps.Contour]] +git-tree-sha1 = "439e35b0b36e2e5881738abc8857bd92ad6ff9a8" +uuid = "d38c429a-6771-53c6-b99e-75d170b6e991" +version = "0.6.3" + +[[deps.CpuId]] +deps = ["Markdown"] +git-tree-sha1 = "fcbb72b032692610bfbdb15018ac16a36cf2e406" +uuid = "adafc99b-e345-5852-983c-f28acb93d879" +version = "0.3.1" + +[[deps.Crayons]] +git-tree-sha1 = "249fe38abf76d48563e2f4556bebd215aa317e15" +uuid = "a8cc5b0e-0ffa-5ad4-8c14-923d3ee1735f" +version = "4.1.1" + +[[deps.DataAPI]] +git-tree-sha1 = "abe83f3a2f1b857aac70ef8b269080af17764bbe" +uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a" +version = "1.16.0" + +[[deps.DataStructures]] +deps = ["Compat", "InteractiveUtils", "OrderedCollections"] +git-tree-sha1 = "1d0a14036acb104d9e89698bd408f63ab58cdc82" +uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" +version = "0.18.20" + +[[deps.DataValueInterfaces]] +git-tree-sha1 = "bfc1187b79289637fa0ef6d4436ebdfe6905cbd6" +uuid = "e2d170a0-9d28-54be-80f0-106bbe20a464" +version = "1.0.0" + +[[deps.Dates]] +deps = ["Printf"] +uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" + +[[deps.DelayDiffEq]] +deps = ["ArrayInterface", "DataStructures", "DiffEqBase", "LinearAlgebra", "Logging", "OrdinaryDiffEq", "Printf", "RecursiveArrayTools", "Reexport", "SciMLBase", "SimpleNonlinearSolve", "SimpleUnPack"] +git-tree-sha1 = "dd3dfeca90deb4b38be9598d7c51cd558816e596" +uuid = "bcd4f6db-9728-5f36-b5f7-82caef46ccdb" +version = "5.45.1" + +[[deps.DelimitedFiles]] +deps = ["Mmap"] +git-tree-sha1 = "9e2f36d3c96a820c678f2f1f1782582fcf685bae" +uuid = "8bb1440f-4735-579b-a4ab-409b98df4dab" +version = "1.9.1" + +[[deps.DiffEqBase]] +deps = ["ArrayInterface", "DataStructures", "DocStringExtensions", "EnumX", "EnzymeCore", "FastBroadcast", "ForwardDiff", "FunctionWrappers", "FunctionWrappersWrappers", "LinearAlgebra", "Logging", "Markdown", "MuladdMacro", "Parameters", "PreallocationTools", "PrecompileTools", "Printf", "RecursiveArrayTools", "Reexport", "SciMLBase", "SciMLOperators", "Setfield", "SparseArrays", "Static", "StaticArraysCore", "Statistics", "Tricks", "TruncatedStacktraces"] +git-tree-sha1 = "044648af911974c3928058c1f8c83f159dece274" +uuid = "2b5f629d-d688-5b77-993f-72d75c75574e" +version = "6.145.6" + + [deps.DiffEqBase.extensions] + DiffEqBaseChainRulesCoreExt = "ChainRulesCore" + DiffEqBaseDistributionsExt = "Distributions" + DiffEqBaseEnzymeExt = ["ChainRulesCore", "Enzyme"] + DiffEqBaseGeneralizedGeneratedExt = "GeneralizedGenerated" + DiffEqBaseMPIExt = "MPI" + DiffEqBaseMeasurementsExt = "Measurements" + DiffEqBaseMonteCarloMeasurementsExt = "MonteCarloMeasurements" + DiffEqBaseReverseDiffExt = "ReverseDiff" + DiffEqBaseTrackerExt = "Tracker" + DiffEqBaseUnitfulExt = "Unitful" + + [deps.DiffEqBase.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + Distributions = "31c24e10-a181-5473-b8eb-7969acd0382f" + Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9" + GeneralizedGenerated = "6b9d7cbe-bcb9-11e9-073f-15a7a543e2eb" + MPI = "da04e1cc-30fd-572f-bb4f-1f8673147195" + Measurements = "eff96d63-e80a-5855-80a2-b1b0885c5ab7" + MonteCarloMeasurements = "0987c9cc-fe09-11e8-30f0-b96dd679fdca" + ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" + Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" + +[[deps.DiffEqCallbacks]] +deps = ["DataStructures", "DiffEqBase", "ForwardDiff", "Functors", "LinearAlgebra", "Markdown", "NLsolve", "Parameters", "RecipesBase", "RecursiveArrayTools", "SciMLBase", "StaticArraysCore"] +git-tree-sha1 = "cf334da651a6e42c50e1477d6ab978f1b8be3057" +uuid = "459566f4-90b8-5000-8ac3-15dfb0a30def" +version = "2.36.1" +weakdeps = ["OrdinaryDiffEq", "Sundials"] + +[[deps.DiffEqNoiseProcess]] +deps = ["DiffEqBase", "Distributions", "GPUArraysCore", "LinearAlgebra", "Markdown", "Optim", "PoissonRandom", "QuadGK", "Random", "Random123", "RandomNumbers", "RecipesBase", "RecursiveArrayTools", "Requires", "ResettableStacks", "SciMLBase", "StaticArraysCore", "Statistics"] +git-tree-sha1 = "65cbbe1450ced323b4b17228ccd96349d96795a7" +uuid = "77a26b50-5914-5dd7-bc55-306e6241c503" +version = "5.21.0" + + [deps.DiffEqNoiseProcess.extensions] + DiffEqNoiseProcessReverseDiffExt = "ReverseDiff" + + [deps.DiffEqNoiseProcess.weakdeps] + ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + +[[deps.DiffResults]] +deps = ["StaticArraysCore"] +git-tree-sha1 = "782dd5f4561f5d267313f23853baaaa4c52ea621" +uuid = "163ba53b-c6d8-5494-b064-1a9d43ac40c5" +version = "1.1.0" + +[[deps.DiffRules]] +deps = ["IrrationalConstants", "LogExpFunctions", "NaNMath", "Random", "SpecialFunctions"] +git-tree-sha1 = "23163d55f885173722d1e4cf0f6110cdbaf7e272" +uuid = "b552c78f-8df3-52c6-915a-8e097449b14b" +version = "1.15.1" + +[[deps.DifferentialEquations]] +deps = ["BoundaryValueDiffEq", "DelayDiffEq", "DiffEqBase", "DiffEqCallbacks", "DiffEqNoiseProcess", "JumpProcesses", "LinearAlgebra", "LinearSolve", "NonlinearSolve", "OrdinaryDiffEq", "Random", "RecursiveArrayTools", "Reexport", "SciMLBase", "SteadyStateDiffEq", "StochasticDiffEq", "Sundials"] +git-tree-sha1 = "81042254a307980b8ab5b67033aca26c2e157ebb" +uuid = "0c46a032-eb83-5123-abaf-570d42b7fbaa" +version = "7.13.0" + +[[deps.Distances]] +deps = ["LinearAlgebra", "Statistics", "StatsAPI"] +git-tree-sha1 = "66c4c81f259586e8f002eacebc177e1fb06363b0" +uuid = "b4f34e82-e78d-54a5-968a-f98e89d6e8f7" +version = "0.10.11" +weakdeps = ["ChainRulesCore", "SparseArrays"] + + [deps.Distances.extensions] + DistancesChainRulesCoreExt = "ChainRulesCore" + DistancesSparseArraysExt = "SparseArrays" + +[[deps.Distributed]] +deps = ["Random", "Serialization", "Sockets"] +uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" + +[[deps.Distributions]] +deps = ["FillArrays", "LinearAlgebra", "PDMats", "Printf", "QuadGK", "Random", "SpecialFunctions", "Statistics", "StatsAPI", "StatsBase", "StatsFuns"] +git-tree-sha1 = "7c302d7a5fec5214eb8a5a4c466dcf7a51fcf169" +uuid = "31c24e10-a181-5473-b8eb-7969acd0382f" +version = "0.25.107" + + [deps.Distributions.extensions] + DistributionsChainRulesCoreExt = "ChainRulesCore" + DistributionsDensityInterfaceExt = "DensityInterface" + DistributionsTestExt = "Test" + + [deps.Distributions.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + DensityInterface = "b429d917-457f-4dbc-8f4c-0cc954292b1d" + Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[[deps.DocStringExtensions]] +deps = ["LibGit2"] +git-tree-sha1 = "2fb1e02f2b635d0845df5d7c167fec4dd739b00d" +uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" +version = "0.9.3" + +[[deps.DomainSets]] +deps = ["CompositeTypes", "IntervalSets", "LinearAlgebra", "Random", "StaticArrays", "Statistics"] +git-tree-sha1 = "51b4b84d33ec5e0955b55ff4b748b99ce2c3faa9" +uuid = "5b8099bc-c8ec-5219-889f-1d9e522a28bf" +version = "0.6.7" + +[[deps.Downloads]] +deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] +uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" +version = "1.6.0" + +[[deps.DualNumbers]] +deps = ["Calculus", "NaNMath", "SpecialFunctions"] +git-tree-sha1 = "5837a837389fccf076445fce071c8ddaea35a566" +uuid = "fa6b7ba4-c1ee-5f82-b5fc-ecf0adba8f74" +version = "0.6.8" + +[[deps.DynamicPolynomials]] +deps = ["Future", "LinearAlgebra", "MultivariatePolynomials", "MutableArithmetics", "Pkg", "Reexport", "Test"] +git-tree-sha1 = "0c056035f7de73b203a5295a22137f96fc32ad46" +uuid = "7c1d4256-1411-5781-91ec-d7bc3513ac07" +version = "0.5.6" + +[[deps.EnumX]] +git-tree-sha1 = "bdb1942cd4c45e3c678fd11569d5cccd80976237" +uuid = "4e289a0a-7415-4d19-859d-a7e5c4648b56" +version = "1.0.4" + +[[deps.EnzymeCore]] +git-tree-sha1 = "1bc328eec34ffd80357f84a84bb30e4374e9bd60" +uuid = "f151be2c-9106-41f4-ab19-57ee4f262869" +version = "0.6.6" +weakdeps = ["Adapt"] + + [deps.EnzymeCore.extensions] + AdaptExt = "Adapt" + +[[deps.EpollShim_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "8e9441ee83492030ace98f9789a654a6d0b1f643" +uuid = "2702e6a9-849d-5ed8-8c21-79e8b8f9ee43" +version = "0.0.20230411+0" + +[[deps.ExceptionUnwrapping]] +deps = ["Test"] +git-tree-sha1 = "dcb08a0d93ec0b1cdc4af184b26b591e9695423a" +uuid = "460bff9d-24e4-43bc-9d9f-a8973cb893f4" +version = "0.1.10" + +[[deps.Expat_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "4558ab818dcceaab612d1bb8c19cee87eda2b83c" +uuid = "2e619515-83b5-522b-bb60-26c02a35a201" +version = "2.5.0+0" + +[[deps.ExponentialUtilities]] +deps = ["Adapt", "ArrayInterface", "GPUArraysCore", "GenericSchur", "LinearAlgebra", "PrecompileTools", "Printf", "SparseArrays", "libblastrampoline_jll"] +git-tree-sha1 = "602e4585bcbd5a25bc06f514724593d13ff9e862" +uuid = "d4d017d3-3776-5f7e-afef-a10c40355c18" +version = "1.25.0" + +[[deps.ExprTools]] +git-tree-sha1 = "27415f162e6028e81c72b82ef756bf321213b6ec" +uuid = "e2ba6199-217a-4e67-a87a-7c52f15ade04" +version = "0.1.10" + +[[deps.FFMPEG]] +deps = ["FFMPEG_jll"] +git-tree-sha1 = "b57e3acbe22f8484b4b5ff66a7499717fe1a9cc8" +uuid = "c87230d0-a227-11e9-1b43-d7ebe4e7570a" +version = "0.4.1" + +[[deps.FFMPEG_jll]] +deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "JLLWrappers", "LAME_jll", "Libdl", "Ogg_jll", "OpenSSL_jll", "Opus_jll", "PCRE2_jll", "Zlib_jll", "libaom_jll", "libass_jll", "libfdk_aac_jll", "libvorbis_jll", "x264_jll", "x265_jll"] +git-tree-sha1 = "466d45dc38e15794ec7d5d63ec03d776a9aff36e" +uuid = "b22a6f82-2f65-5046-a5b2-351ab43fb4e5" +version = "4.4.4+1" + +[[deps.FastAlmostBandedMatrices]] +deps = ["ArrayInterface", "ArrayLayouts", "BandedMatrices", "ConcreteStructs", "LazyArrays", "LinearAlgebra", "MatrixFactorizations", "PrecompileTools", "Reexport"] +git-tree-sha1 = "9dc913faf8552fd09b92a0d7fcc25f1d5609d795" +uuid = "9d29842c-ecb8-4973-b1e9-a27b1157504e" +version = "0.1.1" + +[[deps.FastBroadcast]] +deps = ["ArrayInterface", "LinearAlgebra", "Polyester", "Static", "StaticArrayInterface", "StrideArraysCore"] +git-tree-sha1 = "a6e756a880fc419c8b41592010aebe6a5ce09136" +uuid = "7034ab61-46d4-4ed7-9d0f-46aef9175898" +version = "0.2.8" + +[[deps.FastClosures]] +git-tree-sha1 = "acebe244d53ee1b461970f8910c235b259e772ef" +uuid = "9aa1b823-49e4-5ca5-8b0f-3971ec8bab6a" +version = "0.3.2" + +[[deps.FastLapackInterface]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "0a59c7d1002f3131de53dc4568a47d15a44daef7" +uuid = "29a986be-02c6-4525-aec4-84b980013641" +version = "2.0.2" + +[[deps.FileWatching]] +uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" + +[[deps.FillArrays]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "bfe82a708416cf00b73a3198db0859c82f741558" +uuid = "1a297f60-69ca-5386-bcde-b61e274b549b" +version = "1.10.0" +weakdeps = ["PDMats", "SparseArrays", "Statistics"] + + [deps.FillArrays.extensions] + FillArraysPDMatsExt = "PDMats" + FillArraysSparseArraysExt = "SparseArrays" + FillArraysStatisticsExt = "Statistics" + +[[deps.FiniteDiff]] +deps = ["ArrayInterface", "LinearAlgebra", "Requires", "Setfield", "SparseArrays"] +git-tree-sha1 = "73d1214fec245096717847c62d389a5d2ac86504" +uuid = "6a86dc24-6348-571c-b903-95158fe2bd41" +version = "2.22.0" + + [deps.FiniteDiff.extensions] + FiniteDiffBandedMatricesExt = "BandedMatrices" + FiniteDiffBlockBandedMatricesExt = "BlockBandedMatrices" + FiniteDiffStaticArraysExt = "StaticArrays" + + [deps.FiniteDiff.weakdeps] + BandedMatrices = "aae01518-5342-5314-be14-df237901396f" + BlockBandedMatrices = "ffab5731-97b5-5995-9138-79e8c1846df0" + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + +[[deps.FixedPointNumbers]] +deps = ["Statistics"] +git-tree-sha1 = "335bfdceacc84c5cdf16aadc768aa5ddfc5383cc" +uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" +version = "0.8.4" + +[[deps.Fontconfig_jll]] +deps = ["Artifacts", "Bzip2_jll", "Expat_jll", "FreeType2_jll", "JLLWrappers", "Libdl", "Libuuid_jll", "Pkg", "Zlib_jll"] +git-tree-sha1 = "21efd19106a55620a188615da6d3d06cd7f6ee03" +uuid = "a3f928ae-7b40-5064-980b-68af3947d34b" +version = "2.13.93+0" + +[[deps.Format]] +git-tree-sha1 = "9c68794ef81b08086aeb32eeaf33531668d5f5fc" +uuid = "1fa38f19-a742-5d3f-a2b9-30dd87b9d5f8" +version = "1.3.7" + +[[deps.ForwardDiff]] +deps = ["CommonSubexpressions", "DiffResults", "DiffRules", "LinearAlgebra", "LogExpFunctions", "NaNMath", "Preferences", "Printf", "Random", "SpecialFunctions"] +git-tree-sha1 = "cf0fe81336da9fb90944683b8c41984b08793dad" +uuid = "f6369f11-7733-5829-9624-2563aa707210" +version = "0.10.36" +weakdeps = ["StaticArrays"] + + [deps.ForwardDiff.extensions] + ForwardDiffStaticArraysExt = "StaticArrays" + +[[deps.FreeType2_jll]] +deps = ["Artifacts", "Bzip2_jll", "JLLWrappers", "Libdl", "Zlib_jll"] +git-tree-sha1 = "d8db6a5a2fe1381c1ea4ef2cab7c69c2de7f9ea0" +uuid = "d7e528f0-a631-5988-bf34-fe36492bcfd7" +version = "2.13.1+0" + +[[deps.FriBidi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "aa31987c2ba8704e23c6c8ba8a4f769d5d7e4f91" +uuid = "559328eb-81f9-559d-9380-de523a88c83c" +version = "1.0.10+0" + +[[deps.FunctionWrappers]] +git-tree-sha1 = "d62485945ce5ae9c0c48f124a84998d755bae00e" +uuid = "069b7b12-0de2-55c6-9aab-29f3d0a68a2e" +version = "1.1.3" + +[[deps.FunctionWrappersWrappers]] +deps = ["FunctionWrappers"] +git-tree-sha1 = "b104d487b34566608f8b4e1c39fb0b10aa279ff8" +uuid = "77dc65aa-8811-40c2-897b-53d922fa7daf" +version = "0.1.3" + +[[deps.Functors]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "d3e63d9fa13f8eaa2f06f64949e2afc593ff52c2" +uuid = "d9f16b24-f501-4c13-a1f2-28368ffc5196" +version = "0.4.10" + +[[deps.Future]] +deps = ["Random"] +uuid = "9fa8497b-333b-5362-9e8d-4d0656e87820" + +[[deps.GLFW_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libglvnd_jll", "Xorg_libXcursor_jll", "Xorg_libXi_jll", "Xorg_libXinerama_jll", "Xorg_libXrandr_jll"] +git-tree-sha1 = "ff38ba61beff76b8f4acad8ab0c97ef73bb670cb" +uuid = "0656b61e-2033-5cc2-a64a-77c0f6c09b89" +version = "3.3.9+0" + +[[deps.GPUArraysCore]] +deps = ["Adapt"] +git-tree-sha1 = "2d6ca471a6c7b536127afccfa7564b5b39227fe0" +uuid = "46192b85-c4d5-4398-a991-12ede77f4527" +version = "0.1.5" + +[[deps.GR]] +deps = ["Artifacts", "Base64", "DelimitedFiles", "Downloads", "GR_jll", "HTTP", "JSON", "Libdl", "LinearAlgebra", "Pkg", "Preferences", "Printf", "Random", "Serialization", "Sockets", "TOML", "Tar", "Test", "UUIDs", "p7zip_jll"] +git-tree-sha1 = "3437ade7073682993e092ca570ad68a2aba26983" +uuid = "28b8d3ca-fb5f-59d9-8090-bfdbd6d07a71" +version = "0.73.3" + +[[deps.GR_jll]] +deps = ["Artifacts", "Bzip2_jll", "Cairo_jll", "FFMPEG_jll", "Fontconfig_jll", "FreeType2_jll", "GLFW_jll", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Libtiff_jll", "Pixman_jll", "Qt6Base_jll", "Zlib_jll", "libpng_jll"] +git-tree-sha1 = "a96d5c713e6aa28c242b0d25c1347e258d6541ab" +uuid = "d2c73de3-f751-5644-a686-071e5b155ba9" +version = "0.73.3+0" + +[[deps.GenericSchur]] +deps = ["LinearAlgebra", "Printf"] +git-tree-sha1 = "af49a0851f8113fcfae2ef5027c6d49d0acec39b" +uuid = "c145ed77-6b09-5dd9-b285-bf645a82121e" +version = "0.5.4" + +[[deps.Gettext_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Libiconv_jll", "Pkg", "XML2_jll"] +git-tree-sha1 = "9b02998aba7bf074d14de89f9d37ca24a1a0b046" +uuid = "78b55507-aeef-58d4-861c-77aaff3498b1" +version = "0.21.0+0" + +[[deps.Glib_jll]] +deps = ["Artifacts", "Gettext_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Libiconv_jll", "Libmount_jll", "PCRE2_jll", "Zlib_jll"] +git-tree-sha1 = "359a1ba2e320790ddbe4ee8b4d54a305c0ea2aff" +uuid = "7746bdde-850d-59dc-9ae8-88ece973131d" +version = "2.80.0+0" + +[[deps.Glob]] +git-tree-sha1 = "97285bbd5230dd766e9ef6749b80fc617126d496" +uuid = "c27321d9-0574-5035-807b-f59d2c89b15c" +version = "1.3.1" + +[[deps.Graphite2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "344bf40dcab1073aca04aa0df4fb092f920e4011" +uuid = "3b182d85-2403-5c21-9c21-1e1f0cc25472" +version = "1.3.14+0" + +[[deps.Graphs]] +deps = ["ArnoldiMethod", "Compat", "DataStructures", "Distributed", "Inflate", "LinearAlgebra", "Random", "SharedArrays", "SimpleTraits", "SparseArrays", "Statistics"] +git-tree-sha1 = "3863330da5466410782f2bffc64f3d505a6a8334" +uuid = "86223c79-3864-5bf0-83f7-82e725a168b6" +version = "1.10.0" + +[[deps.Grisu]] +git-tree-sha1 = "53bb909d1151e57e2484c3d1b53e19552b887fb2" +uuid = "42e2da0e-8278-4e71-bc24-59509adca0fe" +version = "1.0.2" + +[[deps.Groebner]] +deps = ["AbstractAlgebra", "Combinatorics", "ExprTools", "Logging", "MultivariatePolynomials", "PrecompileTools", "PrettyTables", "Primes", "Printf", "Random", "SIMD", "TimerOutputs"] +git-tree-sha1 = "6b505ef15e55bdc5bb3ddbcfebdff1c9e67081e8" +uuid = "0b43b601-686d-58a3-8a1c-6623616c7cd4" +version = "0.5.1" + +[[deps.GroupsCore]] +deps = ["Markdown", "Random"] +git-tree-sha1 = "6df9cd6ee79fc59feab33f63a1b3c9e95e2461d5" +uuid = "d5909c97-4eac-4ecc-a3dc-fdd0858a4120" +version = "0.4.2" + +[[deps.HTTP]] +deps = ["Base64", "CodecZlib", "ConcurrentUtilities", "Dates", "ExceptionUnwrapping", "Logging", "LoggingExtras", "MbedTLS", "NetworkOptions", "OpenSSL", "Random", "SimpleBufferStream", "Sockets", "URIs", "UUIDs"] +git-tree-sha1 = "8e59b47b9dc525b70550ca082ce85bcd7f5477cd" +uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3" +version = "1.10.5" + +[[deps.HarfBuzz_jll]] +deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "Graphite2_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Pkg"] +git-tree-sha1 = "129acf094d168394e80ee1dc4bc06ec835e510a3" +uuid = "2e76f6c2-a576-52d4-95c1-20adfe4de566" +version = "2.8.1+1" + +[[deps.HostCPUFeatures]] +deps = ["BitTwiddlingConvenienceFunctions", "IfElse", "Libdl", "Static"] +git-tree-sha1 = "eb8fed28f4994600e29beef49744639d985a04b2" +uuid = "3e5b6fbb-0976-4d2c-9146-d79de83f2fb0" +version = "0.1.16" + +[[deps.HypergeometricFunctions]] +deps = ["DualNumbers", "LinearAlgebra", "OpenLibm_jll", "SpecialFunctions"] +git-tree-sha1 = "f218fe3736ddf977e0e772bc9a586b2383da2685" +uuid = "34004b35-14d8-5ef3-9330-4cdb6864b03a" +version = "0.3.23" + +[[deps.IfElse]] +git-tree-sha1 = "debdd00ffef04665ccbb3e150747a77560e8fad1" +uuid = "615f187c-cbe4-4ef1-ba3b-2fcf58d6d173" +version = "0.1.1" + +[[deps.Inflate]] +git-tree-sha1 = "ea8031dea4aff6bd41f1df8f2fdfb25b33626381" +uuid = "d25df0c9-e2be-5dd7-82c8-3ad0b3e990b9" +version = "0.1.4" + +[[deps.IntegerMathUtils]] +git-tree-sha1 = "b8ffb903da9f7b8cf695a8bead8e01814aa24b30" +uuid = "18e54dd8-cb9d-406c-a71d-865a43cbb235" +version = "0.1.2" + +[[deps.IntelOpenMP_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "5fdf2fe6724d8caabf43b557b84ce53f3b7e2f6b" +uuid = "1d5cc7b8-4909-519e-a0f8-d0f5ad9712d0" +version = "2024.0.2+0" + +[[deps.InteractiveUtils]] +deps = ["Markdown"] +uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" + +[[deps.IntervalSets]] +git-tree-sha1 = "dba9ddf07f77f60450fe5d2e2beb9854d9a49bd0" +uuid = "8197267c-284f-5f27-9208-e0e47529a953" +version = "0.7.10" +weakdeps = ["Random", "RecipesBase", "Statistics"] + + [deps.IntervalSets.extensions] + IntervalSetsRandomExt = "Random" + IntervalSetsRecipesBaseExt = "RecipesBase" + IntervalSetsStatisticsExt = "Statistics" + +[[deps.IrrationalConstants]] +git-tree-sha1 = "630b497eafcc20001bba38a4651b327dcfc491d2" +uuid = "92d709cd-6900-40b7-9082-c6be49f344b6" +version = "0.2.2" + +[[deps.IteratorInterfaceExtensions]] +git-tree-sha1 = "a3f24677c21f5bbe9d2a714f95dcd58337fb2856" +uuid = "82899510-4779-5014-852e-03e436cf321d" +version = "1.0.0" + +[[deps.JLFzf]] +deps = ["Pipe", "REPL", "Random", "fzf_jll"] +git-tree-sha1 = "a53ebe394b71470c7f97c2e7e170d51df21b17af" +uuid = "1019f520-868f-41f5-a6de-eb00f4b6a39c" +version = "0.1.7" + +[[deps.JLLWrappers]] +deps = ["Artifacts", "Preferences"] +git-tree-sha1 = "7e5d6779a1e09a36db2a7b6cff50942a0a7d0fca" +uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" +version = "1.5.0" + +[[deps.JSON]] +deps = ["Dates", "Mmap", "Parsers", "Unicode"] +git-tree-sha1 = "31e996f0a15c7b280ba9f76636b3ff9e2ae58c9a" +uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" +version = "0.21.4" + +[[deps.JpegTurbo_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "3336abae9a713d2210bb57ab484b1e065edd7d23" +uuid = "aacddb02-875f-59d6-b918-886e6ef4fbf8" +version = "3.0.2+0" + +[[deps.JuliaFormatter]] +deps = ["CSTParser", "CommonMark", "DataStructures", "Glob", "Pkg", "PrecompileTools", "Tokenize"] +git-tree-sha1 = "1c4880cb70a5c6c87ea36deccc3d7f9e7969c18c" +uuid = "98e50ef6-434e-11e9-1051-2b60c6c9e899" +version = "1.0.56" + +[[deps.JumpProcesses]] +deps = ["ArrayInterface", "DataStructures", "DiffEqBase", "DocStringExtensions", "FunctionWrappers", "Graphs", "LinearAlgebra", "Markdown", "PoissonRandom", "Random", "RandomNumbers", "RecursiveArrayTools", "Reexport", "SciMLBase", "StaticArrays", "UnPack"] +git-tree-sha1 = "c451feb97251965a9fe40bacd62551a72cc5902c" +uuid = "ccbc3e58-028d-4f4c-8cd5-9ae44345cda5" +version = "9.10.1" +weakdeps = ["FastBroadcast"] + + [deps.JumpProcesses.extensions] + JumpProcessFastBroadcastExt = "FastBroadcast" + +[[deps.KLU]] +deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse_jll"] +git-tree-sha1 = "884c2968c2e8e7e6bf5956af88cb46aa745c854b" +uuid = "ef3ab10e-7fda-4108-b977-705223b18434" +version = "0.4.1" + +[[deps.Krylov]] +deps = ["LinearAlgebra", "Printf", "SparseArrays"] +git-tree-sha1 = "8a6837ec02fe5fb3def1abc907bb802ef11a0729" +uuid = "ba0b0d4f-ebba-5204-a429-3ac8c609bfb7" +version = "0.9.5" + +[[deps.LAME_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "f6250b16881adf048549549fba48b1161acdac8c" +uuid = "c1c5ebd0-6772-5130-a774-d5fcae4a789d" +version = "3.100.1+0" + +[[deps.LERC_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "bf36f528eec6634efc60d7ec062008f171071434" +uuid = "88015f11-f218-50d7-93a8-a6af411a945d" +version = "3.0.0+1" + +[[deps.LLVMOpenMP_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "d986ce2d884d49126836ea94ed5bfb0f12679713" +uuid = "1d63c593-3942-5779-bab2-d838dc0a180e" +version = "15.0.7+0" + +[[deps.LZO_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "e5b909bcf985c5e2605737d2ce278ed791b89be6" +uuid = "dd4b983a-f0e5-5f8d-a1b7-129d4a5fb1ac" +version = "2.10.1+0" + +[[deps.LaTeXStrings]] +git-tree-sha1 = "50901ebc375ed41dbf8058da26f9de442febbbec" +uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" +version = "1.3.1" + +[[deps.LabelledArrays]] +deps = ["ArrayInterface", "ChainRulesCore", "ForwardDiff", "LinearAlgebra", "MacroTools", "PreallocationTools", "RecursiveArrayTools", "StaticArrays"] +git-tree-sha1 = "d1f981fba6eb3ec393eede4821bca3f2b7592cd4" +uuid = "2ee39098-c373-598a-b85f-a56591580800" +version = "1.15.1" + +[[deps.LambertW]] +git-tree-sha1 = "c5ffc834de5d61d00d2b0e18c96267cffc21f648" +uuid = "984bce1d-4616-540c-a9ee-88d1112d94c9" +version = "0.4.6" + +[[deps.Latexify]] +deps = ["Format", "InteractiveUtils", "LaTeXStrings", "MacroTools", "Markdown", "OrderedCollections", "Requires"] +git-tree-sha1 = "e0b5cd21dc1b44ec6e64f351976f961e6f31d6c4" +uuid = "23fbe1c1-3f47-55db-b15f-69d7ec21a316" +version = "0.16.3" + + [deps.Latexify.extensions] + DataFramesExt = "DataFrames" + SymEngineExt = "SymEngine" + + [deps.Latexify.weakdeps] + DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" + SymEngine = "123dc426-2d89-5057-bbad-38513e3affd8" + +[[deps.LayoutPointers]] +deps = ["ArrayInterface", "LinearAlgebra", "ManualMemory", "SIMDTypes", "Static", "StaticArrayInterface"] +git-tree-sha1 = "62edfee3211981241b57ff1cedf4d74d79519277" +uuid = "10f19ff3-798f-405d-979b-55457f8fc047" +version = "0.1.15" + +[[deps.Lazy]] +deps = ["MacroTools"] +git-tree-sha1 = "1370f8202dac30758f3c345f9909b97f53d87d3f" +uuid = "50d2b5c4-7a5e-59d5-8109-a42b560f39c0" +version = "0.15.1" + +[[deps.LazyArrays]] +deps = ["ArrayLayouts", "FillArrays", "LinearAlgebra", "MacroTools", "MatrixFactorizations", "SparseArrays"] +git-tree-sha1 = "30fc74040b7507231ba889e363fd1135f5067395" +uuid = "5078a376-72f3-5289-bfd5-ec5146d43c02" +version = "1.9.1" +weakdeps = ["StaticArrays"] + + [deps.LazyArrays.extensions] + LazyArraysStaticArraysExt = "StaticArrays" + +[[deps.LazyArtifacts]] +deps = ["Artifacts", "Pkg"] +uuid = "4af54fe1-eca0-43a8-85a7-787d91b784e3" + +[[deps.LevyArea]] +deps = ["LinearAlgebra", "Random", "SpecialFunctions"] +git-tree-sha1 = "56513a09b8e0ae6485f34401ea9e2f31357958ec" +uuid = "2d8b4e74-eb68-11e8-0fb9-d5eb67b50637" +version = "1.0.0" + +[[deps.LibCURL]] +deps = ["LibCURL_jll", "MozillaCACerts_jll"] +uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" +version = "0.6.3" + +[[deps.LibCURL_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] +uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" +version = "7.84.0+0" + +[[deps.LibGit2]] +deps = ["Base64", "NetworkOptions", "Printf", "SHA"] +uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" + +[[deps.LibSSH2_jll]] +deps = ["Artifacts", "Libdl", "MbedTLS_jll"] +uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" +version = "1.10.2+0" + +[[deps.Libdl]] +uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" + +[[deps.Libffi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "0b4a5d71f3e5200a7dff793393e09dfc2d874290" +uuid = "e9f186c6-92d2-5b65-8a66-fee21dc1b490" +version = "3.2.2+1" + +[[deps.Libgcrypt_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgpg_error_jll", "Pkg"] +git-tree-sha1 = "64613c82a59c120435c067c2b809fc61cf5166ae" +uuid = "d4300ac3-e22c-5743-9152-c294e39db1e4" +version = "1.8.7+0" + +[[deps.Libglvnd_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll", "Xorg_libXext_jll"] +git-tree-sha1 = "6f73d1dd803986947b2c750138528a999a6c7733" +uuid = "7e76a0d4-f3c7-5321-8279-8d96eeed0f29" +version = "1.6.0+0" + +[[deps.Libgpg_error_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "c333716e46366857753e273ce6a69ee0945a6db9" +uuid = "7add5ba3-2f88-524e-9cd5-f83b8a55f7b8" +version = "1.42.0+0" + +[[deps.Libiconv_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "f9557a255370125b405568f9767d6d195822a175" +uuid = "94ce4f54-9a6c-5748-9c1c-f9c7231a4531" +version = "1.17.0+0" + +[[deps.Libmount_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "dae976433497a2f841baadea93d27e68f1a12a97" +uuid = "4b2f31a3-9ecc-558c-b454-b3730dcb73e9" +version = "2.39.3+0" + +[[deps.Libtiff_jll]] +deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "LERC_jll", "Libdl", "XZ_jll", "Zlib_jll", "Zstd_jll"] +git-tree-sha1 = "2da088d113af58221c52828a80378e16be7d037a" +uuid = "89763e89-9b03-5906-acba-b20f662cd828" +version = "4.5.1+1" + +[[deps.Libuuid_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "0a04a1318df1bf510beb2562cf90fb0c386f58c4" +uuid = "38a345b3-de98-5d2b-a5d3-14cd9215e700" +version = "2.39.3+1" + +[[deps.LineSearches]] +deps = ["LinearAlgebra", "NLSolversBase", "NaNMath", "Parameters", "Printf"] +git-tree-sha1 = "7bbea35cec17305fc70a0e5b4641477dc0789d9d" +uuid = "d3d80556-e9d4-5f37-9878-2ab0fcc64255" +version = "7.2.0" + +[[deps.LinearAlgebra]] +deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"] +uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + +[[deps.LinearSolve]] +deps = ["ArrayInterface", "ConcreteStructs", "DocStringExtensions", "EnumX", "FastLapackInterface", "GPUArraysCore", "InteractiveUtils", "KLU", "Krylov", "Libdl", "LinearAlgebra", "MKL_jll", "PrecompileTools", "Preferences", "RecursiveFactorization", "Reexport", "SciMLBase", "SciMLOperators", "Setfield", "SparseArrays", "Sparspak", "StaticArraysCore", "UnPack"] +git-tree-sha1 = "6f8e084deabe3189416c4e505b1c53e1b590cae8" +uuid = "7ed4a6bd-45f5-4d41-b270-4a48e9bafcae" +version = "2.22.1" + + [deps.LinearSolve.extensions] + LinearSolveBandedMatricesExt = "BandedMatrices" + LinearSolveBlockDiagonalsExt = "BlockDiagonals" + LinearSolveCUDAExt = "CUDA" + LinearSolveEnzymeExt = ["Enzyme", "EnzymeCore"] + LinearSolveFastAlmostBandedMatricesExt = ["FastAlmostBandedMatrices"] + LinearSolveHYPREExt = "HYPRE" + LinearSolveIterativeSolversExt = "IterativeSolvers" + LinearSolveKernelAbstractionsExt = "KernelAbstractions" + LinearSolveKrylovKitExt = "KrylovKit" + LinearSolveMetalExt = "Metal" + LinearSolvePardisoExt = "Pardiso" + LinearSolveRecursiveArrayToolsExt = "RecursiveArrayTools" + + [deps.LinearSolve.weakdeps] + BandedMatrices = "aae01518-5342-5314-be14-df237901396f" + BlockDiagonals = "0a1fb500-61f7-11e9-3c65-f5ef3456f9f0" + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9" + EnzymeCore = "f151be2c-9106-41f4-ab19-57ee4f262869" + FastAlmostBandedMatrices = "9d29842c-ecb8-4973-b1e9-a27b1157504e" + HYPRE = "b5ffcf37-a2bd-41ab-a3da-4bd9bc8ad771" + IterativeSolvers = "42fd0dbc-a981-5370-80f2-aaf504508153" + KernelAbstractions = "63c18a36-062a-441e-b654-da1e3ab1ce7c" + KrylovKit = "0b1a1467-8014-51b9-945f-bf0ae24f4b77" + Metal = "dde4c033-4e86-420c-a63e-0dd931031962" + Pardiso = "46dd5b70-b6fb-5a00-ae2d-e8fea33afaf2" + RecursiveArrayTools = "731186ca-8d62-57ce-b412-fbd966d074cd" + +[[deps.LogExpFunctions]] +deps = ["DocStringExtensions", "IrrationalConstants", "LinearAlgebra"] +git-tree-sha1 = "18144f3e9cbe9b15b070288eef858f71b291ce37" +uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688" +version = "0.3.27" + + [deps.LogExpFunctions.extensions] + LogExpFunctionsChainRulesCoreExt = "ChainRulesCore" + LogExpFunctionsChangesOfVariablesExt = "ChangesOfVariables" + LogExpFunctionsInverseFunctionsExt = "InverseFunctions" + + [deps.LogExpFunctions.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + ChangesOfVariables = "9e997f8a-9a97-42d5-a9f1-ce6bfc15e2c0" + InverseFunctions = "3587e190-3f89-42d0-90ee-14403ec27112" + +[[deps.Logging]] +uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" + +[[deps.LoggingExtras]] +deps = ["Dates", "Logging"] +git-tree-sha1 = "c1dd6d7978c12545b4179fb6153b9250c96b0075" +uuid = "e6f89c97-d47a-5376-807f-9c37f3926c36" +version = "1.0.3" + +[[deps.LoopVectorization]] +deps = ["ArrayInterface", "CPUSummary", "CloseOpenIntervals", "DocStringExtensions", "HostCPUFeatures", "IfElse", "LayoutPointers", "LinearAlgebra", "OffsetArrays", "PolyesterWeave", "PrecompileTools", "SIMDTypes", "SLEEFPirates", "Static", "StaticArrayInterface", "ThreadingUtilities", "UnPack", "VectorizationBase"] +git-tree-sha1 = "a13f3be5d84b9c95465d743c82af0b094ef9c2e2" +uuid = "bdcacae8-1622-11e9-2a5c-532679323890" +version = "0.12.169" +weakdeps = ["ChainRulesCore", "ForwardDiff", "SpecialFunctions"] + + [deps.LoopVectorization.extensions] + ForwardDiffExt = ["ChainRulesCore", "ForwardDiff"] + SpecialFunctionsExt = "SpecialFunctions" + +[[deps.MKL_jll]] +deps = ["Artifacts", "IntelOpenMP_jll", "JLLWrappers", "LazyArtifacts", "Libdl"] +git-tree-sha1 = "72dc3cf284559eb8f53aa593fe62cb33f83ed0c0" +uuid = "856f044c-d86e-5d09-b602-aeab76dc8ba7" +version = "2024.0.0+0" + +[[deps.MLStyle]] +git-tree-sha1 = "bc38dff0548128765760c79eb7388a4b37fae2c8" +uuid = "d8e11817-5142-5d16-987a-aa16d5891078" +version = "0.4.17" + +[[deps.MacroTools]] +deps = ["Markdown", "Random"] +git-tree-sha1 = "2fa9ee3e63fd3a4f7a9a4f4744a52f4856de82df" +uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" +version = "0.5.13" + +[[deps.ManualMemory]] +git-tree-sha1 = "bcaef4fc7a0cfe2cba636d84cda54b5e4e4ca3cd" +uuid = "d125e4d3-2237-4719-b19c-fa641b8a4667" +version = "0.1.8" + +[[deps.Markdown]] +deps = ["Base64"] +uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" + +[[deps.MatrixFactorizations]] +deps = ["ArrayLayouts", "LinearAlgebra", "Printf", "Random"] +git-tree-sha1 = "6731e0574fa5ee21c02733e397beb133df90de35" +uuid = "a3b82374-2e81-5b9e-98ce-41277c0e4c87" +version = "2.2.0" + +[[deps.MaybeInplace]] +deps = ["ArrayInterface", "LinearAlgebra", "MacroTools", "SparseArrays"] +git-tree-sha1 = "b1f2f92feb0bc201e91c155ef575bcc7d9cc3526" +uuid = "bb5d69b7-63fc-4a16-80bd-7e42200c7bdb" +version = "0.1.2" + +[[deps.MbedTLS]] +deps = ["Dates", "MbedTLS_jll", "MozillaCACerts_jll", "NetworkOptions", "Random", "Sockets"] +git-tree-sha1 = "c067a280ddc25f196b5e7df3877c6b226d390aaf" +uuid = "739be429-bea8-5141-9913-cc70e7f3736d" +version = "1.1.9" + +[[deps.MbedTLS_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" +version = "2.28.2+0" + +[[deps.Measures]] +git-tree-sha1 = "c13304c81eec1ed3af7fc20e75fb6b26092a1102" +uuid = "442fdcdd-2543-5da2-b0f3-8c86c306513e" +version = "0.3.2" + +[[deps.Missings]] +deps = ["DataAPI"] +git-tree-sha1 = "ec4f7fbeab05d7747bdf98eb74d130a2a2ed298d" +uuid = "e1d29d7a-bbdc-5cf2-9ac0-f12de2c33e28" +version = "1.2.0" + +[[deps.Mmap]] +uuid = "a63ad114-7e13-5084-954f-fe012c677804" + +[[deps.ModelingToolkit]] +deps = ["AbstractTrees", "ArrayInterface", "Combinatorics", "Compat", "ConstructionBase", "DataStructures", "DiffEqBase", "DiffEqCallbacks", "DiffRules", "Distributed", "Distributions", "DocStringExtensions", "DomainSets", "ForwardDiff", "FunctionWrappersWrappers", "Graphs", "IfElse", "InteractiveUtils", "JuliaFormatter", "JumpProcesses", "LabelledArrays", "Latexify", "Libdl", "LinearAlgebra", "MLStyle", "MacroTools", "NaNMath", "OrdinaryDiffEq", "PrecompileTools", "RecursiveArrayTools", "Reexport", "RuntimeGeneratedFunctions", "SciMLBase", "Serialization", "Setfield", "SimpleNonlinearSolve", "SparseArrays", "SpecialFunctions", "StaticArrays", "SymbolicIndexingInterface", "SymbolicUtils", "Symbolics", "URIs", "UnPack", "Unitful"] +git-tree-sha1 = "11f35f9619c625c18454a94a9013e7d047501fbf" +uuid = "961ee093-0014-501f-94e3-6117800e7a78" +version = "8.75.0" + + [deps.ModelingToolkit.extensions] + MTKBifurcationKitExt = "BifurcationKit" + MTKDeepDiffsExt = "DeepDiffs" + + [deps.ModelingToolkit.weakdeps] + BifurcationKit = "0f109fa4-8a5d-4b75-95aa-f515264e7665" + DeepDiffs = "ab62b9b5-e342-54a8-a765-a90f495de1a6" + +[[deps.MozillaCACerts_jll]] +uuid = "14a3606d-f60d-562e-9121-12d972cd8159" +version = "2022.10.11" + +[[deps.MuladdMacro]] +git-tree-sha1 = "cac9cc5499c25554cba55cd3c30543cff5ca4fab" +uuid = "46d2c3a1-f734-5fdb-9937-b9b9aeba4221" +version = "0.2.4" + +[[deps.MultivariatePolynomials]] +deps = ["ChainRulesCore", "DataStructures", "LinearAlgebra", "MutableArithmetics"] +git-tree-sha1 = "769c9175942d91ed9b83fa929eee4fe6a1d128ad" +uuid = "102ac46a-7ee4-5c85-9060-abc95bfdeaa3" +version = "0.5.4" + +[[deps.MutableArithmetics]] +deps = ["LinearAlgebra", "SparseArrays", "Test"] +git-tree-sha1 = "c2e2d748aea87f006a87c1654878349baa04aaf0" +uuid = "d8a4904e-b15c-11e9-3269-09a3773c0cb0" +version = "1.4.3" + +[[deps.NLSolversBase]] +deps = ["DiffResults", "Distributed", "FiniteDiff", "ForwardDiff"] +git-tree-sha1 = "a0b464d183da839699f4c79e7606d9d186ec172c" +uuid = "d41bc354-129a-5804-8e4c-c37616107c6c" +version = "7.8.3" + +[[deps.NLsolve]] +deps = ["Distances", "LineSearches", "LinearAlgebra", "NLSolversBase", "Printf", "Reexport"] +git-tree-sha1 = "019f12e9a1a7880459d0173c182e6a99365d7ac1" +uuid = "2774e3e8-f4cf-5e23-947b-6d7e65073b56" +version = "4.5.1" + +[[deps.NaNMath]] +deps = ["OpenLibm_jll"] +git-tree-sha1 = "0877504529a3e5c3343c6f8b4c0381e57e4387e4" +uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" +version = "1.0.2" + +[[deps.NetworkOptions]] +uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" +version = "1.2.0" + +[[deps.NonlinearSolve]] +deps = ["ADTypes", "ArrayInterface", "ConcreteStructs", "DiffEqBase", "EnumX", "FastBroadcast", "FastClosures", "FiniteDiff", "ForwardDiff", "LazyArrays", "LineSearches", "LinearAlgebra", "LinearSolve", "MaybeInplace", "PrecompileTools", "Printf", "RecursiveArrayTools", "Reexport", "SciMLBase", "SciMLOperators", "SimpleNonlinearSolve", "SparseArrays", "SparseDiffTools", "StaticArrays", "UnPack"] +git-tree-sha1 = "72b036b728461272ae1b1c3f7096cb4c319d8793" +uuid = "8913a72c-1f9b-4ce2-8d82-65094dcecaec" +version = "3.4.0" + + [deps.NonlinearSolve.extensions] + NonlinearSolveBandedMatricesExt = "BandedMatrices" + NonlinearSolveFastLevenbergMarquardtExt = "FastLevenbergMarquardt" + NonlinearSolveFixedPointAccelerationExt = "FixedPointAcceleration" + NonlinearSolveLeastSquaresOptimExt = "LeastSquaresOptim" + NonlinearSolveMINPACKExt = "MINPACK" + NonlinearSolveNLsolveExt = "NLsolve" + NonlinearSolveSIAMFANLEquationsExt = "SIAMFANLEquations" + NonlinearSolveSpeedMappingExt = "SpeedMapping" + NonlinearSolveSymbolicsExt = "Symbolics" + NonlinearSolveZygoteExt = "Zygote" + + [deps.NonlinearSolve.weakdeps] + BandedMatrices = "aae01518-5342-5314-be14-df237901396f" + FastLevenbergMarquardt = "7a0df574-e128-4d35-8cbd-3d84502bf7ce" + FixedPointAcceleration = "817d07cb-a79a-5c30-9a31-890123675176" + LeastSquaresOptim = "0fc2ff8b-aaa3-5acd-a817-1944a5e08891" + MINPACK = "4854310b-de5a-5eb6-a2a5-c1dee2bd17f9" + NLsolve = "2774e3e8-f4cf-5e23-947b-6d7e65073b56" + SIAMFANLEquations = "084e46ad-d928-497d-ad5e-07fa361a48c4" + SpeedMapping = "f1835b91-879b-4a3f-a438-e4baacf14412" + Symbolics = "0c5d862f-8b57-4792-8d23-62f2024744c7" + Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f" + +[[deps.OffsetArrays]] +git-tree-sha1 = "e64b4f5ea6b7389f6f046d13d4896a8f9c1ba71e" +uuid = "6fe1bfb0-de20-5000-8ca7-80f57d26f881" +version = "1.14.0" +weakdeps = ["Adapt"] + + [deps.OffsetArrays.extensions] + OffsetArraysAdaptExt = "Adapt" + +[[deps.Ogg_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "887579a3eb005446d514ab7aeac5d1d027658b8f" +uuid = "e7412a2a-1a6e-54c0-be00-318e2571c051" +version = "1.3.5+1" + +[[deps.OpenBLAS_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] +uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" +version = "0.3.21+4" + +[[deps.OpenLibm_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "05823500-19ac-5b8b-9628-191a04bc5112" +version = "0.8.1+0" + +[[deps.OpenSSL]] +deps = ["BitFlags", "Dates", "MozillaCACerts_jll", "OpenSSL_jll", "Sockets"] +git-tree-sha1 = "af81a32750ebc831ee28bdaaba6e1067decef51e" +uuid = "4d8831e6-92b7-49fb-bdf8-b643e874388c" +version = "1.4.2" + +[[deps.OpenSSL_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "3da7367955dcc5c54c1ba4d402ccdc09a1a3e046" +uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95" +version = "3.0.13+1" + +[[deps.OpenSpecFun_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "13652491f6856acfd2db29360e1bbcd4565d04f1" +uuid = "efe28fd5-8261-553b-a9e1-b2916fc3738e" +version = "0.5.5+0" + +[[deps.Optim]] +deps = ["Compat", "FillArrays", "ForwardDiff", "LineSearches", "LinearAlgebra", "NLSolversBase", "NaNMath", "Parameters", "PositiveFactorizations", "Printf", "SparseArrays", "StatsBase"] +git-tree-sha1 = "d9b79c4eed437421ac4285148fcadf42e0700e89" +uuid = "429524aa-4258-5aef-a3af-852621145aeb" +version = "1.9.4" + + [deps.Optim.extensions] + OptimMOIExt = "MathOptInterface" + + [deps.Optim.weakdeps] + MathOptInterface = "b8f27783-ece8-5eb3-8dc8-9495eed66fee" + +[[deps.Opus_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "51a08fb14ec28da2ec7a927c4337e4332c2a4720" +uuid = "91d4177d-7536-5919-b921-800302f37372" +version = "1.3.2+0" + +[[deps.OrderedCollections]] +git-tree-sha1 = "dfdf5519f235516220579f949664f1bf44e741c5" +uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" +version = "1.6.3" + +[[deps.OrdinaryDiffEq]] +deps = ["ADTypes", "Adapt", "ArrayInterface", "DataStructures", "DiffEqBase", "DocStringExtensions", "ExponentialUtilities", "FastBroadcast", "FastClosures", "FillArrays", "FiniteDiff", "ForwardDiff", "FunctionWrappersWrappers", "IfElse", "InteractiveUtils", "LineSearches", "LinearAlgebra", "LinearSolve", "Logging", "LoopVectorization", "MacroTools", "MuladdMacro", "NonlinearSolve", "Polyester", "PreallocationTools", "PrecompileTools", "Preferences", "RecursiveArrayTools", "Reexport", "SciMLBase", "SciMLOperators", "SimpleNonlinearSolve", "SimpleUnPack", "SparseArrays", "SparseDiffTools", "StaticArrayInterface", "StaticArrays", "TruncatedStacktraces"] +git-tree-sha1 = "96ae028da53cdfe24712ab015a6f854cfd7609c0" +uuid = "1dea7af3-3e70-54e6-95c3-0bf5283fa5ed" +version = "6.66.0" + +[[deps.PCRE2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "efcefdf7-47ab-520b-bdef-62a2eaa19f15" +version = "10.42.0+0" + +[[deps.PDMats]] +deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"] +git-tree-sha1 = "949347156c25054de2db3b166c52ac4728cbad65" +uuid = "90014a1f-27ba-587c-ab20-58faa44d9150" +version = "0.11.31" + +[[deps.PackageExtensionCompat]] +git-tree-sha1 = "fb28e33b8a95c4cee25ce296c817d89cc2e53518" +uuid = "65ce6f38-6b18-4e1d-a461-8949797d7930" +version = "1.0.2" +weakdeps = ["Requires", "TOML"] + +[[deps.Parameters]] +deps = ["OrderedCollections", "UnPack"] +git-tree-sha1 = "34c0e9ad262e5f7fc75b10a9952ca7692cfc5fbe" +uuid = "d96e819e-fc66-5662-9728-84c9c7592b0a" +version = "0.12.3" + +[[deps.Parsers]] +deps = ["Dates", "PrecompileTools", "UUIDs"] +git-tree-sha1 = "8489905bcdbcfac64d1daa51ca07c0d8f0283821" +uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" +version = "2.8.1" + +[[deps.Pipe]] +git-tree-sha1 = "6842804e7867b115ca9de748a0cf6b364523c16d" +uuid = "b98c9c47-44ae-5843-9183-064241ee97a0" +version = "1.3.0" + +[[deps.Pixman_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LLVMOpenMP_jll", "Libdl"] +git-tree-sha1 = "64779bc4c9784fee475689a1752ef4d5747c5e87" +uuid = "30392449-352a-5448-841d-b1acce4e97dc" +version = "0.42.2+0" + +[[deps.Pkg]] +deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] +uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" +version = "1.9.0" + +[[deps.PlotThemes]] +deps = ["PlotUtils", "Statistics"] +git-tree-sha1 = "1f03a2d339f42dca4a4da149c7e15e9b896ad899" +uuid = "ccf2f8ad-2431-5c83-bf29-c5338b663b6a" +version = "3.1.0" + +[[deps.PlotUtils]] +deps = ["ColorSchemes", "Colors", "Dates", "PrecompileTools", "Printf", "Random", "Reexport", "Statistics"] +git-tree-sha1 = "7b1a9df27f072ac4c9c7cbe5efb198489258d1f5" +uuid = "995b91a9-d308-5afd-9ec6-746e21dbc043" +version = "1.4.1" + +[[deps.Plots]] +deps = ["Base64", "Contour", "Dates", "Downloads", "FFMPEG", "FixedPointNumbers", "GR", "JLFzf", "JSON", "LaTeXStrings", "Latexify", "LinearAlgebra", "Measures", "NaNMath", "Pkg", "PlotThemes", "PlotUtils", "PrecompileTools", "Printf", "REPL", "Random", "RecipesBase", "RecipesPipeline", "Reexport", "RelocatableFolders", "Requires", "Scratch", "Showoff", "SparseArrays", "Statistics", "StatsBase", "UUIDs", "UnicodeFun", "UnitfulLatexify", "Unzip"] +git-tree-sha1 = "442e1e7ac27dd5ff8825c3fa62fbd1e86397974b" +uuid = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" +version = "1.40.4" + + [deps.Plots.extensions] + FileIOExt = "FileIO" + GeometryBasicsExt = "GeometryBasics" + IJuliaExt = "IJulia" + ImageInTerminalExt = "ImageInTerminal" + UnitfulExt = "Unitful" + + [deps.Plots.weakdeps] + FileIO = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" + GeometryBasics = "5c1252a2-5f33-56bf-86c9-59e7332b4326" + IJulia = "7073ff75-c697-5162-941a-fcdaad2a7d2a" + ImageInTerminal = "d8c32880-2388-543b-8c61-d9f865259254" + Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" + +[[deps.PoissonRandom]] +deps = ["Random"] +git-tree-sha1 = "a0f1159c33f846aa77c3f30ebbc69795e5327152" +uuid = "e409e4f3-bfea-5376-8464-e040bb5c01ab" +version = "0.4.4" + +[[deps.Polyester]] +deps = ["ArrayInterface", "BitTwiddlingConvenienceFunctions", "CPUSummary", "IfElse", "ManualMemory", "PolyesterWeave", "Requires", "Static", "StaticArrayInterface", "StrideArraysCore", "ThreadingUtilities"] +git-tree-sha1 = "2ba5f33cbb51a85ef58a850749492b08f9bf2193" +uuid = "f517fe37-dbe3-4b94-8317-1923a5111588" +version = "0.7.13" + +[[deps.PolyesterWeave]] +deps = ["BitTwiddlingConvenienceFunctions", "CPUSummary", "IfElse", "Static", "ThreadingUtilities"] +git-tree-sha1 = "240d7170f5ffdb285f9427b92333c3463bf65bf6" +uuid = "1d0040c9-8b98-4ee7-8388-3f51789ca0ad" +version = "0.2.1" + +[[deps.PositiveFactorizations]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "17275485f373e6673f7e7f97051f703ed5b15b20" +uuid = "85a6dd25-e78a-55b7-8502-1745935b8125" +version = "0.2.4" + +[[deps.PreallocationTools]] +deps = ["Adapt", "ArrayInterface", "ForwardDiff", "Requires"] +git-tree-sha1 = "01ac95fca7daabe77a9cb705862bd87016af9ddb" +uuid = "d236fae5-4411-538c-8e31-a6e3d9e00b46" +version = "0.4.13" + + [deps.PreallocationTools.extensions] + PreallocationToolsReverseDiffExt = "ReverseDiff" + + [deps.PreallocationTools.weakdeps] + ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + +[[deps.PrecompileTools]] +deps = ["Preferences"] +git-tree-sha1 = "5aa36f7049a63a1528fe8f7c3f2113413ffd4e1f" +uuid = "aea7be01-6a6a-4083-8856-8a6e6704d82a" +version = "1.2.1" + +[[deps.Preferences]] +deps = ["TOML"] +git-tree-sha1 = "9306f6085165d270f7e3db02af26a400d580f5c6" +uuid = "21216c6a-2e73-6563-6e65-726566657250" +version = "1.4.3" + +[[deps.PrettyTables]] +deps = ["Crayons", "LaTeXStrings", "Markdown", "PrecompileTools", "Printf", "Reexport", "StringManipulation", "Tables"] +git-tree-sha1 = "88b895d13d53b5577fd53379d913b9ab9ac82660" +uuid = "08abe8d2-0d0c-5749-adfa-8a2ac140af0d" +version = "2.3.1" + +[[deps.Primes]] +deps = ["IntegerMathUtils"] +git-tree-sha1 = "cb420f77dc474d23ee47ca8d14c90810cafe69e7" +uuid = "27ebfcd6-29c5-5fa9-bf4b-fb8fc14df3ae" +version = "0.5.6" + +[[deps.Printf]] +deps = ["Unicode"] +uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" + +[[deps.Qt6Base_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Fontconfig_jll", "Glib_jll", "JLLWrappers", "Libdl", "Libglvnd_jll", "OpenSSL_jll", "Vulkan_Loader_jll", "Xorg_libSM_jll", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Xorg_libxcb_jll", "Xorg_xcb_util_cursor_jll", "Xorg_xcb_util_image_jll", "Xorg_xcb_util_keysyms_jll", "Xorg_xcb_util_renderutil_jll", "Xorg_xcb_util_wm_jll", "Zlib_jll", "libinput_jll", "xkbcommon_jll"] +git-tree-sha1 = "37b7bb7aabf9a085e0044307e1717436117f2b3b" +uuid = "c0090381-4147-56d7-9ebc-da0b1113ec56" +version = "6.5.3+1" + +[[deps.QuadGK]] +deps = ["DataStructures", "LinearAlgebra"] +git-tree-sha1 = "9b23c31e76e333e6fb4c1595ae6afa74966a729e" +uuid = "1fd47b50-473d-5c70-9696-f719f8f3bcdc" +version = "2.9.4" + +[[deps.REPL]] +deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] +uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" + +[[deps.Random]] +deps = ["SHA", "Serialization"] +uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" + +[[deps.Random123]] +deps = ["Random", "RandomNumbers"] +git-tree-sha1 = "4743b43e5a9c4a2ede372de7061eed81795b12e7" +uuid = "74087812-796a-5b5d-8853-05524746bad3" +version = "1.7.0" + +[[deps.RandomExtensions]] +deps = ["Random", "SparseArrays"] +git-tree-sha1 = "b8a399e95663485820000f26b6a43c794e166a49" +uuid = "fb686558-2515-59ef-acaa-46db3789a887" +version = "0.4.4" + +[[deps.RandomNumbers]] +deps = ["Random", "Requires"] +git-tree-sha1 = "043da614cc7e95c703498a491e2c21f58a2b8111" +uuid = "e6cf234a-135c-5ec9-84dd-332b85af5143" +version = "1.5.3" + +[[deps.RecipesBase]] +deps = ["PrecompileTools"] +git-tree-sha1 = "5c3d09cc4f31f5fc6af001c250bf1278733100ff" +uuid = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" +version = "1.3.4" + +[[deps.RecipesPipeline]] +deps = ["Dates", "NaNMath", "PlotUtils", "PrecompileTools", "RecipesBase"] +git-tree-sha1 = "45cf9fd0ca5839d06ef333c8201714e888486342" +uuid = "01d81517-befc-4cb6-b9ec-a95719d0359c" +version = "0.6.12" + +[[deps.RecursiveArrayTools]] +deps = ["Adapt", "ArrayInterface", "DocStringExtensions", "GPUArraysCore", "IteratorInterfaceExtensions", "LinearAlgebra", "RecipesBase", "Requires", "SparseArrays", "StaticArraysCore", "Statistics", "SymbolicIndexingInterface", "Tables"] +git-tree-sha1 = "27ee1c03e732c488ecce1a25f0d7da9b5d936574" +uuid = "731186ca-8d62-57ce-b412-fbd966d074cd" +version = "3.3.3" + + [deps.RecursiveArrayTools.extensions] + RecursiveArrayToolsFastBroadcastExt = "FastBroadcast" + RecursiveArrayToolsMeasurementsExt = "Measurements" + RecursiveArrayToolsMonteCarloMeasurementsExt = "MonteCarloMeasurements" + RecursiveArrayToolsTrackerExt = "Tracker" + RecursiveArrayToolsZygoteExt = "Zygote" + + [deps.RecursiveArrayTools.weakdeps] + FastBroadcast = "7034ab61-46d4-4ed7-9d0f-46aef9175898" + Measurements = "eff96d63-e80a-5855-80a2-b1b0885c5ab7" + MonteCarloMeasurements = "0987c9cc-fe09-11e8-30f0-b96dd679fdca" + Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" + Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f" + +[[deps.RecursiveFactorization]] +deps = ["LinearAlgebra", "LoopVectorization", "Polyester", "PrecompileTools", "StrideArraysCore", "TriangularSolve"] +git-tree-sha1 = "c04dacfc546591d43c39dc529c922d6a06a5a694" +uuid = "f2c3362d-daeb-58d1-803e-2bc74f2840b4" +version = "0.2.22" + +[[deps.Reexport]] +git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" +uuid = "189a3867-3050-52da-a836-e630ba90ab69" +version = "1.2.2" + +[[deps.RelocatableFolders]] +deps = ["SHA", "Scratch"] +git-tree-sha1 = "ffdaf70d81cf6ff22c2b6e733c900c3321cab864" +uuid = "05181044-ff0b-4ac5-8273-598c1e38db00" +version = "1.0.1" + +[[deps.Requires]] +deps = ["UUIDs"] +git-tree-sha1 = "838a3a4188e2ded87a4f9f184b4b0d78a1e91cb7" +uuid = "ae029012-a4dd-5104-9daa-d747884805df" +version = "1.3.0" + +[[deps.ResettableStacks]] +deps = ["StaticArrays"] +git-tree-sha1 = "256eeeec186fa7f26f2801732774ccf277f05db9" +uuid = "ae5879a3-cd67-5da8-be7f-38c6eb64a37b" +version = "1.1.1" + +[[deps.Rmath]] +deps = ["Random", "Rmath_jll"] +git-tree-sha1 = "f65dcb5fa46aee0cf9ed6274ccbd597adc49aa7b" +uuid = "79098fc4-a85e-5d69-aa6a-4863f24498fa" +version = "0.7.1" + +[[deps.Rmath_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "6ed52fdd3382cf21947b15e8870ac0ddbff736da" +uuid = "f50d1b31-88e8-58de-be2c-1cc44531875f" +version = "0.4.0+0" + +[[deps.RuntimeGeneratedFunctions]] +deps = ["ExprTools", "SHA", "Serialization"] +git-tree-sha1 = "6aacc5eefe8415f47b3e34214c1d79d2674a0ba2" +uuid = "7e49a35a-f44a-4d26-94aa-eba1b4ca6b47" +version = "0.5.12" + +[[deps.SHA]] +uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" +version = "0.7.0" + +[[deps.SIMD]] +deps = ["PrecompileTools"] +git-tree-sha1 = "d8911cc125da009051fb35322415641d02d9e37f" +uuid = "fdea26ae-647d-5447-a871-4b548cad5224" +version = "3.4.6" + +[[deps.SIMDTypes]] +git-tree-sha1 = "330289636fb8107c5f32088d2741e9fd7a061a5c" +uuid = "94e857df-77ce-4151-89e5-788b33177be4" +version = "0.1.0" + +[[deps.SLEEFPirates]] +deps = ["IfElse", "Static", "VectorizationBase"] +git-tree-sha1 = "3aac6d68c5e57449f5b9b865c9ba50ac2970c4cf" +uuid = "476501e8-09a2-5ece-8869-fb82de89a1fa" +version = "0.6.42" + +[[deps.SciMLBase]] +deps = ["ADTypes", "ArrayInterface", "CommonSolve", "ConstructionBase", "Distributed", "DocStringExtensions", "EnumX", "FillArrays", "FunctionWrappersWrappers", "IteratorInterfaceExtensions", "LinearAlgebra", "Logging", "Markdown", "PrecompileTools", "Preferences", "Printf", "RecipesBase", "RecursiveArrayTools", "Reexport", "RuntimeGeneratedFunctions", "SciMLOperators", "StaticArraysCore", "Statistics", "SymbolicIndexingInterface", "Tables", "TruncatedStacktraces"] +git-tree-sha1 = "09324a0ae70c52a45b91b236c62065f78b099c37" +uuid = "0bca4576-84f4-4d90-8ffe-ffa030f20462" +version = "2.15.2" + + [deps.SciMLBase.extensions] + SciMLBaseChainRulesCoreExt = "ChainRulesCore" + SciMLBasePartialFunctionsExt = "PartialFunctions" + SciMLBasePyCallExt = "PyCall" + SciMLBasePythonCallExt = "PythonCall" + SciMLBaseRCallExt = "RCall" + SciMLBaseZygoteExt = "Zygote" + + [deps.SciMLBase.weakdeps] + ChainRules = "082447d4-558c-5d27-93f4-14fc19e9eca2" + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + PartialFunctions = "570af359-4316-4cb7-8c74-252c00c2016b" + PyCall = "438e738f-606a-5dbb-bf0a-cddfbfd45ab0" + PythonCall = "6099a3de-0909-46bc-b1f4-468b9a2dfc0d" + RCall = "6f49c342-dc21-5d91-9882-a32aef131414" + Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f" + +[[deps.SciMLOperators]] +deps = ["ArrayInterface", "DocStringExtensions", "Lazy", "LinearAlgebra", "Setfield", "SparseArrays", "StaticArraysCore", "Tricks"] +git-tree-sha1 = "51ae235ff058a64815e0a2c34b1db7578a06813d" +uuid = "c0aeaf25-5076-4817-a8d5-81caf7dfa961" +version = "0.3.7" + +[[deps.Scratch]] +deps = ["Dates"] +git-tree-sha1 = "3bac05bc7e74a75fd9cba4295cde4045d9fe2386" +uuid = "6c6a2e73-6563-6170-7368-637461726353" +version = "1.2.1" + +[[deps.Serialization]] +uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" + +[[deps.Setfield]] +deps = ["ConstructionBase", "Future", "MacroTools", "StaticArraysCore"] +git-tree-sha1 = "e2cc6d8c88613c05e1defb55170bf5ff211fbeac" +uuid = "efcf1570-3423-57d1-acb7-fd33fddbac46" +version = "1.1.1" + +[[deps.SharedArrays]] +deps = ["Distributed", "Mmap", "Random", "Serialization"] +uuid = "1a1011a3-84de-559e-8e89-a11a2f7dc383" + +[[deps.Showoff]] +deps = ["Dates", "Grisu"] +git-tree-sha1 = "91eddf657aca81df9ae6ceb20b959ae5653ad1de" +uuid = "992d4aef-0814-514b-bc4d-f2e9a6c4116f" +version = "1.0.3" + +[[deps.SimpleBufferStream]] +git-tree-sha1 = "874e8867b33a00e784c8a7e4b60afe9e037b74e1" +uuid = "777ac1f9-54b0-4bf8-805c-2214025038e7" +version = "1.1.0" + +[[deps.SimpleNonlinearSolve]] +deps = ["ADTypes", "ArrayInterface", "ConcreteStructs", "DiffEqBase", "FastClosures", "FiniteDiff", "ForwardDiff", "LinearAlgebra", "MaybeInplace", "PrecompileTools", "Reexport", "SciMLBase", "StaticArraysCore"] +git-tree-sha1 = "df8266e0d4960d61325db8c54fad3fa95712b57e" +uuid = "727e6d20-b764-4bd8-a329-72de5adea6c7" +version = "1.4.0" + + [deps.SimpleNonlinearSolve.extensions] + SimpleNonlinearSolveChainRulesCoreExt = "ChainRulesCore" + SimpleNonlinearSolvePolyesterForwardDiffExt = "PolyesterForwardDiff" + SimpleNonlinearSolveStaticArraysExt = "StaticArrays" + + [deps.SimpleNonlinearSolve.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + PolyesterForwardDiff = "98d1487c-24ca-40b6-b7ab-df2af84e126b" + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + +[[deps.SimpleTraits]] +deps = ["InteractiveUtils", "MacroTools"] +git-tree-sha1 = "5d7e3f4e11935503d3ecaf7186eac40602e7d231" +uuid = "699a6c99-e7fa-54fc-8d76-47d257e15c1d" +version = "0.9.4" + +[[deps.SimpleUnPack]] +git-tree-sha1 = "58e6353e72cde29b90a69527e56df1b5c3d8c437" +uuid = "ce78b400-467f-4804-87d8-8f486da07d0a" +version = "1.1.0" + +[[deps.Sockets]] +uuid = "6462fe0b-24de-5631-8697-dd941f90decc" + +[[deps.SortingAlgorithms]] +deps = ["DataStructures"] +git-tree-sha1 = "66e0a8e672a0bdfca2c3f5937efb8538b9ddc085" +uuid = "a2af1166-a08f-5f64-846c-94a0d3cef48c" +version = "1.2.1" + +[[deps.SparseArrays]] +deps = ["Libdl", "LinearAlgebra", "Random", "Serialization", "SuiteSparse_jll"] +uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + +[[deps.SparseDiffTools]] +deps = ["ADTypes", "Adapt", "ArrayInterface", "Compat", "DataStructures", "FiniteDiff", "ForwardDiff", "Graphs", "LinearAlgebra", "PackageExtensionCompat", "Random", "Reexport", "SciMLOperators", "Setfield", "SparseArrays", "StaticArrayInterface", "StaticArrays", "Tricks", "UnPack", "VertexSafeGraphs"] +git-tree-sha1 = "cce98ad7c896e52bb0eded174f02fc2a29c38477" +uuid = "47a9eef4-7e08-11e9-0b38-333d64bd3804" +version = "2.18.0" + + [deps.SparseDiffTools.extensions] + SparseDiffToolsEnzymeExt = "Enzyme" + SparseDiffToolsPolyesterExt = "Polyester" + SparseDiffToolsPolyesterForwardDiffExt = "PolyesterForwardDiff" + SparseDiffToolsSymbolicsExt = "Symbolics" + SparseDiffToolsZygoteExt = "Zygote" + + [deps.SparseDiffTools.weakdeps] + Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9" + Polyester = "f517fe37-dbe3-4b94-8317-1923a5111588" + PolyesterForwardDiff = "98d1487c-24ca-40b6-b7ab-df2af84e126b" + Symbolics = "0c5d862f-8b57-4792-8d23-62f2024744c7" + Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f" + +[[deps.Sparspak]] +deps = ["Libdl", "LinearAlgebra", "Logging", "OffsetArrays", "Printf", "SparseArrays", "Test"] +git-tree-sha1 = "342cf4b449c299d8d1ceaf00b7a49f4fbc7940e7" +uuid = "e56a9233-b9d6-4f03-8d0f-1825330902ac" +version = "0.3.9" + +[[deps.SpecialFunctions]] +deps = ["IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"] +git-tree-sha1 = "e2cfc4012a19088254b3950b85c3c1d8882d864d" +uuid = "276daf66-3868-5448-9aa4-cd146d93841b" +version = "2.3.1" +weakdeps = ["ChainRulesCore"] + + [deps.SpecialFunctions.extensions] + SpecialFunctionsChainRulesCoreExt = "ChainRulesCore" + +[[deps.Static]] +deps = ["IfElse"] +git-tree-sha1 = "b366eb1eb68075745777d80861c6706c33f588ae" +uuid = "aedffcd0-7271-4cad-89d0-dc628f76c6d3" +version = "0.8.9" + +[[deps.StaticArrayInterface]] +deps = ["ArrayInterface", "Compat", "IfElse", "LinearAlgebra", "PrecompileTools", "Requires", "SparseArrays", "Static", "SuiteSparse"] +git-tree-sha1 = "5d66818a39bb04bf328e92bc933ec5b4ee88e436" +uuid = "0d7ed370-da01-4f52-bd93-41d350b8b718" +version = "1.5.0" +weakdeps = ["OffsetArrays", "StaticArrays"] + + [deps.StaticArrayInterface.extensions] + StaticArrayInterfaceOffsetArraysExt = "OffsetArrays" + StaticArrayInterfaceStaticArraysExt = "StaticArrays" + +[[deps.StaticArrays]] +deps = ["LinearAlgebra", "PrecompileTools", "Random", "StaticArraysCore"] +git-tree-sha1 = "bf074c045d3d5ffd956fa0a461da38a44685d6b2" +uuid = "90137ffa-7385-5640-81b9-e52037218182" +version = "1.9.3" +weakdeps = ["ChainRulesCore", "Statistics"] + + [deps.StaticArrays.extensions] + StaticArraysChainRulesCoreExt = "ChainRulesCore" + StaticArraysStatisticsExt = "Statistics" + +[[deps.StaticArraysCore]] +git-tree-sha1 = "36b3d696ce6366023a0ea192b4cd442268995a0d" +uuid = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" +version = "1.4.2" + +[[deps.Statistics]] +deps = ["LinearAlgebra", "SparseArrays"] +uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" +version = "1.9.0" + +[[deps.StatsAPI]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "1ff449ad350c9c4cbc756624d6f8a8c3ef56d3ed" +uuid = "82ae8749-77ed-4fe6-ae5f-f523153014b0" +version = "1.7.0" + +[[deps.StatsBase]] +deps = ["DataAPI", "DataStructures", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"] +git-tree-sha1 = "5cf7606d6cef84b543b483848d4ae08ad9832b21" +uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" +version = "0.34.3" + +[[deps.StatsFuns]] +deps = ["HypergeometricFunctions", "IrrationalConstants", "LogExpFunctions", "Reexport", "Rmath", "SpecialFunctions"] +git-tree-sha1 = "cef0472124fab0695b58ca35a77c6fb942fdab8a" +uuid = "4c63d2b9-4356-54db-8cca-17b64c39e42c" +version = "1.3.1" + + [deps.StatsFuns.extensions] + StatsFunsChainRulesCoreExt = "ChainRulesCore" + StatsFunsInverseFunctionsExt = "InverseFunctions" + + [deps.StatsFuns.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + InverseFunctions = "3587e190-3f89-42d0-90ee-14403ec27112" + +[[deps.SteadyStateDiffEq]] +deps = ["ConcreteStructs", "DiffEqBase", "DiffEqCallbacks", "LinearAlgebra", "Reexport", "SciMLBase"] +git-tree-sha1 = "a735fd5053724cf4de31c81b4e2cc429db844be5" +uuid = "9672c7b4-1e72-59bd-8a11-6ac3964bc41f" +version = "2.0.1" + +[[deps.StochasticDiffEq]] +deps = ["Adapt", "ArrayInterface", "DataStructures", "DiffEqBase", "DiffEqNoiseProcess", "DocStringExtensions", "FiniteDiff", "ForwardDiff", "JumpProcesses", "LevyArea", "LinearAlgebra", "Logging", "MuladdMacro", "NLsolve", "OrdinaryDiffEq", "Random", "RandomNumbers", "RecursiveArrayTools", "Reexport", "SciMLBase", "SciMLOperators", "SparseArrays", "SparseDiffTools", "StaticArrays", "UnPack"] +git-tree-sha1 = "97e5d0b7e5ec2e68eec6626af97c59e9f6b6c3d0" +uuid = "789caeaf-c7a9-5a7d-9973-96adeb23e2a0" +version = "6.65.1" + +[[deps.StrideArraysCore]] +deps = ["ArrayInterface", "CloseOpenIntervals", "IfElse", "LayoutPointers", "LinearAlgebra", "ManualMemory", "SIMDTypes", "Static", "StaticArrayInterface", "ThreadingUtilities"] +git-tree-sha1 = "b518da45c50dfab8384125ba829f1739bda41034" +uuid = "7792a7ef-975c-4747-a70f-980b88e8d1da" +version = "0.5.5" + +[[deps.StringManipulation]] +deps = ["PrecompileTools"] +git-tree-sha1 = "a04cabe79c5f01f4d723cc6704070ada0b9d46d5" +uuid = "892a3eda-7b42-436c-8928-eab12a02cf0e" +version = "0.3.4" + +[[deps.SuiteSparse]] +deps = ["Libdl", "LinearAlgebra", "Serialization", "SparseArrays"] +uuid = "4607b0f0-06f3-5cda-b6b1-a6196a1729e9" + +[[deps.SuiteSparse_jll]] +deps = ["Artifacts", "Libdl", "Pkg", "libblastrampoline_jll"] +uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c" +version = "5.10.1+6" + +[[deps.Sundials]] +deps = ["CEnum", "DataStructures", "DiffEqBase", "Libdl", "LinearAlgebra", "Logging", "PrecompileTools", "Reexport", "SciMLBase", "SparseArrays", "Sundials_jll"] +git-tree-sha1 = "e15f5a73f0d14b9079b807a9d1dac13e4302e997" +uuid = "c3572dad-4567-51f8-b174-8c6c989267f4" +version = "4.24.0" + +[[deps.Sundials_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "OpenBLAS_jll", "Pkg", "SuiteSparse_jll"] +git-tree-sha1 = "04777432d74ec5bc91ca047c9e0e0fd7f81acdb6" +uuid = "fb77eaff-e24c-56d4-86b1-d163f2edb164" +version = "5.2.1+0" + +[[deps.SymbolicIndexingInterface]] +git-tree-sha1 = "be414bfd80c2c91197823890c66ef4b74f5bf5fe" +uuid = "2efcf032-c050-4f8e-a9bb-153293bab1f5" +version = "0.3.1" + +[[deps.SymbolicUtils]] +deps = ["AbstractTrees", "Bijections", "ChainRulesCore", "Combinatorics", "ConstructionBase", "DataStructures", "DocStringExtensions", "DynamicPolynomials", "IfElse", "LabelledArrays", "LinearAlgebra", "MultivariatePolynomials", "NaNMath", "Setfield", "SparseArrays", "SpecialFunctions", "StaticArrays", "SymbolicIndexingInterface", "TimerOutputs", "Unityper"] +git-tree-sha1 = "669e43e90df46fcee4aa859b587da7a7948272ac" +uuid = "d1185830-fcd6-423d-90d6-eec64667417b" +version = "1.5.1" + +[[deps.Symbolics]] +deps = ["ArrayInterface", "Bijections", "ConstructionBase", "DataStructures", "DiffRules", "Distributions", "DocStringExtensions", "DomainSets", "DynamicPolynomials", "Groebner", "IfElse", "LaTeXStrings", "LambertW", "Latexify", "Libdl", "LinearAlgebra", "LogExpFunctions", "MacroTools", "Markdown", "NaNMath", "PrecompileTools", "RecipesBase", "Reexport", "Requires", "RuntimeGeneratedFunctions", "SciMLBase", "Setfield", "SparseArrays", "SpecialFunctions", "StaticArrays", "SymbolicIndexingInterface", "SymbolicUtils"] +git-tree-sha1 = "8d28ebc206dec9e250e21b9502a2662265897650" +uuid = "0c5d862f-8b57-4792-8d23-62f2024744c7" +version = "5.14.1" + + [deps.Symbolics.extensions] + SymbolicsSymPyExt = "SymPy" + + [deps.Symbolics.weakdeps] + SymPy = "24249f21-da20-56a4-8eb1-6a02cf4ae2e6" + +[[deps.TOML]] +deps = ["Dates"] +uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" +version = "1.0.3" + +[[deps.TableTraits]] +deps = ["IteratorInterfaceExtensions"] +git-tree-sha1 = "c06b2f539df1c6efa794486abfb6ed2022561a39" +uuid = "3783bdb8-4a98-5b6b-af9a-565f29a5fe9c" +version = "1.0.1" + +[[deps.Tables]] +deps = ["DataAPI", "DataValueInterfaces", "IteratorInterfaceExtensions", "LinearAlgebra", "OrderedCollections", "TableTraits"] +git-tree-sha1 = "cb76cf677714c095e535e3501ac7954732aeea2d" +uuid = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" +version = "1.11.1" + +[[deps.Tar]] +deps = ["ArgTools", "SHA"] +uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" +version = "1.10.0" + +[[deps.TensorCore]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "1feb45f88d133a655e001435632f019a9a1bcdb6" +uuid = "62fd8b95-f654-4bbd-a8a5-9c27f68ccd50" +version = "0.1.1" + +[[deps.Test]] +deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] +uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[[deps.ThreadingUtilities]] +deps = ["ManualMemory"] +git-tree-sha1 = "eda08f7e9818eb53661b3deb74e3159460dfbc27" +uuid = "8290d209-cae3-49c0-8002-c8c24d57dab5" +version = "0.5.2" + +[[deps.TimerOutputs]] +deps = ["ExprTools", "Printf"] +git-tree-sha1 = "f548a9e9c490030e545f72074a41edfd0e5bcdd7" +uuid = "a759f4b9-e2f1-59dc-863e-4aeb61b1ea8f" +version = "0.5.23" + +[[deps.Tokenize]] +git-tree-sha1 = "5b5a892ba7704c0977013bd0f9c30f5d962181e0" +uuid = "0796e94c-ce3b-5d07-9a54-7f471281c624" +version = "0.5.28" + +[[deps.TranscodingStreams]] +git-tree-sha1 = "71509f04d045ec714c4748c785a59045c3736349" +uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa" +version = "0.10.7" +weakdeps = ["Random", "Test"] + + [deps.TranscodingStreams.extensions] + TestExt = ["Test", "Random"] + +[[deps.TriangularSolve]] +deps = ["CloseOpenIntervals", "IfElse", "LayoutPointers", "LinearAlgebra", "LoopVectorization", "Polyester", "Static", "VectorizationBase"] +git-tree-sha1 = "fadebab77bf3ae041f77346dd1c290173da5a443" +uuid = "d5829a12-d9aa-46ab-831f-fb7c9ab06edf" +version = "0.1.20" + +[[deps.Tricks]] +git-tree-sha1 = "eae1bb484cd63b36999ee58be2de6c178105112f" +uuid = "410a4b4d-49e4-4fbc-ab6d-cb71b17b3775" +version = "0.1.8" + +[[deps.TruncatedStacktraces]] +deps = ["InteractiveUtils", "MacroTools", "Preferences"] +git-tree-sha1 = "ea3e54c2bdde39062abf5a9758a23735558705e1" +uuid = "781d530d-4396-4725-bb49-402e4bee1e77" +version = "1.4.0" + +[[deps.URIs]] +git-tree-sha1 = "67db6cc7b3821e19ebe75791a9dd19c9b1188f2b" +uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" +version = "1.5.1" + +[[deps.UUIDs]] +deps = ["Random", "SHA"] +uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" + +[[deps.UnPack]] +git-tree-sha1 = "387c1f73762231e86e0c9c5443ce3b4a0a9a0c2b" +uuid = "3a884ed6-31ef-47d7-9d2a-63182c4928ed" +version = "1.0.2" + +[[deps.Unicode]] +uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" + +[[deps.UnicodeFun]] +deps = ["REPL"] +git-tree-sha1 = "53915e50200959667e78a92a418594b428dffddf" +uuid = "1cfade01-22cf-5700-b092-accc4b62d6e1" +version = "0.4.1" + +[[deps.Unitful]] +deps = ["Dates", "LinearAlgebra", "Random"] +git-tree-sha1 = "3c793be6df9dd77a0cf49d80984ef9ff996948fa" +uuid = "1986cc42-f94f-5a68-af5c-568840ba703d" +version = "1.19.0" + + [deps.Unitful.extensions] + ConstructionBaseUnitfulExt = "ConstructionBase" + InverseFunctionsUnitfulExt = "InverseFunctions" + + [deps.Unitful.weakdeps] + ConstructionBase = "187b0558-2788-49d3-abe0-74a17ed4e7c9" + InverseFunctions = "3587e190-3f89-42d0-90ee-14403ec27112" + +[[deps.UnitfulLatexify]] +deps = ["LaTeXStrings", "Latexify", "Unitful"] +git-tree-sha1 = "e2d817cc500e960fdbafcf988ac8436ba3208bfd" +uuid = "45397f5d-5981-4c77-b2b3-fc36d6e9b728" +version = "1.6.3" + +[[deps.Unityper]] +deps = ["ConstructionBase"] +git-tree-sha1 = "25008b734a03736c41e2a7dc314ecb95bd6bbdb0" +uuid = "a7c27f48-0311-42f6-a7f8-2c11e75eb415" +version = "0.1.6" + +[[deps.Unzip]] +git-tree-sha1 = "ca0969166a028236229f63514992fc073799bb78" +uuid = "41fe7b60-77ed-43a1-b4f0-825fd5a5650d" +version = "0.2.0" + +[[deps.VectorizationBase]] +deps = ["ArrayInterface", "CPUSummary", "HostCPUFeatures", "IfElse", "LayoutPointers", "Libdl", "LinearAlgebra", "SIMDTypes", "Static", "StaticArrayInterface"] +git-tree-sha1 = "ac377f0a248753a1b1d58bbc92a64f5a726dfb71" +uuid = "3d5dd08c-fd9d-11e8-17fa-ed2836048c2f" +version = "0.21.66" + +[[deps.VertexSafeGraphs]] +deps = ["Graphs"] +git-tree-sha1 = "8351f8d73d7e880bfc042a8b6922684ebeafb35c" +uuid = "19fa3120-7c27-5ec5-8db8-b0b0aa330d6f" +version = "0.2.0" + +[[deps.Vulkan_Loader_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Wayland_jll", "Xorg_libX11_jll", "Xorg_libXrandr_jll", "xkbcommon_jll"] +git-tree-sha1 = "2f0486047a07670caad3a81a075d2e518acc5c59" +uuid = "a44049a8-05dd-5a78-86c9-5fde0876e88c" +version = "1.3.243+0" + +[[deps.Wayland_jll]] +deps = ["Artifacts", "EpollShim_jll", "Expat_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Pkg", "XML2_jll"] +git-tree-sha1 = "7558e29847e99bc3f04d6569e82d0f5c54460703" +uuid = "a2964d1f-97da-50d4-b82a-358c7fce9d89" +version = "1.21.0+1" + +[[deps.Wayland_protocols_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "93f43ab61b16ddfb2fd3bb13b3ce241cafb0e6c9" +uuid = "2381bf8a-dfd0-557d-9999-79630e7b1b91" +version = "1.31.0+0" + +[[deps.XML2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Zlib_jll"] +git-tree-sha1 = "532e22cf7be8462035d092ff21fada7527e2c488" +uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a" +version = "2.12.6+0" + +[[deps.XSLT_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgcrypt_jll", "Libgpg_error_jll", "Libiconv_jll", "Pkg", "XML2_jll", "Zlib_jll"] +git-tree-sha1 = "91844873c4085240b95e795f692c4cec4d805f8a" +uuid = "aed1982a-8fda-507f-9586-7b0439959a61" +version = "1.1.34+0" + +[[deps.XZ_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "ac88fb95ae6447c8dda6a5503f3bafd496ae8632" +uuid = "ffd25f8a-64ca-5728-b0f7-c24cf3aae800" +version = "5.4.6+0" + +[[deps.Xorg_libICE_jll]] +deps = ["Libdl", "Pkg"] +git-tree-sha1 = "e5becd4411063bdcac16be8b66fc2f9f6f1e8fe5" +uuid = "f67eecfb-183a-506d-b269-f58e52b52d7c" +version = "1.0.10+1" + +[[deps.Xorg_libSM_jll]] +deps = ["Libdl", "Pkg", "Xorg_libICE_jll"] +git-tree-sha1 = "4a9d9e4c180e1e8119b5ffc224a7b59d3a7f7e18" +uuid = "c834827a-8449-5923-a945-d239c165b7dd" +version = "1.2.3+0" + +[[deps.Xorg_libX11_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxcb_jll", "Xorg_xtrans_jll"] +git-tree-sha1 = "afead5aba5aa507ad5a3bf01f58f82c8d1403495" +uuid = "4f6342f7-b3d2-589e-9d20-edeb45f2b2bc" +version = "1.8.6+0" + +[[deps.Xorg_libXau_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "6035850dcc70518ca32f012e46015b9beeda49d8" +uuid = "0c0b7dd1-d40b-584c-a123-a41640f87eec" +version = "1.0.11+0" + +[[deps.Xorg_libXcursor_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXfixes_jll", "Xorg_libXrender_jll"] +git-tree-sha1 = "12e0eb3bc634fa2080c1c37fccf56f7c22989afd" +uuid = "935fb764-8cf2-53bf-bb30-45bb1f8bf724" +version = "1.2.0+4" + +[[deps.Xorg_libXdmcp_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "34d526d318358a859d7de23da945578e8e8727b7" +uuid = "a3789734-cfe1-5b06-b2d0-1dd0d9d62d05" +version = "1.1.4+0" + +[[deps.Xorg_libXext_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll"] +git-tree-sha1 = "b7c0aa8c376b31e4852b360222848637f481f8c3" +uuid = "1082639a-0dae-5f34-9b06-72781eeb8cb3" +version = "1.3.4+4" + +[[deps.Xorg_libXfixes_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll"] +git-tree-sha1 = "0e0dc7431e7a0587559f9294aeec269471c991a4" +uuid = "d091e8ba-531a-589c-9de9-94069b037ed8" +version = "5.0.3+4" + +[[deps.Xorg_libXi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXext_jll", "Xorg_libXfixes_jll"] +git-tree-sha1 = "89b52bc2160aadc84d707093930ef0bffa641246" +uuid = "a51aa0fd-4e3c-5386-b890-e753decda492" +version = "1.7.10+4" + +[[deps.Xorg_libXinerama_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXext_jll"] +git-tree-sha1 = "26be8b1c342929259317d8b9f7b53bf2bb73b123" +uuid = "d1454406-59df-5ea1-beac-c340f2130bc3" +version = "1.1.4+4" + +[[deps.Xorg_libXrandr_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXext_jll", "Xorg_libXrender_jll"] +git-tree-sha1 = "34cea83cb726fb58f325887bf0612c6b3fb17631" +uuid = "ec84b674-ba8e-5d96-8ba1-2a689ba10484" +version = "1.5.2+4" + +[[deps.Xorg_libXrender_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll"] +git-tree-sha1 = "19560f30fd49f4d4efbe7002a1037f8c43d43b96" +uuid = "ea2f1a96-1ddc-540d-b46f-429655e07cfa" +version = "0.9.10+4" + +[[deps.Xorg_libpthread_stubs_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "8fdda4c692503d44d04a0603d9ac0982054635f9" +uuid = "14d82f49-176c-5ed1-bb49-ad3f5cbd8c74" +version = "0.1.1+0" + +[[deps.Xorg_libxcb_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "XSLT_jll", "Xorg_libXau_jll", "Xorg_libXdmcp_jll", "Xorg_libpthread_stubs_jll"] +git-tree-sha1 = "b4bfde5d5b652e22b9c790ad00af08b6d042b97d" +uuid = "c7cfdc94-dc32-55de-ac96-5a1b8d977c5b" +version = "1.15.0+0" + +[[deps.Xorg_libxkbfile_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] +git-tree-sha1 = "730eeca102434283c50ccf7d1ecdadf521a765a4" +uuid = "cc61e674-0454-545c-8b26-ed2c68acab7a" +version = "1.1.2+0" + +[[deps.Xorg_xcb_util_cursor_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_xcb_util_image_jll", "Xorg_xcb_util_jll", "Xorg_xcb_util_renderutil_jll"] +git-tree-sha1 = "04341cb870f29dcd5e39055f895c39d016e18ccd" +uuid = "e920d4aa-a673-5f3a-b3d7-f755a4d47c43" +version = "0.1.4+0" + +[[deps.Xorg_xcb_util_image_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] +git-tree-sha1 = "0fab0a40349ba1cba2c1da699243396ff8e94b97" +uuid = "12413925-8142-5f55-bb0e-6d7ca50bb09b" +version = "0.4.0+1" + +[[deps.Xorg_xcb_util_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libxcb_jll"] +git-tree-sha1 = "e7fd7b2881fa2eaa72717420894d3938177862d1" +uuid = "2def613f-5ad1-5310-b15b-b15d46f528f5" +version = "0.4.0+1" + +[[deps.Xorg_xcb_util_keysyms_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] +git-tree-sha1 = "d1151e2c45a544f32441a567d1690e701ec89b00" +uuid = "975044d2-76e6-5fbe-bf08-97ce7c6574c7" +version = "0.4.0+1" + +[[deps.Xorg_xcb_util_renderutil_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] +git-tree-sha1 = "dfd7a8f38d4613b6a575253b3174dd991ca6183e" +uuid = "0d47668e-0667-5a69-a72c-f761630bfb7e" +version = "0.3.9+1" + +[[deps.Xorg_xcb_util_wm_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] +git-tree-sha1 = "e78d10aab01a4a154142c5006ed44fd9e8e31b67" +uuid = "c22f9ab0-d5fe-5066-847c-f4bb1cd4e361" +version = "0.4.1+1" + +[[deps.Xorg_xkbcomp_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxkbfile_jll"] +git-tree-sha1 = "330f955bc41bb8f5270a369c473fc4a5a4e4d3cb" +uuid = "35661453-b289-5fab-8a00-3d9160c6a3a4" +version = "1.4.6+0" + +[[deps.Xorg_xkeyboard_config_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_xkbcomp_jll"] +git-tree-sha1 = "691634e5453ad362044e2ad653e79f3ee3bb98c3" +uuid = "33bec58e-1273-512f-9401-5d533626f822" +version = "2.39.0+0" + +[[deps.Xorg_xtrans_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "e92a1a012a10506618f10b7047e478403a046c77" +uuid = "c5fb5394-a638-5e4d-96e5-b29de1b5cf10" +version = "1.5.0+0" + +[[deps.Zlib_jll]] +deps = ["Libdl"] +uuid = "83775a58-1f1d-513f-b197-d71354ab007a" +version = "1.2.13+0" + +[[deps.Zstd_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "e678132f07ddb5bfa46857f0d7620fb9be675d3b" +uuid = "3161d3a3-bdf6-5164-811a-617609db77b4" +version = "1.5.6+0" + +[[deps.eudev_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "gperf_jll"] +git-tree-sha1 = "431b678a28ebb559d224c0b6b6d01afce87c51ba" +uuid = "35ca27e7-8b34-5b7f-bca9-bdc33f59eb06" +version = "3.2.9+0" + +[[deps.fzf_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "a68c9655fbe6dfcab3d972808f1aafec151ce3f8" +uuid = "214eeab7-80f7-51ab-84ad-2988db7cef09" +version = "0.43.0+0" + +[[deps.gperf_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "3516a5630f741c9eecb3720b1ec9d8edc3ecc033" +uuid = "1a1c6b14-54f6-533d-8383-74cd7377aa70" +version = "3.1.1+0" + +[[deps.libaom_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "3a2ea60308f0996d26f1e5354e10c24e9ef905d4" +uuid = "a4ae2306-e953-59d6-aa16-d00cac43593b" +version = "3.4.0+0" + +[[deps.libass_jll]] +deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] +git-tree-sha1 = "5982a94fcba20f02f42ace44b9894ee2b140fe47" +uuid = "0ac62f75-1d6f-5e53-bd7c-93b484bb37c0" +version = "0.15.1+0" + +[[deps.libblastrampoline_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" +version = "5.7.0+0" + +[[deps.libevdev_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "141fe65dc3efabb0b1d5ba74e91f6ad26f84cc22" +uuid = "2db6ffa8-e38f-5e21-84af-90c45d0032cc" +version = "1.11.0+0" + +[[deps.libfdk_aac_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "daacc84a041563f965be61859a36e17c4e4fcd55" +uuid = "f638f0a6-7fb0-5443-88ba-1cc74229b280" +version = "2.0.2+0" + +[[deps.libinput_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "eudev_jll", "libevdev_jll", "mtdev_jll"] +git-tree-sha1 = "ad50e5b90f222cfe78aa3d5183a20a12de1322ce" +uuid = "36db933b-70db-51c0-b978-0f229ee0e533" +version = "1.18.0+0" + +[[deps.libpng_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Zlib_jll"] +git-tree-sha1 = "d7015d2e18a5fd9a4f47de711837e980519781a4" +uuid = "b53b4c65-9356-5827-b1ea-8c7a1a84506f" +version = "1.6.43+1" + +[[deps.libvorbis_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Ogg_jll", "Pkg"] +git-tree-sha1 = "b910cb81ef3fe6e78bf6acee440bda86fd6ae00c" +uuid = "f27f6e37-5d2b-51aa-960f-b287f2bc3b7a" +version = "1.3.7+1" + +[[deps.mtdev_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "814e154bdb7be91d78b6802843f76b6ece642f11" +uuid = "009596ad-96f7-51b1-9f1b-5ce2d5e8a71e" +version = "1.1.6+0" + +[[deps.nghttp2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" +version = "1.48.0+0" + +[[deps.p7zip_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" +version = "17.4.0+0" + +[[deps.x264_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "4fea590b89e6ec504593146bf8b988b2c00922b2" +uuid = "1270edf5-f2f9-52d2-97e9-ab00b5d0237a" +version = "2021.5.5+0" + +[[deps.x265_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "ee567a171cce03570d77ad3a43e90218e38937a9" +uuid = "dfaa095f-4041-5dcd-9319-2fabd8486b76" +version = "3.5.0+0" + +[[deps.xkbcommon_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Wayland_jll", "Wayland_protocols_jll", "Xorg_libxcb_jll", "Xorg_xkeyboard_config_jll"] +git-tree-sha1 = "9c304562909ab2bab0262639bd4f444d7bc2be37" +uuid = "d8fb68d0-12a3-5cfd-a85a-d49703b185fd" +version = "1.4.1+1" +""" + +# ╔═║ Cell order: +# β•Ÿβ”€785a59ba-c716-11ec-3225-e5ec94a651a2 +# β•Ÿβ”€e85060ec-e334-4b2d-844f-8e748b532b34 +# β•Ÿβ”€b298c1d2-8ecf-459b-b238-64714923086d +# ╠═268f2426-e2e4-45b5-9d34-279dc5de5182 +# ╠═c07f3dd4-8983-4bc9-b864-8df9c664e740 +# β•Ÿβ”€579ced03-c8eb-4fb1-80ac-66c3fba92b7f +# β•Ÿβ”€37d0eb59-1fb7-4832-8aba-dbf4d95aef4e +# ╠═7e627856-f165-4f29-b500-ea08c8c1330e +# β•Ÿβ”€ce939f44-8fe0-4080-b4c2-8208fc8cd7b9 +# ╠═954505b3-77b0-482a-8ad0-71af7288f114 +# β•Ÿβ”€a84b89dc-18a5-4afe-aae1-1bbe7973dba2 +# ╠═d54b27c0-2292-4e13-a427-ace53856c119 +# β•Ÿβ”€08985029-5100-4571-96d4-2d8fba4c7a68 +# ╠═e6b01aa7-0aa0-42b8-aac4-e95cf167a5e9 +# β•Ÿβ”€6f57980d-2cc1-4115-9b9b-eb7c49a8590e +# ╠═2edeadc7-b5ba-4737-8ab9-95036ad5cd1a +# β•Ÿβ”€3d183855-d846-4e5b-bfd4-810364418f34 +# ╠═b2f0dff9-0cb8-4ef3-9642-8ad1645dc61b +# ╠═de6c1273-682e-461f-b182-103ad1878580 +# β•Ÿβ”€09195d0d-687c-4738-bb20-518b3d4aa8f4 +# ╠═2b7fe775-db50-4e83-aa79-334a771d4f0f +# β•Ÿβ”€f29fc313-355b-43ac-abca-90445844bf4b +# ╠═dfc5132b-e082-47c5-9a36-fbfaaae396c8 +# ╠═36ee98f4-2476-470d-bb69-0f9d1d333a30 +# β•Ÿβ”€afd38f19-41ee-4c52-aaef-c8239250c92f +# ╠═0066669f-4541-4d32-b13b-fcc98c637de8 +# ╠═e78790ab-31f3-46bf-8d62-96fb5b9d0ac6 +# β•Ÿβ”€9453473b-4b1a-493b-93b8-f71cf33a78d5 +# ╠═1c9e5668-8a96-487e-a001-7b041b044205 +# β•Ÿβ”€bf4c7a1c-ac8a-4bab-a2ae-5e4ccb05967a +# ╠═cdf1ee0c-b250-45ef-a910-c3aa1aac9d4b +# ╠═1afbf3a1-56b3-46bd-b192-d3bbcfb11c6c +# ╠═647a62bf-acb6-4008-84c3-0c220b1ef3e1 +# ╠═e13257e4-741b-4b44-be42-dfb1a618db5b +# ╠═f167eb5a-8eb7-4da2-8cca-044c3318539e +# ╠═d8170974-0e42-49d4-b79e-e0647b9617c0 +# β•Ÿβ”€88de08b6-ac27-4d39-9266-9769eb2d1002 +# ╠═d5276187-42c4-4e9e-a274-c298964ca53b +# ╠═d3c0b55d-9d6a-4c1b-84f5-cfc5d1f51d25 +# β•Ÿβ”€90fe88dc-b8c7-4e36-9fc3-3e5e8d21a511 +# ╠═7c9b299f-2b94-4cc9-b05d-611678c311a7 +# β•Ÿβ”€dca7ab9c-0ed8-4352-bab1-64ac891d55ff +# ╠═53eddad6-e5c3-41fe-8cc7-ab2e7fa33c59 +# β•Ÿβ”€00000000-0000-0000-0000-000000000001 +# β•Ÿβ”€00000000-0000-0000-0000-000000000002 diff --git a/project/project_assignment.pdf b/project/project_assignment.pdf deleted file mode 100644 index ececeb052d89c71e8c47a5fb388206f573672f14..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 151644 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/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ǥJfG8_9-HY`eSsMJlGP$xtwt-3OgY_Kaj6{-?{V$Gm2JXatW+(gh8#Bps_(yINAW^oOr)YW_V+qC?5 z$Pm8-c?0}0|BMLn8*2Wa6(Im;TFAe1KLxRhUB41vEp?YGBX9?>7GABkzXS(fIkw(l z?fBmj90){5-sr{T`UTlH3@$*dW5s|yOSzAXuN5RPd=~eTVx+c1U$rS(_JIUvfC#Ez zgwP8z9wt8PV{tr^Xvav^sLn>)60n?VsGr;a>Fvv-sqnhLzanIoA#)^zaIZTfQ-oy5 zJZC0^kc7xwnL}jGJkL|+At7UA%5;U$WXe!d@3}q0@9W;@S?jmn^{&?+cUk+Mai4wm z+2`E7Kl>r&+z|hL3=IVNWkE~+o zrEbDpgar9Btmm_HQPjI;I!q6m`R_h%ZvQa%gQi~IZ0ejOoB58rQ=IcEo!@PR$C(PI zLEX}G9ute&(d1R;O|SSDx@{7Z+FtITrlV2ZID0Fi9)0pw41)TCP_9FPdcG0&wEz57 zkCqoV)%)s!uGr1Bo*cWj(wBZ`U?4R)eoHmvX9KVAFU?IJ?R#@X2Q|0$2^sbGGwlC^ zvOxa*x&dw({};OA&&q>tDYJfuii(k^8UHy-34}5z5?26+) zJ%8>o|J?TfxSN9FLkkYVT5pb*U%kY}BaC)CgvcA=O6t?|(+#8hyXUL7zax zaf6ChNmf*PI2I=KK9q&D)z~T*gRE!YRoh*M3ytmpH5SF`P}B`1_6aAJt4PV*Worh)G9q3wLg^ zwh4`w?jP;k@}aX{;pyGb5?1W{zPY;*yt}md9m7PSci+(o5m+LDbkZngpZI7T!?wJ^ z{%$g5<=m)8Nyv}hkx$-l9G)*2ErsrCT=uIngFbF@{-Mmi?ZVSr*TmNCz49Wl{62@= zkXhiDv@r+I2<_hwOsI5~ew2FV?!FFM2piUrKT5FUZU0XGne{Pu0a*)|bmgJPDZj_P zRuCa8NBt7g;#4au^<|f`_-m@Yoq}GaQ#d75p54ElPR>%k*pT-YY&f&bX(#!yw=`-dvs=|7MQxebs)A$b`AS$?wCs9UuM+l1 za9Jo^{sdA%rvkv*Z zCP^FdRW?nJqaT-lNRul2l5{**zKPG4mJ7O!1*JxMCzeOXf;LWQGfO8N+~8z-kSU8S=`aB zwQeUrl33A@q;SYc*P+gF-oS3hEu6`>t!T3l=+Rf_Qqt;~+!shxPrJI3CV71e-S`PT z)%3B!eItGKmqxHyw0PPP^#FGkLuMOK~=L zwl@zJFRh;CDo>TE4le1mjLF%);f|K(7saTXwgzk3%{?lSZ}(XsF4nh-i}Og3_=^7P z8G?oJb4H-O2(nLBgGIVcDOF199{L<-x;6iJ7ReD;LPeIFL2Ae)<<;UC+imThGcVKp zLz%8~)U`U>_h72r4T6~+`k5VgDM#98G;dyFPLZM+Qd@cPbL;Zkp(V=r26qRCC(?d5 zg#3R>JFLcEkT0e7-(!4ARy>nT_N-w*@G~9jiqRvYAdaYVa zMceqDda>a`LbL30lCnRL&)S;)b8aF>m{xYtWuH7xnv*_xd)MS-6e;R1K{?piye0UC zsO$#j+Zv)HZHK2`ukS0&47c4~T4)JPZE=8?azQ-3LRVmI=<@v@;d#$Y@au-W=Xge9 zJ5-@IT0-}mUPEiC!cZ&wZ3*mW1wC}#?4m)48R_J}^x;|mzK{r+U!zN6izxzm{CnzZ z*9z5_OKGOQPwecyNnroAdDW-8>FK1xs`gr1ullmnvKE>rZ!x9CkJ($==S&r;VR%Ve zD`is~sBde)#xl zJVj^5v$@#1?Q4<Ek%BRL+v)M8sx{`p=W|&7NP#Y1b!q zKY>#9E>n=s%Z={7zQJMNN*+C;=Nj!BOaWiy*Ez8+^2{~engL~haY|nCQXZbEbqo%B z+v2kiNV9L>g3s?hd!SL${V(i`JduMDAI^)rdy8DwoA^?Vb@Ez{)=zyGF@LzK`&DD| zYQyQ`-rpYrw<}}!URU1fg=ck`M|DJ*Mz`PR80=`_Ix5z6w>Ws1gNnCFT}yqX-?i?g zQdp!~@$-wT1GBM+7qgqZ)K;7uz3|-%x3h7NlXNykrySP|vIA;8N^H!(@K3y{P^X2xQ)Cqu3OBgk_4o^^-e*P&WX1cxgmuk} zx~QH9CU84g@l9QHYCfTTN?4de&pFCu{irX+(q%1HC+LNCXO1Z2Zi+$f+isze>-U!( z-PfGE+l4gkkx)af?`GrB7nsk1vmq~{1r?LbpF$LS;z{#7u3cNFf#il2DkcqFzhS}K z^@~}_RIkFp{l!wP7DKThWU}9&H0-8g(pAW$d6|`wVF!FIUoXJz4*ghBQl3RJjW+R^ zQN@XO;}YTnLV0(fgD-2O^Ug3`6SI)WVWYZb#bVk*sm)+(FxT}_k>&GM_Tqk~lCt)k z&e@kAbxX=Dc1iVIiu#wXhs74|`xs<5pxM|@K}}e}rhP$fDII zc6?fC%jxL(ROxnQcndqVV4>P4UQIu+vbIlp(@sVH4$|>#w1bKmHlR4b^0u-pw4-uOx5BJG z;F)5Q5DSN@YIjLq;O-*)L6`K}(Ea_1{2#9Zn#6v)?&cdeY&c2y^^0hv9c@Yn`7X|G zyf_o`V?JC!dZ#}-Y~#>-J5+gp?^Uu)*^>?bP2D>G5-$e?{SArJ2Ta~C_ru%jhrP}B zh5a?_?;jRtG_Cf9mo>rxZ=2OEa|_$3})5yL&LYW?$E&Ucehyj;lSMLg&RW`({{#d!cGr~nSB2JhGFq= zqMa>iSj+AfYYpq94HV6Fv zv`QheJ2&m(yZKB~J36l148A*?o#J;88FwT3@ob}I-@R|k6WMbzt%u(wQzWIxWSWi^ zo)J5y3;S(`F3fHnOb*{)A7VQD1MWUl)G>5dYHLPdZ|>gutzwyZV#PoKS?)!yk2cNm7CDj>V1A#Ij{$n*#B}YLa~4A^jFn8 zRFkqQu`N-Z*V7f6W$a%G2F5k`Nh#2LAd3~cew8{tnB{4KWzg1Sbh zL9~YyilH0*;{}X^jUTp8%ux!NNIn(F4izv8Jxa+V%Y70*UhR8H*40S({8P(kB`#%} zf{=6yGyCx@=Jb)?D9!TaF$~WILlYkU+O-RYL&29{`UX7OvzKNIk4=@l$>Ie)Tkysq zc#qvIRopeMoXKPQoA=SpTBSV((LnRs8oDIr>YH`f@5WZO?{JK!OX23O(qtGm!VfyV(@vfrAPV5R3W6FWhGa4IK&A%a!oVEGbZO} z7ZyxJU$+!_dAKS?q|beMfSI+9gEFOtgXx@T;ADeq+FIpT*|g{OgSQZU%bDT&1^grD= zdYq~o2an10({Szg#qx4+}3$GID!^$o`TQZ&~t=ZF$X4 z{H$dWU%i;FTT`<9)5(+Gl>&_-!ow_!&1?M=CIL?AQ9rc!V{NE-1RADJmot*y8B82p zPC^d4)r2h75>4)M;E$x zwTk4=k6A*Qzr`z%Rt-%b{{B(E-%UUGMc&%!BHy$^6)x$x@}?8=QP9!m+?boCA|Y?Rkr_{f z?gA`yD}1hzQT(8)5l0 zdmY!Qj8^e9O|_!6r>Y0C9#Gv3t%1X;b7m^bANcOhYv0BtY5CZvdP1(x4~;tzO~eb;r8MTOX5blur&!` zih!gE`;I%)3lX~r{?nh~=WJnT*KHQhr+W6w7bMsfJ*wh*n8V61?4WynuQK(st>kwT z$}`w^&vq5YzBg(NZp9n0#*>El8d1cW^_BiGUZGnMZE|%HbgXd?S#P%Qw#K|m{@@`V z-*cy~P-&2gQ+Y=;u{Z3%;C77QXvy@&CZoU)DkR#(ot(v|lIfT_O_VL&B?RqiWpf@5 z^JTrTua||5a|||B1wD8|N$G9K+jMiByXw7VYdd4oW7QIIx!I*R422C@2kTc*bi2Y@ zj~RFqK6AfcdF`$s&;S0ukaAaI)HV0pbq*iDw%)j~cySn3B5>wQeHFFtihYOB8(+l{ zYUDKszQEBwxA~RCEC<&7_W?Q6h04$M+89Hvn5y#lLWgh5iwleatkfOd2AKxk4uMZ! z;b}YT%!Oxy6wk&D*%im8X2Rpf6~tmw_Ih8GC2CfGiC>S5?+X8QTC}zZ!)x?dsr$2~ z?1h`6h5QXgZga0|yDykhY{h>r)VEeEMJBhJJc~7Ae1_F_r>5;%FACFqOS-;0CX~Ld zGiXaXNn9zd&y0z)eprxiyvu0eFL9gK?6ij#mCeiP26~kqgY=6wEu42{v>(T&o5)kb ztC$yQbqX!7G6gZ!&+lj^tB{>Dae^d@XMI~9I$cH`WW0+K^B^=*Z$GQ-=_=!YKmJc8l( z&!tkG7Nr%$J~Kh~<-Mdb?XsIIvlrsI_vn0xfP&VfLj4ov-deZ7)2cefW(nkxDb$`6 zi#3yPo3*4fCy6N_?6)x{KTiw#RtAJfr4<>3uyyfx5yJ3+8WDw9gTDD!+C!_&U1 zpc0MV$M;Q`FI^jt;B$N2)F~K}sTIc>^~73j2j(`hF?``xColYh!^C-IDWrCJgont33MzC9**#xg%zs0x9W31B-PHula1z zm2Xll+|F-l&ah-~hqem5LEO}QeCOJ$)7@U7Lm?l%VY=FHUGw|W zrP_u#5!ByV8^N^HBs zH#BEl;Y!4q_09GdraK*}g~4R=1u1-ILhMVgX`7sTGr4S_2gg=v^Sq@Qs@k&TONpev zDnxr|U3rIJ@#G_J$M@f-+LMPuCCm~P8L@J3fjVR2*q2-JY<){tvtO>a`pT~)B|Q?b zRL~hjUR@!d7KH>eKX(gJES-3H*)~5dc(vRhyKvN`;jG;vsW#=nwxt?Hipc{@UX`{U z-A8fNURh6t_{X;`CnD&095r*!SL#nNh?jXAKQDTs5^Q|3Fr9nqTc+~nigaY1(nH6$FS1TJ7gkN3E_jG{P<~BT1 z*K~0x%}G$}S~3?kFh5n9ybHN6l18D(H#n}Mq%%k^Nb&3&$%-{?d9X+uDuE|~W9CD? zpc+*b0-7!iXAzpQCDq~Se9t-ke!z8MIP77?1&1_W!5Qe1To&E8H)W8JVS&pE7n5iX zR$^r6vQk_xT`;y_^Yo9Y=oKNg$;Q|p)WNfHP8f-|um58H$mZ^{q+9olNa!f17F^azW zF&JznwrbFImiF80d7*d}3Rh$3)e>|CaAy#ZO6{qK^_ z*et*`@*%KDr;k4NYSqS<-1F5j;oJODykzey{ON`I^n1-7D5I`Yt*3pE%9B*M(tvHB zxz_OP%2Tm3mbDLKN)~tI>vF3Qac=B`HybDqg^5j6Y+UuVw)?YEqF}_;8Ow0NK8VO8 z0VxYsnx~5KRnvwT9mj_};?HwF2F{$^4`5WODg3MNkxrbA!59VmFNMRXT6F`T?e>bi<6pz* zNU2<}ZJi53FC9`@iiPG`R#S@MZ-w9_G7Qb~3iT9aH4#0e2TnqzWR%vt?WD=+bZ2iS zdR(F$UjMGFX<_(!Quv;aR>9NPFR+a zG(^cNTT1pm-Ga{v=bYf=)eB#}UB`gJJy$u9@S58395`f4p9+(#TIyh7Ax6v zWwel+UY}yxwjgf+D#WE4nj?!IiG64u7E&$Ey;CSfEF<)j6?SUazhtF5-DgJJx|R;3fncLZqxW_ zdkV8%GJZefmXtHb<1HcBxMg@y`sxMDSKKb43$DADbKs`w{PuF6Y~ivctZPBEneXl+ zi+fo&sb9A$n3nR5#m7Flf4fq#$~OK)^()P2NBxg!epP{oPsWXs22Xx-Yg^}$T=7fI zbbBn85u{`%B}cD!j38C|;i^5m+#p+CV zRu`WXzh^rokQn0MZ36i&kVeTr*D!+!YO*sqxZyyWQtH=KRPbs!@i{41(s?717ID^_ z@xv)U`x`A*W~~clo(b-KthK%T?0opg8^yBJ!gfFCLjEplRhue1?c9}JJCS%q;JxBXgI)wE2s5_V%Gis52Ax@&W}`JMub zCxttWWpRss?&0iT>!I{!zjqfxG%d@mF1gXUeTr#`DN~${DPx^BzBFnS;`G2{g}j_) zJ(Kq{M_-4sIPwXaS%G~D>2=8M)lceQ(~;u5c~+qPEKMNFtc~J+7pcqas_zkk{{E5B z<`14#$2OTW_ti+sMbQ5KqF%cRhTq0f9m3Vvgmf6g#(E<^_=W`>JRV{>!0 zqc5hq{SqbdJIo6HwRgem`ib9zq+&m91%3ol`&BbYxdh#C#OfmtR!(isig{)Zx192; zB$o1Fl(GuSn8B{+*JWwUU<*sJec9MY8MhQODmsSC%));;2_LM>ZI-VF#l>LmNqfzb zMqg?qy+1%2T}Bi=g%v;^Y%QMp*3;A;T^A5`YqKjG`&@WGi*_2@_6|!%*0FzUGn2a2 zE{M$8AbQ>&%H?Hk=Ln=?rTv$cELgsv|z?4}54a8`70$S`JUU z?g#F?G;>X){whWBG>UGm-pQ5h;#V&QUxs&$bEFF~?UQ_)wba-H{>@=z!=RZLyYD#Z zZ|flcS&~-EATj@N6M2cx8$-D1}=Z_JXlLWrdOKT-Yo9)z7>-Mr!C8cr>37nI`i zE@1v*K#DVmlFK_HXAZIqQ{t#;EUY4ScnTZ3i~aFw=yG{|$DP#xM~lNru9HgTm;kQY z4uq?-srv~N_ulX8(Hn{~_fH*s3*6C09^_C<6Mff6{p;)kWmLO42TyyCxrJyiR-EtV$QxB@tQS@CD`{BvF_I~=b{*4o9a+>y zNPFa{{mupZxBJf{;RPGSjnr^d!F1+F(vK;!7$R$S9VhPTOp|w!Pj6|;zj`z3tXb1R z#NIqfx*=GixKK@GaxUPm|5+2NXW{h^I*tCa^YEkWotCYT^IWBYe0^iWP1Vba0AphAb=gi@gVzLSV{BuP0qzeYORAF!z}!e-UFokYv^qQ&1G# zqdPA!g5{?(VKX)`_;UVHgq}LIaFk$uEP*Hb<(P-pHyqsXn)l}Ub(zz>v zrN*z`l)}vW(Nk2rNEf0M>`sakgvdu)F7WnL=K%?e3};g$`^0m0RA6MjRlUU#n@5*K z#iGaOiLR;A8^qvq?yE^XTM7G6>Ah7W_L6{0hE_r2GwnsUD@I9$GuN4rvh{!cB}q0< zVxl_%0TSQ89Y_Ah zA>u!$nNzcIc5)HXva!44WZ?!p68>a_gTg4p1Fiua3HU{d zqG1>`@Vov;W;x)yED8t7vXCJ6_W$IbLy2QVArKe_N+I@-^mTI1c1||j$AO*@2(&10 zMF0>@A}|zO6ag~80ncM7N)&~{0SZDPaHuH2M#SI}!Qs3mfX}53fFb$gg82ebUyuU>vk{~a({Qu4al7ek$9>^nx$6K?`;M!tlg%w0 zH-S?GfTrR$2Cz-sAhc8zf`FiK*&h`2|9tiD3I1<`6~vGECz-}{ICMd%LO1*3 zPVP|Wff$iuO4$4N{)#HK4pl@xcJH0h*pnw?nBxBZTfk5CMx&#Wbb#NIxz9C-w_Aj& z!Sp#Q^gXRrw$%EY8?SHKF(fcIEIbW%SF+MnBhFkg8t9o;_OrIp&g@>p}Ck z(S65=1vD>TfzC`|*LD7uBrg~&P;{!$J?pS0E%>{;uM_=q(WCFENNSoy`-@f2Pw8r_ z)Q(80)>8Bxjoo!%`I5N!-jDIF?l^6COPihO?+vckWdl$0FFq&fqnBE|uK|5|ZDog8 z9_}JTDExnSj{=wn;n^=0e+1LUQQE@nm0++P$AAj6P1Oj*#+j9S#h6C!s{c$`0lLinm0W9fp z8UzAGfPHe^lE(WLy;AVN8hC%?O%wsfA z3JKzWj?qH!);f2V=}#Zmb4fIyJIZydiI1_#!9 zye8CUf_?8Uk>P0d>TMxBBUV+))FF)2C+|g?SWVmyfFjkObC7-zoUg+av z29UUTb%AzA5v(Q1x{1s6{P(&5q)wbbc7e+n!CC?kR2)L@vAS>&#)a1&j#U7<_gFay z;0nGRKmd>y&WrW$?cr#+G}p&yFpx7DzYo9zg7#ow>*BWu0Qdm(7G8TOaeSVFfxvL_ z1jqYDA#pgpcr*+y@a8xTgC>v-I1n~G*#$XWkpz9fAs7Vy+~5Ec5q}=w0LLZyKGrWB zEF1pZ;6SbjXmA+7D#oh|C)k$|IDiPm=K&mn0+D-ob&-Hu_%sv{BLW%>mm~c6m{ETM zmyXd8Kq=yn4*?_rpZ9=<3;DvU3xJXEX#g`3e|#Xuh+tnL09qSCIS{ylKW2nDhOl3t zi}Cjx0tO?H0|a0JzC0t~IO7R#9&li>;nNUk{QU-0C*fIv0P2rm9zY}s_yU^4UrPiA zMzCiPK&|1A1=v0W@`r?AaG;*Y)&mLsuziuJG3b34`LG z?T+^WgAwRDBv1&1b+C}0ddCf7ev|;(tvS+&leON7$Nw50Odr`FHkUqG$esM zqk!Kv{(MnL3@(Y$@p*tFil7_{N!SMpgG(HIye=9+Ab%)egy63S3h)_!%)sB7K>pAW zIDw3#!EuByyTIhaw_hM=aWsLxN5dcl=O7xK$@qK*+m}GUpuw?*L(SkC#IMvx|TR10eHw<-l=7Fg^^5a4Z-!!I%NC34tAkf&59WcWf*e2!h~@ z#{f~oA2SA+yZF4vfQ-@jvWpQ%;!OMFeZc;}X5!HZ_aLw=2y6=woJ?T*0BI&TQ!q#f zF1X=%AK+{xqyd8*zZ@{1@z(=``UCuVygkqfzK+FUfCS>VhXEWsP6L_f3G4_!0}lcC z<$%45$7dknV3qL8iQ|GPj?EXCiD>-w09G9iY!eF3q%8tSKvhfj=$!BhQPPE z01bt2KLY`W;Gdy@CXO!~z&aq%yMTtoKO1p0!ubL-j9?yUT!sa_`CT>^!IqZUt}0vg!B_;sNmjU@pMMzH2kD4gKF0IK5K-av^H z*lU1BC-p;F!k0Gl8TZ1aB>XMsT+RniHJ-c=Lt9 z{zS$f;}y6X;M*!t81CYYUl)N(GIE^HFa)@%5YW*0wiz%wkp%k}h6E2u_;rC=!(U4n z(0}-R0e3$Fxd)<#Zx2D?;637RXNrfL1$YK_qX6%%+Bdyz{=Bb=X}P#~0JwSZ@(rGM g|2)TnQQ_dIDcn6Q+&um~#es$ZlPLK36g95=A0+E{761SM diff --git a/project/project_cocktails backup 1.jl b/project/project_cocktails backup 1.jl new file mode 100644 index 00000000..686b43c5 --- /dev/null +++ b/project/project_cocktails backup 1.jl @@ -0,0 +1,2492 @@ +### A Pluto.jl notebook ### +# v0.20.3 + +using Markdown +using InteractiveUtils + +# ╔═║ 1c4709fc-58a6-4a2c-857c-49a5442a180f +using DifferentialEquations, ModelingToolkit, Unitful + +# ╔═║ 21357c48-f35d-11ee-23f8-2534bb1d82f4 +begin + + # make this cell invisible when you are finished + title = "Cocktail shaking model" + names = ["Michiel"] + + academic_year = "2023_20224" + + email_main_person = "mail@domain.be" + + using PlutoUI # interactivity + using Plots # plotting + TableOfContents() +end; + +# ╔═║ 14c7e803-c0ff-4211-8b60-2c9c246934dd +md""" +# $title + +**$(join(names, ", ", " and "))** +""" + +# ╔═║ 6948149f-854e-4b3c-b51c-099dd221ab83 +md""" +## Abstract + +About 250 words about your project: +- (1-2 sentence) basic introduction to your topic, accessible to every bioengineering student +- (1-2 sentences) bit more specialized introduction +- (1-2 sentences) general goal of the project +- (2-3 sentences) short overview of how you built the model and what analysis you did +""" + +# ╔═║ 89551690-500d-4e37-ae20-5beb71cc87ac +md""" +## Model + +general outline of the model + variables + parameters + +For example, the metabolic rate $y$ as a function of the mass $m$ of an organism follows a power law. +""" + +# ╔═║ 7b1a87c5-0856-4968-ba2b-36da650cd0c8 +begin + @variables t #[unit = u"s"] # mixing time in seconds + @variables I(t)=200 #[unit = u"g"] # amount of ice + @variables L(t)=100 #[unit = u"L"] # amount of liquid + @variables T(t)=20 #[unit = u"Β°C"] # cocktail temperature + @variables S(t)=203 #[unit = u"g/L"] # sugar concentration + @variables Z(t) +end; + +# ╔═║ 08b40947-7218-4885-b25c-982821ca0361 +begin + @constants Cmelt = 3.34e5 #[unit = u"J/kg"] + @constants Cβ‚š = 4.187e3 #[unit = u"J/kg * K"] +end; + +# ╔═║ b1073c63-cb31-4160-98e1-ec1a0ca22d9c +10u"J/kg/K" * (10u"Β°C"-5u"Β°C") + +# ╔═║ 7110e56a-dfc1-4885-9eee-c59eeb37010f +Dβ‚œ = Differential(t) + +# ╔═║ d560e96d-c6dc-4127-9616-1c186914cef5 +melting = Dβ‚œ(I) ~ -0.001 #* T #*I^0.66 + +# ╔═║ 75b7ed6d-f27f-4f73-9c78-014b659323b8 +#water_balance = Dβ‚œ(I) + Dβ‚œ(L) ~ 0 +water_balance = I+L ~ 100 + +# ╔═║ 3da54360-1f31-48a0-87cf-0d47132862bc +heat_balance = Cmelt * Dβ‚œ(I) ~ Cβ‚š * L * Dβ‚œ(T) + +# ╔═║ 3ccb5e2b-9ed3-486c-ac18-de62d2297e07 +sugar_balance = expand_derivatives(Dβ‚œ(S*L)) ~ 0 +#sugar_balance = S*L ~ 10 + +# ╔═║ aed58771-86c1-4928-a1ba-b7d2f503b188 +md"Finally, the perceived sweetness depends on the sugar concentration and the temperature. Setting up such a relation is done in the field of psychophysics (e.g. [Steven's law](https://en.wikipedia.org/wiki/Stevens%27s_power_law)). Based on [this article](https://pubmed.ncbi.nlm.nih.gov/7100291/), we obtain a fairly simple emperical relation." + +# ╔═║ 98451eb8-8755-47fe-b8c6-ce2959256dd8 +sweetness = Z ~ 14.0 * (S / 342.30)^(1.422 - 0.0146T) + +# ╔═║ aa32c5e2-0f67-4910-a612-d958fa13169c +@named sys_or = ODESystem([melting, water_balance,heat_balance,sugar_balance,sweetness]) + +# ╔═║ 7f9c8c7d-90ef-496c-b907-300feba5edfc +simpsys = structural_simplify(sys, simplify=true) + +# ╔═║ 4595b9f6-3e9b-4160-8def-456b0c6c0caf +@mtkbuild sys = ODESystem([melting, water_balance,heat_balance,sugar_balance,sweetness]) + +# ╔═║ 58d13e42-4edc-412c-a1e0-30e11fb2585e +states(simpsys) + +# ╔═║ 8cf34815-4ff7-4930-bc91-11081e1ab3f3 +ODEProblem(simpsys, [S=>10, L=>0.3, S=>0.2, T=>21, I=>200], (0, 50)) + +# ╔═║ f284fda5-aaf7-4121-a8f0-b996d501bec5 +md"## Simulation and analysis" + +# ╔═║ 2a0b0c1f-9510-4f71-9d65-b4fb7c854a98 +md""" +Explore your model +""" + +# ╔═║ 67380c07-a07c-4a0e-8654-80f27b951461 +plot(y, 0.01, 1000, label="metabolic rate", xlab="mass (kg)") + +# ╔═║ 86307aaa-1349-444b-bc9b-e5c115727671 + + +# ╔═║ ef1b3843-a963-4a18-85c4-ca5a6e791d00 + + +# ╔═║ aa4ebdb8-27a1-493b-b95e-d2ac4c3e6d54 + + +# ╔═║ 60c63f1b-5a27-4539-a486-78c083457b0e +md""" +## Conclusion + +A short conclusion of your analysis with a relection on how you would improve this model. +""" + +# ╔═║ 890afefc-f42b-4d74-b775-6dee5e5f0c2b +md"## Appendix" + +# ╔═║ 1f4b988a-6632-4589-8913-5de0574d94b3 +perceived_sweetness(S, T) = 14.9 * (S / 342.30)^(1.42224 - 0.0146071T) + +# ╔═║ 797ce7d7-c49d-4a00-a8e3-058b6de4d3a9 +heatmap(1:200, 4:40, perceived_sweetness, xlabel="Sugar concentration (g/L)", ylabel="temperature (Β°C)", title="perceived sweetness") + +# ╔═║ 00000000-0000-0000-0000-000000000001 +PLUTO_PROJECT_TOML_CONTENTS = """ +[deps] +DifferentialEquations = "0c46a032-eb83-5123-abaf-570d42b7fbaa" +ModelingToolkit = "961ee093-0014-501f-94e3-6117800e7a78" +Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" +PlutoUI = "7f904dfe-b85e-4ff6-b463-dae2292396a8" +Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" + +[compat] +DifferentialEquations = "~7.13.0" +ModelingToolkit = "~8.75.0" +Plots = "~1.39.0" +PlutoUI = "~0.7.58" +Unitful = "~1.19.0" +""" + +# ╔═║ 00000000-0000-0000-0000-000000000002 +PLUTO_MANIFEST_TOML_CONTENTS = """ +# This file is machine-generated - editing it directly is not advised + +julia_version = "1.9.0" +manifest_format = "2.0" +project_hash = "a7255f58d02bc974b024509e272a27584fdf4bd4" + +[[deps.ADTypes]] +git-tree-sha1 = "016833eb52ba2d6bea9fcb50ca295980e728ee24" +uuid = "47edcb42-4c32-4615-8424-f2b9edc5f35b" +version = "0.2.7" + +[[deps.AbstractAlgebra]] +deps = ["GroupsCore", "InteractiveUtils", "LinearAlgebra", "MacroTools", "Preferences", "Random", "RandomExtensions", "SparseArrays", "Test"] +git-tree-sha1 = "d7832de8cf7af26abac741f10372080ac6cb73df" +uuid = "c3fe647b-3220-5bb0-a1ea-a7954cac585d" +version = "0.34.7" + +[[deps.AbstractPlutoDingetjes]] +deps = ["Pkg"] +git-tree-sha1 = "6e1d2a35f2f90a4bc7c2ed98079b2ba09c35b83a" +uuid = "6e696c72-6542-2067-7265-42206c756150" +version = "1.3.2" + +[[deps.AbstractTrees]] +git-tree-sha1 = "2d9c9a55f9c93e8887ad391fbae72f8ef55e1177" +uuid = "1520ce14-60c1-5f80-bbc7-55ef81b5835c" +version = "0.4.5" + +[[deps.Adapt]] +deps = ["LinearAlgebra", "Requires"] +git-tree-sha1 = "cde29ddf7e5726c9fb511f340244ea3481267608" +uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" +version = "3.7.2" +weakdeps = ["StaticArrays"] + + [deps.Adapt.extensions] + AdaptStaticArraysExt = "StaticArrays" + +[[deps.AliasTables]] +deps = ["Random"] +git-tree-sha1 = "82b912bb5215792fd33df26f407d064d3602af98" +uuid = "66dad0bd-aa9a-41b7-9441-69ab47430ed8" +version = "1.1.2" + +[[deps.ArgTools]] +uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" +version = "1.1.1" + +[[deps.ArnoldiMethod]] +deps = ["LinearAlgebra", "Random", "StaticArrays"] +git-tree-sha1 = "d57bd3762d308bded22c3b82d033bff85f6195c6" +uuid = "ec485272-7323-5ecc-a04f-4719b315124d" +version = "0.4.0" + +[[deps.ArrayInterface]] +deps = ["Adapt", "LinearAlgebra", "Requires", "SparseArrays", "SuiteSparse"] +git-tree-sha1 = "c5aeb516a84459e0318a02507d2261edad97eb75" +uuid = "4fba245c-0d91-5ea0-9b3e-6abc04ee57a9" +version = "7.7.1" + + [deps.ArrayInterface.extensions] + ArrayInterfaceBandedMatricesExt = "BandedMatrices" + ArrayInterfaceBlockBandedMatricesExt = "BlockBandedMatrices" + ArrayInterfaceCUDAExt = "CUDA" + ArrayInterfaceGPUArraysCoreExt = "GPUArraysCore" + ArrayInterfaceStaticArraysCoreExt = "StaticArraysCore" + ArrayInterfaceTrackerExt = "Tracker" + + [deps.ArrayInterface.weakdeps] + BandedMatrices = "aae01518-5342-5314-be14-df237901396f" + BlockBandedMatrices = "ffab5731-97b5-5995-9138-79e8c1846df0" + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + GPUArraysCore = "46192b85-c4d5-4398-a991-12ede77f4527" + StaticArraysCore = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" + Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" + +[[deps.ArrayLayouts]] +deps = ["FillArrays", "LinearAlgebra"] +git-tree-sha1 = "33207a8be6267bc389d0701e97a9bce6a4de68eb" +uuid = "4c555306-a7a7-4459-81d9-ec55ddd5c99a" +version = "1.9.2" +weakdeps = ["SparseArrays"] + + [deps.ArrayLayouts.extensions] + ArrayLayoutsSparseArraysExt = "SparseArrays" + +[[deps.Artifacts]] +uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" + +[[deps.BandedMatrices]] +deps = ["ArrayLayouts", "FillArrays", "LinearAlgebra", "PrecompileTools"] +git-tree-sha1 = "30b7ea34abc4fe816eb1a5f434a43da804836163" +uuid = "aae01518-5342-5314-be14-df237901396f" +version = "1.7.0" +weakdeps = ["SparseArrays"] + + [deps.BandedMatrices.extensions] + BandedMatricesSparseArraysExt = "SparseArrays" + +[[deps.Base64]] +uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" + +[[deps.Bijections]] +git-tree-sha1 = "c9b163bd832e023571e86d0b90d9de92a9879088" +uuid = "e2ed5e7c-b2de-5872-ae92-c73ca462fb04" +version = "0.1.6" + +[[deps.BitFlags]] +git-tree-sha1 = "2dc09997850d68179b69dafb58ae806167a32b1b" +uuid = "d1d4a3ce-64b1-5f1a-9ba4-7e7e69966f35" +version = "0.1.8" + +[[deps.BitTwiddlingConvenienceFunctions]] +deps = ["Static"] +git-tree-sha1 = "0c5f81f47bbbcf4aea7b2959135713459170798b" +uuid = "62783981-4cbd-42fc-bca8-16325de8dc4b" +version = "0.1.5" + +[[deps.BoundaryValueDiffEq]] +deps = ["ADTypes", "Adapt", "ArrayInterface", "BandedMatrices", "ConcreteStructs", "DiffEqBase", "FastAlmostBandedMatrices", "ForwardDiff", "LinearAlgebra", "LinearSolve", "NonlinearSolve", "PreallocationTools", "PrecompileTools", "Preferences", "RecursiveArrayTools", "Reexport", "SciMLBase", "Setfield", "SparseArrays", "SparseDiffTools", "Tricks", "TruncatedStacktraces", "UnPack"] +git-tree-sha1 = "3ff968887be48760b0e9e8650c2d05c96cdea9d8" +uuid = "764a87c0-6b3e-53db-9096-fe964310641d" +version = "5.6.3" + + [deps.BoundaryValueDiffEq.extensions] + BoundaryValueDiffEqODEInterfaceExt = "ODEInterface" + BoundaryValueDiffEqOrdinaryDiffEqExt = "OrdinaryDiffEq" + + [deps.BoundaryValueDiffEq.weakdeps] + ODEInterface = "54ca160b-1b9f-5127-a996-1867f4bc2a2c" + OrdinaryDiffEq = "1dea7af3-3e70-54e6-95c3-0bf5283fa5ed" + +[[deps.Bzip2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "9e2a6b69137e6969bab0152632dcb3bc108c8bdd" +uuid = "6e34b625-4abd-537c-b88f-471c36dfa7a0" +version = "1.0.8+1" + +[[deps.CEnum]] +git-tree-sha1 = "389ad5c84de1ae7cf0e28e381131c98ea87d54fc" +uuid = "fa961155-64e5-5f13-b03f-caf6b980ea82" +version = "0.5.0" + +[[deps.CPUSummary]] +deps = ["CpuId", "IfElse", "PrecompileTools", "Static"] +git-tree-sha1 = "601f7e7b3d36f18790e2caf83a882d88e9b71ff1" +uuid = "2a0fbf3d-bb9c-48f3-b0a9-814d99fd7ab9" +version = "0.2.4" + +[[deps.CSTParser]] +deps = ["Tokenize"] +git-tree-sha1 = "0157e592151e39fa570645e2b2debcdfb8a0f112" +uuid = "00ebfdb7-1f24-5e51-bd34-a7502290713f" +version = "3.4.3" + +[[deps.Cairo_jll]] +deps = ["Artifacts", "Bzip2_jll", "CompilerSupportLibraries_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "JLLWrappers", "LZO_jll", "Libdl", "Pixman_jll", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Zlib_jll", "libpng_jll"] +git-tree-sha1 = "a4c43f59baa34011e303e76f5c8c91bf58415aaf" +uuid = "83423d85-b0ee-5818-9007-b63ccbeb887a" +version = "1.18.0+1" + +[[deps.Calculus]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "f641eb0a4f00c343bbc32346e1217b86f3ce9dad" +uuid = "49dc2e85-a5d0-5ad3-a950-438e2897f1b9" +version = "0.5.1" + +[[deps.ChainRulesCore]] +deps = ["Compat", "LinearAlgebra"] +git-tree-sha1 = "575cd02e080939a33b6df6c5853d14924c08e35b" +uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" +version = "1.23.0" +weakdeps = ["SparseArrays"] + + [deps.ChainRulesCore.extensions] + ChainRulesCoreSparseArraysExt = "SparseArrays" + +[[deps.CloseOpenIntervals]] +deps = ["Static", "StaticArrayInterface"] +git-tree-sha1 = "70232f82ffaab9dc52585e0dd043b5e0c6b714f1" +uuid = "fb6a15b2-703c-40df-9091-08a04967cfa9" +version = "0.1.12" + +[[deps.CodecZlib]] +deps = ["TranscodingStreams", "Zlib_jll"] +git-tree-sha1 = "59939d8a997469ee05c4b4944560a820f9ba0d73" +uuid = "944b1d66-785c-5afd-91f1-9de20f533193" +version = "0.7.4" + +[[deps.ColorSchemes]] +deps = ["ColorTypes", "ColorVectorSpace", "Colors", "FixedPointNumbers", "PrecompileTools", "Random"] +git-tree-sha1 = "4b270d6465eb21ae89b732182c20dc165f8bf9f2" +uuid = "35d6a980-a343-548e-a6ea-1d62b119f2f4" +version = "3.25.0" + +[[deps.ColorTypes]] +deps = ["FixedPointNumbers", "Random"] +git-tree-sha1 = "b10d0b65641d57b8b4d5e234446582de5047050d" +uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f" +version = "0.11.5" + +[[deps.ColorVectorSpace]] +deps = ["ColorTypes", "FixedPointNumbers", "LinearAlgebra", "Requires", "Statistics", "TensorCore"] +git-tree-sha1 = "a1f44953f2382ebb937d60dafbe2deea4bd23249" +uuid = "c3611d14-8923-5661-9e6a-0046d554d3a4" +version = "0.10.0" +weakdeps = ["SpecialFunctions"] + + [deps.ColorVectorSpace.extensions] + SpecialFunctionsExt = "SpecialFunctions" + +[[deps.Colors]] +deps = ["ColorTypes", "FixedPointNumbers", "Reexport"] +git-tree-sha1 = "fc08e5930ee9a4e03f84bfb5211cb54e7769758a" +uuid = "5ae59095-9a9b-59fe-a467-6f913c188581" +version = "0.12.10" + +[[deps.Combinatorics]] +git-tree-sha1 = "08c8b6831dc00bfea825826be0bc8336fc369860" +uuid = "861a8166-3701-5b0c-9a16-15d98fcdc6aa" +version = "1.0.2" + +[[deps.CommonMark]] +deps = ["Crayons", "JSON", "PrecompileTools", "URIs"] +git-tree-sha1 = "532c4185d3c9037c0237546d817858b23cf9e071" +uuid = "a80b9123-70ca-4bc0-993e-6e3bcb318db6" +version = "0.8.12" + +[[deps.CommonSolve]] +git-tree-sha1 = "0eee5eb66b1cf62cd6ad1b460238e60e4b09400c" +uuid = "38540f10-b2f7-11e9-35d8-d573e4eb0ff2" +version = "0.2.4" + +[[deps.CommonSubexpressions]] +deps = ["MacroTools", "Test"] +git-tree-sha1 = "7b8a93dba8af7e3b42fecabf646260105ac373f7" +uuid = "bbf7d656-a473-5ed7-a52c-81e309532950" +version = "0.3.0" + +[[deps.Compat]] +deps = ["TOML", "UUIDs"] +git-tree-sha1 = "b1c55339b7c6c350ee89f2c1604299660525b248" +uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" +version = "4.15.0" +weakdeps = ["Dates", "LinearAlgebra"] + + [deps.Compat.extensions] + CompatLinearAlgebraExt = "LinearAlgebra" + +[[deps.CompilerSupportLibraries_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" +version = "1.0.2+0" + +[[deps.CompositeTypes]] +git-tree-sha1 = "bce26c3dab336582805503bed209faab1c279768" +uuid = "b152e2b5-7a66-4b01-a709-34e65c35f657" +version = "0.1.4" + +[[deps.ConcreteStructs]] +git-tree-sha1 = "f749037478283d372048690eb3b5f92a79432b34" +uuid = "2569d6c7-a4a2-43d3-a901-331e8e4be471" +version = "0.2.3" + +[[deps.ConcurrentUtilities]] +deps = ["Serialization", "Sockets"] +git-tree-sha1 = "6cbbd4d241d7e6579ab354737f4dd95ca43946e1" +uuid = "f0e56b4a-5159-44fe-b623-3e5288b988bb" +version = "2.4.1" + +[[deps.ConstructionBase]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "260fd2400ed2dab602a7c15cf10c1933c59930a2" +uuid = "187b0558-2788-49d3-abe0-74a17ed4e7c9" +version = "1.5.5" +weakdeps = ["IntervalSets", "StaticArrays"] + + [deps.ConstructionBase.extensions] + ConstructionBaseIntervalSetsExt = "IntervalSets" + ConstructionBaseStaticArraysExt = "StaticArrays" + +[[deps.Contour]] +git-tree-sha1 = "439e35b0b36e2e5881738abc8857bd92ad6ff9a8" +uuid = "d38c429a-6771-53c6-b99e-75d170b6e991" +version = "0.6.3" + +[[deps.CpuId]] +deps = ["Markdown"] +git-tree-sha1 = "fcbb72b032692610bfbdb15018ac16a36cf2e406" +uuid = "adafc99b-e345-5852-983c-f28acb93d879" +version = "0.3.1" + +[[deps.Crayons]] +git-tree-sha1 = "249fe38abf76d48563e2f4556bebd215aa317e15" +uuid = "a8cc5b0e-0ffa-5ad4-8c14-923d3ee1735f" +version = "4.1.1" + +[[deps.DataAPI]] +git-tree-sha1 = "abe83f3a2f1b857aac70ef8b269080af17764bbe" +uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a" +version = "1.16.0" + +[[deps.DataStructures]] +deps = ["Compat", "InteractiveUtils", "OrderedCollections"] +git-tree-sha1 = "1d0a14036acb104d9e89698bd408f63ab58cdc82" +uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" +version = "0.18.20" + +[[deps.DataValueInterfaces]] +git-tree-sha1 = "bfc1187b79289637fa0ef6d4436ebdfe6905cbd6" +uuid = "e2d170a0-9d28-54be-80f0-106bbe20a464" +version = "1.0.0" + +[[deps.Dates]] +deps = ["Printf"] +uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" + +[[deps.DelayDiffEq]] +deps = ["ArrayInterface", "DataStructures", "DiffEqBase", "LinearAlgebra", "Logging", "OrdinaryDiffEq", "Printf", "RecursiveArrayTools", "Reexport", "SciMLBase", "SimpleNonlinearSolve", "SimpleUnPack"] +git-tree-sha1 = "dd3dfeca90deb4b38be9598d7c51cd558816e596" +uuid = "bcd4f6db-9728-5f36-b5f7-82caef46ccdb" +version = "5.45.1" + +[[deps.DelimitedFiles]] +deps = ["Mmap"] +git-tree-sha1 = "9e2f36d3c96a820c678f2f1f1782582fcf685bae" +uuid = "8bb1440f-4735-579b-a4ab-409b98df4dab" +version = "1.9.1" + +[[deps.DiffEqBase]] +deps = ["ArrayInterface", "DataStructures", "DocStringExtensions", "EnumX", "EnzymeCore", "FastBroadcast", "ForwardDiff", "FunctionWrappers", "FunctionWrappersWrappers", "LinearAlgebra", "Logging", "Markdown", "MuladdMacro", "Parameters", "PreallocationTools", "PrecompileTools", "Printf", "RecursiveArrayTools", "Reexport", "SciMLBase", "SciMLOperators", "Setfield", "SparseArrays", "Static", "StaticArraysCore", "Statistics", "Tricks", "TruncatedStacktraces"] +git-tree-sha1 = "044648af911974c3928058c1f8c83f159dece274" +uuid = "2b5f629d-d688-5b77-993f-72d75c75574e" +version = "6.145.6" + + [deps.DiffEqBase.extensions] + DiffEqBaseChainRulesCoreExt = "ChainRulesCore" + DiffEqBaseDistributionsExt = "Distributions" + DiffEqBaseEnzymeExt = ["ChainRulesCore", "Enzyme"] + DiffEqBaseGeneralizedGeneratedExt = "GeneralizedGenerated" + DiffEqBaseMPIExt = "MPI" + DiffEqBaseMeasurementsExt = "Measurements" + DiffEqBaseMonteCarloMeasurementsExt = "MonteCarloMeasurements" + DiffEqBaseReverseDiffExt = "ReverseDiff" + DiffEqBaseTrackerExt = "Tracker" + DiffEqBaseUnitfulExt = "Unitful" + + [deps.DiffEqBase.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + Distributions = "31c24e10-a181-5473-b8eb-7969acd0382f" + Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9" + GeneralizedGenerated = "6b9d7cbe-bcb9-11e9-073f-15a7a543e2eb" + MPI = "da04e1cc-30fd-572f-bb4f-1f8673147195" + Measurements = "eff96d63-e80a-5855-80a2-b1b0885c5ab7" + MonteCarloMeasurements = "0987c9cc-fe09-11e8-30f0-b96dd679fdca" + ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" + Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" + +[[deps.DiffEqCallbacks]] +deps = ["DataStructures", "DiffEqBase", "ForwardDiff", "Functors", "LinearAlgebra", "Markdown", "NLsolve", "Parameters", "RecipesBase", "RecursiveArrayTools", "SciMLBase", "StaticArraysCore"] +git-tree-sha1 = "cf334da651a6e42c50e1477d6ab978f1b8be3057" +uuid = "459566f4-90b8-5000-8ac3-15dfb0a30def" +version = "2.36.1" +weakdeps = ["OrdinaryDiffEq", "Sundials"] + +[[deps.DiffEqNoiseProcess]] +deps = ["DiffEqBase", "Distributions", "GPUArraysCore", "LinearAlgebra", "Markdown", "Optim", "PoissonRandom", "QuadGK", "Random", "Random123", "RandomNumbers", "RecipesBase", "RecursiveArrayTools", "Requires", "ResettableStacks", "SciMLBase", "StaticArraysCore", "Statistics"] +git-tree-sha1 = "65cbbe1450ced323b4b17228ccd96349d96795a7" +uuid = "77a26b50-5914-5dd7-bc55-306e6241c503" +version = "5.21.0" + + [deps.DiffEqNoiseProcess.extensions] + DiffEqNoiseProcessReverseDiffExt = "ReverseDiff" + + [deps.DiffEqNoiseProcess.weakdeps] + ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + +[[deps.DiffResults]] +deps = ["StaticArraysCore"] +git-tree-sha1 = "782dd5f4561f5d267313f23853baaaa4c52ea621" +uuid = "163ba53b-c6d8-5494-b064-1a9d43ac40c5" +version = "1.1.0" + +[[deps.DiffRules]] +deps = ["IrrationalConstants", "LogExpFunctions", "NaNMath", "Random", "SpecialFunctions"] +git-tree-sha1 = "23163d55f885173722d1e4cf0f6110cdbaf7e272" +uuid = "b552c78f-8df3-52c6-915a-8e097449b14b" +version = "1.15.1" + +[[deps.DifferentialEquations]] +deps = ["BoundaryValueDiffEq", "DelayDiffEq", "DiffEqBase", "DiffEqCallbacks", "DiffEqNoiseProcess", "JumpProcesses", "LinearAlgebra", "LinearSolve", "NonlinearSolve", "OrdinaryDiffEq", "Random", "RecursiveArrayTools", "Reexport", "SciMLBase", "SteadyStateDiffEq", "StochasticDiffEq", "Sundials"] +git-tree-sha1 = "81042254a307980b8ab5b67033aca26c2e157ebb" +uuid = "0c46a032-eb83-5123-abaf-570d42b7fbaa" +version = "7.13.0" + +[[deps.Distances]] +deps = ["LinearAlgebra", "Statistics", "StatsAPI"] +git-tree-sha1 = "66c4c81f259586e8f002eacebc177e1fb06363b0" +uuid = "b4f34e82-e78d-54a5-968a-f98e89d6e8f7" +version = "0.10.11" +weakdeps = ["ChainRulesCore", "SparseArrays"] + + [deps.Distances.extensions] + DistancesChainRulesCoreExt = "ChainRulesCore" + DistancesSparseArraysExt = "SparseArrays" + +[[deps.Distributed]] +deps = ["Random", "Serialization", "Sockets"] +uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" + +[[deps.Distributions]] +deps = ["AliasTables", "FillArrays", "LinearAlgebra", "PDMats", "Printf", "QuadGK", "Random", "SpecialFunctions", "Statistics", "StatsAPI", "StatsBase", "StatsFuns"] +git-tree-sha1 = "22c595ca4146c07b16bcf9c8bea86f731f7109d2" +uuid = "31c24e10-a181-5473-b8eb-7969acd0382f" +version = "0.25.108" + + [deps.Distributions.extensions] + DistributionsChainRulesCoreExt = "ChainRulesCore" + DistributionsDensityInterfaceExt = "DensityInterface" + DistributionsTestExt = "Test" + + [deps.Distributions.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + DensityInterface = "b429d917-457f-4dbc-8f4c-0cc954292b1d" + Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[[deps.DocStringExtensions]] +deps = ["LibGit2"] +git-tree-sha1 = "2fb1e02f2b635d0845df5d7c167fec4dd739b00d" +uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" +version = "0.9.3" + +[[deps.DomainSets]] +deps = ["CompositeTypes", "IntervalSets", "LinearAlgebra", "Random", "StaticArrays", "Statistics"] +git-tree-sha1 = "51b4b84d33ec5e0955b55ff4b748b99ce2c3faa9" +uuid = "5b8099bc-c8ec-5219-889f-1d9e522a28bf" +version = "0.6.7" + +[[deps.Downloads]] +deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] +uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" +version = "1.6.0" + +[[deps.DualNumbers]] +deps = ["Calculus", "NaNMath", "SpecialFunctions"] +git-tree-sha1 = "5837a837389fccf076445fce071c8ddaea35a566" +uuid = "fa6b7ba4-c1ee-5f82-b5fc-ecf0adba8f74" +version = "0.6.8" + +[[deps.DynamicPolynomials]] +deps = ["Future", "LinearAlgebra", "MultivariatePolynomials", "MutableArithmetics", "Pkg", "Reexport", "Test"] +git-tree-sha1 = "30a1848c4f4fc35d1d4bbbd125650f6a11b5bc6c" +uuid = "7c1d4256-1411-5781-91ec-d7bc3513ac07" +version = "0.5.7" + +[[deps.EnumX]] +git-tree-sha1 = "bdb1942cd4c45e3c678fd11569d5cccd80976237" +uuid = "4e289a0a-7415-4d19-859d-a7e5c4648b56" +version = "1.0.4" + +[[deps.EnzymeCore]] +git-tree-sha1 = "1bc328eec34ffd80357f84a84bb30e4374e9bd60" +uuid = "f151be2c-9106-41f4-ab19-57ee4f262869" +version = "0.6.6" +weakdeps = ["Adapt"] + + [deps.EnzymeCore.extensions] + AdaptExt = "Adapt" + +[[deps.EpollShim_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "8e9441ee83492030ace98f9789a654a6d0b1f643" +uuid = "2702e6a9-849d-5ed8-8c21-79e8b8f9ee43" +version = "0.0.20230411+0" + +[[deps.ExceptionUnwrapping]] +deps = ["Test"] +git-tree-sha1 = "dcb08a0d93ec0b1cdc4af184b26b591e9695423a" +uuid = "460bff9d-24e4-43bc-9d9f-a8973cb893f4" +version = "0.1.10" + +[[deps.Expat_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "1c6317308b9dc757616f0b5cb379db10494443a7" +uuid = "2e619515-83b5-522b-bb60-26c02a35a201" +version = "2.6.2+0" + +[[deps.ExponentialUtilities]] +deps = ["Adapt", "ArrayInterface", "GPUArraysCore", "GenericSchur", "LinearAlgebra", "PrecompileTools", "Printf", "SparseArrays", "libblastrampoline_jll"] +git-tree-sha1 = "602e4585bcbd5a25bc06f514724593d13ff9e862" +uuid = "d4d017d3-3776-5f7e-afef-a10c40355c18" +version = "1.25.0" + +[[deps.ExprTools]] +git-tree-sha1 = "27415f162e6028e81c72b82ef756bf321213b6ec" +uuid = "e2ba6199-217a-4e67-a87a-7c52f15ade04" +version = "0.1.10" + +[[deps.FFMPEG]] +deps = ["FFMPEG_jll"] +git-tree-sha1 = "b57e3acbe22f8484b4b5ff66a7499717fe1a9cc8" +uuid = "c87230d0-a227-11e9-1b43-d7ebe4e7570a" +version = "0.4.1" + +[[deps.FFMPEG_jll]] +deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "JLLWrappers", "LAME_jll", "Libdl", "Ogg_jll", "OpenSSL_jll", "Opus_jll", "PCRE2_jll", "Zlib_jll", "libaom_jll", "libass_jll", "libfdk_aac_jll", "libvorbis_jll", "x264_jll", "x265_jll"] +git-tree-sha1 = "466d45dc38e15794ec7d5d63ec03d776a9aff36e" +uuid = "b22a6f82-2f65-5046-a5b2-351ab43fb4e5" +version = "4.4.4+1" + +[[deps.FastAlmostBandedMatrices]] +deps = ["ArrayInterface", "ArrayLayouts", "BandedMatrices", "ConcreteStructs", "LazyArrays", "LinearAlgebra", "MatrixFactorizations", "PrecompileTools", "Reexport"] +git-tree-sha1 = "9dc913faf8552fd09b92a0d7fcc25f1d5609d795" +uuid = "9d29842c-ecb8-4973-b1e9-a27b1157504e" +version = "0.1.1" + +[[deps.FastBroadcast]] +deps = ["ArrayInterface", "LinearAlgebra", "Polyester", "Static", "StaticArrayInterface", "StrideArraysCore"] +git-tree-sha1 = "a6e756a880fc419c8b41592010aebe6a5ce09136" +uuid = "7034ab61-46d4-4ed7-9d0f-46aef9175898" +version = "0.2.8" + +[[deps.FastClosures]] +git-tree-sha1 = "acebe244d53ee1b461970f8910c235b259e772ef" +uuid = "9aa1b823-49e4-5ca5-8b0f-3971ec8bab6a" +version = "0.3.2" + +[[deps.FastLapackInterface]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "f4102aab9c7df8691ed09f9c42e34f5ab5458ab9" +uuid = "29a986be-02c6-4525-aec4-84b980013641" +version = "2.0.3" + +[[deps.FileWatching]] +uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" + +[[deps.FillArrays]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "0653c0a2396a6da5bc4766c43041ef5fd3efbe57" +uuid = "1a297f60-69ca-5386-bcde-b61e274b549b" +version = "1.11.0" +weakdeps = ["PDMats", "SparseArrays", "Statistics"] + + [deps.FillArrays.extensions] + FillArraysPDMatsExt = "PDMats" + FillArraysSparseArraysExt = "SparseArrays" + FillArraysStatisticsExt = "Statistics" + +[[deps.FiniteDiff]] +deps = ["ArrayInterface", "LinearAlgebra", "Requires", "Setfield", "SparseArrays"] +git-tree-sha1 = "73d1214fec245096717847c62d389a5d2ac86504" +uuid = "6a86dc24-6348-571c-b903-95158fe2bd41" +version = "2.22.0" + + [deps.FiniteDiff.extensions] + FiniteDiffBandedMatricesExt = "BandedMatrices" + FiniteDiffBlockBandedMatricesExt = "BlockBandedMatrices" + FiniteDiffStaticArraysExt = "StaticArrays" + + [deps.FiniteDiff.weakdeps] + BandedMatrices = "aae01518-5342-5314-be14-df237901396f" + BlockBandedMatrices = "ffab5731-97b5-5995-9138-79e8c1846df0" + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + +[[deps.FixedPointNumbers]] +deps = ["Statistics"] +git-tree-sha1 = "335bfdceacc84c5cdf16aadc768aa5ddfc5383cc" +uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" +version = "0.8.4" + +[[deps.Fontconfig_jll]] +deps = ["Artifacts", "Bzip2_jll", "Expat_jll", "FreeType2_jll", "JLLWrappers", "Libdl", "Libuuid_jll", "Zlib_jll"] +git-tree-sha1 = "db16beca600632c95fc8aca29890d83788dd8b23" +uuid = "a3f928ae-7b40-5064-980b-68af3947d34b" +version = "2.13.96+0" + +[[deps.Format]] +git-tree-sha1 = "9c68794ef81b08086aeb32eeaf33531668d5f5fc" +uuid = "1fa38f19-a742-5d3f-a2b9-30dd87b9d5f8" +version = "1.3.7" + +[[deps.ForwardDiff]] +deps = ["CommonSubexpressions", "DiffResults", "DiffRules", "LinearAlgebra", "LogExpFunctions", "NaNMath", "Preferences", "Printf", "Random", "SpecialFunctions"] +git-tree-sha1 = "cf0fe81336da9fb90944683b8c41984b08793dad" +uuid = "f6369f11-7733-5829-9624-2563aa707210" +version = "0.10.36" +weakdeps = ["StaticArrays"] + + [deps.ForwardDiff.extensions] + ForwardDiffStaticArraysExt = "StaticArrays" + +[[deps.FreeType2_jll]] +deps = ["Artifacts", "Bzip2_jll", "JLLWrappers", "Libdl", "Zlib_jll"] +git-tree-sha1 = "d8db6a5a2fe1381c1ea4ef2cab7c69c2de7f9ea0" +uuid = "d7e528f0-a631-5988-bf34-fe36492bcfd7" +version = "2.13.1+0" + +[[deps.FriBidi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "1ed150b39aebcc805c26b93a8d0122c940f64ce2" +uuid = "559328eb-81f9-559d-9380-de523a88c83c" +version = "1.0.14+0" + +[[deps.FunctionWrappers]] +git-tree-sha1 = "d62485945ce5ae9c0c48f124a84998d755bae00e" +uuid = "069b7b12-0de2-55c6-9aab-29f3d0a68a2e" +version = "1.1.3" + +[[deps.FunctionWrappersWrappers]] +deps = ["FunctionWrappers"] +git-tree-sha1 = "b104d487b34566608f8b4e1c39fb0b10aa279ff8" +uuid = "77dc65aa-8811-40c2-897b-53d922fa7daf" +version = "0.1.3" + +[[deps.Functors]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "d3e63d9fa13f8eaa2f06f64949e2afc593ff52c2" +uuid = "d9f16b24-f501-4c13-a1f2-28368ffc5196" +version = "0.4.10" + +[[deps.Future]] +deps = ["Random"] +uuid = "9fa8497b-333b-5362-9e8d-4d0656e87820" + +[[deps.GLFW_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libglvnd_jll", "Xorg_libXcursor_jll", "Xorg_libXi_jll", "Xorg_libXinerama_jll", "Xorg_libXrandr_jll"] +git-tree-sha1 = "ff38ba61beff76b8f4acad8ab0c97ef73bb670cb" +uuid = "0656b61e-2033-5cc2-a64a-77c0f6c09b89" +version = "3.3.9+0" + +[[deps.GPUArraysCore]] +deps = ["Adapt"] +git-tree-sha1 = "2d6ca471a6c7b536127afccfa7564b5b39227fe0" +uuid = "46192b85-c4d5-4398-a991-12ede77f4527" +version = "0.1.5" + +[[deps.GR]] +deps = ["Artifacts", "Base64", "DelimitedFiles", "Downloads", "GR_jll", "HTTP", "JSON", "Libdl", "LinearAlgebra", "Pkg", "Preferences", "Printf", "Random", "Serialization", "Sockets", "TOML", "Tar", "Test", "UUIDs", "p7zip_jll"] +git-tree-sha1 = "27442171f28c952804dede8ff72828a96f2bfc1f" +uuid = "28b8d3ca-fb5f-59d9-8090-bfdbd6d07a71" +version = "0.72.10" + +[[deps.GR_jll]] +deps = ["Artifacts", "Bzip2_jll", "Cairo_jll", "FFMPEG_jll", "Fontconfig_jll", "FreeType2_jll", "GLFW_jll", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Libtiff_jll", "Pixman_jll", "Qt6Base_jll", "Zlib_jll", "libpng_jll"] +git-tree-sha1 = "025d171a2847f616becc0f84c8dc62fe18f0f6dd" +uuid = "d2c73de3-f751-5644-a686-071e5b155ba9" +version = "0.72.10+0" + +[[deps.GenericSchur]] +deps = ["LinearAlgebra", "Printf"] +git-tree-sha1 = "af49a0851f8113fcfae2ef5027c6d49d0acec39b" +uuid = "c145ed77-6b09-5dd9-b285-bf645a82121e" +version = "0.5.4" + +[[deps.Gettext_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Libiconv_jll", "Pkg", "XML2_jll"] +git-tree-sha1 = "9b02998aba7bf074d14de89f9d37ca24a1a0b046" +uuid = "78b55507-aeef-58d4-861c-77aaff3498b1" +version = "0.21.0+0" + +[[deps.Glib_jll]] +deps = ["Artifacts", "Gettext_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Libiconv_jll", "Libmount_jll", "PCRE2_jll", "Zlib_jll"] +git-tree-sha1 = "359a1ba2e320790ddbe4ee8b4d54a305c0ea2aff" +uuid = "7746bdde-850d-59dc-9ae8-88ece973131d" +version = "2.80.0+0" + +[[deps.Glob]] +git-tree-sha1 = "97285bbd5230dd766e9ef6749b80fc617126d496" +uuid = "c27321d9-0574-5035-807b-f59d2c89b15c" +version = "1.3.1" + +[[deps.Graphite2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "344bf40dcab1073aca04aa0df4fb092f920e4011" +uuid = "3b182d85-2403-5c21-9c21-1e1f0cc25472" +version = "1.3.14+0" + +[[deps.Graphs]] +deps = ["ArnoldiMethod", "Compat", "DataStructures", "Distributed", "Inflate", "LinearAlgebra", "Random", "SharedArrays", "SimpleTraits", "SparseArrays", "Statistics"] +git-tree-sha1 = "4f2b57488ac7ee16124396de4f2bbdd51b2602ad" +uuid = "86223c79-3864-5bf0-83f7-82e725a168b6" +version = "1.11.0" + +[[deps.Grisu]] +git-tree-sha1 = "53bb909d1151e57e2484c3d1b53e19552b887fb2" +uuid = "42e2da0e-8278-4e71-bc24-59509adca0fe" +version = "1.0.2" + +[[deps.Groebner]] +deps = ["AbstractAlgebra", "Combinatorics", "ExprTools", "Logging", "MultivariatePolynomials", "PrecompileTools", "PrettyTables", "Primes", "Printf", "Random", "SIMD", "TimerOutputs"] +git-tree-sha1 = "6b505ef15e55bdc5bb3ddbcfebdff1c9e67081e8" +uuid = "0b43b601-686d-58a3-8a1c-6623616c7cd4" +version = "0.5.1" + +[[deps.GroupsCore]] +deps = ["Markdown", "Random"] +git-tree-sha1 = "6df9cd6ee79fc59feab33f63a1b3c9e95e2461d5" +uuid = "d5909c97-4eac-4ecc-a3dc-fdd0858a4120" +version = "0.4.2" + +[[deps.HTTP]] +deps = ["Base64", "CodecZlib", "ConcurrentUtilities", "Dates", "ExceptionUnwrapping", "Logging", "LoggingExtras", "MbedTLS", "NetworkOptions", "OpenSSL", "Random", "SimpleBufferStream", "Sockets", "URIs", "UUIDs"] +git-tree-sha1 = "ab5b37dc4f98fc037527968852a6f9b2bdf9f32d" +uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3" +version = "1.10.7" + +[[deps.HarfBuzz_jll]] +deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "Graphite2_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Pkg"] +git-tree-sha1 = "129acf094d168394e80ee1dc4bc06ec835e510a3" +uuid = "2e76f6c2-a576-52d4-95c1-20adfe4de566" +version = "2.8.1+1" + +[[deps.HostCPUFeatures]] +deps = ["BitTwiddlingConvenienceFunctions", "IfElse", "Libdl", "Static"] +git-tree-sha1 = "eb8fed28f4994600e29beef49744639d985a04b2" +uuid = "3e5b6fbb-0976-4d2c-9146-d79de83f2fb0" +version = "0.1.16" + +[[deps.HypergeometricFunctions]] +deps = ["DualNumbers", "LinearAlgebra", "OpenLibm_jll", "SpecialFunctions"] +git-tree-sha1 = "f218fe3736ddf977e0e772bc9a586b2383da2685" +uuid = "34004b35-14d8-5ef3-9330-4cdb6864b03a" +version = "0.3.23" + +[[deps.Hyperscript]] +deps = ["Test"] +git-tree-sha1 = "179267cfa5e712760cd43dcae385d7ea90cc25a4" +uuid = "47d2ed2b-36de-50cf-bf87-49c2cf4b8b91" +version = "0.0.5" + +[[deps.HypertextLiteral]] +deps = ["Tricks"] +git-tree-sha1 = "7134810b1afce04bbc1045ca1985fbe81ce17653" +uuid = "ac1192a8-f4b3-4bfe-ba22-af5b92cd3ab2" +version = "0.9.5" + +[[deps.IOCapture]] +deps = ["Logging", "Random"] +git-tree-sha1 = "8b72179abc660bfab5e28472e019392b97d0985c" +uuid = "b5f81e59-6552-4d32-b1f0-c071b021bf89" +version = "0.2.4" + +[[deps.IfElse]] +git-tree-sha1 = "debdd00ffef04665ccbb3e150747a77560e8fad1" +uuid = "615f187c-cbe4-4ef1-ba3b-2fcf58d6d173" +version = "0.1.1" + +[[deps.Inflate]] +git-tree-sha1 = "ea8031dea4aff6bd41f1df8f2fdfb25b33626381" +uuid = "d25df0c9-e2be-5dd7-82c8-3ad0b3e990b9" +version = "0.1.4" + +[[deps.IntegerMathUtils]] +git-tree-sha1 = "b8ffb903da9f7b8cf695a8bead8e01814aa24b30" +uuid = "18e54dd8-cb9d-406c-a71d-865a43cbb235" +version = "0.1.2" + +[[deps.IntelOpenMP_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "be50fe8df3acbffa0274a744f1a99d29c45a57f4" +uuid = "1d5cc7b8-4909-519e-a0f8-d0f5ad9712d0" +version = "2024.1.0+0" + +[[deps.InteractiveUtils]] +deps = ["Markdown"] +uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" + +[[deps.IntervalSets]] +git-tree-sha1 = "dba9ddf07f77f60450fe5d2e2beb9854d9a49bd0" +uuid = "8197267c-284f-5f27-9208-e0e47529a953" +version = "0.7.10" +weakdeps = ["Random", "RecipesBase", "Statistics"] + + [deps.IntervalSets.extensions] + IntervalSetsRandomExt = "Random" + IntervalSetsRecipesBaseExt = "RecipesBase" + IntervalSetsStatisticsExt = "Statistics" + +[[deps.IrrationalConstants]] +git-tree-sha1 = "630b497eafcc20001bba38a4651b327dcfc491d2" +uuid = "92d709cd-6900-40b7-9082-c6be49f344b6" +version = "0.2.2" + +[[deps.IteratorInterfaceExtensions]] +git-tree-sha1 = "a3f24677c21f5bbe9d2a714f95dcd58337fb2856" +uuid = "82899510-4779-5014-852e-03e436cf321d" +version = "1.0.0" + +[[deps.JLFzf]] +deps = ["Pipe", "REPL", "Random", "fzf_jll"] +git-tree-sha1 = "a53ebe394b71470c7f97c2e7e170d51df21b17af" +uuid = "1019f520-868f-41f5-a6de-eb00f4b6a39c" +version = "0.1.7" + +[[deps.JLLWrappers]] +deps = ["Artifacts", "Preferences"] +git-tree-sha1 = "7e5d6779a1e09a36db2a7b6cff50942a0a7d0fca" +uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" +version = "1.5.0" + +[[deps.JSON]] +deps = ["Dates", "Mmap", "Parsers", "Unicode"] +git-tree-sha1 = "31e996f0a15c7b280ba9f76636b3ff9e2ae58c9a" +uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" +version = "0.21.4" + +[[deps.JpegTurbo_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "c84a835e1a09b289ffcd2271bf2a337bbdda6637" +uuid = "aacddb02-875f-59d6-b918-886e6ef4fbf8" +version = "3.0.3+0" + +[[deps.JuliaFormatter]] +deps = ["CSTParser", "CommonMark", "DataStructures", "Glob", "Pkg", "PrecompileTools", "Tokenize"] +git-tree-sha1 = "1c4880cb70a5c6c87ea36deccc3d7f9e7969c18c" +uuid = "98e50ef6-434e-11e9-1051-2b60c6c9e899" +version = "1.0.56" + +[[deps.JumpProcesses]] +deps = ["ArrayInterface", "DataStructures", "DiffEqBase", "DocStringExtensions", "FunctionWrappers", "Graphs", "LinearAlgebra", "Markdown", "PoissonRandom", "Random", "RandomNumbers", "RecursiveArrayTools", "Reexport", "SciMLBase", "StaticArrays", "UnPack"] +git-tree-sha1 = "c451feb97251965a9fe40bacd62551a72cc5902c" +uuid = "ccbc3e58-028d-4f4c-8cd5-9ae44345cda5" +version = "9.10.1" +weakdeps = ["FastBroadcast"] + + [deps.JumpProcesses.extensions] + JumpProcessFastBroadcastExt = "FastBroadcast" + +[[deps.KLU]] +deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse_jll"] +git-tree-sha1 = "884c2968c2e8e7e6bf5956af88cb46aa745c854b" +uuid = "ef3ab10e-7fda-4108-b977-705223b18434" +version = "0.4.1" + +[[deps.Krylov]] +deps = ["LinearAlgebra", "Printf", "SparseArrays"] +git-tree-sha1 = "267dad6b4b7b5d529c76d40ff48d33f7e94cb834" +uuid = "ba0b0d4f-ebba-5204-a429-3ac8c609bfb7" +version = "0.9.6" + +[[deps.LAME_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "170b660facf5df5de098d866564877e119141cbd" +uuid = "c1c5ebd0-6772-5130-a774-d5fcae4a789d" +version = "3.100.2+0" + +[[deps.LERC_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "bf36f528eec6634efc60d7ec062008f171071434" +uuid = "88015f11-f218-50d7-93a8-a6af411a945d" +version = "3.0.0+1" + +[[deps.LLVMOpenMP_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "d986ce2d884d49126836ea94ed5bfb0f12679713" +uuid = "1d63c593-3942-5779-bab2-d838dc0a180e" +version = "15.0.7+0" + +[[deps.LZO_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "70c5da094887fd2cae843b8db33920bac4b6f07d" +uuid = "dd4b983a-f0e5-5f8d-a1b7-129d4a5fb1ac" +version = "2.10.2+0" + +[[deps.LaTeXStrings]] +git-tree-sha1 = "50901ebc375ed41dbf8058da26f9de442febbbec" +uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" +version = "1.3.1" + +[[deps.LabelledArrays]] +deps = ["ArrayInterface", "ChainRulesCore", "ForwardDiff", "LinearAlgebra", "MacroTools", "PreallocationTools", "RecursiveArrayTools", "StaticArrays"] +git-tree-sha1 = "d1f981fba6eb3ec393eede4821bca3f2b7592cd4" +uuid = "2ee39098-c373-598a-b85f-a56591580800" +version = "1.15.1" + +[[deps.LambertW]] +git-tree-sha1 = "c5ffc834de5d61d00d2b0e18c96267cffc21f648" +uuid = "984bce1d-4616-540c-a9ee-88d1112d94c9" +version = "0.4.6" + +[[deps.Latexify]] +deps = ["Format", "InteractiveUtils", "LaTeXStrings", "MacroTools", "Markdown", "OrderedCollections", "Requires"] +git-tree-sha1 = "e0b5cd21dc1b44ec6e64f351976f961e6f31d6c4" +uuid = "23fbe1c1-3f47-55db-b15f-69d7ec21a316" +version = "0.16.3" + + [deps.Latexify.extensions] + DataFramesExt = "DataFrames" + SymEngineExt = "SymEngine" + + [deps.Latexify.weakdeps] + DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" + SymEngine = "123dc426-2d89-5057-bbad-38513e3affd8" + +[[deps.LayoutPointers]] +deps = ["ArrayInterface", "LinearAlgebra", "ManualMemory", "SIMDTypes", "Static", "StaticArrayInterface"] +git-tree-sha1 = "62edfee3211981241b57ff1cedf4d74d79519277" +uuid = "10f19ff3-798f-405d-979b-55457f8fc047" +version = "0.1.15" + +[[deps.Lazy]] +deps = ["MacroTools"] +git-tree-sha1 = "1370f8202dac30758f3c345f9909b97f53d87d3f" +uuid = "50d2b5c4-7a5e-59d5-8109-a42b560f39c0" +version = "0.15.1" + +[[deps.LazyArrays]] +deps = ["ArrayLayouts", "FillArrays", "LinearAlgebra", "MacroTools", "MatrixFactorizations", "SparseArrays"] +git-tree-sha1 = "35079a6a869eecace778bcda8641f9a54ca3a828" +uuid = "5078a376-72f3-5289-bfd5-ec5146d43c02" +version = "1.10.0" +weakdeps = ["StaticArrays"] + + [deps.LazyArrays.extensions] + LazyArraysStaticArraysExt = "StaticArrays" + +[[deps.LazyArtifacts]] +deps = ["Artifacts", "Pkg"] +uuid = "4af54fe1-eca0-43a8-85a7-787d91b784e3" + +[[deps.LevyArea]] +deps = ["LinearAlgebra", "Random", "SpecialFunctions"] +git-tree-sha1 = "56513a09b8e0ae6485f34401ea9e2f31357958ec" +uuid = "2d8b4e74-eb68-11e8-0fb9-d5eb67b50637" +version = "1.0.0" + +[[deps.LibCURL]] +deps = ["LibCURL_jll", "MozillaCACerts_jll"] +uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" +version = "0.6.3" + +[[deps.LibCURL_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] +uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" +version = "7.84.0+0" + +[[deps.LibGit2]] +deps = ["Base64", "NetworkOptions", "Printf", "SHA"] +uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" + +[[deps.LibSSH2_jll]] +deps = ["Artifacts", "Libdl", "MbedTLS_jll"] +uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" +version = "1.10.2+0" + +[[deps.Libdl]] +uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" + +[[deps.Libffi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "0b4a5d71f3e5200a7dff793393e09dfc2d874290" +uuid = "e9f186c6-92d2-5b65-8a66-fee21dc1b490" +version = "3.2.2+1" + +[[deps.Libgcrypt_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgpg_error_jll"] +git-tree-sha1 = "9fd170c4bbfd8b935fdc5f8b7aa33532c991a673" +uuid = "d4300ac3-e22c-5743-9152-c294e39db1e4" +version = "1.8.11+0" + +[[deps.Libglvnd_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll", "Xorg_libXext_jll"] +git-tree-sha1 = "6f73d1dd803986947b2c750138528a999a6c7733" +uuid = "7e76a0d4-f3c7-5321-8279-8d96eeed0f29" +version = "1.6.0+0" + +[[deps.Libgpg_error_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "fbb1f2bef882392312feb1ede3615ddc1e9b99ed" +uuid = "7add5ba3-2f88-524e-9cd5-f83b8a55f7b8" +version = "1.49.0+0" + +[[deps.Libiconv_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "f9557a255370125b405568f9767d6d195822a175" +uuid = "94ce4f54-9a6c-5748-9c1c-f9c7231a4531" +version = "1.17.0+0" + +[[deps.Libmount_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "4b683b19157282f50bfd5dcaa2efe5295814ea22" +uuid = "4b2f31a3-9ecc-558c-b454-b3730dcb73e9" +version = "2.40.0+0" + +[[deps.Libtiff_jll]] +deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "LERC_jll", "Libdl", "XZ_jll", "Zlib_jll", "Zstd_jll"] +git-tree-sha1 = "2da088d113af58221c52828a80378e16be7d037a" +uuid = "89763e89-9b03-5906-acba-b20f662cd828" +version = "4.5.1+1" + +[[deps.Libuuid_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "27fd5cc10be85658cacfe11bb81bee216af13eda" +uuid = "38a345b3-de98-5d2b-a5d3-14cd9215e700" +version = "2.40.0+0" + +[[deps.LineSearches]] +deps = ["LinearAlgebra", "NLSolversBase", "NaNMath", "Parameters", "Printf"] +git-tree-sha1 = "7bbea35cec17305fc70a0e5b4641477dc0789d9d" +uuid = "d3d80556-e9d4-5f37-9878-2ab0fcc64255" +version = "7.2.0" + +[[deps.LinearAlgebra]] +deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"] +uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + +[[deps.LinearSolve]] +deps = ["ArrayInterface", "ConcreteStructs", "DocStringExtensions", "EnumX", "FastLapackInterface", "GPUArraysCore", "InteractiveUtils", "KLU", "Krylov", "Libdl", "LinearAlgebra", "MKL_jll", "PrecompileTools", "Preferences", "RecursiveFactorization", "Reexport", "SciMLBase", "SciMLOperators", "Setfield", "SparseArrays", "Sparspak", "StaticArraysCore", "UnPack"] +git-tree-sha1 = "6f8e084deabe3189416c4e505b1c53e1b590cae8" +uuid = "7ed4a6bd-45f5-4d41-b270-4a48e9bafcae" +version = "2.22.1" + + [deps.LinearSolve.extensions] + LinearSolveBandedMatricesExt = "BandedMatrices" + LinearSolveBlockDiagonalsExt = "BlockDiagonals" + LinearSolveCUDAExt = "CUDA" + LinearSolveEnzymeExt = ["Enzyme", "EnzymeCore"] + LinearSolveFastAlmostBandedMatricesExt = ["FastAlmostBandedMatrices"] + LinearSolveHYPREExt = "HYPRE" + LinearSolveIterativeSolversExt = "IterativeSolvers" + LinearSolveKernelAbstractionsExt = "KernelAbstractions" + LinearSolveKrylovKitExt = "KrylovKit" + LinearSolveMetalExt = "Metal" + LinearSolvePardisoExt = "Pardiso" + LinearSolveRecursiveArrayToolsExt = "RecursiveArrayTools" + + [deps.LinearSolve.weakdeps] + BandedMatrices = "aae01518-5342-5314-be14-df237901396f" + BlockDiagonals = "0a1fb500-61f7-11e9-3c65-f5ef3456f9f0" + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9" + EnzymeCore = "f151be2c-9106-41f4-ab19-57ee4f262869" + FastAlmostBandedMatrices = "9d29842c-ecb8-4973-b1e9-a27b1157504e" + HYPRE = "b5ffcf37-a2bd-41ab-a3da-4bd9bc8ad771" + IterativeSolvers = "42fd0dbc-a981-5370-80f2-aaf504508153" + KernelAbstractions = "63c18a36-062a-441e-b654-da1e3ab1ce7c" + KrylovKit = "0b1a1467-8014-51b9-945f-bf0ae24f4b77" + Metal = "dde4c033-4e86-420c-a63e-0dd931031962" + Pardiso = "46dd5b70-b6fb-5a00-ae2d-e8fea33afaf2" + RecursiveArrayTools = "731186ca-8d62-57ce-b412-fbd966d074cd" + +[[deps.LogExpFunctions]] +deps = ["DocStringExtensions", "IrrationalConstants", "LinearAlgebra"] +git-tree-sha1 = "18144f3e9cbe9b15b070288eef858f71b291ce37" +uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688" +version = "0.3.27" + + [deps.LogExpFunctions.extensions] + LogExpFunctionsChainRulesCoreExt = "ChainRulesCore" + LogExpFunctionsChangesOfVariablesExt = "ChangesOfVariables" + LogExpFunctionsInverseFunctionsExt = "InverseFunctions" + + [deps.LogExpFunctions.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + ChangesOfVariables = "9e997f8a-9a97-42d5-a9f1-ce6bfc15e2c0" + InverseFunctions = "3587e190-3f89-42d0-90ee-14403ec27112" + +[[deps.Logging]] +uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" + +[[deps.LoggingExtras]] +deps = ["Dates", "Logging"] +git-tree-sha1 = "c1dd6d7978c12545b4179fb6153b9250c96b0075" +uuid = "e6f89c97-d47a-5376-807f-9c37f3926c36" +version = "1.0.3" + +[[deps.LoopVectorization]] +deps = ["ArrayInterface", "CPUSummary", "CloseOpenIntervals", "DocStringExtensions", "HostCPUFeatures", "IfElse", "LayoutPointers", "LinearAlgebra", "OffsetArrays", "PolyesterWeave", "PrecompileTools", "SIMDTypes", "SLEEFPirates", "Static", "StaticArrayInterface", "ThreadingUtilities", "UnPack", "VectorizationBase"] +git-tree-sha1 = "8f6786d8b2b3248d79db3ad359ce95382d5a6df8" +uuid = "bdcacae8-1622-11e9-2a5c-532679323890" +version = "0.12.170" +weakdeps = ["ChainRulesCore", "ForwardDiff", "SpecialFunctions"] + + [deps.LoopVectorization.extensions] + ForwardDiffExt = ["ChainRulesCore", "ForwardDiff"] + SpecialFunctionsExt = "SpecialFunctions" + +[[deps.MIMEs]] +git-tree-sha1 = "65f28ad4b594aebe22157d6fac869786a255b7eb" +uuid = "6c6e2e6c-3030-632d-7369-2d6c69616d65" +version = "0.1.4" + +[[deps.MKL_jll]] +deps = ["Artifacts", "IntelOpenMP_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "oneTBB_jll"] +git-tree-sha1 = "80b2833b56d466b3858d565adcd16a4a05f2089b" +uuid = "856f044c-d86e-5d09-b602-aeab76dc8ba7" +version = "2024.1.0+0" + +[[deps.MLStyle]] +git-tree-sha1 = "bc38dff0548128765760c79eb7388a4b37fae2c8" +uuid = "d8e11817-5142-5d16-987a-aa16d5891078" +version = "0.4.17" + +[[deps.MacroTools]] +deps = ["Markdown", "Random"] +git-tree-sha1 = "2fa9ee3e63fd3a4f7a9a4f4744a52f4856de82df" +uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" +version = "0.5.13" + +[[deps.ManualMemory]] +git-tree-sha1 = "bcaef4fc7a0cfe2cba636d84cda54b5e4e4ca3cd" +uuid = "d125e4d3-2237-4719-b19c-fa641b8a4667" +version = "0.1.8" + +[[deps.Markdown]] +deps = ["Base64"] +uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" + +[[deps.MatrixFactorizations]] +deps = ["ArrayLayouts", "LinearAlgebra", "Printf", "Random"] +git-tree-sha1 = "6731e0574fa5ee21c02733e397beb133df90de35" +uuid = "a3b82374-2e81-5b9e-98ce-41277c0e4c87" +version = "2.2.0" + +[[deps.MaybeInplace]] +deps = ["ArrayInterface", "LinearAlgebra", "MacroTools", "SparseArrays"] +git-tree-sha1 = "b1f2f92feb0bc201e91c155ef575bcc7d9cc3526" +uuid = "bb5d69b7-63fc-4a16-80bd-7e42200c7bdb" +version = "0.1.2" + +[[deps.MbedTLS]] +deps = ["Dates", "MbedTLS_jll", "MozillaCACerts_jll", "NetworkOptions", "Random", "Sockets"] +git-tree-sha1 = "c067a280ddc25f196b5e7df3877c6b226d390aaf" +uuid = "739be429-bea8-5141-9913-cc70e7f3736d" +version = "1.1.9" + +[[deps.MbedTLS_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" +version = "2.28.2+0" + +[[deps.Measures]] +git-tree-sha1 = "c13304c81eec1ed3af7fc20e75fb6b26092a1102" +uuid = "442fdcdd-2543-5da2-b0f3-8c86c306513e" +version = "0.3.2" + +[[deps.Missings]] +deps = ["DataAPI"] +git-tree-sha1 = "ec4f7fbeab05d7747bdf98eb74d130a2a2ed298d" +uuid = "e1d29d7a-bbdc-5cf2-9ac0-f12de2c33e28" +version = "1.2.0" + +[[deps.Mmap]] +uuid = "a63ad114-7e13-5084-954f-fe012c677804" + +[[deps.ModelingToolkit]] +deps = ["AbstractTrees", "ArrayInterface", "Combinatorics", "Compat", "ConstructionBase", "DataStructures", "DiffEqBase", "DiffEqCallbacks", "DiffRules", "Distributed", "Distributions", "DocStringExtensions", "DomainSets", "ForwardDiff", "FunctionWrappersWrappers", "Graphs", "IfElse", "InteractiveUtils", "JuliaFormatter", "JumpProcesses", "LabelledArrays", "Latexify", "Libdl", "LinearAlgebra", "MLStyle", "MacroTools", "NaNMath", "OrdinaryDiffEq", "PrecompileTools", "RecursiveArrayTools", "Reexport", "RuntimeGeneratedFunctions", "SciMLBase", "Serialization", "Setfield", "SimpleNonlinearSolve", "SparseArrays", "SpecialFunctions", "StaticArrays", "SymbolicIndexingInterface", "SymbolicUtils", "Symbolics", "URIs", "UnPack", "Unitful"] +git-tree-sha1 = "11f35f9619c625c18454a94a9013e7d047501fbf" +uuid = "961ee093-0014-501f-94e3-6117800e7a78" +version = "8.75.0" + + [deps.ModelingToolkit.extensions] + MTKBifurcationKitExt = "BifurcationKit" + MTKDeepDiffsExt = "DeepDiffs" + + [deps.ModelingToolkit.weakdeps] + BifurcationKit = "0f109fa4-8a5d-4b75-95aa-f515264e7665" + DeepDiffs = "ab62b9b5-e342-54a8-a765-a90f495de1a6" + +[[deps.MozillaCACerts_jll]] +uuid = "14a3606d-f60d-562e-9121-12d972cd8159" +version = "2022.10.11" + +[[deps.MuladdMacro]] +git-tree-sha1 = "cac9cc5499c25554cba55cd3c30543cff5ca4fab" +uuid = "46d2c3a1-f734-5fdb-9937-b9b9aeba4221" +version = "0.2.4" + +[[deps.MultivariatePolynomials]] +deps = ["ChainRulesCore", "DataStructures", "LinearAlgebra", "MutableArithmetics"] +git-tree-sha1 = "769c9175942d91ed9b83fa929eee4fe6a1d128ad" +uuid = "102ac46a-7ee4-5c85-9060-abc95bfdeaa3" +version = "0.5.4" + +[[deps.MutableArithmetics]] +deps = ["LinearAlgebra", "SparseArrays", "Test"] +git-tree-sha1 = "a3589efe0005fc4718775d8641b2de9060d23f73" +uuid = "d8a4904e-b15c-11e9-3269-09a3773c0cb0" +version = "1.4.4" + +[[deps.NLSolversBase]] +deps = ["DiffResults", "Distributed", "FiniteDiff", "ForwardDiff"] +git-tree-sha1 = "a0b464d183da839699f4c79e7606d9d186ec172c" +uuid = "d41bc354-129a-5804-8e4c-c37616107c6c" +version = "7.8.3" + +[[deps.NLsolve]] +deps = ["Distances", "LineSearches", "LinearAlgebra", "NLSolversBase", "Printf", "Reexport"] +git-tree-sha1 = "019f12e9a1a7880459d0173c182e6a99365d7ac1" +uuid = "2774e3e8-f4cf-5e23-947b-6d7e65073b56" +version = "4.5.1" + +[[deps.NaNMath]] +deps = ["OpenLibm_jll"] +git-tree-sha1 = "0877504529a3e5c3343c6f8b4c0381e57e4387e4" +uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" +version = "1.0.2" + +[[deps.NetworkOptions]] +uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" +version = "1.2.0" + +[[deps.NonlinearSolve]] +deps = ["ADTypes", "ArrayInterface", "ConcreteStructs", "DiffEqBase", "EnumX", "FastBroadcast", "FastClosures", "FiniteDiff", "ForwardDiff", "LazyArrays", "LineSearches", "LinearAlgebra", "LinearSolve", "MaybeInplace", "PrecompileTools", "Printf", "RecursiveArrayTools", "Reexport", "SciMLBase", "SciMLOperators", "SimpleNonlinearSolve", "SparseArrays", "SparseDiffTools", "StaticArrays", "UnPack"] +git-tree-sha1 = "72b036b728461272ae1b1c3f7096cb4c319d8793" +uuid = "8913a72c-1f9b-4ce2-8d82-65094dcecaec" +version = "3.4.0" + + [deps.NonlinearSolve.extensions] + NonlinearSolveBandedMatricesExt = "BandedMatrices" + NonlinearSolveFastLevenbergMarquardtExt = "FastLevenbergMarquardt" + NonlinearSolveFixedPointAccelerationExt = "FixedPointAcceleration" + NonlinearSolveLeastSquaresOptimExt = "LeastSquaresOptim" + NonlinearSolveMINPACKExt = "MINPACK" + NonlinearSolveNLsolveExt = "NLsolve" + NonlinearSolveSIAMFANLEquationsExt = "SIAMFANLEquations" + NonlinearSolveSpeedMappingExt = "SpeedMapping" + NonlinearSolveSymbolicsExt = "Symbolics" + NonlinearSolveZygoteExt = "Zygote" + + [deps.NonlinearSolve.weakdeps] + BandedMatrices = "aae01518-5342-5314-be14-df237901396f" + FastLevenbergMarquardt = "7a0df574-e128-4d35-8cbd-3d84502bf7ce" + FixedPointAcceleration = "817d07cb-a79a-5c30-9a31-890123675176" + LeastSquaresOptim = "0fc2ff8b-aaa3-5acd-a817-1944a5e08891" + MINPACK = "4854310b-de5a-5eb6-a2a5-c1dee2bd17f9" + NLsolve = "2774e3e8-f4cf-5e23-947b-6d7e65073b56" + SIAMFANLEquations = "084e46ad-d928-497d-ad5e-07fa361a48c4" + SpeedMapping = "f1835b91-879b-4a3f-a438-e4baacf14412" + Symbolics = "0c5d862f-8b57-4792-8d23-62f2024744c7" + Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f" + +[[deps.OffsetArrays]] +git-tree-sha1 = "e64b4f5ea6b7389f6f046d13d4896a8f9c1ba71e" +uuid = "6fe1bfb0-de20-5000-8ca7-80f57d26f881" +version = "1.14.0" +weakdeps = ["Adapt"] + + [deps.OffsetArrays.extensions] + OffsetArraysAdaptExt = "Adapt" + +[[deps.Ogg_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "887579a3eb005446d514ab7aeac5d1d027658b8f" +uuid = "e7412a2a-1a6e-54c0-be00-318e2571c051" +version = "1.3.5+1" + +[[deps.OpenBLAS_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] +uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" +version = "0.3.21+4" + +[[deps.OpenLibm_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "05823500-19ac-5b8b-9628-191a04bc5112" +version = "0.8.1+0" + +[[deps.OpenSSL]] +deps = ["BitFlags", "Dates", "MozillaCACerts_jll", "OpenSSL_jll", "Sockets"] +git-tree-sha1 = "38cb508d080d21dc1128f7fb04f20387ed4c0af4" +uuid = "4d8831e6-92b7-49fb-bdf8-b643e874388c" +version = "1.4.3" + +[[deps.OpenSSL_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "3da7367955dcc5c54c1ba4d402ccdc09a1a3e046" +uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95" +version = "3.0.13+1" + +[[deps.OpenSpecFun_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "13652491f6856acfd2db29360e1bbcd4565d04f1" +uuid = "efe28fd5-8261-553b-a9e1-b2916fc3738e" +version = "0.5.5+0" + +[[deps.Optim]] +deps = ["Compat", "FillArrays", "ForwardDiff", "LineSearches", "LinearAlgebra", "NLSolversBase", "NaNMath", "Parameters", "PositiveFactorizations", "Printf", "SparseArrays", "StatsBase"] +git-tree-sha1 = "d9b79c4eed437421ac4285148fcadf42e0700e89" +uuid = "429524aa-4258-5aef-a3af-852621145aeb" +version = "1.9.4" + + [deps.Optim.extensions] + OptimMOIExt = "MathOptInterface" + + [deps.Optim.weakdeps] + MathOptInterface = "b8f27783-ece8-5eb3-8dc8-9495eed66fee" + +[[deps.Opus_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "51a08fb14ec28da2ec7a927c4337e4332c2a4720" +uuid = "91d4177d-7536-5919-b921-800302f37372" +version = "1.3.2+0" + +[[deps.OrderedCollections]] +git-tree-sha1 = "dfdf5519f235516220579f949664f1bf44e741c5" +uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" +version = "1.6.3" + +[[deps.OrdinaryDiffEq]] +deps = ["ADTypes", "Adapt", "ArrayInterface", "DataStructures", "DiffEqBase", "DocStringExtensions", "ExponentialUtilities", "FastBroadcast", "FastClosures", "FillArrays", "FiniteDiff", "ForwardDiff", "FunctionWrappersWrappers", "IfElse", "InteractiveUtils", "LineSearches", "LinearAlgebra", "LinearSolve", "Logging", "LoopVectorization", "MacroTools", "MuladdMacro", "NonlinearSolve", "Polyester", "PreallocationTools", "PrecompileTools", "Preferences", "RecursiveArrayTools", "Reexport", "SciMLBase", "SciMLOperators", "SimpleNonlinearSolve", "SimpleUnPack", "SparseArrays", "SparseDiffTools", "StaticArrayInterface", "StaticArrays", "TruncatedStacktraces"] +git-tree-sha1 = "96ae028da53cdfe24712ab015a6f854cfd7609c0" +uuid = "1dea7af3-3e70-54e6-95c3-0bf5283fa5ed" +version = "6.66.0" + +[[deps.PCRE2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "efcefdf7-47ab-520b-bdef-62a2eaa19f15" +version = "10.42.0+0" + +[[deps.PDMats]] +deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"] +git-tree-sha1 = "949347156c25054de2db3b166c52ac4728cbad65" +uuid = "90014a1f-27ba-587c-ab20-58faa44d9150" +version = "0.11.31" + +[[deps.PackageExtensionCompat]] +git-tree-sha1 = "fb28e33b8a95c4cee25ce296c817d89cc2e53518" +uuid = "65ce6f38-6b18-4e1d-a461-8949797d7930" +version = "1.0.2" +weakdeps = ["Requires", "TOML"] + +[[deps.Parameters]] +deps = ["OrderedCollections", "UnPack"] +git-tree-sha1 = "34c0e9ad262e5f7fc75b10a9952ca7692cfc5fbe" +uuid = "d96e819e-fc66-5662-9728-84c9c7592b0a" +version = "0.12.3" + +[[deps.Parsers]] +deps = ["Dates", "PrecompileTools", "UUIDs"] +git-tree-sha1 = "8489905bcdbcfac64d1daa51ca07c0d8f0283821" +uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" +version = "2.8.1" + +[[deps.Pipe]] +git-tree-sha1 = "6842804e7867b115ca9de748a0cf6b364523c16d" +uuid = "b98c9c47-44ae-5843-9183-064241ee97a0" +version = "1.3.0" + +[[deps.Pixman_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LLVMOpenMP_jll", "Libdl"] +git-tree-sha1 = "64779bc4c9784fee475689a1752ef4d5747c5e87" +uuid = "30392449-352a-5448-841d-b1acce4e97dc" +version = "0.42.2+0" + +[[deps.Pkg]] +deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] +uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" +version = "1.9.0" + +[[deps.PlotThemes]] +deps = ["PlotUtils", "Statistics"] +git-tree-sha1 = "1f03a2d339f42dca4a4da149c7e15e9b896ad899" +uuid = "ccf2f8ad-2431-5c83-bf29-c5338b663b6a" +version = "3.1.0" + +[[deps.PlotUtils]] +deps = ["ColorSchemes", "Colors", "Dates", "PrecompileTools", "Printf", "Random", "Reexport", "Statistics"] +git-tree-sha1 = "7b1a9df27f072ac4c9c7cbe5efb198489258d1f5" +uuid = "995b91a9-d308-5afd-9ec6-746e21dbc043" +version = "1.4.1" + +[[deps.Plots]] +deps = ["Base64", "Contour", "Dates", "Downloads", "FFMPEG", "FixedPointNumbers", "GR", "JLFzf", "JSON", "LaTeXStrings", "Latexify", "LinearAlgebra", "Measures", "NaNMath", "Pkg", "PlotThemes", "PlotUtils", "PrecompileTools", "Preferences", "Printf", "REPL", "Random", "RecipesBase", "RecipesPipeline", "Reexport", "RelocatableFolders", "Requires", "Scratch", "Showoff", "SparseArrays", "Statistics", "StatsBase", "UUIDs", "UnicodeFun", "UnitfulLatexify", "Unzip"] +git-tree-sha1 = "ccee59c6e48e6f2edf8a5b64dc817b6729f99eb5" +uuid = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" +version = "1.39.0" + + [deps.Plots.extensions] + FileIOExt = "FileIO" + GeometryBasicsExt = "GeometryBasics" + IJuliaExt = "IJulia" + ImageInTerminalExt = "ImageInTerminal" + UnitfulExt = "Unitful" + + [deps.Plots.weakdeps] + FileIO = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" + GeometryBasics = "5c1252a2-5f33-56bf-86c9-59e7332b4326" + IJulia = "7073ff75-c697-5162-941a-fcdaad2a7d2a" + ImageInTerminal = "d8c32880-2388-543b-8c61-d9f865259254" + Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" + +[[deps.PlutoUI]] +deps = ["AbstractPlutoDingetjes", "Base64", "ColorTypes", "Dates", "FixedPointNumbers", "Hyperscript", "HypertextLiteral", "IOCapture", "InteractiveUtils", "JSON", "Logging", "MIMEs", "Markdown", "Random", "Reexport", "URIs", "UUIDs"] +git-tree-sha1 = "ab55ee1510ad2af0ff674dbcced5e94921f867a9" +uuid = "7f904dfe-b85e-4ff6-b463-dae2292396a8" +version = "0.7.59" + +[[deps.PoissonRandom]] +deps = ["Random"] +git-tree-sha1 = "a0f1159c33f846aa77c3f30ebbc69795e5327152" +uuid = "e409e4f3-bfea-5376-8464-e040bb5c01ab" +version = "0.4.4" + +[[deps.Polyester]] +deps = ["ArrayInterface", "BitTwiddlingConvenienceFunctions", "CPUSummary", "IfElse", "ManualMemory", "PolyesterWeave", "Requires", "Static", "StaticArrayInterface", "StrideArraysCore", "ThreadingUtilities"] +git-tree-sha1 = "2ba5f33cbb51a85ef58a850749492b08f9bf2193" +uuid = "f517fe37-dbe3-4b94-8317-1923a5111588" +version = "0.7.13" + +[[deps.PolyesterWeave]] +deps = ["BitTwiddlingConvenienceFunctions", "CPUSummary", "IfElse", "Static", "ThreadingUtilities"] +git-tree-sha1 = "240d7170f5ffdb285f9427b92333c3463bf65bf6" +uuid = "1d0040c9-8b98-4ee7-8388-3f51789ca0ad" +version = "0.2.1" + +[[deps.PositiveFactorizations]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "17275485f373e6673f7e7f97051f703ed5b15b20" +uuid = "85a6dd25-e78a-55b7-8502-1745935b8125" +version = "0.2.4" + +[[deps.PreallocationTools]] +deps = ["Adapt", "ArrayInterface", "ForwardDiff", "Requires"] +git-tree-sha1 = "01ac95fca7daabe77a9cb705862bd87016af9ddb" +uuid = "d236fae5-4411-538c-8e31-a6e3d9e00b46" +version = "0.4.13" + + [deps.PreallocationTools.extensions] + PreallocationToolsReverseDiffExt = "ReverseDiff" + + [deps.PreallocationTools.weakdeps] + ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + +[[deps.PrecompileTools]] +deps = ["Preferences"] +git-tree-sha1 = "5aa36f7049a63a1528fe8f7c3f2113413ffd4e1f" +uuid = "aea7be01-6a6a-4083-8856-8a6e6704d82a" +version = "1.2.1" + +[[deps.Preferences]] +deps = ["TOML"] +git-tree-sha1 = "9306f6085165d270f7e3db02af26a400d580f5c6" +uuid = "21216c6a-2e73-6563-6e65-726566657250" +version = "1.4.3" + +[[deps.PrettyTables]] +deps = ["Crayons", "LaTeXStrings", "Markdown", "PrecompileTools", "Printf", "Reexport", "StringManipulation", "Tables"] +git-tree-sha1 = "88b895d13d53b5577fd53379d913b9ab9ac82660" +uuid = "08abe8d2-0d0c-5749-adfa-8a2ac140af0d" +version = "2.3.1" + +[[deps.Primes]] +deps = ["IntegerMathUtils"] +git-tree-sha1 = "cb420f77dc474d23ee47ca8d14c90810cafe69e7" +uuid = "27ebfcd6-29c5-5fa9-bf4b-fb8fc14df3ae" +version = "0.5.6" + +[[deps.Printf]] +deps = ["Unicode"] +uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" + +[[deps.Qt6Base_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Fontconfig_jll", "Glib_jll", "JLLWrappers", "Libdl", "Libglvnd_jll", "OpenSSL_jll", "Vulkan_Loader_jll", "Xorg_libSM_jll", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Xorg_libxcb_jll", "Xorg_xcb_util_cursor_jll", "Xorg_xcb_util_image_jll", "Xorg_xcb_util_keysyms_jll", "Xorg_xcb_util_renderutil_jll", "Xorg_xcb_util_wm_jll", "Zlib_jll", "libinput_jll", "xkbcommon_jll"] +git-tree-sha1 = "37b7bb7aabf9a085e0044307e1717436117f2b3b" +uuid = "c0090381-4147-56d7-9ebc-da0b1113ec56" +version = "6.5.3+1" + +[[deps.QuadGK]] +deps = ["DataStructures", "LinearAlgebra"] +git-tree-sha1 = "9b23c31e76e333e6fb4c1595ae6afa74966a729e" +uuid = "1fd47b50-473d-5c70-9696-f719f8f3bcdc" +version = "2.9.4" + +[[deps.REPL]] +deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] +uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" + +[[deps.Random]] +deps = ["SHA", "Serialization"] +uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" + +[[deps.Random123]] +deps = ["Random", "RandomNumbers"] +git-tree-sha1 = "4743b43e5a9c4a2ede372de7061eed81795b12e7" +uuid = "74087812-796a-5b5d-8853-05524746bad3" +version = "1.7.0" + +[[deps.RandomExtensions]] +deps = ["Random", "SparseArrays"] +git-tree-sha1 = "b8a399e95663485820000f26b6a43c794e166a49" +uuid = "fb686558-2515-59ef-acaa-46db3789a887" +version = "0.4.4" + +[[deps.RandomNumbers]] +deps = ["Random", "Requires"] +git-tree-sha1 = "043da614cc7e95c703498a491e2c21f58a2b8111" +uuid = "e6cf234a-135c-5ec9-84dd-332b85af5143" +version = "1.5.3" + +[[deps.RecipesBase]] +deps = ["PrecompileTools"] +git-tree-sha1 = "5c3d09cc4f31f5fc6af001c250bf1278733100ff" +uuid = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" +version = "1.3.4" + +[[deps.RecipesPipeline]] +deps = ["Dates", "NaNMath", "PlotUtils", "PrecompileTools", "RecipesBase"] +git-tree-sha1 = "45cf9fd0ca5839d06ef333c8201714e888486342" +uuid = "01d81517-befc-4cb6-b9ec-a95719d0359c" +version = "0.6.12" + +[[deps.RecursiveArrayTools]] +deps = ["Adapt", "ArrayInterface", "DocStringExtensions", "GPUArraysCore", "IteratorInterfaceExtensions", "LinearAlgebra", "RecipesBase", "Requires", "SparseArrays", "StaticArraysCore", "Statistics", "SymbolicIndexingInterface", "Tables"] +git-tree-sha1 = "27ee1c03e732c488ecce1a25f0d7da9b5d936574" +uuid = "731186ca-8d62-57ce-b412-fbd966d074cd" +version = "3.3.3" + + [deps.RecursiveArrayTools.extensions] + RecursiveArrayToolsFastBroadcastExt = "FastBroadcast" + RecursiveArrayToolsMeasurementsExt = "Measurements" + RecursiveArrayToolsMonteCarloMeasurementsExt = "MonteCarloMeasurements" + RecursiveArrayToolsTrackerExt = "Tracker" + RecursiveArrayToolsZygoteExt = "Zygote" + + [deps.RecursiveArrayTools.weakdeps] + FastBroadcast = "7034ab61-46d4-4ed7-9d0f-46aef9175898" + Measurements = "eff96d63-e80a-5855-80a2-b1b0885c5ab7" + MonteCarloMeasurements = "0987c9cc-fe09-11e8-30f0-b96dd679fdca" + Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" + Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f" + +[[deps.RecursiveFactorization]] +deps = ["LinearAlgebra", "LoopVectorization", "Polyester", "PrecompileTools", "StrideArraysCore", "TriangularSolve"] +git-tree-sha1 = "c04dacfc546591d43c39dc529c922d6a06a5a694" +uuid = "f2c3362d-daeb-58d1-803e-2bc74f2840b4" +version = "0.2.22" + +[[deps.Reexport]] +git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" +uuid = "189a3867-3050-52da-a836-e630ba90ab69" +version = "1.2.2" + +[[deps.RelocatableFolders]] +deps = ["SHA", "Scratch"] +git-tree-sha1 = "ffdaf70d81cf6ff22c2b6e733c900c3321cab864" +uuid = "05181044-ff0b-4ac5-8273-598c1e38db00" +version = "1.0.1" + +[[deps.Requires]] +deps = ["UUIDs"] +git-tree-sha1 = "838a3a4188e2ded87a4f9f184b4b0d78a1e91cb7" +uuid = "ae029012-a4dd-5104-9daa-d747884805df" +version = "1.3.0" + +[[deps.ResettableStacks]] +deps = ["StaticArrays"] +git-tree-sha1 = "256eeeec186fa7f26f2801732774ccf277f05db9" +uuid = "ae5879a3-cd67-5da8-be7f-38c6eb64a37b" +version = "1.1.1" + +[[deps.Rmath]] +deps = ["Random", "Rmath_jll"] +git-tree-sha1 = "f65dcb5fa46aee0cf9ed6274ccbd597adc49aa7b" +uuid = "79098fc4-a85e-5d69-aa6a-4863f24498fa" +version = "0.7.1" + +[[deps.Rmath_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "6ed52fdd3382cf21947b15e8870ac0ddbff736da" +uuid = "f50d1b31-88e8-58de-be2c-1cc44531875f" +version = "0.4.0+0" + +[[deps.RuntimeGeneratedFunctions]] +deps = ["ExprTools", "SHA", "Serialization"] +git-tree-sha1 = "6aacc5eefe8415f47b3e34214c1d79d2674a0ba2" +uuid = "7e49a35a-f44a-4d26-94aa-eba1b4ca6b47" +version = "0.5.12" + +[[deps.SHA]] +uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" +version = "0.7.0" + +[[deps.SIMD]] +deps = ["PrecompileTools"] +git-tree-sha1 = "d8911cc125da009051fb35322415641d02d9e37f" +uuid = "fdea26ae-647d-5447-a871-4b548cad5224" +version = "3.4.6" + +[[deps.SIMDTypes]] +git-tree-sha1 = "330289636fb8107c5f32088d2741e9fd7a061a5c" +uuid = "94e857df-77ce-4151-89e5-788b33177be4" +version = "0.1.0" + +[[deps.SLEEFPirates]] +deps = ["IfElse", "Static", "VectorizationBase"] +git-tree-sha1 = "3aac6d68c5e57449f5b9b865c9ba50ac2970c4cf" +uuid = "476501e8-09a2-5ece-8869-fb82de89a1fa" +version = "0.6.42" + +[[deps.SciMLBase]] +deps = ["ADTypes", "ArrayInterface", "CommonSolve", "ConstructionBase", "Distributed", "DocStringExtensions", "EnumX", "FillArrays", "FunctionWrappersWrappers", "IteratorInterfaceExtensions", "LinearAlgebra", "Logging", "Markdown", "PrecompileTools", "Preferences", "Printf", "RecipesBase", "RecursiveArrayTools", "Reexport", "RuntimeGeneratedFunctions", "SciMLOperators", "StaticArraysCore", "Statistics", "SymbolicIndexingInterface", "Tables", "TruncatedStacktraces"] +git-tree-sha1 = "09324a0ae70c52a45b91b236c62065f78b099c37" +uuid = "0bca4576-84f4-4d90-8ffe-ffa030f20462" +version = "2.15.2" + + [deps.SciMLBase.extensions] + SciMLBaseChainRulesCoreExt = "ChainRulesCore" + SciMLBasePartialFunctionsExt = "PartialFunctions" + SciMLBasePyCallExt = "PyCall" + SciMLBasePythonCallExt = "PythonCall" + SciMLBaseRCallExt = "RCall" + SciMLBaseZygoteExt = "Zygote" + + [deps.SciMLBase.weakdeps] + ChainRules = "082447d4-558c-5d27-93f4-14fc19e9eca2" + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + PartialFunctions = "570af359-4316-4cb7-8c74-252c00c2016b" + PyCall = "438e738f-606a-5dbb-bf0a-cddfbfd45ab0" + PythonCall = "6099a3de-0909-46bc-b1f4-468b9a2dfc0d" + RCall = "6f49c342-dc21-5d91-9882-a32aef131414" + Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f" + +[[deps.SciMLOperators]] +deps = ["ArrayInterface", "DocStringExtensions", "Lazy", "LinearAlgebra", "Setfield", "SparseArrays", "StaticArraysCore", "Tricks"] +git-tree-sha1 = "51ae235ff058a64815e0a2c34b1db7578a06813d" +uuid = "c0aeaf25-5076-4817-a8d5-81caf7dfa961" +version = "0.3.7" + +[[deps.Scratch]] +deps = ["Dates"] +git-tree-sha1 = "3bac05bc7e74a75fd9cba4295cde4045d9fe2386" +uuid = "6c6a2e73-6563-6170-7368-637461726353" +version = "1.2.1" + +[[deps.Serialization]] +uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" + +[[deps.Setfield]] +deps = ["ConstructionBase", "Future", "MacroTools", "StaticArraysCore"] +git-tree-sha1 = "e2cc6d8c88613c05e1defb55170bf5ff211fbeac" +uuid = "efcf1570-3423-57d1-acb7-fd33fddbac46" +version = "1.1.1" + +[[deps.SharedArrays]] +deps = ["Distributed", "Mmap", "Random", "Serialization"] +uuid = "1a1011a3-84de-559e-8e89-a11a2f7dc383" + +[[deps.Showoff]] +deps = ["Dates", "Grisu"] +git-tree-sha1 = "91eddf657aca81df9ae6ceb20b959ae5653ad1de" +uuid = "992d4aef-0814-514b-bc4d-f2e9a6c4116f" +version = "1.0.3" + +[[deps.SimpleBufferStream]] +git-tree-sha1 = "874e8867b33a00e784c8a7e4b60afe9e037b74e1" +uuid = "777ac1f9-54b0-4bf8-805c-2214025038e7" +version = "1.1.0" + +[[deps.SimpleNonlinearSolve]] +deps = ["ADTypes", "ArrayInterface", "ConcreteStructs", "DiffEqBase", "FastClosures", "FiniteDiff", "ForwardDiff", "LinearAlgebra", "MaybeInplace", "PrecompileTools", "Reexport", "SciMLBase", "StaticArraysCore"] +git-tree-sha1 = "df8266e0d4960d61325db8c54fad3fa95712b57e" +uuid = "727e6d20-b764-4bd8-a329-72de5adea6c7" +version = "1.4.0" + + [deps.SimpleNonlinearSolve.extensions] + SimpleNonlinearSolveChainRulesCoreExt = "ChainRulesCore" + SimpleNonlinearSolvePolyesterForwardDiffExt = "PolyesterForwardDiff" + SimpleNonlinearSolveStaticArraysExt = "StaticArrays" + + [deps.SimpleNonlinearSolve.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + PolyesterForwardDiff = "98d1487c-24ca-40b6-b7ab-df2af84e126b" + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + +[[deps.SimpleTraits]] +deps = ["InteractiveUtils", "MacroTools"] +git-tree-sha1 = "5d7e3f4e11935503d3ecaf7186eac40602e7d231" +uuid = "699a6c99-e7fa-54fc-8d76-47d257e15c1d" +version = "0.9.4" + +[[deps.SimpleUnPack]] +git-tree-sha1 = "58e6353e72cde29b90a69527e56df1b5c3d8c437" +uuid = "ce78b400-467f-4804-87d8-8f486da07d0a" +version = "1.1.0" + +[[deps.Sockets]] +uuid = "6462fe0b-24de-5631-8697-dd941f90decc" + +[[deps.SortingAlgorithms]] +deps = ["DataStructures"] +git-tree-sha1 = "66e0a8e672a0bdfca2c3f5937efb8538b9ddc085" +uuid = "a2af1166-a08f-5f64-846c-94a0d3cef48c" +version = "1.2.1" + +[[deps.SparseArrays]] +deps = ["Libdl", "LinearAlgebra", "Random", "Serialization", "SuiteSparse_jll"] +uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + +[[deps.SparseDiffTools]] +deps = ["ADTypes", "Adapt", "ArrayInterface", "Compat", "DataStructures", "FiniteDiff", "ForwardDiff", "Graphs", "LinearAlgebra", "PackageExtensionCompat", "Random", "Reexport", "SciMLOperators", "Setfield", "SparseArrays", "StaticArrayInterface", "StaticArrays", "Tricks", "UnPack", "VertexSafeGraphs"] +git-tree-sha1 = "cce98ad7c896e52bb0eded174f02fc2a29c38477" +uuid = "47a9eef4-7e08-11e9-0b38-333d64bd3804" +version = "2.18.0" + + [deps.SparseDiffTools.extensions] + SparseDiffToolsEnzymeExt = "Enzyme" + SparseDiffToolsPolyesterExt = "Polyester" + SparseDiffToolsPolyesterForwardDiffExt = "PolyesterForwardDiff" + SparseDiffToolsSymbolicsExt = "Symbolics" + SparseDiffToolsZygoteExt = "Zygote" + + [deps.SparseDiffTools.weakdeps] + Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9" + Polyester = "f517fe37-dbe3-4b94-8317-1923a5111588" + PolyesterForwardDiff = "98d1487c-24ca-40b6-b7ab-df2af84e126b" + Symbolics = "0c5d862f-8b57-4792-8d23-62f2024744c7" + Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f" + +[[deps.Sparspak]] +deps = ["Libdl", "LinearAlgebra", "Logging", "OffsetArrays", "Printf", "SparseArrays", "Test"] +git-tree-sha1 = "342cf4b449c299d8d1ceaf00b7a49f4fbc7940e7" +uuid = "e56a9233-b9d6-4f03-8d0f-1825330902ac" +version = "0.3.9" + +[[deps.SpecialFunctions]] +deps = ["IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"] +git-tree-sha1 = "2f5d4697f21388cbe1ff299430dd169ef97d7e14" +uuid = "276daf66-3868-5448-9aa4-cd146d93841b" +version = "2.4.0" +weakdeps = ["ChainRulesCore"] + + [deps.SpecialFunctions.extensions] + SpecialFunctionsChainRulesCoreExt = "ChainRulesCore" + +[[deps.Static]] +deps = ["IfElse"] +git-tree-sha1 = "b366eb1eb68075745777d80861c6706c33f588ae" +uuid = "aedffcd0-7271-4cad-89d0-dc628f76c6d3" +version = "0.8.9" + +[[deps.StaticArrayInterface]] +deps = ["ArrayInterface", "Compat", "IfElse", "LinearAlgebra", "PrecompileTools", "Requires", "SparseArrays", "Static", "SuiteSparse"] +git-tree-sha1 = "5d66818a39bb04bf328e92bc933ec5b4ee88e436" +uuid = "0d7ed370-da01-4f52-bd93-41d350b8b718" +version = "1.5.0" +weakdeps = ["OffsetArrays", "StaticArrays"] + + [deps.StaticArrayInterface.extensions] + StaticArrayInterfaceOffsetArraysExt = "OffsetArrays" + StaticArrayInterfaceStaticArraysExt = "StaticArrays" + +[[deps.StaticArrays]] +deps = ["LinearAlgebra", "PrecompileTools", "Random", "StaticArraysCore"] +git-tree-sha1 = "bf074c045d3d5ffd956fa0a461da38a44685d6b2" +uuid = "90137ffa-7385-5640-81b9-e52037218182" +version = "1.9.3" +weakdeps = ["ChainRulesCore", "Statistics"] + + [deps.StaticArrays.extensions] + StaticArraysChainRulesCoreExt = "ChainRulesCore" + StaticArraysStatisticsExt = "Statistics" + +[[deps.StaticArraysCore]] +git-tree-sha1 = "36b3d696ce6366023a0ea192b4cd442268995a0d" +uuid = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" +version = "1.4.2" + +[[deps.Statistics]] +deps = ["LinearAlgebra", "SparseArrays"] +uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" +version = "1.9.0" + +[[deps.StatsAPI]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "1ff449ad350c9c4cbc756624d6f8a8c3ef56d3ed" +uuid = "82ae8749-77ed-4fe6-ae5f-f523153014b0" +version = "1.7.0" + +[[deps.StatsBase]] +deps = ["DataAPI", "DataStructures", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"] +git-tree-sha1 = "5cf7606d6cef84b543b483848d4ae08ad9832b21" +uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" +version = "0.34.3" + +[[deps.StatsFuns]] +deps = ["HypergeometricFunctions", "IrrationalConstants", "LogExpFunctions", "Reexport", "Rmath", "SpecialFunctions"] +git-tree-sha1 = "cef0472124fab0695b58ca35a77c6fb942fdab8a" +uuid = "4c63d2b9-4356-54db-8cca-17b64c39e42c" +version = "1.3.1" + + [deps.StatsFuns.extensions] + StatsFunsChainRulesCoreExt = "ChainRulesCore" + StatsFunsInverseFunctionsExt = "InverseFunctions" + + [deps.StatsFuns.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + InverseFunctions = "3587e190-3f89-42d0-90ee-14403ec27112" + +[[deps.SteadyStateDiffEq]] +deps = ["ConcreteStructs", "DiffEqBase", "DiffEqCallbacks", "LinearAlgebra", "Reexport", "SciMLBase"] +git-tree-sha1 = "a735fd5053724cf4de31c81b4e2cc429db844be5" +uuid = "9672c7b4-1e72-59bd-8a11-6ac3964bc41f" +version = "2.0.1" + +[[deps.StochasticDiffEq]] +deps = ["Adapt", "ArrayInterface", "DataStructures", "DiffEqBase", "DiffEqNoiseProcess", "DocStringExtensions", "FiniteDiff", "ForwardDiff", "JumpProcesses", "LevyArea", "LinearAlgebra", "Logging", "MuladdMacro", "NLsolve", "OrdinaryDiffEq", "Random", "RandomNumbers", "RecursiveArrayTools", "Reexport", "SciMLBase", "SciMLOperators", "SparseArrays", "SparseDiffTools", "StaticArrays", "UnPack"] +git-tree-sha1 = "97e5d0b7e5ec2e68eec6626af97c59e9f6b6c3d0" +uuid = "789caeaf-c7a9-5a7d-9973-96adeb23e2a0" +version = "6.65.1" + +[[deps.StrideArraysCore]] +deps = ["ArrayInterface", "CloseOpenIntervals", "IfElse", "LayoutPointers", "LinearAlgebra", "ManualMemory", "SIMDTypes", "Static", "StaticArrayInterface", "ThreadingUtilities"] +git-tree-sha1 = "25349bf8f63aa36acbff5e3550a86e9f5b0ef682" +uuid = "7792a7ef-975c-4747-a70f-980b88e8d1da" +version = "0.5.6" + +[[deps.StringManipulation]] +deps = ["PrecompileTools"] +git-tree-sha1 = "a04cabe79c5f01f4d723cc6704070ada0b9d46d5" +uuid = "892a3eda-7b42-436c-8928-eab12a02cf0e" +version = "0.3.4" + +[[deps.SuiteSparse]] +deps = ["Libdl", "LinearAlgebra", "Serialization", "SparseArrays"] +uuid = "4607b0f0-06f3-5cda-b6b1-a6196a1729e9" + +[[deps.SuiteSparse_jll]] +deps = ["Artifacts", "Libdl", "Pkg", "libblastrampoline_jll"] +uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c" +version = "5.10.1+6" + +[[deps.Sundials]] +deps = ["CEnum", "DataStructures", "DiffEqBase", "Libdl", "LinearAlgebra", "Logging", "PrecompileTools", "Reexport", "SciMLBase", "SparseArrays", "Sundials_jll"] +git-tree-sha1 = "e15f5a73f0d14b9079b807a9d1dac13e4302e997" +uuid = "c3572dad-4567-51f8-b174-8c6c989267f4" +version = "4.24.0" + +[[deps.Sundials_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "OpenBLAS_jll", "Pkg", "SuiteSparse_jll"] +git-tree-sha1 = "04777432d74ec5bc91ca047c9e0e0fd7f81acdb6" +uuid = "fb77eaff-e24c-56d4-86b1-d163f2edb164" +version = "5.2.1+0" + +[[deps.SymbolicIndexingInterface]] +git-tree-sha1 = "be414bfd80c2c91197823890c66ef4b74f5bf5fe" +uuid = "2efcf032-c050-4f8e-a9bb-153293bab1f5" +version = "0.3.1" + +[[deps.SymbolicUtils]] +deps = ["AbstractTrees", "Bijections", "ChainRulesCore", "Combinatorics", "ConstructionBase", "DataStructures", "DocStringExtensions", "DynamicPolynomials", "IfElse", "LabelledArrays", "LinearAlgebra", "MultivariatePolynomials", "NaNMath", "Setfield", "SparseArrays", "SpecialFunctions", "StaticArrays", "SymbolicIndexingInterface", "TimerOutputs", "Unityper"] +git-tree-sha1 = "669e43e90df46fcee4aa859b587da7a7948272ac" +uuid = "d1185830-fcd6-423d-90d6-eec64667417b" +version = "1.5.1" + +[[deps.Symbolics]] +deps = ["ArrayInterface", "Bijections", "ConstructionBase", "DataStructures", "DiffRules", "Distributions", "DocStringExtensions", "DomainSets", "DynamicPolynomials", "Groebner", "IfElse", "LaTeXStrings", "LambertW", "Latexify", "Libdl", "LinearAlgebra", "LogExpFunctions", "MacroTools", "Markdown", "NaNMath", "PrecompileTools", "RecipesBase", "Reexport", "Requires", "RuntimeGeneratedFunctions", "SciMLBase", "Setfield", "SparseArrays", "SpecialFunctions", "StaticArrays", "SymbolicIndexingInterface", "SymbolicUtils"] +git-tree-sha1 = "8d28ebc206dec9e250e21b9502a2662265897650" +uuid = "0c5d862f-8b57-4792-8d23-62f2024744c7" +version = "5.14.1" + + [deps.Symbolics.extensions] + SymbolicsSymPyExt = "SymPy" + + [deps.Symbolics.weakdeps] + SymPy = "24249f21-da20-56a4-8eb1-6a02cf4ae2e6" + +[[deps.TOML]] +deps = ["Dates"] +uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" +version = "1.0.3" + +[[deps.TableTraits]] +deps = ["IteratorInterfaceExtensions"] +git-tree-sha1 = "c06b2f539df1c6efa794486abfb6ed2022561a39" +uuid = "3783bdb8-4a98-5b6b-af9a-565f29a5fe9c" +version = "1.0.1" + +[[deps.Tables]] +deps = ["DataAPI", "DataValueInterfaces", "IteratorInterfaceExtensions", "LinearAlgebra", "OrderedCollections", "TableTraits"] +git-tree-sha1 = "cb76cf677714c095e535e3501ac7954732aeea2d" +uuid = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" +version = "1.11.1" + +[[deps.Tar]] +deps = ["ArgTools", "SHA"] +uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" +version = "1.10.0" + +[[deps.TensorCore]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "1feb45f88d133a655e001435632f019a9a1bcdb6" +uuid = "62fd8b95-f654-4bbd-a8a5-9c27f68ccd50" +version = "0.1.1" + +[[deps.Test]] +deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] +uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[[deps.ThreadingUtilities]] +deps = ["ManualMemory"] +git-tree-sha1 = "eda08f7e9818eb53661b3deb74e3159460dfbc27" +uuid = "8290d209-cae3-49c0-8002-c8c24d57dab5" +version = "0.5.2" + +[[deps.TimerOutputs]] +deps = ["ExprTools", "Printf"] +git-tree-sha1 = "f548a9e9c490030e545f72074a41edfd0e5bcdd7" +uuid = "a759f4b9-e2f1-59dc-863e-4aeb61b1ea8f" +version = "0.5.23" + +[[deps.Tokenize]] +git-tree-sha1 = "468b4685af4abe0e9fd4d7bf495a6554a6276e75" +uuid = "0796e94c-ce3b-5d07-9a54-7f471281c624" +version = "0.5.29" + +[[deps.TranscodingStreams]] +git-tree-sha1 = "5d54d076465da49d6746c647022f3b3674e64156" +uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa" +version = "0.10.8" +weakdeps = ["Random", "Test"] + + [deps.TranscodingStreams.extensions] + TestExt = ["Test", "Random"] + +[[deps.TriangularSolve]] +deps = ["CloseOpenIntervals", "IfElse", "LayoutPointers", "LinearAlgebra", "LoopVectorization", "Polyester", "Static", "VectorizationBase"] +git-tree-sha1 = "fadebab77bf3ae041f77346dd1c290173da5a443" +uuid = "d5829a12-d9aa-46ab-831f-fb7c9ab06edf" +version = "0.1.20" + +[[deps.Tricks]] +git-tree-sha1 = "eae1bb484cd63b36999ee58be2de6c178105112f" +uuid = "410a4b4d-49e4-4fbc-ab6d-cb71b17b3775" +version = "0.1.8" + +[[deps.TruncatedStacktraces]] +deps = ["InteractiveUtils", "MacroTools", "Preferences"] +git-tree-sha1 = "ea3e54c2bdde39062abf5a9758a23735558705e1" +uuid = "781d530d-4396-4725-bb49-402e4bee1e77" +version = "1.4.0" + +[[deps.URIs]] +git-tree-sha1 = "67db6cc7b3821e19ebe75791a9dd19c9b1188f2b" +uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" +version = "1.5.1" + +[[deps.UUIDs]] +deps = ["Random", "SHA"] +uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" + +[[deps.UnPack]] +git-tree-sha1 = "387c1f73762231e86e0c9c5443ce3b4a0a9a0c2b" +uuid = "3a884ed6-31ef-47d7-9d2a-63182c4928ed" +version = "1.0.2" + +[[deps.Unicode]] +uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" + +[[deps.UnicodeFun]] +deps = ["REPL"] +git-tree-sha1 = "53915e50200959667e78a92a418594b428dffddf" +uuid = "1cfade01-22cf-5700-b092-accc4b62d6e1" +version = "0.4.1" + +[[deps.Unitful]] +deps = ["Dates", "LinearAlgebra", "Random"] +git-tree-sha1 = "3c793be6df9dd77a0cf49d80984ef9ff996948fa" +uuid = "1986cc42-f94f-5a68-af5c-568840ba703d" +version = "1.19.0" + + [deps.Unitful.extensions] + ConstructionBaseUnitfulExt = "ConstructionBase" + InverseFunctionsUnitfulExt = "InverseFunctions" + + [deps.Unitful.weakdeps] + ConstructionBase = "187b0558-2788-49d3-abe0-74a17ed4e7c9" + InverseFunctions = "3587e190-3f89-42d0-90ee-14403ec27112" + +[[deps.UnitfulLatexify]] +deps = ["LaTeXStrings", "Latexify", "Unitful"] +git-tree-sha1 = "e2d817cc500e960fdbafcf988ac8436ba3208bfd" +uuid = "45397f5d-5981-4c77-b2b3-fc36d6e9b728" +version = "1.6.3" + +[[deps.Unityper]] +deps = ["ConstructionBase"] +git-tree-sha1 = "25008b734a03736c41e2a7dc314ecb95bd6bbdb0" +uuid = "a7c27f48-0311-42f6-a7f8-2c11e75eb415" +version = "0.1.6" + +[[deps.Unzip]] +git-tree-sha1 = "ca0969166a028236229f63514992fc073799bb78" +uuid = "41fe7b60-77ed-43a1-b4f0-825fd5a5650d" +version = "0.2.0" + +[[deps.VectorizationBase]] +deps = ["ArrayInterface", "CPUSummary", "HostCPUFeatures", "IfElse", "LayoutPointers", "Libdl", "LinearAlgebra", "SIMDTypes", "Static", "StaticArrayInterface"] +git-tree-sha1 = "6129a4faf6242e7c3581116fbe3270f3ab17c90d" +uuid = "3d5dd08c-fd9d-11e8-17fa-ed2836048c2f" +version = "0.21.67" + +[[deps.VertexSafeGraphs]] +deps = ["Graphs"] +git-tree-sha1 = "8351f8d73d7e880bfc042a8b6922684ebeafb35c" +uuid = "19fa3120-7c27-5ec5-8db8-b0b0aa330d6f" +version = "0.2.0" + +[[deps.Vulkan_Loader_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Wayland_jll", "Xorg_libX11_jll", "Xorg_libXrandr_jll", "xkbcommon_jll"] +git-tree-sha1 = "2f0486047a07670caad3a81a075d2e518acc5c59" +uuid = "a44049a8-05dd-5a78-86c9-5fde0876e88c" +version = "1.3.243+0" + +[[deps.Wayland_jll]] +deps = ["Artifacts", "EpollShim_jll", "Expat_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Pkg", "XML2_jll"] +git-tree-sha1 = "7558e29847e99bc3f04d6569e82d0f5c54460703" +uuid = "a2964d1f-97da-50d4-b82a-358c7fce9d89" +version = "1.21.0+1" + +[[deps.Wayland_protocols_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "93f43ab61b16ddfb2fd3bb13b3ce241cafb0e6c9" +uuid = "2381bf8a-dfd0-557d-9999-79630e7b1b91" +version = "1.31.0+0" + +[[deps.XML2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Zlib_jll"] +git-tree-sha1 = "532e22cf7be8462035d092ff21fada7527e2c488" +uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a" +version = "2.12.6+0" + +[[deps.XSLT_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgcrypt_jll", "Libgpg_error_jll", "Libiconv_jll", "Pkg", "XML2_jll", "Zlib_jll"] +git-tree-sha1 = "91844873c4085240b95e795f692c4cec4d805f8a" +uuid = "aed1982a-8fda-507f-9586-7b0439959a61" +version = "1.1.34+0" + +[[deps.XZ_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "ac88fb95ae6447c8dda6a5503f3bafd496ae8632" +uuid = "ffd25f8a-64ca-5728-b0f7-c24cf3aae800" +version = "5.4.6+0" + +[[deps.Xorg_libICE_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "326b4fea307b0b39892b3e85fa451692eda8d46c" +uuid = "f67eecfb-183a-506d-b269-f58e52b52d7c" +version = "1.1.1+0" + +[[deps.Xorg_libSM_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libICE_jll"] +git-tree-sha1 = "3796722887072218eabafb494a13c963209754ce" +uuid = "c834827a-8449-5923-a945-d239c165b7dd" +version = "1.2.4+0" + +[[deps.Xorg_libX11_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxcb_jll", "Xorg_xtrans_jll"] +git-tree-sha1 = "afead5aba5aa507ad5a3bf01f58f82c8d1403495" +uuid = "4f6342f7-b3d2-589e-9d20-edeb45f2b2bc" +version = "1.8.6+0" + +[[deps.Xorg_libXau_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "6035850dcc70518ca32f012e46015b9beeda49d8" +uuid = "0c0b7dd1-d40b-584c-a123-a41640f87eec" +version = "1.0.11+0" + +[[deps.Xorg_libXcursor_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXfixes_jll", "Xorg_libXrender_jll"] +git-tree-sha1 = "12e0eb3bc634fa2080c1c37fccf56f7c22989afd" +uuid = "935fb764-8cf2-53bf-bb30-45bb1f8bf724" +version = "1.2.0+4" + +[[deps.Xorg_libXdmcp_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "34d526d318358a859d7de23da945578e8e8727b7" +uuid = "a3789734-cfe1-5b06-b2d0-1dd0d9d62d05" +version = "1.1.4+0" + +[[deps.Xorg_libXext_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] +git-tree-sha1 = "d2d1a5c49fae4ba39983f63de6afcbea47194e85" +uuid = "1082639a-0dae-5f34-9b06-72781eeb8cb3" +version = "1.3.6+0" + +[[deps.Xorg_libXfixes_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll"] +git-tree-sha1 = "0e0dc7431e7a0587559f9294aeec269471c991a4" +uuid = "d091e8ba-531a-589c-9de9-94069b037ed8" +version = "5.0.3+4" + +[[deps.Xorg_libXi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXext_jll", "Xorg_libXfixes_jll"] +git-tree-sha1 = "89b52bc2160aadc84d707093930ef0bffa641246" +uuid = "a51aa0fd-4e3c-5386-b890-e753decda492" +version = "1.7.10+4" + +[[deps.Xorg_libXinerama_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXext_jll"] +git-tree-sha1 = "26be8b1c342929259317d8b9f7b53bf2bb73b123" +uuid = "d1454406-59df-5ea1-beac-c340f2130bc3" +version = "1.1.4+4" + +[[deps.Xorg_libXrandr_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXext_jll", "Xorg_libXrender_jll"] +git-tree-sha1 = "34cea83cb726fb58f325887bf0612c6b3fb17631" +uuid = "ec84b674-ba8e-5d96-8ba1-2a689ba10484" +version = "1.5.2+4" + +[[deps.Xorg_libXrender_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] +git-tree-sha1 = "47e45cd78224c53109495b3e324df0c37bb61fbe" +uuid = "ea2f1a96-1ddc-540d-b46f-429655e07cfa" +version = "0.9.11+0" + +[[deps.Xorg_libpthread_stubs_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "8fdda4c692503d44d04a0603d9ac0982054635f9" +uuid = "14d82f49-176c-5ed1-bb49-ad3f5cbd8c74" +version = "0.1.1+0" + +[[deps.Xorg_libxcb_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "XSLT_jll", "Xorg_libXau_jll", "Xorg_libXdmcp_jll", "Xorg_libpthread_stubs_jll"] +git-tree-sha1 = "b4bfde5d5b652e22b9c790ad00af08b6d042b97d" +uuid = "c7cfdc94-dc32-55de-ac96-5a1b8d977c5b" +version = "1.15.0+0" + +[[deps.Xorg_libxkbfile_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] +git-tree-sha1 = "730eeca102434283c50ccf7d1ecdadf521a765a4" +uuid = "cc61e674-0454-545c-8b26-ed2c68acab7a" +version = "1.1.2+0" + +[[deps.Xorg_xcb_util_cursor_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_xcb_util_image_jll", "Xorg_xcb_util_jll", "Xorg_xcb_util_renderutil_jll"] +git-tree-sha1 = "04341cb870f29dcd5e39055f895c39d016e18ccd" +uuid = "e920d4aa-a673-5f3a-b3d7-f755a4d47c43" +version = "0.1.4+0" + +[[deps.Xorg_xcb_util_image_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] +git-tree-sha1 = "0fab0a40349ba1cba2c1da699243396ff8e94b97" +uuid = "12413925-8142-5f55-bb0e-6d7ca50bb09b" +version = "0.4.0+1" + +[[deps.Xorg_xcb_util_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libxcb_jll"] +git-tree-sha1 = "e7fd7b2881fa2eaa72717420894d3938177862d1" +uuid = "2def613f-5ad1-5310-b15b-b15d46f528f5" +version = "0.4.0+1" + +[[deps.Xorg_xcb_util_keysyms_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] +git-tree-sha1 = "d1151e2c45a544f32441a567d1690e701ec89b00" +uuid = "975044d2-76e6-5fbe-bf08-97ce7c6574c7" +version = "0.4.0+1" + +[[deps.Xorg_xcb_util_renderutil_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] +git-tree-sha1 = "dfd7a8f38d4613b6a575253b3174dd991ca6183e" +uuid = "0d47668e-0667-5a69-a72c-f761630bfb7e" +version = "0.3.9+1" + +[[deps.Xorg_xcb_util_wm_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] +git-tree-sha1 = "e78d10aab01a4a154142c5006ed44fd9e8e31b67" +uuid = "c22f9ab0-d5fe-5066-847c-f4bb1cd4e361" +version = "0.4.1+1" + +[[deps.Xorg_xkbcomp_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxkbfile_jll"] +git-tree-sha1 = "330f955bc41bb8f5270a369c473fc4a5a4e4d3cb" +uuid = "35661453-b289-5fab-8a00-3d9160c6a3a4" +version = "1.4.6+0" + +[[deps.Xorg_xkeyboard_config_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_xkbcomp_jll"] +git-tree-sha1 = "691634e5453ad362044e2ad653e79f3ee3bb98c3" +uuid = "33bec58e-1273-512f-9401-5d533626f822" +version = "2.39.0+0" + +[[deps.Xorg_xtrans_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "e92a1a012a10506618f10b7047e478403a046c77" +uuid = "c5fb5394-a638-5e4d-96e5-b29de1b5cf10" +version = "1.5.0+0" + +[[deps.Zlib_jll]] +deps = ["Libdl"] +uuid = "83775a58-1f1d-513f-b197-d71354ab007a" +version = "1.2.13+0" + +[[deps.Zstd_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "e678132f07ddb5bfa46857f0d7620fb9be675d3b" +uuid = "3161d3a3-bdf6-5164-811a-617609db77b4" +version = "1.5.6+0" + +[[deps.eudev_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "gperf_jll"] +git-tree-sha1 = "431b678a28ebb559d224c0b6b6d01afce87c51ba" +uuid = "35ca27e7-8b34-5b7f-bca9-bdc33f59eb06" +version = "3.2.9+0" + +[[deps.fzf_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "a68c9655fbe6dfcab3d972808f1aafec151ce3f8" +uuid = "214eeab7-80f7-51ab-84ad-2988db7cef09" +version = "0.43.0+0" + +[[deps.gperf_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "3516a5630f741c9eecb3720b1ec9d8edc3ecc033" +uuid = "1a1c6b14-54f6-533d-8383-74cd7377aa70" +version = "3.1.1+0" + +[[deps.libaom_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "3a2ea60308f0996d26f1e5354e10c24e9ef905d4" +uuid = "a4ae2306-e953-59d6-aa16-d00cac43593b" +version = "3.4.0+0" + +[[deps.libass_jll]] +deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] +git-tree-sha1 = "5982a94fcba20f02f42ace44b9894ee2b140fe47" +uuid = "0ac62f75-1d6f-5e53-bd7c-93b484bb37c0" +version = "0.15.1+0" + +[[deps.libblastrampoline_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" +version = "5.7.0+0" + +[[deps.libevdev_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "141fe65dc3efabb0b1d5ba74e91f6ad26f84cc22" +uuid = "2db6ffa8-e38f-5e21-84af-90c45d0032cc" +version = "1.11.0+0" + +[[deps.libfdk_aac_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "daacc84a041563f965be61859a36e17c4e4fcd55" +uuid = "f638f0a6-7fb0-5443-88ba-1cc74229b280" +version = "2.0.2+0" + +[[deps.libinput_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "eudev_jll", "libevdev_jll", "mtdev_jll"] +git-tree-sha1 = "ad50e5b90f222cfe78aa3d5183a20a12de1322ce" +uuid = "36db933b-70db-51c0-b978-0f229ee0e533" +version = "1.18.0+0" + +[[deps.libpng_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Zlib_jll"] +git-tree-sha1 = "d7015d2e18a5fd9a4f47de711837e980519781a4" +uuid = "b53b4c65-9356-5827-b1ea-8c7a1a84506f" +version = "1.6.43+1" + +[[deps.libvorbis_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Ogg_jll", "Pkg"] +git-tree-sha1 = "b910cb81ef3fe6e78bf6acee440bda86fd6ae00c" +uuid = "f27f6e37-5d2b-51aa-960f-b287f2bc3b7a" +version = "1.3.7+1" + +[[deps.mtdev_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "814e154bdb7be91d78b6802843f76b6ece642f11" +uuid = "009596ad-96f7-51b1-9f1b-5ce2d5e8a71e" +version = "1.1.6+0" + +[[deps.nghttp2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" +version = "1.48.0+0" + +[[deps.oneTBB_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "7d0ea0f4895ef2f5cb83645fa689e52cb55cf493" +uuid = "1317d2d5-d96f-522e-a858-c73665f53c3e" +version = "2021.12.0+0" + +[[deps.p7zip_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" +version = "17.4.0+0" + +[[deps.x264_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "4fea590b89e6ec504593146bf8b988b2c00922b2" +uuid = "1270edf5-f2f9-52d2-97e9-ab00b5d0237a" +version = "2021.5.5+0" + +[[deps.x265_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "ee567a171cce03570d77ad3a43e90218e38937a9" +uuid = "dfaa095f-4041-5dcd-9319-2fabd8486b76" +version = "3.5.0+0" + +[[deps.xkbcommon_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Wayland_jll", "Wayland_protocols_jll", "Xorg_libxcb_jll", "Xorg_xkeyboard_config_jll"] +git-tree-sha1 = "9c304562909ab2bab0262639bd4f444d7bc2be37" +uuid = "d8fb68d0-12a3-5cfd-a85a-d49703b185fd" +version = "1.4.1+1" +""" + +# ╔═║ Cell order: +# β•Ÿβ”€14c7e803-c0ff-4211-8b60-2c9c246934dd +# ╠═6948149f-854e-4b3c-b51c-099dd221ab83 +# ╠═1c4709fc-58a6-4a2c-857c-49a5442a180f +# ╠═89551690-500d-4e37-ae20-5beb71cc87ac +# ╠═7b1a87c5-0856-4968-ba2b-36da650cd0c8 +# ╠═08b40947-7218-4885-b25c-982821ca0361 +# ╠═b1073c63-cb31-4160-98e1-ec1a0ca22d9c +# ╠═7110e56a-dfc1-4885-9eee-c59eeb37010f +# ╠═d560e96d-c6dc-4127-9616-1c186914cef5 +# ╠═75b7ed6d-f27f-4f73-9c78-014b659323b8 +# ╠═3da54360-1f31-48a0-87cf-0d47132862bc +# ╠═3ccb5e2b-9ed3-486c-ac18-de62d2297e07 +# ╠═aed58771-86c1-4928-a1ba-b7d2f503b188 +# ╠═98451eb8-8755-47fe-b8c6-ce2959256dd8 +# β•Ÿβ”€797ce7d7-c49d-4a00-a8e3-058b6de4d3a9 +# ╠═aa32c5e2-0f67-4910-a612-d958fa13169c +# ╠═7f9c8c7d-90ef-496c-b907-300feba5edfc +# ╠═4595b9f6-3e9b-4160-8def-456b0c6c0caf +# ╠═58d13e42-4edc-412c-a1e0-30e11fb2585e +# ╠═8cf34815-4ff7-4930-bc91-11081e1ab3f3 +# β•Ÿβ”€f284fda5-aaf7-4121-a8f0-b996d501bec5 +# ╠═2a0b0c1f-9510-4f71-9d65-b4fb7c854a98 +# ╠═67380c07-a07c-4a0e-8654-80f27b951461 +# ╠═86307aaa-1349-444b-bc9b-e5c115727671 +# ╠═ef1b3843-a963-4a18-85c4-ca5a6e791d00 +# ╠═aa4ebdb8-27a1-493b-b95e-d2ac4c3e6d54 +# ╠═60c63f1b-5a27-4539-a486-78c083457b0e +# β•Ÿβ”€890afefc-f42b-4d74-b775-6dee5e5f0c2b +# ╠═21357c48-f35d-11ee-23f8-2534bb1d82f4 +# β•Ÿβ”€1f4b988a-6632-4589-8913-5de0574d94b3 +# β•Ÿβ”€00000000-0000-0000-0000-000000000001 +# β•Ÿβ”€00000000-0000-0000-0000-000000000002 diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 00000000..e5f3c996 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +StatsPlots +Turing \ No newline at end of file diff --git a/scripts/Expdist_reactions.jl b/scripts/Expdist_reactions.jl new file mode 100644 index 00000000..881e9e39 --- /dev/null +++ b/scripts/Expdist_reactions.jl @@ -0,0 +1,1569 @@ +### A Pluto.jl notebook ### +# v0.20.3 + +using Markdown +using InteractiveUtils + +# This Pluto notebook uses @bind for interactivity. When running this notebook outside of Pluto, the following 'mock version' of @bind gives bound variables a default value (instead of an error). +macro bind(def, element) + #! format: off + quote + local iv = try Base.loaded_modules[Base.PkgId(Base.UUID("6e696c72-6542-2067-7265-42206c756150"), "AbstractPlutoDingetjes")].Bonds.initial_value catch; b -> missing; end + local el = $(esc(element)) + global $(esc(def)) = Core.applicable(Base.get, el) ? Base.get(el) : iv(el) + el + end + #! format: on +end + +# ╔═║ f2c2529c-da67-11ef-2eba-e53e2c6e2cd6 +using Distributions, Plots, PlutoUI, StatsPlots, LaTeXStrings + +# ╔═║ 8af5bdc7-13ee-4f45-ac20-68d7a108ca61 +@bind Ξ”t Slider(0.01:0.01:0.5, default=0.1, show_value=true) + +# ╔═║ cec4454f-7461-45a2-8f1f-27a127b2856c +@bind r Slider(0.1:0.1:.8, default=0.2, show_value=true) + +# ╔═║ 7fadaa1a-e9b3-403d-8898-f9e051f7436b +p = r * Ξ”t + +# ╔═║ 22690edd-d1ef-4edd-8e29-7c7dcac82d76 +geomdist = Geometric(p) + +# ╔═║ 1107bce5-1d49-4aad-b9c2-7bf22ec75793 +ndecay = rand(geomdist, 1000) + +# ╔═║ f83e4398-df26-4a83-a1c9-928aeac6a7ad +tdecay = Ξ”t .* ndecay + +# ╔═║ 5f97b5e8-6756-4f7d-a038-0312582b5873 +expdist = Exponential(1/r) + +# ╔═║ 902cec71-8bd3-4174-93d4-dc631758f58d +begin + histogram(tdecay, normalize=true, label="Geometric sample", xlab=L"t", ylab="frequency") + plot!(expdist, lw=2, label="Exponential distribution", ls=:dash) + title!("Time till partile decays (r=$r, Ξ”t=$Ξ”t)") +end + +# ╔═║ 59019dca-b06f-46e4-96fd-954479573b56 +n = 1000 + +# ╔═║ c0ebd892-8d59-425c-9303-113634c6fd12 +tdecay_ensemble = rand(expdist, n) |> sort! + +# ╔═║ 555abde1-010f-42b2-b5a8-83ccc8ec29c0 +begin + plot(t->count(β‰₯(t), tdecay_ensemble), 0, 50, xlab=L"t", ylab="# particles", label="sample", lw=2) + plot!(t->n*exp(-r*t),0, 50, label=L"n \exp(-rt)", lw=2, alpha=0.8, ls=:dash) + title!("Decay of $n particles (r=$r)") +end + +# ╔═║ cebc9e1c-9f9e-430e-980d-9438c12b4702 +scatter(diff(tdecay_ensemble)) + +# ╔═║ 6f5a53b0-068c-4146-a311-9cbfca2435cd +diff(tdecay_ensemble) + +# ╔═║ 00000000-0000-0000-0000-000000000001 +PLUTO_PROJECT_TOML_CONTENTS = """ +[deps] +Distributions = "31c24e10-a181-5473-b8eb-7969acd0382f" +LaTeXStrings = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" +Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" +PlutoUI = "7f904dfe-b85e-4ff6-b463-dae2292396a8" +StatsPlots = "f3b207a7-027a-5e70-b257-86293d7955fd" + +[compat] +Distributions = "~0.25.116" +LaTeXStrings = "~1.4.0" +Plots = "~1.40.9" +PlutoUI = "~0.7.60" +StatsPlots = "~0.15.7" +""" + +# ╔═║ 00000000-0000-0000-0000-000000000002 +PLUTO_MANIFEST_TOML_CONTENTS = """ +# This file is machine-generated - editing it directly is not advised + +julia_version = "1.10.3" +manifest_format = "2.0" +project_hash = "d667956767f1e5fc5c147e60ec034f6fb6321cf7" + +[[deps.AbstractFFTs]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "d92ad398961a3ed262d8bf04a1a2b8340f915fef" +uuid = "621f4979-c628-5d54-868e-fcf4e3e8185c" +version = "1.5.0" +weakdeps = ["ChainRulesCore", "Test"] + + [deps.AbstractFFTs.extensions] + AbstractFFTsChainRulesCoreExt = "ChainRulesCore" + AbstractFFTsTestExt = "Test" + +[[deps.AbstractPlutoDingetjes]] +deps = ["Pkg"] +git-tree-sha1 = "6e1d2a35f2f90a4bc7c2ed98079b2ba09c35b83a" +uuid = "6e696c72-6542-2067-7265-42206c756150" +version = "1.3.2" + +[[deps.Adapt]] +deps = ["LinearAlgebra", "Requires"] +git-tree-sha1 = "50c3c56a52972d78e8be9fd135bfb91c9574c140" +uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" +version = "4.1.1" +weakdeps = ["StaticArrays"] + + [deps.Adapt.extensions] + AdaptStaticArraysExt = "StaticArrays" + +[[deps.AliasTables]] +deps = ["PtrArrays", "Random"] +git-tree-sha1 = "9876e1e164b144ca45e9e3198d0b689cadfed9ff" +uuid = "66dad0bd-aa9a-41b7-9441-69ab47430ed8" +version = "1.1.3" + +[[deps.ArgTools]] +uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" +version = "1.1.1" + +[[deps.Arpack]] +deps = ["Arpack_jll", "Libdl", "LinearAlgebra", "Logging"] +git-tree-sha1 = "9b9b347613394885fd1c8c7729bfc60528faa436" +uuid = "7d9fca2a-8960-54d3-9f78-7d1dccf2cb97" +version = "0.5.4" + +[[deps.Arpack_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "OpenBLAS_jll", "Pkg"] +git-tree-sha1 = "5ba6c757e8feccf03a1554dfaf3e26b3cfc7fd5e" +uuid = "68821587-b530-5797-8361-c406ea357684" +version = "3.5.1+1" + +[[deps.Artifacts]] +uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" + +[[deps.AxisAlgorithms]] +deps = ["LinearAlgebra", "Random", "SparseArrays", "WoodburyMatrices"] +git-tree-sha1 = "01b8ccb13d68535d73d2b0c23e39bd23155fb712" +uuid = "13072b0f-2c55-5437-9ae7-d433b7a33950" +version = "1.1.0" + +[[deps.Base64]] +uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" + +[[deps.BitFlags]] +git-tree-sha1 = "0691e34b3bb8be9307330f88d1a3c3f25466c24d" +uuid = "d1d4a3ce-64b1-5f1a-9ba4-7e7e69966f35" +version = "0.1.9" + +[[deps.Bzip2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "8873e196c2eb87962a2048b3b8e08946535864a1" +uuid = "6e34b625-4abd-537c-b88f-471c36dfa7a0" +version = "1.0.8+4" + +[[deps.Cairo_jll]] +deps = ["Artifacts", "Bzip2_jll", "CompilerSupportLibraries_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "JLLWrappers", "LZO_jll", "Libdl", "Pixman_jll", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Zlib_jll", "libpng_jll"] +git-tree-sha1 = "009060c9a6168704143100f36ab08f06c2af4642" +uuid = "83423d85-b0ee-5818-9007-b63ccbeb887a" +version = "1.18.2+1" + +[[deps.ChainRulesCore]] +deps = ["Compat", "LinearAlgebra"] +git-tree-sha1 = "1713c74e00545bfe14605d2a2be1712de8fbcb58" +uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" +version = "1.25.1" +weakdeps = ["SparseArrays"] + + [deps.ChainRulesCore.extensions] + ChainRulesCoreSparseArraysExt = "SparseArrays" + +[[deps.Clustering]] +deps = ["Distances", "LinearAlgebra", "NearestNeighbors", "Printf", "Random", "SparseArrays", "Statistics", "StatsBase"] +git-tree-sha1 = "9ebb045901e9bbf58767a9f34ff89831ed711aae" +uuid = "aaaa29a8-35af-508c-8bc3-b662a17a0fe5" +version = "0.15.7" + +[[deps.CodecZlib]] +deps = ["TranscodingStreams", "Zlib_jll"] +git-tree-sha1 = "bce6804e5e6044c6daab27bb533d1295e4a2e759" +uuid = "944b1d66-785c-5afd-91f1-9de20f533193" +version = "0.7.6" + +[[deps.ColorSchemes]] +deps = ["ColorTypes", "ColorVectorSpace", "Colors", "FixedPointNumbers", "PrecompileTools", "Random"] +git-tree-sha1 = "c785dfb1b3bfddd1da557e861b919819b82bbe5b" +uuid = "35d6a980-a343-548e-a6ea-1d62b119f2f4" +version = "3.27.1" + +[[deps.ColorTypes]] +deps = ["FixedPointNumbers", "Random"] +git-tree-sha1 = "b10d0b65641d57b8b4d5e234446582de5047050d" +uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f" +version = "0.11.5" + +[[deps.ColorVectorSpace]] +deps = ["ColorTypes", "FixedPointNumbers", "LinearAlgebra", "Requires", "Statistics", "TensorCore"] +git-tree-sha1 = "a1f44953f2382ebb937d60dafbe2deea4bd23249" +uuid = "c3611d14-8923-5661-9e6a-0046d554d3a4" +version = "0.10.0" +weakdeps = ["SpecialFunctions"] + + [deps.ColorVectorSpace.extensions] + SpecialFunctionsExt = "SpecialFunctions" + +[[deps.Colors]] +deps = ["ColorTypes", "FixedPointNumbers", "Reexport"] +git-tree-sha1 = "64e15186f0aa277e174aa81798f7eb8598e0157e" +uuid = "5ae59095-9a9b-59fe-a467-6f913c188581" +version = "0.13.0" + +[[deps.Compat]] +deps = ["TOML", "UUIDs"] +git-tree-sha1 = "8ae8d32e09f0dcf42a36b90d4e17f5dd2e4c4215" +uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" +version = "4.16.0" +weakdeps = ["Dates", "LinearAlgebra"] + + [deps.Compat.extensions] + CompatLinearAlgebraExt = "LinearAlgebra" + +[[deps.CompilerSupportLibraries_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" +version = "1.1.1+0" + +[[deps.ConcurrentUtilities]] +deps = ["Serialization", "Sockets"] +git-tree-sha1 = "f36e5e8fdffcb5646ea5da81495a5a7566005127" +uuid = "f0e56b4a-5159-44fe-b623-3e5288b988bb" +version = "2.4.3" + +[[deps.Contour]] +git-tree-sha1 = "439e35b0b36e2e5881738abc8857bd92ad6ff9a8" +uuid = "d38c429a-6771-53c6-b99e-75d170b6e991" +version = "0.6.3" + +[[deps.DataAPI]] +git-tree-sha1 = "abe83f3a2f1b857aac70ef8b269080af17764bbe" +uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a" +version = "1.16.0" + +[[deps.DataStructures]] +deps = ["Compat", "InteractiveUtils", "OrderedCollections"] +git-tree-sha1 = "1d0a14036acb104d9e89698bd408f63ab58cdc82" +uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" +version = "0.18.20" + +[[deps.DataValueInterfaces]] +git-tree-sha1 = "bfc1187b79289637fa0ef6d4436ebdfe6905cbd6" +uuid = "e2d170a0-9d28-54be-80f0-106bbe20a464" +version = "1.0.0" + +[[deps.Dates]] +deps = ["Printf"] +uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" + +[[deps.Dbus_jll]] +deps = ["Artifacts", "Expat_jll", "JLLWrappers", "Libdl"] +git-tree-sha1 = "fc173b380865f70627d7dd1190dc2fce6cc105af" +uuid = "ee1fde0b-3d02-5ea6-8484-8dfef6360eab" +version = "1.14.10+0" + +[[deps.DelimitedFiles]] +deps = ["Mmap"] +git-tree-sha1 = "9e2f36d3c96a820c678f2f1f1782582fcf685bae" +uuid = "8bb1440f-4735-579b-a4ab-409b98df4dab" +version = "1.9.1" + +[[deps.Distances]] +deps = ["LinearAlgebra", "Statistics", "StatsAPI"] +git-tree-sha1 = "c7e3a542b999843086e2f29dac96a618c105be1d" +uuid = "b4f34e82-e78d-54a5-968a-f98e89d6e8f7" +version = "0.10.12" +weakdeps = ["ChainRulesCore", "SparseArrays"] + + [deps.Distances.extensions] + DistancesChainRulesCoreExt = "ChainRulesCore" + DistancesSparseArraysExt = "SparseArrays" + +[[deps.Distributed]] +deps = ["Random", "Serialization", "Sockets"] +uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" + +[[deps.Distributions]] +deps = ["AliasTables", "FillArrays", "LinearAlgebra", "PDMats", "Printf", "QuadGK", "Random", "SpecialFunctions", "Statistics", "StatsAPI", "StatsBase", "StatsFuns"] +git-tree-sha1 = "7901a6117656e29fa2c74a58adb682f380922c47" +uuid = "31c24e10-a181-5473-b8eb-7969acd0382f" +version = "0.25.116" + + [deps.Distributions.extensions] + DistributionsChainRulesCoreExt = "ChainRulesCore" + DistributionsDensityInterfaceExt = "DensityInterface" + DistributionsTestExt = "Test" + + [deps.Distributions.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + DensityInterface = "b429d917-457f-4dbc-8f4c-0cc954292b1d" + Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[[deps.DocStringExtensions]] +deps = ["LibGit2"] +git-tree-sha1 = "2fb1e02f2b635d0845df5d7c167fec4dd739b00d" +uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" +version = "0.9.3" + +[[deps.Downloads]] +deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] +uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" +version = "1.6.0" + +[[deps.EpollShim_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "8a4be429317c42cfae6a7fc03c31bad1970c310d" +uuid = "2702e6a9-849d-5ed8-8c21-79e8b8f9ee43" +version = "0.0.20230411+1" + +[[deps.ExceptionUnwrapping]] +deps = ["Test"] +git-tree-sha1 = "d36f682e590a83d63d1c7dbd287573764682d12a" +uuid = "460bff9d-24e4-43bc-9d9f-a8973cb893f4" +version = "0.1.11" + +[[deps.Expat_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "e51db81749b0777b2147fbe7b783ee79045b8e99" +uuid = "2e619515-83b5-522b-bb60-26c02a35a201" +version = "2.6.4+3" + +[[deps.FFMPEG]] +deps = ["FFMPEG_jll"] +git-tree-sha1 = "53ebe7511fa11d33bec688a9178fac4e49eeee00" +uuid = "c87230d0-a227-11e9-1b43-d7ebe4e7570a" +version = "0.4.2" + +[[deps.FFMPEG_jll]] +deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "JLLWrappers", "LAME_jll", "Libdl", "Ogg_jll", "OpenSSL_jll", "Opus_jll", "PCRE2_jll", "Zlib_jll", "libaom_jll", "libass_jll", "libfdk_aac_jll", "libvorbis_jll", "x264_jll", "x265_jll"] +git-tree-sha1 = "466d45dc38e15794ec7d5d63ec03d776a9aff36e" +uuid = "b22a6f82-2f65-5046-a5b2-351ab43fb4e5" +version = "4.4.4+1" + +[[deps.FFTW]] +deps = ["AbstractFFTs", "FFTW_jll", "LinearAlgebra", "MKL_jll", "Preferences", "Reexport"] +git-tree-sha1 = "4820348781ae578893311153d69049a93d05f39d" +uuid = "7a1cc6ca-52ef-59f5-83cd-3a7055c09341" +version = "1.8.0" + +[[deps.FFTW_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "4d81ed14783ec49ce9f2e168208a12ce1815aa25" +uuid = "f5851436-0d7a-5f13-b9de-f02708fd171a" +version = "3.3.10+3" + +[[deps.FileWatching]] +uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" + +[[deps.FillArrays]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "6a70198746448456524cb442b8af316927ff3e1a" +uuid = "1a297f60-69ca-5386-bcde-b61e274b549b" +version = "1.13.0" +weakdeps = ["PDMats", "SparseArrays", "Statistics"] + + [deps.FillArrays.extensions] + FillArraysPDMatsExt = "PDMats" + FillArraysSparseArraysExt = "SparseArrays" + FillArraysStatisticsExt = "Statistics" + +[[deps.FixedPointNumbers]] +deps = ["Statistics"] +git-tree-sha1 = "05882d6995ae5c12bb5f36dd2ed3f61c98cbb172" +uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" +version = "0.8.5" + +[[deps.Fontconfig_jll]] +deps = ["Artifacts", "Bzip2_jll", "Expat_jll", "FreeType2_jll", "JLLWrappers", "Libdl", "Libuuid_jll", "Zlib_jll"] +git-tree-sha1 = "21fac3c77d7b5a9fc03b0ec503aa1a6392c34d2b" +uuid = "a3f928ae-7b40-5064-980b-68af3947d34b" +version = "2.15.0+0" + +[[deps.Format]] +git-tree-sha1 = "9c68794ef81b08086aeb32eeaf33531668d5f5fc" +uuid = "1fa38f19-a742-5d3f-a2b9-30dd87b9d5f8" +version = "1.3.7" + +[[deps.FreeType2_jll]] +deps = ["Artifacts", "Bzip2_jll", "JLLWrappers", "Libdl", "Zlib_jll"] +git-tree-sha1 = "786e968a8d2fb167f2e4880baba62e0e26bd8e4e" +uuid = "d7e528f0-a631-5988-bf34-fe36492bcfd7" +version = "2.13.3+1" + +[[deps.FriBidi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "846f7026a9decf3679419122b49f8a1fdb48d2d5" +uuid = "559328eb-81f9-559d-9380-de523a88c83c" +version = "1.0.16+0" + +[[deps.GLFW_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libglvnd_jll", "Xorg_libXcursor_jll", "Xorg_libXi_jll", "Xorg_libXinerama_jll", "Xorg_libXrandr_jll", "libdecor_jll", "xkbcommon_jll"] +git-tree-sha1 = "fcb0584ff34e25155876418979d4c8971243bb89" +uuid = "0656b61e-2033-5cc2-a64a-77c0f6c09b89" +version = "3.4.0+2" + +[[deps.GR]] +deps = ["Artifacts", "Base64", "DelimitedFiles", "Downloads", "GR_jll", "HTTP", "JSON", "Libdl", "LinearAlgebra", "Preferences", "Printf", "Qt6Wayland_jll", "Random", "Serialization", "Sockets", "TOML", "Tar", "Test", "p7zip_jll"] +git-tree-sha1 = "424c8f76017e39fdfcdbb5935a8e6742244959e8" +uuid = "28b8d3ca-fb5f-59d9-8090-bfdbd6d07a71" +version = "0.73.10" + +[[deps.GR_jll]] +deps = ["Artifacts", "Bzip2_jll", "Cairo_jll", "FFMPEG_jll", "Fontconfig_jll", "FreeType2_jll", "GLFW_jll", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Libtiff_jll", "Pixman_jll", "Qt6Base_jll", "Zlib_jll", "libpng_jll"] +git-tree-sha1 = "b90934c8cb33920a8dc66736471dc3961b42ec9f" +uuid = "d2c73de3-f751-5644-a686-071e5b155ba9" +version = "0.73.10+0" + +[[deps.Gettext_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Libiconv_jll", "Pkg", "XML2_jll"] +git-tree-sha1 = "9b02998aba7bf074d14de89f9d37ca24a1a0b046" +uuid = "78b55507-aeef-58d4-861c-77aaff3498b1" +version = "0.21.0+0" + +[[deps.Glib_jll]] +deps = ["Artifacts", "Gettext_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Libiconv_jll", "Libmount_jll", "PCRE2_jll", "Zlib_jll"] +git-tree-sha1 = "b0036b392358c80d2d2124746c2bf3d48d457938" +uuid = "7746bdde-850d-59dc-9ae8-88ece973131d" +version = "2.82.4+0" + +[[deps.Graphite2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "01979f9b37367603e2848ea225918a3b3861b606" +uuid = "3b182d85-2403-5c21-9c21-1e1f0cc25472" +version = "1.3.14+1" + +[[deps.Grisu]] +git-tree-sha1 = "53bb909d1151e57e2484c3d1b53e19552b887fb2" +uuid = "42e2da0e-8278-4e71-bc24-59509adca0fe" +version = "1.0.2" + +[[deps.HTTP]] +deps = ["Base64", "CodecZlib", "ConcurrentUtilities", "Dates", "ExceptionUnwrapping", "Logging", "LoggingExtras", "MbedTLS", "NetworkOptions", "OpenSSL", "PrecompileTools", "Random", "SimpleBufferStream", "Sockets", "URIs", "UUIDs"] +git-tree-sha1 = "c67b33b085f6e2faf8bf79a61962e7339a81129c" +uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3" +version = "1.10.15" + +[[deps.HarfBuzz_jll]] +deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "Graphite2_jll", "JLLWrappers", "Libdl", "Libffi_jll"] +git-tree-sha1 = "55c53be97790242c29031e5cd45e8ac296dadda3" +uuid = "2e76f6c2-a576-52d4-95c1-20adfe4de566" +version = "8.5.0+0" + +[[deps.HypergeometricFunctions]] +deps = ["LinearAlgebra", "OpenLibm_jll", "SpecialFunctions"] +git-tree-sha1 = "b1c2585431c382e3fe5805874bda6aea90a95de9" +uuid = "34004b35-14d8-5ef3-9330-4cdb6864b03a" +version = "0.3.25" + +[[deps.Hyperscript]] +deps = ["Test"] +git-tree-sha1 = "179267cfa5e712760cd43dcae385d7ea90cc25a4" +uuid = "47d2ed2b-36de-50cf-bf87-49c2cf4b8b91" +version = "0.0.5" + +[[deps.HypertextLiteral]] +deps = ["Tricks"] +git-tree-sha1 = "7134810b1afce04bbc1045ca1985fbe81ce17653" +uuid = "ac1192a8-f4b3-4bfe-ba22-af5b92cd3ab2" +version = "0.9.5" + +[[deps.IOCapture]] +deps = ["Logging", "Random"] +git-tree-sha1 = "b6d6bfdd7ce25b0f9b2f6b3dd56b2673a66c8770" +uuid = "b5f81e59-6552-4d32-b1f0-c071b021bf89" +version = "0.2.5" + +[[deps.IntelOpenMP_jll]] +deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl"] +git-tree-sha1 = "10bd689145d2c3b2a9844005d01087cc1194e79e" +uuid = "1d5cc7b8-4909-519e-a0f8-d0f5ad9712d0" +version = "2024.2.1+0" + +[[deps.InteractiveUtils]] +deps = ["Markdown"] +uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" + +[[deps.Interpolations]] +deps = ["Adapt", "AxisAlgorithms", "ChainRulesCore", "LinearAlgebra", "OffsetArrays", "Random", "Ratios", "Requires", "SharedArrays", "SparseArrays", "StaticArrays", "WoodburyMatrices"] +git-tree-sha1 = "88a101217d7cb38a7b481ccd50d21876e1d1b0e0" +uuid = "a98d9a8b-a2ab-59e6-89dd-64a1c18fca59" +version = "0.15.1" +weakdeps = ["Unitful"] + + [deps.Interpolations.extensions] + InterpolationsUnitfulExt = "Unitful" + +[[deps.IrrationalConstants]] +git-tree-sha1 = "630b497eafcc20001bba38a4651b327dcfc491d2" +uuid = "92d709cd-6900-40b7-9082-c6be49f344b6" +version = "0.2.2" + +[[deps.IteratorInterfaceExtensions]] +git-tree-sha1 = "a3f24677c21f5bbe9d2a714f95dcd58337fb2856" +uuid = "82899510-4779-5014-852e-03e436cf321d" +version = "1.0.0" + +[[deps.JLFzf]] +deps = ["Pipe", "REPL", "Random", "fzf_jll"] +git-tree-sha1 = "71b48d857e86bf7a1838c4736545699974ce79a2" +uuid = "1019f520-868f-41f5-a6de-eb00f4b6a39c" +version = "0.1.9" + +[[deps.JLLWrappers]] +deps = ["Artifacts", "Preferences"] +git-tree-sha1 = "a007feb38b422fbdab534406aeca1b86823cb4d6" +uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" +version = "1.7.0" + +[[deps.JSON]] +deps = ["Dates", "Mmap", "Parsers", "Unicode"] +git-tree-sha1 = "31e996f0a15c7b280ba9f76636b3ff9e2ae58c9a" +uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" +version = "0.21.4" + +[[deps.JpegTurbo_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "eac1206917768cb54957c65a615460d87b455fc1" +uuid = "aacddb02-875f-59d6-b918-886e6ef4fbf8" +version = "3.1.1+0" + +[[deps.KernelDensity]] +deps = ["Distributions", "DocStringExtensions", "FFTW", "Interpolations", "StatsBase"] +git-tree-sha1 = "7d703202e65efa1369de1279c162b915e245eed1" +uuid = "5ab0869b-81aa-558d-bb23-cbf5423bbe9b" +version = "0.6.9" + +[[deps.LAME_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "170b660facf5df5de098d866564877e119141cbd" +uuid = "c1c5ebd0-6772-5130-a774-d5fcae4a789d" +version = "3.100.2+0" + +[[deps.LERC_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "aaafe88dccbd957a8d82f7d05be9b69172e0cee3" +uuid = "88015f11-f218-50d7-93a8-a6af411a945d" +version = "4.0.1+0" + +[[deps.LLVMOpenMP_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "78211fb6cbc872f77cad3fc0b6cf647d923f4929" +uuid = "1d63c593-3942-5779-bab2-d838dc0a180e" +version = "18.1.7+0" + +[[deps.LZO_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "854a9c268c43b77b0a27f22d7fab8d33cdb3a731" +uuid = "dd4b983a-f0e5-5f8d-a1b7-129d4a5fb1ac" +version = "2.10.2+3" + +[[deps.LaTeXStrings]] +git-tree-sha1 = "dda21b8cbd6a6c40d9d02a73230f9d70fed6918c" +uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" +version = "1.4.0" + +[[deps.Latexify]] +deps = ["Format", "InteractiveUtils", "LaTeXStrings", "MacroTools", "Markdown", "OrderedCollections", "Requires"] +git-tree-sha1 = "ce5f5621cac23a86011836badfedf664a612cee4" +uuid = "23fbe1c1-3f47-55db-b15f-69d7ec21a316" +version = "0.16.5" + + [deps.Latexify.extensions] + DataFramesExt = "DataFrames" + SparseArraysExt = "SparseArrays" + SymEngineExt = "SymEngine" + + [deps.Latexify.weakdeps] + DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + SymEngine = "123dc426-2d89-5057-bbad-38513e3affd8" + +[[deps.LazyArtifacts]] +deps = ["Artifacts", "Pkg"] +uuid = "4af54fe1-eca0-43a8-85a7-787d91b784e3" + +[[deps.LibCURL]] +deps = ["LibCURL_jll", "MozillaCACerts_jll"] +uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" +version = "0.6.4" + +[[deps.LibCURL_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] +uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" +version = "8.4.0+0" + +[[deps.LibGit2]] +deps = ["Base64", "LibGit2_jll", "NetworkOptions", "Printf", "SHA"] +uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" + +[[deps.LibGit2_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll"] +uuid = "e37daf67-58a4-590a-8e99-b0245dd2ffc5" +version = "1.6.4+0" + +[[deps.LibSSH2_jll]] +deps = ["Artifacts", "Libdl", "MbedTLS_jll"] +uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" +version = "1.11.0+1" + +[[deps.Libdl]] +uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" + +[[deps.Libffi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "27ecae93dd25ee0909666e6835051dd684cc035e" +uuid = "e9f186c6-92d2-5b65-8a66-fee21dc1b490" +version = "3.2.2+2" + +[[deps.Libgcrypt_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgpg_error_jll"] +git-tree-sha1 = "8be878062e0ffa2c3f67bb58a595375eda5de80b" +uuid = "d4300ac3-e22c-5743-9152-c294e39db1e4" +version = "1.11.0+0" + +[[deps.Libglvnd_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll", "Xorg_libXext_jll"] +git-tree-sha1 = "ff3b4b9d35de638936a525ecd36e86a8bb919d11" +uuid = "7e76a0d4-f3c7-5321-8279-8d96eeed0f29" +version = "1.7.0+0" + +[[deps.Libgpg_error_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "df37206100d39f79b3376afb6b9cee4970041c61" +uuid = "7add5ba3-2f88-524e-9cd5-f83b8a55f7b8" +version = "1.51.1+0" + +[[deps.Libiconv_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "61dfdba58e585066d8bce214c5a51eaa0539f269" +uuid = "94ce4f54-9a6c-5748-9c1c-f9c7231a4531" +version = "1.17.0+1" + +[[deps.Libmount_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "84eef7acd508ee5b3e956a2ae51b05024181dee0" +uuid = "4b2f31a3-9ecc-558c-b454-b3730dcb73e9" +version = "2.40.2+2" + +[[deps.Libtiff_jll]] +deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "LERC_jll", "Libdl", "XZ_jll", "Zlib_jll", "Zstd_jll"] +git-tree-sha1 = "4ab7581296671007fc33f07a721631b8855f4b1d" +uuid = "89763e89-9b03-5906-acba-b20f662cd828" +version = "4.7.1+0" + +[[deps.Libuuid_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "edbf5309f9ddf1cab25afc344b1e8150b7c832f9" +uuid = "38a345b3-de98-5d2b-a5d3-14cd9215e700" +version = "2.40.2+2" + +[[deps.LinearAlgebra]] +deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"] +uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + +[[deps.LogExpFunctions]] +deps = ["DocStringExtensions", "IrrationalConstants", "LinearAlgebra"] +git-tree-sha1 = "13ca9e2586b89836fd20cccf56e57e2b9ae7f38f" +uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688" +version = "0.3.29" + + [deps.LogExpFunctions.extensions] + LogExpFunctionsChainRulesCoreExt = "ChainRulesCore" + LogExpFunctionsChangesOfVariablesExt = "ChangesOfVariables" + LogExpFunctionsInverseFunctionsExt = "InverseFunctions" + + [deps.LogExpFunctions.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + ChangesOfVariables = "9e997f8a-9a97-42d5-a9f1-ce6bfc15e2c0" + InverseFunctions = "3587e190-3f89-42d0-90ee-14403ec27112" + +[[deps.Logging]] +uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" + +[[deps.LoggingExtras]] +deps = ["Dates", "Logging"] +git-tree-sha1 = "f02b56007b064fbfddb4c9cd60161b6dd0f40df3" +uuid = "e6f89c97-d47a-5376-807f-9c37f3926c36" +version = "1.1.0" + +[[deps.MIMEs]] +git-tree-sha1 = "65f28ad4b594aebe22157d6fac869786a255b7eb" +uuid = "6c6e2e6c-3030-632d-7369-2d6c69616d65" +version = "0.1.4" + +[[deps.MKL_jll]] +deps = ["Artifacts", "IntelOpenMP_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "oneTBB_jll"] +git-tree-sha1 = "f046ccd0c6db2832a9f639e2c669c6fe867e5f4f" +uuid = "856f044c-d86e-5d09-b602-aeab76dc8ba7" +version = "2024.2.0+0" + +[[deps.MacroTools]] +git-tree-sha1 = "72aebe0b5051e5143a079a4685a46da330a40472" +uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" +version = "0.5.15" + +[[deps.Markdown]] +deps = ["Base64"] +uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" + +[[deps.MbedTLS]] +deps = ["Dates", "MbedTLS_jll", "MozillaCACerts_jll", "NetworkOptions", "Random", "Sockets"] +git-tree-sha1 = "c067a280ddc25f196b5e7df3877c6b226d390aaf" +uuid = "739be429-bea8-5141-9913-cc70e7f3736d" +version = "1.1.9" + +[[deps.MbedTLS_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" +version = "2.28.2+1" + +[[deps.Measures]] +git-tree-sha1 = "c13304c81eec1ed3af7fc20e75fb6b26092a1102" +uuid = "442fdcdd-2543-5da2-b0f3-8c86c306513e" +version = "0.3.2" + +[[deps.Missings]] +deps = ["DataAPI"] +git-tree-sha1 = "ec4f7fbeab05d7747bdf98eb74d130a2a2ed298d" +uuid = "e1d29d7a-bbdc-5cf2-9ac0-f12de2c33e28" +version = "1.2.0" + +[[deps.Mmap]] +uuid = "a63ad114-7e13-5084-954f-fe012c677804" + +[[deps.MozillaCACerts_jll]] +uuid = "14a3606d-f60d-562e-9121-12d972cd8159" +version = "2023.1.10" + +[[deps.MultivariateStats]] +deps = ["Arpack", "Distributions", "LinearAlgebra", "SparseArrays", "Statistics", "StatsAPI", "StatsBase"] +git-tree-sha1 = "816620e3aac93e5b5359e4fdaf23ca4525b00ddf" +uuid = "6f286f6a-111f-5878-ab1e-185364afe411" +version = "0.10.3" + +[[deps.NaNMath]] +deps = ["OpenLibm_jll"] +git-tree-sha1 = "030ea22804ef91648f29b7ad3fc15fa49d0e6e71" +uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" +version = "1.0.3" + +[[deps.NearestNeighbors]] +deps = ["Distances", "StaticArrays"] +git-tree-sha1 = "8a3271d8309285f4db73b4f662b1b290c715e85e" +uuid = "b8a86587-4115-5ab1-83bc-aa920d37bbce" +version = "0.4.21" + +[[deps.NetworkOptions]] +uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" +version = "1.2.0" + +[[deps.Observables]] +git-tree-sha1 = "7438a59546cf62428fc9d1bc94729146d37a7225" +uuid = "510215fc-4207-5dde-b226-833fc4488ee2" +version = "0.5.5" + +[[deps.OffsetArrays]] +git-tree-sha1 = "5e1897147d1ff8d98883cda2be2187dcf57d8f0c" +uuid = "6fe1bfb0-de20-5000-8ca7-80f57d26f881" +version = "1.15.0" +weakdeps = ["Adapt"] + + [deps.OffsetArrays.extensions] + OffsetArraysAdaptExt = "Adapt" + +[[deps.Ogg_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "887579a3eb005446d514ab7aeac5d1d027658b8f" +uuid = "e7412a2a-1a6e-54c0-be00-318e2571c051" +version = "1.3.5+1" + +[[deps.OpenBLAS_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] +uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" +version = "0.3.23+4" + +[[deps.OpenLibm_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "05823500-19ac-5b8b-9628-191a04bc5112" +version = "0.8.1+2" + +[[deps.OpenSSL]] +deps = ["BitFlags", "Dates", "MozillaCACerts_jll", "OpenSSL_jll", "Sockets"] +git-tree-sha1 = "38cb508d080d21dc1128f7fb04f20387ed4c0af4" +uuid = "4d8831e6-92b7-49fb-bdf8-b643e874388c" +version = "1.4.3" + +[[deps.OpenSSL_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "7493f61f55a6cce7325f197443aa80d32554ba10" +uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95" +version = "3.0.15+3" + +[[deps.OpenSpecFun_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl"] +git-tree-sha1 = "1346c9208249809840c91b26703912dff463d335" +uuid = "efe28fd5-8261-553b-a9e1-b2916fc3738e" +version = "0.5.6+0" + +[[deps.Opus_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "6703a85cb3781bd5909d48730a67205f3f31a575" +uuid = "91d4177d-7536-5919-b921-800302f37372" +version = "1.3.3+0" + +[[deps.OrderedCollections]] +git-tree-sha1 = "12f1439c4f986bb868acda6ea33ebc78e19b95ad" +uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" +version = "1.7.0" + +[[deps.PCRE2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "efcefdf7-47ab-520b-bdef-62a2eaa19f15" +version = "10.42.0+1" + +[[deps.PDMats]] +deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"] +git-tree-sha1 = "949347156c25054de2db3b166c52ac4728cbad65" +uuid = "90014a1f-27ba-587c-ab20-58faa44d9150" +version = "0.11.31" + +[[deps.Pango_jll]] +deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "FriBidi_jll", "Glib_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl"] +git-tree-sha1 = "ed6834e95bd326c52d5675b4181386dfbe885afb" +uuid = "36c8627f-9965-5494-a995-c6b170f724f3" +version = "1.55.5+0" + +[[deps.Parsers]] +deps = ["Dates", "PrecompileTools", "UUIDs"] +git-tree-sha1 = "8489905bcdbcfac64d1daa51ca07c0d8f0283821" +uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" +version = "2.8.1" + +[[deps.Pipe]] +git-tree-sha1 = "6842804e7867b115ca9de748a0cf6b364523c16d" +uuid = "b98c9c47-44ae-5843-9183-064241ee97a0" +version = "1.3.0" + +[[deps.Pixman_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LLVMOpenMP_jll", "Libdl"] +git-tree-sha1 = "35621f10a7531bc8fa58f74610b1bfb70a3cfc6b" +uuid = "30392449-352a-5448-841d-b1acce4e97dc" +version = "0.43.4+0" + +[[deps.Pkg]] +deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] +uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" +version = "1.10.0" + +[[deps.PlotThemes]] +deps = ["PlotUtils", "Statistics"] +git-tree-sha1 = "41031ef3a1be6f5bbbf3e8073f210556daeae5ca" +uuid = "ccf2f8ad-2431-5c83-bf29-c5338b663b6a" +version = "3.3.0" + +[[deps.PlotUtils]] +deps = ["ColorSchemes", "Colors", "Dates", "PrecompileTools", "Printf", "Random", "Reexport", "StableRNGs", "Statistics"] +git-tree-sha1 = "3ca9a356cd2e113c420f2c13bea19f8d3fb1cb18" +uuid = "995b91a9-d308-5afd-9ec6-746e21dbc043" +version = "1.4.3" + +[[deps.Plots]] +deps = ["Base64", "Contour", "Dates", "Downloads", "FFMPEG", "FixedPointNumbers", "GR", "JLFzf", "JSON", "LaTeXStrings", "Latexify", "LinearAlgebra", "Measures", "NaNMath", "Pkg", "PlotThemes", "PlotUtils", "PrecompileTools", "Printf", "REPL", "Random", "RecipesBase", "RecipesPipeline", "Reexport", "RelocatableFolders", "Requires", "Scratch", "Showoff", "SparseArrays", "Statistics", "StatsBase", "TOML", "UUIDs", "UnicodeFun", "UnitfulLatexify", "Unzip"] +git-tree-sha1 = "dae01f8c2e069a683d3a6e17bbae5070ab94786f" +uuid = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" +version = "1.40.9" + + [deps.Plots.extensions] + FileIOExt = "FileIO" + GeometryBasicsExt = "GeometryBasics" + IJuliaExt = "IJulia" + ImageInTerminalExt = "ImageInTerminal" + UnitfulExt = "Unitful" + + [deps.Plots.weakdeps] + FileIO = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" + GeometryBasics = "5c1252a2-5f33-56bf-86c9-59e7332b4326" + IJulia = "7073ff75-c697-5162-941a-fcdaad2a7d2a" + ImageInTerminal = "d8c32880-2388-543b-8c61-d9f865259254" + Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" + +[[deps.PlutoUI]] +deps = ["AbstractPlutoDingetjes", "Base64", "ColorTypes", "Dates", "FixedPointNumbers", "Hyperscript", "HypertextLiteral", "IOCapture", "InteractiveUtils", "JSON", "Logging", "MIMEs", "Markdown", "Random", "Reexport", "URIs", "UUIDs"] +git-tree-sha1 = "eba4810d5e6a01f612b948c9fa94f905b49087b0" +uuid = "7f904dfe-b85e-4ff6-b463-dae2292396a8" +version = "0.7.60" + +[[deps.PrecompileTools]] +deps = ["Preferences"] +git-tree-sha1 = "5aa36f7049a63a1528fe8f7c3f2113413ffd4e1f" +uuid = "aea7be01-6a6a-4083-8856-8a6e6704d82a" +version = "1.2.1" + +[[deps.Preferences]] +deps = ["TOML"] +git-tree-sha1 = "9306f6085165d270f7e3db02af26a400d580f5c6" +uuid = "21216c6a-2e73-6563-6e65-726566657250" +version = "1.4.3" + +[[deps.Printf]] +deps = ["Unicode"] +uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" + +[[deps.PtrArrays]] +git-tree-sha1 = "77a42d78b6a92df47ab37e177b2deac405e1c88f" +uuid = "43287f4e-b6f4-7ad1-bb20-aadabca52c3d" +version = "1.2.1" + +[[deps.Qt6Base_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Fontconfig_jll", "Glib_jll", "JLLWrappers", "Libdl", "Libglvnd_jll", "OpenSSL_jll", "Vulkan_Loader_jll", "Xorg_libSM_jll", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Xorg_libxcb_jll", "Xorg_xcb_util_cursor_jll", "Xorg_xcb_util_image_jll", "Xorg_xcb_util_keysyms_jll", "Xorg_xcb_util_renderutil_jll", "Xorg_xcb_util_wm_jll", "Zlib_jll", "libinput_jll", "xkbcommon_jll"] +git-tree-sha1 = "492601870742dcd38f233b23c3ec629628c1d724" +uuid = "c0090381-4147-56d7-9ebc-da0b1113ec56" +version = "6.7.1+1" + +[[deps.Qt6Declarative_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Qt6Base_jll", "Qt6ShaderTools_jll"] +git-tree-sha1 = "e5dd466bf2569fe08c91a2cc29c1003f4797ac3b" +uuid = "629bc702-f1f5-5709-abd5-49b8460ea067" +version = "6.7.1+2" + +[[deps.Qt6ShaderTools_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Qt6Base_jll"] +git-tree-sha1 = "1a180aeced866700d4bebc3120ea1451201f16bc" +uuid = "ce943373-25bb-56aa-8eca-768745ed7b5a" +version = "6.7.1+1" + +[[deps.Qt6Wayland_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Qt6Base_jll", "Qt6Declarative_jll"] +git-tree-sha1 = "729927532d48cf79f49070341e1d918a65aba6b0" +uuid = "e99dba38-086e-5de3-a5b1-6e4c66e897c3" +version = "6.7.1+1" + +[[deps.QuadGK]] +deps = ["DataStructures", "LinearAlgebra"] +git-tree-sha1 = "cda3b045cf9ef07a08ad46731f5a3165e56cf3da" +uuid = "1fd47b50-473d-5c70-9696-f719f8f3bcdc" +version = "2.11.1" + + [deps.QuadGK.extensions] + QuadGKEnzymeExt = "Enzyme" + + [deps.QuadGK.weakdeps] + Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9" + +[[deps.REPL]] +deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] +uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" + +[[deps.Random]] +deps = ["SHA"] +uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" + +[[deps.Ratios]] +deps = ["Requires"] +git-tree-sha1 = "1342a47bf3260ee108163042310d26f2be5ec90b" +uuid = "c84ed2f1-dad5-54f0-aa8e-dbefe2724439" +version = "0.4.5" +weakdeps = ["FixedPointNumbers"] + + [deps.Ratios.extensions] + RatiosFixedPointNumbersExt = "FixedPointNumbers" + +[[deps.RecipesBase]] +deps = ["PrecompileTools"] +git-tree-sha1 = "5c3d09cc4f31f5fc6af001c250bf1278733100ff" +uuid = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" +version = "1.3.4" + +[[deps.RecipesPipeline]] +deps = ["Dates", "NaNMath", "PlotUtils", "PrecompileTools", "RecipesBase"] +git-tree-sha1 = "45cf9fd0ca5839d06ef333c8201714e888486342" +uuid = "01d81517-befc-4cb6-b9ec-a95719d0359c" +version = "0.6.12" + +[[deps.Reexport]] +git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" +uuid = "189a3867-3050-52da-a836-e630ba90ab69" +version = "1.2.2" + +[[deps.RelocatableFolders]] +deps = ["SHA", "Scratch"] +git-tree-sha1 = "ffdaf70d81cf6ff22c2b6e733c900c3321cab864" +uuid = "05181044-ff0b-4ac5-8273-598c1e38db00" +version = "1.0.1" + +[[deps.Requires]] +deps = ["UUIDs"] +git-tree-sha1 = "838a3a4188e2ded87a4f9f184b4b0d78a1e91cb7" +uuid = "ae029012-a4dd-5104-9daa-d747884805df" +version = "1.3.0" + +[[deps.Rmath]] +deps = ["Random", "Rmath_jll"] +git-tree-sha1 = "852bd0f55565a9e973fcfee83a84413270224dc4" +uuid = "79098fc4-a85e-5d69-aa6a-4863f24498fa" +version = "0.8.0" + +[[deps.Rmath_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "58cdd8fb2201a6267e1db87ff148dd6c1dbd8ad8" +uuid = "f50d1b31-88e8-58de-be2c-1cc44531875f" +version = "0.5.1+0" + +[[deps.SHA]] +uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" +version = "0.7.0" + +[[deps.Scratch]] +deps = ["Dates"] +git-tree-sha1 = "3bac05bc7e74a75fd9cba4295cde4045d9fe2386" +uuid = "6c6a2e73-6563-6170-7368-637461726353" +version = "1.2.1" + +[[deps.SentinelArrays]] +deps = ["Dates", "Random"] +git-tree-sha1 = "d0553ce4031a081cc42387a9b9c8441b7d99f32d" +uuid = "91c51154-3ec4-41a3-a24f-3f23e20d615c" +version = "1.4.7" + +[[deps.Serialization]] +uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" + +[[deps.SharedArrays]] +deps = ["Distributed", "Mmap", "Random", "Serialization"] +uuid = "1a1011a3-84de-559e-8e89-a11a2f7dc383" + +[[deps.Showoff]] +deps = ["Dates", "Grisu"] +git-tree-sha1 = "91eddf657aca81df9ae6ceb20b959ae5653ad1de" +uuid = "992d4aef-0814-514b-bc4d-f2e9a6c4116f" +version = "1.0.3" + +[[deps.SimpleBufferStream]] +git-tree-sha1 = "f305871d2f381d21527c770d4788c06c097c9bc1" +uuid = "777ac1f9-54b0-4bf8-805c-2214025038e7" +version = "1.2.0" + +[[deps.Sockets]] +uuid = "6462fe0b-24de-5631-8697-dd941f90decc" + +[[deps.SortingAlgorithms]] +deps = ["DataStructures"] +git-tree-sha1 = "66e0a8e672a0bdfca2c3f5937efb8538b9ddc085" +uuid = "a2af1166-a08f-5f64-846c-94a0d3cef48c" +version = "1.2.1" + +[[deps.SparseArrays]] +deps = ["Libdl", "LinearAlgebra", "Random", "Serialization", "SuiteSparse_jll"] +uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" +version = "1.10.0" + +[[deps.SpecialFunctions]] +deps = ["IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"] +git-tree-sha1 = "64cca0c26b4f31ba18f13f6c12af7c85f478cfde" +uuid = "276daf66-3868-5448-9aa4-cd146d93841b" +version = "2.5.0" +weakdeps = ["ChainRulesCore"] + + [deps.SpecialFunctions.extensions] + SpecialFunctionsChainRulesCoreExt = "ChainRulesCore" + +[[deps.StableRNGs]] +deps = ["Random"] +git-tree-sha1 = "83e6cce8324d49dfaf9ef059227f91ed4441a8e5" +uuid = "860ef19b-820b-49d6-a774-d7a799459cd3" +version = "1.0.2" + +[[deps.StaticArrays]] +deps = ["LinearAlgebra", "PrecompileTools", "Random", "StaticArraysCore"] +git-tree-sha1 = "47091a0340a675c738b1304b58161f3b0839d454" +uuid = "90137ffa-7385-5640-81b9-e52037218182" +version = "1.9.10" +weakdeps = ["ChainRulesCore", "Statistics"] + + [deps.StaticArrays.extensions] + StaticArraysChainRulesCoreExt = "ChainRulesCore" + StaticArraysStatisticsExt = "Statistics" + +[[deps.StaticArraysCore]] +git-tree-sha1 = "192954ef1208c7019899fbf8049e717f92959682" +uuid = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" +version = "1.4.3" + +[[deps.Statistics]] +deps = ["LinearAlgebra", "SparseArrays"] +uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" +version = "1.10.0" + +[[deps.StatsAPI]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "1ff449ad350c9c4cbc756624d6f8a8c3ef56d3ed" +uuid = "82ae8749-77ed-4fe6-ae5f-f523153014b0" +version = "1.7.0" + +[[deps.StatsBase]] +deps = ["AliasTables", "DataAPI", "DataStructures", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"] +git-tree-sha1 = "29321314c920c26684834965ec2ce0dacc9cf8e5" +uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" +version = "0.34.4" + +[[deps.StatsFuns]] +deps = ["HypergeometricFunctions", "IrrationalConstants", "LogExpFunctions", "Reexport", "Rmath", "SpecialFunctions"] +git-tree-sha1 = "b423576adc27097764a90e163157bcfc9acf0f46" +uuid = "4c63d2b9-4356-54db-8cca-17b64c39e42c" +version = "1.3.2" + + [deps.StatsFuns.extensions] + StatsFunsChainRulesCoreExt = "ChainRulesCore" + StatsFunsInverseFunctionsExt = "InverseFunctions" + + [deps.StatsFuns.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + InverseFunctions = "3587e190-3f89-42d0-90ee-14403ec27112" + +[[deps.StatsPlots]] +deps = ["AbstractFFTs", "Clustering", "DataStructures", "Distributions", "Interpolations", "KernelDensity", "LinearAlgebra", "MultivariateStats", "NaNMath", "Observables", "Plots", "RecipesBase", "RecipesPipeline", "Reexport", "StatsBase", "TableOperations", "Tables", "Widgets"] +git-tree-sha1 = "3b1dcbf62e469a67f6733ae493401e53d92ff543" +uuid = "f3b207a7-027a-5e70-b257-86293d7955fd" +version = "0.15.7" + +[[deps.SuiteSparse]] +deps = ["Libdl", "LinearAlgebra", "Serialization", "SparseArrays"] +uuid = "4607b0f0-06f3-5cda-b6b1-a6196a1729e9" + +[[deps.SuiteSparse_jll]] +deps = ["Artifacts", "Libdl", "libblastrampoline_jll"] +uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c" +version = "7.2.1+1" + +[[deps.TOML]] +deps = ["Dates"] +uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" +version = "1.0.3" + +[[deps.TableOperations]] +deps = ["SentinelArrays", "Tables", "Test"] +git-tree-sha1 = "e383c87cf2a1dc41fa30c093b2a19877c83e1bc1" +uuid = "ab02a1b2-a7df-11e8-156e-fb1833f50b87" +version = "1.2.0" + +[[deps.TableTraits]] +deps = ["IteratorInterfaceExtensions"] +git-tree-sha1 = "c06b2f539df1c6efa794486abfb6ed2022561a39" +uuid = "3783bdb8-4a98-5b6b-af9a-565f29a5fe9c" +version = "1.0.1" + +[[deps.Tables]] +deps = ["DataAPI", "DataValueInterfaces", "IteratorInterfaceExtensions", "OrderedCollections", "TableTraits"] +git-tree-sha1 = "598cd7c1f68d1e205689b1c2fe65a9f85846f297" +uuid = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" +version = "1.12.0" + +[[deps.Tar]] +deps = ["ArgTools", "SHA"] +uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" +version = "1.10.0" + +[[deps.TensorCore]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "1feb45f88d133a655e001435632f019a9a1bcdb6" +uuid = "62fd8b95-f654-4bbd-a8a5-9c27f68ccd50" +version = "0.1.1" + +[[deps.Test]] +deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] +uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[[deps.TranscodingStreams]] +git-tree-sha1 = "0c45878dcfdcfa8480052b6ab162cdd138781742" +uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa" +version = "0.11.3" + +[[deps.Tricks]] +git-tree-sha1 = "7822b97e99a1672bfb1b49b668a6d46d58d8cbcb" +uuid = "410a4b4d-49e4-4fbc-ab6d-cb71b17b3775" +version = "0.1.9" + +[[deps.URIs]] +git-tree-sha1 = "67db6cc7b3821e19ebe75791a9dd19c9b1188f2b" +uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" +version = "1.5.1" + +[[deps.UUIDs]] +deps = ["Random", "SHA"] +uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" + +[[deps.Unicode]] +uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" + +[[deps.UnicodeFun]] +deps = ["REPL"] +git-tree-sha1 = "53915e50200959667e78a92a418594b428dffddf" +uuid = "1cfade01-22cf-5700-b092-accc4b62d6e1" +version = "0.4.1" + +[[deps.Unitful]] +deps = ["Dates", "LinearAlgebra", "Random"] +git-tree-sha1 = "c0667a8e676c53d390a09dc6870b3d8d6650e2bf" +uuid = "1986cc42-f94f-5a68-af5c-568840ba703d" +version = "1.22.0" + + [deps.Unitful.extensions] + ConstructionBaseUnitfulExt = "ConstructionBase" + InverseFunctionsUnitfulExt = "InverseFunctions" + + [deps.Unitful.weakdeps] + ConstructionBase = "187b0558-2788-49d3-abe0-74a17ed4e7c9" + InverseFunctions = "3587e190-3f89-42d0-90ee-14403ec27112" + +[[deps.UnitfulLatexify]] +deps = ["LaTeXStrings", "Latexify", "Unitful"] +git-tree-sha1 = "975c354fcd5f7e1ddcc1f1a23e6e091d99e99bc8" +uuid = "45397f5d-5981-4c77-b2b3-fc36d6e9b728" +version = "1.6.4" + +[[deps.Unzip]] +git-tree-sha1 = "ca0969166a028236229f63514992fc073799bb78" +uuid = "41fe7b60-77ed-43a1-b4f0-825fd5a5650d" +version = "0.2.0" + +[[deps.Vulkan_Loader_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Wayland_jll", "Xorg_libX11_jll", "Xorg_libXrandr_jll", "xkbcommon_jll"] +git-tree-sha1 = "2f0486047a07670caad3a81a075d2e518acc5c59" +uuid = "a44049a8-05dd-5a78-86c9-5fde0876e88c" +version = "1.3.243+0" + +[[deps.Wayland_jll]] +deps = ["Artifacts", "EpollShim_jll", "Expat_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Pkg", "XML2_jll"] +git-tree-sha1 = "85c7811eddec9e7f22615371c3cc81a504c508ee" +uuid = "a2964d1f-97da-50d4-b82a-358c7fce9d89" +version = "1.21.0+2" + +[[deps.Wayland_protocols_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "5db3e9d307d32baba7067b13fc7b5aa6edd4a19a" +uuid = "2381bf8a-dfd0-557d-9999-79630e7b1b91" +version = "1.36.0+0" + +[[deps.Widgets]] +deps = ["Colors", "Dates", "Observables", "OrderedCollections"] +git-tree-sha1 = "e9aeb174f95385de31e70bd15fa066a505ea82b9" +uuid = "cc8bc4a8-27d6-5769-a93b-9d913e69aa62" +version = "0.6.7" + +[[deps.WoodburyMatrices]] +deps = ["LinearAlgebra", "SparseArrays"] +git-tree-sha1 = "c1a7aa6219628fcd757dede0ca95e245c5cd9511" +uuid = "efce3f68-66dc-5838-9240-27a6d6f5f9b6" +version = "1.0.0" + +[[deps.XML2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Zlib_jll"] +git-tree-sha1 = "a2fccc6559132927d4c5dc183e3e01048c6dcbd6" +uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a" +version = "2.13.5+0" + +[[deps.XSLT_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgcrypt_jll", "Libgpg_error_jll", "Libiconv_jll", "XML2_jll", "Zlib_jll"] +git-tree-sha1 = "7d1671acbe47ac88e981868a078bd6b4e27c5191" +uuid = "aed1982a-8fda-507f-9586-7b0439959a61" +version = "1.1.42+0" + +[[deps.XZ_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "beef98d5aad604d9e7d60b2ece5181f7888e2fd6" +uuid = "ffd25f8a-64ca-5728-b0f7-c24cf3aae800" +version = "5.6.4+0" + +[[deps.Xorg_libICE_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "326b4fea307b0b39892b3e85fa451692eda8d46c" +uuid = "f67eecfb-183a-506d-b269-f58e52b52d7c" +version = "1.1.1+0" + +[[deps.Xorg_libSM_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libICE_jll"] +git-tree-sha1 = "3796722887072218eabafb494a13c963209754ce" +uuid = "c834827a-8449-5923-a945-d239c165b7dd" +version = "1.2.4+0" + +[[deps.Xorg_libX11_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxcb_jll", "Xorg_xtrans_jll"] +git-tree-sha1 = "9dafcee1d24c4f024e7edc92603cedba72118283" +uuid = "4f6342f7-b3d2-589e-9d20-edeb45f2b2bc" +version = "1.8.6+3" + +[[deps.Xorg_libXau_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "2b0e27d52ec9d8d483e2ca0b72b3cb1a8df5c27a" +uuid = "0c0b7dd1-d40b-584c-a123-a41640f87eec" +version = "1.0.11+3" + +[[deps.Xorg_libXcursor_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libXfixes_jll", "Xorg_libXrender_jll"] +git-tree-sha1 = "807c226eaf3651e7b2c468f687ac788291f9a89b" +uuid = "935fb764-8cf2-53bf-bb30-45bb1f8bf724" +version = "1.2.3+0" + +[[deps.Xorg_libXdmcp_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "02054ee01980c90297412e4c809c8694d7323af3" +uuid = "a3789734-cfe1-5b06-b2d0-1dd0d9d62d05" +version = "1.1.4+3" + +[[deps.Xorg_libXext_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] +git-tree-sha1 = "d7155fea91a4123ef59f42c4afb5ab3b4ca95058" +uuid = "1082639a-0dae-5f34-9b06-72781eeb8cb3" +version = "1.3.6+3" + +[[deps.Xorg_libXfixes_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] +git-tree-sha1 = "6fcc21d5aea1a0b7cce6cab3e62246abd1949b86" +uuid = "d091e8ba-531a-589c-9de9-94069b037ed8" +version = "6.0.0+0" + +[[deps.Xorg_libXi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libXext_jll", "Xorg_libXfixes_jll"] +git-tree-sha1 = "984b313b049c89739075b8e2a94407076de17449" +uuid = "a51aa0fd-4e3c-5386-b890-e753decda492" +version = "1.8.2+0" + +[[deps.Xorg_libXinerama_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libXext_jll"] +git-tree-sha1 = "a1a7eaf6c3b5b05cb903e35e8372049b107ac729" +uuid = "d1454406-59df-5ea1-beac-c340f2130bc3" +version = "1.1.5+0" + +[[deps.Xorg_libXrandr_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libXext_jll", "Xorg_libXrender_jll"] +git-tree-sha1 = "b6f664b7b2f6a39689d822a6300b14df4668f0f4" +uuid = "ec84b674-ba8e-5d96-8ba1-2a689ba10484" +version = "1.5.4+0" + +[[deps.Xorg_libXrender_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] +git-tree-sha1 = "a490c6212a0e90d2d55111ac956f7c4fa9c277a6" +uuid = "ea2f1a96-1ddc-540d-b46f-429655e07cfa" +version = "0.9.11+1" + +[[deps.Xorg_libpthread_stubs_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "fee57a273563e273f0f53275101cd41a8153517a" +uuid = "14d82f49-176c-5ed1-bb49-ad3f5cbd8c74" +version = "0.1.1+3" + +[[deps.Xorg_libxcb_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "XSLT_jll", "Xorg_libXau_jll", "Xorg_libXdmcp_jll", "Xorg_libpthread_stubs_jll"] +git-tree-sha1 = "1a74296303b6524a0472a8cb12d3d87a78eb3612" +uuid = "c7cfdc94-dc32-55de-ac96-5a1b8d977c5b" +version = "1.17.0+3" + +[[deps.Xorg_libxkbfile_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] +git-tree-sha1 = "dbc53e4cf7701c6c7047c51e17d6e64df55dca94" +uuid = "cc61e674-0454-545c-8b26-ed2c68acab7a" +version = "1.1.2+1" + +[[deps.Xorg_xcb_util_cursor_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_xcb_util_image_jll", "Xorg_xcb_util_jll", "Xorg_xcb_util_renderutil_jll"] +git-tree-sha1 = "04341cb870f29dcd5e39055f895c39d016e18ccd" +uuid = "e920d4aa-a673-5f3a-b3d7-f755a4d47c43" +version = "0.1.4+0" + +[[deps.Xorg_xcb_util_image_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] +git-tree-sha1 = "0fab0a40349ba1cba2c1da699243396ff8e94b97" +uuid = "12413925-8142-5f55-bb0e-6d7ca50bb09b" +version = "0.4.0+1" + +[[deps.Xorg_xcb_util_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libxcb_jll"] +git-tree-sha1 = "e7fd7b2881fa2eaa72717420894d3938177862d1" +uuid = "2def613f-5ad1-5310-b15b-b15d46f528f5" +version = "0.4.0+1" + +[[deps.Xorg_xcb_util_keysyms_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] +git-tree-sha1 = "d1151e2c45a544f32441a567d1690e701ec89b00" +uuid = "975044d2-76e6-5fbe-bf08-97ce7c6574c7" +version = "0.4.0+1" + +[[deps.Xorg_xcb_util_renderutil_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] +git-tree-sha1 = "dfd7a8f38d4613b6a575253b3174dd991ca6183e" +uuid = "0d47668e-0667-5a69-a72c-f761630bfb7e" +version = "0.3.9+1" + +[[deps.Xorg_xcb_util_wm_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] +git-tree-sha1 = "e78d10aab01a4a154142c5006ed44fd9e8e31b67" +uuid = "c22f9ab0-d5fe-5066-847c-f4bb1cd4e361" +version = "0.4.1+1" + +[[deps.Xorg_xkbcomp_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxkbfile_jll"] +git-tree-sha1 = "ab2221d309eda71020cdda67a973aa582aa85d69" +uuid = "35661453-b289-5fab-8a00-3d9160c6a3a4" +version = "1.4.6+1" + +[[deps.Xorg_xkeyboard_config_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_xkbcomp_jll"] +git-tree-sha1 = "691634e5453ad362044e2ad653e79f3ee3bb98c3" +uuid = "33bec58e-1273-512f-9401-5d533626f822" +version = "2.39.0+0" + +[[deps.Xorg_xtrans_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "b9ead2d2bdb27330545eb14234a2e300da61232e" +uuid = "c5fb5394-a638-5e4d-96e5-b29de1b5cf10" +version = "1.5.0+3" + +[[deps.Zlib_jll]] +deps = ["Libdl"] +uuid = "83775a58-1f1d-513f-b197-d71354ab007a" +version = "1.2.13+1" + +[[deps.Zstd_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "622cf78670d067c738667aaa96c553430b65e269" +uuid = "3161d3a3-bdf6-5164-811a-617609db77b4" +version = "1.5.7+0" + +[[deps.eudev_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "gperf_jll"] +git-tree-sha1 = "431b678a28ebb559d224c0b6b6d01afce87c51ba" +uuid = "35ca27e7-8b34-5b7f-bca9-bdc33f59eb06" +version = "3.2.9+0" + +[[deps.fzf_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "6e50f145003024df4f5cb96c7fce79466741d601" +uuid = "214eeab7-80f7-51ab-84ad-2988db7cef09" +version = "0.56.3+0" + +[[deps.gperf_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "0ba42241cb6809f1a278d0bcb976e0483c3f1f2d" +uuid = "1a1c6b14-54f6-533d-8383-74cd7377aa70" +version = "3.1.1+1" + +[[deps.libaom_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "522c1df09d05a71785765d19c9524661234738e9" +uuid = "a4ae2306-e953-59d6-aa16-d00cac43593b" +version = "3.11.0+0" + +[[deps.libass_jll]] +deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl", "Zlib_jll"] +git-tree-sha1 = "e17c115d55c5fbb7e52ebedb427a0dca79d4484e" +uuid = "0ac62f75-1d6f-5e53-bd7c-93b484bb37c0" +version = "0.15.2+0" + +[[deps.libblastrampoline_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" +version = "5.8.0+1" + +[[deps.libdecor_jll]] +deps = ["Artifacts", "Dbus_jll", "JLLWrappers", "Libdl", "Libglvnd_jll", "Pango_jll", "Wayland_jll", "xkbcommon_jll"] +git-tree-sha1 = "9bf7903af251d2050b467f76bdbe57ce541f7f4f" +uuid = "1183f4f0-6f2a-5f1a-908b-139f9cdfea6f" +version = "0.2.2+0" + +[[deps.libevdev_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "141fe65dc3efabb0b1d5ba74e91f6ad26f84cc22" +uuid = "2db6ffa8-e38f-5e21-84af-90c45d0032cc" +version = "1.11.0+0" + +[[deps.libfdk_aac_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "8a22cf860a7d27e4f3498a0fe0811a7957badb38" +uuid = "f638f0a6-7fb0-5443-88ba-1cc74229b280" +version = "2.0.3+0" + +[[deps.libinput_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "eudev_jll", "libevdev_jll", "mtdev_jll"] +git-tree-sha1 = "ad50e5b90f222cfe78aa3d5183a20a12de1322ce" +uuid = "36db933b-70db-51c0-b978-0f229ee0e533" +version = "1.18.0+0" + +[[deps.libpng_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Zlib_jll"] +git-tree-sha1 = "d7b5bbf1efbafb5eca466700949625e07533aff2" +uuid = "b53b4c65-9356-5827-b1ea-8c7a1a84506f" +version = "1.6.45+1" + +[[deps.libvorbis_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Ogg_jll", "Pkg"] +git-tree-sha1 = "490376214c4721cdaca654041f635213c6165cb3" +uuid = "f27f6e37-5d2b-51aa-960f-b287f2bc3b7a" +version = "1.3.7+2" + +[[deps.mtdev_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "814e154bdb7be91d78b6802843f76b6ece642f11" +uuid = "009596ad-96f7-51b1-9f1b-5ce2d5e8a71e" +version = "1.1.6+0" + +[[deps.nghttp2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" +version = "1.52.0+1" + +[[deps.oneTBB_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "7d0ea0f4895ef2f5cb83645fa689e52cb55cf493" +uuid = "1317d2d5-d96f-522e-a858-c73665f53c3e" +version = "2021.12.0+0" + +[[deps.p7zip_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" +version = "17.4.0+2" + +[[deps.x264_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "4fea590b89e6ec504593146bf8b988b2c00922b2" +uuid = "1270edf5-f2f9-52d2-97e9-ab00b5d0237a" +version = "2021.5.5+0" + +[[deps.x265_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "ee567a171cce03570d77ad3a43e90218e38937a9" +uuid = "dfaa095f-4041-5dcd-9319-2fabd8486b76" +version = "3.5.0+0" + +[[deps.xkbcommon_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Wayland_jll", "Wayland_protocols_jll", "Xorg_libxcb_jll", "Xorg_xkeyboard_config_jll"] +git-tree-sha1 = "63406453ed9b33a0df95d570816d5366c92b7809" +uuid = "d8fb68d0-12a3-5cfd-a85a-d49703b185fd" +version = "1.4.1+2" +""" + +# ╔═║ Cell order: +# ╠═f2c2529c-da67-11ef-2eba-e53e2c6e2cd6 +# ╠═8af5bdc7-13ee-4f45-ac20-68d7a108ca61 +# ╠═cec4454f-7461-45a2-8f1f-27a127b2856c +# ╠═7fadaa1a-e9b3-403d-8898-f9e051f7436b +# ╠═22690edd-d1ef-4edd-8e29-7c7dcac82d76 +# ╠═1107bce5-1d49-4aad-b9c2-7bf22ec75793 +# ╠═f83e4398-df26-4a83-a1c9-928aeac6a7ad +# ╠═5f97b5e8-6756-4f7d-a038-0312582b5873 +# ╠═902cec71-8bd3-4174-93d4-dc631758f58d +# ╠═59019dca-b06f-46e4-96fd-954479573b56 +# ╠═c0ebd892-8d59-425c-9303-113634c6fd12 +# β•Ÿβ”€555abde1-010f-42b2-b5a8-83ccc8ec29c0 +# ╠═cebc9e1c-9f9e-430e-980d-9438c12b4702 +# ╠═6f5a53b0-068c-4146-a311-9cbfca2435cd +# β•Ÿβ”€00000000-0000-0000-0000-000000000001 +# β•Ÿβ”€00000000-0000-0000-0000-000000000002 diff --git a/scripts/MCMC.jl b/scripts/MCMC.jl new file mode 100644 index 00000000..2d550da1 --- /dev/null +++ b/scripts/MCMC.jl @@ -0,0 +1,1053 @@ +### A Pluto.jl notebook ### +# v0.20.3 + +using Markdown +using InteractiveUtils + +# This Pluto notebook uses @bind for interactivity. When running this notebook outside of Pluto, the following 'mock version' of @bind gives bound variables a default value (instead of an error). +macro bind(def, element) + #! format: off + quote + local iv = try Base.loaded_modules[Base.PkgId(Base.UUID("6e696c72-6542-2067-7265-42206c756150"), "AbstractPlutoDingetjes")].Bonds.initial_value catch; b -> missing; end + local el = $(esc(element)) + global $(esc(def)) = Core.applicable(Base.get, el) ? Base.get(el) : iv(el) + el + end + #! format: on +end + +# ╔═║ 103e5ba0-cfdc-11ee-13b1-cf53dfdd9a3b +# ╠═║ skip_as_script = true +#=╠═║ +begin + using Pkg + Pkg.activate("..") +end + ╠═║ =# + +# ╔═║ d778ce04-8df4-42ef-95f1-9cf4880e0420 +using Turing, StatsPlots, Distributions + +# ╔═║ 0350aa5b-d105-4dfa-a454-59873672b3a0 +using Plots, PlutoUI, LaTeXStrings, LinearAlgebra, Random + +# ╔═║ e87dd9a4-f4ed-46d7-9f9d-dae0cadb7d05 +md""" +# Bayesian reasoning and advanced sampling methods + +In the previous chapter, we explored how one can build joint probability distributions and generate samples from them. This chapter explores inference: we will fix one or multiple variables, which represents observing them, and will sample from the conditional distribution. +""" + +# ╔═║ 0f6cf892-b218-4740-a298-43f47e51acae +md""" +## Introduction to Bayesian reasoning + +In the previous chapter, we have seen how to build complex distributions from simple ones. We stressed that our probabilistic programming framework is extremely flexible and allows us to write general code to compute things or even include sophisticated models, such as the ordinary differential equations we will use in subsequent chapters. In effect, we have built a simulator that can generate data $\mathcal{D}$ from one or more inputs, parameters, or hidden variables $\theta$. The simulator is stochastic, so it can be seen as a probability distribution. We will denote the simulator as $P(\mathcal{D}\mid \theta)$, i.e., we convert parameters and inputs into data. The problem we want to study in this chapter is that of *inference*: given that we observe data, what can we say about the parameters, i.e., can we find $P(\theta\mid \mathcal{D})$? We have already seen how this distribution can be attained using Bayes' theorem: + +$$P(\theta\mid\mathcal{D}) = \frac{P(\mathcal{D}\mid\theta)\,P(\theta)}{P(\mathcal{D})}\,,$$ + +of which each component represents an important concept: +- $P(\mathcal{D} \mid \theta)$ is called the *likelihood distribution*, it represents the probability of the data, given the parameters; +- $P(\theta)$ is the *prior distribution* representing our beliefs and knowledge about the parameters before we observe the data; +- $P(\mathcal{D})$ is the model *evidence*, representing how probable this model or simulator can generate this data over all possible values of the parameters; +- $P(\theta\mid \mathcal{D})$ is the desired *posterior distribution*, representing our beliefs about the values of the parameters, given that we have observed data. + +So, Bayes' theorem for data in words is + +$$\text{posterior} = \frac{\text{likelihood}\times\text{prior}}{\text{evidence}}\,.$$ + +As noted earlier, the model evidence is not obvious to compute in general, as we have to integrate over all possible values of $\theta$, which may be high-dimensional to get this. However, given that we have observed the data, $P(\mathcal{D})$ can be seen as a constant that ensures that the posterior is a normalized distribution. So, we have + +$$P(\mathcal{D}\mid \theta) \propto P(\theta\mid \mathcal{D})\,P(\theta)\,.$$ + +To get the *maximum a posteriori probability* value of $\theta$, we have to solve the following optimization problem: + +$$\theta^\star_{MAP}=\text{arg max}_{\theta}\, P(\theta\mid \mathcal{D})\,P(\theta)\,.$$ + +The MAP estimate balances the prior on $\theta$ with the likelihood of the data. The final estimate of the parameters or state will be something in between both, depending on their relative strength. + +Compare the MAP estimate with the *maximum likelihood* estimator for $\theta$ you have seen in statistics (e.g., to derive the estimator of the mean of a normal distribution), which is + +$$\theta^\star_{ML}=\text{arg max}_{\theta}\, P(\mathcal{D} \mid \theta)\,.$$ + +It only depends on the likelihood, not on any prior beliefs on $\theta$. + +Computations are usually performed after log-transforming the distributions. This is because high-dimensional distributions can represent many datasets, so any one point, the evaluation value will be extremely small. Furthermore, many probability distributions have very friendly forms if you take their logarithm and discard constants that don't depend on the state variables; for example, the log-PDF of a normal distribution is given by + +$$-\frac{(x-\mu)^2}{\sigma^2} + \text{cst}\,,$$ +where the constant term does not depend on $x$ but merely ensures normalization. As the logarithm is a monotonically increasing transformation, it does not change optimization problems: minimizing the log-likelihood gives the same estimator as minimizing the likelihood and ditto for the posterior. Note that this is the reason why maximum-likelihood estimation is equivalent to least-squares under the assumption of homoskedastic normally distributed noise. + +The MAP and ML are point estimators; they represent only a single value. In statistics, one often represents an estimation by a $(1-\alpha)$ (e.g., 95%) *confidence interval*. These are two bounds $[l, u]$ of which the data indicates it is very likely to contain the true parameter. + +> The proper interpretation under frequentist statistics is that if similar data is collected many times and one uses suitable methods to create the confidence intervals, the true, unknown parameter $\theta$ would fall in these intervals $(1-\alpha)$% of the times. + +Thinks are much more straightforward using Bayesian reasoning: we have the full posterior distribution $P(\theta\mid \mathcal{D})$, which contains all information about $\theta$ given the data, the model and our initial beliefs. We can use quantiles to generate an interval, for example of 95%. This directly represents our belief what $\theta$ could be. In Bayesian statistics, these types of intervals are called *credibility intervals*. We can ask questions like whether it is likely that $\theta>0.8$ etc! + +You might wonder how we obtained the prior $P(\theta)$ in the first place. The prior is the main reason why some statisticians dislike Bayesian statistics, which is that they are inherently subjective. We can identify different types of priors based on the amount of information that it contains: +β€’ **Informative prior:** This prior incorporates existing knowledge or beliefs about the parameter, potentially biasing the posterior towards specific values. For example, if we know a historical germination rate for seeds, we could use that information to inform the prior distribution for the current experiment. +β€’ **Weakly informative prior:** This prior acknowledges some prior knowledge but avoids strong biases. It might specify a range or a general shape for the parameter distribution, allowing the data to significantly influence the posterior. +β€’ **Diffuse or uninformative prior:** This prior represents minimal or no prior knowledge about the parameter. It is often chosen as a uniform distribution across the possible parameter values, letting the data dictate the posterior distribution entirely. + +Let us revise the pepper seed germination example from the previous chapter to make Bayesian reasoning more concrete. Here, we used a Binomial distribution Binom(10, $p$) to model the number of seeds that could germinate (the likelihood). Suppose we want to infer the germination probability $p$ given that eight of the ten seeds germinated. We can plot this likelihood function by plotting the PMF $p_X(k)=P(X=k)$ of this distribution for values of $p$ keeping $k$ fixed to 10. Note that our prior (the distribution of $p$ over different strains) was given by a Beta(8, 3) distribution, which represents a bump at around $p\approx 0.7272$ with a considerate margin for higher or lower values. When we look at the likelihood of $p$ given that $X=8$, we see a sharp peak at $p=0.8$. The data-generating model assumes hence tell us that $p=0.8$ (the maximum-likelihood estimation for $p$) is the most likely, with higher or lower values being considerably less likely. It is almost impossible that eight seeds have germinated given that $p < 0.5$. The posterior (footnote of these together) is a distribution that lies between both distributions and has a peak at $p^\star_\text{MAP}=0.79$. As we see, the posterior is more conservative! +""" + +# ╔═║ eb37dd4b-3af0-4534-92c2-e495b83024be +md" Number of seeds germinated : $(@bind k Slider(0:10, default=9, show_value=true))" + +# ╔═║ 29928abf-f010-438e-9b60-e6673a51ddf5 +k + +# ╔═║ 768ea152-00a5-4409-86eb-9a1c554eb3b2 +mean(Beta(8, 3)) + +# ╔═║ 959cd079-59a4-42f5-a868-4cc0675c694b +seed_likelihood = p -> pdf(Binomial(10, p), k) + +# ╔═║ 39cb8a88-9bfe-4b51-8f2f-b89b45dccc95 +seed_prior = p -> pdf(Beta(8, 3), p) + +# ╔═║ 667f2069-fd32-4c3e-aebb-b75a38bf84b9 +seed_posterior = p -> pdf(Beta(8+k, 3+10-k), p) + +# ╔═║ 472cea3d-12a8-449a-8e87-6c1b5aaa1fd7 +md"In this case, we can compute the exact posterior because the beta distribution and the binomial distribibition are *conjugate*, meaning that a binomial likelihood on a beta prior results in a beta posterior with updated parameters. Though conjugated priors are important in Bayesian statistitics, we won't make use of them as we will use a sampling approach." + +# ╔═║ 3ef47022-f9e3-434e-87a3-20b1870a7c24 +p_ML = argmax(seed_likelihood, 0:0.01:1) + +# ╔═║ 6004b26a-8f10-492d-bdd2-1d317d8bb394 +p_MAP = argmax(seed_posterior, 0:0.01:1) + +# ╔═║ 2ab01769-42cd-44e1-8d4c-2c8b477c732a +md"Let us consider a bit of a more of a classical statistical example. Suppose we have a vector $\mathbf{y}$ with values i.i.d. distrubuted from a normal distribution $y_i\sim$Normal($\mu$, $\sigma$), with unknown mean and standard deviation." + +# ╔═║ 4d6d6c9e-c2a8-4c7d-9d18-89d2e9d0c213 +y = [7.2, 8.3, 5.4, 9.8, 7.9] + +# ╔═║ ba06e8a5-c142-4963-97b4-783ed4c706bf +mean(y), std(y) # sample mean and standard deviation + +# ╔═║ f44abcc5-9010-4d10-b722-ef8147c8fd66 +md"""Your basic statistics course would course have estimators for $\mu$ and $\sigma$, the sample mean and the square root of the sample variance, respectively. Let us use a Bayesian reasoning and place a prior on these two unknown parameters: + +$$\mu \sim \text{Normal}(0, 20)$$ + +$$\sigma \sim \text{InverseGamma}(1/10)$$ + +which are chosen to be "reasonable". +""" + +# ╔═║ 0c29af96-949d-47b3-869f-274ed39c9d25 +md"The full, hierarchical model can be implemented as a Turing model." + +# ╔═║ 2cbe07e6-8cf0-4dc4-8aea-f56059ffa367 +md"Note that this is now a distribution over 2 + $n$ variables as $\mathbf{y}$ can be of arbirary length. By giving $y$ as an argument, we fix the variables, though the parameters $\mu$ and $\sigma$ remain random variables." + +# ╔═║ afb7bdca-a8de-4342-9212-5e81fa47963a +md"The prior over $\mu$ and $\sigma$ is a product distribution of a normal (centered around 0 and large standard deviation) and an inverse Gamma." + +# ╔═║ 1fbd13c1-cc93-4e5b-98f1-ace195d20f97 +md"The likelihood of $\mu$ and $\sigma$ can be obtainded from the PDF of a normal distirbution over the parameters: + +$$L(\mu, \sigma\mid\mathbf{y}) = \prod_{i=1}^n \frac{1}{\sqrt{2\pi}\sigma}e^{-\frac{(y_i-\mu)^2}{2\sigma^2}}\,.$$" + +# ╔═║ 213465af-f980-4848-9e5a-0cb5429f4af8 +md"The posterior is the product of the prior and the likelihood." + +# ╔═║ 7f2a7d88-442f-431e-8e09-42082bda8d24 +md"The posterior is slightly shifted compared to the likelihood, though both are quite close! We see that the posterio distribution is centred around the sample mean and standard deviation. The posterior identifies which parameters of the normal distribution have likely given rise to the data. At sight, the mean $\mu$ is likely between 6 and 9, while the standard deviation is likely to be between 1 and 2. Using numerical methods, we can identify the MAP estimator of the parameters and credibility intervals. Inference in two dimensions is hence still quite tractable. However, in what follows, we will use sampling to get observations from the posterior, which we can use to learn everything we want to know about the distributions and hence our parameters or variables of interest." + +# ╔═║ 985c1d3e-bc02-4dc5-9a28-d0ec9edf5cc9 +md""" +## Rejection sampling + +> A group of little kids are playing at the beach. They have drawn a circle in the sand and throw little pebbles, counting which fell into its boundaries. + +Given some constraints, rejection sampling is a simple framework to sample from reasonably complex distributions. We have already encountered rejection sampling, without calling it as such, in our Monte-Carlos algorithm for estimating $\pi$. Here, we discuss the univariate version. The generalization to multivariate distributions is trivial. + +As we have argued earlier, we often know the probability density or mass function up to the normalization constant $Z$, which requires integration: + +$$p(x) = \frac{1}{Z}\tilde{p}(x)\,,$$ + +where $\tilde{p}(x)$ is the unnormalized PDF, from which we could theoretically get the normalization constant as + +$$Z = \int_{-\infty}^\infty\tilde{p}(x)\mathrm{d}x\,.$$ + +For example, remember that when we obtain the unnormalized posterior distribution by multiplying the prior with the likelihood with the hard-to-compute evidence. The normalization is constant is merely a scaling factor. + +Rejection sampling uses a *proposal distribution* $q(x)$ from which it is easy to sample, e.g., a uniform or normal distribution. Importantly, the proposal distribution and the target distribution need to have the same support. Next, we need to have a constant $M$, such that $Mq(x)\ge \tilde{p}(x)$ for all $x$, meaning that we rescale the proposal distribution such that it lies above the target distribution. Rejection sampling is done in three steps using two random samples: + +1. generate a sample from the proposal distribution: $x \sim q(x)$; +2. compute the *acceptance probability* $\alpha=\frac{\tilde{p}(x)}{Mq(x)}$; +3. generate a uniformly-distributed number: $u\sim$Unif(0,1): + - if $u\le \alpha$, then **accept** $x$ as a sample of $p(x)$ + - if $u>\alpha$, **reject** $x$ and run the algorithm. + +The acceptance probability, $\alpha = \frac{\tilde{p}(x)}{Mq(x)}$, ensures that the accepted samples are drawn from the target distribution $p(x)$. When a sample $x$ is generated from the proposal distribution $q(x)$ and an acceptance probability $\alpha$ is computed, it effectively scales the probability of accepting $x$ based on how likely it is under the target distribution relative to the proposal distribution. Rejection sampling is an exact method; accepted samples follow the target distribution. + +We might fail at generating a sample (rejection), so we must rerun it until it accepts a sample. The probability of accepting a sample is + +$$P(\text{accept}) = \int_{-\infty}^\infty\alpha q(x)\mathrm{d}x=\int_{-\infty}^\infty\frac{\tilde{p}(x)}{Mq(x)} q(x)\mathrm{d}x=\frac{Z}{M}\,,$$ + +meaning that we need on average $M/Z$ throws to generate a sample from $p(x)$ (this follows a geometric distribution). It should be clear that very low acceptance rates are the main potential reasons why rejection sampling won't scale for certain problems. A low acceptance rate could be due to: +- a poor match between $q(x)$ and $p(z)$ (try to find a proposal distribution that closely resembles the shape of the target distribution); +- the constant $M$ being too high (try to find as small a value of $M$ as possible). + +One modification to deal with low acceptance rates is *adaptive rejection sampling*, which constructs a sampling distribution $q(x)$ on the fly based on the generated samples. For example, you could make $q(x)$ piecewise linear and, with every draw, update these pieces to better match the target distribution. +""" + +# ╔═║ a0a1deec-75b6-4061-aa32-ad5e940d4123 +md"M : $(@bind M Slider(2.1:0.2:10, show_value=true))" + +# ╔═║ d91cea07-fb14-4b93-8ad1-31fb8f3afe8d +md" n throws : $(@bind n_rejection_sampling Slider(10:10:5000, default=100, show_value=true))" + +# ╔═║ d669d181-dc13-4921-9aca-88acae1197eb +md""" +## Markov chain Monte Carlo methods + +Rejection sampling and similar methods scale poorly to problems with three dimensions and more. Here, we discuss a much more general and powerful framework called Markov chain Monte Carlo (MCMC). These methods have their origins in physics and it was since the 1980's that they significantly impacted statistical modeling. In contrast to the earlier seen sampling methods, MCMC generates samples by performing a biased random walk in the sampling space, which converges (hopefully!) to the target distribution. These methods produces 'chains' of samples that are not independent but posses a certain memory that slowly decays. When making inference, one has to be cautious the the effective sample size using MCMC can be much lower than when the samples would have been i.i.d. For this reason, the samples that are obtained by MCMC methods are often called *pseudosamples*. +""" + +# ╔═║ 9c48f6a4-db8c-4e15-8486-4dd9b281a80d +md""" +### Brief refresher of Markov chains + +Before delving into the specifics of the MCMC, let us recap the basics of elementary Markov chains. A Markov chain is a mathematical model that describes sequences of states (usually changing in time) where the probability distribution of the next state only depends on the next states. Markov chains are ubiquitously used in science and technology for modeling sequences: text, DNA sequences, the weather, stock markets, etc. The changes in states are called *transitions*, and the changes going from one state to another are called the transition probability, which is stored in a *transition matrix*. For example, suppose we model the weather where there are only two states: "sunny" and "rainy". We can model weather transitions from one day to the next as: + +$$T = \begin{bmatrix}0.9&0.1\\0.5 & 0.5\end{bmatrix}\,,$$ +in which $T_{ij}$ represents the probability of state $i$ transitioning into state $j$. Here, it means that when it is sunny, we have a 90% chance that the next day will also be sunny and 10% that the next day will be rainy (first row). If we represent the state probability vector at time $t$ as $\mathbf{q}_t$, then we can update these probabilities as + +$$\mathbf{q}_{t+1} = T^\intercal\mathbf{q}_t\,.$$ +For example, if at $t=0$, it rains, i.e., $\mathbf{q}_0 = [0,1]^\intercal$ (we are 100% sure), then the next day, it has 50% of raining $\mathbf{q}_1 = [0.5,0.5]'$ and the next day, the state probabilities are $\mathbf{q}_2 = [0.5\times 0.9+0.5\times 0.5, 0.5\times 0.1+0.5\times0.5]^\intercal = [0.7, 0.3]^\intercal$. We see that our initial 'sharp' belief about the weather changes into a vector of state probabilities. + +""" + +# ╔═║ e7bd6347-ac8a-4460-b0f7-4692968205f7 +Tweather = [0.9 0.1; + 0.5 0.5] + +# ╔═║ 807fe053-bf07-446b-aac6-e8de716c5e2a +q0 = [0,1] + +# ╔═║ 012ff9ea-08ae-46fd-afab-49341f35f57a +q1 = Tweather' * q0 # distribution after one time step + +# ╔═║ cf858c95-d2b9-4f53-af1a-d5a511f531ce +q2 = Tweather' * q1 # distribution after two time steps + +# ╔═║ d77c1db1-925f-4134-a860-8a1683b3adee +md""" +We see that our initial 'sharp' belief about the weather changes into a vector of state probabilities. There are two ways to interpret these state probability vectors: + +1. **population level**: In this interpretation, the state probability vector represents the fraction of the population or system occupying each state at a particular time step. When we consider a large number of random points in time (or far-away) locations, 50% of locations with rain will have rain the next day, and 50% will have sunny weather the next day. +2. **individual level**: Here, we consider a single individual (sometimes called a *particle* in terms of MCMC) over a long period of time and model the change in probability of being in different states. Here, a person who sees rain can compute the probability of seeing rain the next day and the day after that and so on. + + A natural question would be what the weather would likely be after a very long time, e.g., 100 days. We can compute this directly as: + +$$\mathbf{q}_{100} = (T^\intercal)^{100}\mathbf{q}_0\,,$$ + +which evaluates as $\mathbf{q}_{100}\approx [5/6, 1/6]$. +""" + +# ╔═║ cc92d39d-830f-451c-81b4-de00f74545bf +q100 = Tweather'^100 * q0 # stationary distribution + +# ╔═║ c37ea17f-57b5-4871-a4d9-5aa5e609c846 +md""" +Over long times, this chain seems to converge to a *stationary distribution*, often denoted as $\boldsymbol{\pi}$. In the population interpretation, this would mean that, from many regions for which the Markov chain can describe the weather transition, about 83% will have sunny weather in the long run. For an individual region, it means that if you wait long enough, there is an 83% chance of having a sun. Note that here, it would not matter with what initial state vector one starts with. We always converge to $\boldsymbol{\pi}$. For a stationary distribution, it should hold that + +$$\boldsymbol{\pi} = T^\intercal \boldsymbol{\pi}\,,$$ + +meaning that the state probability vector is 'in equilibrium':the state probabilities do not change anymore. We can find the stationary distribution by normalizing the eigenvector of $T^\intercal$ that corresponds to an eigenvalue of 1. A Markov chain does not necessarily have a stationary distribution, for example, if it is periodic. +""" + +# ╔═║ 38a6bd5f-78ab-43be-a010-6fe4c209b1a7 +md"Consider a second example, in which we have ten states of which only transitions of $i$ to $i-1$, $i$, or $i+1$ are allowed (this is called a birth-death process). For example, the transition matrix is given by" + +# ╔═║ eab53e8a-b7cd-4c97-83f1-bcfd9c59cc4f +begin + N = 10 + rng = MersenneTwister(11) + + p_remain = rand(rng, 0.1:.1:0.9, N) + T = [i==j ? p_remain[i] : 0.0 for i in 1:N, j in 1:N] + for i in 1:N-1 + T[i,i+1] = 1 - p_remain[i] + end + T[end,1] = 1 - p_remain[end] + + #T = Tridiagonal(0.3ones(9), 0.1ones(10), 0.6ones(9)) + #T ./= sum(T, dims=2) +end; + +# ╔═║ 7915a972-df48-462c-bcc7-2ca94a98e441 +T + +# ╔═║ 53799772-c8a1-4055-a01e-42f147ffc253 +md"Starting from a single state, we can model how the state vector evolves to a the stationary distribution." + +# ╔═║ b3c45c85-d075-452a-a827-b7d1e00a17a1 +md"Start from state $(@bind i0 Select(1:10, default=4))" + +# ╔═║ fcfa5203-73df-40f6-a6c9-eda531054b38 +pβ‚€ = [i==i0 ? 1.0 : 0.0 for i in 1:size(T,2)] + +# ╔═║ b2cbf023-a0ea-4714-b30b-b331a081c7fa +Ο€_mc = (T')^100 * pβ‚€ + +# ╔═║ 45e848aa-3e6a-47b5-a0cc-fa09dd9a4ae3 +md"Note that, except for states 1 and 10, the probability of moving to a higher state is twice that of moving to a lower state. Remaining in the same state occurs with a probability of 0.1. When we start in the first state, we see that the state probability vector quickly settles to an equilibrium distribution where higher states are much more likely than lower states. The time needed to approximately reach the stationary distribution is called the *mixing time*." + +# ╔═║ ae080b48-87f8-4af6-b9d1-224080d4b787 +md""" +*Ergodicity* is a crucial property for MCMC (Markov chain Monte Carlo) methods to function effectively. It means that a long chain will eventually visit all the states. In MCMC, we design Markov chains where the target distribution (the distribution we want to sample from) becomes the stationary distribution. This means the chain will eventually spend most of its time in regions with high probability under the target distribution. + +Ergodicity ensures two key aspects for successful sampling: + +1. **Recurrence**: The chain can revisit any state from any starting point after a finite number of steps. This guarantees the chain explores the entire sample space of the target distribution, preventing it from getting stuck in specific regions. +2. **Aperiodicity**: The chain doesn't get trapped in cycles of states. It can move freely between all possible states without getting stuck in a repeating pattern. + +These properties allow MCMC to converge to the target distribution over time. Without ergodicity, the chain might get stuck in specific areas that don't represent the actual distribution, leading to biased samples. In essence, ergodicity ensures the chain effectively explores the entire landscape of the target distribution, enabling MCMC to generate representative samples. +""" + +# ╔═║ 0a4f1446-e49e-4281-be44-52d3ac4a7854 +md""" +### Metropolis-Hastings + +The *Metropolis-Hastings (MH) algorithm* works similarly to rejection sampling; we again use a proposal distribution from which we can easily sample. These samples can again be accepted or rejected based on information from the (unnormalized) target distribution. The main difference is that rejection sampling generates each sample independently, while the MH algorithm generates a path where each new candidate sample from the proposal distribution is based on the previously accepted sample. This way, the MH algorithm generates a random walk in the space one wants to sample. This random walk is constructed so that, in the long run, the probability of being in a particular region matches the target density or mass function. + +We will denote the samples that are generated using indices $\mathbf{x}_1, \mathbf{x}_2, \mathbf{x}_3,\ldots$ and a candidate sample (which may or may not end up in the chain) is denoted as $\mathbf{z}^\star$. Our proposal distribution generates a new sample based on the previous sample at step $t$: + +$$\mathbf{x}^\star \sim q(\mathbf{x}\mid \mathbf{x}_t)\,.$$ + +In the original formulation, the proposal distribution is symmetric (i.e., $q(\mathbf{x}\mid \mathbf{x}')=q(\mathbf{x}'\mid \mathbf{x})$), so this is simply referred to as the Metropolis algorithm. For example, as a proposal distribution, you could use a normal distribution centered around $\mathbf{x}_t$. When generating a candidate sample, it is accepted with an acceptance probability + +$$\alpha(\mathbf{x}^\star, \mathbf{x}_t) = \min\left(1, \frac{\tilde{p}(\mathbf{x^\star})}{\tilde{p}(\mathbf{x}_t)}\right)\,.$$ + +In practice, one generates a random number $u$ over the unit interval $(0,1)$ and accepts the sample if $\alpha(\mathbf{x}^\star, \mathbf{x}_t)>u$ (note that you can ignore the minimum when the candidate has a higher probability than the previous sample, we always accept). So, if the candidate is accepted, we set $\mathbf{z}_{t+1}=\mathbf{z}^\star$; otherwise the sample is discarded and $\mathbf{z}_{t+1}=\mathbf{z}_t$ and another candidate is drawn from the same proposal distribution. In practice, however, only a single copy is kept, often with an integer weighting factor recording how often that state appears. Again, we emphasise that $\mathbf{x}_1, \mathbf{x}_2, \mathbf{x}_3,\ldots$ is not an independent sample, however, $\mathbf{x}_t$ tends to $p(\mathbf{x})$ when $t\rightarrow \infty$. Successive samples will be highly correlated. If you want independent samples, you can either: +- only retain every $M$-th sample in a long chain (e.g., every 100 samples); +- run several independent, shorter chains and take the final sample of each. + +It is not trivial to say which strategy is best in general. A chain will need a certain burn-in period to match the target distribution well, so a single, long chain might be effective. However, a set of independent chains could quickly explore different regions of our distribution, in addition to being able to run at several cores of your computer or cluster at the same time. + +The reason why this algorithm works can be seen by seeing this as a continuous Markov chain with transition function $T(\mathbf{x}_{t+1}, \mathbf{x}_{t})$, for which a stationary distribution should satisfy: + +$$p(\mathbf{x})=\sum_{\mathbf{x}'}T(\mathbf{x}', \mathbf{x})p(\mathbf{x}')\,.$$ + +A sufficient condition for ensuring that $p(\mathbf{x})$ is a stationary distribution if the transition probabilities satisfy *detailed balance* , defined by + +$$p(\mathbf{x})T(\mathbf{x}, \mathbf{x}') = p(\mathbf{x}')T(\mathbf{x}', \mathbf{x})\,.$$ + +You might already see, that if we choose $T(\mathbf{x}, \mathbf{x}')$ to be symmetric, we can obtain the acceptance probability from choosing an transition probability + +$$T(\mathbf{x}, \mathbf{x}') = \alpha(\mathbf{x}', \mathbf{x}) q(\mathbf{x}', \mathbf{x})\,.$$ + +From this, we can see that the suggested probability satisfies the detailed balance. + +Following this reasoning, the general MH algorithm with non-symmetric proposal distributions uses a slightly different acceptance probability: +$$\alpha(\mathbf{x}^\star, \mathbf{x}_t) = \min\left(1, \frac{\tilde{p}(\mathbf{x^\star})q(\mathbf{x}_t\mid \mathbf{x}^\star)}{\tilde{p}(\mathbf{x}_t)q(\mathbf{x}^\star\mid \mathbf{x}_t)}\right)\,,$$ +The Metropolis algorithm is a special case. In Turing, you can specify the proposal distribution, though the default uses the prior distribution. +""" + +# ╔═║ b9587b83-1521-407a-a466-9566d022d402 +function metropolis_hastings(p, xβ‚€, q; n=100) + samples = [xβ‚€] + accepted = [false] + xβ‚œ = xβ‚€ + while sum(accepted) < n + xβ€² = rand(q(xβ‚œ)) + push!(samples, xβ€²) + Ξ± = min(1.0, p(xβ€²) / p(xβ‚œ)) + if rand() < Ξ± + xβ‚œ = xβ€² + push!(accepted, true) + else + push!(accepted, false) + end + end + return samples, accepted +end + +# ╔═║ 5d8894c1-25d7-41e5-a99c-bca8119851fe +q_MH = x -> Normal(x, 1) + +# ╔═║ 094b4405-6205-4b85-a311-c79cf6028498 +md"Instead of using a homebrewn MH algorithm, it might now be the ideal time to illustrate the built-in Turing sampler on our `uncertain_normal` example. Sampling from the posterior distribution can be done using the `sample` function with the appropriate distribution, algorithm and sample size. Here, for didactive purposes, we fixed the seed in the optional first argument." + +# ╔═║ e1cb4a40-4a8a-4ff9-9406-f99aee6fdd57 +md"By deafult, the MH algorithm uses the prior diistribution. You can set this to whichever distribution you like. We can use the function `summarize` to look at some summary statistics of our chains." + +# ╔═║ 56f7dfd2-2c81-403a-9c11-0d93c10f604e +md"For now, we focuss on the just the mean and standard deviation. The average and standard deviation of $\mu$ and $\sigma$ our chain more or less matches the what we expect based on the earlier plot. We can also use the function `quantile` to see these basic quantile distributions." + +# ╔═║ a8d1b7e7-03df-4d05-be5f-758f98bb1c26 +md"Plotting the values of the chain, together with empirical data (can be done using just `plot(chain)`) shows that the MH chain does not generate a lote of unique values." + +# ╔═║ f97d0f4c-8b3c-4ea7-bcd2-6019ab831734 +md" Most of the candidates are rejected! This is because our prior is far too broad as a candidate distribution. Let us create a more clever MH version." + +# ╔═║ 2cf4022e-1b68-4a69-b6d0-669c3e5ac230 +my_MH = MH(:Οƒ=>s->InverseGamma(s), + :ΞΌ=>m->Normal(m, 1/2)) + +# ╔═║ 0c652efb-0edb-4a4e-a14c-7d5ac6eb5ffa +md"This looks much better! Our proposal is closer to our canidates, so we can stick closer to high-density regions. Likely using this chain, we can make sensible inferences about that parameters of the model! + +If we plot the chain on the posterior, we see a good fit." + +# ╔═║ 69f2c623-632f-4df4-8566-a48574c0f9fb +md""" +### Gibbs sampling + +Gibbs sampling can be seen as a special case of the Metropolis-Hasting's algorithm. The idea behind Gibbs sampling is quite simple: though sampling from an unnormalized distribution $p(x_1, x_2, \ldots, x_n)$ is hard, it might be easier to sample each $x_i$ one at the time and conditioning on the previous samples of the other variables. For example, suppose we want to sample from a distribution with three variables, $p(x_1, x_2,x_3)$ and at step $t$, we have the sample $(x_{1,t}, x_{2,t}, x_{3,t}$). We cycle through the variables in turn, replacing $x_{1,t}$ by sampling + +$$x_{1,t+1}\sim p(x_1\mid x_{2,t}, x_{3,t})\,.$$ + +Next, we sample the second variable as: + +$$x_{2,t+1}\sim p(x_2\mid x_{1,t+1}, x_{3,t})\,,$$ + +and, finally: + +$$x_{3,t+1}\sim p(x_2\mid x_{1,t+1}, x_{2,t+1})\,.$$ + +Then, we can cycle again through the variables to obtain a new sample $\mathbf{x}_{t+2}$ at infinitum. It is quite easy to see that this is a special case of the Metropolis-Hastings algorithm with for variable $x_k$ the proposal distribution $q_k(\mathbf{x}^\star\mid\mathbf{x}) = p(x_k\mid \mathbf{x}_{\setminus k})$ ($\mathbf{x}_{\setminus k}$ is the probability vector $\mathbf{x}$ without ${x}_{k}$) with as acceptance probability: + +$$\alpha(\mathbf{x}^\star, \mathbf{x}_t) = \min\left(1, \frac{{p}(\mathbf{x^\star})q_k(\mathbf{x}_t\mid\mathbf{x}^\star)}{{p}(\mathbf{x}_t)q_k(\mathbf{x}^\star\mid\mathbf{x}_t)}\right)=\min\left(1, \frac{{p}({x}_k^\star\mid \mathbf{x}_{\setminus k}^\star)p(\mathbf{x}_{\setminus k}^\star)p(x_{k,t}\mid \mathbf{x}_{\setminus k}^\star)}{{p}({x}_{k,t}\mid \mathbf{x}_{\setminus k, t})p(\mathbf{x}_{\setminus k,t})p(x_k^\star\mid \mathbf{x}_{\setminus k, t})}\right)=1\,,$$ +using $\mathbf{x}^\star_{\setminus k}=\mathbf{x}_{\setminus k,t}$. The Gibbs steps are hence always accepted. + +In the types of models that we are building, Gibbs sampling is easy to use, as our distributions (Bayesian networks) are constructed from simple distributions with efficient sampling routines. + +""" + +# ╔═║ 1a24999d-1ab7-4220-8e22-b1ac33ad03ac +md"As an example, consider sampling from a bivariate normal distribution, where we slice from one axis at a time." + +# ╔═║ 5e6c6135-f4f9-447c-8f7a-a49ec25e414a +md""" +σ₁: $(@bind σ₁ Slider(0.1:0.2:2, show_value=true, default=1)) + +Οƒβ‚‚: $(@bind Οƒβ‚‚ Slider(0.1:0.2:2, show_value=true, default=2)) + +ρ: $(@bind ρ Slider(-0.95:0.05:0.95, show_value=true, default=0.9)) + +n : $(@bind n_gibbs Slider(5:5:100, show_value=true, default=25)) +""" + +# ╔═║ 3fca01f3-ac6e-4fdc-b8ca-48040ca562f3 +ΞΌ = [1, 0] + +# ╔═║ d8ff625a-6204-4579-a8f5-9650544c7222 +@model function uncertain_normal(y=missing) + ΞΌ ~ Normal(0, 20) + Οƒ ~ InverseGamma(1/10) + for i in 1:length(y) + y[i] ~ Normal(ΞΌ, Οƒ) + end +end + +# ╔═║ b04ce3ab-c5c0-4a13-8d82-05198532b22d +uncertain_normal(y) + +# ╔═║ 7cfc4306-746b-434a-8160-52341c1e6519 +norm_prior(ΞΌ, Οƒ) = exp(logprior(uncertain_normal(y), (ΞΌ=ΞΌ, Οƒ=Οƒ))) + +# ╔═║ fb35033f-3d11-4ab1-bed8-2c22396064f8 +norm_likelihood(ΞΌ, Οƒ) = exp(loglikelihood(uncertain_normal(y), (ΞΌ=ΞΌ, Οƒ=Οƒ))) + +# ╔═║ e3e51306-385a-461b-94e8-e2a18b5250ab +norm_posterior(ΞΌ, Οƒ) = norm_prior(ΞΌ, Οƒ) * norm_likelihood(ΞΌ, Οƒ) + +# ╔═║ 63af963c-a304-4142-8f23-a56a5fc14e76 +chain_MH = sample(MersenneTwister(1), uncertain_normal(y), MH(), 1_000) + +# ╔═║ a9e11333-aab9-4e63-aee4-6bceb6b771bc +summarize(chain_MH) + +# ╔═║ 6309cc65-59d4-4df2-b756-30c6e2f877cd +quantile(chain_MH) + +# ╔═║ 1b92c00e-8b2a-4cc8-b6f2-23d91cf4f989 +chain_MH2 = sample(MersenneTwister(1), uncertain_normal(y), my_MH, 1_000); + +# ╔═║ 37986301-c9d2-42e3-8b73-7c833bf7ae17 +summarize(chain_MH2) + +# ╔═║ 138bf97c-9295-440d-99f4-24f7fe58b774 +Ξ£ = [σ₁^2 σ₁*Οƒβ‚‚*ρ; + σ₁*Οƒβ‚‚*ρ Οƒβ‚‚^2] + +# ╔═║ 87b984ee-2daa-4cca-b5eb-60c4aa3b2fb5 +mvn = MultivariateNormal(ΞΌ, Ξ£) + +# ╔═║ 06e83a23-fa3a-49f7-8f43-d46f3285e943 +chain_Gibbs = sample(uncertain_normal(y), Gibbs(MH(:ΞΌ), MH(:Οƒ)), 1000) + +# ╔═║ a9bd2d76-16e6-4084-b65d-0645ec94aa9c +sample(uncertain_normal(y), Gibbs(HMC(0.2, 3, :ΞΌ), PG(20, :Οƒ)), 1000) + +# ╔═║ 9b4d67dc-9c75-45ee-9328-d229c527fdc6 +summarize(chain_Gibbs) + +# ╔═║ 1ba9efb2-cd95-4097-b8f6-3a770205c935 +md"Gibbs sampling is especially powerful because it can recombine samplers for different variables." + +# ╔═║ e5d604e0-44c4-4d10-8faa-7ade5f5fbfff +md""" +### Hamiltonian Monte-Carlo + +The previous MCMC methods could only take relatively small steps in the state space. In the worst case, they exhibit random walk behavior where the distance traveled through the state space grows with the square root of the number of steps (which we called slow in the previous chapter). They are also "blind" in the sense that they do not use a lot of information about the distribution. Hamiltonian Monte Carlo (HMC) methods are more sophisticated, as they transform the sampling problem into a dynamical system using ideas from physics. Solvers similar to those that are used to solve differential equations can then be used to generate the chain. + +The main idea behind constructing the Markov chain is using concepts of classical mechanics to determine the trajectory of a particle, determined by the probability distribution. This particle has a state vector $\mathbf{x}$ (the position in state space) and a momentum vector $\mathbf{p}$, representing its velocity in state space. We interpret the (unnormalized) probability distribution as a potential function according to: + +$$U(\mathbf{x}) = -\log \tilde{p}(\mathbf{x})\,,$$ + +where we see that regions with higher probability correspond to those with lower potential energy, the unknown normalization constant boils down to a constant shift of this potential and is, hence, of no importance. The kinetic energy of the particle is given by $\frac{1}{2}\mathbf{p}^\intercal\mathbf{p}$. One can combine the potential and kinetic energy into the *Hamiltonian function*: +$$H(\mathbf{x}, \mathbf{p}) = U(\mathbf{x}) +\frac{1}{2} \mathbf{p}^T\mathbf{p}\,.$$ + +This Hamiltonian completely determines the dynamics of the particle according to the relations: + +$$\frac{\partial x_i}{\partial t} = \frac{\partial H}{\partial p_i}$$ + +and + +$$\frac{\partial p_i}{\partial t} = -\frac{\partial H}{\partial x_i}\,.$$ + +It is easy to see that these equations of motion preserve the Hamiltonian ($\frac{\mathrm{d}H}{\mathrm{d}t}=0$). An essential property of Hamiltonian dynamical systems is that they preserve volume in state space. This is known as *Liouville's theorem*., meaning that if you consider a region given the space of variables $(\mathbf{x},\mathbf{p})$, the shape of this region will change, but the volume will remain the same. + +Steps in the state space can be taken by numerical integration, for which Liouville's theorem still holds. One set of integration schemes is the *leapfrog integration*, given by + +$$\mathbf{p}(t+\epsilon/2) = \mathbf{p}(t) - \frac{\epsilon}{2}\nabla U (\mathbf{x})$$ + +$$\mathbf{x}(t+\epsilon) = \mathbf{x}(t) + \epsilon\, \mathbf{p}(t-\epsilon /2)$$ + +$$\mathbf{p}(t+\epsilon) = \mathbf{p}(t+\epsilon/2) - \frac{\epsilon}{2}\nabla U (\mathbf{x})$$ + +where $\epsilon$ is the step size. Note that we have here used functional dependence of $t$ to distinguish continuous integration steps with discrete steps in the Markov chain ($\mathbf{x}(t)$ vs $\mathbf{x}_t$). One takes several steps, denoted by integer $L$ leapfrog, to generate a new sample in the chain. Afterward, one usually resamples the momentum vector $\mathbf{p}$ to obtain an ergodic sampling scheme. To recap, the steps of the HMC are + +1. sample an initial state vector $\mathbf{x}_0$ from the prior and generate a random momentum vector $\mathbf{p}_0$; +2. repeat $T$ times: + - perform $L$ leapfrog steps using step size $\epsilon$ on $(\mathbf{x}_t,\mathbf{p}_t)$ to obtain $(\mathbf{x}_{t+1},\mathbf{p}_{t+1})$ + - resample $\mathbf{p}_{t+1}$ + +""" + +# ╔═║ 4019f495-ce19-44e4-ad79-18349fa6ec18 +chain_HMC = sample(MersenneTwister(1), uncertain_normal(y), HMC(0.1, 5), 1000); + +# ╔═║ afbf92d5-c72e-4041-a265-50d762df58f7 +summarize(chain_HMC) + +# ╔═║ bec15afc-3f02-4c7d-b9e2-01f496e31689 +summarize(chain_HMC) + +# ╔═║ 786c8319-806c-461d-af08-f082d6f12339 +md"You may have noticed that HMC is more computationally demanding than the previously seen methods. We need to perform several integration steps to generate a single pseudo-sample (for which we need to keep track of momentum variables in addition to state variables) and compute the gradient of the log-probability density function. This gradient is usually computed automatically using automatic differentiation, which generally does not require too much computational resources. It also implies that the basic version of HMC can only be used for real-valued random variables, as one has to be able to compute derivatives. Given the same computational budget, one will obtain much fewer pseudo-samples using HMC than with MH. However, the samples generated by HMC will often be of a higher quality and cover the state space much more thoroughly, so it is likely worth the trade-off. +" + +# ╔═║ 81863647-168f-46b1-87f1-cc1169b7c6ff +md""" +Making HMC behave well requires carefully tuning the parameters $\epsilon$ and $L$. For this reason, the [No-U-Turn Sampler](https://arxiv.org/pdf/1111.4246.pdf) (NUTS). This automatically detects when sufficient leapfrog steps are taken by randomly moving forward and backward in time until it detects a "U-turn", i.e., it backtracks in the state space. +""" + +# ╔═║ aa022156-efb4-4b2b-ac22-9b4228ee2578 +chain_NUTS = sample(MersenneTwister(1), uncertain_normal(y), NUTS(), 1000); + +# ╔═║ 5f41a9e3-70e0-40d5-bdff-d90555130817 +summarize(chain_NUTS) + +# ╔═║ e6201f93-d5fc-4f33-9e3c-f7d8eb0146b5 +md""" +## MCMC in practice + +Sampling from probability distributions is more complex than numerically solving differential equations. For both, using existing, tested, high-quality software is strongly advised. Picking the right sampling algorithm and making it work well requires insight into the model, choosing hood proposal distributions, and some experience. + +Rather than looking at the number of pseudo samples generated, it usually makes more sense to consider the [[effective number of samples]]. This metric is corrected for autocorrelation, i.e., samples close in a chain are not completely independent. There is no definitive answer to how many samples one needs. If the goal is pinpointing the posterior mean, a couple hundred could suffice. When one wants to characterize the exact shape of the posterior or analyse the tails, for example, 1% or 99% quantiles, many more might be required. + +Every chain needs some warm-up time to reach the stationary distribution. For this reason, the first fraction of the chain is usually discarded. One often runs several Markov chains in parallel, often on different computer threads or different nodes on a computer cluster. This might be valuable for diagnostic purposes, to see if the chains converge. However, note that every one of these chains will likely need a burn-in time, so a large part of the computational efforts will be wasted. Some authors advise trying several short chains for debugging and a very long chain for the final sampling. + +To check if a chain is converging nicely, trace plots are usually the most informative. Remember, a trace plot shows the value of the variable throughout the steps of the chain. An ideal trace plot should look somewhat like a hairy caterpillar, with fluctuations around a mean and no systematic trends. When the chain is behaving badly, expect to see sharp peaks, flat lines where the chain is stuck and systematic trends. + +> When you have a computational problem, there is often a problem with your model. + +The best way to have a chain that works well is to have a model that describes the data well. Here, there is ideally a single peak that corresponds to the optimal parameter configurations. When you see that the chain is not progressing well, this can usually be improved by adding some informative priors, even if they are very weak ones. This will often tamper with erratic behaviour. +""" + +# ╔═║ 1b2a38dc-0caf-4c86-9910-8574fe10c48f +@model function diffuse_prior(y1, y2) + ΞΌ ~ Turing.Flat() + Οƒ ~ Turing.FlatPos(0.0) + y1 ~ Normal(ΞΌ, Οƒ) + y2 ~ Normal(ΞΌ, Οƒ) +end + +# ╔═║ 9e1c4bc8-882f-45bf-b437-38c369867dac +y1, y2 = 7.8, 9.8 + +# ╔═║ 15c7c5ed-5bcf-4336-aecb-22fd3ef38d05 +chain_diff = sample(diffuse_prior(y1, y2), NUTS(), 10_000) + +# ╔═║ cde76a39-51a0-4398-ba2c-81170e395a07 +@model function weak_prior(y1, y2) + ΞΌ ~ Normal(0, 1000) + Οƒ ~ Exponential(10) #Uniform(0, 100) + y1 ~ Normal(ΞΌ, Οƒ) + y2 ~ Normal(ΞΌ, Οƒ) +end + +# ╔═║ 42a81a70-f8a1-4a11-a475-c4adddefde73 +chain_weak = sample(weak_prior(y1, y2), NUTS(), 10_000) + +# ╔═║ 930902f1-5d0d-41a9-8c37-07e0d913aa6e +quantile(chain_weak) + +# ╔═║ 96f05537-6fb3-45ce-8d75-28efdfa03279 +@model function donut(R=5, Οƒ=1.5) + ΞΈ ~ Uniform(0.0, 2pi) + x ~ Normal(R * cos(ΞΈ), Οƒ) + y ~ Normal(R * sin(ΞΈ), Οƒ) +end + +# ╔═║ 3708eb56-53e4-43b8-8af4-e1f6e302a0cf +let + samples_donut = [rand(donut()) for i in 1:1000] + x = [s[:x] for s in samples_donut] + y = [s[:y] for s in samples_donut] + scatter(x, y, aspect_ratio=:equal, label="", xlab=L"x", ylab=L"y", alpha=0.75) +end + +# ╔═║ 07da284a-8f21-4088-b936-244d11f517dd +x_nuts = sample(donut(), HMC(0.1, 10), 10000) + +# ╔═║ 9d14bb2f-2c8e-4b45-9775-e168a11005ff +begin + pdf_donut(x, y) = exp(()) + #heatmap(-15:0.1:15, 0.1:0.02:10, pdf_donut, color=:speed) + scatter(x_nuts[:x], x_nuts[:y], aspect_ratio=:equal, label="", xlab=L"x", ylab=L"y", alpha=0.25) +end + +# ╔═║ 5ce17f7f-7e93-4c43-9f75-b3b677af9fd1 +@model function trending(yl, ym, yr) + Οƒa ~ Gamma() + Οƒn ~ Gamma() + a ~ Normal(0, Οƒa) + b ~ Normal(0, Οƒa) + yl ~ Normal(-a + b, Οƒn) + ym ~ Normal(b, Οƒn) + yr ~ Normal(a + b, Οƒn) +end + +# ╔═║ 71c210f8-34ad-469a-89fa-dc99efb6b72a +quantile(sample(trending(-2.3, 0.3, -2.8), NUTS(), 10_000)) + +# ╔═║ d5db3698-8546-4606-8346-85475619a3e0 +quantile + +# ╔═║ 6a178a79-ae85-4496-abef-11bf62d64da8 +md"# Appendix πŸ‰" + +# ╔═║ d9d417f3-a427-409e-9090-c76c8226be04 +TableOfContents() + +# ╔═║ 0d45d6f9-f27c-4d8e-b117-26132418be55 +dist2pdf(distribution) = x -> pdf(distribution, x) + +# ╔═║ 037b15f6-0858-41fa-a8fd-c6cc8c8d8e7a +function seed_bayesian_plot(k; a=8, b=3, n=10, title="Inference of p given $k of $n seed germinated", labels=true) + + seed_likelihood(p) = pdf(Binomial(n, p), k) + seed_prior(p) = pdf(Beta(a, b), p) + seed_posterior(p) = pdf(Beta(a+k, b+n-k), p) + + p_ML = argmax(seed_likelihood, 0:0.01:1) + p_MAP = argmax(seed_posterior, 0:0.01:1) + + plot_seed = plot(seed_prior, 0, 1, lw=2, label=labels ? "prior (Beta($a, $b))" : "", xlab=L"p", color="green"; title) + plot!(p->n * seed_likelihood(p), 0, 1, lw=2, label=labels ? "likelihood (rescaled)" : "", color="blue", ls=:dash) + plot!(seed_posterior, 0, 1, lw=2, label=labels ? "posterior" : "", color="orange", ls=:dashdot) + vline!([p_ML], lw=2, alpha=0.5, label= labels ? "p* (maximum likelihood)" : "", ls=:dash) + vline!([p_MAP], lw=2, alpha=0.5, label=labels ? "p* (maximum posterior likelihood)" : "", ls=:dot) + return plot_seed +end + +# ╔═║ df004387-ea5f-42b1-9409-7b37d1a5031a +md"Distributions for rejection sampling" + +# ╔═║ 01fb5888-a01a-4dd8-af08-bb70894a99b8 +p_univar = MixtureModel([Normal(2, 0.4), Normal(4, 1.2)], [0.25, 0.75]) + +# ╔═║ 66c3e374-389c-4be9-bf16-341565d4b4c9 +p = dist2pdf(p_univar) + +# ╔═║ 730e5cbb-1787-44b3-9bb4-32dba7035ea8 +@model function seed_germ(X=missing, n=10) + p ~ Beta(8, 3) + X ~ Binomial(n, p) +end + +# ╔═║ 91cfb385-5617-4129-b57b-69aff3621ce5 +x_mh, acc_mh = metropolis_hastings(p, 4.0, q_MH, n=200) + +# ╔═║ f578aafc-318f-4dc4-a574-0843057b1204 +q = Truncated(Normal(2.5, 3), -1, 10) + +# ╔═║ efefaff1-e6c7-46fa-bfa7-b4e6dec67641 +plots = Dict() + +# ╔═║ cc904bc9-7f2c-4943-90ff-e0753aea08b8 +let + prior_informative = Normal(5, 0.5) |> dist2pdf + prior_weakly = TriangularDist(1, 8, 5) |> dist2pdf + prior_diffuse = Uniform(0, 10) |> dist2pdf + + p = plot(prior_informative, 0, 12, lw=2, label="informative prior", xlab=L"\theta", ylab=L"f_\theta(\theta)") + plot!(prior_weakly, 0, 12, label="weakly informative prior", lw=2, ls=:auto) + plot!(prior_diffuse, 0, 12, label="diffuse informative prior", lw=2, ls=:auto) + title!("Different types of priors") + plots["priors"] = p +end + +# ╔═║ 0bc4cdff-f86d-4174-8aac-d2ca61717f96 +plots["seeds_likelihood"] = plot(seed_likelihood, 0, 1, lw=2, label="likelihood", xlab=L"p", color="blue", ls=:dash) + +# ╔═║ 08d33254-5013-4e4f-ae0b-1f5b6f3a2fb2 +plots["seeds_prior"] = plot(seed_prior, 0, 1, lw=2, label="prior", xlab=L"p", color="green") + +# ╔═║ 217edb24-a555-4deb-ab58-2969d8564a7b +plots["seeds_posterior"] = plot(seed_posterior, 0, 1, lw=2, label="posterior", xlab=L"p", color="orange", ls=:dashdot) + +# ╔═║ 34a5bb1a-8919-4e41-89a5-fdd4e48bec26 +plots["seeds_bayes"] = seed_bayesian_plot(k) + +# ╔═║ 92cd9bfb-8a58-4b73-ab02-5ac4447499d0 +plots["seeds_10"] = seed_bayesian_plot(10) + +# ╔═║ fb486bb6-b462-40f5-8189-2b46c5817fc1 +plots["seeds_2"] = seed_bayesian_plot(2) + +# ╔═║ 780b3e4e-7959-401f-aca5-5dad90276128 +plots["seeds_weak_prior"] = seed_bayesian_plot(k, a=1, b=1) + +# ╔═║ ba15b522-e4e8-4de7-882e-a0d14da2fac1 +plots["seeds_strong_prior"] = seed_bayesian_plot(k, a=80, b=30) + +# ╔═║ 9609ee3c-2a5e-450f-8822-d616552cae09 +plots["seeds_large_dataset"] = seed_bayesian_plot(10k, n=100) + +# ╔═║ 3eac18d0-f755-42aa-bbcc-9714cc64dc5a +plots["norm_muprior"] = plot(dist2pdf(Normal(0, 20)), -50, 50, xlabel=L"\mu", label="Normal(0, 20)", title="Prior for ΞΌ", lw=2) + +# ╔═║ cd8bf990-4f36-4a56-83c2-c58217448b1e +plots["norm_sigmaprior"] = plot(dist2pdf(InverseGamma(.1)), 0, 20, xlabel=L"\sigma", label="InverseGamma(1)", title="Prior for Οƒ", lw=2) + +# ╔═║ 45e175bc-0eaa-4280-aaf6-c8b318a6c12d +plots["norm_priors"] = plot(plots["norm_muprior"], plots["norm_sigmaprior"],size=(800, 400)) + +# ╔═║ a09eda2e-0bb7-46c9-8d60-2b4447257772 +plots["norm_multiprior"] = heatmap(-15:0.1:15, 0.1:0.02:5, norm_prior, color=:speed, ylab=L"\sigma", xlab=L"\mu", title="Prior") + +# ╔═║ 3b821e04-a27a-489f-924e-e82a08693371 +plots["norm_likelihood"] = heatmap(-15:0.1:15, 0.1:0.02:5, norm_likelihood, color=:speed, ylab=L"\sigma", xlab=L"\mu", title="Likelihood") + +# ╔═║ b4eef7a8-a61c-471d-baf0-1d0b5fb997e6 +plots["norm_posterior"] = plot_post = heatmap(-15:0.1:15, 0.1:0.02:5, norm_posterior, color=:speed, ylab=L"\sigma", xlab=L"\mu", title="Posterior") + +# ╔═║ 2c81f5d1-2b8b-4fb5-b810-d5fcfdc8a5d6 +plots["norm_posterior"] = plot_post; + +# ╔═║ fae76f2c-caae-49ff-9dfe-b67cd53d8dea +begin + x_prop = rand(q, n_rejection_sampling) + Ξ±_prop = pdf.(Ref(p_univar), x_prop) ./ (M .* pdf.(Ref(q), x_prop)) + u_rj = rand(n_rejection_sampling) + acc = u_rj .≀ Ξ±_prop + u_rj .*= M .* pdf.(Ref(q), x_prop) + + x_rejection_sampling = x_prop[acc] + acceptance_probability = length(x_rejection_sampling) / n_rejection_sampling + + prs = plot(x->pdf(p_univar, x), -1, 10, lw=2, label="target p(x)", xlabel=L"x", title="Rejection sampling\np(accept)=$(round(acceptance_probability, digits=2))", + legend=:outerbottom) + plot!(x->M*pdf(q, x), -1, 10, lw=2, label="proposal distribiton M * q(x)") + plot!(zero, -1:0.02:10, fillrange=x->pdf(p_univar, x), fillalpha=0.3, lw=2, label="acceptance region", linealpha=0) + plot!(x->pdf(p_univar, x), -1, 10, fillrange=x->M*pdf(q, x), fillalpha=0.3, lw=2, label="rejection region", linealpha=0) + scatter!(x_prop[acc], u_rj[acc], label="accepted", ms=3, alpha=0.8) + scatter!(x_prop[.!acc], u_rj[.!acc], label="rejected", ms=3, alpha=0.8) + plots["rejection_sampling"] = prs +end + +# ╔═║ 9db5d774-8e6d-4bd1-a85a-d0e0705197ae +x_rejection_sampling + +# ╔═║ 525c0e2e-6353-4002-a486-bbdde0911c38 +length(x_rejection_sampling) # number of accepted samples + +# ╔═║ d3b6cf36-a2d1-40fa-952c-f20d1468eb38 +acceptance_probability + +# ╔═║ ff813a28-5ab7-4b49-8b05-b4b6a73b94a5 +plots["MC_ss"] = bar(1:10, Ο€_mc, xlab="state", ylab="PMF", label="", title="Stationary distribution of the cycle", xticks=1:10) + +# ╔═║ bfd58734-b396-4424-9343-4562932f70e3 +plots["MC_ss_conv"] = groupedbar(0:30, vcat([pβ‚€' * T^i for i in 0:30]...), bar_position = :stack, xlab = L"t", ylab = "fraction in state i", xticks=0:30, label=reshape(["state $i" for i in 1:size(T,2)], 1, :), title="State evolution of the cycle", legend=:outertopright) + +# ╔═║ ecfc2307-6926-42c1-b08d-6ff93502c5cd +let + mc = ifelse.(acc_mh, :blue, :orange) + ind = 0:length(x_mh)-1 + + p = plot(x->pdf(p_univar, x), -1, 10, lw=2, label="", xlabel=L"x", title="Metropolis-Hastings", ylab="PDF") + + plot!(twinx(), x_mh, ind, lw=0.5, label="", ylab="sample number", color=:green, ylim=(0, 300)) + scatter!(twinx(), x_mh[acc_mh], ind[acc_mh], label="accepted", color=:blue, ms=2, ylim=(0, 300)) + scatter!(twinx(), x_mh[.!acc_mh], ind[.!acc_mh], label="rejected", color=:orange, ms=2, ylim=(0, 300)) + plots["MH"] = p +end + +# ╔═║ 11fc7beb-2a11-4acb-8545-9842ca783682 +let + p = histogram(x_mh[acc_mh], normalize=true, label="pseudosamples MH", xlab=L"x") + plot!(p, 0, 10, label="PDF target", lw=2, title="Histogram Metropolis-Hastings") + plots["MH_hist"] = p +end + +# ╔═║ 6227e4ee-6f89-4e45-b1d6-a087aa1bad40 +plots["MH_diagn"] = plot(chain_MH) + +# ╔═║ 35bc2b8f-716d-4a85-8e60-7242709448c3 +plots["MH_diagn_tuned"] = plot(chain_MH2) + +# ╔═║ ab09925c-4689-4f87-be44-f8eca12a5c9c +let + p = contour(-15:0.1:15, 0.1:0.02:5, norm_posterior, color=:speed, ylab=L"\sigma", xlab=L"\mu", title="Metropolis-Hasting sampling", xlim=(-15,15), ylim=(0.1, 5)) + plot!(chain_MH2[:ΞΌ], chain_MH2[:Οƒ], label="", alpha=0.7) + scatter!(chain_MH2[:ΞΌ], chain_MH2[:Οƒ], ms=0.2, label="chain") + plots["MH_sampling"] = p +end + +# ╔═║ 76b0886a-fc91-40ef-89d5-dcf5d261907f +let + X1 = Normal(ΞΌ[1], σ₁) + X1cond(x2) = Normal(ΞΌ[1] + Ξ£[1,2]*inv(Ξ£[2,2])*(x2-ΞΌ[2]), + √(Ξ£[1,1] - Ξ£[2,1]*inv(Ξ£[2,2])*Ξ£[1,2])) + X2cond(x1) = Normal(ΞΌ[2] + Ξ£[1,2]*inv(Ξ£[1,1])*(x1-ΞΌ[1]), + √(Ξ£[2,2] - Ξ£[1,2]*inv(Ξ£[1,1])*Ξ£[2,1])) + + x1 = rand(X1) + x2 = rand(X2cond(x1)) + (x1, x2) + + x1_gibbs = [x1] + x2_gibbs = [x2] + for t in 1:n_gibbs + x2 = last(x2_gibbs) + x1 = rand(X1cond(x2)) + push!(x1_gibbs, x1) + push!(x2_gibbs, x2) + x2 = rand(X2cond(x1)) + push!(x1_gibbs, x1) + push!(x2_gibbs, x2) + end + p = contour(-5:0.05:5, -5:0.05:5, (x,y)->pdf(mvn, [x,y]), color=:speed, xlab=L"x", ylab=L"y") + plot!(x1_gibbs, x2_gibbs, color="blue", alpha=0.7, label="Gibbs chain", lw=1.3) + scatter!(x1_gibbs[2:2:end], x2_gibbs[2:2:end], label="sample", ms=2, alpha=0.7) + #scatter!([last(x1_gibbs)], [last(x2_gibbs)]) + #plot!(x->pdf(X1cond(last(x2_gibbs)), x)-5, -4, 4, label="X1|x2") + plots["Gibbs"] = p + +end + +# ╔═║ 444a89d1-a8c1-4df8-945d-6e8dd32ae204 +plots["Gibbs_diagn"] = plot(chain_Gibbs) + +# ╔═║ 4d8fd482-11cb-4f2e-8c47-2428ee7e66c6 +let + p = contour(-15:0.1:15, 0.1:0.02:5, norm_posterior, color=:speed, ylab=L"\sigma", xlab=L"\mu", title="Gibbs sampling", xlim=(-15,15), ylim=(0.1, 5)) + plot!(chain_Gibbs[:ΞΌ], chain_Gibbs[:Οƒ], label="", alpha=0.7) + scatter!(chain_Gibbs[:ΞΌ], chain_Gibbs[:Οƒ], ms=0.2, label="chain") + plots["Gibbs_sampling"] = p +end + +# ╔═║ 99d638e6-1fae-4020-af2f-28703cc67377 +plots["HMC_diagn"] = plot(chain_HMC) + +# ╔═║ 7f729aa1-78c0-4d2e-9ae5-c27502be22e8 +let + p = contour(-15:0.1:15, 0.1:0.02:5, norm_posterior, color=:speed, ylab=L"\sigma", xlab=L"\mu", title="HMC sampling") + plot!(chain_HMC[:ΞΌ], chain_HMC[:Οƒ], label="", alpha=0.7) + scatter!(chain_HMC[:ΞΌ], chain_HMC[:Οƒ], ms=0.2, label="chain") + plots["HMC_sampling"] = p +end + +# ╔═║ 575ad310-8cbd-4b05-aee0-d84fb55ad6ed +plots["NUTS_diagn"] = plot(chain_NUTS) + +# ╔═║ 4a86bf84-434a-4ef3-a9c6-4c72df5068e0 +let + p = contour(-15:0.1:15, 0.1:0.02:5, norm_posterior, color=:speed, ylab=L"\sigma", xlab=L"\mu", title="NUTS sampling") + plot!(chain_NUTS[:ΞΌ], chain_NUTS[:Οƒ], label="", alpha=0.7) + scatter!(chain_NUTS[:ΞΌ], chain_NUTS[:Οƒ], ms=0.2, label="chain") + plots["NUTS_sampling"] = p +end + +# ╔═║ 8de88cd0-e326-4926-bfe9-776e3516d6e2 +plots["uninformative_prior"] = plot(chain_diff) + +# ╔═║ 0969b685-e9c5-44d5-8698-a141dd01dca7 +plots["weak_diffusive_prior"] = plot(chain_weak) + +# ╔═║ 262879f7-9441-4305-899a-b7c2881958fe +plots + +# ╔═║ d2414490-d2a5-4862-81e8-8ae8ffc5213a +length(plots) + +# ╔═║ Cell order: +# ╠═103e5ba0-cfdc-11ee-13b1-cf53dfdd9a3b +# ╠═d778ce04-8df4-42ef-95f1-9cf4880e0420 +# ╠═0350aa5b-d105-4dfa-a454-59873672b3a0 +# β•Ÿβ”€e87dd9a4-f4ed-46d7-9f9d-dae0cadb7d05 +# β•Ÿβ”€0f6cf892-b218-4740-a298-43f47e51acae +# β•Ÿβ”€cc904bc9-7f2c-4943-90ff-e0753aea08b8 +# β•Ÿβ”€eb37dd4b-3af0-4534-92c2-e495b83024be +# ╠═29928abf-f010-438e-9b60-e6673a51ddf5 +# ╠═730e5cbb-1787-44b3-9bb4-32dba7035ea8 +# ╠═768ea152-00a5-4409-86eb-9a1c554eb3b2 +# ╠═959cd079-59a4-42f5-a868-4cc0675c694b +# ╠═39cb8a88-9bfe-4b51-8f2f-b89b45dccc95 +# ╠═667f2069-fd32-4c3e-aebb-b75a38bf84b9 +# β•Ÿβ”€472cea3d-12a8-449a-8e87-6c1b5aaa1fd7 +# β•Ÿβ”€0bc4cdff-f86d-4174-8aac-d2ca61717f96 +# ╠═08d33254-5013-4e4f-ae0b-1f5b6f3a2fb2 +# ╠═217edb24-a555-4deb-ab58-2969d8564a7b +# ╠═3ef47022-f9e3-434e-87a3-20b1870a7c24 +# ╠═6004b26a-8f10-492d-bdd2-1d317d8bb394 +# ╠═34a5bb1a-8919-4e41-89a5-fdd4e48bec26 +# ╠═92cd9bfb-8a58-4b73-ab02-5ac4447499d0 +# ╠═fb486bb6-b462-40f5-8189-2b46c5817fc1 +# ╠═780b3e4e-7959-401f-aca5-5dad90276128 +# ╠═ba15b522-e4e8-4de7-882e-a0d14da2fac1 +# ╠═9609ee3c-2a5e-450f-8822-d616552cae09 +# β•Ÿβ”€2ab01769-42cd-44e1-8d4c-2c8b477c732a +# ╠═4d6d6c9e-c2a8-4c7d-9d18-89d2e9d0c213 +# ╠═ba06e8a5-c142-4963-97b4-783ed4c706bf +# β•Ÿβ”€f44abcc5-9010-4d10-b722-ef8147c8fd66 +# ╠═3eac18d0-f755-42aa-bbcc-9714cc64dc5a +# ╠═cd8bf990-4f36-4a56-83c2-c58217448b1e +# β•Ÿβ”€45e175bc-0eaa-4280-aaf6-c8b318a6c12d +# β•Ÿβ”€0c29af96-949d-47b3-869f-274ed39c9d25 +# ╠═d8ff625a-6204-4579-a8f5-9650544c7222 +# β•Ÿβ”€2cbe07e6-8cf0-4dc4-8aea-f56059ffa367 +# ╠═b04ce3ab-c5c0-4a13-8d82-05198532b22d +# β•Ÿβ”€afb7bdca-a8de-4342-9212-5e81fa47963a +# ╠═7cfc4306-746b-434a-8160-52341c1e6519 +# ╠═a09eda2e-0bb7-46c9-8d60-2b4447257772 +# β•Ÿβ”€1fbd13c1-cc93-4e5b-98f1-ace195d20f97 +# ╠═fb35033f-3d11-4ab1-bed8-2c22396064f8 +# ╠═3b821e04-a27a-489f-924e-e82a08693371 +# β•Ÿβ”€213465af-f980-4848-9e5a-0cb5429f4af8 +# ╠═e3e51306-385a-461b-94e8-e2a18b5250ab +# β•Ÿβ”€b4eef7a8-a61c-471d-baf0-1d0b5fb997e6 +# β•Ÿβ”€2c81f5d1-2b8b-4fb5-b810-d5fcfdc8a5d6 +# β•Ÿβ”€7f2a7d88-442f-431e-8e09-42082bda8d24 +# β•Ÿβ”€985c1d3e-bc02-4dc5-9a28-d0ec9edf5cc9 +# β•Ÿβ”€a0a1deec-75b6-4061-aa32-ad5e940d4123 +# β•Ÿβ”€d91cea07-fb14-4b93-8ad1-31fb8f3afe8d +# β•Ÿβ”€fae76f2c-caae-49ff-9dfe-b67cd53d8dea +# ╠═9db5d774-8e6d-4bd1-a85a-d0e0705197ae +# ╠═525c0e2e-6353-4002-a486-bbdde0911c38 +# ╠═d3b6cf36-a2d1-40fa-952c-f20d1468eb38 +# β•Ÿβ”€d669d181-dc13-4921-9aca-88acae1197eb +# β•Ÿβ”€9c48f6a4-db8c-4e15-8486-4dd9b281a80d +# ╠═e7bd6347-ac8a-4460-b0f7-4692968205f7 +# ╠═807fe053-bf07-446b-aac6-e8de716c5e2a +# ╠═012ff9ea-08ae-46fd-afab-49341f35f57a +# ╠═cf858c95-d2b9-4f53-af1a-d5a511f531ce +# β•Ÿβ”€d77c1db1-925f-4134-a860-8a1683b3adee +# ╠═cc92d39d-830f-451c-81b4-de00f74545bf +# β•Ÿβ”€c37ea17f-57b5-4871-a4d9-5aa5e609c846 +# β•Ÿβ”€38a6bd5f-78ab-43be-a010-6fe4c209b1a7 +# β•Ÿβ”€eab53e8a-b7cd-4c97-83f1-bcfd9c59cc4f +# ╠═7915a972-df48-462c-bcc7-2ca94a98e441 +# β•Ÿβ”€53799772-c8a1-4055-a01e-42f147ffc253 +# β•Ÿβ”€fcfa5203-73df-40f6-a6c9-eda531054b38 +# ╠═b2cbf023-a0ea-4714-b30b-b331a081c7fa +# β•Ÿβ”€ff813a28-5ab7-4b49-8b05-b4b6a73b94a5 +# β•Ÿβ”€b3c45c85-d075-452a-a827-b7d1e00a17a1 +# ╠═bfd58734-b396-4424-9343-4562932f70e3 +# β•Ÿβ”€45e848aa-3e6a-47b5-a0cc-fa09dd9a4ae3 +# β•Ÿβ”€ae080b48-87f8-4af6-b9d1-224080d4b787 +# β•Ÿβ”€0a4f1446-e49e-4281-be44-52d3ac4a7854 +# ╠═b9587b83-1521-407a-a466-9566d022d402 +# ╠═5d8894c1-25d7-41e5-a99c-bca8119851fe +# ╠═91cfb385-5617-4129-b57b-69aff3621ce5 +# β•Ÿβ”€ecfc2307-6926-42c1-b08d-6ff93502c5cd +# ╠═11fc7beb-2a11-4acb-8545-9842ca783682 +# β•Ÿβ”€094b4405-6205-4b85-a311-c79cf6028498 +# ╠═63af963c-a304-4142-8f23-a56a5fc14e76 +# β•Ÿβ”€e1cb4a40-4a8a-4ff9-9406-f99aee6fdd57 +# ╠═a9e11333-aab9-4e63-aee4-6bceb6b771bc +# β•Ÿβ”€56f7dfd2-2c81-403a-9c11-0d93c10f604e +# ╠═6309cc65-59d4-4df2-b756-30c6e2f877cd +# β•Ÿβ”€a8d1b7e7-03df-4d05-be5f-758f98bb1c26 +# ╠═6227e4ee-6f89-4e45-b1d6-a087aa1bad40 +# β•Ÿβ”€f97d0f4c-8b3c-4ea7-bcd2-6019ab831734 +# ╠═2cf4022e-1b68-4a69-b6d0-669c3e5ac230 +# ╠═1b92c00e-8b2a-4cc8-b6f2-23d91cf4f989 +# ╠═37986301-c9d2-42e3-8b73-7c833bf7ae17 +# ╠═35bc2b8f-716d-4a85-8e60-7242709448c3 +# β•Ÿβ”€0c652efb-0edb-4a4e-a14c-7d5ac6eb5ffa +# ╠═ab09925c-4689-4f87-be44-f8eca12a5c9c +# β•Ÿβ”€69f2c623-632f-4df4-8566-a48574c0f9fb +# β•Ÿβ”€1a24999d-1ab7-4220-8e22-b1ac33ad03ac +# β•Ÿβ”€5e6c6135-f4f9-447c-8f7a-a49ec25e414a +# ╠═3fca01f3-ac6e-4fdc-b8ca-48040ca562f3 +# β•Ÿβ”€138bf97c-9295-440d-99f4-24f7fe58b774 +# ╠═87b984ee-2daa-4cca-b5eb-60c4aa3b2fb5 +# β•Ÿβ”€76b0886a-fc91-40ef-89d5-dcf5d261907f +# ╠═06e83a23-fa3a-49f7-8f43-d46f3285e943 +# ╠═a9bd2d76-16e6-4084-b65d-0645ec94aa9c +# ╠═444a89d1-a8c1-4df8-945d-6e8dd32ae204 +# ╠═9b4d67dc-9c75-45ee-9328-d229c527fdc6 +# ╠═4d8fd482-11cb-4f2e-8c47-2428ee7e66c6 +# β•Ÿβ”€1ba9efb2-cd95-4097-b8f6-3a770205c935 +# β•Ÿβ”€e5d604e0-44c4-4d10-8faa-7ade5f5fbfff +# ╠═4019f495-ce19-44e4-ad79-18349fa6ec18 +# ╠═afbf92d5-c72e-4041-a265-50d762df58f7 +# ╠═99d638e6-1fae-4020-af2f-28703cc67377 +# ╠═bec15afc-3f02-4c7d-b9e2-01f496e31689 +# ╠═7f729aa1-78c0-4d2e-9ae5-c27502be22e8 +# β•Ÿβ”€786c8319-806c-461d-af08-f082d6f12339 +# β•Ÿβ”€81863647-168f-46b1-87f1-cc1169b7c6ff +# ╠═aa022156-efb4-4b2b-ac22-9b4228ee2578 +# ╠═5f41a9e3-70e0-40d5-bdff-d90555130817 +# ╠═575ad310-8cbd-4b05-aee0-d84fb55ad6ed +# β•Ÿβ”€4a86bf84-434a-4ef3-a9c6-4c72df5068e0 +# β•Ÿβ”€e6201f93-d5fc-4f33-9e3c-f7d8eb0146b5 +# ╠═1b2a38dc-0caf-4c86-9910-8574fe10c48f +# ╠═9e1c4bc8-882f-45bf-b437-38c369867dac +# ╠═15c7c5ed-5bcf-4336-aecb-22fd3ef38d05 +# ╠═8de88cd0-e326-4926-bfe9-776e3516d6e2 +# ╠═cde76a39-51a0-4398-ba2c-81170e395a07 +# ╠═42a81a70-f8a1-4a11-a475-c4adddefde73 +# ╠═0969b685-e9c5-44d5-8698-a141dd01dca7 +# ╠═930902f1-5d0d-41a9-8c37-07e0d913aa6e +# ╠═96f05537-6fb3-45ce-8d75-28efdfa03279 +# ╠═3708eb56-53e4-43b8-8af4-e1f6e302a0cf +# ╠═07da284a-8f21-4088-b936-244d11f517dd +# ╠═9d14bb2f-2c8e-4b45-9775-e168a11005ff +# ╠═5ce17f7f-7e93-4c43-9f75-b3b677af9fd1 +# ╠═71c210f8-34ad-469a-89fa-dc99efb6b72a +# ╠═d5db3698-8546-4606-8346-85475619a3e0 +# ╠═6a178a79-ae85-4496-abef-11bf62d64da8 +# ╠═d9d417f3-a427-409e-9090-c76c8226be04 +# ╠═0d45d6f9-f27c-4d8e-b117-26132418be55 +# ╠═037b15f6-0858-41fa-a8fd-c6cc8c8d8e7a +# β•Ÿβ”€df004387-ea5f-42b1-9409-7b37d1a5031a +# ╠═01fb5888-a01a-4dd8-af08-bb70894a99b8 +# ╠═66c3e374-389c-4be9-bf16-341565d4b4c9 +# ╠═f578aafc-318f-4dc4-a574-0843057b1204 +# ╠═efefaff1-e6c7-46fa-bfa7-b4e6dec67641 +# ╠═262879f7-9441-4305-899a-b7c2881958fe +# ╠═d2414490-d2a5-4862-81e8-8ae8ffc5213a diff --git a/scripts/autodiff backup 1.jl b/scripts/autodiff backup 1.jl new file mode 100644 index 00000000..add3b955 --- /dev/null +++ b/scripts/autodiff backup 1.jl @@ -0,0 +1,2269 @@ +### A Pluto.jl notebook ### +# v0.19.40 + +using Markdown +using InteractiveUtils + +# This Pluto notebook uses @bind for interactivity. When running this notebook outside of Pluto, the following 'mock version' of @bind gives bound variables a default value (instead of an error). +macro bind(def, element) + quote + local iv = try Base.loaded_modules[Base.PkgId(Base.UUID("6e696c72-6542-2067-7265-42206c756150"), "AbstractPlutoDingetjes")].Bonds.initial_value catch; b -> missing; end + local el = $(esc(element)) + global $(esc(def)) = Core.applicable(Base.get, el) ? Base.get(el) : iv(el) + el + end +end + +# ╔═║ 47f98a52-f2b2-11ea-0ac6-9b4b74b7b15d +using Plots, PlutoUI, LinearAlgebra + +# ╔═║ 5ac4989c-f2b3-11ea-3e8a-a79a4117e48c +using Symbolics + +# ╔═║ 6fe82e5a-f2b8-11ea-101d-d1ee5f9bd5b1 +using ForwardDiff + +# ╔═║ 963c4910-f2b8-11ea-12bb-bb42539b1c93 +using Zygote + +# ╔═║ 08cf2a80-f2b2-11ea-132d-2f26c934bbb2 +md""" +# Numeric and automatic differentiation + +STMO + +![](https://github.com/MichielStock/STMO/blob/master/chapters/03.AutoDiff/Figures/logo.png?raw=true) + +**Michiel Stock** + +""" + +# ╔═║ b72a9871-3773-4a06-9a2f-09ce5a7d8496 +md"## Motivation + +Up to now, we confidently assumed that we would always be able to compute the derivative or gradient of any function. Despite differentiation being a relatively easy operation, it is frequenty not feasible (or desirable) to compute this by hand. *Numerical differentiation* can provide approximations of th derivate or gradient at a particular point. *Automatic differentiation* directly manipulates the computational graph to generate a function that computes the (exact) derivate. Such methods have advanced greatly in the last years and it is no exageration that their easy use in popular software libraries such as TenserFlow and PyTorch are a cornerstone of deep learning and other machine learning and scientific computing fields. +" + +# ╔═║ 5154a672-f2b2-11ea-1280-3ba5dadff7f9 +md""" +## Definition of a derivative + +$$\frac{\text{d}f(x)}{\text{d}x} = f'(x) = \lim _{h\to 0}{\frac {f(x+h)-f(x)}{h}}.$$ + +Derivation is in essence a mechanical process, following the rules below. + +![](https://raw.githubusercontent.com/MichielStock/STMO/master/chapters/03.AutoDiff/Figures/derivatives.jpeg) + +![](https://imgs.xkcd.com/comics/differentiation_and_integration.png) + +When we work with function of several variables, we use *partial derivatives* (e.g. $\frac{\partial f(x, y)}{\partial x}$), indicating we keep all variables but $x$ fixed. +""" + +# ╔═║ f53fbf24-f2b2-11ea-2f59-d943884fee9d +md""" +Our running example: + +$$f(x) = \log x + \frac{\sin x}{x}$$ +""" + +# ╔═║ e6a55456-fe6f-11ea-328c-47fedb388194 +md"**Assignment**: implement this function. (or another one)" + +# ╔═║ f7cd052e-f2bb-11ea-239a-47966e96e909 +md"We will evaluate this function in `a`=$2." + +# ╔═║ 7244eba2-f2b3-11ea-045f-ffd208852eda +a = 2.0 + +# ╔═║ 60058dbe-1514-4139-bb97-66b40fe47306 +md"For the record:" + +# ╔═║ 401df7a4-f2b3-11ea-12a1-e9b46bcfcf1b +md""" +## Symbolic differentiation + +Computing derivatives is relatively straightforward, as you have seen in basic calculus courses. Some software called **computer algebra systems** can manipulate symbolic expressions to generate derivatives. + + +For example, libraries that support symbolic differentiation: +- Maple +- Sympy (Python) +- Mathematica +- Maxima +- Symbolics (Julia) + +Differentiation is *easy* compared to *integration* or *sampling*. + +Advantages: +- exact derivatives! +- gives the formula for different evaluations. + - insight in the system (i.e. variable are independent can be learned from second-order partial derivatives) + - in some cases, closed-form solution extrema by solving $\frac{\text{d}f(x)}{\text{d}x}=0$ +- no hyperparameters or tweaking: just works! + +Disadvantages: +- some software not flexible enough (gradients, arrays, for-loops,...) +- sometimes explosion of terms: *expression swell* +- not always numerically optimal! +""" + +# ╔═║ 5db7350a-f2b3-11ea-293d-ffc572e0dbe8 +@variables x # define variable + +# ╔═║ 76ba97fe-b7c4-467b-85ae-9067ebcc8b14 +Dx = Differential(x) # differential operator + +# ╔═║ 92b65737-9ad7-422e-955c-e9adacd2032b +md"We can build this expression in a function:" + +# ╔═║ 67e7ea4d-0b76-4247-b22d-e20c8280f046 +md"You can play with this dynamically:" + +# ╔═║ 45190ad2-d358-455a-89a1-4f9c3b3880fa +@bind n Slider(-10:10, show_value=true, default=2) + +# ╔═║ 732ad756-1707-48e7-9bfb-10707e64b118 +n + +# ╔═║ c67f8b3f-0561-4f47-ade8-3c79d7920ae1 +md"Derivative:" + +# ╔═║ 913234a2-f2b3-11ea-3501-e3bfc54f91fe +md""" +# Numerical differentiation + +Finite difference approximation of the derivative/gradient based on a number of function evaluations. + +Often based on the limit definition of a derivative. Theoretical analysis using Taylor approximation: + +$$f(x + h) = f(x) + \frac{h}{1!}f'(x) + \frac{h^2}{2!}f''(x) + \frac{h^3}{3!}f^{(3)}(x)+\ldots$$ + +**Forward difference** + +$$f'(x)\approx \frac{f(x+h) - f(x)}{h}$$ + +**Central difference** + +$$f'(x)\approx \frac{f(x+h) - f(x-h)}{2h}$$ + +**Complex step method** + +$$f'(x)\approx \frac{\text{Im}(f(x +ih))}{h}$$ +""" + +# ╔═║ 0238579a-fe70-11ea-0968-0f11ae9557db +md"**Assignment**: Implement these functions. Hint `im` is the imaginary unit: i.e." + +# ╔═║ eef066e0-f2b3-11ea-3cfa-5f35ebf13f76 +diff_fordiff(f, x; h=1e-10) = missing + +# ╔═║ f2158710-f2b3-11ea-16c9-dded5e1747d4 +diff_centrdiff(f, x; h=1e-10) = missing + +# ╔═║ f54ee2b2-f2b3-11ea-24e8-f556ab9e3b85 +diff_complstep(f, x; h=1e-10) = missing + +# ╔═║ 4f42234e-f2b4-11ea-2c86-93449b8dc60b +md""" +## Intermezzo: floats + +Real numbers are always represented as floating point numbers in a computer. + +![Encoding of a real number using a `Float32`.](https://raw.githubusercontent.com/MichielStock/STMO/master/chapters/03.AutoDiff/Figures/floats.png) + +By default, Julia uses double precision floats (`Float64`). For brevity, let us take a look at the bit representation of a float. We use `Float32` for brevity's sake. +""" + +# ╔═║ 6adbc7fe-f2b4-11ea-1861-b398d517edfa +num = Float32(10.789) + +# ╔═║ 6cd1accc-f2b4-11ea-0077-e7685b77b1be +bitstring(num) + +# ╔═║ 77d4fd72-f2b4-11ea-0bd6-97fc2299ca2f +md"The first bit encodes the *sign*, here positive." + +# ╔═║ 773af248-f2b4-11ea-154a-cb67beebed3d +sign(num) + +# ╔═║ 8a5ee764-f2b4-11ea-23f3-27664d910c16 +md"The next eight bits specify the *exponent*, the magnitude of the number." + +# ╔═║ 8ded9128-f2b4-11ea-0f44-9321077205de +exponent(num) + +# ╔═║ c3a1abd8-f2b4-11ea-0509-a5296ae8b361 +md"While the final 23 bits specify the *mantissa*, a number between $[1,2]$ representing the precision." + +# ╔═║ c9f92e66-f2b4-11ea-322f-7778f149453d +significand(num) + +# ╔═║ cfb07cc6-f2b4-11ea-08a7-dd0b13d15b5e +md"These can be used to reconstrunct the number." + +# ╔═║ d9f2d114-f2b4-11ea-32b0-43fa1a872a97 +md"The *machine precision* of a number can be retained using `eps`. This is the relative error." + +# ╔═║ de1fd700-f2b4-11ea-36dd-4bfba5ecc134 +eps(1.2) + +# ╔═║ df14ce72-f2b4-11ea-307b-8fac2889681b +eps(1.2e10) + +# ╔═║ e584f976-f2b4-11ea-0245-67f6bcc4be0e +eps(1.2e-10) + +# ╔═║ eb68674c-f2b4-11ea-0cc2-f792d17a5005 +md""" +This brings us with numerical issues we might encounter using numerical differentiation. + +**First sin of numerical analysis**: + +> *thou shalt not add small numbers to big numbers* + +**second sin of numerical analysis**: + +> *thou shalt not subtract numbers which are approximately equal* +""" + +# ╔═║ f4edad2c-f2b4-11ea-05fb-3d43c18e9d5c +md"### Back to numerical differentiation + +Below is the absolute error using the three proposed methods." + +# ╔═║ 4e6b2b04-f2b5-11ea-0c52-5f32438e8c68 +md""" +Advantages of numerical differentiation: +- easy to implement +- general, no assumptions needed + +Disadvantages: +- not numerically stable (round-off errors) +- not efficient for gradients ($\mathcal{O}(n)$ evaluations for $n$-dimensional vectors) +""" + +# ╔═║ 55ff7230-f2b5-11ea-2898-db5e21c764fd +md"""## Approximations of multiplications with gradients + +**Gradient-vector approximation** (the directional derivative) + +$$\nabla f(\mathbf{x})^\intercal \mathbf{d} \approx \frac{f(\mathbf{x}+h\cdot\mathbf{d}) - f(\mathbf{x}-h\cdot\mathbf{d})}{2h}$$ + +**Hessian-vector approximation** + +$$\nabla^2 f(\mathbf{x}) \mathbf{d} \approx \frac{\nabla f(\mathbf{x}+h\cdot\mathbf{d}) - \nabla f(\mathbf{x}-h\cdot\mathbf{d})}{2h}$$ +""" + +# ╔═║ e5c12243-70ad-4e52-9bab-aae432203e21 +md"Generate an example" + +# ╔═║ 67e9fa88-ff03-11ea-1177-c34331398d6c +md"$$g(\mathbf{x}) = \exp(-\mathbf{x}^\intercal A\mathbf{x})$$" + +# ╔═║ 8a738272-f2b5-11ea-2de6-f9ae6b30a466 +md"Correct gradient and Hessian (by hand)" + +# ╔═║ c2924514-fe7f-11ea-2b01-81e9e0e1c491 +h = 1e-10 + +# ╔═║ d6c6d4ea-f2b7-11ea-0b41-d7f629cdcd2f +md""" +## Forward differentiation + +Accumulation of the gradients along the *computational graph*. + +![](https://raw.githubusercontent.com/MichielStock/STMO/master/chapters/03.AutoDiff/Figures/forwarddiff.png) + +Forward differentiation computes the gradient from the inputs to the outputs. + +### Differentiation rules + +**Sum rule**: + +$$\frac{\partial (f(x)+g(x))}{\partial x} = \frac{\partial f(x)}{\partial x} + \frac{\partial f(x)}{\partial x}$$ + +**Product rule**: + +$$\frac{\partial (f(x)g(x))}{\partial x} = f(x)\frac{\partial g(x)}{\partial x} + g(x)\frac{\partial f(x)}{\partial x}$$ + +**Chain rule**: + +$$\frac{\partial (g(f(x))}{\partial x} = \frac{\partial g(u)}{\partial u}\mid_{u=f(x)} \frac{\partial f(x)}{\partial x}$$ + +## Dual numbers + +Forward differentiation can be viewed as evaluating function using *dual numbers*, which can be viewed as truncated Taylor series: + +$$v + \dot{v}\epsilon\,,$$ + +where $v,\dot{v}\in\mathbb{R}$ and $\epsilon$ a nilpotent number, i.e. $\epsilon^2=0$. For example, we have + +$$(v + \dot{v}\epsilon) + (u + \dot{u}\epsilon) = (v+u) + (\dot{v} +\dot{u})\epsilon$$ + + +$$(v + \dot{v}\epsilon)(u + \dot{u}\epsilon) = (vu) + (v\dot{u} +\dot{v}u)\epsilon\,.$$ + + +These dual numbers can be used as + +$$f(v+\dot{v}\epsilon) = f(v) + f'(v)\dot{v}\epsilon\,.$$ +""" + +# ╔═║ fe18341e-f2b7-11ea-0236-03b44eebd328 +struct Dual{T} + v::T + vdot::T +end + +# ╔═║ 3f2a4cc2-26fa-4c3e-bfb7-f3ef019b6d78 +Base.show(io::IO, a::Dual) = print(io, "$(a.v) + $(a.vdot)Ο΅") # nice printing + +# ╔═║ 9e22156e-0880-11eb-24a8-3d0a41262c36 +Ο΅ = Dual(0.0, 1.0) + +# ╔═║ ab39b554-0880-11eb-05de-71949f71b440 +Dual(2.0, 3.0) + +# ╔═║ 0aba93a6-f2b8-11ea-1461-d96878b7a5c1 +md"Let's implement some basic rules showing linearity." + +# ╔═║ 3f5a58da-f2b8-11ea-3ab0-5db5e9199bb1 +md"And some more advanced ones, based on differentiation." + +# ╔═║ eaacb5a5-c748-4223-98e4-be73d3f2086f + + +# ╔═║ 263e18dc-fe70-11ea-03a0-8fd5e031b06f +md"**Assignment**: complete this code." + +# ╔═║ 2f18c362-f2b8-11ea-1beb-719ff5cd5f8d +Base.:sin(a::Dual) = missing + +# ╔═║ 393f92a6-fe70-11ea-024e-ff30dcfc7103 +Base.:cos(a::Dual) = missing + +# ╔═║ 329cb67e-f2b8-11ea-07b1-e13fd8ddbe42 +Base.:exp(a::Dual) = missing + +# ╔═║ 36a2ca10-f2b8-11ea-0fae-53b552c76115 +Base.:log(a::Dual) = missing + +# ╔═║ 555c8d88-f2b8-11ea-34d8-a17ce87ccdc1 +md"This directly works for vectors!" + +# ╔═║ 6971e7e6-f2b8-11ea-2a76-9dda6b1455b6 +md"In practice, we prefer to use a package to do this." + +# ╔═║ 8a254852-f2b8-11ea-142d-71bb270a5c01 +md""" +Forward differentiation: + +- exact gradients! +- computational complexity scales with **number of inputs** +- used when you have more outputs than inputs +""" + +# ╔═║ 91d0e03e-f2b8-11ea-07e5-db056636ac21 +md""" +# Reverse differentiation + +Compute the gradient from the output toward the inputs using the chain rule. + +![](https://raw.githubusercontent.com/MichielStock/STMO/master/chapters/03.AutoDiff/Figures/reversediff.png) + +Reverse differentiation: + +- also exact! +- main workhorse for training artificial neural networks. +- efficient when more inputs than outputs (machine learning: thousands of parameters vs. one loss) +""" + +# ╔═║ a041fbf8-f2b8-11ea-28ba-0772497c649f +md"Constructing the derivative or gradient can be done by appending `'` to the function." + +# ╔═║ bdce5964-f2b8-11ea-03d1-57705d295040 +md"More verbose, but exactly the same:" + +# ╔═║ e1057afe-fe6e-11ea-27fe-6def4d8e1f2d +md"This works for function with multiple inputs." + +# ╔═║ d6d310ee-f2b8-11ea-24e1-3b405f071545 +md"Fuctions with vectorial input." + +# ╔═║ dbb1e68c-f2b8-11ea-1220-6f5715822e3d +md"Finding the Hessian:" + +# ╔═║ ee52d2b8-f2b8-11ea-15c4-19e9f2ad10e2 +md""" +## Artificial neural networks + +Multi-layer perceptron. + +![](https://raw.githubusercontent.com/MichielStock/STMO/master/chapters/03.AutoDiff/Figures/ANN_example.png) + +Forward differentiation. + +![](https://raw.githubusercontent.com/MichielStock/STMO/master/chapters/03.AutoDiff/Figures/Forwardprop.png) + +Reverse differentation or backpropagation. + +![](https://raw.githubusercontent.com/MichielStock/STMO/master/chapters/03.AutoDiff/Figures/Backprop.png) + +Returns effect of changing layer output on the loss. Can be related directly to the parameters! +""" + +# ╔═║ 213fc38a-f380-11ea-135e-6f72924c19aa +md""" +## Differentiating complex objects + +Automatic differentiation can be used beyond machine learning and optimization: + +- [physical engines](https://arxiv.org/abs/1611.01652) to learn robot control +- differentiating [protein](https://github.com/lupoglaz/TorchProteinLibrary) [structures](https://www.cell.com/cell-systems/fulltext/S2405-4712(19)30076-6) +- Sinkhorn algorithm +- [dynamic programming](https://arxiv.org/abs/1802.03676) +- [differential equations](https://julialang.org/blog/2019/01/fluxdiffeq) +- [molecules](https://www.nature.com/articles/s41592-021-01283-4) + +Everything is computed by some straightforward and differentiable functions! +""" + +# ╔═║ 059679c0-d0ff-453b-b897-b889bbea326d +md""" +### Example: differentiable sequence alignment + +One can differentiate the Needleman-Wunsch algorithm for sequence alignment. This yields insight in how the alignment score would change if one changes the alignment parameters. +""" + +# ╔═║ a20f0158-f32b-45e8-8bd5-6f693eca1860 +abstract type Regularizer end + +# ╔═║ 23b0cc81-b551-446b-991f-54bd19ac63cd +struct NegEntropy{T<:Number} <: Regularizer + Ξ³::T +end + +# ╔═║ a9961630-08be-48f8-b1cc-4a9d67dfc519 +function max_argmax(Ξ©::NegEntropy, x) + Ξ³ = Ξ©.Ξ³ + m = maximum(x) + # stable log-sum-exp computation + lse = m + Ξ³ * log(sum(exp, (x .- m) ./ Ξ³)) + # stable softmax + q = exp.((x .- lse) ./ Ξ³) + return lse, q # smooth max and grad +end + +# ╔═║ e4d2350e-147b-4c3c-a9ff-6de66a54c48a +function βˆ‡needleman_wunsch(Ξ©::Regularizer, ΞΈ, (cΛ’, cα΅—)) + n, m = size(ΞΈ) + D = zeros(n+1, m+1) # initialize DP matrix + D[2:n+1,1] .= -cumsum(cΛ’) # cost of starting with gaps in s + D[1,2:m+1] .= -cumsum(cα΅—) # cost of starting with gaps in t + E = zeros(n+2, m+2) # matrix for the gradient + E[n+2,m+2] = 1.0 + Q = zeros(n+2, m+2, 3) # matrix for backtracking + Q[n+2,m+2,2] = 1.0 + # forward pass, performing dynamic programming + for i in 1:n, j in 1:m + v, q = max_argmax(Ξ©, (D[i+1,j] - cΛ’[i], # gap in s + D[i,j] + ΞΈ[i,j], # match + D[i,j+1] - cα΅—[j])) # gap in t + D[i+1,j+1] = v # store smooth max + Q[i+1,j+1,:] .= q # store directions + end + v = D[n+1,m+1] # get alignment score + # backtracking through the directions to compute the gradient + for i in n:-1:1, j in m:-1:1 + E[i+1,j+1] = Q[i+1,j+2,1] * E[i+1,j+2] + + Q[i+2,j+2,2] * E[i+2,j+2] + + Q[i+2,j+1,3] * E[i+2,j+1] + end + return v, E[2:n+1,2:m+1] # value and gradient +end + +# ╔═║ 501a0db3-538a-43f3-a769-158c824bca31 +md"For example, consider two sequences and the Hamming distance." + +# ╔═║ ca64df96-082a-40dd-b82c-64016257fcab +s, t = "aattcaa", "atctaca" + +# ╔═║ ba43bc8b-27d6-490d-971e-7e440b991cfb +ΞΈ = [sα΅’==tα΅’ for sα΅’ in s, tα΅’ in t] + +# ╔═║ 2d7dbec3-82eb-41f8-a959-b458e136d18c +heatmap(ΞΈ, flipy=true, yticks=(1:length(s), s), xticks=(1:length(t), t), title="theta") + +# ╔═║ 378500c1-9f19-4111-82cf-5a57c30d66ef +cΛ’, cα΅— = 0.1ones(length(s)), 0.1ones(length(t)) + +# ╔═║ 8586855b-2ad7-4fe4-af1a-2a6f1dd052b3 +@bind logΞ³ Slider(-8:0.2:4, default=-4) + +# ╔═║ 8877c563-d10a-41e4-be8b-546d27623b67 +Ξ³ = exp(logΞ³) + +# ╔═║ a73e4d59-34f4-412f-afa4-f3b66244b35e +Ξ³ + +# ╔═║ 6707fd27-78f6-4663-b95d-a016d2c44c3b +# alignment value and score +v, E = βˆ‡needleman_wunsch(NegEntropy(Ξ³), ΞΈ, (cΛ’, cα΅—)) + +# ╔═║ 014ec92c-f2b8-11ea-3986-8d74a8c2458d +begin + Base.:+(a::Dual, b::Dual) = Dual(a.v + b.v, a.vdot + b.vdot) + Base.:-(a::Dual, b::Dual) = Dual(a.v - b.v, a.vdot - b.vdot) + Base.:-(a::Dual, b::Real) = Dual(a.v - b, a.vdot) + Base.:-(a::Dual) = Dual(-a.v, -a.vdot) + Base.:*(a::Dual, b::Dual) = Dual(a.v * b.v, a.v * b.vdot + b.v * a.vdot) + Base.:+(c::Real, b::Dual) = Dual(c + b.v, b.vdot) + Base.:*(v::Real, b::Dual) = Dual(v, 0.0) * b + Base.:*(a::Dual, b::Real) = v * a +end + +# ╔═║ 9ecd1cd6-8412-4fe1-9d79-676f9830ec2c +imag_number = 2 + 3im # im is a special type of number + +# ╔═║ af02692c-c1be-4f7c-a09f-fbd88b0c4bd8 +real(imag_number), imag(imag_number) # extract real and imaginary parts + +# ╔═║ d56b74f2-f2b4-11ea-12b4-5f54d4999b38 +sign(num) * significand(num) * 2^exponent(num) + +# ╔═║ 6fd08e42-f2b5-11ea-36e6-d7ff10412e2b +xvect = 2rand(10) + +# ╔═║ 4a6270a3-a271-40da-84d0-28247f287c22 +2.0 + 3.0Ο΅ # now this works! + +# ╔═║ 48e5da96-f2b8-11ea-0108-2104f2c8ac24 +# you can derive this directly from the definition! +Base.:/(a::Dual, b::Dual) = Dual(a.v / b.v, (a.vdot * b.v - a.v * b.vdot) / b.v^2) + +# ╔═║ 2be8656c-f2b3-11ea-2244-5740c807deff +f(x) = log(x) + sin(x) / x + +# ╔═║ 21882f0e-8d54-41ae-84c6-7637ccc52c46 +f(a) + +# ╔═║ d5edd644-fe7c-11ea-2aa8-c772ea2f1bde +f(x) + +# ╔═║ 64b28e4a-f2b3-11ea-0fc0-7d37b4794686 +Dx(f(x)) + +# ╔═║ 8a4a8499-af01-46ea-8196-fb2d718d0d17 +df_sym = expand_derivatives(Dx(f(x))) # this expands the derviatve operator + +# ╔═║ a38e2cce-851c-4065-8947-1926fa9ca5b4 +df = build_function(df_sym, x) |> eval #builds an expression and turns it into a function + +# ╔═║ 684ff7f4-f2b3-11ea-14f7-7d3f329ecd79 +df(a) + +# ╔═║ 2ca60bca-f2b4-11ea-0fec-c50f4e306536 +true_diff = df(a); # save for checking + +# ╔═║ 7a6a18de-f2b3-11ea-1b3d-ef7a2b1b0434 +if !ismissing(f(a)) +plot(f, 1, 10, label="\$f(x)\$", xlabel="\$x\$", lw=2, color=:green) +plot!(df, 1, 10, label="\$f'(x)\$", lw=2, color=:orange) +end + +# ╔═║ 08a565e0-f2b4-11ea-2ab6-f5f3a1b3c22d +diff_fordiff(f, a) + +# ╔═║ 1055a996-f2b4-11ea-14d2-6116cbbaa6ba +diff_centrdiff(f, a) + +# ╔═║ 13db037a-f2b4-11ea-2a38-bd7c1c60f7d9 +diff_complstep(f, a) + +# ╔═║ 4ee45daa-f2b8-11ea-10ea-f929853879b1 +f(Dual(a, 1.0)) # works when rules are provided + +# ╔═║ 723fe4ca-f2b8-11ea-1440-a9e1cd213b66 +ForwardDiff.derivative(f, a) + +# ╔═║ 9b5db398-f2b8-11ea-00bc-77de99792925 +f'(a) # that's it + +# ╔═║ c6728784-f2b8-11ea-12b5-d7eb039d77ce +Zygote.gradient(f, a) # returns a tuple, since you can differentiate w.r.t. multiple arguments + +# ╔═║ c8a5c6f8-4ca1-4c7e-9cc1-d2e5c9e9da59 +symexpr = (x + 2)^n / (x+2) + +# ╔═║ 997ec642-a865-4c97-9aa1-d4d9df9e1dd0 +expand_derivatives(Dx(symexpr)) |> simplify + +# ╔═║ 688a1f40-f2b5-11ea-3fa8-ebb735323ddd +grad_vect(f, x, d; h=1e-10) = (f(x .+ h * d) - f(x .- h * d)) / (2h) + +# ╔═║ 6d6da8ba-f2b5-11ea-1064-df27ecea7d13 +dvect = randn(10) / 10 + +# ╔═║ 9a87095e-f2b5-11ea-334e-57a637e20c43 +A = randn(10, 10) |> A -> (A * A' + I) / 100 # make sym and PD + +# ╔═║ 75ae48fe-f2b5-11ea-0614-912091cbfb6a +g(x) = exp(- sum(x .* (A * x))) + +# ╔═║ 8fe85430-f2b5-11ea-3fe7-5d9a0db03932 +g(xvect) + +# ╔═║ b455e8ac-fe7f-11ea-1a8a-db85d11ccba7 +grad_vect(g, xvect, dvect) + +# ╔═║ 76284520-f2b8-11ea-077e-43167cc7484c +ForwardDiff.gradient(g, xvect) + +# ╔═║ d3ae2c14-f2b8-11ea-1ac2-fb5e0b4b8500 +g'(xvect) + +# ╔═║ df557ed2-f2b8-11ea-22ee-e1c90a2655bf +Zygote.hessian(g, xvect) + +# ╔═║ 7b95d73c-f2b5-11ea-1b29-858f7b6c99bf +βˆ‡g(x) = -2g(x) * A * x + +# ╔═║ b372c25c-f2b5-11ea-1c55-e5045e0dc5b7 +βˆ‡g(xvect) + +# ╔═║ b6e48b12-f2b5-11ea-3bf2-81e5b2a3dc98 +βˆ‡g(xvect)' * dvect + +# ╔═║ 836ca94a-f2b5-11ea-07e0-bd830f810fba +βˆ‡Β²g(x) = -2g(x) * A - 2A * x * βˆ‡g(x)' + +# ╔═║ cd2821c4-fe7f-11ea-0c41-8feab49be07a +βˆ‡Β²g(xvect) * dvect + +# ╔═║ bebbd674-f2b5-11ea-19c6-4fe1257b0277 +(βˆ‡g(xvect + h * dvect) - βˆ‡g(xvect - h * dvect)) / 2h + +# ╔═║ 272bdcca-aeb1-405f-8251-33f13cddbdc5 +(2.0+3.0Ο΅) / (5.0+8.0Ο΅) + +# ╔═║ 59eee760-f2b8-11ea-29f6-732292e2f95d +q(x) = 10.0 * x[1] * x[2] + x[1] * x[1] + sin(x[1]) / x[2] + +# ╔═║ 5ccd625e-f2b8-11ea-38c1-098e2f31ce53 +q([1, 2]) + +# ╔═║ 60b52f6e-f2b8-11ea-2afc-4be2d4ae3e19 +q(Dual.([1, 2], [1, 0])) # partial wrt x1 + +# ╔═║ 63d5e0be-f2b8-11ea-16e8-d9528b4e8945 +q(Dual.([1, 2], [0, 1])) # partial wrt x2 + +# ╔═║ 85a5c518-f2b8-11ea-2e12-25d16a12e7c8 +ForwardDiff.gradient(q, [1, 2]) + +# ╔═║ eb76e252-fe6e-11ea-0939-c51ff3c73827 +Zygote.gradient((x1, x2) -> (x1^2 + x2^2 - 0.1x1*x2) / (x1 + 1.0), + 0.2, 0.3) + +# ╔═║ 18e151c4-0b0e-485b-81d2-f18a2dd4592d +heatmap(E, flipy=true, yticks=(1:length(s), s), xticks=(1:length(t), t), title="gradient of NW", color=:speed) + +# ╔═║ 79221eee-f2be-11ea-3e43-4596f5ce5694 +md""" +## Application: inverse kinematics of a robot arm + +As an illustration of using gradients, let us study a [simple robot arm](https://appliedgo.net/roboticarm/). This arm consists of three joints that can be moved in the 2D plane. These lengths of the three segments are, respectivly 2, 1 and 1.5 meter. + +The forward kinetics (i.e., going from the angles of the joints to the position of the arms) can be computed by the following functions. +""" + +# ╔═║ fb91a9c4-f2c0-11ea-38c4-5b554446e997 +pos_second_joint((θ₁, ΞΈβ‚‚, θ₃)) = [2cos(θ₁), 2sin(θ₁)] + +# ╔═║ 07c45d78-f2c3-11ea-131e-b9f0b67ca3cd +pos_third_joint((θ₁, ΞΈβ‚‚, θ₃)) = pos_second_joint((θ₁, ΞΈβ‚‚, θ₃)) + [cos( ΞΈβ‚‚), sin( ΞΈβ‚‚)] + +# ╔═║ 33023d10-f2c1-11ea-3375-e9ac23172ab6 +pos_hand((θ₁, ΞΈβ‚‚, θ₃)) = pos_third_joint((θ₁, ΞΈβ‚‚, θ₃)) .+ [1.5cos(θ₃), 1.5sin(θ₃)] + +# ╔═║ 31cdefd2-f381-11ea-3037-e9c023ebc1e9 +md"Suppose that there is a teapot at a certain location we want to grasp with the arm." + +# ╔═║ 4def0626-f2c1-11ea-2f01-31a8c42b121c +position_teapot = [-1, 2.3] + +# ╔═║ 46c54108-f381-11ea-141f-31a696a7a8ef +md"Below is a plot of the arm and the teapot. Can you turn the angles to bring the hand to the position of the teapot?" + +# ╔═║ 8049560e-f383-11ea-1c8e-39c629d20982 +@bind θ₁ Slider(0:0.01:2Ο€, show_value=true) + +# ╔═║ c7b5a1aa-f383-11ea-2a84-8da9c9e60dbc +@bind ΞΈβ‚‚ Slider(0:0.01:2Ο€, show_value=true) + +# ╔═║ cfad1a8c-f383-11ea-3dad-214f3da9485d +@bind θ₃ Slider(0:0.01:2Ο€, show_value=true) + +# ╔═║ 83ddbe6a-f381-11ea-2415-255cbfb2590b +md"First complete a function to determine the distance between the arm and the teapot." + +# ╔═║ 30e9891c-f2c5-11ea-022d-5dbf9c064e43 +distance_to_teapot(ΞΈ) = √(sum(abs2, position_teapot .- pos_hand(ΞΈ))) + +# ╔═║ 5812f84c-f2c1-11ea-0f6c-31b9fedc3704 +begin + psj = pos_second_joint((θ₁, ΞΈβ‚‚, θ₃)) + ptj = pos_third_joint((θ₁, ΞΈβ‚‚, θ₃)) + phand = pos_hand((θ₁, ΞΈβ‚‚, θ₃)) + plot([0, psj[1], ptj[1], phand[1]], [0, psj[2],ptj[2], phand[2]], label="Arm") + scatter!([0], [0], label="First joint (fixed)") + scatter!([psj[1]], [psj[2]], label="Second joint") + scatter!([ptj[1]], [ptj[2]], label="Second joint") + scatter!([phand[1]], [phand[2]], label="Hand") + scatter!([position_teapot[1]], [position_teapot[2]], m=:star, label="teapot") + title!("Distance to teapot = $(distance_to_teapot((θ₁, ΞΈβ‚‚, θ₃)))") + xlims!(-5, 5) + ylims!(-5, 5) +end + +# ╔═║ b07cb958-f381-11ea-3378-5517440464ca +md"Can you use gradients to position the arm?" + +# ╔═║ eaac2514-f8fe-11ea-2229-81f5b59f58fe +distance_to_teapot([θ₁, ΞΈβ‚‚, θ₃]) + +# ╔═║ fb044216-f381-11ea-2faf-fd53dad74950 +distance_to_teapot'([θ₁, ΞΈβ‚‚, θ₃]) + +# ╔═║ 675b222c-f382-11ea-257a-afcb5a5afdd8 +begin + # initial value of ΞΈ + ΞΈs = [0.0, 0.0, 0.0] + for i in 1:500 # 500 steps, decaying + ΞΈs .-= 1/i * distance_to_teapot'(ΞΈs) + end +end + +# ╔═║ 818c1f9e-ff1b-11ea-097f-cba2f30af994 +ΞΈs # optimal values + +# ╔═║ 7aff4178-bcac-4cfa-ab22-de3506cf73a8 +distance_to_teapot(ΞΈs) + +# ╔═║ 881dedd4-f385-11ea-342e-a3700e90ac66 +md""" +## Exercise + +Consider the *Wheeler's Ridge* function (also called "the banana function"): + +$$f(\mathbf{x}) = -\exp(-(x_1 x_2 - a)^2 -(x_2 -a)^2)\,,$$ + +at the point $\mathbf{x}_0=[1.5, 1]^T$. We set $a=1.5$. + +Implement this function. +""" + + +# ╔═║ c1e19e26-f385-11ea-17b6-6d2d2e5cb7c0 +fwr(x; a=1.5) = missing + +# ╔═║ fe18a0a0-f8fe-11ea-1595-4d95256dabca +fwr([1,2]) isa Missing || contour(-0:0.1:3, -0:0.1:3, (x1, x2) -> fwr([x1, x2]), color=:speed) + +# ╔═║ df5f20d8-f385-11ea-104d-9b9e7b094eb7 +md""" + +**Assignments** + +1. Compute the gradient by hand. +2. Compute the gradient using symbolic differentiation. +2. Find the gradient and Hessian at $\mathbf{x}_0$ by numerical differentiation. +3. Compute the gradient and Hessian at $\mathbf{x}_0$ using automatic differentiation. +4. (optional) Use the function `quiver!` to draw the gradient as a vector field on the contour plot. + +""" + +# ╔═║ e4a088f0-f385-11ea-00da-b12e40e4357f +xβ‚€ = [1.5, 1.0] # btw written as x\_0 + +# ╔═║ ec87028b-d9d4-4dc7-9dd5-36eaa1dd49d4 +fwr(xβ‚€) + +# ╔═║ ddd214d8-608a-4123-973f-b331c6ab331a +md"Symbolic" + +# ╔═║ 8f3fecac-f8fd-11ea-136d-1513f60ee3ed + + +# ╔═║ f8863a18-f385-11ea-0965-0f074e58d9b2 + + +# ╔═║ 4c3817f6-396e-4485-a7dd-0f507cec124a +md"Numberic" + +# ╔═║ 78b72cb1-52f3-4dc3-a721-b8a89a24312e + + +# ╔═║ 7180e310-a6f7-4feb-aff3-28e1c772b441 + + +# ╔═║ 02b42a67-7ebe-4ca2-ac55-aa481b30e997 +md"Forward (dual numbers)" + +# ╔═║ 043e3e2f-3876-41c0-bf70-5ef53b5db986 + + +# ╔═║ 8ba368c9-3b04-469e-9556-1573cbc52185 + + +# ╔═║ 4da4a1b6-b7c8-432d-86ed-c45a499a1880 + + +# ╔═║ c573ba19-4be5-4afd-b9f5-8b75e9b18ad6 +md"Reverse" + +# ╔═║ 639528b1-ecff-4a05-ae56-9a08b779edc1 + + +# ╔═║ 838292fc-2c0e-4bb9-9df9-6cd197c4a4fd + + +# ╔═║ ca20cc75-3033-4bd1-bb5c-cae61c855de7 + + +# ╔═║ 34d48ec0-f2b9-11ea-147e-d3554a9fcc04 +md""" +# References + +- Gunes et. al. (2015) *Automatic differentiation in machine learning: a survey* +- Kochenderfer, M. J. and Wheeler, T., '*Algorithms for Optimization*'. MIT Press (2019) +""" + +# ╔═║ 0a576c65-3685-4987-93f1-980ace78d6f4 +module Solution + + export diff_fordiff, diff_centrdiff, diff_complstep + + diff_fordiff(f, x; h=1e-10) = (f(x + h) - f(x)) / h + diff_centrdiff(f, x; h=1e-10) = (f(x + h) - f(x - h)) / 2h + diff_complstep(f, x; h=1e-10) = imag(f(x + im * h)) / h + + +end + +# ╔═║ 91aff94e-e77e-4810-82ad-fe5ab3eafdad +md"Show solution dual numbers: $(@bind show_dual_sol CheckBox())" + +# ╔═║ 8eb9ed90-981b-4094-baec-a521614fb3a1 +if show_dual_sol + md"solution dual numbers: +```julia + Base.:sin(a::Dual) = Dual(sin(a.v), cos(a.v) * a.vdot) + Base.:cos(a::Dual) = Dual(cos(a.v), -sin(a.v) * a.vdot) + Base.:exp(a::Dual) = Dual(exp(a.v), exp(a.v) * a.vdot) + Base.:log(a::Dual) = Dual(log(a.v), 1.0 / a.v * a.vdot) +```" +end + +# ╔═║ d682439b-bc6b-456d-8b5d-2489d095e55f +md"Show solution quiver plot: $(@bind show_quiver_sol CheckBox())" + +# ╔═║ 2d4c0bf6-3936-449d-8341-56f9c5659a6e +if show_quiver_sol + md"solution quiver plot: +```julia + x1vals, x2vals = -0:0.5:4, -0:0.5:3 + + contour(-0.1:0.1:4, -0.1:0.1:3, (x1, x2) -> fwr([x1, x2]), + color=:speed) + + quiver!([x1 for x1 in x1vals for x2 in x2vals], + [x2 for x1 in x1vals for x2 in x2vals], + quiver=(x1,x2)->0.25.*fwr'((x1,x2))) + xlabel!(\"x_1\") + ylabel!(\"x_2\") +```" +end + +# ╔═║ fe4dfa5c-ea26-4f7c-aa68-7b3ec5f45bdc +begin + myblue = "#304da5" + mygreen = "#2a9d8f" + myyellow = "#e9c46a" + myorange = "#f4a261" + myred = "#e76f51" + myblack = "#50514F" + + mycolors = [myblue, myred, mygreen, myorange, myyellow] +end; + +# ╔═║ 2e00ef04-f2b3-11ea-1960-8136321c71db +ismissing(f(a)) || plot(f, 1, 5, label="f(x)", color=myblue) + +# ╔═║ fd9ed266-f2b4-11ea-3c53-3bd2fe30a7f1 +begin + fexamp(x) = 64x*(1-x)*(1-2x)^2*(1-8x+8x^2)^2 + #dfexamp = diff(fexamp(x), x) + dfexamp = build_function(expand_derivatives(Dx(fexamp(x))), x) |> eval + error(diff, h; x=1.0) = max(abs(Float64(dfexamp(x)) - diff(fexamp, x, h=h)), 1e-50) + stepsizes = map(t->10.0^t, -20:0.1:-1); + plot(stepsizes, error.(Solution.diff_fordiff, stepsizes), label="forward difference", + xscale=:log10, yscale=:log10, lw=2, legend=:bottomright, color=myblue) + plot!(stepsizes, error.(Solution.diff_centrdiff, stepsizes), label="central difference", lw=2, color=myred) + plot!(stepsizes, error.(Solution.diff_complstep, stepsizes), label="complex step", lw=2, + color=myyellow) + xlabel!("\$h\$") + ylabel!("absolute error") +end + +# ╔═║ 00000000-0000-0000-0000-000000000001 +PLUTO_PROJECT_TOML_CONTENTS = """ +[deps] +ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" +LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" +Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" +PlutoUI = "7f904dfe-b85e-4ff6-b463-dae2292396a8" +Symbolics = "0c5d862f-8b57-4792-8d23-62f2024744c7" +Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f" + +[compat] +ForwardDiff = "~0.10.19" +Plots = "~1.22.1" +PlutoUI = "~0.7.9" +Symbolics = "~3.3.1" +Zygote = "~0.6.21" +""" + +# ╔═║ 00000000-0000-0000-0000-000000000002 +PLUTO_MANIFEST_TOML_CONTENTS = """ +# This file is machine-generated - editing it directly is not advised + +[[AbstractFFTs]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "485ee0867925449198280d4af84bdb46a2a404d0" +uuid = "621f4979-c628-5d54-868e-fcf4e3e8185c" +version = "1.0.1" + +[[AbstractTrees]] +git-tree-sha1 = "03e0550477d86222521d254b741d470ba17ea0b5" +uuid = "1520ce14-60c1-5f80-bbc7-55ef81b5835c" +version = "0.3.4" + +[[Adapt]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "84918055d15b3114ede17ac6a7182f68870c16f7" +uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" +version = "3.3.1" + +[[ArgTools]] +uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" +version = "1.1.1" + +[[ArrayInterface]] +deps = ["Compat", "IfElse", "LinearAlgebra", "Requires", "SparseArrays", "Static"] +git-tree-sha1 = "b8d49c34c3da35f220e7295659cd0bab8e739fed" +uuid = "4fba245c-0d91-5ea0-9b3e-6abc04ee57a9" +version = "3.1.33" + +[[Artifacts]] +uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" + +[[Base64]] +uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" + +[[Bijections]] +git-tree-sha1 = "705e7822597b432ebe152baa844b49f8026df090" +uuid = "e2ed5e7c-b2de-5872-ae92-c73ca462fb04" +version = "0.1.3" + +[[Bzip2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "19a35467a82e236ff51bc17a3a44b69ef35185a2" +uuid = "6e34b625-4abd-537c-b88f-471c36dfa7a0" +version = "1.0.8+0" + +[[Cairo_jll]] +deps = ["Artifacts", "Bzip2_jll", "CompilerSupportLibraries_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "JLLWrappers", "LZO_jll", "Libdl", "Pixman_jll", "Pkg", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Zlib_jll", "libpng_jll"] +git-tree-sha1 = "4b859a208b2397a7a623a03449e4636bdb17bcf2" +uuid = "83423d85-b0ee-5818-9007-b63ccbeb887a" +version = "1.16.1+1" + +[[ChainRules]] +deps = ["ChainRulesCore", "Compat", "LinearAlgebra", "Random", "Statistics"] +git-tree-sha1 = "d88340ab502af66cfffc821e70ae72f7dbdce645" +uuid = "082447d4-558c-5d27-93f4-14fc19e9eca2" +version = "1.11.5" + +[[ChainRulesCore]] +deps = ["Compat", "LinearAlgebra", "SparseArrays"] +git-tree-sha1 = "4ce9393e871aca86cc457d9f66976c3da6902ea7" +uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" +version = "1.4.0" + +[[ColorSchemes]] +deps = ["ColorTypes", "Colors", "FixedPointNumbers", "Random"] +git-tree-sha1 = "9995eb3977fbf67b86d0a0a0508e83017ded03f2" +uuid = "35d6a980-a343-548e-a6ea-1d62b119f2f4" +version = "3.14.0" + +[[ColorTypes]] +deps = ["FixedPointNumbers", "Random"] +git-tree-sha1 = "024fe24d83e4a5bf5fc80501a314ce0d1aa35597" +uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f" +version = "0.11.0" + +[[Colors]] +deps = ["ColorTypes", "FixedPointNumbers", "Reexport"] +git-tree-sha1 = "417b0ed7b8b838aa6ca0a87aadf1bb9eb111ce40" +uuid = "5ae59095-9a9b-59fe-a467-6f913c188581" +version = "0.12.8" + +[[Combinatorics]] +git-tree-sha1 = "08c8b6831dc00bfea825826be0bc8336fc369860" +uuid = "861a8166-3701-5b0c-9a16-15d98fcdc6aa" +version = "1.0.2" + +[[CommonSolve]] +git-tree-sha1 = "68a0743f578349ada8bc911a5cbd5a2ef6ed6d1f" +uuid = "38540f10-b2f7-11e9-35d8-d573e4eb0ff2" +version = "0.2.0" + +[[CommonSubexpressions]] +deps = ["MacroTools", "Test"] +git-tree-sha1 = "7b8a93dba8af7e3b42fecabf646260105ac373f7" +uuid = "bbf7d656-a473-5ed7-a52c-81e309532950" +version = "0.3.0" + +[[Compat]] +deps = ["Base64", "Dates", "DelimitedFiles", "Distributed", "InteractiveUtils", "LibGit2", "Libdl", "LinearAlgebra", "Markdown", "Mmap", "Pkg", "Printf", "REPL", "Random", "SHA", "Serialization", "SharedArrays", "Sockets", "SparseArrays", "Statistics", "Test", "UUIDs", "Unicode"] +git-tree-sha1 = "4866e381721b30fac8dda4c8cb1d9db45c8d2994" +uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" +version = "3.37.0" + +[[CompilerSupportLibraries_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" +version = "1.0.2+0" + +[[CompositeTypes]] +git-tree-sha1 = "d5b014b216dc891e81fea299638e4c10c657b582" +uuid = "b152e2b5-7a66-4b01-a709-34e65c35f657" +version = "0.1.2" + +[[ConstructionBase]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "f74e9d5388b8620b4cee35d4c5a618dd4dc547f4" +uuid = "187b0558-2788-49d3-abe0-74a17ed4e7c9" +version = "1.3.0" + +[[Contour]] +deps = ["StaticArrays"] +git-tree-sha1 = "9f02045d934dc030edad45944ea80dbd1f0ebea7" +uuid = "d38c429a-6771-53c6-b99e-75d170b6e991" +version = "0.5.7" + +[[DataAPI]] +git-tree-sha1 = "bec2532f8adb82005476c141ec23e921fc20971b" +uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a" +version = "1.8.0" + +[[DataStructures]] +deps = ["Compat", "InteractiveUtils", "OrderedCollections"] +git-tree-sha1 = "7d9d316f04214f7efdbb6398d545446e246eff02" +uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" +version = "0.18.10" + +[[DataValueInterfaces]] +git-tree-sha1 = "bfc1187b79289637fa0ef6d4436ebdfe6905cbd6" +uuid = "e2d170a0-9d28-54be-80f0-106bbe20a464" +version = "1.0.0" + +[[Dates]] +deps = ["Printf"] +uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" + +[[DelimitedFiles]] +deps = ["Mmap"] +git-tree-sha1 = "9e2f36d3c96a820c678f2f1f1782582fcf685bae" +uuid = "8bb1440f-4735-579b-a4ab-409b98df4dab" +version = "1.9.1" + +[[DiffResults]] +deps = ["StaticArrays"] +git-tree-sha1 = "c18e98cba888c6c25d1c3b048e4b3380ca956805" +uuid = "163ba53b-c6d8-5494-b064-1a9d43ac40c5" +version = "1.0.3" + +[[DiffRules]] +deps = ["NaNMath", "Random", "SpecialFunctions"] +git-tree-sha1 = "7220bc21c33e990c14f4a9a319b1d242ebc5b269" +uuid = "b552c78f-8df3-52c6-915a-8e097449b14b" +version = "1.3.1" + +[[Distributed]] +deps = ["Random", "Serialization", "Sockets"] +uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" + +[[Distributions]] +deps = ["ChainRulesCore", "FillArrays", "LinearAlgebra", "PDMats", "Printf", "QuadGK", "Random", "SparseArrays", "SpecialFunctions", "Statistics", "StatsBase", "StatsFuns"] +git-tree-sha1 = "f4efaa4b5157e0cdb8283ae0b5428bc9208436ed" +uuid = "31c24e10-a181-5473-b8eb-7969acd0382f" +version = "0.25.16" + +[[DocStringExtensions]] +deps = ["LibGit2"] +git-tree-sha1 = "a32185f5428d3986f47c2ab78b1f216d5e6cc96f" +uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" +version = "0.8.5" + +[[DomainSets]] +deps = ["CompositeTypes", "IntervalSets", "LinearAlgebra", "StaticArrays", "Statistics"] +git-tree-sha1 = "627844a59d3970db8082b778e53f86741d17aaad" +uuid = "5b8099bc-c8ec-5219-889f-1d9e522a28bf" +version = "0.5.7" + +[[Downloads]] +deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] +uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" +version = "1.6.0" + +[[DynamicPolynomials]] +deps = ["DataStructures", "Future", "LinearAlgebra", "MultivariatePolynomials", "MutableArithmetics", "Pkg", "Reexport", "Test"] +git-tree-sha1 = "05b68e727a192783be0b34bd8fee8f678505c0bf" +uuid = "7c1d4256-1411-5781-91ec-d7bc3513ac07" +version = "0.3.20" + +[[EarCut_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "3f3a2501fa7236e9b911e0f7a588c657e822bb6d" +uuid = "5ae413db-bbd1-5e63-b57d-d24a61df00f5" +version = "2.2.3+0" + +[[EllipsisNotation]] +deps = ["ArrayInterface"] +git-tree-sha1 = "8041575f021cba5a099a456b4163c9a08b566a02" +uuid = "da5c29d0-fa7d-589e-88eb-ea29b0a81949" +version = "1.1.0" + +[[Expat_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "b3bfd02e98aedfa5cf885665493c5598c350cd2f" +uuid = "2e619515-83b5-522b-bb60-26c02a35a201" +version = "2.2.10+0" + +[[ExprTools]] +git-tree-sha1 = "b7e3d17636b348f005f11040025ae8c6f645fe92" +uuid = "e2ba6199-217a-4e67-a87a-7c52f15ade04" +version = "0.1.6" + +[[FFMPEG]] +deps = ["FFMPEG_jll"] +git-tree-sha1 = "b57e3acbe22f8484b4b5ff66a7499717fe1a9cc8" +uuid = "c87230d0-a227-11e9-1b43-d7ebe4e7570a" +version = "0.4.1" + +[[FFMPEG_jll]] +deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "JLLWrappers", "LAME_jll", "Libdl", "Ogg_jll", "OpenSSL_jll", "Opus_jll", "Pkg", "Zlib_jll", "libass_jll", "libfdk_aac_jll", "libvorbis_jll", "x264_jll", "x265_jll"] +git-tree-sha1 = "d8a578692e3077ac998b50c0217dfd67f21d1e5f" +uuid = "b22a6f82-2f65-5046-a5b2-351ab43fb4e5" +version = "4.4.0+0" + +[[FileWatching]] +uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" + +[[FillArrays]] +deps = ["LinearAlgebra", "Random", "SparseArrays", "Statistics"] +git-tree-sha1 = "caf289224e622f518c9dbfe832cdafa17d7c80a6" +uuid = "1a297f60-69ca-5386-bcde-b61e274b549b" +version = "0.12.4" + +[[FixedPointNumbers]] +deps = ["Statistics"] +git-tree-sha1 = "335bfdceacc84c5cdf16aadc768aa5ddfc5383cc" +uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" +version = "0.8.4" + +[[Fontconfig_jll]] +deps = ["Artifacts", "Bzip2_jll", "Expat_jll", "FreeType2_jll", "JLLWrappers", "Libdl", "Libuuid_jll", "Pkg", "Zlib_jll"] +git-tree-sha1 = "21efd19106a55620a188615da6d3d06cd7f6ee03" +uuid = "a3f928ae-7b40-5064-980b-68af3947d34b" +version = "2.13.93+0" + +[[Formatting]] +deps = ["Printf"] +git-tree-sha1 = "8339d61043228fdd3eb658d86c926cb282ae72a8" +uuid = "59287772-0a20-5a39-b81b-1366585eb4c0" +version = "0.4.2" + +[[ForwardDiff]] +deps = ["CommonSubexpressions", "DiffResults", "DiffRules", "LinearAlgebra", "NaNMath", "Printf", "Random", "SpecialFunctions", "StaticArrays"] +git-tree-sha1 = "b5e930ac60b613ef3406da6d4f42c35d8dc51419" +uuid = "f6369f11-7733-5829-9624-2563aa707210" +version = "0.10.19" + +[[FreeType2_jll]] +deps = ["Artifacts", "Bzip2_jll", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] +git-tree-sha1 = "87eb71354d8ec1a96d4a7636bd57a7347dde3ef9" +uuid = "d7e528f0-a631-5988-bf34-fe36492bcfd7" +version = "2.10.4+0" + +[[FriBidi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "aa31987c2ba8704e23c6c8ba8a4f769d5d7e4f91" +uuid = "559328eb-81f9-559d-9380-de523a88c83c" +version = "1.0.10+0" + +[[Future]] +deps = ["Random"] +uuid = "9fa8497b-333b-5362-9e8d-4d0656e87820" + +[[GLFW_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libglvnd_jll", "Pkg", "Xorg_libXcursor_jll", "Xorg_libXi_jll", "Xorg_libXinerama_jll", "Xorg_libXrandr_jll"] +git-tree-sha1 = "0c603255764a1fa0b61752d2bec14cfbd18f7fe8" +uuid = "0656b61e-2033-5cc2-a64a-77c0f6c09b89" +version = "3.3.5+1" + +[[GR]] +deps = ["Base64", "DelimitedFiles", "GR_jll", "HTTP", "JSON", "Libdl", "LinearAlgebra", "Pkg", "Printf", "Random", "Serialization", "Sockets", "Test", "UUIDs"] +git-tree-sha1 = "c2178cfbc0a5a552e16d097fae508f2024de61a3" +uuid = "28b8d3ca-fb5f-59d9-8090-bfdbd6d07a71" +version = "0.59.0" + +[[GR_jll]] +deps = ["Artifacts", "Bzip2_jll", "Cairo_jll", "FFMPEG_jll", "Fontconfig_jll", "GLFW_jll", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Libtiff_jll", "Pixman_jll", "Pkg", "Qt5Base_jll", "Zlib_jll", "libpng_jll"] +git-tree-sha1 = "ef49a187604f865f4708c90e3f431890724e9012" +uuid = "d2c73de3-f751-5644-a686-071e5b155ba9" +version = "0.59.0+0" + +[[GeometryBasics]] +deps = ["EarCut_jll", "IterTools", "LinearAlgebra", "StaticArrays", "StructArrays", "Tables"] +git-tree-sha1 = "58bcdf5ebc057b085e58d95c138725628dd7453c" +uuid = "5c1252a2-5f33-56bf-86c9-59e7332b4326" +version = "0.4.1" + +[[Gettext_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Libiconv_jll", "Pkg", "XML2_jll"] +git-tree-sha1 = "9b02998aba7bf074d14de89f9d37ca24a1a0b046" +uuid = "78b55507-aeef-58d4-861c-77aaff3498b1" +version = "0.21.0+0" + +[[Glib_jll]] +deps = ["Artifacts", "Gettext_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Libiconv_jll", "Libmount_jll", "PCRE_jll", "Pkg", "Zlib_jll"] +git-tree-sha1 = "a32d672ac2c967f3deb8a81d828afc739c838a06" +uuid = "7746bdde-850d-59dc-9ae8-88ece973131d" +version = "2.68.3+2" + +[[Graphite2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "344bf40dcab1073aca04aa0df4fb092f920e4011" +uuid = "3b182d85-2403-5c21-9c21-1e1f0cc25472" +version = "1.3.14+0" + +[[Grisu]] +git-tree-sha1 = "53bb909d1151e57e2484c3d1b53e19552b887fb2" +uuid = "42e2da0e-8278-4e71-bc24-59509adca0fe" +version = "1.0.2" + +[[HTTP]] +deps = ["Base64", "Dates", "IniFile", "Logging", "MbedTLS", "NetworkOptions", "Sockets", "URIs"] +git-tree-sha1 = "60ed5f1643927479f845b0135bb369b031b541fa" +uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3" +version = "0.9.14" + +[[HarfBuzz_jll]] +deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "Graphite2_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Pkg"] +git-tree-sha1 = "129acf094d168394e80ee1dc4bc06ec835e510a3" +uuid = "2e76f6c2-a576-52d4-95c1-20adfe4de566" +version = "2.8.1+1" + +[[IRTools]] +deps = ["InteractiveUtils", "MacroTools", "Test"] +git-tree-sha1 = "95215cd0076a150ef46ff7928892bc341864c73c" +uuid = "7869d1d1-7146-5819-86e3-90919afe41df" +version = "0.4.3" + +[[IfElse]] +git-tree-sha1 = "28e837ff3e7a6c3cdb252ce49fb412c8eb3caeef" +uuid = "615f187c-cbe4-4ef1-ba3b-2fcf58d6d173" +version = "0.1.0" + +[[IniFile]] +deps = ["Test"] +git-tree-sha1 = "098e4d2c533924c921f9f9847274f2ad89e018b8" +uuid = "83e8ac13-25f8-5344-8a64-a9f2b223428f" +version = "0.5.0" + +[[InteractiveUtils]] +deps = ["Markdown"] +uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" + +[[IntervalSets]] +deps = ["Dates", "EllipsisNotation", "Statistics"] +git-tree-sha1 = "3cc368af3f110a767ac786560045dceddfc16758" +uuid = "8197267c-284f-5f27-9208-e0e47529a953" +version = "0.5.3" + +[[IrrationalConstants]] +git-tree-sha1 = "f76424439413893a832026ca355fe273e93bce94" +uuid = "92d709cd-6900-40b7-9082-c6be49f344b6" +version = "0.1.0" + +[[IterTools]] +git-tree-sha1 = "05110a2ab1fc5f932622ffea2a003221f4782c18" +uuid = "c8e1da08-722c-5040-9ed9-7db0dc04731e" +version = "1.3.0" + +[[IteratorInterfaceExtensions]] +git-tree-sha1 = "a3f24677c21f5bbe9d2a714f95dcd58337fb2856" +uuid = "82899510-4779-5014-852e-03e436cf321d" +version = "1.0.0" + +[[JLLWrappers]] +deps = ["Preferences"] +git-tree-sha1 = "642a199af8b68253517b80bd3bfd17eb4e84df6e" +uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" +version = "1.3.0" + +[[JSON]] +deps = ["Dates", "Mmap", "Parsers", "Unicode"] +git-tree-sha1 = "8076680b162ada2a031f707ac7b4953e30667a37" +uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" +version = "0.21.2" + +[[JpegTurbo_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "d735490ac75c5cb9f1b00d8b5509c11984dc6943" +uuid = "aacddb02-875f-59d6-b918-886e6ef4fbf8" +version = "2.1.0+0" + +[[LAME_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "f6250b16881adf048549549fba48b1161acdac8c" +uuid = "c1c5ebd0-6772-5130-a774-d5fcae4a789d" +version = "3.100.1+0" + +[[LERC_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "bf36f528eec6634efc60d7ec062008f171071434" +uuid = "88015f11-f218-50d7-93a8-a6af411a945d" +version = "3.0.0+1" + +[[LZO_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "e5b909bcf985c5e2605737d2ce278ed791b89be6" +uuid = "dd4b983a-f0e5-5f8d-a1b7-129d4a5fb1ac" +version = "2.10.1+0" + +[[LaTeXStrings]] +git-tree-sha1 = "c7f1c695e06c01b95a67f0cd1d34994f3e7db104" +uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" +version = "1.2.1" + +[[LabelledArrays]] +deps = ["ArrayInterface", "LinearAlgebra", "MacroTools", "StaticArrays"] +git-tree-sha1 = "bdde43e002847c34c206735b1cf860bc3abd35e7" +uuid = "2ee39098-c373-598a-b85f-a56591580800" +version = "1.6.4" + +[[Latexify]] +deps = ["Formatting", "InteractiveUtils", "LaTeXStrings", "MacroTools", "Markdown", "Printf", "Requires"] +git-tree-sha1 = "a4b12a1bd2ebade87891ab7e36fdbce582301a92" +uuid = "23fbe1c1-3f47-55db-b15f-69d7ec21a316" +version = "0.15.6" + +[[LibCURL]] +deps = ["LibCURL_jll", "MozillaCACerts_jll"] +uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" +version = "0.6.3" + +[[LibCURL_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] +uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" +version = "7.84.0+0" + +[[LibGit2]] +deps = ["Base64", "NetworkOptions", "Printf", "SHA"] +uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" + +[[LibSSH2_jll]] +deps = ["Artifacts", "Libdl", "MbedTLS_jll"] +uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" +version = "1.10.2+0" + +[[Libdl]] +uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" + +[[Libffi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "0b4a5d71f3e5200a7dff793393e09dfc2d874290" +uuid = "e9f186c6-92d2-5b65-8a66-fee21dc1b490" +version = "3.2.2+1" + +[[Libgcrypt_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgpg_error_jll", "Pkg"] +git-tree-sha1 = "64613c82a59c120435c067c2b809fc61cf5166ae" +uuid = "d4300ac3-e22c-5743-9152-c294e39db1e4" +version = "1.8.7+0" + +[[Libglvnd_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll", "Xorg_libXext_jll"] +git-tree-sha1 = "7739f837d6447403596a75d19ed01fd08d6f56bf" +uuid = "7e76a0d4-f3c7-5321-8279-8d96eeed0f29" +version = "1.3.0+3" + +[[Libgpg_error_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "c333716e46366857753e273ce6a69ee0945a6db9" +uuid = "7add5ba3-2f88-524e-9cd5-f83b8a55f7b8" +version = "1.42.0+0" + +[[Libiconv_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "42b62845d70a619f063a7da093d995ec8e15e778" +uuid = "94ce4f54-9a6c-5748-9c1c-f9c7231a4531" +version = "1.16.1+1" + +[[Libmount_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "9c30530bf0effd46e15e0fdcf2b8636e78cbbd73" +uuid = "4b2f31a3-9ecc-558c-b454-b3730dcb73e9" +version = "2.35.0+0" + +[[Libtiff_jll]] +deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "LERC_jll", "Libdl", "Pkg", "Zlib_jll", "Zstd_jll"] +git-tree-sha1 = "340e257aada13f95f98ee352d316c3bed37c8ab9" +uuid = "89763e89-9b03-5906-acba-b20f662cd828" +version = "4.3.0+0" + +[[Libuuid_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "7f3efec06033682db852f8b3bc3c1d2b0a0ab066" +uuid = "38a345b3-de98-5d2b-a5d3-14cd9215e700" +version = "2.36.0+0" + +[[LinearAlgebra]] +deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"] +uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + +[[LogExpFunctions]] +deps = ["ChainRulesCore", "DocStringExtensions", "IrrationalConstants", "LinearAlgebra"] +git-tree-sha1 = "34dc30f868e368f8a17b728a1238f3fcda43931a" +uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688" +version = "0.3.3" + +[[Logging]] +uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" + +[[MacroTools]] +deps = ["Markdown", "Random"] +git-tree-sha1 = "5a5bc6bf062f0f95e62d0fe0a2d99699fed82dd9" +uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" +version = "0.5.8" + +[[Markdown]] +deps = ["Base64"] +uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" + +[[MbedTLS]] +deps = ["Dates", "MbedTLS_jll", "Random", "Sockets"] +git-tree-sha1 = "1c38e51c3d08ef2278062ebceade0e46cefc96fe" +uuid = "739be429-bea8-5141-9913-cc70e7f3736d" +version = "1.0.3" + +[[MbedTLS_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" +version = "2.28.2+0" + +[[Measures]] +git-tree-sha1 = "e498ddeee6f9fdb4551ce855a46f54dbd900245f" +uuid = "442fdcdd-2543-5da2-b0f3-8c86c306513e" +version = "0.3.1" + +[[Missings]] +deps = ["DataAPI"] +git-tree-sha1 = "bf210ce90b6c9eed32d25dbcae1ebc565df2687f" +uuid = "e1d29d7a-bbdc-5cf2-9ac0-f12de2c33e28" +version = "1.0.2" + +[[Mmap]] +uuid = "a63ad114-7e13-5084-954f-fe012c677804" + +[[MozillaCACerts_jll]] +uuid = "14a3606d-f60d-562e-9121-12d972cd8159" +version = "2022.10.11" + +[[MultivariatePolynomials]] +deps = ["DataStructures", "LinearAlgebra", "MutableArithmetics"] +git-tree-sha1 = "45c9940cec79dedcdccc73cc6dd09ea8b8ab142c" +uuid = "102ac46a-7ee4-5c85-9060-abc95bfdeaa3" +version = "0.3.18" + +[[MutableArithmetics]] +deps = ["LinearAlgebra", "SparseArrays", "Test"] +git-tree-sha1 = "3927848ccebcc165952dc0d9ac9aa274a87bfe01" +uuid = "d8a4904e-b15c-11e9-3269-09a3773c0cb0" +version = "0.2.20" + +[[NaNMath]] +git-tree-sha1 = "bfe47e760d60b82b66b61d2d44128b62e3a369fb" +uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" +version = "0.3.5" + +[[NetworkOptions]] +uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" +version = "1.2.0" + +[[Ogg_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "7937eda4681660b4d6aeeecc2f7e1c81c8ee4e2f" +uuid = "e7412a2a-1a6e-54c0-be00-318e2571c051" +version = "1.3.5+0" + +[[OpenBLAS_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] +uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" +version = "0.3.21+4" + +[[OpenSSL_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "15003dcb7d8db3c6c857fda14891a539a8f2705a" +uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95" +version = "1.1.10+0" + +[[OpenSpecFun_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "13652491f6856acfd2db29360e1bbcd4565d04f1" +uuid = "efe28fd5-8261-553b-a9e1-b2916fc3738e" +version = "0.5.5+0" + +[[Opus_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "51a08fb14ec28da2ec7a927c4337e4332c2a4720" +uuid = "91d4177d-7536-5919-b921-800302f37372" +version = "1.3.2+0" + +[[OrderedCollections]] +git-tree-sha1 = "85f8e6578bf1f9ee0d11e7bb1b1456435479d47c" +uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" +version = "1.4.1" + +[[PCRE_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "b2a7af664e098055a7529ad1a900ded962bca488" +uuid = "2f80f16e-611a-54ab-bc61-aa92de5b98fc" +version = "8.44.0+0" + +[[PDMats]] +deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"] +git-tree-sha1 = "4dd403333bcf0909341cfe57ec115152f937d7d8" +uuid = "90014a1f-27ba-587c-ab20-58faa44d9150" +version = "0.11.1" + +[[Parsers]] +deps = ["Dates"] +git-tree-sha1 = "438d35d2d95ae2c5e8780b330592b6de8494e779" +uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" +version = "2.0.3" + +[[Pixman_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "b4f5d02549a10e20780a24fce72bea96b6329e29" +uuid = "30392449-352a-5448-841d-b1acce4e97dc" +version = "0.40.1+0" + +[[Pkg]] +deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] +uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" +version = "1.9.0" + +[[PlotThemes]] +deps = ["PlotUtils", "Requires", "Statistics"] +git-tree-sha1 = "a3a964ce9dc7898193536002a6dd892b1b5a6f1d" +uuid = "ccf2f8ad-2431-5c83-bf29-c5338b663b6a" +version = "2.0.1" + +[[PlotUtils]] +deps = ["ColorSchemes", "Colors", "Dates", "Printf", "Random", "Reexport", "Statistics"] +git-tree-sha1 = "2537ed3c0ed5e03896927187f5f2ee6a4ab342db" +uuid = "995b91a9-d308-5afd-9ec6-746e21dbc043" +version = "1.0.14" + +[[Plots]] +deps = ["Base64", "Contour", "Dates", "Downloads", "FFMPEG", "FixedPointNumbers", "GR", "GeometryBasics", "JSON", "Latexify", "LinearAlgebra", "Measures", "NaNMath", "PlotThemes", "PlotUtils", "Printf", "REPL", "Random", "RecipesBase", "RecipesPipeline", "Reexport", "Requires", "Scratch", "Showoff", "SparseArrays", "Statistics", "StatsBase", "UUIDs"] +git-tree-sha1 = "4c2637482176b1c2fb99af4d83cb2ff0328fc33c" +uuid = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" +version = "1.22.1" + +[[PlutoUI]] +deps = ["Base64", "Dates", "InteractiveUtils", "JSON", "Logging", "Markdown", "Random", "Reexport", "Suppressor"] +git-tree-sha1 = "44e225d5837e2a2345e69a1d1e01ac2443ff9fcb" +uuid = "7f904dfe-b85e-4ff6-b463-dae2292396a8" +version = "0.7.9" + +[[Preferences]] +deps = ["TOML"] +git-tree-sha1 = "00cfd92944ca9c760982747e9a1d0d5d86ab1e5a" +uuid = "21216c6a-2e73-6563-6e65-726566657250" +version = "1.2.2" + +[[Printf]] +deps = ["Unicode"] +uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" + +[[Qt5Base_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Fontconfig_jll", "Glib_jll", "JLLWrappers", "Libdl", "Libglvnd_jll", "OpenSSL_jll", "Pkg", "Xorg_libXext_jll", "Xorg_libxcb_jll", "Xorg_xcb_util_image_jll", "Xorg_xcb_util_keysyms_jll", "Xorg_xcb_util_renderutil_jll", "Xorg_xcb_util_wm_jll", "Zlib_jll", "xkbcommon_jll"] +git-tree-sha1 = "ad368663a5e20dbb8d6dc2fddeefe4dae0781ae8" +uuid = "ea2cea3b-5b76-57ae-a6ef-0a8af62496e1" +version = "5.15.3+0" + +[[QuadGK]] +deps = ["DataStructures", "LinearAlgebra"] +git-tree-sha1 = "78aadffb3efd2155af139781b8a8df1ef279ea39" +uuid = "1fd47b50-473d-5c70-9696-f719f8f3bcdc" +version = "2.4.2" + +[[REPL]] +deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] +uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" + +[[Random]] +deps = ["SHA", "Serialization"] +uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" + +[[RecipesBase]] +git-tree-sha1 = "44a75aa7a527910ee3d1751d1f0e4148698add9e" +uuid = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" +version = "1.1.2" + +[[RecipesPipeline]] +deps = ["Dates", "NaNMath", "PlotUtils", "RecipesBase"] +git-tree-sha1 = "7ad0dfa8d03b7bcf8c597f59f5292801730c55b8" +uuid = "01d81517-befc-4cb6-b9ec-a95719d0359c" +version = "0.4.1" + +[[RecursiveArrayTools]] +deps = ["ArrayInterface", "ChainRulesCore", "DocStringExtensions", "LinearAlgebra", "RecipesBase", "Requires", "StaticArrays", "Statistics", "ZygoteRules"] +git-tree-sha1 = "00bede2eb099dcc1ddc3f9ec02180c326b420ee2" +uuid = "731186ca-8d62-57ce-b412-fbd966d074cd" +version = "2.17.2" + +[[Reexport]] +git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" +uuid = "189a3867-3050-52da-a836-e630ba90ab69" +version = "1.2.2" + +[[Requires]] +deps = ["UUIDs"] +git-tree-sha1 = "4036a3bd08ac7e968e27c203d45f5fff15020621" +uuid = "ae029012-a4dd-5104-9daa-d747884805df" +version = "1.1.3" + +[[Rmath]] +deps = ["Random", "Rmath_jll"] +git-tree-sha1 = "bf3188feca147ce108c76ad82c2792c57abe7b1f" +uuid = "79098fc4-a85e-5d69-aa6a-4863f24498fa" +version = "0.7.0" + +[[Rmath_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "68db32dff12bb6127bac73c209881191bf0efbb7" +uuid = "f50d1b31-88e8-58de-be2c-1cc44531875f" +version = "0.3.0+0" + +[[RuntimeGeneratedFunctions]] +deps = ["ExprTools", "SHA", "Serialization"] +git-tree-sha1 = "cdc1e4278e91a6ad530770ebb327f9ed83cf10c4" +uuid = "7e49a35a-f44a-4d26-94aa-eba1b4ca6b47" +version = "0.5.3" + +[[SHA]] +uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" +version = "0.7.0" + +[[SciMLBase]] +deps = ["ArrayInterface", "CommonSolve", "ConstructionBase", "Distributed", "DocStringExtensions", "IteratorInterfaceExtensions", "LinearAlgebra", "Logging", "RecipesBase", "RecursiveArrayTools", "StaticArrays", "Statistics", "Tables", "TreeViews"] +git-tree-sha1 = "ff686e0c79dbe91767f4c1e44257621a5455b1c6" +uuid = "0bca4576-84f4-4d90-8ffe-ffa030f20462" +version = "1.18.7" + +[[Scratch]] +deps = ["Dates"] +git-tree-sha1 = "0b4b7f1393cff97c33891da2a0bf69c6ed241fda" +uuid = "6c6a2e73-6563-6170-7368-637461726353" +version = "1.1.0" + +[[Serialization]] +uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" + +[[Setfield]] +deps = ["ConstructionBase", "Future", "MacroTools", "Requires"] +git-tree-sha1 = "fca29e68c5062722b5b4435594c3d1ba557072a3" +uuid = "efcf1570-3423-57d1-acb7-fd33fddbac46" +version = "0.7.1" + +[[SharedArrays]] +deps = ["Distributed", "Mmap", "Random", "Serialization"] +uuid = "1a1011a3-84de-559e-8e89-a11a2f7dc383" + +[[Showoff]] +deps = ["Dates", "Grisu"] +git-tree-sha1 = "91eddf657aca81df9ae6ceb20b959ae5653ad1de" +uuid = "992d4aef-0814-514b-bc4d-f2e9a6c4116f" +version = "1.0.3" + +[[Sockets]] +uuid = "6462fe0b-24de-5631-8697-dd941f90decc" + +[[SortingAlgorithms]] +deps = ["DataStructures"] +git-tree-sha1 = "b3363d7460f7d098ca0912c69b082f75625d7508" +uuid = "a2af1166-a08f-5f64-846c-94a0d3cef48c" +version = "1.0.1" + +[[SparseArrays]] +deps = ["Libdl", "LinearAlgebra", "Random", "Serialization", "SuiteSparse_jll"] +uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + +[[SpecialFunctions]] +deps = ["ChainRulesCore", "LogExpFunctions", "OpenSpecFun_jll"] +git-tree-sha1 = "a322a9493e49c5f3a10b50df3aedaf1cdb3244b7" +uuid = "276daf66-3868-5448-9aa4-cd146d93841b" +version = "1.6.1" + +[[Static]] +deps = ["IfElse"] +git-tree-sha1 = "a8f30abc7c64a39d389680b74e749cf33f872a70" +uuid = "aedffcd0-7271-4cad-89d0-dc628f76c6d3" +version = "0.3.3" + +[[StaticArrays]] +deps = ["LinearAlgebra", "Random", "Statistics"] +git-tree-sha1 = "3240808c6d463ac46f1c1cd7638375cd22abbccb" +uuid = "90137ffa-7385-5640-81b9-e52037218182" +version = "1.2.12" + +[[Statistics]] +deps = ["LinearAlgebra", "SparseArrays"] +uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" +version = "1.9.0" + +[[StatsAPI]] +git-tree-sha1 = "1958272568dc176a1d881acb797beb909c785510" +uuid = "82ae8749-77ed-4fe6-ae5f-f523153014b0" +version = "1.0.0" + +[[StatsBase]] +deps = ["DataAPI", "DataStructures", "LinearAlgebra", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"] +git-tree-sha1 = "8cbbc098554648c84f79a463c9ff0fd277144b6c" +uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" +version = "0.33.10" + +[[StatsFuns]] +deps = ["ChainRulesCore", "IrrationalConstants", "LogExpFunctions", "Reexport", "Rmath", "SpecialFunctions"] +git-tree-sha1 = "46d7ccc7104860c38b11966dd1f72ff042f382e4" +uuid = "4c63d2b9-4356-54db-8cca-17b64c39e42c" +version = "0.9.10" + +[[StructArrays]] +deps = ["Adapt", "DataAPI", "StaticArrays", "Tables"] +git-tree-sha1 = "2ce41e0d042c60ecd131e9fb7154a3bfadbf50d3" +uuid = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" +version = "0.6.3" + +[[SuiteSparse]] +deps = ["Libdl", "LinearAlgebra", "Serialization", "SparseArrays"] +uuid = "4607b0f0-06f3-5cda-b6b1-a6196a1729e9" + +[[SuiteSparse_jll]] +deps = ["Artifacts", "Libdl", "Pkg", "libblastrampoline_jll"] +uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c" +version = "5.10.1+6" + +[[Suppressor]] +git-tree-sha1 = "a819d77f31f83e5792a76081eee1ea6342ab8787" +uuid = "fd094767-a336-5f1f-9728-57cf17d0bbfb" +version = "0.2.0" + +[[SymbolicUtils]] +deps = ["AbstractTrees", "Bijections", "ChainRulesCore", "Combinatorics", "ConstructionBase", "DataStructures", "DocStringExtensions", "DynamicPolynomials", "IfElse", "LabelledArrays", "LinearAlgebra", "MultivariatePolynomials", "NaNMath", "Setfield", "SparseArrays", "SpecialFunctions", "StaticArrays", "TermInterface", "TimerOutputs"] +git-tree-sha1 = "b680da4a404767b41044b660665b3d7f56016cd5" +uuid = "d1185830-fcd6-423d-90d6-eec64667417b" +version = "0.15.5" + +[[Symbolics]] +deps = ["ConstructionBase", "DiffRules", "Distributions", "DocStringExtensions", "DomainSets", "IfElse", "Latexify", "Libdl", "LinearAlgebra", "MacroTools", "NaNMath", "RecipesBase", "Reexport", "Requires", "RuntimeGeneratedFunctions", "SciMLBase", "Setfield", "SparseArrays", "SpecialFunctions", "StaticArrays", "SymbolicUtils", "TreeViews"] +git-tree-sha1 = "0e4d48d9c416563e3b067759e3cd72066d4f491b" +uuid = "0c5d862f-8b57-4792-8d23-62f2024744c7" +version = "3.3.1" + +[[TOML]] +deps = ["Dates"] +uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" +version = "1.0.3" + +[[TableTraits]] +deps = ["IteratorInterfaceExtensions"] +git-tree-sha1 = "c06b2f539df1c6efa794486abfb6ed2022561a39" +uuid = "3783bdb8-4a98-5b6b-af9a-565f29a5fe9c" +version = "1.0.1" + +[[Tables]] +deps = ["DataAPI", "DataValueInterfaces", "IteratorInterfaceExtensions", "LinearAlgebra", "TableTraits", "Test"] +git-tree-sha1 = "1162ce4a6c4b7e31e0e6b14486a6986951c73be9" +uuid = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" +version = "1.5.2" + +[[Tar]] +deps = ["ArgTools", "SHA"] +uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" +version = "1.10.0" + +[[TermInterface]] +git-tree-sha1 = "02a620218eaaa1c1914d228d0e75da122224a502" +uuid = "8ea1fca8-c5ef-4a55-8b96-4e9afe9c9a3c" +version = "0.1.8" + +[[Test]] +deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] +uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[[TimerOutputs]] +deps = ["ExprTools", "Printf"] +git-tree-sha1 = "209a8326c4f955e2442c07b56029e88bb48299c7" +uuid = "a759f4b9-e2f1-59dc-863e-4aeb61b1ea8f" +version = "0.5.12" + +[[TreeViews]] +deps = ["Test"] +git-tree-sha1 = "8d0d7a3fe2f30d6a7f833a5f19f7c7a5b396eae6" +uuid = "a2a6695c-b41b-5b7d-aed9-dbfdeacea5d7" +version = "0.3.0" + +[[URIs]] +git-tree-sha1 = "97bbe755a53fe859669cd907f2d96aee8d2c1355" +uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" +version = "1.3.0" + +[[UUIDs]] +deps = ["Random", "SHA"] +uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" + +[[Unicode]] +uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" + +[[Wayland_jll]] +deps = ["Artifacts", "Expat_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Pkg", "XML2_jll"] +git-tree-sha1 = "3e61f0b86f90dacb0bc0e73a0c5a83f6a8636e23" +uuid = "a2964d1f-97da-50d4-b82a-358c7fce9d89" +version = "1.19.0+0" + +[[Wayland_protocols_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Wayland_jll"] +git-tree-sha1 = "2839f1c1296940218e35df0bbb220f2a79686670" +uuid = "2381bf8a-dfd0-557d-9999-79630e7b1b91" +version = "1.18.0+4" + +[[XML2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Pkg", "Zlib_jll"] +git-tree-sha1 = "1acf5bdf07aa0907e0a37d3718bb88d4b687b74a" +uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a" +version = "2.9.12+0" + +[[XSLT_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgcrypt_jll", "Libgpg_error_jll", "Libiconv_jll", "Pkg", "XML2_jll", "Zlib_jll"] +git-tree-sha1 = "91844873c4085240b95e795f692c4cec4d805f8a" +uuid = "aed1982a-8fda-507f-9586-7b0439959a61" +version = "1.1.34+0" + +[[Xorg_libX11_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libxcb_jll", "Xorg_xtrans_jll"] +git-tree-sha1 = "5be649d550f3f4b95308bf0183b82e2582876527" +uuid = "4f6342f7-b3d2-589e-9d20-edeb45f2b2bc" +version = "1.6.9+4" + +[[Xorg_libXau_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "4e490d5c960c314f33885790ed410ff3a94ce67e" +uuid = "0c0b7dd1-d40b-584c-a123-a41640f87eec" +version = "1.0.9+4" + +[[Xorg_libXcursor_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXfixes_jll", "Xorg_libXrender_jll"] +git-tree-sha1 = "12e0eb3bc634fa2080c1c37fccf56f7c22989afd" +uuid = "935fb764-8cf2-53bf-bb30-45bb1f8bf724" +version = "1.2.0+4" + +[[Xorg_libXdmcp_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "4fe47bd2247248125c428978740e18a681372dd4" +uuid = "a3789734-cfe1-5b06-b2d0-1dd0d9d62d05" +version = "1.1.3+4" + +[[Xorg_libXext_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll"] +git-tree-sha1 = "b7c0aa8c376b31e4852b360222848637f481f8c3" +uuid = "1082639a-0dae-5f34-9b06-72781eeb8cb3" +version = "1.3.4+4" + +[[Xorg_libXfixes_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll"] +git-tree-sha1 = "0e0dc7431e7a0587559f9294aeec269471c991a4" +uuid = "d091e8ba-531a-589c-9de9-94069b037ed8" +version = "5.0.3+4" + +[[Xorg_libXi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXext_jll", "Xorg_libXfixes_jll"] +git-tree-sha1 = "89b52bc2160aadc84d707093930ef0bffa641246" +uuid = "a51aa0fd-4e3c-5386-b890-e753decda492" +version = "1.7.10+4" + +[[Xorg_libXinerama_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXext_jll"] +git-tree-sha1 = "26be8b1c342929259317d8b9f7b53bf2bb73b123" +uuid = "d1454406-59df-5ea1-beac-c340f2130bc3" +version = "1.1.4+4" + +[[Xorg_libXrandr_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXext_jll", "Xorg_libXrender_jll"] +git-tree-sha1 = "34cea83cb726fb58f325887bf0612c6b3fb17631" +uuid = "ec84b674-ba8e-5d96-8ba1-2a689ba10484" +version = "1.5.2+4" + +[[Xorg_libXrender_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll"] +git-tree-sha1 = "19560f30fd49f4d4efbe7002a1037f8c43d43b96" +uuid = "ea2f1a96-1ddc-540d-b46f-429655e07cfa" +version = "0.9.10+4" + +[[Xorg_libpthread_stubs_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "6783737e45d3c59a4a4c4091f5f88cdcf0908cbb" +uuid = "14d82f49-176c-5ed1-bb49-ad3f5cbd8c74" +version = "0.1.0+3" + +[[Xorg_libxcb_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "XSLT_jll", "Xorg_libXau_jll", "Xorg_libXdmcp_jll", "Xorg_libpthread_stubs_jll"] +git-tree-sha1 = "daf17f441228e7a3833846cd048892861cff16d6" +uuid = "c7cfdc94-dc32-55de-ac96-5a1b8d977c5b" +version = "1.13.0+3" + +[[Xorg_libxkbfile_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll"] +git-tree-sha1 = "926af861744212db0eb001d9e40b5d16292080b2" +uuid = "cc61e674-0454-545c-8b26-ed2c68acab7a" +version = "1.1.0+4" + +[[Xorg_xcb_util_image_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] +git-tree-sha1 = "0fab0a40349ba1cba2c1da699243396ff8e94b97" +uuid = "12413925-8142-5f55-bb0e-6d7ca50bb09b" +version = "0.4.0+1" + +[[Xorg_xcb_util_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libxcb_jll"] +git-tree-sha1 = "e7fd7b2881fa2eaa72717420894d3938177862d1" +uuid = "2def613f-5ad1-5310-b15b-b15d46f528f5" +version = "0.4.0+1" + +[[Xorg_xcb_util_keysyms_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] +git-tree-sha1 = "d1151e2c45a544f32441a567d1690e701ec89b00" +uuid = "975044d2-76e6-5fbe-bf08-97ce7c6574c7" +version = "0.4.0+1" + +[[Xorg_xcb_util_renderutil_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] +git-tree-sha1 = "dfd7a8f38d4613b6a575253b3174dd991ca6183e" +uuid = "0d47668e-0667-5a69-a72c-f761630bfb7e" +version = "0.3.9+1" + +[[Xorg_xcb_util_wm_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] +git-tree-sha1 = "e78d10aab01a4a154142c5006ed44fd9e8e31b67" +uuid = "c22f9ab0-d5fe-5066-847c-f4bb1cd4e361" +version = "0.4.1+1" + +[[Xorg_xkbcomp_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libxkbfile_jll"] +git-tree-sha1 = "4bcbf660f6c2e714f87e960a171b119d06ee163b" +uuid = "35661453-b289-5fab-8a00-3d9160c6a3a4" +version = "1.4.2+4" + +[[Xorg_xkeyboard_config_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xkbcomp_jll"] +git-tree-sha1 = "5c8424f8a67c3f2209646d4425f3d415fee5931d" +uuid = "33bec58e-1273-512f-9401-5d533626f822" +version = "2.27.0+4" + +[[Xorg_xtrans_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "79c31e7844f6ecf779705fbc12146eb190b7d845" +uuid = "c5fb5394-a638-5e4d-96e5-b29de1b5cf10" +version = "1.4.0+3" + +[[Zlib_jll]] +deps = ["Libdl"] +uuid = "83775a58-1f1d-513f-b197-d71354ab007a" +version = "1.2.13+0" + +[[Zstd_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "cc4bf3fdde8b7e3e9fa0351bdeedba1cf3b7f6e6" +uuid = "3161d3a3-bdf6-5164-811a-617609db77b4" +version = "1.5.0+0" + +[[Zygote]] +deps = ["AbstractFFTs", "ChainRules", "ChainRulesCore", "DiffRules", "Distributed", "FillArrays", "ForwardDiff", "IRTools", "InteractiveUtils", "LinearAlgebra", "MacroTools", "NaNMath", "Random", "Requires", "SpecialFunctions", "Statistics", "ZygoteRules"] +git-tree-sha1 = "ffbf36ba9cd8476347486a013c93590b910a4855" +uuid = "e88e6eb3-aa80-5325-afca-941959d7151f" +version = "0.6.21" + +[[ZygoteRules]] +deps = ["MacroTools"] +git-tree-sha1 = "9e7a1e8ca60b742e508a315c17eef5211e7fbfd7" +uuid = "700de1a5-db45-46bc-99cf-38207098b444" +version = "0.2.1" + +[[libass_jll]] +deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] +git-tree-sha1 = "5982a94fcba20f02f42ace44b9894ee2b140fe47" +uuid = "0ac62f75-1d6f-5e53-bd7c-93b484bb37c0" +version = "0.15.1+0" + +[[libblastrampoline_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" +version = "5.7.0+0" + +[[libfdk_aac_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "daacc84a041563f965be61859a36e17c4e4fcd55" +uuid = "f638f0a6-7fb0-5443-88ba-1cc74229b280" +version = "2.0.2+0" + +[[libpng_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] +git-tree-sha1 = "94d180a6d2b5e55e447e2d27a29ed04fe79eb30c" +uuid = "b53b4c65-9356-5827-b1ea-8c7a1a84506f" +version = "1.6.38+0" + +[[libvorbis_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Ogg_jll", "Pkg"] +git-tree-sha1 = "c45f4e40e7aafe9d086379e5578947ec8b95a8fb" +uuid = "f27f6e37-5d2b-51aa-960f-b287f2bc3b7a" +version = "1.3.7+0" + +[[nghttp2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" +version = "1.48.0+0" + +[[p7zip_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" +version = "17.4.0+0" + +[[x264_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "4fea590b89e6ec504593146bf8b988b2c00922b2" +uuid = "1270edf5-f2f9-52d2-97e9-ab00b5d0237a" +version = "2021.5.5+0" + +[[x265_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "ee567a171cce03570d77ad3a43e90218e38937a9" +uuid = "dfaa095f-4041-5dcd-9319-2fabd8486b76" +version = "3.5.0+0" + +[[xkbcommon_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Wayland_jll", "Wayland_protocols_jll", "Xorg_libxcb_jll", "Xorg_xkeyboard_config_jll"] +git-tree-sha1 = "ece2350174195bb31de1a63bea3a41ae1aa593b6" +uuid = "d8fb68d0-12a3-5cfd-a85a-d49703b185fd" +version = "0.9.1+5" +""" + +# ╔═║ Cell order: +# β•Ÿβ”€08cf2a80-f2b2-11ea-132d-2f26c934bbb2 +# β•Ÿβ”€b72a9871-3773-4a06-9a2f-09ce5a7d8496 +# ╠═47f98a52-f2b2-11ea-0ac6-9b4b74b7b15d +# β•Ÿβ”€5154a672-f2b2-11ea-1280-3ba5dadff7f9 +# β•Ÿβ”€f53fbf24-f2b2-11ea-2f59-d943884fee9d +# β•Ÿβ”€e6a55456-fe6f-11ea-328c-47fedb388194 +# ╠═2be8656c-f2b3-11ea-2244-5740c807deff +# β•Ÿβ”€2e00ef04-f2b3-11ea-1960-8136321c71db +# β•Ÿβ”€f7cd052e-f2bb-11ea-239a-47966e96e909 +# ╠═7244eba2-f2b3-11ea-045f-ffd208852eda +# β•Ÿβ”€60058dbe-1514-4139-bb97-66b40fe47306 +# ╠═21882f0e-8d54-41ae-84c6-7637ccc52c46 +# β•Ÿβ”€401df7a4-f2b3-11ea-12a1-e9b46bcfcf1b +# ╠═5ac4989c-f2b3-11ea-3e8a-a79a4117e48c +# ╠═5db7350a-f2b3-11ea-293d-ffc572e0dbe8 +# ╠═d5edd644-fe7c-11ea-2aa8-c772ea2f1bde +# ╠═76ba97fe-b7c4-467b-85ae-9067ebcc8b14 +# ╠═64b28e4a-f2b3-11ea-0fc0-7d37b4794686 +# ╠═8a4a8499-af01-46ea-8196-fb2d718d0d17 +# β•Ÿβ”€92b65737-9ad7-422e-955c-e9adacd2032b +# ╠═a38e2cce-851c-4065-8947-1926fa9ca5b4 +# ╠═684ff7f4-f2b3-11ea-14f7-7d3f329ecd79 +# β•Ÿβ”€2ca60bca-f2b4-11ea-0fec-c50f4e306536 +# β•Ÿβ”€7a6a18de-f2b3-11ea-1b3d-ef7a2b1b0434 +# β•Ÿβ”€67e7ea4d-0b76-4247-b22d-e20c8280f046 +# β•Ÿβ”€45190ad2-d358-455a-89a1-4f9c3b3880fa +# ╠═732ad756-1707-48e7-9bfb-10707e64b118 +# ╠═c8a5c6f8-4ca1-4c7e-9cc1-d2e5c9e9da59 +# β•Ÿβ”€c67f8b3f-0561-4f47-ade8-3c79d7920ae1 +# β•Ÿβ”€997ec642-a865-4c97-9aa1-d4d9df9e1dd0 +# ╠═913234a2-f2b3-11ea-3501-e3bfc54f91fe +# β•Ÿβ”€0238579a-fe70-11ea-0968-0f11ae9557db +# ╠═9ecd1cd6-8412-4fe1-9d79-676f9830ec2c +# ╠═af02692c-c1be-4f7c-a09f-fbd88b0c4bd8 +# ╠═eef066e0-f2b3-11ea-3cfa-5f35ebf13f76 +# ╠═f2158710-f2b3-11ea-16c9-dded5e1747d4 +# ╠═f54ee2b2-f2b3-11ea-24e8-f556ab9e3b85 +# ╠═08a565e0-f2b4-11ea-2ab6-f5f3a1b3c22d +# ╠═1055a996-f2b4-11ea-14d2-6116cbbaa6ba +# ╠═13db037a-f2b4-11ea-2a38-bd7c1c60f7d9 +# β•Ÿβ”€4f42234e-f2b4-11ea-2c86-93449b8dc60b +# ╠═6adbc7fe-f2b4-11ea-1861-b398d517edfa +# ╠═6cd1accc-f2b4-11ea-0077-e7685b77b1be +# β•Ÿβ”€77d4fd72-f2b4-11ea-0bd6-97fc2299ca2f +# ╠═773af248-f2b4-11ea-154a-cb67beebed3d +# β•Ÿβ”€8a5ee764-f2b4-11ea-23f3-27664d910c16 +# ╠═8ded9128-f2b4-11ea-0f44-9321077205de +# β•Ÿβ”€c3a1abd8-f2b4-11ea-0509-a5296ae8b361 +# ╠═c9f92e66-f2b4-11ea-322f-7778f149453d +# β•Ÿβ”€cfb07cc6-f2b4-11ea-08a7-dd0b13d15b5e +# ╠═d56b74f2-f2b4-11ea-12b4-5f54d4999b38 +# β•Ÿβ”€d9f2d114-f2b4-11ea-32b0-43fa1a872a97 +# ╠═de1fd700-f2b4-11ea-36dd-4bfba5ecc134 +# ╠═df14ce72-f2b4-11ea-307b-8fac2889681b +# ╠═e584f976-f2b4-11ea-0245-67f6bcc4be0e +# β•Ÿβ”€eb68674c-f2b4-11ea-0cc2-f792d17a5005 +# β•Ÿβ”€f4edad2c-f2b4-11ea-05fb-3d43c18e9d5c +# β•Ÿβ”€fd9ed266-f2b4-11ea-3c53-3bd2fe30a7f1 +# β•Ÿβ”€4e6b2b04-f2b5-11ea-0c52-5f32438e8c68 +# β•Ÿβ”€55ff7230-f2b5-11ea-2898-db5e21c764fd +# ╠═688a1f40-f2b5-11ea-3fa8-ebb735323ddd +# β•Ÿβ”€e5c12243-70ad-4e52-9bab-aae432203e21 +# β•Ÿβ”€6d6da8ba-f2b5-11ea-1064-df27ecea7d13 +# β•Ÿβ”€6fd08e42-f2b5-11ea-36e6-d7ff10412e2b +# β•Ÿβ”€9a87095e-f2b5-11ea-334e-57a637e20c43 +# β•Ÿβ”€67e9fa88-ff03-11ea-1177-c34331398d6c +# ╠═75ae48fe-f2b5-11ea-0614-912091cbfb6a +# β•Ÿβ”€8a738272-f2b5-11ea-2de6-f9ae6b30a466 +# ╠═7b95d73c-f2b5-11ea-1b29-858f7b6c99bf +# ╠═836ca94a-f2b5-11ea-07e0-bd830f810fba +# ╠═8fe85430-f2b5-11ea-3fe7-5d9a0db03932 +# ╠═b372c25c-f2b5-11ea-1c55-e5045e0dc5b7 +# ╠═b6e48b12-f2b5-11ea-3bf2-81e5b2a3dc98 +# ╠═b455e8ac-fe7f-11ea-1a8a-db85d11ccba7 +# ╠═c2924514-fe7f-11ea-2b01-81e9e0e1c491 +# ╠═cd2821c4-fe7f-11ea-0c41-8feab49be07a +# ╠═bebbd674-f2b5-11ea-19c6-4fe1257b0277 +# β•Ÿβ”€d6c6d4ea-f2b7-11ea-0b41-d7f629cdcd2f +# ╠═fe18341e-f2b7-11ea-0236-03b44eebd328 +# ╠═3f2a4cc2-26fa-4c3e-bfb7-f3ef019b6d78 +# ╠═9e22156e-0880-11eb-24a8-3d0a41262c36 +# ╠═ab39b554-0880-11eb-05de-71949f71b440 +# β•Ÿβ”€0aba93a6-f2b8-11ea-1461-d96878b7a5c1 +# ╠═014ec92c-f2b8-11ea-3986-8d74a8c2458d +# ╠═4a6270a3-a271-40da-84d0-28247f287c22 +# ╠═272bdcca-aeb1-405f-8251-33f13cddbdc5 +# β•Ÿβ”€3f5a58da-f2b8-11ea-3ab0-5db5e9199bb1 +# ╠═48e5da96-f2b8-11ea-0108-2104f2c8ac24 +# ╠═eaacb5a5-c748-4223-98e4-be73d3f2086f +# β•Ÿβ”€263e18dc-fe70-11ea-03a0-8fd5e031b06f +# ╠═2f18c362-f2b8-11ea-1beb-719ff5cd5f8d +# ╠═393f92a6-fe70-11ea-024e-ff30dcfc7103 +# ╠═329cb67e-f2b8-11ea-07b1-e13fd8ddbe42 +# ╠═36a2ca10-f2b8-11ea-0fae-53b552c76115 +# ╠═4ee45daa-f2b8-11ea-10ea-f929853879b1 +# β•Ÿβ”€555c8d88-f2b8-11ea-34d8-a17ce87ccdc1 +# ╠═59eee760-f2b8-11ea-29f6-732292e2f95d +# ╠═5ccd625e-f2b8-11ea-38c1-098e2f31ce53 +# ╠═60b52f6e-f2b8-11ea-2afc-4be2d4ae3e19 +# ╠═63d5e0be-f2b8-11ea-16e8-d9528b4e8945 +# β•Ÿβ”€6971e7e6-f2b8-11ea-2a76-9dda6b1455b6 +# ╠═6fe82e5a-f2b8-11ea-101d-d1ee5f9bd5b1 +# ╠═723fe4ca-f2b8-11ea-1440-a9e1cd213b66 +# ╠═76284520-f2b8-11ea-077e-43167cc7484c +# ╠═85a5c518-f2b8-11ea-2e12-25d16a12e7c8 +# β•Ÿβ”€8a254852-f2b8-11ea-142d-71bb270a5c01 +# β•Ÿβ”€91d0e03e-f2b8-11ea-07e5-db056636ac21 +# ╠═963c4910-f2b8-11ea-12bb-bb42539b1c93 +# β•Ÿβ”€a041fbf8-f2b8-11ea-28ba-0772497c649f +# ╠═9b5db398-f2b8-11ea-00bc-77de99792925 +# β•Ÿβ”€bdce5964-f2b8-11ea-03d1-57705d295040 +# ╠═c6728784-f2b8-11ea-12b5-d7eb039d77ce +# β•Ÿβ”€e1057afe-fe6e-11ea-27fe-6def4d8e1f2d +# ╠═eb76e252-fe6e-11ea-0939-c51ff3c73827 +# β•Ÿβ”€d6d310ee-f2b8-11ea-24e1-3b405f071545 +# ╠═d3ae2c14-f2b8-11ea-1ac2-fb5e0b4b8500 +# β•Ÿβ”€dbb1e68c-f2b8-11ea-1220-6f5715822e3d +# ╠═df557ed2-f2b8-11ea-22ee-e1c90a2655bf +# β•Ÿβ”€ee52d2b8-f2b8-11ea-15c4-19e9f2ad10e2 +# β•Ÿβ”€213fc38a-f380-11ea-135e-6f72924c19aa +# β•Ÿβ”€059679c0-d0ff-453b-b897-b889bbea326d +# ╠═a20f0158-f32b-45e8-8bd5-6f693eca1860 +# ╠═23b0cc81-b551-446b-991f-54bd19ac63cd +# ╠═a9961630-08be-48f8-b1cc-4a9d67dfc519 +# ╠═e4d2350e-147b-4c3c-a9ff-6de66a54c48a +# β•Ÿβ”€501a0db3-538a-43f3-a769-158c824bca31 +# ╠═ca64df96-082a-40dd-b82c-64016257fcab +# ╠═ba43bc8b-27d6-490d-971e-7e440b991cfb +# β•Ÿβ”€2d7dbec3-82eb-41f8-a959-b458e136d18c +# ╠═378500c1-9f19-4111-82cf-5a57c30d66ef +# β•Ÿβ”€8586855b-2ad7-4fe4-af1a-2a6f1dd052b3 +# β•Ÿβ”€8877c563-d10a-41e4-be8b-546d27623b67 +# ╠═a73e4d59-34f4-412f-afa4-f3b66244b35e +# ╠═6707fd27-78f6-4663-b95d-a016d2c44c3b +# β•Ÿβ”€18e151c4-0b0e-485b-81d2-f18a2dd4592d +# β•Ÿβ”€79221eee-f2be-11ea-3e43-4596f5ce5694 +# ╠═fb91a9c4-f2c0-11ea-38c4-5b554446e997 +# ╠═07c45d78-f2c3-11ea-131e-b9f0b67ca3cd +# ╠═33023d10-f2c1-11ea-3375-e9ac23172ab6 +# β•Ÿβ”€31cdefd2-f381-11ea-3037-e9c023ebc1e9 +# ╠═4def0626-f2c1-11ea-2f01-31a8c42b121c +# β•Ÿβ”€46c54108-f381-11ea-141f-31a696a7a8ef +# β•Ÿβ”€5812f84c-f2c1-11ea-0f6c-31b9fedc3704 +# ╠═8049560e-f383-11ea-1c8e-39c629d20982 +# ╠═c7b5a1aa-f383-11ea-2a84-8da9c9e60dbc +# ╠═cfad1a8c-f383-11ea-3dad-214f3da9485d +# β•Ÿβ”€83ddbe6a-f381-11ea-2415-255cbfb2590b +# ╠═30e9891c-f2c5-11ea-022d-5dbf9c064e43 +# β•Ÿβ”€b07cb958-f381-11ea-3378-5517440464ca +# ╠═eaac2514-f8fe-11ea-2229-81f5b59f58fe +# ╠═fb044216-f381-11ea-2faf-fd53dad74950 +# ╠═675b222c-f382-11ea-257a-afcb5a5afdd8 +# ╠═818c1f9e-ff1b-11ea-097f-cba2f30af994 +# ╠═7aff4178-bcac-4cfa-ab22-de3506cf73a8 +# β•Ÿβ”€881dedd4-f385-11ea-342e-a3700e90ac66 +# ╠═c1e19e26-f385-11ea-17b6-6d2d2e5cb7c0 +# ╠═fe18a0a0-f8fe-11ea-1595-4d95256dabca +# ╠═ec87028b-d9d4-4dc7-9dd5-36eaa1dd49d4 +# β•Ÿβ”€df5f20d8-f385-11ea-104d-9b9e7b094eb7 +# ╠═e4a088f0-f385-11ea-00da-b12e40e4357f +# β•Ÿβ”€ddd214d8-608a-4123-973f-b331c6ab331a +# ╠═8f3fecac-f8fd-11ea-136d-1513f60ee3ed +# ╠═f8863a18-f385-11ea-0965-0f074e58d9b2 +# β•Ÿβ”€4c3817f6-396e-4485-a7dd-0f507cec124a +# ╠═78b72cb1-52f3-4dc3-a721-b8a89a24312e +# ╠═7180e310-a6f7-4feb-aff3-28e1c772b441 +# β•Ÿβ”€02b42a67-7ebe-4ca2-ac55-aa481b30e997 +# ╠═043e3e2f-3876-41c0-bf70-5ef53b5db986 +# ╠═8ba368c9-3b04-469e-9556-1573cbc52185 +# ╠═4da4a1b6-b7c8-432d-86ed-c45a499a1880 +# β•Ÿβ”€c573ba19-4be5-4afd-b9f5-8b75e9b18ad6 +# ╠═639528b1-ecff-4a05-ae56-9a08b779edc1 +# ╠═838292fc-2c0e-4bb9-9df9-6cd197c4a4fd +# ╠═ca20cc75-3033-4bd1-bb5c-cae61c855de7 +# β•Ÿβ”€34d48ec0-f2b9-11ea-147e-d3554a9fcc04 +# β•Ÿβ”€0a576c65-3685-4987-93f1-980ace78d6f4 +# β•Ÿβ”€91aff94e-e77e-4810-82ad-fe5ab3eafdad +# β•Ÿβ”€8eb9ed90-981b-4094-baec-a521614fb3a1 +# β•Ÿβ”€d682439b-bc6b-456d-8b5d-2489d095e55f +# β•Ÿβ”€2d4c0bf6-3936-449d-8341-56f9c5659a6e +# β•Ÿβ”€fe4dfa5c-ea26-4f7c-aa68-7b3ec5f45bdc +# β•Ÿβ”€00000000-0000-0000-0000-000000000001 +# β•Ÿβ”€00000000-0000-0000-0000-000000000002 diff --git a/scripts/autodiff.jl b/scripts/autodiff.jl new file mode 100644 index 00000000..b198a482 --- /dev/null +++ b/scripts/autodiff.jl @@ -0,0 +1,2974 @@ +### A Pluto.jl notebook ### +# v0.20.3 + +using Markdown +using InteractiveUtils + +# This Pluto notebook uses @bind for interactivity. When running this notebook outside of Pluto, the following 'mock version' of @bind gives bound variables a default value (instead of an error). +macro bind(def, element) + #! format: off + quote + local iv = try Base.loaded_modules[Base.PkgId(Base.UUID("6e696c72-6542-2067-7265-42206c756150"), "AbstractPlutoDingetjes")].Bonds.initial_value catch; b -> missing; end + local el = $(esc(element)) + global $(esc(def)) = Core.applicable(Base.get, el) ? Base.get(el) : iv(el) + el + end + #! format: on +end + +# ╔═║ 47f98a52-f2b2-11ea-0ac6-9b4b74b7b15d +using Plots, PlutoUI, LinearAlgebra + +# ╔═║ 5ac4989c-f2b3-11ea-3e8a-a79a4117e48c +using Symbolics + +# ╔═║ 6fe82e5a-f2b8-11ea-101d-d1ee5f9bd5b1 +using ForwardDiff + +# ╔═║ 963c4910-f2b8-11ea-12bb-bb42539b1c93 +using Zygote + +# ╔═║ 08cf2a80-f2b2-11ea-132d-2f26c934bbb2 +md""" +# Numeric and automatic differentiation + +STMO + +![](https://github.com/MichielStock/STMO/blob/master/chapters/03.AutoDiff/Figures/logo.png?raw=true) + +**Michiel Stock** + +""" + +# ╔═║ b72a9871-3773-4a06-9a2f-09ce5a7d8496 +md"## Motivation + +Up to now, we confidently assumed that we would always be able to compute the derivative or gradient of any function. Despite differentiation being a relatively easy operation, it is frequenty not feasible (or desirable) to compute this by hand. *Numerical differentiation* can provide approximations of th derivate or gradient at a particular point. *Automatic differentiation* directly manipulates the computational graph to generate a function that computes the (exact) derivate. Such methods have advanced greatly in the last years and it is no exageration that their easy use in popular software libraries such as TenserFlow and PyTorch are a cornerstone of deep learning and other machine learning and scientific computing fields. +" + +# ╔═║ 5154a672-f2b2-11ea-1280-3ba5dadff7f9 +md""" +## Definition of a derivative + +$$\frac{\text{d}f(x)}{\text{d}x} = f'(x) = \lim _{h\to 0}{\frac {f(x+h)-f(x)}{h}}.$$ + +Derivation is in essence a mechanical process, following the rules below. + +![](https://raw.githubusercontent.com/MichielStock/STMO/master/chapters/03.AutoDiff/Figures/derivatives.jpeg) + +![](https://imgs.xkcd.com/comics/differentiation_and_integration.png) + +When we work with function of several variables, we use *partial derivatives* (e.g. $\frac{\partial f(x, y)}{\partial x}$), indicating we keep all variables but $x$ fixed. +""" + +# ╔═║ f53fbf24-f2b2-11ea-2f59-d943884fee9d +md""" +Our running example: + +$$f(x) = \log x + \frac{\sin x}{x}$$ +""" + +# ╔═║ e6a55456-fe6f-11ea-328c-47fedb388194 +md"**Assignment**: implement this function. (or another one)" + +# ╔═║ f7cd052e-f2bb-11ea-239a-47966e96e909 +md"We will evaluate this function in `a`=$2." + +# ╔═║ 7244eba2-f2b3-11ea-045f-ffd208852eda +a = 2.0 + +# ╔═║ 60058dbe-1514-4139-bb97-66b40fe47306 +md"For the record:" + +# ╔═║ 401df7a4-f2b3-11ea-12a1-e9b46bcfcf1b +md""" +## Symbolic differentiation + +Computing derivatives is relatively straightforward, as you have seen in basic calculus courses. Some software called **computer algebra systems** can manipulate symbolic expressions to generate derivatives. + + +For example, libraries that support symbolic differentiation: +- Maple +- Sympy (Python) +- Mathematica +- Maxima +- Symbolics (Julia) + +Differentiation is *easy* compared to *integration* or *sampling*. + +Advantages: +- exact derivatives! +- gives the formula for different evaluations. + - insight in the system (i.e. variable are independent can be learned from second-order partial derivatives) + - in some cases, closed-form solution extrema by solving $\frac{\text{d}f(x)}{\text{d}x}=0$ +- no hyperparameters or tweaking: just works! + +Disadvantages: +- some software not flexible enough (gradients, arrays, for-loops,...) +- sometimes explosion of terms: *expression swell* +- not always numerically optimal! +""" + +# ╔═║ 5db7350a-f2b3-11ea-293d-ffc572e0dbe8 +@variables x # define variable + +# ╔═║ 76ba97fe-b7c4-467b-85ae-9067ebcc8b14 +Dx = Differential(x) # differential operator + +# ╔═║ 92b65737-9ad7-422e-955c-e9adacd2032b +md"We can build this expression in a function:" + +# ╔═║ 67e7ea4d-0b76-4247-b22d-e20c8280f046 +md"You can play with this dynamically:" + +# ╔═║ 45190ad2-d358-455a-89a1-4f9c3b3880fa +@bind n Slider(-10:10, show_value=true, default=2) + +# ╔═║ 732ad756-1707-48e7-9bfb-10707e64b118 +n + +# ╔═║ c67f8b3f-0561-4f47-ade8-3c79d7920ae1 +md"Derivative:" + +# ╔═║ 913234a2-f2b3-11ea-3501-e3bfc54f91fe +md""" +# Numerical differentiation + +Finite difference approximation of the derivative/gradient based on a number of function evaluations. + +Often based on the limit definition of a derivative. Theoretical analysis using Taylor approximation: + +$$f(x + h) = f(x) + \frac{h}{1!}f'(x) + \frac{h^2}{2!}f''(x) + \frac{h^3}{3!}f^{(3)}(x)+\ldots$$ + +**Forward difference** + +$$f'(x)\approx \frac{f(x+h) - f(x)}{h}$$ + +**Central difference** + +$$f'(x)\approx \frac{f(x+h) - f(x-h)}{2h}$$ + +**Complex step method** + +$$f'(x)\approx \frac{\text{Im}(f(x +ih))}{h}$$ +""" + +# ╔═║ 0238579a-fe70-11ea-0968-0f11ae9557db +md"**Assignment**: Implement these functions. Hint `im` is the imaginary unit: i.e." + +# ╔═║ eef066e0-f2b3-11ea-3cfa-5f35ebf13f76 +diff_fordiff(f, x; h=1e-10) = missing + +# ╔═║ f2158710-f2b3-11ea-16c9-dded5e1747d4 +diff_centrdiff(f, x; h=1e-10) = missing + +# ╔═║ f54ee2b2-f2b3-11ea-24e8-f556ab9e3b85 +diff_complstep(f, x; h=1e-10) = missing + +# ╔═║ 4f42234e-f2b4-11ea-2c86-93449b8dc60b +md""" +## Intermezzo: floats + +Real numbers are always represented as floating point numbers in a computer. + +![Encoding of a real number using a `Float32`.](https://raw.githubusercontent.com/MichielStock/STMO/master/chapters/03.AutoDiff/Figures/floats.png) + +By default, Julia uses double precision floats (`Float64`). For brevity, let us take a look at the bit representation of a float. We use `Float32` for brevity's sake. +""" + +# ╔═║ 6adbc7fe-f2b4-11ea-1861-b398d517edfa +num = Float32(10.789) + +# ╔═║ 6cd1accc-f2b4-11ea-0077-e7685b77b1be +bitstring(num) + +# ╔═║ 77d4fd72-f2b4-11ea-0bd6-97fc2299ca2f +md"The first bit encodes the *sign*, here positive." + +# ╔═║ 773af248-f2b4-11ea-154a-cb67beebed3d +sign(num) + +# ╔═║ 8a5ee764-f2b4-11ea-23f3-27664d910c16 +md"The next eight bits specify the *exponent*, the magnitude of the number." + +# ╔═║ 8ded9128-f2b4-11ea-0f44-9321077205de +exponent(num) + +# ╔═║ c3a1abd8-f2b4-11ea-0509-a5296ae8b361 +md"While the final 23 bits specify the *mantissa*, a number between $[1,2]$ representing the precision." + +# ╔═║ c9f92e66-f2b4-11ea-322f-7778f149453d +significand(num) + +# ╔═║ cfb07cc6-f2b4-11ea-08a7-dd0b13d15b5e +md"These can be used to reconstrunct the number." + +# ╔═║ d9f2d114-f2b4-11ea-32b0-43fa1a872a97 +md"The *machine precision* of a number can be retained using `eps`. This is the relative error." + +# ╔═║ de1fd700-f2b4-11ea-36dd-4bfba5ecc134 +eps(1.2) + +# ╔═║ df14ce72-f2b4-11ea-307b-8fac2889681b +eps(1.2e10) + +# ╔═║ e584f976-f2b4-11ea-0245-67f6bcc4be0e +eps(1.2e-10) + +# ╔═║ eb68674c-f2b4-11ea-0cc2-f792d17a5005 +md""" +This brings us with numerical issues we might encounter using numerical differentiation. + +**First sin of numerical analysis**: + +> *thou shalt not add small numbers to big numbers* + +**second sin of numerical analysis**: + +> *thou shalt not subtract numbers which are approximately equal* +""" + +# ╔═║ f4edad2c-f2b4-11ea-05fb-3d43c18e9d5c +md"### Back to numerical differentiation + +Below is the absolute error using the three proposed methods." + +# ╔═║ 4e6b2b04-f2b5-11ea-0c52-5f32438e8c68 +md""" +Advantages of numerical differentiation: +- easy to implement +- general, no assumptions needed + +Disadvantages: +- not numerically stable (round-off errors) +- not efficient for gradients ($\mathcal{O}(n)$ evaluations for $n$-dimensional vectors) +""" + +# ╔═║ 55ff7230-f2b5-11ea-2898-db5e21c764fd +md"""## Approximations of multiplications with gradients + +**Gradient-vector approximation** (the directional derivative) + +$$\nabla f(\mathbf{x})^\intercal \mathbf{d} \approx \frac{f(\mathbf{x}+h\cdot\mathbf{d}) - f(\mathbf{x}-h\cdot\mathbf{d})}{2h}$$ + +**Hessian-vector approximation** + +$$\nabla^2 f(\mathbf{x}) \mathbf{d} \approx \frac{\nabla f(\mathbf{x}+h\cdot\mathbf{d}) - \nabla f(\mathbf{x}-h\cdot\mathbf{d})}{2h}$$ +""" + +# ╔═║ e5c12243-70ad-4e52-9bab-aae432203e21 +md"Generate an example" + +# ╔═║ 67e9fa88-ff03-11ea-1177-c34331398d6c +md"$$g(\mathbf{x}) = \exp(-\mathbf{x}^\intercal A\mathbf{x})$$" + +# ╔═║ 8a738272-f2b5-11ea-2de6-f9ae6b30a466 +md"Correct gradient and Hessian (by hand)" + +# ╔═║ c2924514-fe7f-11ea-2b01-81e9e0e1c491 +h = 1e-10 + +# ╔═║ d6c6d4ea-f2b7-11ea-0b41-d7f629cdcd2f +md""" +## Forward differentiation + +Accumulation of the gradients along the *computational graph*. + +![](https://raw.githubusercontent.com/MichielStock/STMO/master/chapters/03.AutoDiff/Figures/forwarddiff.png) + +Forward differentiation computes the gradient from the inputs to the outputs. + +### Differentiation rules + +**Sum rule**: + +$$\frac{\partial (f(x)+g(x))}{\partial x} = \frac{\partial f(x)}{\partial x} + \frac{\partial f(x)}{\partial x}$$ + +**Product rule**: + +$$\frac{\partial (f(x)g(x))}{\partial x} = f(x)\frac{\partial g(x)}{\partial x} + g(x)\frac{\partial f(x)}{\partial x}$$ + +**Chain rule**: + +$$\frac{\partial (g(f(x))}{\partial x} = \frac{\partial g(u)}{\partial u}\mid_{u=f(x)} \frac{\partial f(x)}{\partial x}$$ + +## Dual numbers + +Forward differentiation can be viewed as evaluating function using *dual numbers*, which can be viewed as truncated Taylor series: + +$$v + \dot{v}\epsilon\,,$$ + +where $v,\dot{v}\in\mathbb{R}$ and $\epsilon$ a nilpotent number, i.e. $\epsilon^2=0$. For example, we have + +$$(v + \dot{v}\epsilon) + (u + \dot{u}\epsilon) = (v+u) + (\dot{v} +\dot{u})\epsilon$$ + + +$$(v + \dot{v}\epsilon)(u + \dot{u}\epsilon) = (vu) + (v\dot{u} +\dot{v}u)\epsilon\,.$$ + + +These dual numbers can be used as + +$$f(v+\dot{v}\epsilon) = f(v) + f'(v)\dot{v}\epsilon\,.$$ +""" + +# ╔═║ fe18341e-f2b7-11ea-0236-03b44eebd328 +struct Dual{T} + v::T + vdot::T +end + +# ╔═║ 3f2a4cc2-26fa-4c3e-bfb7-f3ef019b6d78 +Base.show(io::IO, a::Dual) = print(io, "$(a.v) + $(a.vdot)Ο΅") # nice printing + +# ╔═║ 9e22156e-0880-11eb-24a8-3d0a41262c36 +Ο΅ = Dual(0.0, 1.0) + +# ╔═║ ab39b554-0880-11eb-05de-71949f71b440 +Dual(2.0, 3.0) + +# ╔═║ 0aba93a6-f2b8-11ea-1461-d96878b7a5c1 +md"Let's implement some basic rules showing linearity." + +# ╔═║ 3f5a58da-f2b8-11ea-3ab0-5db5e9199bb1 +md"And some more advanced ones, based on differentiation." + +# ╔═║ eaacb5a5-c748-4223-98e4-be73d3f2086f + + +# ╔═║ 263e18dc-fe70-11ea-03a0-8fd5e031b06f +md"**Assignment**: complete this code." + +# ╔═║ 2f18c362-f2b8-11ea-1beb-719ff5cd5f8d +Base.:sin(a::Dual) = missing + +# ╔═║ 393f92a6-fe70-11ea-024e-ff30dcfc7103 +Base.:cos(a::Dual) = missing + +# ╔═║ 329cb67e-f2b8-11ea-07b1-e13fd8ddbe42 +Base.:exp(a::Dual) = missing + +# ╔═║ 36a2ca10-f2b8-11ea-0fae-53b552c76115 +Base.:log(a::Dual) = missing + +# ╔═║ 555c8d88-f2b8-11ea-34d8-a17ce87ccdc1 +md"This directly works for vectors!" + +# ╔═║ 6971e7e6-f2b8-11ea-2a76-9dda6b1455b6 +md"In practice, we prefer to use a package to do this." + +# ╔═║ 8a254852-f2b8-11ea-142d-71bb270a5c01 +md""" +Forward differentiation: + +- exact gradients! +- computational complexity scales with **number of inputs** +- used when you have more outputs than inputs +""" + +# ╔═║ 91d0e03e-f2b8-11ea-07e5-db056636ac21 +md""" +# Reverse differentiation + +Compute the gradient from the output toward the inputs using the chain rule. + +![](https://raw.githubusercontent.com/MichielStock/STMO/master/chapters/03.AutoDiff/Figures/reversediff.png) + +Reverse differentiation: + +- also exact! +- main workhorse for training artificial neural networks. +- efficient when more inputs than outputs (machine learning: thousands of parameters vs. one loss) +""" + +# ╔═║ a041fbf8-f2b8-11ea-28ba-0772497c649f +md"Constructing the derivative or gradient can be done by appending `'` to the function." + +# ╔═║ bdce5964-f2b8-11ea-03d1-57705d295040 +md"More verbose, but exactly the same:" + +# ╔═║ e1057afe-fe6e-11ea-27fe-6def4d8e1f2d +md"This works for function with multiple inputs." + +# ╔═║ d6d310ee-f2b8-11ea-24e1-3b405f071545 +md"Fuctions with vectorial input." + +# ╔═║ dbb1e68c-f2b8-11ea-1220-6f5715822e3d +md"Finding the Hessian:" + +# ╔═║ ee52d2b8-f2b8-11ea-15c4-19e9f2ad10e2 +md""" +## Artificial neural networks + +Multi-layer perceptron. + +![](https://raw.githubusercontent.com/MichielStock/STMO/master/chapters/03.AutoDiff/Figures/ANN_example.png) + +Forward differentiation. + +![](https://raw.githubusercontent.com/MichielStock/STMO/master/chapters/03.AutoDiff/Figures/Forwardprop.png) + +Reverse differentation or backpropagation. + +![](https://raw.githubusercontent.com/MichielStock/STMO/master/chapters/03.AutoDiff/Figures/Backprop.png) + +Returns effect of changing layer output on the loss. Can be related directly to the parameters! +""" + +# ╔═║ 213fc38a-f380-11ea-135e-6f72924c19aa +md""" +## Differentiating complex objects + +Automatic differentiation can be used beyond machine learning and optimization: + +- [physical engines](https://arxiv.org/abs/1611.01652) to learn robot control +- differentiating [protein](https://github.com/lupoglaz/TorchProteinLibrary) [structures](https://www.cell.com/cell-systems/fulltext/S2405-4712(19)30076-6) +- Sinkhorn algorithm +- [dynamic programming](https://arxiv.org/abs/1802.03676) +- [differential equations](https://julialang.org/blog/2019/01/fluxdiffeq) +- [molecules](https://www.nature.com/articles/s41592-021-01283-4) + +Everything is computed by some straightforward and differentiable functions! +""" + +# ╔═║ 059679c0-d0ff-453b-b897-b889bbea326d +md""" +### Example: differentiable sequence alignment + +One can differentiate the Needleman-Wunsch algorithm for sequence alignment. This yields insight in how the alignment score would change if one changes the alignment parameters. +""" + +# ╔═║ a20f0158-f32b-45e8-8bd5-6f693eca1860 +abstract type Regularizer end + +# ╔═║ 23b0cc81-b551-446b-991f-54bd19ac63cd +struct NegEntropy{T<:Number} <: Regularizer + Ξ³::T +end + +# ╔═║ a9961630-08be-48f8-b1cc-4a9d67dfc519 +function max_argmax(Ξ©::NegEntropy, x) + Ξ³ = Ξ©.Ξ³ + m = maximum(x) + # stable log-sum-exp computation + lse = m + Ξ³ * log(sum(exp, (x .- m) ./ Ξ³)) + # stable softmax + q = exp.((x .- lse) ./ Ξ³) + return lse, q # smooth max and grad +end + +# ╔═║ e4d2350e-147b-4c3c-a9ff-6de66a54c48a +function βˆ‡needleman_wunsch(Ξ©::Regularizer, ΞΈ, (cΛ’, cα΅—)) + n, m = size(ΞΈ) + D = zeros(n+1, m+1) # initialize DP matrix + D[2:n+1,1] .= -cumsum(cΛ’) # cost of starting with gaps in s + D[1,2:m+1] .= -cumsum(cα΅—) # cost of starting with gaps in t + E = zeros(n+2, m+2) # matrix for the gradient + E[n+2,m+2] = 1.0 + Q = zeros(n+2, m+2, 3) # matrix for backtracking + Q[n+2,m+2,2] = 1.0 + # forward pass, performing dynamic programming + for i in 1:n, j in 1:m + v, q = max_argmax(Ξ©, (D[i+1,j] - cΛ’[i], # gap in s + D[i,j] + ΞΈ[i,j], # match + D[i,j+1] - cα΅—[j])) # gap in t + D[i+1,j+1] = v # store smooth max + Q[i+1,j+1,:] .= q # store directions + end + v = D[n+1,m+1] # get alignment score + # backtracking through the directions to compute the gradient + for i in n:-1:1, j in m:-1:1 + E[i+1,j+1] = Q[i+1,j+2,1] * E[i+1,j+2] + + Q[i+2,j+2,2] * E[i+2,j+2] + + Q[i+2,j+1,3] * E[i+2,j+1] + end + return v, E[2:n+1,2:m+1] # value and gradient +end + +# ╔═║ 501a0db3-538a-43f3-a769-158c824bca31 +md"For example, consider two sequences and the Hamming distance." + +# ╔═║ ca64df96-082a-40dd-b82c-64016257fcab +s, t = "aattcaa", "atctaca" + +# ╔═║ ba43bc8b-27d6-490d-971e-7e440b991cfb +ΞΈ = [sα΅’==tα΅’ for sα΅’ in s, tα΅’ in t] + +# ╔═║ 2d7dbec3-82eb-41f8-a959-b458e136d18c +heatmap(ΞΈ, flipy=true, yticks=(1:length(s), s), xticks=(1:length(t), t), title="theta") + +# ╔═║ 378500c1-9f19-4111-82cf-5a57c30d66ef +cΛ’, cα΅— = 0.1ones(length(s)), 0.1ones(length(t)) + +# ╔═║ 8586855b-2ad7-4fe4-af1a-2a6f1dd052b3 +@bind logΞ³ Slider(-8:0.2:4, default=-4) + +# ╔═║ 8877c563-d10a-41e4-be8b-546d27623b67 +Ξ³ = exp(logΞ³) + +# ╔═║ a73e4d59-34f4-412f-afa4-f3b66244b35e +Ξ³ + +# ╔═║ 6707fd27-78f6-4663-b95d-a016d2c44c3b +# alignment value and score +v, E = βˆ‡needleman_wunsch(NegEntropy(Ξ³), ΞΈ, (cΛ’, cα΅—)) + +# ╔═║ 014ec92c-f2b8-11ea-3986-8d74a8c2458d +begin + Base.:+(a::Dual, b::Dual) = Dual(a.v + b.v, a.vdot + b.vdot) + Base.:-(a::Dual, b::Dual) = Dual(a.v - b.v, a.vdot - b.vdot) + Base.:-(a::Dual, b::Real) = Dual(a.v - b, a.vdot) + Base.:-(a::Dual) = Dual(-a.v, -a.vdot) + Base.:*(a::Dual, b::Dual) = Dual(a.v * b.v, a.v * b.vdot + b.v * a.vdot) + Base.:+(c::Real, b::Dual) = Dual(c + b.v, b.vdot) + Base.:*(v::Real, b::Dual) = Dual(v, 0.0) * b + Base.:*(a::Dual, b::Real) = v * a +end + +# ╔═║ 9ecd1cd6-8412-4fe1-9d79-676f9830ec2c +imag_number = 2 + 3im # im is a special type of number + +# ╔═║ af02692c-c1be-4f7c-a09f-fbd88b0c4bd8 +real(imag_number), imag(imag_number) # extract real and imaginary parts + +# ╔═║ d56b74f2-f2b4-11ea-12b4-5f54d4999b38 +sign(num) * significand(num) * 2^exponent(num) + +# ╔═║ 6fd08e42-f2b5-11ea-36e6-d7ff10412e2b +xvect = 2rand(10) + +# ╔═║ 4a6270a3-a271-40da-84d0-28247f287c22 +2.0 + 3.0Ο΅ # now this works! + +# ╔═║ 48e5da96-f2b8-11ea-0108-2104f2c8ac24 +# you can derive this directly from the definition! +Base.:/(a::Dual, b::Dual) = Dual(a.v / b.v, (a.vdot * b.v - a.v * b.vdot) / b.v^2) + +# ╔═║ 2be8656c-f2b3-11ea-2244-5740c807deff +f(x) = log(x) + sin(x) / x + +# ╔═║ 21882f0e-8d54-41ae-84c6-7637ccc52c46 +f(a) + +# ╔═║ d5edd644-fe7c-11ea-2aa8-c772ea2f1bde +f(x) + +# ╔═║ 64b28e4a-f2b3-11ea-0fc0-7d37b4794686 +Dx(f(x)) + +# ╔═║ 8a4a8499-af01-46ea-8196-fb2d718d0d17 +df_sym = expand_derivatives(Dx(f(x))) # this expands the derviatve operator + +# ╔═║ a38e2cce-851c-4065-8947-1926fa9ca5b4 +df = build_function(df_sym, x) |> eval #builds an expression and turns it into a function + +# ╔═║ 684ff7f4-f2b3-11ea-14f7-7d3f329ecd79 +df(a) + +# ╔═║ 2ca60bca-f2b4-11ea-0fec-c50f4e306536 +true_diff = df(a); # save for checking + +# ╔═║ 7a6a18de-f2b3-11ea-1b3d-ef7a2b1b0434 +if !ismissing(f(a)) +plot(f, 1, 10, label="\$f(x)\$", xlabel="\$x\$", lw=2, color=:green) +plot!(df, 1, 10, label="\$f'(x)\$", lw=2, color=:orange) +end + +# ╔═║ 08a565e0-f2b4-11ea-2ab6-f5f3a1b3c22d +diff_fordiff(f, a) + +# ╔═║ 1055a996-f2b4-11ea-14d2-6116cbbaa6ba +diff_centrdiff(f, a) + +# ╔═║ 13db037a-f2b4-11ea-2a38-bd7c1c60f7d9 +diff_complstep(f, a) + +# ╔═║ 4ee45daa-f2b8-11ea-10ea-f929853879b1 +f(Dual(a, 1.0)) # works when rules are provided + +# ╔═║ 723fe4ca-f2b8-11ea-1440-a9e1cd213b66 +ForwardDiff.derivative(f, a) + +# ╔═║ 9b5db398-f2b8-11ea-00bc-77de99792925 +f'(a) # that's it + +# ╔═║ c6728784-f2b8-11ea-12b5-d7eb039d77ce +Zygote.gradient(f, a) # returns a tuple, since you can differentiate w.r.t. multiple arguments + +# ╔═║ c8a5c6f8-4ca1-4c7e-9cc1-d2e5c9e9da59 +symexpr = (x + 2)^n / (x+2) + +# ╔═║ 997ec642-a865-4c97-9aa1-d4d9df9e1dd0 +expand_derivatives(Dx(symexpr)) |> simplify + +# ╔═║ 688a1f40-f2b5-11ea-3fa8-ebb735323ddd +grad_vect(f, x, d; h=1e-10) = (f(x .+ h * d) - f(x .- h * d)) / (2h) + +# ╔═║ 6d6da8ba-f2b5-11ea-1064-df27ecea7d13 +dvect = randn(10) / 10 + +# ╔═║ 9a87095e-f2b5-11ea-334e-57a637e20c43 +A = randn(10, 10) |> A -> (A * A' + I) / 100 # make sym and PD + +# ╔═║ 75ae48fe-f2b5-11ea-0614-912091cbfb6a +g(x) = exp(- sum(x .* (A * x))) + +# ╔═║ 8fe85430-f2b5-11ea-3fe7-5d9a0db03932 +g(xvect) + +# ╔═║ b455e8ac-fe7f-11ea-1a8a-db85d11ccba7 +grad_vect(g, xvect, dvect) + +# ╔═║ 76284520-f2b8-11ea-077e-43167cc7484c +ForwardDiff.gradient(g, xvect) + +# ╔═║ d3ae2c14-f2b8-11ea-1ac2-fb5e0b4b8500 +g'(xvect) + +# ╔═║ df557ed2-f2b8-11ea-22ee-e1c90a2655bf +Zygote.hessian(g, xvect) + +# ╔═║ 7b95d73c-f2b5-11ea-1b29-858f7b6c99bf +βˆ‡g(x) = -2g(x) * A * x + +# ╔═║ b372c25c-f2b5-11ea-1c55-e5045e0dc5b7 +βˆ‡g(xvect) + +# ╔═║ b6e48b12-f2b5-11ea-3bf2-81e5b2a3dc98 +βˆ‡g(xvect)' * dvect + +# ╔═║ 836ca94a-f2b5-11ea-07e0-bd830f810fba +βˆ‡Β²g(x) = -2g(x) * A - 2A * x * βˆ‡g(x)' + +# ╔═║ cd2821c4-fe7f-11ea-0c41-8feab49be07a +βˆ‡Β²g(xvect) * dvect + +# ╔═║ bebbd674-f2b5-11ea-19c6-4fe1257b0277 +(βˆ‡g(xvect + h * dvect) - βˆ‡g(xvect - h * dvect)) / 2h + +# ╔═║ 272bdcca-aeb1-405f-8251-33f13cddbdc5 +(2.0+3.0Ο΅) / (5.0+8.0Ο΅) + +# ╔═║ 59eee760-f2b8-11ea-29f6-732292e2f95d +q(x) = 10.0 * x[1] * x[2] + x[1] * x[1] + sin(x[1]) / x[2] + +# ╔═║ 5ccd625e-f2b8-11ea-38c1-098e2f31ce53 +q([1, 2]) + +# ╔═║ 60b52f6e-f2b8-11ea-2afc-4be2d4ae3e19 +q(Dual.([1, 2], [1, 0])) # partial wrt x1 + +# ╔═║ 63d5e0be-f2b8-11ea-16e8-d9528b4e8945 +q(Dual.([1, 2], [0, 1])) # partial wrt x2 + +# ╔═║ 85a5c518-f2b8-11ea-2e12-25d16a12e7c8 +ForwardDiff.gradient(q, [1, 2]) + +# ╔═║ eb76e252-fe6e-11ea-0939-c51ff3c73827 +Zygote.gradient((x1, x2) -> (x1^2 + x2^2 - 0.1x1*x2) / (x1 + 1.0), + 0.2, 0.3) + +# ╔═║ 18e151c4-0b0e-485b-81d2-f18a2dd4592d +heatmap(E, flipy=true, yticks=(1:length(s), s), xticks=(1:length(t), t), title="gradient of NW", color=:speed) + +# ╔═║ 79221eee-f2be-11ea-3e43-4596f5ce5694 +md""" +## Application: inverse kinematics of a robot arm + +As an illustration of using gradients, let us study a [simple robot arm](https://appliedgo.net/roboticarm/). This arm consists of three joints that can be moved in the 2D plane. These lengths of the three segments are, respectivly 2, 1 and 1.5 meter. + +The forward kinetics (i.e., going from the angles of the joints to the position of the arms) can be computed by the following functions. +""" + +# ╔═║ fb91a9c4-f2c0-11ea-38c4-5b554446e997 +pos_second_joint((θ₁, ΞΈβ‚‚, θ₃)) = [2cos(θ₁), 2sin(θ₁)] + +# ╔═║ 07c45d78-f2c3-11ea-131e-b9f0b67ca3cd +pos_third_joint((θ₁, ΞΈβ‚‚, θ₃)) = pos_second_joint((θ₁, ΞΈβ‚‚, θ₃)) + [cos( ΞΈβ‚‚), sin( ΞΈβ‚‚)] + +# ╔═║ 33023d10-f2c1-11ea-3375-e9ac23172ab6 +pos_hand((θ₁, ΞΈβ‚‚, θ₃)) = pos_third_joint((θ₁, ΞΈβ‚‚, θ₃)) .+ [1.5cos(θ₃), 1.5sin(θ₃)] + +# ╔═║ 31cdefd2-f381-11ea-3037-e9c023ebc1e9 +md"Suppose that there is a teapot at a certain location we want to grasp with the arm." + +# ╔═║ 4def0626-f2c1-11ea-2f01-31a8c42b121c +position_teapot = [-1, 2.3] + +# ╔═║ 46c54108-f381-11ea-141f-31a696a7a8ef +md"Below is a plot of the arm and the teapot. Can you turn the angles to bring the hand to the position of the teapot?" + +# ╔═║ 8049560e-f383-11ea-1c8e-39c629d20982 +@bind θ₁ Slider(0:0.01:2Ο€, show_value=true) + +# ╔═║ c7b5a1aa-f383-11ea-2a84-8da9c9e60dbc +@bind ΞΈβ‚‚ Slider(0:0.01:2Ο€, show_value=true) + +# ╔═║ cfad1a8c-f383-11ea-3dad-214f3da9485d +@bind θ₃ Slider(0:0.01:2Ο€, show_value=true) + +# ╔═║ 83ddbe6a-f381-11ea-2415-255cbfb2590b +md"First complete a function to determine the distance between the arm and the teapot." + +# ╔═║ 30e9891c-f2c5-11ea-022d-5dbf9c064e43 +distance_to_teapot(ΞΈ) = √(sum(abs2, position_teapot .- pos_hand(ΞΈ))) + +# ╔═║ 5812f84c-f2c1-11ea-0f6c-31b9fedc3704 +begin + psj = pos_second_joint((θ₁, ΞΈβ‚‚, θ₃)) + ptj = pos_third_joint((θ₁, ΞΈβ‚‚, θ₃)) + phand = pos_hand((θ₁, ΞΈβ‚‚, θ₃)) + plot([0, psj[1], ptj[1], phand[1]], [0, psj[2],ptj[2], phand[2]], label="Arm") + scatter!([0], [0], label="First joint (fixed)") + scatter!([psj[1]], [psj[2]], label="Second joint") + scatter!([ptj[1]], [ptj[2]], label="Second joint") + scatter!([phand[1]], [phand[2]], label="Hand") + scatter!([position_teapot[1]], [position_teapot[2]], m=:star, label="teapot") + title!("Distance to teapot = $(distance_to_teapot((θ₁, ΞΈβ‚‚, θ₃)))") + xlims!(-5, 5) + ylims!(-5, 5) +end + +# ╔═║ b07cb958-f381-11ea-3378-5517440464ca +md"Can you use gradients to position the arm?" + +# ╔═║ eaac2514-f8fe-11ea-2229-81f5b59f58fe +distance_to_teapot([θ₁, ΞΈβ‚‚, θ₃]) + +# ╔═║ fb044216-f381-11ea-2faf-fd53dad74950 +distance_to_teapot'([θ₁, ΞΈβ‚‚, θ₃]) + +# ╔═║ 675b222c-f382-11ea-257a-afcb5a5afdd8 +begin + # initial value of ΞΈ + ΞΈs = [0.0, 0.0, 0.0] + for i in 1:500 # 500 steps, decaying + ΞΈs .-= 1/i * distance_to_teapot'(ΞΈs) + end +end + +# ╔═║ 818c1f9e-ff1b-11ea-097f-cba2f30af994 +ΞΈs # optimal values + +# ╔═║ 7aff4178-bcac-4cfa-ab22-de3506cf73a8 +distance_to_teapot(ΞΈs) + +# ╔═║ 881dedd4-f385-11ea-342e-a3700e90ac66 +md""" +## Exercise + +Consider the *Wheeler's Ridge* function (also called "the banana function"): + +$$f(\mathbf{x}) = -\exp(-(x_1 x_2 - a)^2 -(x_2 -a)^2)\,,$$ + +at the point $\mathbf{x}_0=[1.5, 1]^T$. We set $a=1.5$. + +Implement this function. +""" + + +# ╔═║ c1e19e26-f385-11ea-17b6-6d2d2e5cb7c0 +fwr(x; a=1.5) = missing + +# ╔═║ fe18a0a0-f8fe-11ea-1595-4d95256dabca +fwr([1,2]) isa Missing || contour(-0:0.1:3, -0:0.1:3, (x1, x2) -> fwr([x1, x2]), color=:speed) + +# ╔═║ df5f20d8-f385-11ea-104d-9b9e7b094eb7 +md""" + +**Assignments** + +1. Compute the gradient by hand. +2. Compute the gradient using symbolic differentiation. +2. Find the gradient and Hessian at $\mathbf{x}_0$ by numerical differentiation. +3. Compute the gradient and Hessian at $\mathbf{x}_0$ using automatic differentiation. +4. (optional) Use the function `quiver!` to draw the gradient as a vector field on the contour plot. + +""" + +# ╔═║ e4a088f0-f385-11ea-00da-b12e40e4357f +xβ‚€ = [1.5, 1.0] # btw written as x\_0 + +# ╔═║ ec87028b-d9d4-4dc7-9dd5-36eaa1dd49d4 +fwr(xβ‚€) + +# ╔═║ ddd214d8-608a-4123-973f-b331c6ab331a +md"Symbolic" + +# ╔═║ 8f3fecac-f8fd-11ea-136d-1513f60ee3ed + + +# ╔═║ f8863a18-f385-11ea-0965-0f074e58d9b2 + + +# ╔═║ 4c3817f6-396e-4485-a7dd-0f507cec124a +md"Numberic" + +# ╔═║ 78b72cb1-52f3-4dc3-a721-b8a89a24312e + + +# ╔═║ 7180e310-a6f7-4feb-aff3-28e1c772b441 + + +# ╔═║ 02b42a67-7ebe-4ca2-ac55-aa481b30e997 +md"Forward (dual numbers)" + +# ╔═║ 043e3e2f-3876-41c0-bf70-5ef53b5db986 + + +# ╔═║ 8ba368c9-3b04-469e-9556-1573cbc52185 + + +# ╔═║ 4da4a1b6-b7c8-432d-86ed-c45a499a1880 + + +# ╔═║ c573ba19-4be5-4afd-b9f5-8b75e9b18ad6 +md"Reverse" + +# ╔═║ 639528b1-ecff-4a05-ae56-9a08b779edc1 + + +# ╔═║ 838292fc-2c0e-4bb9-9df9-6cd197c4a4fd + + +# ╔═║ ca20cc75-3033-4bd1-bb5c-cae61c855de7 + + +# ╔═║ 34d48ec0-f2b9-11ea-147e-d3554a9fcc04 +md""" +# References + +- Gunes et. al. (2015) *Automatic differentiation in machine learning: a survey* +- Kochenderfer, M. J. and Wheeler, T., '*Algorithms for Optimization*'. MIT Press (2019) +""" + +# ╔═║ 0a576c65-3685-4987-93f1-980ace78d6f4 +module Solution + + export diff_fordiff, diff_centrdiff, diff_complstep + + diff_fordiff(f, x; h=1e-10) = (f(x + h) - f(x)) / h + diff_centrdiff(f, x; h=1e-10) = (f(x + h) - f(x - h)) / 2h + diff_complstep(f, x; h=1e-10) = imag(f(x + im * h)) / h + + +end + +# ╔═║ 91aff94e-e77e-4810-82ad-fe5ab3eafdad +md"Show solution dual numbers: $(@bind show_dual_sol CheckBox())" + +# ╔═║ 8eb9ed90-981b-4094-baec-a521614fb3a1 +if show_dual_sol + md"solution dual numbers: +```julia + Base.:sin(a::Dual) = Dual(sin(a.v), cos(a.v) * a.vdot) + Base.:cos(a::Dual) = Dual(cos(a.v), -sin(a.v) * a.vdot) + Base.:exp(a::Dual) = Dual(exp(a.v), exp(a.v) * a.vdot) + Base.:log(a::Dual) = Dual(log(a.v), 1.0 / a.v * a.vdot) +```" +end + +# ╔═║ d682439b-bc6b-456d-8b5d-2489d095e55f +md"Show solution quiver plot: $(@bind show_quiver_sol CheckBox())" + +# ╔═║ 2d4c0bf6-3936-449d-8341-56f9c5659a6e +if show_quiver_sol + md"solution quiver plot: +```julia + x1vals, x2vals = -0:0.5:4, -0:0.5:3 + + contour(-0.1:0.1:4, -0.1:0.1:3, (x1, x2) -> fwr([x1, x2]), + color=:speed) + + quiver!([x1 for x1 in x1vals for x2 in x2vals], + [x2 for x1 in x1vals for x2 in x2vals], + quiver=(x1,x2)->0.25.*fwr'((x1,x2))) + xlabel!(\"x_1\") + ylabel!(\"x_2\") +```" +end + +# ╔═║ fe4dfa5c-ea26-4f7c-aa68-7b3ec5f45bdc +begin + myblue = "#304da5" + mygreen = "#2a9d8f" + myyellow = "#e9c46a" + myorange = "#f4a261" + myred = "#e76f51" + myblack = "#50514F" + + mycolors = [myblue, myred, mygreen, myorange, myyellow] +end; + +# ╔═║ c25c9a89-69bd-4dd8-b710-5e66f68346b4 +plots = Dict() + +# ╔═║ 2e00ef04-f2b3-11ea-1960-8136321c71db +plots["example_diff"] = plot(f, 1, 5, label="f(x)", color=myblue, lw=2) + +# ╔═║ fd9ed266-f2b4-11ea-3c53-3bd2fe30a7f1 +let + fexamp(x) = 64x*(1-x)*(1-2x)^2*(1-8x+8x^2)^2 + #dfexamp = diff(fexamp(x), x) + dfexamp = build_function(expand_derivatives(Dx(fexamp(x))), x) |> eval + error(diff, h; x=1.0) = max(abs(Float64(dfexamp(x)) - diff(fexamp, x, h=h)), 1e-50) + stepsizes = map(t->10.0^t, -20:0.1:-1); + p = plot(stepsizes, error.(Solution.diff_fordiff, stepsizes), label="forward difference", + xscale=:log10, yscale=:log10, lw=2, legend=:bottomright, color=myblue) + plot!(stepsizes, error.(Solution.diff_centrdiff, stepsizes), label="central difference", lw=2, color=myred) + plot!(stepsizes, error.(Solution.diff_complstep, stepsizes), label="complex step", lw=2, + color=myyellow) + xlabel!("\$h\$") + ylabel!("absolute error") + plots["numdiff_error"] = p +end + +# ╔═║ 00000000-0000-0000-0000-000000000001 +PLUTO_PROJECT_TOML_CONTENTS = """ +[deps] +ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" +LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" +Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" +PlutoUI = "7f904dfe-b85e-4ff6-b463-dae2292396a8" +Symbolics = "0c5d862f-8b57-4792-8d23-62f2024744c7" +Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f" + +[compat] +ForwardDiff = "~0.10.38" +Plots = "~1.40.9" +PlutoUI = "~0.7.60" +Symbolics = "~6.22.0" +Zygote = "~0.6.73" +""" + +# ╔═║ 00000000-0000-0000-0000-000000000002 +PLUTO_MANIFEST_TOML_CONTENTS = """ +# This file is machine-generated - editing it directly is not advised + +julia_version = "1.10.3" +manifest_format = "2.0" +project_hash = "29d55badf1f136800f39c64b6df5aaf1ad1aa178" + +[[deps.ADTypes]] +git-tree-sha1 = "72af59f5b8f09faee36b4ec48e014a79210f2f4f" +uuid = "47edcb42-4c32-4615-8424-f2b9edc5f35b" +version = "1.11.0" + + [deps.ADTypes.extensions] + ADTypesChainRulesCoreExt = "ChainRulesCore" + ADTypesConstructionBaseExt = "ConstructionBase" + ADTypesEnzymeCoreExt = "EnzymeCore" + + [deps.ADTypes.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + ConstructionBase = "187b0558-2788-49d3-abe0-74a17ed4e7c9" + EnzymeCore = "f151be2c-9106-41f4-ab19-57ee4f262869" + +[[deps.AbstractFFTs]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "d92ad398961a3ed262d8bf04a1a2b8340f915fef" +uuid = "621f4979-c628-5d54-868e-fcf4e3e8185c" +version = "1.5.0" +weakdeps = ["ChainRulesCore", "Test"] + + [deps.AbstractFFTs.extensions] + AbstractFFTsChainRulesCoreExt = "ChainRulesCore" + AbstractFFTsTestExt = "Test" + +[[deps.AbstractPlutoDingetjes]] +deps = ["Pkg"] +git-tree-sha1 = "6e1d2a35f2f90a4bc7c2ed98079b2ba09c35b83a" +uuid = "6e696c72-6542-2067-7265-42206c756150" +version = "1.3.2" + +[[deps.AbstractTrees]] +git-tree-sha1 = "2d9c9a55f9c93e8887ad391fbae72f8ef55e1177" +uuid = "1520ce14-60c1-5f80-bbc7-55ef81b5835c" +version = "0.4.5" + +[[deps.Accessors]] +deps = ["CompositionsBase", "ConstructionBase", "InverseFunctions", "LinearAlgebra", "MacroTools", "Markdown"] +git-tree-sha1 = "96bed9b1b57cf750cca50c311a197e306816a1cc" +uuid = "7d9f7c33-5ae7-4f3b-8dc6-eff91059b697" +version = "0.1.39" + + [deps.Accessors.extensions] + AccessorsAxisKeysExt = "AxisKeys" + AccessorsDatesExt = "Dates" + AccessorsIntervalSetsExt = "IntervalSets" + AccessorsStaticArraysExt = "StaticArrays" + AccessorsStructArraysExt = "StructArrays" + AccessorsTestExt = "Test" + AccessorsUnitfulExt = "Unitful" + + [deps.Accessors.weakdeps] + AxisKeys = "94b1ba4f-4ee9-5380-92f1-94cde586c3c5" + Dates = "ade2ca70-3891-5945-98fb-dc099432e06a" + IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953" + Requires = "ae029012-a4dd-5104-9daa-d747884805df" + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + StructArrays = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" + Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" + +[[deps.Adapt]] +deps = ["LinearAlgebra", "Requires"] +git-tree-sha1 = "50c3c56a52972d78e8be9fd135bfb91c9574c140" +uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" +version = "4.1.1" +weakdeps = ["StaticArrays"] + + [deps.Adapt.extensions] + AdaptStaticArraysExt = "StaticArrays" + +[[deps.AliasTables]] +deps = ["PtrArrays", "Random"] +git-tree-sha1 = "9876e1e164b144ca45e9e3198d0b689cadfed9ff" +uuid = "66dad0bd-aa9a-41b7-9441-69ab47430ed8" +version = "1.1.3" + +[[deps.ArgTools]] +uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" +version = "1.1.1" + +[[deps.ArrayInterface]] +deps = ["Adapt", "LinearAlgebra"] +git-tree-sha1 = "d5140b60b87473df18cf4fe66382b7c3596df047" +uuid = "4fba245c-0d91-5ea0-9b3e-6abc04ee57a9" +version = "7.17.1" + + [deps.ArrayInterface.extensions] + ArrayInterfaceBandedMatricesExt = "BandedMatrices" + ArrayInterfaceBlockBandedMatricesExt = "BlockBandedMatrices" + ArrayInterfaceCUDAExt = "CUDA" + ArrayInterfaceCUDSSExt = "CUDSS" + ArrayInterfaceChainRulesCoreExt = "ChainRulesCore" + ArrayInterfaceChainRulesExt = "ChainRules" + ArrayInterfaceGPUArraysCoreExt = "GPUArraysCore" + ArrayInterfaceReverseDiffExt = "ReverseDiff" + ArrayInterfaceSparseArraysExt = "SparseArrays" + ArrayInterfaceStaticArraysCoreExt = "StaticArraysCore" + ArrayInterfaceTrackerExt = "Tracker" + + [deps.ArrayInterface.weakdeps] + BandedMatrices = "aae01518-5342-5314-be14-df237901396f" + BlockBandedMatrices = "ffab5731-97b5-5995-9138-79e8c1846df0" + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + CUDSS = "45b445bb-4962-46a0-9369-b4df9d0f772e" + ChainRules = "082447d4-558c-5d27-93f4-14fc19e9eca2" + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + GPUArraysCore = "46192b85-c4d5-4398-a991-12ede77f4527" + ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + StaticArraysCore = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" + Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" + +[[deps.Artifacts]] +uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" + +[[deps.Atomix]] +deps = ["UnsafeAtomics"] +git-tree-sha1 = "c3b238aa28c1bebd4b5ea4988bebf27e9a01b72b" +uuid = "a9b6321e-bd34-4604-b9c9-b65b8de01458" +version = "1.0.1" + + [deps.Atomix.extensions] + AtomixCUDAExt = "CUDA" + AtomixMetalExt = "Metal" + AtomixoneAPIExt = "oneAPI" + + [deps.Atomix.weakdeps] + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + Metal = "dde4c033-4e86-420c-a63e-0dd931031962" + oneAPI = "8f75cd03-7ff8-4ecb-9b8f-daf728133b1b" + +[[deps.Base64]] +uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" + +[[deps.Bijections]] +git-tree-sha1 = "d8b0439d2be438a5f2cd68ec158fe08a7b2595b7" +uuid = "e2ed5e7c-b2de-5872-ae92-c73ca462fb04" +version = "0.1.9" + +[[deps.BitFlags]] +git-tree-sha1 = "0691e34b3bb8be9307330f88d1a3c3f25466c24d" +uuid = "d1d4a3ce-64b1-5f1a-9ba4-7e7e69966f35" +version = "0.1.9" + +[[deps.Bzip2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "8873e196c2eb87962a2048b3b8e08946535864a1" +uuid = "6e34b625-4abd-537c-b88f-471c36dfa7a0" +version = "1.0.8+2" + +[[deps.CEnum]] +git-tree-sha1 = "389ad5c84de1ae7cf0e28e381131c98ea87d54fc" +uuid = "fa961155-64e5-5f13-b03f-caf6b980ea82" +version = "0.5.0" + +[[deps.Cairo_jll]] +deps = ["Artifacts", "Bzip2_jll", "CompilerSupportLibraries_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "JLLWrappers", "LZO_jll", "Libdl", "Pixman_jll", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Zlib_jll", "libpng_jll"] +git-tree-sha1 = "009060c9a6168704143100f36ab08f06c2af4642" +uuid = "83423d85-b0ee-5818-9007-b63ccbeb887a" +version = "1.18.2+1" + +[[deps.ChainRules]] +deps = ["Adapt", "ChainRulesCore", "Compat", "Distributed", "GPUArraysCore", "IrrationalConstants", "LinearAlgebra", "Random", "RealDot", "SparseArrays", "SparseInverseSubset", "Statistics", "StructArrays", "SuiteSparse"] +git-tree-sha1 = "bcffdcaed50d3453673b852f3522404a94b50fad" +uuid = "082447d4-558c-5d27-93f4-14fc19e9eca2" +version = "1.72.1" + +[[deps.ChainRulesCore]] +deps = ["Compat", "LinearAlgebra"] +git-tree-sha1 = "3e4b134270b372f2ed4d4d0e936aabaefc1802bc" +uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" +version = "1.25.0" +weakdeps = ["SparseArrays"] + + [deps.ChainRulesCore.extensions] + ChainRulesCoreSparseArraysExt = "SparseArrays" + +[[deps.CodecZlib]] +deps = ["TranscodingStreams", "Zlib_jll"] +git-tree-sha1 = "bce6804e5e6044c6daab27bb533d1295e4a2e759" +uuid = "944b1d66-785c-5afd-91f1-9de20f533193" +version = "0.7.6" + +[[deps.ColorSchemes]] +deps = ["ColorTypes", "ColorVectorSpace", "Colors", "FixedPointNumbers", "PrecompileTools", "Random"] +git-tree-sha1 = "c785dfb1b3bfddd1da557e861b919819b82bbe5b" +uuid = "35d6a980-a343-548e-a6ea-1d62b119f2f4" +version = "3.27.1" + +[[deps.ColorTypes]] +deps = ["FixedPointNumbers", "Random"] +git-tree-sha1 = "b10d0b65641d57b8b4d5e234446582de5047050d" +uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f" +version = "0.11.5" + +[[deps.ColorVectorSpace]] +deps = ["ColorTypes", "FixedPointNumbers", "LinearAlgebra", "Requires", "Statistics", "TensorCore"] +git-tree-sha1 = "a1f44953f2382ebb937d60dafbe2deea4bd23249" +uuid = "c3611d14-8923-5661-9e6a-0046d554d3a4" +version = "0.10.0" +weakdeps = ["SpecialFunctions"] + + [deps.ColorVectorSpace.extensions] + SpecialFunctionsExt = "SpecialFunctions" + +[[deps.Colors]] +deps = ["ColorTypes", "FixedPointNumbers", "Reexport"] +git-tree-sha1 = "362a287c3aa50601b0bc359053d5c2468f0e7ce0" +uuid = "5ae59095-9a9b-59fe-a467-6f913c188581" +version = "0.12.11" + +[[deps.Combinatorics]] +git-tree-sha1 = "08c8b6831dc00bfea825826be0bc8336fc369860" +uuid = "861a8166-3701-5b0c-9a16-15d98fcdc6aa" +version = "1.0.2" + +[[deps.CommonSolve]] +git-tree-sha1 = "0eee5eb66b1cf62cd6ad1b460238e60e4b09400c" +uuid = "38540f10-b2f7-11e9-35d8-d573e4eb0ff2" +version = "0.2.4" + +[[deps.CommonSubexpressions]] +deps = ["MacroTools"] +git-tree-sha1 = "cda2cfaebb4be89c9084adaca7dd7333369715c5" +uuid = "bbf7d656-a473-5ed7-a52c-81e309532950" +version = "0.3.1" + +[[deps.CommonWorldInvalidations]] +git-tree-sha1 = "ae52d1c52048455e85a387fbee9be553ec2b68d0" +uuid = "f70d9fcc-98c5-4d4a-abd7-e4cdeebd8ca8" +version = "1.0.0" + +[[deps.Compat]] +deps = ["TOML", "UUIDs"] +git-tree-sha1 = "8ae8d32e09f0dcf42a36b90d4e17f5dd2e4c4215" +uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" +version = "4.16.0" +weakdeps = ["Dates", "LinearAlgebra"] + + [deps.Compat.extensions] + CompatLinearAlgebraExt = "LinearAlgebra" + +[[deps.CompilerSupportLibraries_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" +version = "1.1.1+0" + +[[deps.CompositeTypes]] +git-tree-sha1 = "bce26c3dab336582805503bed209faab1c279768" +uuid = "b152e2b5-7a66-4b01-a709-34e65c35f657" +version = "0.1.4" + +[[deps.CompositionsBase]] +git-tree-sha1 = "802bb88cd69dfd1509f6670416bd4434015693ad" +uuid = "a33af91c-f02d-484b-be07-31d278c5ca2b" +version = "0.1.2" +weakdeps = ["InverseFunctions"] + + [deps.CompositionsBase.extensions] + CompositionsBaseInverseFunctionsExt = "InverseFunctions" + +[[deps.ConcurrentUtilities]] +deps = ["Serialization", "Sockets"] +git-tree-sha1 = "ea32b83ca4fefa1768dc84e504cc0a94fb1ab8d1" +uuid = "f0e56b4a-5159-44fe-b623-3e5288b988bb" +version = "2.4.2" + +[[deps.ConstructionBase]] +git-tree-sha1 = "76219f1ed5771adbb096743bff43fb5fdd4c1157" +uuid = "187b0558-2788-49d3-abe0-74a17ed4e7c9" +version = "1.5.8" +weakdeps = ["IntervalSets", "LinearAlgebra", "StaticArrays"] + + [deps.ConstructionBase.extensions] + ConstructionBaseIntervalSetsExt = "IntervalSets" + ConstructionBaseLinearAlgebraExt = "LinearAlgebra" + ConstructionBaseStaticArraysExt = "StaticArrays" + +[[deps.Contour]] +git-tree-sha1 = "439e35b0b36e2e5881738abc8857bd92ad6ff9a8" +uuid = "d38c429a-6771-53c6-b99e-75d170b6e991" +version = "0.6.3" + +[[deps.DataAPI]] +git-tree-sha1 = "abe83f3a2f1b857aac70ef8b269080af17764bbe" +uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a" +version = "1.16.0" + +[[deps.DataStructures]] +deps = ["Compat", "InteractiveUtils", "OrderedCollections"] +git-tree-sha1 = "1d0a14036acb104d9e89698bd408f63ab58cdc82" +uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" +version = "0.18.20" + +[[deps.DataValueInterfaces]] +git-tree-sha1 = "bfc1187b79289637fa0ef6d4436ebdfe6905cbd6" +uuid = "e2d170a0-9d28-54be-80f0-106bbe20a464" +version = "1.0.0" + +[[deps.Dates]] +deps = ["Printf"] +uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" + +[[deps.Dbus_jll]] +deps = ["Artifacts", "Expat_jll", "JLLWrappers", "Libdl"] +git-tree-sha1 = "fc173b380865f70627d7dd1190dc2fce6cc105af" +uuid = "ee1fde0b-3d02-5ea6-8484-8dfef6360eab" +version = "1.14.10+0" + +[[deps.DelimitedFiles]] +deps = ["Mmap"] +git-tree-sha1 = "9e2f36d3c96a820c678f2f1f1782582fcf685bae" +uuid = "8bb1440f-4735-579b-a4ab-409b98df4dab" +version = "1.9.1" + +[[deps.DiffResults]] +deps = ["StaticArraysCore"] +git-tree-sha1 = "782dd5f4561f5d267313f23853baaaa4c52ea621" +uuid = "163ba53b-c6d8-5494-b064-1a9d43ac40c5" +version = "1.1.0" + +[[deps.DiffRules]] +deps = ["IrrationalConstants", "LogExpFunctions", "NaNMath", "Random", "SpecialFunctions"] +git-tree-sha1 = "23163d55f885173722d1e4cf0f6110cdbaf7e272" +uuid = "b552c78f-8df3-52c6-915a-8e097449b14b" +version = "1.15.1" + +[[deps.Distributed]] +deps = ["Random", "Serialization", "Sockets"] +uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" + +[[deps.Distributions]] +deps = ["AliasTables", "FillArrays", "LinearAlgebra", "PDMats", "Printf", "QuadGK", "Random", "SpecialFunctions", "Statistics", "StatsAPI", "StatsBase", "StatsFuns"] +git-tree-sha1 = "3101c32aab536e7a27b1763c0797dba151b899ad" +uuid = "31c24e10-a181-5473-b8eb-7969acd0382f" +version = "0.25.113" + + [deps.Distributions.extensions] + DistributionsChainRulesCoreExt = "ChainRulesCore" + DistributionsDensityInterfaceExt = "DensityInterface" + DistributionsTestExt = "Test" + + [deps.Distributions.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + DensityInterface = "b429d917-457f-4dbc-8f4c-0cc954292b1d" + Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[[deps.DocStringExtensions]] +deps = ["LibGit2"] +git-tree-sha1 = "2fb1e02f2b635d0845df5d7c167fec4dd739b00d" +uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" +version = "0.9.3" + +[[deps.DomainSets]] +deps = ["CompositeTypes", "IntervalSets", "LinearAlgebra", "Random", "StaticArrays"] +git-tree-sha1 = "490392af2c7d63183bfa2c8aaa6ab981c5ba7561" +uuid = "5b8099bc-c8ec-5219-889f-1d9e522a28bf" +version = "0.7.14" + + [deps.DomainSets.extensions] + DomainSetsMakieExt = "Makie" + + [deps.DomainSets.weakdeps] + Makie = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a" + +[[deps.Downloads]] +deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] +uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" +version = "1.6.0" + +[[deps.DynamicPolynomials]] +deps = ["Future", "LinearAlgebra", "MultivariatePolynomials", "MutableArithmetics", "Reexport", "Test"] +git-tree-sha1 = "9a3ae38b460449cc9e7dd0cfb059c76028724627" +uuid = "7c1d4256-1411-5781-91ec-d7bc3513ac07" +version = "0.6.1" + +[[deps.EnumX]] +git-tree-sha1 = "bdb1942cd4c45e3c678fd11569d5cccd80976237" +uuid = "4e289a0a-7415-4d19-859d-a7e5c4648b56" +version = "1.0.4" + +[[deps.EpollShim_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "8a4be429317c42cfae6a7fc03c31bad1970c310d" +uuid = "2702e6a9-849d-5ed8-8c21-79e8b8f9ee43" +version = "0.0.20230411+1" + +[[deps.ExceptionUnwrapping]] +deps = ["Test"] +git-tree-sha1 = "d36f682e590a83d63d1c7dbd287573764682d12a" +uuid = "460bff9d-24e4-43bc-9d9f-a8973cb893f4" +version = "0.1.11" + +[[deps.Expat_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "e51db81749b0777b2147fbe7b783ee79045b8e99" +uuid = "2e619515-83b5-522b-bb60-26c02a35a201" +version = "2.6.4+1" + +[[deps.ExprTools]] +git-tree-sha1 = "27415f162e6028e81c72b82ef756bf321213b6ec" +uuid = "e2ba6199-217a-4e67-a87a-7c52f15ade04" +version = "0.1.10" + +[[deps.Expronicon]] +deps = ["MLStyle", "Pkg", "TOML"] +git-tree-sha1 = "fc3951d4d398b5515f91d7fe5d45fc31dccb3c9b" +uuid = "6b7a57c9-7cc1-4fdf-b7f5-e857abae3636" +version = "0.8.5" + +[[deps.FFMPEG]] +deps = ["FFMPEG_jll"] +git-tree-sha1 = "53ebe7511fa11d33bec688a9178fac4e49eeee00" +uuid = "c87230d0-a227-11e9-1b43-d7ebe4e7570a" +version = "0.4.2" + +[[deps.FFMPEG_jll]] +deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "JLLWrappers", "LAME_jll", "Libdl", "Ogg_jll", "OpenSSL_jll", "Opus_jll", "PCRE2_jll", "Zlib_jll", "libaom_jll", "libass_jll", "libfdk_aac_jll", "libvorbis_jll", "x264_jll", "x265_jll"] +git-tree-sha1 = "466d45dc38e15794ec7d5d63ec03d776a9aff36e" +uuid = "b22a6f82-2f65-5046-a5b2-351ab43fb4e5" +version = "4.4.4+1" + +[[deps.FileWatching]] +uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" + +[[deps.FillArrays]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "6a70198746448456524cb442b8af316927ff3e1a" +uuid = "1a297f60-69ca-5386-bcde-b61e274b549b" +version = "1.13.0" +weakdeps = ["PDMats", "SparseArrays", "Statistics"] + + [deps.FillArrays.extensions] + FillArraysPDMatsExt = "PDMats" + FillArraysSparseArraysExt = "SparseArrays" + FillArraysStatisticsExt = "Statistics" + +[[deps.FixedPointNumbers]] +deps = ["Statistics"] +git-tree-sha1 = "05882d6995ae5c12bb5f36dd2ed3f61c98cbb172" +uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" +version = "0.8.5" + +[[deps.Fontconfig_jll]] +deps = ["Artifacts", "Bzip2_jll", "Expat_jll", "FreeType2_jll", "JLLWrappers", "Libdl", "Libuuid_jll", "Zlib_jll"] +git-tree-sha1 = "21fac3c77d7b5a9fc03b0ec503aa1a6392c34d2b" +uuid = "a3f928ae-7b40-5064-980b-68af3947d34b" +version = "2.15.0+0" + +[[deps.Format]] +git-tree-sha1 = "9c68794ef81b08086aeb32eeaf33531668d5f5fc" +uuid = "1fa38f19-a742-5d3f-a2b9-30dd87b9d5f8" +version = "1.3.7" + +[[deps.ForwardDiff]] +deps = ["CommonSubexpressions", "DiffResults", "DiffRules", "LinearAlgebra", "LogExpFunctions", "NaNMath", "Preferences", "Printf", "Random", "SpecialFunctions"] +git-tree-sha1 = "a2df1b776752e3f344e5116c06d75a10436ab853" +uuid = "f6369f11-7733-5829-9624-2563aa707210" +version = "0.10.38" +weakdeps = ["StaticArrays"] + + [deps.ForwardDiff.extensions] + ForwardDiffStaticArraysExt = "StaticArrays" + +[[deps.FreeType2_jll]] +deps = ["Artifacts", "Bzip2_jll", "JLLWrappers", "Libdl", "Zlib_jll"] +git-tree-sha1 = "786e968a8d2fb167f2e4880baba62e0e26bd8e4e" +uuid = "d7e528f0-a631-5988-bf34-fe36492bcfd7" +version = "2.13.3+1" + +[[deps.FriBidi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "1ed150b39aebcc805c26b93a8d0122c940f64ce2" +uuid = "559328eb-81f9-559d-9380-de523a88c83c" +version = "1.0.14+0" + +[[deps.FunctionWrappers]] +git-tree-sha1 = "d62485945ce5ae9c0c48f124a84998d755bae00e" +uuid = "069b7b12-0de2-55c6-9aab-29f3d0a68a2e" +version = "1.1.3" + +[[deps.FunctionWrappersWrappers]] +deps = ["FunctionWrappers"] +git-tree-sha1 = "b104d487b34566608f8b4e1c39fb0b10aa279ff8" +uuid = "77dc65aa-8811-40c2-897b-53d922fa7daf" +version = "0.1.3" + +[[deps.Future]] +deps = ["Random"] +uuid = "9fa8497b-333b-5362-9e8d-4d0656e87820" + +[[deps.GLFW_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libglvnd_jll", "Xorg_libXcursor_jll", "Xorg_libXi_jll", "Xorg_libXinerama_jll", "Xorg_libXrandr_jll", "libdecor_jll", "xkbcommon_jll"] +git-tree-sha1 = "532f9126ad901533af1d4f5c198867227a7bb077" +uuid = "0656b61e-2033-5cc2-a64a-77c0f6c09b89" +version = "3.4.0+1" + +[[deps.GPUArrays]] +deps = ["Adapt", "GPUArraysCore", "KernelAbstractions", "LLVM", "LinearAlgebra", "Printf", "Random", "Reexport", "Serialization", "Statistics"] +git-tree-sha1 = "4ec797b1b2ee964de0db96f10cce05b81f23e108" +uuid = "0c68f7d7-f131-5f86-a1c3-88cf8149b2d7" +version = "11.1.0" + +[[deps.GPUArraysCore]] +deps = ["Adapt"] +git-tree-sha1 = "83cf05ab16a73219e5f6bd1bdfa9848fa24ac627" +uuid = "46192b85-c4d5-4398-a991-12ede77f4527" +version = "0.2.0" + +[[deps.GR]] +deps = ["Artifacts", "Base64", "DelimitedFiles", "Downloads", "GR_jll", "HTTP", "JSON", "Libdl", "LinearAlgebra", "Preferences", "Printf", "Qt6Wayland_jll", "Random", "Serialization", "Sockets", "TOML", "Tar", "Test", "p7zip_jll"] +git-tree-sha1 = "52adc6828958ea8a0cf923d53aa10773dbca7d5f" +uuid = "28b8d3ca-fb5f-59d9-8090-bfdbd6d07a71" +version = "0.73.9" + +[[deps.GR_jll]] +deps = ["Artifacts", "Bzip2_jll", "Cairo_jll", "FFMPEG_jll", "Fontconfig_jll", "FreeType2_jll", "GLFW_jll", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Libtiff_jll", "Pixman_jll", "Qt6Base_jll", "Zlib_jll", "libpng_jll"] +git-tree-sha1 = "4e9e2966af45b06f24fd952285841428f1d6e858" +uuid = "d2c73de3-f751-5644-a686-071e5b155ba9" +version = "0.73.9+0" + +[[deps.Gettext_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Libiconv_jll", "Pkg", "XML2_jll"] +git-tree-sha1 = "9b02998aba7bf074d14de89f9d37ca24a1a0b046" +uuid = "78b55507-aeef-58d4-861c-77aaff3498b1" +version = "0.21.0+0" + +[[deps.Glib_jll]] +deps = ["Artifacts", "Gettext_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Libiconv_jll", "Libmount_jll", "PCRE2_jll", "Zlib_jll"] +git-tree-sha1 = "48b5d4c75b2c9078ead62e345966fa51a25c05ad" +uuid = "7746bdde-850d-59dc-9ae8-88ece973131d" +version = "2.82.2+1" + +[[deps.Graphite2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "01979f9b37367603e2848ea225918a3b3861b606" +uuid = "3b182d85-2403-5c21-9c21-1e1f0cc25472" +version = "1.3.14+1" + +[[deps.Grisu]] +git-tree-sha1 = "53bb909d1151e57e2484c3d1b53e19552b887fb2" +uuid = "42e2da0e-8278-4e71-bc24-59509adca0fe" +version = "1.0.2" + +[[deps.HTTP]] +deps = ["Base64", "CodecZlib", "ConcurrentUtilities", "Dates", "ExceptionUnwrapping", "Logging", "LoggingExtras", "MbedTLS", "NetworkOptions", "OpenSSL", "PrecompileTools", "Random", "SimpleBufferStream", "Sockets", "URIs", "UUIDs"] +git-tree-sha1 = "627fcacdb7cb51dc67f557e1598cdffe4dda386d" +uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3" +version = "1.10.14" + +[[deps.HarfBuzz_jll]] +deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "Graphite2_jll", "JLLWrappers", "Libdl", "Libffi_jll"] +git-tree-sha1 = "55c53be97790242c29031e5cd45e8ac296dadda3" +uuid = "2e76f6c2-a576-52d4-95c1-20adfe4de566" +version = "8.5.0+0" + +[[deps.HypergeometricFunctions]] +deps = ["LinearAlgebra", "OpenLibm_jll", "SpecialFunctions"] +git-tree-sha1 = "b1c2585431c382e3fe5805874bda6aea90a95de9" +uuid = "34004b35-14d8-5ef3-9330-4cdb6864b03a" +version = "0.3.25" + +[[deps.Hyperscript]] +deps = ["Test"] +git-tree-sha1 = "179267cfa5e712760cd43dcae385d7ea90cc25a4" +uuid = "47d2ed2b-36de-50cf-bf87-49c2cf4b8b91" +version = "0.0.5" + +[[deps.HypertextLiteral]] +deps = ["Tricks"] +git-tree-sha1 = "7134810b1afce04bbc1045ca1985fbe81ce17653" +uuid = "ac1192a8-f4b3-4bfe-ba22-af5b92cd3ab2" +version = "0.9.5" + +[[deps.IOCapture]] +deps = ["Logging", "Random"] +git-tree-sha1 = "b6d6bfdd7ce25b0f9b2f6b3dd56b2673a66c8770" +uuid = "b5f81e59-6552-4d32-b1f0-c071b021bf89" +version = "0.2.5" + +[[deps.IRTools]] +deps = ["InteractiveUtils", "MacroTools"] +git-tree-sha1 = "950c3717af761bc3ff906c2e8e52bd83390b6ec2" +uuid = "7869d1d1-7146-5819-86e3-90919afe41df" +version = "0.4.14" + +[[deps.IfElse]] +git-tree-sha1 = "debdd00ffef04665ccbb3e150747a77560e8fad1" +uuid = "615f187c-cbe4-4ef1-ba3b-2fcf58d6d173" +version = "0.1.1" + +[[deps.IntegerMathUtils]] +git-tree-sha1 = "b8ffb903da9f7b8cf695a8bead8e01814aa24b30" +uuid = "18e54dd8-cb9d-406c-a71d-865a43cbb235" +version = "0.1.2" + +[[deps.InteractiveUtils]] +deps = ["Markdown"] +uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" + +[[deps.IntervalSets]] +git-tree-sha1 = "dba9ddf07f77f60450fe5d2e2beb9854d9a49bd0" +uuid = "8197267c-284f-5f27-9208-e0e47529a953" +version = "0.7.10" +weakdeps = ["Random", "RecipesBase", "Statistics"] + + [deps.IntervalSets.extensions] + IntervalSetsRandomExt = "Random" + IntervalSetsRecipesBaseExt = "RecipesBase" + IntervalSetsStatisticsExt = "Statistics" + +[[deps.InverseFunctions]] +git-tree-sha1 = "a779299d77cd080bf77b97535acecd73e1c5e5cb" +uuid = "3587e190-3f89-42d0-90ee-14403ec27112" +version = "0.1.17" +weakdeps = ["Dates", "Test"] + + [deps.InverseFunctions.extensions] + InverseFunctionsDatesExt = "Dates" + InverseFunctionsTestExt = "Test" + +[[deps.IrrationalConstants]] +git-tree-sha1 = "630b497eafcc20001bba38a4651b327dcfc491d2" +uuid = "92d709cd-6900-40b7-9082-c6be49f344b6" +version = "0.2.2" + +[[deps.IteratorInterfaceExtensions]] +git-tree-sha1 = "a3f24677c21f5bbe9d2a714f95dcd58337fb2856" +uuid = "82899510-4779-5014-852e-03e436cf321d" +version = "1.0.0" + +[[deps.JLFzf]] +deps = ["Pipe", "REPL", "Random", "fzf_jll"] +git-tree-sha1 = "71b48d857e86bf7a1838c4736545699974ce79a2" +uuid = "1019f520-868f-41f5-a6de-eb00f4b6a39c" +version = "0.1.9" + +[[deps.JLLWrappers]] +deps = ["Artifacts", "Preferences"] +git-tree-sha1 = "be3dc50a92e5a386872a493a10050136d4703f9b" +uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" +version = "1.6.1" + +[[deps.JSON]] +deps = ["Dates", "Mmap", "Parsers", "Unicode"] +git-tree-sha1 = "31e996f0a15c7b280ba9f76636b3ff9e2ae58c9a" +uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" +version = "0.21.4" + +[[deps.JpegTurbo_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "25ee0be4d43d0269027024d75a24c24d6c6e590c" +uuid = "aacddb02-875f-59d6-b918-886e6ef4fbf8" +version = "3.0.4+0" + +[[deps.KernelAbstractions]] +deps = ["Adapt", "Atomix", "InteractiveUtils", "MacroTools", "PrecompileTools", "Requires", "StaticArrays", "UUIDs"] +git-tree-sha1 = "b9a838cd3028785ac23822cded5126b3da394d1a" +uuid = "63c18a36-062a-441e-b654-da1e3ab1ce7c" +version = "0.9.31" + + [deps.KernelAbstractions.extensions] + EnzymeExt = "EnzymeCore" + LinearAlgebraExt = "LinearAlgebra" + SparseArraysExt = "SparseArrays" + + [deps.KernelAbstractions.weakdeps] + EnzymeCore = "f151be2c-9106-41f4-ab19-57ee4f262869" + LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + +[[deps.LAME_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "170b660facf5df5de098d866564877e119141cbd" +uuid = "c1c5ebd0-6772-5130-a774-d5fcae4a789d" +version = "3.100.2+0" + +[[deps.LERC_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "36bdbc52f13a7d1dcb0f3cd694e01677a515655b" +uuid = "88015f11-f218-50d7-93a8-a6af411a945d" +version = "4.0.0+0" + +[[deps.LLVM]] +deps = ["CEnum", "LLVMExtra_jll", "Libdl", "Preferences", "Printf", "Unicode"] +git-tree-sha1 = "d422dfd9707bec6617335dc2ea3c5172a87d5908" +uuid = "929cbde3-209d-540e-8aea-75f648917ca0" +version = "9.1.3" + + [deps.LLVM.extensions] + BFloat16sExt = "BFloat16s" + + [deps.LLVM.weakdeps] + BFloat16s = "ab4f0b2a-ad5b-11e8-123f-65d77653426b" + +[[deps.LLVMExtra_jll]] +deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl", "TOML"] +git-tree-sha1 = "05a8bd5a42309a9ec82f700876903abce1017dd3" +uuid = "dad2f222-ce93-54a1-a47d-0025e8a3acab" +version = "0.0.34+0" + +[[deps.LLVMOpenMP_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "78211fb6cbc872f77cad3fc0b6cf647d923f4929" +uuid = "1d63c593-3942-5779-bab2-d838dc0a180e" +version = "18.1.7+0" + +[[deps.LZO_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "854a9c268c43b77b0a27f22d7fab8d33cdb3a731" +uuid = "dd4b983a-f0e5-5f8d-a1b7-129d4a5fb1ac" +version = "2.10.2+1" + +[[deps.LaTeXStrings]] +git-tree-sha1 = "dda21b8cbd6a6c40d9d02a73230f9d70fed6918c" +uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" +version = "1.4.0" + +[[deps.Latexify]] +deps = ["Format", "InteractiveUtils", "LaTeXStrings", "MacroTools", "Markdown", "OrderedCollections", "Requires"] +git-tree-sha1 = "ce5f5621cac23a86011836badfedf664a612cee4" +uuid = "23fbe1c1-3f47-55db-b15f-69d7ec21a316" +version = "0.16.5" + + [deps.Latexify.extensions] + DataFramesExt = "DataFrames" + SparseArraysExt = "SparseArrays" + SymEngineExt = "SymEngine" + + [deps.Latexify.weakdeps] + DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + SymEngine = "123dc426-2d89-5057-bbad-38513e3affd8" + +[[deps.LazyArtifacts]] +deps = ["Artifacts", "Pkg"] +uuid = "4af54fe1-eca0-43a8-85a7-787d91b784e3" + +[[deps.LibCURL]] +deps = ["LibCURL_jll", "MozillaCACerts_jll"] +uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" +version = "0.6.4" + +[[deps.LibCURL_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] +uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" +version = "8.4.0+0" + +[[deps.LibGit2]] +deps = ["Base64", "LibGit2_jll", "NetworkOptions", "Printf", "SHA"] +uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" + +[[deps.LibGit2_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll"] +uuid = "e37daf67-58a4-590a-8e99-b0245dd2ffc5" +version = "1.6.4+0" + +[[deps.LibSSH2_jll]] +deps = ["Artifacts", "Libdl", "MbedTLS_jll"] +uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" +version = "1.11.0+1" + +[[deps.Libdl]] +uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" + +[[deps.Libffi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "0b4a5d71f3e5200a7dff793393e09dfc2d874290" +uuid = "e9f186c6-92d2-5b65-8a66-fee21dc1b490" +version = "3.2.2+1" + +[[deps.Libgcrypt_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgpg_error_jll"] +git-tree-sha1 = "8be878062e0ffa2c3f67bb58a595375eda5de80b" +uuid = "d4300ac3-e22c-5743-9152-c294e39db1e4" +version = "1.11.0+0" + +[[deps.Libglvnd_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll", "Xorg_libXext_jll"] +git-tree-sha1 = "ff3b4b9d35de638936a525ecd36e86a8bb919d11" +uuid = "7e76a0d4-f3c7-5321-8279-8d96eeed0f29" +version = "1.7.0+0" + +[[deps.Libgpg_error_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "c6ce1e19f3aec9b59186bdf06cdf3c4fc5f5f3e6" +uuid = "7add5ba3-2f88-524e-9cd5-f83b8a55f7b8" +version = "1.50.0+0" + +[[deps.Libiconv_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "61dfdba58e585066d8bce214c5a51eaa0539f269" +uuid = "94ce4f54-9a6c-5748-9c1c-f9c7231a4531" +version = "1.17.0+1" + +[[deps.Libmount_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "84eef7acd508ee5b3e956a2ae51b05024181dee0" +uuid = "4b2f31a3-9ecc-558c-b454-b3730dcb73e9" +version = "2.40.2+0" + +[[deps.Libtiff_jll]] +deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "LERC_jll", "Libdl", "XZ_jll", "Zlib_jll", "Zstd_jll"] +git-tree-sha1 = "b404131d06f7886402758c9ce2214b636eb4d54a" +uuid = "89763e89-9b03-5906-acba-b20f662cd828" +version = "4.7.0+0" + +[[deps.Libuuid_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "edbf5309f9ddf1cab25afc344b1e8150b7c832f9" +uuid = "38a345b3-de98-5d2b-a5d3-14cd9215e700" +version = "2.40.2+0" + +[[deps.LinearAlgebra]] +deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"] +uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + +[[deps.LogExpFunctions]] +deps = ["DocStringExtensions", "IrrationalConstants", "LinearAlgebra"] +git-tree-sha1 = "13ca9e2586b89836fd20cccf56e57e2b9ae7f38f" +uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688" +version = "0.3.29" + + [deps.LogExpFunctions.extensions] + LogExpFunctionsChainRulesCoreExt = "ChainRulesCore" + LogExpFunctionsChangesOfVariablesExt = "ChangesOfVariables" + LogExpFunctionsInverseFunctionsExt = "InverseFunctions" + + [deps.LogExpFunctions.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + ChangesOfVariables = "9e997f8a-9a97-42d5-a9f1-ce6bfc15e2c0" + InverseFunctions = "3587e190-3f89-42d0-90ee-14403ec27112" + +[[deps.Logging]] +uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" + +[[deps.LoggingExtras]] +deps = ["Dates", "Logging"] +git-tree-sha1 = "f02b56007b064fbfddb4c9cd60161b6dd0f40df3" +uuid = "e6f89c97-d47a-5376-807f-9c37f3926c36" +version = "1.1.0" + +[[deps.MIMEs]] +git-tree-sha1 = "65f28ad4b594aebe22157d6fac869786a255b7eb" +uuid = "6c6e2e6c-3030-632d-7369-2d6c69616d65" +version = "0.1.4" + +[[deps.MLStyle]] +git-tree-sha1 = "bc38dff0548128765760c79eb7388a4b37fae2c8" +uuid = "d8e11817-5142-5d16-987a-aa16d5891078" +version = "0.4.17" + +[[deps.MacroTools]] +deps = ["Markdown", "Random"] +git-tree-sha1 = "2fa9ee3e63fd3a4f7a9a4f4744a52f4856de82df" +uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" +version = "0.5.13" + +[[deps.Markdown]] +deps = ["Base64"] +uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" + +[[deps.MbedTLS]] +deps = ["Dates", "MbedTLS_jll", "MozillaCACerts_jll", "NetworkOptions", "Random", "Sockets"] +git-tree-sha1 = "c067a280ddc25f196b5e7df3877c6b226d390aaf" +uuid = "739be429-bea8-5141-9913-cc70e7f3736d" +version = "1.1.9" + +[[deps.MbedTLS_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" +version = "2.28.2+1" + +[[deps.Measures]] +git-tree-sha1 = "c13304c81eec1ed3af7fc20e75fb6b26092a1102" +uuid = "442fdcdd-2543-5da2-b0f3-8c86c306513e" +version = "0.3.2" + +[[deps.Missings]] +deps = ["DataAPI"] +git-tree-sha1 = "ec4f7fbeab05d7747bdf98eb74d130a2a2ed298d" +uuid = "e1d29d7a-bbdc-5cf2-9ac0-f12de2c33e28" +version = "1.2.0" + +[[deps.Mmap]] +uuid = "a63ad114-7e13-5084-954f-fe012c677804" + +[[deps.MozillaCACerts_jll]] +uuid = "14a3606d-f60d-562e-9121-12d972cd8159" +version = "2023.1.10" + +[[deps.MultivariatePolynomials]] +deps = ["ChainRulesCore", "DataStructures", "LinearAlgebra", "MutableArithmetics"] +git-tree-sha1 = "8d39779e29f80aa6c071e7ac17101c6e31f075d7" +uuid = "102ac46a-7ee4-5c85-9060-abc95bfdeaa3" +version = "0.5.7" + +[[deps.MutableArithmetics]] +deps = ["LinearAlgebra", "SparseArrays", "Test"] +git-tree-sha1 = "a2710df6b0931f987530f59427441b21245d8f5e" +uuid = "d8a4904e-b15c-11e9-3269-09a3773c0cb0" +version = "1.6.0" + +[[deps.NaNMath]] +deps = ["OpenLibm_jll"] +git-tree-sha1 = "0877504529a3e5c3343c6f8b4c0381e57e4387e4" +uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" +version = "1.0.2" + +[[deps.NetworkOptions]] +uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" +version = "1.2.0" + +[[deps.Ogg_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "887579a3eb005446d514ab7aeac5d1d027658b8f" +uuid = "e7412a2a-1a6e-54c0-be00-318e2571c051" +version = "1.3.5+1" + +[[deps.OpenBLAS_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] +uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" +version = "0.3.23+4" + +[[deps.OpenLibm_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "05823500-19ac-5b8b-9628-191a04bc5112" +version = "0.8.1+2" + +[[deps.OpenSSL]] +deps = ["BitFlags", "Dates", "MozillaCACerts_jll", "OpenSSL_jll", "Sockets"] +git-tree-sha1 = "38cb508d080d21dc1128f7fb04f20387ed4c0af4" +uuid = "4d8831e6-92b7-49fb-bdf8-b643e874388c" +version = "1.4.3" + +[[deps.OpenSSL_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "7493f61f55a6cce7325f197443aa80d32554ba10" +uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95" +version = "3.0.15+1" + +[[deps.OpenSpecFun_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "13652491f6856acfd2db29360e1bbcd4565d04f1" +uuid = "efe28fd5-8261-553b-a9e1-b2916fc3738e" +version = "0.5.5+0" + +[[deps.Opus_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "6703a85cb3781bd5909d48730a67205f3f31a575" +uuid = "91d4177d-7536-5919-b921-800302f37372" +version = "1.3.3+0" + +[[deps.OrderedCollections]] +git-tree-sha1 = "12f1439c4f986bb868acda6ea33ebc78e19b95ad" +uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" +version = "1.7.0" + +[[deps.PCRE2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "efcefdf7-47ab-520b-bdef-62a2eaa19f15" +version = "10.42.0+1" + +[[deps.PDMats]] +deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"] +git-tree-sha1 = "949347156c25054de2db3b166c52ac4728cbad65" +uuid = "90014a1f-27ba-587c-ab20-58faa44d9150" +version = "0.11.31" + +[[deps.Pango_jll]] +deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "FriBidi_jll", "Glib_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl"] +git-tree-sha1 = "e127b609fb9ecba6f201ba7ab753d5a605d53801" +uuid = "36c8627f-9965-5494-a995-c6b170f724f3" +version = "1.54.1+0" + +[[deps.Parsers]] +deps = ["Dates", "PrecompileTools", "UUIDs"] +git-tree-sha1 = "8489905bcdbcfac64d1daa51ca07c0d8f0283821" +uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" +version = "2.8.1" + +[[deps.Pipe]] +git-tree-sha1 = "6842804e7867b115ca9de748a0cf6b364523c16d" +uuid = "b98c9c47-44ae-5843-9183-064241ee97a0" +version = "1.3.0" + +[[deps.Pixman_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LLVMOpenMP_jll", "Libdl"] +git-tree-sha1 = "35621f10a7531bc8fa58f74610b1bfb70a3cfc6b" +uuid = "30392449-352a-5448-841d-b1acce4e97dc" +version = "0.43.4+0" + +[[deps.Pkg]] +deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] +uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" +version = "1.10.0" + +[[deps.PlotThemes]] +deps = ["PlotUtils", "Statistics"] +git-tree-sha1 = "41031ef3a1be6f5bbbf3e8073f210556daeae5ca" +uuid = "ccf2f8ad-2431-5c83-bf29-c5338b663b6a" +version = "3.3.0" + +[[deps.PlotUtils]] +deps = ["ColorSchemes", "Colors", "Dates", "PrecompileTools", "Printf", "Random", "Reexport", "StableRNGs", "Statistics"] +git-tree-sha1 = "3ca9a356cd2e113c420f2c13bea19f8d3fb1cb18" +uuid = "995b91a9-d308-5afd-9ec6-746e21dbc043" +version = "1.4.3" + +[[deps.Plots]] +deps = ["Base64", "Contour", "Dates", "Downloads", "FFMPEG", "FixedPointNumbers", "GR", "JLFzf", "JSON", "LaTeXStrings", "Latexify", "LinearAlgebra", "Measures", "NaNMath", "Pkg", "PlotThemes", "PlotUtils", "PrecompileTools", "Printf", "REPL", "Random", "RecipesBase", "RecipesPipeline", "Reexport", "RelocatableFolders", "Requires", "Scratch", "Showoff", "SparseArrays", "Statistics", "StatsBase", "TOML", "UUIDs", "UnicodeFun", "UnitfulLatexify", "Unzip"] +git-tree-sha1 = "dae01f8c2e069a683d3a6e17bbae5070ab94786f" +uuid = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" +version = "1.40.9" + + [deps.Plots.extensions] + FileIOExt = "FileIO" + GeometryBasicsExt = "GeometryBasics" + IJuliaExt = "IJulia" + ImageInTerminalExt = "ImageInTerminal" + UnitfulExt = "Unitful" + + [deps.Plots.weakdeps] + FileIO = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" + GeometryBasics = "5c1252a2-5f33-56bf-86c9-59e7332b4326" + IJulia = "7073ff75-c697-5162-941a-fcdaad2a7d2a" + ImageInTerminal = "d8c32880-2388-543b-8c61-d9f865259254" + Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" + +[[deps.PlutoUI]] +deps = ["AbstractPlutoDingetjes", "Base64", "ColorTypes", "Dates", "FixedPointNumbers", "Hyperscript", "HypertextLiteral", "IOCapture", "InteractiveUtils", "JSON", "Logging", "MIMEs", "Markdown", "Random", "Reexport", "URIs", "UUIDs"] +git-tree-sha1 = "eba4810d5e6a01f612b948c9fa94f905b49087b0" +uuid = "7f904dfe-b85e-4ff6-b463-dae2292396a8" +version = "0.7.60" + +[[deps.PrecompileTools]] +deps = ["Preferences"] +git-tree-sha1 = "5aa36f7049a63a1528fe8f7c3f2113413ffd4e1f" +uuid = "aea7be01-6a6a-4083-8856-8a6e6704d82a" +version = "1.2.1" + +[[deps.Preferences]] +deps = ["TOML"] +git-tree-sha1 = "9306f6085165d270f7e3db02af26a400d580f5c6" +uuid = "21216c6a-2e73-6563-6e65-726566657250" +version = "1.4.3" + +[[deps.Primes]] +deps = ["IntegerMathUtils"] +git-tree-sha1 = "cb420f77dc474d23ee47ca8d14c90810cafe69e7" +uuid = "27ebfcd6-29c5-5fa9-bf4b-fb8fc14df3ae" +version = "0.5.6" + +[[deps.Printf]] +deps = ["Unicode"] +uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" + +[[deps.PtrArrays]] +git-tree-sha1 = "77a42d78b6a92df47ab37e177b2deac405e1c88f" +uuid = "43287f4e-b6f4-7ad1-bb20-aadabca52c3d" +version = "1.2.1" + +[[deps.Qt6Base_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Fontconfig_jll", "Glib_jll", "JLLWrappers", "Libdl", "Libglvnd_jll", "OpenSSL_jll", "Vulkan_Loader_jll", "Xorg_libSM_jll", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Xorg_libxcb_jll", "Xorg_xcb_util_cursor_jll", "Xorg_xcb_util_image_jll", "Xorg_xcb_util_keysyms_jll", "Xorg_xcb_util_renderutil_jll", "Xorg_xcb_util_wm_jll", "Zlib_jll", "libinput_jll", "xkbcommon_jll"] +git-tree-sha1 = "492601870742dcd38f233b23c3ec629628c1d724" +uuid = "c0090381-4147-56d7-9ebc-da0b1113ec56" +version = "6.7.1+1" + +[[deps.Qt6Declarative_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Qt6Base_jll", "Qt6ShaderTools_jll"] +git-tree-sha1 = "e5dd466bf2569fe08c91a2cc29c1003f4797ac3b" +uuid = "629bc702-f1f5-5709-abd5-49b8460ea067" +version = "6.7.1+2" + +[[deps.Qt6ShaderTools_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Qt6Base_jll"] +git-tree-sha1 = "1a180aeced866700d4bebc3120ea1451201f16bc" +uuid = "ce943373-25bb-56aa-8eca-768745ed7b5a" +version = "6.7.1+1" + +[[deps.Qt6Wayland_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Qt6Base_jll", "Qt6Declarative_jll"] +git-tree-sha1 = "729927532d48cf79f49070341e1d918a65aba6b0" +uuid = "e99dba38-086e-5de3-a5b1-6e4c66e897c3" +version = "6.7.1+1" + +[[deps.QuadGK]] +deps = ["DataStructures", "LinearAlgebra"] +git-tree-sha1 = "cda3b045cf9ef07a08ad46731f5a3165e56cf3da" +uuid = "1fd47b50-473d-5c70-9696-f719f8f3bcdc" +version = "2.11.1" + + [deps.QuadGK.extensions] + QuadGKEnzymeExt = "Enzyme" + + [deps.QuadGK.weakdeps] + Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9" + +[[deps.REPL]] +deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] +uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" + +[[deps.Random]] +deps = ["SHA"] +uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" + +[[deps.RealDot]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "9f0a1b71baaf7650f4fa8a1d168c7fb6ee41f0c9" +uuid = "c1ae055f-0cd5-4b69-90a6-9a35b1a98df9" +version = "0.1.0" + +[[deps.RecipesBase]] +deps = ["PrecompileTools"] +git-tree-sha1 = "5c3d09cc4f31f5fc6af001c250bf1278733100ff" +uuid = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" +version = "1.3.4" + +[[deps.RecipesPipeline]] +deps = ["Dates", "NaNMath", "PlotUtils", "PrecompileTools", "RecipesBase"] +git-tree-sha1 = "45cf9fd0ca5839d06ef333c8201714e888486342" +uuid = "01d81517-befc-4cb6-b9ec-a95719d0359c" +version = "0.6.12" + +[[deps.RecursiveArrayTools]] +deps = ["Adapt", "ArrayInterface", "DocStringExtensions", "GPUArraysCore", "IteratorInterfaceExtensions", "LinearAlgebra", "RecipesBase", "StaticArraysCore", "Statistics", "SymbolicIndexingInterface", "Tables"] +git-tree-sha1 = "32f824db4e5bab64e25a12b22483a30a6b813d08" +uuid = "731186ca-8d62-57ce-b412-fbd966d074cd" +version = "3.27.4" + + [deps.RecursiveArrayTools.extensions] + RecursiveArrayToolsFastBroadcastExt = "FastBroadcast" + RecursiveArrayToolsForwardDiffExt = "ForwardDiff" + RecursiveArrayToolsMeasurementsExt = "Measurements" + RecursiveArrayToolsMonteCarloMeasurementsExt = "MonteCarloMeasurements" + RecursiveArrayToolsReverseDiffExt = ["ReverseDiff", "Zygote"] + RecursiveArrayToolsSparseArraysExt = ["SparseArrays"] + RecursiveArrayToolsStructArraysExt = "StructArrays" + RecursiveArrayToolsTrackerExt = "Tracker" + RecursiveArrayToolsZygoteExt = "Zygote" + + [deps.RecursiveArrayTools.weakdeps] + FastBroadcast = "7034ab61-46d4-4ed7-9d0f-46aef9175898" + ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + Measurements = "eff96d63-e80a-5855-80a2-b1b0885c5ab7" + MonteCarloMeasurements = "0987c9cc-fe09-11e8-30f0-b96dd679fdca" + ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + StructArrays = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" + Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" + Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f" + +[[deps.Reexport]] +git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" +uuid = "189a3867-3050-52da-a836-e630ba90ab69" +version = "1.2.2" + +[[deps.RelocatableFolders]] +deps = ["SHA", "Scratch"] +git-tree-sha1 = "ffdaf70d81cf6ff22c2b6e733c900c3321cab864" +uuid = "05181044-ff0b-4ac5-8273-598c1e38db00" +version = "1.0.1" + +[[deps.Requires]] +deps = ["UUIDs"] +git-tree-sha1 = "838a3a4188e2ded87a4f9f184b4b0d78a1e91cb7" +uuid = "ae029012-a4dd-5104-9daa-d747884805df" +version = "1.3.0" + +[[deps.Rmath]] +deps = ["Random", "Rmath_jll"] +git-tree-sha1 = "852bd0f55565a9e973fcfee83a84413270224dc4" +uuid = "79098fc4-a85e-5d69-aa6a-4863f24498fa" +version = "0.8.0" + +[[deps.Rmath_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "58cdd8fb2201a6267e1db87ff148dd6c1dbd8ad8" +uuid = "f50d1b31-88e8-58de-be2c-1cc44531875f" +version = "0.5.1+0" + +[[deps.RuntimeGeneratedFunctions]] +deps = ["ExprTools", "SHA", "Serialization"] +git-tree-sha1 = "04c968137612c4a5629fa531334bb81ad5680f00" +uuid = "7e49a35a-f44a-4d26-94aa-eba1b4ca6b47" +version = "0.5.13" + +[[deps.SHA]] +uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" +version = "0.7.0" + +[[deps.SciMLBase]] +deps = ["ADTypes", "Accessors", "ArrayInterface", "CommonSolve", "ConstructionBase", "Distributed", "DocStringExtensions", "EnumX", "Expronicon", "FunctionWrappersWrappers", "IteratorInterfaceExtensions", "LinearAlgebra", "Logging", "Markdown", "PrecompileTools", "Preferences", "Printf", "RecipesBase", "RecursiveArrayTools", "Reexport", "RuntimeGeneratedFunctions", "SciMLOperators", "SciMLStructures", "StaticArraysCore", "Statistics", "SymbolicIndexingInterface"] +git-tree-sha1 = "87e054302a94a2d087f918ad50b0290977db67e6" +uuid = "0bca4576-84f4-4d90-8ffe-ffa030f20462" +version = "2.67.0" + + [deps.SciMLBase.extensions] + SciMLBaseChainRulesCoreExt = "ChainRulesCore" + SciMLBaseMakieExt = "Makie" + SciMLBasePartialFunctionsExt = "PartialFunctions" + SciMLBasePyCallExt = "PyCall" + SciMLBasePythonCallExt = "PythonCall" + SciMLBaseRCallExt = "RCall" + SciMLBaseZygoteExt = "Zygote" + + [deps.SciMLBase.weakdeps] + ChainRules = "082447d4-558c-5d27-93f4-14fc19e9eca2" + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + Makie = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a" + PartialFunctions = "570af359-4316-4cb7-8c74-252c00c2016b" + PyCall = "438e738f-606a-5dbb-bf0a-cddfbfd45ab0" + PythonCall = "6099a3de-0909-46bc-b1f4-468b9a2dfc0d" + RCall = "6f49c342-dc21-5d91-9882-a32aef131414" + Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f" + +[[deps.SciMLOperators]] +deps = ["Accessors", "ArrayInterface", "DocStringExtensions", "LinearAlgebra", "MacroTools"] +git-tree-sha1 = "6149620767866d4b0f0f7028639b6e661b6a1e44" +uuid = "c0aeaf25-5076-4817-a8d5-81caf7dfa961" +version = "0.3.12" +weakdeps = ["SparseArrays", "StaticArraysCore"] + + [deps.SciMLOperators.extensions] + SciMLOperatorsSparseArraysExt = "SparseArrays" + SciMLOperatorsStaticArraysCoreExt = "StaticArraysCore" + +[[deps.SciMLStructures]] +deps = ["ArrayInterface"] +git-tree-sha1 = "0444a37a25fab98adbd90baa806ee492a3af133a" +uuid = "53ae85a6-f571-4167-b2af-e1d143709226" +version = "1.6.1" + +[[deps.Scratch]] +deps = ["Dates"] +git-tree-sha1 = "3bac05bc7e74a75fd9cba4295cde4045d9fe2386" +uuid = "6c6a2e73-6563-6170-7368-637461726353" +version = "1.2.1" + +[[deps.Serialization]] +uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" + +[[deps.Setfield]] +deps = ["ConstructionBase", "Future", "MacroTools", "StaticArraysCore"] +git-tree-sha1 = "e2cc6d8c88613c05e1defb55170bf5ff211fbeac" +uuid = "efcf1570-3423-57d1-acb7-fd33fddbac46" +version = "1.1.1" + +[[deps.Showoff]] +deps = ["Dates", "Grisu"] +git-tree-sha1 = "91eddf657aca81df9ae6ceb20b959ae5653ad1de" +uuid = "992d4aef-0814-514b-bc4d-f2e9a6c4116f" +version = "1.0.3" + +[[deps.SimpleBufferStream]] +git-tree-sha1 = "f305871d2f381d21527c770d4788c06c097c9bc1" +uuid = "777ac1f9-54b0-4bf8-805c-2214025038e7" +version = "1.2.0" + +[[deps.Sockets]] +uuid = "6462fe0b-24de-5631-8697-dd941f90decc" + +[[deps.SortingAlgorithms]] +deps = ["DataStructures"] +git-tree-sha1 = "66e0a8e672a0bdfca2c3f5937efb8538b9ddc085" +uuid = "a2af1166-a08f-5f64-846c-94a0d3cef48c" +version = "1.2.1" + +[[deps.SparseArrays]] +deps = ["Libdl", "LinearAlgebra", "Random", "Serialization", "SuiteSparse_jll"] +uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" +version = "1.10.0" + +[[deps.SparseInverseSubset]] +deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"] +git-tree-sha1 = "52962839426b75b3021296f7df242e40ecfc0852" +uuid = "dc90abb0-5640-4711-901d-7e5b23a2fada" +version = "0.1.2" + +[[deps.SpecialFunctions]] +deps = ["IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"] +git-tree-sha1 = "64cca0c26b4f31ba18f13f6c12af7c85f478cfde" +uuid = "276daf66-3868-5448-9aa4-cd146d93841b" +version = "2.5.0" +weakdeps = ["ChainRulesCore"] + + [deps.SpecialFunctions.extensions] + SpecialFunctionsChainRulesCoreExt = "ChainRulesCore" + +[[deps.StableRNGs]] +deps = ["Random"] +git-tree-sha1 = "83e6cce8324d49dfaf9ef059227f91ed4441a8e5" +uuid = "860ef19b-820b-49d6-a774-d7a799459cd3" +version = "1.0.2" + +[[deps.StaticArrays]] +deps = ["LinearAlgebra", "PrecompileTools", "Random", "StaticArraysCore"] +git-tree-sha1 = "777657803913ffc7e8cc20f0fd04b634f871af8f" +uuid = "90137ffa-7385-5640-81b9-e52037218182" +version = "1.9.8" +weakdeps = ["ChainRulesCore", "Statistics"] + + [deps.StaticArrays.extensions] + StaticArraysChainRulesCoreExt = "ChainRulesCore" + StaticArraysStatisticsExt = "Statistics" + +[[deps.StaticArraysCore]] +git-tree-sha1 = "192954ef1208c7019899fbf8049e717f92959682" +uuid = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" +version = "1.4.3" + +[[deps.Statistics]] +deps = ["LinearAlgebra", "SparseArrays"] +uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" +version = "1.10.0" + +[[deps.StatsAPI]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "1ff449ad350c9c4cbc756624d6f8a8c3ef56d3ed" +uuid = "82ae8749-77ed-4fe6-ae5f-f523153014b0" +version = "1.7.0" + +[[deps.StatsBase]] +deps = ["AliasTables", "DataAPI", "DataStructures", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"] +git-tree-sha1 = "29321314c920c26684834965ec2ce0dacc9cf8e5" +uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" +version = "0.34.4" + +[[deps.StatsFuns]] +deps = ["HypergeometricFunctions", "IrrationalConstants", "LogExpFunctions", "Reexport", "Rmath", "SpecialFunctions"] +git-tree-sha1 = "b423576adc27097764a90e163157bcfc9acf0f46" +uuid = "4c63d2b9-4356-54db-8cca-17b64c39e42c" +version = "1.3.2" +weakdeps = ["ChainRulesCore", "InverseFunctions"] + + [deps.StatsFuns.extensions] + StatsFunsChainRulesCoreExt = "ChainRulesCore" + StatsFunsInverseFunctionsExt = "InverseFunctions" + +[[deps.StructArrays]] +deps = ["ConstructionBase", "DataAPI", "Tables"] +git-tree-sha1 = "9537ef82c42cdd8c5d443cbc359110cbb36bae10" +uuid = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" +version = "0.6.21" +weakdeps = ["Adapt", "GPUArraysCore", "KernelAbstractions", "LinearAlgebra", "SparseArrays", "StaticArrays"] + + [deps.StructArrays.extensions] + StructArraysAdaptExt = "Adapt" + StructArraysGPUArraysCoreExt = ["GPUArraysCore", "KernelAbstractions"] + StructArraysLinearAlgebraExt = "LinearAlgebra" + StructArraysSparseArraysExt = "SparseArrays" + StructArraysStaticArraysExt = "StaticArrays" + +[[deps.SuiteSparse]] +deps = ["Libdl", "LinearAlgebra", "Serialization", "SparseArrays"] +uuid = "4607b0f0-06f3-5cda-b6b1-a6196a1729e9" + +[[deps.SuiteSparse_jll]] +deps = ["Artifacts", "Libdl", "libblastrampoline_jll"] +uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c" +version = "7.2.1+1" + +[[deps.SymbolicIndexingInterface]] +deps = ["Accessors", "ArrayInterface", "RuntimeGeneratedFunctions", "StaticArraysCore"] +git-tree-sha1 = "8db233b54917e474165d582bef2244fa040e0a56" +uuid = "2efcf032-c050-4f8e-a9bb-153293bab1f5" +version = "0.3.36" + +[[deps.SymbolicLimits]] +deps = ["SymbolicUtils"] +git-tree-sha1 = "fabf4650afe966a2ba646cabd924c3fd43577fc3" +uuid = "19f23fe9-fdab-4a78-91af-e7b7767979c3" +version = "0.2.2" + +[[deps.SymbolicUtils]] +deps = ["AbstractTrees", "ArrayInterface", "Bijections", "ChainRulesCore", "Combinatorics", "ConstructionBase", "DataStructures", "DocStringExtensions", "DynamicPolynomials", "IfElse", "LinearAlgebra", "MultivariatePolynomials", "NaNMath", "Setfield", "SparseArrays", "SpecialFunctions", "StaticArrays", "SymbolicIndexingInterface", "TermInterface", "TimerOutputs", "Unityper"] +git-tree-sha1 = "04e9157537ba51dad58336976f8d04b9ab7122f0" +uuid = "d1185830-fcd6-423d-90d6-eec64667417b" +version = "3.7.2" + + [deps.SymbolicUtils.extensions] + SymbolicUtilsLabelledArraysExt = "LabelledArrays" + SymbolicUtilsReverseDiffExt = "ReverseDiff" + + [deps.SymbolicUtils.weakdeps] + LabelledArrays = "2ee39098-c373-598a-b85f-a56591580800" + ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + +[[deps.Symbolics]] +deps = ["ADTypes", "ArrayInterface", "Bijections", "CommonWorldInvalidations", "ConstructionBase", "DataStructures", "DiffRules", "Distributions", "DocStringExtensions", "DomainSets", "DynamicPolynomials", "IfElse", "LaTeXStrings", "Latexify", "Libdl", "LinearAlgebra", "LogExpFunctions", "MacroTools", "Markdown", "NaNMath", "PrecompileTools", "Primes", "RecipesBase", "Reexport", "RuntimeGeneratedFunctions", "SciMLBase", "Setfield", "SparseArrays", "SpecialFunctions", "StaticArraysCore", "SymbolicIndexingInterface", "SymbolicLimits", "SymbolicUtils", "TermInterface"] +git-tree-sha1 = "ce9c95fc859007747a4faf10166201e0b10d4313" +uuid = "0c5d862f-8b57-4792-8d23-62f2024744c7" +version = "6.22.0" + + [deps.Symbolics.extensions] + SymbolicsForwardDiffExt = "ForwardDiff" + SymbolicsGroebnerExt = "Groebner" + SymbolicsLuxExt = "Lux" + SymbolicsNemoExt = "Nemo" + SymbolicsPreallocationToolsExt = ["PreallocationTools", "ForwardDiff"] + SymbolicsSymPyExt = "SymPy" + + [deps.Symbolics.weakdeps] + ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + Groebner = "0b43b601-686d-58a3-8a1c-6623616c7cd4" + Lux = "b2108857-7c20-44ae-9111-449ecde12c47" + Nemo = "2edaba10-b0f1-5616-af89-8c11ac63239a" + PreallocationTools = "d236fae5-4411-538c-8e31-a6e3d9e00b46" + SymPy = "24249f21-da20-56a4-8eb1-6a02cf4ae2e6" + +[[deps.TOML]] +deps = ["Dates"] +uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" +version = "1.0.3" + +[[deps.TableTraits]] +deps = ["IteratorInterfaceExtensions"] +git-tree-sha1 = "c06b2f539df1c6efa794486abfb6ed2022561a39" +uuid = "3783bdb8-4a98-5b6b-af9a-565f29a5fe9c" +version = "1.0.1" + +[[deps.Tables]] +deps = ["DataAPI", "DataValueInterfaces", "IteratorInterfaceExtensions", "OrderedCollections", "TableTraits"] +git-tree-sha1 = "598cd7c1f68d1e205689b1c2fe65a9f85846f297" +uuid = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" +version = "1.12.0" + +[[deps.Tar]] +deps = ["ArgTools", "SHA"] +uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" +version = "1.10.0" + +[[deps.TensorCore]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "1feb45f88d133a655e001435632f019a9a1bcdb6" +uuid = "62fd8b95-f654-4bbd-a8a5-9c27f68ccd50" +version = "0.1.1" + +[[deps.TermInterface]] +git-tree-sha1 = "d673e0aca9e46a2f63720201f55cc7b3e7169b16" +uuid = "8ea1fca8-c5ef-4a55-8b96-4e9afe9c9a3c" +version = "2.0.0" + +[[deps.Test]] +deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] +uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[[deps.TimerOutputs]] +deps = ["ExprTools", "Printf"] +git-tree-sha1 = "d7298ebdfa1654583468a487e8e83fae9d72dac3" +uuid = "a759f4b9-e2f1-59dc-863e-4aeb61b1ea8f" +version = "0.5.26" + +[[deps.TranscodingStreams]] +git-tree-sha1 = "0c45878dcfdcfa8480052b6ab162cdd138781742" +uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa" +version = "0.11.3" + +[[deps.Tricks]] +git-tree-sha1 = "7822b97e99a1672bfb1b49b668a6d46d58d8cbcb" +uuid = "410a4b4d-49e4-4fbc-ab6d-cb71b17b3775" +version = "0.1.9" + +[[deps.URIs]] +git-tree-sha1 = "67db6cc7b3821e19ebe75791a9dd19c9b1188f2b" +uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" +version = "1.5.1" + +[[deps.UUIDs]] +deps = ["Random", "SHA"] +uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" + +[[deps.Unicode]] +uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" + +[[deps.UnicodeFun]] +deps = ["REPL"] +git-tree-sha1 = "53915e50200959667e78a92a418594b428dffddf" +uuid = "1cfade01-22cf-5700-b092-accc4b62d6e1" +version = "0.4.1" + +[[deps.Unitful]] +deps = ["Dates", "LinearAlgebra", "Random"] +git-tree-sha1 = "01915bfcd62be15329c9a07235447a89d588327c" +uuid = "1986cc42-f94f-5a68-af5c-568840ba703d" +version = "1.21.1" +weakdeps = ["ConstructionBase", "InverseFunctions"] + + [deps.Unitful.extensions] + ConstructionBaseUnitfulExt = "ConstructionBase" + InverseFunctionsUnitfulExt = "InverseFunctions" + +[[deps.UnitfulLatexify]] +deps = ["LaTeXStrings", "Latexify", "Unitful"] +git-tree-sha1 = "975c354fcd5f7e1ddcc1f1a23e6e091d99e99bc8" +uuid = "45397f5d-5981-4c77-b2b3-fc36d6e9b728" +version = "1.6.4" + +[[deps.Unityper]] +deps = ["ConstructionBase"] +git-tree-sha1 = "25008b734a03736c41e2a7dc314ecb95bd6bbdb0" +uuid = "a7c27f48-0311-42f6-a7f8-2c11e75eb415" +version = "0.1.6" + +[[deps.UnsafeAtomics]] +git-tree-sha1 = "b13c4edda90890e5b04ba24e20a310fbe6f249ff" +uuid = "013be700-e6cd-48c3-b4a1-df204f14c38f" +version = "0.3.0" +weakdeps = ["LLVM"] + + [deps.UnsafeAtomics.extensions] + UnsafeAtomicsLLVM = ["LLVM"] + +[[deps.Unzip]] +git-tree-sha1 = "ca0969166a028236229f63514992fc073799bb78" +uuid = "41fe7b60-77ed-43a1-b4f0-825fd5a5650d" +version = "0.2.0" + +[[deps.Vulkan_Loader_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Wayland_jll", "Xorg_libX11_jll", "Xorg_libXrandr_jll", "xkbcommon_jll"] +git-tree-sha1 = "2f0486047a07670caad3a81a075d2e518acc5c59" +uuid = "a44049a8-05dd-5a78-86c9-5fde0876e88c" +version = "1.3.243+0" + +[[deps.Wayland_jll]] +deps = ["Artifacts", "EpollShim_jll", "Expat_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Pkg", "XML2_jll"] +git-tree-sha1 = "7558e29847e99bc3f04d6569e82d0f5c54460703" +uuid = "a2964d1f-97da-50d4-b82a-358c7fce9d89" +version = "1.21.0+1" + +[[deps.Wayland_protocols_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "93f43ab61b16ddfb2fd3bb13b3ce241cafb0e6c9" +uuid = "2381bf8a-dfd0-557d-9999-79630e7b1b91" +version = "1.31.0+0" + +[[deps.XML2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Zlib_jll"] +git-tree-sha1 = "a2fccc6559132927d4c5dc183e3e01048c6dcbd6" +uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a" +version = "2.13.5+0" + +[[deps.XSLT_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgcrypt_jll", "Libgpg_error_jll", "Libiconv_jll", "XML2_jll", "Zlib_jll"] +git-tree-sha1 = "7d1671acbe47ac88e981868a078bd6b4e27c5191" +uuid = "aed1982a-8fda-507f-9586-7b0439959a61" +version = "1.1.42+0" + +[[deps.XZ_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "15e637a697345f6743674f1322beefbc5dcd5cfc" +uuid = "ffd25f8a-64ca-5728-b0f7-c24cf3aae800" +version = "5.6.3+0" + +[[deps.Xorg_libICE_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "326b4fea307b0b39892b3e85fa451692eda8d46c" +uuid = "f67eecfb-183a-506d-b269-f58e52b52d7c" +version = "1.1.1+0" + +[[deps.Xorg_libSM_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libICE_jll"] +git-tree-sha1 = "3796722887072218eabafb494a13c963209754ce" +uuid = "c834827a-8449-5923-a945-d239c165b7dd" +version = "1.2.4+0" + +[[deps.Xorg_libX11_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxcb_jll", "Xorg_xtrans_jll"] +git-tree-sha1 = "9dafcee1d24c4f024e7edc92603cedba72118283" +uuid = "4f6342f7-b3d2-589e-9d20-edeb45f2b2bc" +version = "1.8.6+1" + +[[deps.Xorg_libXau_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "2b0e27d52ec9d8d483e2ca0b72b3cb1a8df5c27a" +uuid = "0c0b7dd1-d40b-584c-a123-a41640f87eec" +version = "1.0.11+1" + +[[deps.Xorg_libXcursor_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXfixes_jll", "Xorg_libXrender_jll"] +git-tree-sha1 = "12e0eb3bc634fa2080c1c37fccf56f7c22989afd" +uuid = "935fb764-8cf2-53bf-bb30-45bb1f8bf724" +version = "1.2.0+4" + +[[deps.Xorg_libXdmcp_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "02054ee01980c90297412e4c809c8694d7323af3" +uuid = "a3789734-cfe1-5b06-b2d0-1dd0d9d62d05" +version = "1.1.4+1" + +[[deps.Xorg_libXext_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] +git-tree-sha1 = "d7155fea91a4123ef59f42c4afb5ab3b4ca95058" +uuid = "1082639a-0dae-5f34-9b06-72781eeb8cb3" +version = "1.3.6+1" + +[[deps.Xorg_libXfixes_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll"] +git-tree-sha1 = "0e0dc7431e7a0587559f9294aeec269471c991a4" +uuid = "d091e8ba-531a-589c-9de9-94069b037ed8" +version = "5.0.3+4" + +[[deps.Xorg_libXi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXext_jll", "Xorg_libXfixes_jll"] +git-tree-sha1 = "89b52bc2160aadc84d707093930ef0bffa641246" +uuid = "a51aa0fd-4e3c-5386-b890-e753decda492" +version = "1.7.10+4" + +[[deps.Xorg_libXinerama_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXext_jll"] +git-tree-sha1 = "26be8b1c342929259317d8b9f7b53bf2bb73b123" +uuid = "d1454406-59df-5ea1-beac-c340f2130bc3" +version = "1.1.4+4" + +[[deps.Xorg_libXrandr_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXext_jll", "Xorg_libXrender_jll"] +git-tree-sha1 = "34cea83cb726fb58f325887bf0612c6b3fb17631" +uuid = "ec84b674-ba8e-5d96-8ba1-2a689ba10484" +version = "1.5.2+4" + +[[deps.Xorg_libXrender_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] +git-tree-sha1 = "47e45cd78224c53109495b3e324df0c37bb61fbe" +uuid = "ea2f1a96-1ddc-540d-b46f-429655e07cfa" +version = "0.9.11+0" + +[[deps.Xorg_libpthread_stubs_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "fee57a273563e273f0f53275101cd41a8153517a" +uuid = "14d82f49-176c-5ed1-bb49-ad3f5cbd8c74" +version = "0.1.1+1" + +[[deps.Xorg_libxcb_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "XSLT_jll", "Xorg_libXau_jll", "Xorg_libXdmcp_jll", "Xorg_libpthread_stubs_jll"] +git-tree-sha1 = "1a74296303b6524a0472a8cb12d3d87a78eb3612" +uuid = "c7cfdc94-dc32-55de-ac96-5a1b8d977c5b" +version = "1.17.0+1" + +[[deps.Xorg_libxkbfile_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] +git-tree-sha1 = "730eeca102434283c50ccf7d1ecdadf521a765a4" +uuid = "cc61e674-0454-545c-8b26-ed2c68acab7a" +version = "1.1.2+0" + +[[deps.Xorg_xcb_util_cursor_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_xcb_util_image_jll", "Xorg_xcb_util_jll", "Xorg_xcb_util_renderutil_jll"] +git-tree-sha1 = "04341cb870f29dcd5e39055f895c39d016e18ccd" +uuid = "e920d4aa-a673-5f3a-b3d7-f755a4d47c43" +version = "0.1.4+0" + +[[deps.Xorg_xcb_util_image_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] +git-tree-sha1 = "0fab0a40349ba1cba2c1da699243396ff8e94b97" +uuid = "12413925-8142-5f55-bb0e-6d7ca50bb09b" +version = "0.4.0+1" + +[[deps.Xorg_xcb_util_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libxcb_jll"] +git-tree-sha1 = "e7fd7b2881fa2eaa72717420894d3938177862d1" +uuid = "2def613f-5ad1-5310-b15b-b15d46f528f5" +version = "0.4.0+1" + +[[deps.Xorg_xcb_util_keysyms_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] +git-tree-sha1 = "d1151e2c45a544f32441a567d1690e701ec89b00" +uuid = "975044d2-76e6-5fbe-bf08-97ce7c6574c7" +version = "0.4.0+1" + +[[deps.Xorg_xcb_util_renderutil_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] +git-tree-sha1 = "dfd7a8f38d4613b6a575253b3174dd991ca6183e" +uuid = "0d47668e-0667-5a69-a72c-f761630bfb7e" +version = "0.3.9+1" + +[[deps.Xorg_xcb_util_wm_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] +git-tree-sha1 = "e78d10aab01a4a154142c5006ed44fd9e8e31b67" +uuid = "c22f9ab0-d5fe-5066-847c-f4bb1cd4e361" +version = "0.4.1+1" + +[[deps.Xorg_xkbcomp_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxkbfile_jll"] +git-tree-sha1 = "330f955bc41bb8f5270a369c473fc4a5a4e4d3cb" +uuid = "35661453-b289-5fab-8a00-3d9160c6a3a4" +version = "1.4.6+0" + +[[deps.Xorg_xkeyboard_config_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_xkbcomp_jll"] +git-tree-sha1 = "691634e5453ad362044e2ad653e79f3ee3bb98c3" +uuid = "33bec58e-1273-512f-9401-5d533626f822" +version = "2.39.0+0" + +[[deps.Xorg_xtrans_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "b9ead2d2bdb27330545eb14234a2e300da61232e" +uuid = "c5fb5394-a638-5e4d-96e5-b29de1b5cf10" +version = "1.5.0+1" + +[[deps.Zlib_jll]] +deps = ["Libdl"] +uuid = "83775a58-1f1d-513f-b197-d71354ab007a" +version = "1.2.13+1" + +[[deps.Zstd_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "555d1076590a6cc2fdee2ef1469451f872d8b41b" +uuid = "3161d3a3-bdf6-5164-811a-617609db77b4" +version = "1.5.6+1" + +[[deps.Zygote]] +deps = ["AbstractFFTs", "ChainRules", "ChainRulesCore", "DiffRules", "Distributed", "FillArrays", "ForwardDiff", "GPUArrays", "GPUArraysCore", "IRTools", "InteractiveUtils", "LinearAlgebra", "LogExpFunctions", "MacroTools", "NaNMath", "PrecompileTools", "Random", "Requires", "SparseArrays", "SpecialFunctions", "Statistics", "ZygoteRules"] +git-tree-sha1 = "c7dc3148a64d1cd3768c29b3db5972d1c302661b" +uuid = "e88e6eb3-aa80-5325-afca-941959d7151f" +version = "0.6.73" + + [deps.Zygote.extensions] + ZygoteColorsExt = "Colors" + ZygoteDistancesExt = "Distances" + ZygoteTrackerExt = "Tracker" + + [deps.Zygote.weakdeps] + Colors = "5ae59095-9a9b-59fe-a467-6f913c188581" + Distances = "b4f34e82-e78d-54a5-968a-f98e89d6e8f7" + Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" + +[[deps.ZygoteRules]] +deps = ["ChainRulesCore", "MacroTools"] +git-tree-sha1 = "27798139afc0a2afa7b1824c206d5e87ea587a00" +uuid = "700de1a5-db45-46bc-99cf-38207098b444" +version = "0.2.5" + +[[deps.eudev_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "gperf_jll"] +git-tree-sha1 = "431b678a28ebb559d224c0b6b6d01afce87c51ba" +uuid = "35ca27e7-8b34-5b7f-bca9-bdc33f59eb06" +version = "3.2.9+0" + +[[deps.fzf_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "6e50f145003024df4f5cb96c7fce79466741d601" +uuid = "214eeab7-80f7-51ab-84ad-2988db7cef09" +version = "0.56.3+0" + +[[deps.gperf_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "0ba42241cb6809f1a278d0bcb976e0483c3f1f2d" +uuid = "1a1c6b14-54f6-533d-8383-74cd7377aa70" +version = "3.1.1+1" + +[[deps.libaom_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "1827acba325fdcdf1d2647fc8d5301dd9ba43a9d" +uuid = "a4ae2306-e953-59d6-aa16-d00cac43593b" +version = "3.9.0+0" + +[[deps.libass_jll]] +deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl", "Zlib_jll"] +git-tree-sha1 = "e17c115d55c5fbb7e52ebedb427a0dca79d4484e" +uuid = "0ac62f75-1d6f-5e53-bd7c-93b484bb37c0" +version = "0.15.2+0" + +[[deps.libblastrampoline_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" +version = "5.8.0+1" + +[[deps.libdecor_jll]] +deps = ["Artifacts", "Dbus_jll", "JLLWrappers", "Libdl", "Libglvnd_jll", "Pango_jll", "Wayland_jll", "xkbcommon_jll"] +git-tree-sha1 = "9bf7903af251d2050b467f76bdbe57ce541f7f4f" +uuid = "1183f4f0-6f2a-5f1a-908b-139f9cdfea6f" +version = "0.2.2+0" + +[[deps.libevdev_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "141fe65dc3efabb0b1d5ba74e91f6ad26f84cc22" +uuid = "2db6ffa8-e38f-5e21-84af-90c45d0032cc" +version = "1.11.0+0" + +[[deps.libfdk_aac_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "8a22cf860a7d27e4f3498a0fe0811a7957badb38" +uuid = "f638f0a6-7fb0-5443-88ba-1cc74229b280" +version = "2.0.3+0" + +[[deps.libinput_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "eudev_jll", "libevdev_jll", "mtdev_jll"] +git-tree-sha1 = "ad50e5b90f222cfe78aa3d5183a20a12de1322ce" +uuid = "36db933b-70db-51c0-b978-0f229ee0e533" +version = "1.18.0+0" + +[[deps.libpng_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Zlib_jll"] +git-tree-sha1 = "b70c870239dc3d7bc094eb2d6be9b73d27bef280" +uuid = "b53b4c65-9356-5827-b1ea-8c7a1a84506f" +version = "1.6.44+0" + +[[deps.libvorbis_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Ogg_jll", "Pkg"] +git-tree-sha1 = "490376214c4721cdaca654041f635213c6165cb3" +uuid = "f27f6e37-5d2b-51aa-960f-b287f2bc3b7a" +version = "1.3.7+2" + +[[deps.mtdev_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "814e154bdb7be91d78b6802843f76b6ece642f11" +uuid = "009596ad-96f7-51b1-9f1b-5ce2d5e8a71e" +version = "1.1.6+0" + +[[deps.nghttp2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" +version = "1.52.0+1" + +[[deps.p7zip_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" +version = "17.4.0+2" + +[[deps.x264_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "4fea590b89e6ec504593146bf8b988b2c00922b2" +uuid = "1270edf5-f2f9-52d2-97e9-ab00b5d0237a" +version = "2021.5.5+0" + +[[deps.x265_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "ee567a171cce03570d77ad3a43e90218e38937a9" +uuid = "dfaa095f-4041-5dcd-9319-2fabd8486b76" +version = "3.5.0+0" + +[[deps.xkbcommon_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Wayland_jll", "Wayland_protocols_jll", "Xorg_libxcb_jll", "Xorg_xkeyboard_config_jll"] +git-tree-sha1 = "9c304562909ab2bab0262639bd4f444d7bc2be37" +uuid = "d8fb68d0-12a3-5cfd-a85a-d49703b185fd" +version = "1.4.1+1" +""" + +# ╔═║ Cell order: +# β•Ÿβ”€08cf2a80-f2b2-11ea-132d-2f26c934bbb2 +# β•Ÿβ”€b72a9871-3773-4a06-9a2f-09ce5a7d8496 +# ╠═47f98a52-f2b2-11ea-0ac6-9b4b74b7b15d +# β•Ÿβ”€5154a672-f2b2-11ea-1280-3ba5dadff7f9 +# β•Ÿβ”€f53fbf24-f2b2-11ea-2f59-d943884fee9d +# β•Ÿβ”€e6a55456-fe6f-11ea-328c-47fedb388194 +# ╠═2be8656c-f2b3-11ea-2244-5740c807deff +# ╠═2e00ef04-f2b3-11ea-1960-8136321c71db +# β•Ÿβ”€f7cd052e-f2bb-11ea-239a-47966e96e909 +# ╠═7244eba2-f2b3-11ea-045f-ffd208852eda +# β•Ÿβ”€60058dbe-1514-4139-bb97-66b40fe47306 +# ╠═21882f0e-8d54-41ae-84c6-7637ccc52c46 +# β•Ÿβ”€401df7a4-f2b3-11ea-12a1-e9b46bcfcf1b +# ╠═5ac4989c-f2b3-11ea-3e8a-a79a4117e48c +# ╠═5db7350a-f2b3-11ea-293d-ffc572e0dbe8 +# ╠═d5edd644-fe7c-11ea-2aa8-c772ea2f1bde +# ╠═76ba97fe-b7c4-467b-85ae-9067ebcc8b14 +# ╠═64b28e4a-f2b3-11ea-0fc0-7d37b4794686 +# ╠═8a4a8499-af01-46ea-8196-fb2d718d0d17 +# β•Ÿβ”€92b65737-9ad7-422e-955c-e9adacd2032b +# ╠═a38e2cce-851c-4065-8947-1926fa9ca5b4 +# ╠═684ff7f4-f2b3-11ea-14f7-7d3f329ecd79 +# β•Ÿβ”€2ca60bca-f2b4-11ea-0fec-c50f4e306536 +# ╠═7a6a18de-f2b3-11ea-1b3d-ef7a2b1b0434 +# β•Ÿβ”€67e7ea4d-0b76-4247-b22d-e20c8280f046 +# β•Ÿβ”€45190ad2-d358-455a-89a1-4f9c3b3880fa +# ╠═732ad756-1707-48e7-9bfb-10707e64b118 +# ╠═c8a5c6f8-4ca1-4c7e-9cc1-d2e5c9e9da59 +# β•Ÿβ”€c67f8b3f-0561-4f47-ade8-3c79d7920ae1 +# β•Ÿβ”€997ec642-a865-4c97-9aa1-d4d9df9e1dd0 +# β•Ÿβ”€913234a2-f2b3-11ea-3501-e3bfc54f91fe +# β•Ÿβ”€0238579a-fe70-11ea-0968-0f11ae9557db +# ╠═9ecd1cd6-8412-4fe1-9d79-676f9830ec2c +# ╠═af02692c-c1be-4f7c-a09f-fbd88b0c4bd8 +# ╠═eef066e0-f2b3-11ea-3cfa-5f35ebf13f76 +# ╠═f2158710-f2b3-11ea-16c9-dded5e1747d4 +# ╠═f54ee2b2-f2b3-11ea-24e8-f556ab9e3b85 +# ╠═08a565e0-f2b4-11ea-2ab6-f5f3a1b3c22d +# ╠═1055a996-f2b4-11ea-14d2-6116cbbaa6ba +# ╠═13db037a-f2b4-11ea-2a38-bd7c1c60f7d9 +# β•Ÿβ”€4f42234e-f2b4-11ea-2c86-93449b8dc60b +# ╠═6adbc7fe-f2b4-11ea-1861-b398d517edfa +# ╠═6cd1accc-f2b4-11ea-0077-e7685b77b1be +# β•Ÿβ”€77d4fd72-f2b4-11ea-0bd6-97fc2299ca2f +# ╠═773af248-f2b4-11ea-154a-cb67beebed3d +# β•Ÿβ”€8a5ee764-f2b4-11ea-23f3-27664d910c16 +# ╠═8ded9128-f2b4-11ea-0f44-9321077205de +# β•Ÿβ”€c3a1abd8-f2b4-11ea-0509-a5296ae8b361 +# ╠═c9f92e66-f2b4-11ea-322f-7778f149453d +# β•Ÿβ”€cfb07cc6-f2b4-11ea-08a7-dd0b13d15b5e +# ╠═d56b74f2-f2b4-11ea-12b4-5f54d4999b38 +# β•Ÿβ”€d9f2d114-f2b4-11ea-32b0-43fa1a872a97 +# ╠═de1fd700-f2b4-11ea-36dd-4bfba5ecc134 +# ╠═df14ce72-f2b4-11ea-307b-8fac2889681b +# ╠═e584f976-f2b4-11ea-0245-67f6bcc4be0e +# β•Ÿβ”€eb68674c-f2b4-11ea-0cc2-f792d17a5005 +# β•Ÿβ”€f4edad2c-f2b4-11ea-05fb-3d43c18e9d5c +# β•Ÿβ”€fd9ed266-f2b4-11ea-3c53-3bd2fe30a7f1 +# β•Ÿβ”€4e6b2b04-f2b5-11ea-0c52-5f32438e8c68 +# β•Ÿβ”€55ff7230-f2b5-11ea-2898-db5e21c764fd +# ╠═688a1f40-f2b5-11ea-3fa8-ebb735323ddd +# β•Ÿβ”€e5c12243-70ad-4e52-9bab-aae432203e21 +# β•Ÿβ”€6d6da8ba-f2b5-11ea-1064-df27ecea7d13 +# β•Ÿβ”€6fd08e42-f2b5-11ea-36e6-d7ff10412e2b +# β•Ÿβ”€9a87095e-f2b5-11ea-334e-57a637e20c43 +# β•Ÿβ”€67e9fa88-ff03-11ea-1177-c34331398d6c +# ╠═75ae48fe-f2b5-11ea-0614-912091cbfb6a +# β•Ÿβ”€8a738272-f2b5-11ea-2de6-f9ae6b30a466 +# ╠═7b95d73c-f2b5-11ea-1b29-858f7b6c99bf +# ╠═836ca94a-f2b5-11ea-07e0-bd830f810fba +# ╠═8fe85430-f2b5-11ea-3fe7-5d9a0db03932 +# ╠═b372c25c-f2b5-11ea-1c55-e5045e0dc5b7 +# ╠═b6e48b12-f2b5-11ea-3bf2-81e5b2a3dc98 +# ╠═b455e8ac-fe7f-11ea-1a8a-db85d11ccba7 +# ╠═c2924514-fe7f-11ea-2b01-81e9e0e1c491 +# ╠═cd2821c4-fe7f-11ea-0c41-8feab49be07a +# ╠═bebbd674-f2b5-11ea-19c6-4fe1257b0277 +# β•Ÿβ”€d6c6d4ea-f2b7-11ea-0b41-d7f629cdcd2f +# ╠═fe18341e-f2b7-11ea-0236-03b44eebd328 +# ╠═3f2a4cc2-26fa-4c3e-bfb7-f3ef019b6d78 +# ╠═9e22156e-0880-11eb-24a8-3d0a41262c36 +# ╠═ab39b554-0880-11eb-05de-71949f71b440 +# β•Ÿβ”€0aba93a6-f2b8-11ea-1461-d96878b7a5c1 +# ╠═014ec92c-f2b8-11ea-3986-8d74a8c2458d +# ╠═4a6270a3-a271-40da-84d0-28247f287c22 +# ╠═272bdcca-aeb1-405f-8251-33f13cddbdc5 +# β•Ÿβ”€3f5a58da-f2b8-11ea-3ab0-5db5e9199bb1 +# ╠═48e5da96-f2b8-11ea-0108-2104f2c8ac24 +# ╠═eaacb5a5-c748-4223-98e4-be73d3f2086f +# β•Ÿβ”€263e18dc-fe70-11ea-03a0-8fd5e031b06f +# ╠═2f18c362-f2b8-11ea-1beb-719ff5cd5f8d +# ╠═393f92a6-fe70-11ea-024e-ff30dcfc7103 +# ╠═329cb67e-f2b8-11ea-07b1-e13fd8ddbe42 +# ╠═36a2ca10-f2b8-11ea-0fae-53b552c76115 +# ╠═4ee45daa-f2b8-11ea-10ea-f929853879b1 +# β•Ÿβ”€555c8d88-f2b8-11ea-34d8-a17ce87ccdc1 +# ╠═59eee760-f2b8-11ea-29f6-732292e2f95d +# ╠═5ccd625e-f2b8-11ea-38c1-098e2f31ce53 +# ╠═60b52f6e-f2b8-11ea-2afc-4be2d4ae3e19 +# ╠═63d5e0be-f2b8-11ea-16e8-d9528b4e8945 +# β•Ÿβ”€6971e7e6-f2b8-11ea-2a76-9dda6b1455b6 +# ╠═6fe82e5a-f2b8-11ea-101d-d1ee5f9bd5b1 +# ╠═723fe4ca-f2b8-11ea-1440-a9e1cd213b66 +# ╠═76284520-f2b8-11ea-077e-43167cc7484c +# ╠═85a5c518-f2b8-11ea-2e12-25d16a12e7c8 +# β•Ÿβ”€8a254852-f2b8-11ea-142d-71bb270a5c01 +# β•Ÿβ”€91d0e03e-f2b8-11ea-07e5-db056636ac21 +# ╠═963c4910-f2b8-11ea-12bb-bb42539b1c93 +# β•Ÿβ”€a041fbf8-f2b8-11ea-28ba-0772497c649f +# ╠═9b5db398-f2b8-11ea-00bc-77de99792925 +# β•Ÿβ”€bdce5964-f2b8-11ea-03d1-57705d295040 +# ╠═c6728784-f2b8-11ea-12b5-d7eb039d77ce +# β•Ÿβ”€e1057afe-fe6e-11ea-27fe-6def4d8e1f2d +# ╠═eb76e252-fe6e-11ea-0939-c51ff3c73827 +# β•Ÿβ”€d6d310ee-f2b8-11ea-24e1-3b405f071545 +# ╠═d3ae2c14-f2b8-11ea-1ac2-fb5e0b4b8500 +# β•Ÿβ”€dbb1e68c-f2b8-11ea-1220-6f5715822e3d +# ╠═df557ed2-f2b8-11ea-22ee-e1c90a2655bf +# β•Ÿβ”€ee52d2b8-f2b8-11ea-15c4-19e9f2ad10e2 +# β•Ÿβ”€213fc38a-f380-11ea-135e-6f72924c19aa +# β•Ÿβ”€059679c0-d0ff-453b-b897-b889bbea326d +# ╠═a20f0158-f32b-45e8-8bd5-6f693eca1860 +# ╠═23b0cc81-b551-446b-991f-54bd19ac63cd +# ╠═a9961630-08be-48f8-b1cc-4a9d67dfc519 +# ╠═e4d2350e-147b-4c3c-a9ff-6de66a54c48a +# β•Ÿβ”€501a0db3-538a-43f3-a769-158c824bca31 +# ╠═ca64df96-082a-40dd-b82c-64016257fcab +# ╠═ba43bc8b-27d6-490d-971e-7e440b991cfb +# β•Ÿβ”€2d7dbec3-82eb-41f8-a959-b458e136d18c +# ╠═378500c1-9f19-4111-82cf-5a57c30d66ef +# β•Ÿβ”€8586855b-2ad7-4fe4-af1a-2a6f1dd052b3 +# β•Ÿβ”€8877c563-d10a-41e4-be8b-546d27623b67 +# ╠═a73e4d59-34f4-412f-afa4-f3b66244b35e +# ╠═6707fd27-78f6-4663-b95d-a016d2c44c3b +# β•Ÿβ”€18e151c4-0b0e-485b-81d2-f18a2dd4592d +# β•Ÿβ”€79221eee-f2be-11ea-3e43-4596f5ce5694 +# ╠═fb91a9c4-f2c0-11ea-38c4-5b554446e997 +# ╠═07c45d78-f2c3-11ea-131e-b9f0b67ca3cd +# ╠═33023d10-f2c1-11ea-3375-e9ac23172ab6 +# β•Ÿβ”€31cdefd2-f381-11ea-3037-e9c023ebc1e9 +# ╠═4def0626-f2c1-11ea-2f01-31a8c42b121c +# β•Ÿβ”€46c54108-f381-11ea-141f-31a696a7a8ef +# β•Ÿβ”€5812f84c-f2c1-11ea-0f6c-31b9fedc3704 +# ╠═8049560e-f383-11ea-1c8e-39c629d20982 +# ╠═c7b5a1aa-f383-11ea-2a84-8da9c9e60dbc +# ╠═cfad1a8c-f383-11ea-3dad-214f3da9485d +# β•Ÿβ”€83ddbe6a-f381-11ea-2415-255cbfb2590b +# ╠═30e9891c-f2c5-11ea-022d-5dbf9c064e43 +# β•Ÿβ”€b07cb958-f381-11ea-3378-5517440464ca +# ╠═eaac2514-f8fe-11ea-2229-81f5b59f58fe +# ╠═fb044216-f381-11ea-2faf-fd53dad74950 +# ╠═675b222c-f382-11ea-257a-afcb5a5afdd8 +# ╠═818c1f9e-ff1b-11ea-097f-cba2f30af994 +# ╠═7aff4178-bcac-4cfa-ab22-de3506cf73a8 +# β•Ÿβ”€881dedd4-f385-11ea-342e-a3700e90ac66 +# ╠═c1e19e26-f385-11ea-17b6-6d2d2e5cb7c0 +# ╠═fe18a0a0-f8fe-11ea-1595-4d95256dabca +# ╠═ec87028b-d9d4-4dc7-9dd5-36eaa1dd49d4 +# β•Ÿβ”€df5f20d8-f385-11ea-104d-9b9e7b094eb7 +# ╠═e4a088f0-f385-11ea-00da-b12e40e4357f +# β•Ÿβ”€ddd214d8-608a-4123-973f-b331c6ab331a +# ╠═8f3fecac-f8fd-11ea-136d-1513f60ee3ed +# ╠═f8863a18-f385-11ea-0965-0f074e58d9b2 +# β•Ÿβ”€4c3817f6-396e-4485-a7dd-0f507cec124a +# ╠═78b72cb1-52f3-4dc3-a721-b8a89a24312e +# ╠═7180e310-a6f7-4feb-aff3-28e1c772b441 +# β•Ÿβ”€02b42a67-7ebe-4ca2-ac55-aa481b30e997 +# ╠═043e3e2f-3876-41c0-bf70-5ef53b5db986 +# ╠═8ba368c9-3b04-469e-9556-1573cbc52185 +# ╠═4da4a1b6-b7c8-432d-86ed-c45a499a1880 +# β•Ÿβ”€c573ba19-4be5-4afd-b9f5-8b75e9b18ad6 +# ╠═639528b1-ecff-4a05-ae56-9a08b779edc1 +# ╠═838292fc-2c0e-4bb9-9df9-6cd197c4a4fd +# ╠═ca20cc75-3033-4bd1-bb5c-cae61c855de7 +# β•Ÿβ”€34d48ec0-f2b9-11ea-147e-d3554a9fcc04 +# β•Ÿβ”€0a576c65-3685-4987-93f1-980ace78d6f4 +# β•Ÿβ”€91aff94e-e77e-4810-82ad-fe5ab3eafdad +# β•Ÿβ”€8eb9ed90-981b-4094-baec-a521614fb3a1 +# β•Ÿβ”€d682439b-bc6b-456d-8b5d-2489d095e55f +# β•Ÿβ”€2d4c0bf6-3936-449d-8341-56f9c5659a6e +# β•Ÿβ”€fe4dfa5c-ea26-4f7c-aa68-7b3ec5f45bdc +# ╠═c25c9a89-69bd-4dd8-b710-5e66f68346b4 +# β•Ÿβ”€00000000-0000-0000-0000-000000000001 +# β•Ÿβ”€00000000-0000-0000-0000-000000000002 diff --git a/scripts/calibration.jl b/scripts/calibration.jl new file mode 100644 index 00000000..7e339678 --- /dev/null +++ b/scripts/calibration.jl @@ -0,0 +1,1035 @@ +### A Pluto.jl notebook ### +# v0.20.3 + +using Markdown +using InteractiveUtils + +# This Pluto notebook uses @bind for interactivity. When running this notebook outside of Pluto, the following 'mock version' of @bind gives bound variables a default value (instead of an error). +macro bind(def, element) + #! format: off + quote + local iv = try Base.loaded_modules[Base.PkgId(Base.UUID("6e696c72-6542-2067-7265-42206c756150"), "AbstractPlutoDingetjes")].Bonds.initial_value catch; b -> missing; end + local el = $(esc(element)) + global $(esc(def)) = Core.applicable(Base.get, el) ? Base.get(el) : iv(el) + el + end + #! format: on +end + +# ╔═║ 3e70b82a-e4d3-4747-9679-aa5ab41d5b06 +# ╠═║ skip_as_script = true +#=╠═║ +begin + using Pkg + Pkg.activate("..") +end + ╠═║ =# + +# ╔═║ ab31fa80-0606-11ef-06f5-bd74bc457ff5 +using Plots, PlutoUI, LaTeXStrings, Latexify, LinearAlgebra, Random + +# ╔═║ a10a9f8e-4088-49e2-a497-b1d253d83ecc +using Optim, Turing, StatsPlots, StatsBase + +# ╔═║ 4b38ba22-8c3f-4c90-b42a-79063489641e +using Catalyst, DifferentialEquations + +# ╔═║ 0b6b3b7f-98e7-4922-82de-6a98453a627c +md""" + +## Polynomial regression + +Let us fit a polynomial regression model of the form + +$$f(x) = \sum^{p-1}_{i=0} \beta_i \frac{x^i}{i!}\,.$$ + +""" + +# ╔═║ 1b055cac-6192-438f-8f3f-9891f5f06f49 +polynom(ΞΈ) = x -> sum(ΞΈi * x^(i-1)/factorial(i-1) for (i, ΞΈi) in enumerate(ΞΈ)) + +# ╔═║ ecceb6b5-74f4-4b5a-9c73-4ae1477b2c47 +Ξ² = [2, 3, -6, -2, 3, 0, 0, 0, 0, 0] + +# ╔═║ 4ca12cc9-3bae-4535-a5c9-11cac5b2c89f +# ╠═║ disabled = true +#=╠═║ +p = length(Ξ²) + ╠═║ =# + +# ╔═║ ac3accfd-7edb-4bce-9891-d544210867e5 +poly = polynom(Ξ²) + +# ╔═║ 6daf07bc-807b-4dc5-8492-fc6f107cb294 +plot(poly, -5, 5) + +# ╔═║ 4f5f7c4f-ff5b-450c-901d-e7395f6623dd +xpoly = [-4, -3, -3.4, -2, -1, 0, 1, 1.2, 3.5, 4] + +# ╔═║ 81e20a6b-4309-464e-b57b-05a38558515f +Οƒpoly = 3 + +# ╔═║ bdf2debf-5bd7-4183-a428-109b01fc7488 +Ξ» = 0.05 + +# ╔═║ 27eea16c-feff-4678-907e-f57fb7cf8c0e +ypoly = poly.(xpoly) + Οƒpoly .* randn(MersenneTwister(2), length(xpoly)) + +# ╔═║ 66527df1-bd8b-45d6-b499-b5d17db84c42 +Apoly = [x^i/factorial(i) for x in xpoly, i in 0:9] + +# ╔═║ 70f8723f-1f85-4179-844d-0c4d0130d5c4 +Ξ²ls = (Apoly' * Apoly) \ (Apoly' * ypoly) + +# ╔═║ d194b539-f4c1-4ad5-a721-48b6cf73afed +Ξ²tik = (Apoly' * Apoly + Ξ» * 10 * I) \ (Apoly' * ypoly) + +# ╔═║ e735ea0e-0c98-4707-bc5e-9c2bba04aa90 +md"## Michaelis-Menten" + +# ╔═║ 5b80b912-e625-44a4-9653-8306189718c4 +ΞΌmax_star, Ks_star, Οƒmm = 17.0, 79, 1.2 + +# ╔═║ 2f8746e7-2e4a-4e40-bd48-f69349f1259d +Xs = Cs = 5:5:180 + +# ╔═║ 17252072-b71f-4c30-b108-8163dfd63fbf +n_mm = length(Cs) + +# ╔═║ bf757553-7650-4b42-a07e-41007a3c29db +ΞΌs = mm.(Cs, ΞΌmax_star, Ks_star) # non-noisy concentrations + +# ╔═║ 234bebb6-0d05-41a0-871d-50cf752d17a2 +@model function michaelis_menten(Xs, ΞΌs) + sigmasq ~ InverseGamma() + mu_max ~ Truncated(Normal(20, 10), 0, 50) + Ks ~ Uniform(5, 500) + for i in 1:length(Xs) + ΞΌs[i] ~ Normal(mm(Xs[i], mu_max, Ks), sqrt(sigmasq)) + end + return x -> mm(x, mu_max, Ks) +end + +# ╔═║ 4a336948-d46e-415f-bcaf-07c667da4089 +Truncated(Normal(20, 10), 0, 50) + +# ╔═║ 07d91dc7-2db0-464e-bc61-9633f2bfe92b +@model function michaelis_menten_robust(Xs, ΞΌs) + sigmasq ~ InverseGamma() + mu_max ~ Truncated(Normal(20, 10), 0, 50) + Ks ~ Uniform(5, 500) + for i in 1:length(Xs) + ΞΌs[i] ~ Laplace(mm(Xs[i], mu_max, Ks), sqrt(sigmasq)) + end + return x -> mm(x, mu_max, Ks) +end + +# ╔═║ 0e5831ff-f542-40e1-9376-2abb420494b7 +md"[mm?](https://chem.libretexts.org/Bookshelves/Biological_Chemistry/Supplemental_Modules_(Biological_Chemistry)/Enzymes/Enzymatic_Kinetics/Michaelis-Menten_Kinetics) +MM?" + +# ╔═║ 03373997-a9eb-4d5a-9ef5-8822c3f95285 +md"## Poisson via Laplace approximation" + +# ╔═║ 70f8de3c-5c5f-4ff0-92eb-e6d2a06451e1 +@bind Ξ»_pois Slider(0:0.2:50, show_value=true, default=26) + +# ╔═║ cd3746d4-518d-476e-abf4-2ac92a2c1387 +import ForwardDiff + +# ╔═║ 6dc06148-79bf-44bf-8a5c-b6221b55bce0 +xs_tiny = [2, 4, 3, 4] + +# ╔═║ d733961a-094a-4724-9b16-ee669a559945 +ll_pois2(Ξ») = sum(x->loglikelihood(Poisson(Ξ»), x), xs_tiny) + +# ╔═║ de91d6d5-8115-4c79-9420-6f85873975b4 +plot(ll_pois2, 0.1, 10) + +# ╔═║ 46551486-d8a3-4aca-a92d-8c7f1c4439c0 +pois_map(Ξ») = ll_pois2(Ξ») - log(Ξ») + +# ╔═║ 580a4e54-5675-45f5-a3b8-241c2d5b470d +pois_map(Ξ»::AbstractVecOrMat) = pois_map(Ξ»[1]) + +# ╔═║ 87e09095-3a14-4cef-b8a3-705b9cb243d5 +plot(pois_map, 0.1, 10) + +# ╔═║ 0d6cc24c-6008-4bb7-8fb9-45223febc05b +Ξ»_star = optimize(x->-pois_map(x[1]), [mean(xs_tiny)], Newton()).minimizer[1] + +# ╔═║ 439bcebe-7607-441b-bae7-834482dd6059 +mean(xs_tiny) + +# ╔═║ 1e634f77-286b-44ce-b768-72b060ee898b +md"Fisher information using the second-order derivative:" + +# ╔═║ 0082f110-22df-49d5-8958-29e9516e9ca8 +fi = -ForwardDiff.derivative(l->ForwardDiff.derivative(pois_map, l), Ξ»_star) + +# ╔═║ 697e8128-40d1-4c77-acfc-b948c88c394e +ForwardDiff.hessian(pois_map, [Ξ»_star]) + +# ╔═║ ba822f9b-0b29-451e-9349-e08e3e5697fa +pois_map(9) + +# ╔═║ 362fe960-f247-4d7b-ab9d-01b67d1e647e +Οƒ_Ξ» = inv(√(fi)) + +# ╔═║ f041b223-efec-4a29-a753-d6563a7f9a10 +sqrt(mean(xs_tiny)) / sqrt(length(xs_tiny)) # classical estimator voor sde + +# ╔═║ 8feddb40-5cf8-4d76-a959-dd3071c20e27 +post_Laplace = Normal(Ξ»_star, Οƒ_Ξ») + +# ╔═║ da1aa2a7-e876-4b80-9204-d3ea11bc0f44 +md"## LV model" + +# ╔═║ 73e018a3-27f6-4631-a8c3-394644cb774e +let + # Define Lotka-Volterra model. +function lotka_volterra(du, u, p, t) + # Model parameters. + Ξ±, Ξ², Ξ³, Ξ΄ = p + # Current state. + x, y = u + + # Evaluate differential equations. + du[1] = (Ξ± - Ξ² * y) * x # prey + du[2] = (Ξ΄ * x - Ξ³) * y # predator + + return nothing +end + +# Define initial-value problem. +u0 = [1.0, 1.0] +p = [1.5, 1.0, 3.0, 1.0] +tspan = (0.0, 10.0) +prob = ODEProblem(lotka_volterra, u0, tspan, p) + +# Plot simulation. +plot(solve(prob, Tsit5())) +end + +# ╔═║ e79a72fc-9929-4faa-a76d-ad914fc731ab +function lotka_volterra!(du, u, p, t) + # parameters + alpha, beta, gamma, delta = p + # states + x, y = u[1], u[2] + # differential equations + du[1] = dxdt = alpha * x - beta * x * y + du[2] = dydt = delta * x * y - gamma * y +end + +# ╔═║ 4c9f01b3-aef4-47ed-9633-1abda691b531 +alpha = 1.5 + +# ╔═║ c3008b5a-7138-48a5-b744-d8f3aa2ff2ad +beta = 1.0 + +# ╔═║ db3f89f9-3bef-432f-b558-3d32c5e79abe +gamma = 3.0 + +# ╔═║ eb132faa-fedb-4e18-868f-46783e503515 +delta = 1.0 + +# ╔═║ 2a25b088-7414-48a2-a702-8c87213b92d3 +p = (alpha, beta, gamma, delta) + +# ╔═║ a05d6800-a168-4e44-bfcb-0809aedda09e +lv_prob = ODEProblem(lotka_volterra!, [1.0, 1.0], (0.0, 10.0), p) + +# ╔═║ b3c31cca-b472-4dec-b700-11cbff9465a9 +plot(solve(lv_prob, Tsit5()), lw=2, ylab="population size") + +# ╔═║ 14810fe9-e6fe-46c7-b6cf-9705b5974113 +begin + sol = solve(lv_prob, Tsit5(); saveat=0.1) + odedata = Array(sol) + 0.8 * randn(size(Array(sol))) + + # Plot simulation and noisy observations. + plot(sol; alpha=0.3, ylab="population size") + scatter!(sol.t, odedata'; color=[1 2], label="", marker=[:o :^]) +end + +# ╔═║ 79473eed-7fba-43e7-80a7-51d011931578 +@model function fitlv(data, lv_prob) + # Prior distributions. + Οƒ ~ InverseGamma(2, 3) + Ξ± ~ truncated(Normal(1.5, 0.5); lower=0.5, upper=2.5) + Ξ² ~ truncated(Normal(1.2, 0.5); lower=0, upper=2) + Ξ³ ~ truncated(Normal(3.0, 0.5); lower=1, upper=4) + Ξ΄ ~ truncated(Normal(1.0, 0.5); lower=0, upper=2) + + # Simulate Lotka-Volterra model. + p = [Ξ±, Ξ², Ξ³, Ξ΄] + predicted = solve(lv_prob, Tsit5(); p=p, saveat=0.1) + + # Observations. + for i in 1:length(predicted) + data[:, i] ~ MvNormal(predicted[i], Οƒ^2 * I) + end + + return nothing +end + + +# ╔═║ 3fc31430-b15d-4fa8-a326-5de13f380b5c +lv_model = fitlv(odedata, lv_prob) + +# ╔═║ 5f62cec0-3e8f-42f0-9cf6-e30239456803 +lv_chain = sample(MersenneTwister(42), lv_model, NUTS(0.65), MCMCSerial(), 1000, 3; progress=false) + +# ╔═║ 6c6ce02e-1413-49f4-925b-0d07711690c0 +summarize(lv_chain) + +# ╔═║ daae0473-49b2-4630-aa79-79e10dcb3120 +@model function fitlv2(data::AbstractVector, prob) + # Prior distributions. + Οƒ ~ InverseGamma(2, 3) + Ξ± ~ truncated(Normal(1.5, 0.5); lower=0.5, upper=2.5) + Ξ² ~ truncated(Normal(1.2, 0.5); lower=0, upper=2) + Ξ³ ~ truncated(Normal(3.0, 0.5); lower=1, upper=4) + Ξ΄ ~ truncated(Normal(1.0, 0.5); lower=0, upper=2) + + # Simulate Lotka-Volterra model but save only the second state of the system (predators). + p = [Ξ±, Ξ², Ξ³, Ξ΄] + predicted = solve(prob, Tsit5(); p=p, saveat=0.1, save_idxs=2) + + # Observations of the predators. + data ~ MvNormal(predicted.u, Οƒ^2 * I) + + return nothing +end + +# ╔═║ 27ddc0aa-398c-439c-9a5c-a6153d081f51 +model2 = fitlv2(odedata[2, :], lv_prob) + +# ╔═║ c7a19043-cf44-44cc-8317-5caff29269cc +count_data = rand.(Poisson.(Array(sol))) + +# ╔═║ 08da7b32-1e53-46da-bfeb-ea16b23dddf8 +@model function fitlv3(data, prob) + # Prior distributions. + Οƒ ~ InverseGamma(2, 3) + Ξ± ~ truncated(Normal(1.5, 0.5); lower=0.5, upper=2.5) + Ξ² ~ truncated(Normal(1.2, 0.5); lower=0, upper=2) + Ξ³ ~ truncated(Normal(3.0, 0.5); lower=1, upper=4) + Ξ΄ ~ truncated(Normal(1.0, 0.5); lower=0, upper=2) + + # Simulate Lotka-Volterra model. + p = [Ξ±, Ξ², Ξ³, Ξ΄] + predicted = solve(prob, Tsit5(); p=p, saveat=0.1) + + # Observations from a Poisson distribution + n, m = size(data) + for i in 1:n + for j in 1:m + data[i,j] ~ Poisson(predicted[i,j]) + end + end + + return nothing +end + +# ╔═║ 570db1f7-324c-41b8-b9eb-eea747ca8b9e +lv_model3 = fitlv3(count_data, lv_prob) + +# ╔═║ ec0dd911-b3e1-43c8-9fdc-8fffe49945d3 +md"## Logistic model" + +# ╔═║ 894bfbf5-26c0-43e2-8f5b-fef4c41e3438 +# ╠═║ disabled = true +#=╠═║ +data = [(14.4, 1.0), (15.9, 2.3), (17.3, 4.0), (18.7, 6.0), (20.1, 7.9), (21.6, 9.2), (23.1, 9.8), (24.6, 9.9)] + ╠═║ =# + +# ╔═║ 03457e54-33ae-4cf8-a4a9-85dab26c1ef9 +#=╠═║ +t, y = first.(data), last.(data) + ╠═║ =# + +# ╔═║ 0c6aebf8-b18f-4987-b13e-e687436af550 +#=╠═║ +scatter(t, y) + ╠═║ =# + +# ╔═║ 5dee9551-a275-4c92-8a35-9bf7d2a91e7d +# ╠═║ disabled = true +# ╠═║ skip_as_script = true +#=╠═║ +logistic(t; r, K, yβ‚€=.1) = K / (1 + (K-yβ‚€) / yβ‚€ * exp(-r*t)) + ╠═║ =# + +# ╔═║ 6984bd57-e95f-40b1-aecc-a864177bdb72 +#=╠═║ +sq_loss(r, K) = sum(abs2, logistic.(t; r, K) .- y) |> sqrt + ╠═║ =# + +# ╔═║ e4fd9a2f-92be-4d4f-a3b0-475848e7aed3 +#=╠═║ +contourf(0.01:.01:2, 1:.01:20, sq_loss, color=:speed) + ╠═║ =# + +# ╔═║ d43ee840-dfc5-4d2d-bb0f-14faf1573e73 +# ╠═║ disabled = true +#=╠═║ +@model function logistic_model(t, y; yβ‚€=missing) + Οƒ ~ InverseGamma() + r ~ Exponential(.1) + K ~ Exponential(5) + yβ‚€ ~ Exponential(1) + for i in 1:length(y) + y[i] ~ Normal(logistic(t[i]; r, K, yβ‚€), Οƒ) + end +end + ╠═║ =# + +# ╔═║ 3b0ca57f-d7f3-4bbf-91b8-23d488c3d3cd +#=╠═║ +logistic_fit = logistic_model(t, y) + ╠═║ =# + +# ╔═║ 7cff29b5-3478-49ae-abea-712cfbee762d +#=╠═║ +ll(r, K) = loglikelihood(logistic_model(t, y; yβ‚€=0.1), (;r, K, yβ‚€=0.000213524, Οƒ=0.5)) + ╠═║ =# + +# ╔═║ 8f08acd8-4480-418d-89dd-64f795be6347 +#=╠═║ +contourf(0.01:.01:2, 1:.01:20, ll, color=cgrad(:speed, rev=true)) + ╠═║ =# + +# ╔═║ 9b82503e-48a0-4c78-b7e7-0102b2d1f9d5 +#=╠═║ +ll(0.1, 2) + ╠═║ =# + +# ╔═║ 1a283f5a-ad39-4f16-b2b2-ff531f1a9634 +#=╠═║ +ml_log = optimize(logistic_fit, MLE(), NelderMead()) + ╠═║ =# + +# ╔═║ 4acefe9c-8ea1-4491-9f03-0be80c5211c3 +#=╠═║ +coeftable(ml_log) + ╠═║ =# + +# ╔═║ e2eaca92-3b18-4448-967f-ec78d165bd68 +#=╠═║ +lprior(r, K) = logprior(logistic_model(t, y; yβ‚€=0.1), (;r, K, Οƒ=0.5)) + ╠═║ =# + +# ╔═║ cc104cdb-47d0-4b6b-adc4-103a6dad5421 +#=╠═║ +contourf(0.01:.01:5, 1:.01:10, lprior, color=cgrad(:speed, rev=true)) + ╠═║ =# + +# ╔═║ f55335b3-c0ec-467f-9056-c5416b662088 +#=╠═║ +lp(r, K) = ll(r, K) + lprior(r, K) + ╠═║ =# + +# ╔═║ 99399d90-29cc-4648-871d-67adbebfec8a +#=╠═║ +contourf(0.01:.01:5, 1:.01:10, lp, color=cgrad(:speed, rev=true)) + ╠═║ =# + +# ╔═║ e7e7dd46-835a-4cf1-aec5-e5ae1d2b1b1b +#=╠═║ +map_log = optimize(logistic_fit, MAP(), NelderMead()) + ╠═║ =# + +# ╔═║ 41c6b352-77f9-4480-be19-20db633c7a6e +#=╠═║ +map_log.values[:K] + ╠═║ =# + +# ╔═║ f5819e00-2e6a-4886-b363-f23ddc5abd72 +#=╠═║ +coeftable(map_log) + ╠═║ =# + +# ╔═║ 16b6935f-1a37-4b12-ac18-5803175555a5 +#=╠═║ +chain = sample(logistic_fit, NUTS(), 10_000); + ╠═║ =# + +# ╔═║ 255c791b-0012-4a04-b794-f9ffe1c62a26 +#=╠═║ +summarize(chain) + ╠═║ =# + +# ╔═║ 290d4176-5715-4b49-85d5-c90bde256b00 +#=╠═║ +quantile(chain) + ╠═║ =# + +# ╔═║ 80d28884-c66e-4384-ac44-d8768d8c810f +#=╠═║ +plot(chain) + ╠═║ =# + +# ╔═║ 63ea89c5-df05-4651-b655-10d678fde222 +# ╠═║ disabled = true +#=╠═║ +@model function polynomial_regression(x, y, m) + Οƒm ~ InverseGamma(1) # standard deviation of the error + Ξ» ~ InverseGamma(1) + n = length(y) + Ξ² ~ MultivariateNormal(m + 1, Ξ») + x_stand = (x .- mean(x)) ./ std(x) + for i in 1:n + yv = 0.0 + for j in 0:m + yv += Ξ²[j+1] * (x_stand[i])^j / factorial(j) + end + y[i] ~ Normal(yv, Οƒm) + end +end + ╠═║ =# + +# ╔═║ 9b3e76fc-0c0b-4bd0-8af8-5e6053e24094 +# ╠═║ disabled = true +#=╠═║ +xp = 10rand(200) .- 5 |> sort! + ╠═║ =# + +# ╔═║ 960814cb-611e-4057-8667-0c4de798a96e +# ╠═║ disabled = true +#=╠═║ +yp = 3randn(200) .+ 4 .- 4xp .+ 8xp.^2 + ╠═║ =# + +# ╔═║ 9b317909-8997-46e2-809d-b005332c1022 +# ╠═║ disabled = true +#=╠═║ +sample(polynomial_regression(xp, yp, 5), NUTS(), 1000) |> summarize + ╠═║ =# + +# ╔═║ bf80bb42-75c8-4064-952c-0613e3e8188d +# ╠═║ disabled = true +#=╠═║ +optimize(polynomial_regression(xp, yp, 2), MLE(), NelderMead()) + ╠═║ =# + +# ╔═║ 5ff4ccf6-9bd8-4318-9de3-7752ed66f51a +# ╠═║ disabled = true +#=╠═║ +optimize(polynomial_regression(xp, yp, 5), MAP()) |> coeftable + ╠═║ =# + +# ╔═║ 63214fc8-2c39-4cbe-8aa7-da36e904e978 +yeast = @reaction_network begin + X * mm(G, ΞΌ, K), X + G => 2X + m, X --> 0 +end + +# ╔═║ f241d041-34a1-4399-a724-8be968ed4677 +yeast_ode = convert(ODESystem, yeast) + +# ╔═║ 0a283dff-c28e-4349-ad3f-a07b16bf274b +parameters(yeast_ode) + +# ╔═║ 0a461157-58f1-4478-9700-65bf5fb80ebe +prob_yeast = ODEProblem(yeast, [:X=>10.1, :G=>180], (0, 50), [:ΞΌ=>0.3, :K=>250, :m=>0.03]) + +# ╔═║ 67c24c30-1416-4947-b8cd-685099f3001b +remake(prob_yeast, parameters=[:ΞΌ=>0.2]) + +# ╔═║ 5c349b88-5789-4bda-a8d9-4a5d9af22e93 +solve(prob_yeast, Tsit5(), saveat=5) + +# ╔═║ 25ac2424-170c-463d-9a5e-c900f3ed8674 +sol_yeast = solve(prob_yeast, Tsit5(), saveat=5) + +# ╔═║ 0e6ba65b-067c-42f4-90b7-8b8c387a2fa9 +plot(sol_yeast) + +# ╔═║ 0c9c49af-59cc-4f2a-9de2-6095d379e18b +Οƒ_X, Οƒ_G = 7.4, 19 + +# ╔═║ 018aa4ed-b4c2-4413-80c9-af4f34256865 +length(sol_yeast) + +# ╔═║ a7105efd-a192-406e-949c-75c8d9e35da9 +sol_yeast[:X,1] + +# ╔═║ 7e6dbcd1-be40-4315-87a9-129b7f8ce341 +Xobs = sol_yeast[:X] .+ Οƒ_X .* randn(length(sol_yeast)) + +# ╔═║ 3fea2784-e662-4b01-896c-54bc913adf40 +Gobs = sol_yeast[:G] .+ Οƒ_G .* randn(length(sol_yeast)) + +# ╔═║ 0f40a683-d4e7-4fc8-bf5e-18de8e3d6111 +let + scatter(sol_yeast.t, Xobs) + scatter!(sol_yeast.t, Gobs) +end + + +# ╔═║ 1ba6e0d0-3166-41ab-a106-df73e4579f39 +tsteps = sol_yeast.t + +# ╔═║ 6185ec28-3286-40c8-bdcc-6d8e812bb7df +@model function yeast_inference(tsteps, X, G) + Οƒ_Xsq ~ InverseGamma() + Οƒ_Gsq ~ InverseGamma() + ΞΌ ~ Uniform(0.01, 5) + m ~ Uniform(0.01, 5) + sol = solve(prob_yeast, Tsit5(), saveat=tsteps, p=[ΞΌ, 250.0, m]) + for i in 1:length(X) + X[i] ~ Normal(sol[:X,i], sqrt(Οƒ_Xsq)) + G[i] ~ Normal(sol[:G,i], sqrt(Οƒ_Gsq)) + end +end + +# ╔═║ c4896649-a42c-4fd8-a8ef-ecc2eeee61d9 +yeast_mod = yeast_inference(tsteps, Xobs, Gobs) + +# ╔═║ 95b92274-f1a2-4c4f-b058-d384211b9c1a +# ╠═║ skip_as_script = true +#=╠═║ +optimize(yeast_mod, MLE(), LBFGS()) |> coeftable + ╠═║ =# + +# ╔═║ dd285391-6df6-47f7-a568-8786d2000f24 +optimize(yeast_mod, MAP(), NelderMead()) |> coeftable + +# ╔═║ 16089b87-a760-4309-86b9-8300bb5a23cf +chain_yeast = sample(yeast_mod, NUTS(), MCMCSerial(), 5000, 5); + +# ╔═║ 05ed997f-e9b1-4f10-a186-78eac7f8aa8a +summarize(chain_yeast) + +# ╔═║ dd7415cd-2646-4135-a389-baf8d6657fe1 +md"## Appendix" + +# ╔═║ 2f28d23a-36a3-4831-a8df-ce08cfd7c44e +TableOfContents() + +# ╔═║ 3af17761-3a77-4c83-a54b-b55e2a3eb708 +rng = MersenneTwister(6) + +# ╔═║ 2d82ae12-da64-426c-9ed1-f65480b88214 +ΞΌ_noise = ΞΌs .+ rand(rng, Normal(0, Οƒmm), n_mm) + +# ╔═║ f3fd99c7-94db-4cfa-a7f2-fe8d2bf33f8e +mm_model_normal = michaelis_menten(Xs, ΞΌ_noise) + +# ╔═║ a8de733e-8f92-443d-9a79-6dc4d17ca52b +plot(generated_quantities(mm_model_normal, rand(mm_model_normal))) + +# ╔═║ e2f28fc3-5cfd-4e5f-8e28-36a0e8bf43a2 +# ╠═║ skip_as_script = true +#=╠═║ +coeftable(optimize(mm_model_normal, MLE(), NelderMead())) + ╠═║ =# + +# ╔═║ b1e883f7-10bb-47b6-af26-0c278b15c0b6 +chain_MM = sample(mm_model_normal, NUTS(), 10000) + +# ╔═║ 9a51f9f4-b403-4466-981f-1aaa74a48e5a +summarize(chain_MM) + +# ╔═║ 5ba1377a-b16e-4e70-8b72-c1477a75f4e8 +mm_map = optimize(mm_model_normal, MAP(), NelderMead()) + +# ╔═║ 0d262055-5220-42ae-b232-d96d4965667b +# ╠═║ skip_as_script = true +#=╠═║ +coeftable(mm_map) + ╠═║ =# + +# ╔═║ ab9d0e48-6b7c-425b-a740-63bf65623a9a +Ξ£ = informationmatrix(mm_map, expected=false) |> inv + +# ╔═║ ebb6d109-d4d2-4997-bf2b-6b7c12d47e3b +mu_max_map, Ks_map = mm_map.values[:mu_max], mm_map.values[:Ks] + +# ╔═║ da7b2976-fa09-405a-8c86-081984c0ac8c +function sq_loss_mm(ΞΌmax, Ks) + L = 0.0 + for (X, ΞΌ) in zip(Xs, ΞΌ_noise) + L += (mm(X, ΞΌmax, Ks) - ΞΌ)^2 + end + return L +end + +# ╔═║ 1fda5580-0dcf-47f9-b03d-7e588d0e9c80 +ls_sol = optimize(ΞΈ->sq_loss_mm(ΞΈ[1], ΞΈ[2]), [1.0, 10.0], NelderMead()) + +# ╔═║ 6fdabf8f-3569-4b5e-a7d8-79c8cdd2fcfc +mu_max_ls, Ks_ls = ls_sol.minimizer + +# ╔═║ 794fec60-c448-4505-8190-b60e0119200f +begin + ΞΌ_outliers = ΞΌs .+ rand(rng, Laplace(0, Οƒmm), n_mm) + ΞΌ_outliers[[ 5, 17, 15, 23, 27, 30]] .= 0 + ΞΌ_outliers +end + +# ╔═║ 7e8586ee-0d49-4455-8ad8-82a3994a52b4 +scatter(Cs, ΞΌ_outliers) + +# ╔═║ 505b7f45-88af-4909-98e5-7f9311fafa01 +xs = rand(rng, Poisson(Ξ»_pois), 10) + +# ╔═║ 19221533-56dd-4d87-a00f-1b8f47160b00 +ll_pois(Ξ») = sum(x->loglikelihood(Poisson(Ξ»), x), xs) + +# ╔═║ 25fc4ca7-9e84-48f2-a4d4-4ebc0ad7183a +xs_large = rand(rng, Poisson(Ξ»_pois), 50) + +# ╔═║ 37aac79a-ec46-4b6f-a9b8-abf16a5fe7b7 +ll_pois_large(Ξ») = sum(x->loglikelihood(Poisson(Ξ»), x), xs_large) + +# ╔═║ a882ce40-3cba-464e-9069-62731120fccc +chain2 = sample(rng, model2, NUTS(0.45), MCMCSerial(), 5000, 3; progress=false); + +# ╔═║ de189153-7f26-4225-9cc1-ddbbcfac7867 +summarize(chain2) + +# ╔═║ 13372de2-77e8-40d9-b76a-7f379d0587e1 +lv_chain3 = sample(rng, lv_model3, NUTS(), MCMCSerial(), 1000, 3; progress=false) + +# ╔═║ 0cbe46a7-790a-4948-9ca0-5d84575a3f72 +neg(x) = -x + +# ╔═║ 55459b43-4e53-4f44-80d7-84c1f929fa52 +plots = Dict() + +# ╔═║ 6edf2f34-1e9e-4775-bd6a-624d003b6688 +let + plots["poly_data"] = scatter(xpoly, ypoly, ylab=L"y",xlab=L"x") +end + +# ╔═║ 181a4886-a515-4f06-9434-64b7387ee0d3 +let + p_ls = polynom(Ξ²ls) + p_tik = polynom(Ξ²tik) + p = scatter(xpoly, ypoly, label="data", xlab=L"x") + ylims!(-30, 25) + plot!(poly, -5, 5, lw=2, label="f(x)", alpha=0.8, legend=:bottom) + plot!(p_ls, -5, 5, lw=2, label="Penrose-Moore pseudo inverse", ls=:dash) + plot!(p_tik, -5, 5, lw=2, label="Tikhonov inverse (Ξ»=$Ξ»)", ls=:dashdot) + title!("Polynomial regression") + plots["poly_regr"] = p +end + +# ╔═║ 83bbcd7b-68e8-4f75-a007-400dd427913f +plots["MM_norm_data"] = scatter(Cs, ΞΌ_noise, xlab="X [mmol/L]", ylab="ΞΌ [mmol/s]", title="Michaelis-Menten data", label="data") + +# ╔═║ 2a154a97-2320-476b-8374-14cef9743c27 +let + p = contourf(0:0.1:50, 5:1:500, log ∘ sq_loss_mm, color=:speed, xlab=L"\mu_\max", ylab=L"K_s", title="Squared loss Michaelis-Menten") + xlims!(0, 50) + ylims!(5, 500) + plots["MM_ls_loss"] = scatter!([mu_max_ls], [Ks_ls], label="minimizer") +end + +# ╔═║ 721c147c-1ecb-4898-a962-08abe2a764d4 +let + p = scatter(Cs, ΞΌ_noise, xlab="X [mmol/L]", ylab="ΞΌ [mmol/s]", label="data") + title!(p, "MM least-squares") + plot!(x->mm(x, mu_max_ls, Ks_ls), 0, 180, lw=2, label="LS fit") + plots["MM_LS_fit"] = p +end + +# ╔═║ d5504f95-3fd4-4c02-9975-e201a9a09801 +let + ll(ΞΌmax, Ks) = -loglikelihood(mm_model_normal, (mu_max=ΞΌmax, Ks=Ks, sigmasq=1)) + p = contourf(0:0.1:50, 5:1:500, log ∘ ll, color=:speed, xlab=L"\mu_\max", ylab=L"K_s", title="Neg log-likelihood MM") + xlims!(0, 50) + ylims!(5, 500) + plots["MM_ll"] = scatter!([mu_max_ls], [Ks_ls], label="minimizer") +end + +# ╔═║ 9cf24cc2-ac54-4239-a313-ee7ecd680f35 +plots["MM_joint_post"] = marginalkde(chain_MM[:mu_max], chain_MM[:Ks], xlab=L"\mu_\max", ylab=L"K_s") + +# ╔═║ b69eb7d3-8660-44b2-992e-a2b9696d8e50 +let + p = scatter(Cs, ΞΌ_noise, xlab="X [mmol/L]", ylab="ΞΌ [mmol/s]", label="data") + title!(p, "MM MAP + posterior") + for mm_post in rand(generated_quantities(mm_model_normal, chain_MM), 200) + plot!(mm_post, 0, 180, lw=0.1, color="#BBBBBB", alpha=0.5, label="") + end + plot!(x->mm(x, mu_max_map, Ks_map), 0, 180, lw=2, label="MAP fit", color=2) + plot!([], lw=0.5, color="#BBBBBB", alpha=0.5, label="posterior sample") + plots["MM_MAP_post"] = p +end + +# ╔═║ 12990770-b44f-44b7-b981-9a008d9028d1 +plots["MM_outlier_data"] = scatter(Cs, ΞΌ_outliers, xlab="X [mmol/L]", ylab="ΞΌ [mmol/s]", title="Michaelis-Menten outliers", label="data") + +# ╔═║ b09cd3cb-c611-4679-ad6e-bc0eeddbf0f8 +let + mle = optimize(michaelis_menten(Xs, ΞΌ_outliers), MLE(), NelderMead()) + @show mu_max_n, Ks_n = mle.values[:mu_max], mle.values[:Ks] + + mle = optimize(michaelis_menten_robust(Xs, ΞΌ_outliers), MLE(), NelderMead()) + @show mu_max_r, Ks_r = mle.values[:mu_max], mle.values[:Ks] + + + p = scatter(Cs, ΞΌ_outliers, xlab="X [mmol/L]", ylab="ΞΌ [mmol/s]", title="Michaelis-Menten outliers fit", label="data") + plot!(x->mm(x, mu_max_n, Ks_n), 0, 180, lw=2, label="LS fit") + plot!(x->mm(x, mu_max_r, Ks_r), 0, 180, lw=2, label="absolute error fit", ls=:dash) + plots["MM_outliers_fit"] = p +end + +# ╔═║ d864db4d-e240-4b90-a8f7-0327eb9e18b0 +let + p = plot(ll_pois, 10, 50, label="log-likelihood 1 (small sample)", lw=2) + plot!(ll_pois_large, 10, 50, label="log-likelihood 2 (large sample)", lw=2, ls=:dash) + title!("Log-likelihoods different datasets") + xlabel!(L"\lambda") + ylabel!(L"\log L(\lambda)") + plots["poisson_LL"] = p +end + +# ╔═║ 8b71bd3c-60b6-425c-87cf-64652d04c8b7 +let + p = plot(pois_map, 0.3, 8, lw=2, label="unnormalized log-posterior", legend=:bottom) + plot!(x->pois_map(Ξ»_star) - fi/2 * (Ξ»_star-x)^2, 0, 8, label="second-order approx.", lw=2, ls=:dash) + title!("Laplace approximation") + xlabel!(L"\lambda") + ylabel!(L"\log P(\lambda\mid D)") + plots["Laplace_log"] = p +end + +# ╔═║ 6ed728a8-80a8-457a-8908-3c840b88efae +let + # scaling factor posterior + a = exp(logpdf(post_Laplace, Ξ»_star) - pois_map(Ξ»_star)) + p = plot(l -> a * exp(pois_map(l)), 0, 8, lw=2, label="posterior (scaled)", legend=:topright) + plot!(x->pdf(post_Laplace, x), 0, 8, label="normal approx.", lw=2, ls=:dash) + title!("Laplace approximation") + xlabel!(L"\lambda") + ylabel!(L"P(\lambda\mid D)") + plots["Laplace"] = p +end + +# ╔═║ d30119bd-e036-45fa-a325-e480d7d334b9 +plots["LV_diagnostic"] = plot(lv_chain) + +# ╔═║ 60022e21-b74a-41b7-a43d-6b14ed482112 +let + p = plot(; legend=false, ylab="population size") + posterior_samples = sample(lv_chain[[:Ξ±, :Ξ², :Ξ³, :Ξ΄]], 300; replace=false) + for p in eachrow(Array(posterior_samples)) + sol_p = solve(lv_prob, Tsit5(); p=p, saveat=0.1) + plot!(sol_p; alpha=0.1, color="#BBBBBB") + end + + # Plot simulation and noisy observations. + plot!(sol; color=[1 2], linewidth=2, ls=:auto) + title!("Posteriors of Lotka-Volterra") + scatter!(sol.t, odedata'; color=[1 2], marker=[:o :^]) + plots["LV_inf"] = p +end + +# ╔═║ 94cbbbd8-00f7-47fa-b814-0cbca085b886 +let + p = plot(; legend=false, ylab="population size") + posterior_samples = sample(chain2[[:Ξ±, :Ξ², :Ξ³, :Ξ΄]], 300; replace=false) + for p in eachrow(Array(posterior_samples)) + sol_p = solve(lv_prob, Tsit5(); p=p, saveat=0.1) + plot!(sol_p; alpha=0.1, color="#BBBBBB") + end + + title!("Posteriors using only the predators") + + # Plot simulation and noisy observations. + plot!(sol; color=[1 2], linewidth=2, ls=:auto) + scatter!(sol.t, odedata'; color=[1 2], marker=[:o :^], alpha=[0.3 1]) + plots["LV_only_pred"] = p +end + +# ╔═║ b8f6255c-f0e7-49d0-a14e-2711df5c2419 +plots["LV_counts_diag"] = plot(lv_chain3) + +# ╔═║ f845114c-b612-43c1-8a49-c3da8f52e278 +let + p = plot(; legend=false, ylab="population size") + posterior_samples = sample(lv_chain3[[:Ξ±, :Ξ², :Ξ³, :Ξ΄]], 300; replace=false) + for p in eachrow(Array(posterior_samples)) + sol_p = solve(lv_prob, Tsit5(); p=p, saveat=0.1) + plot!(sol_p; alpha=0.1, color="#BBBBBB") + end + + # Plot simulation and noisy observations. + plot!(sol; color=[1 2], linewidth=2, ls=:auto) + yaxis!(0:maximum(count_data)) + title!("Posteriors of Lotka-Volterra (counts)") + scatter!(sol.t, count_data'; color=[1 2], marker=[:o :^]) + plots["LV_counts"] = p +end + +# ╔═║ a2be0a77-fca0-4d7f-af15-254faaa7e336 +plots + +# ╔═║ Cell order: +# ╠═ab31fa80-0606-11ef-06f5-bd74bc457ff5 +# ╠═a10a9f8e-4088-49e2-a497-b1d253d83ecc +# ╠═4b38ba22-8c3f-4c90-b42a-79063489641e +# ╠═3e70b82a-e4d3-4747-9679-aa5ab41d5b06 +# β•Ÿβ”€0b6b3b7f-98e7-4922-82de-6a98453a627c +# ╠═1b055cac-6192-438f-8f3f-9891f5f06f49 +# ╠═ecceb6b5-74f4-4b5a-9c73-4ae1477b2c47 +# ╠═4ca12cc9-3bae-4535-a5c9-11cac5b2c89f +# ╠═ac3accfd-7edb-4bce-9891-d544210867e5 +# ╠═6daf07bc-807b-4dc5-8492-fc6f107cb294 +# ╠═4f5f7c4f-ff5b-450c-901d-e7395f6623dd +# ╠═81e20a6b-4309-464e-b57b-05a38558515f +# ╠═bdf2debf-5bd7-4183-a428-109b01fc7488 +# ╠═27eea16c-feff-4678-907e-f57fb7cf8c0e +# ╠═6edf2f34-1e9e-4775-bd6a-624d003b6688 +# ╠═66527df1-bd8b-45d6-b499-b5d17db84c42 +# ╠═70f8723f-1f85-4179-844d-0c4d0130d5c4 +# ╠═d194b539-f4c1-4ad5-a721-48b6cf73afed +# ╠═181a4886-a515-4f06-9434-64b7387ee0d3 +# ╠═e735ea0e-0c98-4707-bc5e-9c2bba04aa90 +# ╠═5b80b912-e625-44a4-9653-8306189718c4 +# ╠═2f8746e7-2e4a-4e40-bd48-f69349f1259d +# ╠═17252072-b71f-4c30-b108-8163dfd63fbf +# ╠═bf757553-7650-4b42-a07e-41007a3c29db +# ╠═2d82ae12-da64-426c-9ed1-f65480b88214 +# ╠═234bebb6-0d05-41a0-871d-50cf752d17a2 +# ╠═4a336948-d46e-415f-bcaf-07c667da4089 +# ╠═83bbcd7b-68e8-4f75-a007-400dd427913f +# ╠═f3fd99c7-94db-4cfa-a7f2-fe8d2bf33f8e +# ╠═a8de733e-8f92-443d-9a79-6dc4d17ca52b +# ╠═da7b2976-fa09-405a-8c86-081984c0ac8c +# ╠═1fda5580-0dcf-47f9-b03d-7e588d0e9c80 +# ╠═6fdabf8f-3569-4b5e-a7d8-79c8cdd2fcfc +# ╠═2a154a97-2320-476b-8374-14cef9743c27 +# ╠═721c147c-1ecb-4898-a962-08abe2a764d4 +# ╠═d5504f95-3fd4-4c02-9975-e201a9a09801 +# ╠═e2f28fc3-5cfd-4e5f-8e28-36a0e8bf43a2 +# ╠═0d262055-5220-42ae-b232-d96d4965667b +# ╠═ab9d0e48-6b7c-425b-a740-63bf65623a9a +# ╠═b1e883f7-10bb-47b6-af26-0c278b15c0b6 +# ╠═9cf24cc2-ac54-4239-a313-ee7ecd680f35 +# ╠═5ba1377a-b16e-4e70-8b72-c1477a75f4e8 +# ╠═ebb6d109-d4d2-4997-bf2b-6b7c12d47e3b +# ╠═b69eb7d3-8660-44b2-992e-a2b9696d8e50 +# ╠═9a51f9f4-b403-4466-981f-1aaa74a48e5a +# ╠═794fec60-c448-4505-8190-b60e0119200f +# ╠═12990770-b44f-44b7-b981-9a008d9028d1 +# ╠═07d91dc7-2db0-464e-bc61-9633f2bfe92b +# ╠═b09cd3cb-c611-4679-ad6e-bc0eeddbf0f8 +# ╠═7e8586ee-0d49-4455-8ad8-82a3994a52b4 +# ╠═0e5831ff-f542-40e1-9376-2abb420494b7 +# ╠═03373997-a9eb-4d5a-9ef5-8822c3f95285 +# ╠═70f8de3c-5c5f-4ff0-92eb-e6d2a06451e1 +# ╠═505b7f45-88af-4909-98e5-7f9311fafa01 +# ╠═25fc4ca7-9e84-48f2-a4d4-4ebc0ad7183a +# ╠═cd3746d4-518d-476e-abf4-2ac92a2c1387 +# ╠═19221533-56dd-4d87-a00f-1b8f47160b00 +# ╠═37aac79a-ec46-4b6f-a9b8-abf16a5fe7b7 +# β•Ÿβ”€d864db4d-e240-4b90-a8f7-0327eb9e18b0 +# ╠═6dc06148-79bf-44bf-8a5c-b6221b55bce0 +# ╠═d733961a-094a-4724-9b16-ee669a559945 +# ╠═de91d6d5-8115-4c79-9420-6f85873975b4 +# ╠═87e09095-3a14-4cef-b8a3-705b9cb243d5 +# ╠═46551486-d8a3-4aca-a92d-8c7f1c4439c0 +# ╠═580a4e54-5675-45f5-a3b8-241c2d5b470d +# ╠═0d6cc24c-6008-4bb7-8fb9-45223febc05b +# ╠═439bcebe-7607-441b-bae7-834482dd6059 +# β•Ÿβ”€1e634f77-286b-44ce-b768-72b060ee898b +# ╠═0082f110-22df-49d5-8958-29e9516e9ca8 +# ╠═697e8128-40d1-4c77-acfc-b948c88c394e +# ╠═ba822f9b-0b29-451e-9349-e08e3e5697fa +# ╠═362fe960-f247-4d7b-ab9d-01b67d1e647e +# ╠═f041b223-efec-4a29-a753-d6563a7f9a10 +# ╠═8feddb40-5cf8-4d76-a959-dd3071c20e27 +# ╠═8b71bd3c-60b6-425c-87cf-64652d04c8b7 +# ╠═6ed728a8-80a8-457a-8908-3c840b88efae +# ╠═da1aa2a7-e876-4b80-9204-d3ea11bc0f44 +# ╠═73e018a3-27f6-4631-a8c3-394644cb774e +# ╠═e79a72fc-9929-4faa-a76d-ad914fc731ab +# ╠═4c9f01b3-aef4-47ed-9633-1abda691b531 +# ╠═c3008b5a-7138-48a5-b744-d8f3aa2ff2ad +# ╠═db3f89f9-3bef-432f-b558-3d32c5e79abe +# ╠═eb132faa-fedb-4e18-868f-46783e503515 +# ╠═2a25b088-7414-48a2-a702-8c87213b92d3 +# ╠═a05d6800-a168-4e44-bfcb-0809aedda09e +# ╠═b3c31cca-b472-4dec-b700-11cbff9465a9 +# ╠═14810fe9-e6fe-46c7-b6cf-9705b5974113 +# ╠═79473eed-7fba-43e7-80a7-51d011931578 +# ╠═3fc31430-b15d-4fa8-a326-5de13f380b5c +# ╠═5f62cec0-3e8f-42f0-9cf6-e30239456803 +# ╠═6c6ce02e-1413-49f4-925b-0d07711690c0 +# ╠═d30119bd-e036-45fa-a325-e480d7d334b9 +# ╠═60022e21-b74a-41b7-a43d-6b14ed482112 +# ╠═daae0473-49b2-4630-aa79-79e10dcb3120 +# ╠═27ddc0aa-398c-439c-9a5c-a6153d081f51 +# ╠═a882ce40-3cba-464e-9069-62731120fccc +# ╠═de189153-7f26-4225-9cc1-ddbbcfac7867 +# ╠═94cbbbd8-00f7-47fa-b814-0cbca085b886 +# ╠═c7a19043-cf44-44cc-8317-5caff29269cc +# ╠═08da7b32-1e53-46da-bfeb-ea16b23dddf8 +# ╠═570db1f7-324c-41b8-b9eb-eea747ca8b9e +# ╠═13372de2-77e8-40d9-b76a-7f379d0587e1 +# ╠═b8f6255c-f0e7-49d0-a14e-2711df5c2419 +# ╠═f845114c-b612-43c1-8a49-c3da8f52e278 +# ╠═ec0dd911-b3e1-43c8-9fdc-8fffe49945d3 +# ╠═894bfbf5-26c0-43e2-8f5b-fef4c41e3438 +# ╠═03457e54-33ae-4cf8-a4a9-85dab26c1ef9 +# ╠═0c6aebf8-b18f-4987-b13e-e687436af550 +# ╠═5dee9551-a275-4c92-8a35-9bf7d2a91e7d +# ╠═6984bd57-e95f-40b1-aecc-a864177bdb72 +# ╠═e4fd9a2f-92be-4d4f-a3b0-475848e7aed3 +# ╠═d43ee840-dfc5-4d2d-bb0f-14faf1573e73 +# ╠═3b0ca57f-d7f3-4bbf-91b8-23d488c3d3cd +# ╠═7cff29b5-3478-49ae-abea-712cfbee762d +# ╠═8f08acd8-4480-418d-89dd-64f795be6347 +# ╠═9b82503e-48a0-4c78-b7e7-0102b2d1f9d5 +# ╠═1a283f5a-ad39-4f16-b2b2-ff531f1a9634 +# ╠═4acefe9c-8ea1-4491-9f03-0be80c5211c3 +# ╠═e2eaca92-3b18-4448-967f-ec78d165bd68 +# ╠═cc104cdb-47d0-4b6b-adc4-103a6dad5421 +# ╠═f55335b3-c0ec-467f-9056-c5416b662088 +# ╠═99399d90-29cc-4648-871d-67adbebfec8a +# ╠═e7e7dd46-835a-4cf1-aec5-e5ae1d2b1b1b +# ╠═41c6b352-77f9-4480-be19-20db633c7a6e +# ╠═f5819e00-2e6a-4886-b363-f23ddc5abd72 +# ╠═16b6935f-1a37-4b12-ac18-5803175555a5 +# ╠═255c791b-0012-4a04-b794-f9ffe1c62a26 +# ╠═290d4176-5715-4b49-85d5-c90bde256b00 +# ╠═80d28884-c66e-4384-ac44-d8768d8c810f +# ╠═63ea89c5-df05-4651-b655-10d678fde222 +# ╠═9b3e76fc-0c0b-4bd0-8af8-5e6053e24094 +# ╠═960814cb-611e-4057-8667-0c4de798a96e +# ╠═9b317909-8997-46e2-809d-b005332c1022 +# ╠═bf80bb42-75c8-4064-952c-0613e3e8188d +# ╠═5ff4ccf6-9bd8-4318-9de3-7752ed66f51a +# ╠═63214fc8-2c39-4cbe-8aa7-da36e904e978 +# ╠═f241d041-34a1-4399-a724-8be968ed4677 +# ╠═0a283dff-c28e-4349-ad3f-a07b16bf274b +# ╠═0a461157-58f1-4478-9700-65bf5fb80ebe +# ╠═67c24c30-1416-4947-b8cd-685099f3001b +# ╠═5c349b88-5789-4bda-a8d9-4a5d9af22e93 +# ╠═25ac2424-170c-463d-9a5e-c900f3ed8674 +# ╠═0e6ba65b-067c-42f4-90b7-8b8c387a2fa9 +# ╠═0c9c49af-59cc-4f2a-9de2-6095d379e18b +# ╠═018aa4ed-b4c2-4413-80c9-af4f34256865 +# ╠═a7105efd-a192-406e-949c-75c8d9e35da9 +# ╠═7e6dbcd1-be40-4315-87a9-129b7f8ce341 +# ╠═3fea2784-e662-4b01-896c-54bc913adf40 +# ╠═0f40a683-d4e7-4fc8-bf5e-18de8e3d6111 +# ╠═1ba6e0d0-3166-41ab-a106-df73e4579f39 +# ╠═6185ec28-3286-40c8-bdcc-6d8e812bb7df +# ╠═c4896649-a42c-4fd8-a8ef-ecc2eeee61d9 +# ╠═95b92274-f1a2-4c4f-b058-d384211b9c1a +# ╠═dd285391-6df6-47f7-a568-8786d2000f24 +# ╠═16089b87-a760-4309-86b9-8300bb5a23cf +# ╠═05ed997f-e9b1-4f10-a186-78eac7f8aa8a +# ╠═dd7415cd-2646-4135-a389-baf8d6657fe1 +# ╠═2f28d23a-36a3-4831-a8df-ce08cfd7c44e +# ╠═3af17761-3a77-4c83-a54b-b55e2a3eb708 +# ╠═0cbe46a7-790a-4948-9ca0-5d84575a3f72 +# ╠═55459b43-4e53-4f44-80d7-84c1f929fa52 +# ╠═a2be0a77-fca0-4d7f-af15-254faaa7e336 diff --git a/scripts/hiptobesquare.jl b/scripts/hiptobesquare.jl new file mode 100644 index 00000000..729c124c --- /dev/null +++ b/scripts/hiptobesquare.jl @@ -0,0 +1,2992 @@ +### A Pluto.jl notebook ### +# v0.20.3 + +using Markdown +using InteractiveUtils + +# ╔═║ 2c1a0946-a740-11ef-250e-f9996d64ceef +using Turing, Plots, PlutoUI + +# ╔═║ 0e45d65e-a24c-4907-85a2-b007137d4c8f +md""" +# Hip to be square + +Given four points on the plane, can we determine wether they form a general quadrangle, or rather a trapizum or a rectangle? We build a stochastic model for each type of four-sized planar figure (with some noise) as a likelihood model. + +""" + +# ╔═║ 1f6a1199-b68e-4306-a0b6-68eeb0ab0c35 +@model function quadrangle(;a=40, Οƒ=0) + x1 ~ Uniform(0, a) + y1 ~ Uniform(0, a) + x2 ~ Uniform(0, a) + y2 ~ Uniform(-a, 0) + x3 ~ Uniform(-a, 0) + y3 ~ Uniform(-a, 0) + x4 ~ Uniform(-a, 0) + y4 ~ Uniform(0, a) + return [(x1, y1), (x2, y2), (x3, y3), (x4, y4)] +end + +# ╔═║ f23717b9-cdd8-45da-9d40-8df16a77bbb9 +@model function trapezoid(;a=25, Οƒ=1) + x1 ~ Uniform(0, a) + y1 ~ Uniform(0, a) + x2 ~ Uniform(0, a) + y2 ~ Uniform(-a, 0) + x3 ~ Uniform(-a, 0) + y3 ~ Normal(y2, Οƒ) + x4 ~ Uniform(-a, 0) + y4 ~ Normal(y1, Οƒ) + return [(x1, y1), (x2, y2), (x3, y3), (x4, y4)] +end + +# ╔═║ a6d98c47-0e93-47ee-88bc-928606f22817 +@model function parallelogram(;a=25, Οƒ=1) + x1 ~ Uniform(0, a) + y1 ~ Uniform(0, a) + x2 ~ Uniform(0, a) + y2 ~ Uniform(-a, 0) + x3 ~ Normal(-x1, Οƒ) + y3 ~ Normal(-y1, Οƒ) + x4 ~ Normal(-x2, Οƒ) + y4 ~ Normal(-y2, Οƒ) + return [(x1, y1), (x2, y2), (x3, y3), (x4, y4)] +end + +# ╔═║ 700236c1-c8d5-4b00-a14f-f87cf9b2a4f4 +@model function diamond(;a=25, Οƒ=1) + x1 ~ Uniform(0, a) + y1 ~ Uniform(0, a) + x2 ~ Normal(y1, Οƒ) + y2 ~ Normal(-x1, Οƒ) + x3 ~ Normal(-x1, Οƒ) + y3 ~ Normal(-y1, Οƒ) + x4 ~ Normal(-y1, Οƒ) + y4 ~ Normal(x1, Οƒ) + return [(x1, y1), (x2, y2), (x3, y3), (x4, y4)] +end + +# ╔═║ 6c5542c5-c413-4383-9a76-517324b56eed +@model function rectangle(;a=25, Οƒ=1) + x1 ~ Uniform(0, a) + y1 ~ Uniform(0, a) + x2 ~ Normal(x1, Οƒ) + y2 ~ Normal(-y1, Οƒ) + x3 ~ Normal(-x1, Οƒ) + y3 ~ Normal(-y1, Οƒ) + x4 ~ Normal(-x1, Οƒ) + y4 ~ Normal(y1, Οƒ) + return [(x1, y1), (x2, y2), (x3, y3), (x4, y4)] +end + +# ╔═║ 3b4b22a1-e1dc-4049-9de5-3b3ea1838ac7 +@model function square(;a=25, Οƒ=1) + x1 ~ Uniform(0, a) + y1 ~ Normal(x1, Οƒ) + x2 ~ Normal(x1, Οƒ) + y2 ~ Normal(-y1, Οƒ) + x3 ~ Normal(-x1, Οƒ) + y3 ~ Normal(-y1, Οƒ) + x4 ~ Normal(-x1, Οƒ) + y4 ~ Normal(y1, Οƒ) + return [(x1, y1), (x2, y2), (x3, y3), (x4, y4)] +end + +# ╔═║ 41e1e987-1c8b-4f5b-aaa1-c6d9221dd718 +md"Look at some samples from each model." + +# ╔═║ 865c0b8c-8154-412f-a5ce-828767e3fe4c +# likelihood function +function ll(model, ((x1, y1), (x2, y2), (x3, y3), (x4, y4))) + return logprior(model, (;x1, y1, x2, y2, x3, y3, x4, y4)) +end + +# ╔═║ 6a884693-6a8b-423e-889e-4fb72823dd52 +examples = Dict( + 'A' => [(17.84717547196566, 19.760715118486512), (34.6061398162441, -33.38433191621974), (-1.693375136201844, -31.987940353049794), (-30.695701527005323, 6.7824003353973605)], + 'B' => [(0.06879125492495752, 23.66395708167892), (15.48365977053534, -9.183291910824748), (-12.008630133706683, -9.549131031542046), (-13.5065409760042, 23.765726315750936)], + 'C' => [(21.51869365548042, 8.158751439337376), (8.088970745018122, -21.19041987275375), (-21.269534643997858, -8.25944315605066), (-8.530202167842445, 21.010662780051337)], + 'D' => [(17.30454621153156, 11.780046713473705), (17.647126164256964, -11.935772579978874), (-17.446512799022273, -11.444824263465748), (-17.356604119938453, 12.115750066824315)] +) + +# ╔═║ 60d39b99-826b-4d25-a589-0939218b9dda +md"Look at four figures, what type of four-sided figure fits best?" + +# ╔═║ a3c06ab2-4107-4ecf-903b-71ad1d4e2749 +for k in "ABCD" + a = 40 + Οƒ = 1 + println("Figure $k :") + points = examples[k] + for (fig, model) in [("Quadrangle", quadrangle(;a, Οƒ)), + ("Trapezoid", trapezoid(;a, Οƒ)), + ("Parallelogram", parallelogram(;a, Οƒ)), + ("Diamond", diamond(;a, Οƒ)), + ("Rectangle", rectangle(;a, Οƒ)), + ("Square", square(;a, Οƒ))] + logP = ll(model, points) + println("log(P(D | $fig)) = $logP" ) + end + println() +end + +# ╔═║ 1f9e8740-5f69-465c-9428-010959ad6e54 +md"What if we only know the first 3 points? (open question)" + +# ╔═║ 72f991f2-d65a-4197-bbe4-218457ca126e +# likelihood function +function ll3(model, ((x1, y1), (x2, y2), (x3, y3), (x4, y4))) + modcond = model | (x4=0, y4=0) + return logprior(modcond, (;x1, y1, x2, y2, x3, y3)) +end + +# ╔═║ d7375d2b-5b9b-4729-bd99-24ca5e5696e5 +for k in "ABCD" + a = 40 + Οƒ = 1 + println("Figure $k :") + points = examples[k] + for (fig, model) in [("Quadrangle", quadrangle(;a, Οƒ)), + ("Trapezoid", trapezoid(;a, Οƒ)), + ("Parallelogram", parallelogram(;a, Οƒ)), + ("Diamond", diamond(;a, Οƒ)), + ("Rectangle", rectangle(;a, Οƒ)), + ("Square", square(;a, Οƒ))] + logP = ll3(model, points) + println("log(P(D | $fig)) = $logP" ) + end + println() +end + +# ╔═║ a09ab912-9591-4c98-b68c-18a158cee8bb +md"For C, let us only use the first three points." + +# ╔═║ 93c6a456-4c2a-4de8-b0d0-ba8ab5f84568 +((x1, y1), (x2, y2), (x3, y3), (x4, y4)) = examples['C'] + +# ╔═║ c97046d2-1086-4226-a805-b0daaeb69cec +parall_C = parallelogram() | (;x1, y1, x2, y2, x3, y3) + +# ╔═║ 74618951-6323-4ed6-8f1c-7b67e72aca0c +chain_parall_C = sample(parall_C, NUTS(), 100) + +# ╔═║ 54800758-a1fc-40cc-89b6-821f7be696f8 +diamond_C = diamond() | (;x1, y1, x2, y2, x3, y3) + +# ╔═║ 41bcacee-505a-4199-b482-f70900fded60 +chain_diamond_C = sample(diamond_C, NUTS(), 100) + +# ╔═║ a0020d1e-09c0-4b1d-a46a-68c5c59e9dc8 +s = rectangle(Οƒ=0.4)() + +# ╔═║ 19780c4e-8fe4-42eb-b9bb-52483dfcb9df +ll(diamond(), s) + +# ╔═║ acf4f4e1-785c-4ce0-817f-0ea98e05b463 +ll(parallelogram(), s) + +# ╔═║ 2b1b47d9-984e-4cd4-9b82-5476c6ff571e +ll(quadrangle(), s) + +# ╔═║ cb9551a6-6235-4be9-85f4-e2f0b8e75a27 +ll(rectangle(), s) + +# ╔═║ bc086d8e-1df6-47f7-a337-9a4c30f81066 +ll(square(), s) + +# ╔═║ 56d28d18-0111-44a5-aead-2bfbcf55cd96 +function plotquadrangle!(p, points; kwargs...) + xs = first.(points) + ys = last.(points) + scatter!(xs, ys, pch=:c, label="", ms=0.4) + append!(xs, first(xs)) + append!(ys, first(ys)) + return plot!(p, xs, ys, lw=0.5, + xlab="x", ylab="y", xticks=false, yticks=false, + alpha=0.7, label="", aspect_ratio=:equal; kwargs...) +end + +# ╔═║ d103555c-6f5a-4436-8e0c-56ba1a82ed8a +begin + plots_examples = Dict() + for key in "ABCD" + points = examples[key] + p = plot(title=key) + plots_examples[key] = plotquadrangle!(p, points, lw=2) + end +end + +# ╔═║ 65a4a9ec-b858-4850-8c02-e3432424717d +let + p = plot() + plotquadrangle!(p, s) +end + +# ╔═║ 9b588684-d5f6-495e-9830-64f478636d44 +rectangle(Οƒ=0.4)() + +# ╔═║ e199bbb9-64f9-4e7d-9561-e40eb5b5f6f4 +logprior(diamond(), (x1=3, y1=4, x2=2, y2=-1, y3=-2, x3=-2, x4=-3, y4=2)) + +# ╔═║ f659c53f-0fbb-4329-a06c-daa81346c5a3 +plots = Dict() + +# ╔═║ a92ed5c6-9fb3-4b83-919d-bbbe170fd2b0 +begin + plots_samples = Dict() + a = 20 + Οƒ = 1/4 + n = 8 + for (fig, sampler) in [("Quadrangle", quadrangle(;a, Οƒ)), + ("Trapezoid", trapezoid(;a, Οƒ)), + ("Parallelogram", parallelogram(;a, Οƒ)), + ("Diamond", diamond(;a, Οƒ)), + ("Rectangle", rectangle(;a, Οƒ)), + ("Square", square(;a, Οƒ))] + p = plot(title=fig, ) + for i in 1:n + points = sampler() + plotquadrangle!(p, points, lw=1) + end + plots_samples[fig] = p + plots["quadre_samples_$fig"] = p + end +end + +# ╔═║ 16a240f0-f8b6-445a-b28c-e8e04682121d +plots["quadre_samples"] = plot(plots_samples["Quadrangle"], plots_samples["Trapezoid"],plots_samples["Parallelogram"],plots_samples["Diamond"],plots_samples["Rectangle"],plots_samples["Square"],) + +# ╔═║ 2597d512-10ce-4dfb-a21e-33ac20a59442 +plots["quadre_data"] = plot([plots_examples[k] for k in "ABCD"]...) + +# ╔═║ 38bbea6c-b53d-4034-9b05-04791282005e +plots + +# ╔═║ 00000000-0000-0000-0000-000000000001 +PLUTO_PROJECT_TOML_CONTENTS = """ +[deps] +Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" +PlutoUI = "7f904dfe-b85e-4ff6-b463-dae2292396a8" +Turing = "fce5fe82-541a-59a6-adf8-730c64b5f9a0" + +[compat] +Plots = "~1.40.8" +PlutoUI = "~0.7.60" +Turing = "~0.34.1" +""" + +# ╔═║ 00000000-0000-0000-0000-000000000002 +PLUTO_MANIFEST_TOML_CONTENTS = """ +# This file is machine-generated - editing it directly is not advised + +julia_version = "1.10.3" +manifest_format = "2.0" +project_hash = "7c7d8f95dc077766d10b7895949effc1e064cb53" + +[[deps.ADTypes]] +git-tree-sha1 = "eea5d80188827b35333801ef97a40c2ed653b081" +uuid = "47edcb42-4c32-4615-8424-f2b9edc5f35b" +version = "1.9.0" + + [deps.ADTypes.extensions] + ADTypesChainRulesCoreExt = "ChainRulesCore" + ADTypesEnzymeCoreExt = "EnzymeCore" + + [deps.ADTypes.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + EnzymeCore = "f151be2c-9106-41f4-ab19-57ee4f262869" + +[[deps.AbstractFFTs]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "d92ad398961a3ed262d8bf04a1a2b8340f915fef" +uuid = "621f4979-c628-5d54-868e-fcf4e3e8185c" +version = "1.5.0" +weakdeps = ["ChainRulesCore", "Test"] + + [deps.AbstractFFTs.extensions] + AbstractFFTsChainRulesCoreExt = "ChainRulesCore" + AbstractFFTsTestExt = "Test" + +[[deps.AbstractMCMC]] +deps = ["BangBang", "ConsoleProgressMonitor", "Distributed", "FillArrays", "LogDensityProblems", "Logging", "LoggingExtras", "ProgressLogging", "Random", "StatsBase", "TerminalLoggers", "Transducers"] +git-tree-sha1 = "c732dd9f356d26cc48d3b484f3fd9886c0ba8ba3" +uuid = "80f14c24-f653-4e6a-9b94-39d6b0f70001" +version = "5.5.0" + +[[deps.AbstractPPL]] +deps = ["AbstractMCMC", "Accessors", "DensityInterface", "Random"] +git-tree-sha1 = "6380a9a03a4207bac53ac310dd3a283bb4df54ef" +uuid = "7a57a42e-76ec-4ea3-a279-07e840d6d9cf" +version = "0.8.4" + +[[deps.AbstractPlutoDingetjes]] +deps = ["Pkg"] +git-tree-sha1 = "6e1d2a35f2f90a4bc7c2ed98079b2ba09c35b83a" +uuid = "6e696c72-6542-2067-7265-42206c756150" +version = "1.3.2" + +[[deps.AbstractTrees]] +git-tree-sha1 = "2d9c9a55f9c93e8887ad391fbae72f8ef55e1177" +uuid = "1520ce14-60c1-5f80-bbc7-55ef81b5835c" +version = "0.4.5" + +[[deps.Accessors]] +deps = ["CompositionsBase", "ConstructionBase", "InverseFunctions", "LinearAlgebra", "MacroTools", "Markdown"] +git-tree-sha1 = "b392ede862e506d451fc1616e79aa6f4c673dab8" +uuid = "7d9f7c33-5ae7-4f3b-8dc6-eff91059b697" +version = "0.1.38" + + [deps.Accessors.extensions] + AccessorsAxisKeysExt = "AxisKeys" + AccessorsDatesExt = "Dates" + AccessorsIntervalSetsExt = "IntervalSets" + AccessorsStaticArraysExt = "StaticArrays" + AccessorsStructArraysExt = "StructArrays" + AccessorsTestExt = "Test" + AccessorsUnitfulExt = "Unitful" + + [deps.Accessors.weakdeps] + AxisKeys = "94b1ba4f-4ee9-5380-92f1-94cde586c3c5" + Dates = "ade2ca70-3891-5945-98fb-dc099432e06a" + IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953" + Requires = "ae029012-a4dd-5104-9daa-d747884805df" + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + StructArrays = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" + Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" + +[[deps.Adapt]] +deps = ["LinearAlgebra", "Requires"] +git-tree-sha1 = "d80af0733c99ea80575f612813fa6aa71022d33a" +uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" +version = "4.1.0" +weakdeps = ["StaticArrays"] + + [deps.Adapt.extensions] + AdaptStaticArraysExt = "StaticArrays" + +[[deps.AdvancedHMC]] +deps = ["AbstractMCMC", "ArgCheck", "DocStringExtensions", "InplaceOps", "LinearAlgebra", "LogDensityProblems", "LogDensityProblemsAD", "ProgressMeter", "Random", "Requires", "Setfield", "SimpleUnPack", "Statistics", "StatsBase", "StatsFuns"] +git-tree-sha1 = "1da0961a400c28d1e5f057e922ff75ec5d6a5747" +uuid = "0bf59076-c3b1-5ca4-86bd-e02cd72cde3d" +version = "0.6.2" + + [deps.AdvancedHMC.extensions] + AdvancedHMCCUDAExt = "CUDA" + AdvancedHMCMCMCChainsExt = "MCMCChains" + AdvancedHMCOrdinaryDiffEqExt = "OrdinaryDiffEq" + + [deps.AdvancedHMC.weakdeps] + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + MCMCChains = "c7f686f2-ff18-58e9-bc7b-31028e88f75d" + OrdinaryDiffEq = "1dea7af3-3e70-54e6-95c3-0bf5283fa5ed" + +[[deps.AdvancedMH]] +deps = ["AbstractMCMC", "Distributions", "FillArrays", "LinearAlgebra", "LogDensityProblems", "Random", "Requires"] +git-tree-sha1 = "66ac4c7b320d2434f04d48116db02e73e6dabc8b" +uuid = "5b7e9947-ddc0-4b3f-9b55-0d8042f74170" +version = "0.8.3" +weakdeps = ["DiffResults", "ForwardDiff", "MCMCChains", "StructArrays"] + + [deps.AdvancedMH.extensions] + AdvancedMHForwardDiffExt = ["DiffResults", "ForwardDiff"] + AdvancedMHMCMCChainsExt = "MCMCChains" + AdvancedMHStructArraysExt = "StructArrays" + +[[deps.AdvancedPS]] +deps = ["AbstractMCMC", "Distributions", "Random", "Random123", "Requires", "SSMProblems", "StatsFuns"] +git-tree-sha1 = "5dcd3de7e7346f48739256e71a86d0f96690b8c8" +uuid = "576499cb-2369-40b2-a588-c64705576edc" +version = "0.6.0" +weakdeps = ["Libtask"] + + [deps.AdvancedPS.extensions] + AdvancedPSLibtaskExt = "Libtask" + +[[deps.AdvancedVI]] +deps = ["ADTypes", "Bijectors", "DiffResults", "Distributions", "DistributionsAD", "DocStringExtensions", "ForwardDiff", "LinearAlgebra", "ProgressMeter", "Random", "Requires", "StatsBase", "StatsFuns", "Tracker"] +git-tree-sha1 = "c217a9b531b4b752eb120a9f820527126ba68fb9" +uuid = "b5ca4192-6429-45e5-a2d9-87aec30a685c" +version = "0.2.8" + + [deps.AdvancedVI.extensions] + AdvancedVIEnzymeExt = ["Enzyme"] + AdvancedVIFluxExt = ["Flux"] + AdvancedVIReverseDiffExt = ["ReverseDiff"] + AdvancedVIZygoteExt = ["Zygote"] + + [deps.AdvancedVI.weakdeps] + Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9" + Flux = "587475ba-b771-5e3f-ad9e-33799f191a9c" + ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f" + +[[deps.AliasTables]] +deps = ["PtrArrays", "Random"] +git-tree-sha1 = "9876e1e164b144ca45e9e3198d0b689cadfed9ff" +uuid = "66dad0bd-aa9a-41b7-9441-69ab47430ed8" +version = "1.1.3" + +[[deps.ArgCheck]] +git-tree-sha1 = "a3a402a35a2f7e0b87828ccabbd5ebfbebe356b4" +uuid = "dce04be8-c92d-5529-be00-80e4d2c0e197" +version = "2.3.0" + +[[deps.ArgTools]] +uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" +version = "1.1.1" + +[[deps.ArnoldiMethod]] +deps = ["LinearAlgebra", "Random", "StaticArrays"] +git-tree-sha1 = "d57bd3762d308bded22c3b82d033bff85f6195c6" +uuid = "ec485272-7323-5ecc-a04f-4719b315124d" +version = "0.4.0" + +[[deps.ArrayInterface]] +deps = ["Adapt", "LinearAlgebra"] +git-tree-sha1 = "3640d077b6dafd64ceb8fd5c1ec76f7ca53bcf76" +uuid = "4fba245c-0d91-5ea0-9b3e-6abc04ee57a9" +version = "7.16.0" + + [deps.ArrayInterface.extensions] + ArrayInterfaceBandedMatricesExt = "BandedMatrices" + ArrayInterfaceBlockBandedMatricesExt = "BlockBandedMatrices" + ArrayInterfaceCUDAExt = "CUDA" + ArrayInterfaceCUDSSExt = "CUDSS" + ArrayInterfaceChainRulesExt = "ChainRules" + ArrayInterfaceGPUArraysCoreExt = "GPUArraysCore" + ArrayInterfaceReverseDiffExt = "ReverseDiff" + ArrayInterfaceSparseArraysExt = "SparseArrays" + ArrayInterfaceStaticArraysCoreExt = "StaticArraysCore" + ArrayInterfaceTrackerExt = "Tracker" + + [deps.ArrayInterface.weakdeps] + BandedMatrices = "aae01518-5342-5314-be14-df237901396f" + BlockBandedMatrices = "ffab5731-97b5-5995-9138-79e8c1846df0" + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + CUDSS = "45b445bb-4962-46a0-9369-b4df9d0f772e" + ChainRules = "082447d4-558c-5d27-93f4-14fc19e9eca2" + GPUArraysCore = "46192b85-c4d5-4398-a991-12ede77f4527" + ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + StaticArraysCore = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" + Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" + +[[deps.Artifacts]] +uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" + +[[deps.Atomix]] +deps = ["UnsafeAtomics"] +git-tree-sha1 = "c06a868224ecba914baa6942988e2f2aade419be" +uuid = "a9b6321e-bd34-4604-b9c9-b65b8de01458" +version = "0.1.0" + +[[deps.AxisAlgorithms]] +deps = ["LinearAlgebra", "Random", "SparseArrays", "WoodburyMatrices"] +git-tree-sha1 = "01b8ccb13d68535d73d2b0c23e39bd23155fb712" +uuid = "13072b0f-2c55-5437-9ae7-d433b7a33950" +version = "1.1.0" + +[[deps.AxisArrays]] +deps = ["Dates", "IntervalSets", "IterTools", "RangeArrays"] +git-tree-sha1 = "16351be62963a67ac4083f748fdb3cca58bfd52f" +uuid = "39de3d68-74b9-583c-8d2d-e117c070f3a9" +version = "0.4.7" + +[[deps.BangBang]] +deps = ["Accessors", "ConstructionBase", "InitialValues", "LinearAlgebra", "Requires"] +git-tree-sha1 = "e2144b631226d9eeab2d746ca8880b7ccff504ae" +uuid = "198e06fe-97b7-11e9-32a5-e1d131e6ad66" +version = "0.4.3" + + [deps.BangBang.extensions] + BangBangChainRulesCoreExt = "ChainRulesCore" + BangBangDataFramesExt = "DataFrames" + BangBangStaticArraysExt = "StaticArrays" + BangBangStructArraysExt = "StructArrays" + BangBangTablesExt = "Tables" + BangBangTypedTablesExt = "TypedTables" + + [deps.BangBang.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + StructArrays = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" + Tables = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" + TypedTables = "9d95f2ec-7b3d-5a63-8d20-e2491e220bb9" + +[[deps.Base64]] +uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" + +[[deps.Baselet]] +git-tree-sha1 = "aebf55e6d7795e02ca500a689d326ac979aaf89e" +uuid = "9718e550-a3fa-408a-8086-8db961cd8217" +version = "0.1.1" + +[[deps.Bijections]] +git-tree-sha1 = "d8b0439d2be438a5f2cd68ec158fe08a7b2595b7" +uuid = "e2ed5e7c-b2de-5872-ae92-c73ca462fb04" +version = "0.1.9" + +[[deps.Bijectors]] +deps = ["ArgCheck", "ChainRules", "ChainRulesCore", "ChangesOfVariables", "Compat", "Distributions", "DocStringExtensions", "Functors", "InverseFunctions", "IrrationalConstants", "LinearAlgebra", "LogExpFunctions", "MappedArrays", "Random", "Reexport", "Requires", "Roots", "SparseArrays", "Statistics"] +git-tree-sha1 = "92edc3544607c4fda1b30357910597e2a70dc5ea" +uuid = "76274a88-744f-5084-9051-94815aaf08c4" +version = "0.13.18" + + [deps.Bijectors.extensions] + BijectorsDistributionsADExt = "DistributionsAD" + BijectorsEnzymeExt = "Enzyme" + BijectorsForwardDiffExt = "ForwardDiff" + BijectorsLazyArraysExt = "LazyArrays" + BijectorsReverseDiffExt = "ReverseDiff" + BijectorsTapirExt = "Tapir" + BijectorsTrackerExt = "Tracker" + BijectorsZygoteExt = "Zygote" + + [deps.Bijectors.weakdeps] + DistributionsAD = "ced4e74d-a319-5a8a-b0ac-84af2272839c" + Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9" + ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + LazyArrays = "5078a376-72f3-5289-bfd5-ec5146d43c02" + ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + Tapir = "07d77754-e150-4737-8c94-cd238a1fb45b" + Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" + Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f" + +[[deps.BitFlags]] +git-tree-sha1 = "0691e34b3bb8be9307330f88d1a3c3f25466c24d" +uuid = "d1d4a3ce-64b1-5f1a-9ba4-7e7e69966f35" +version = "0.1.9" + +[[deps.Bzip2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "8873e196c2eb87962a2048b3b8e08946535864a1" +uuid = "6e34b625-4abd-537c-b88f-471c36dfa7a0" +version = "1.0.8+2" + +[[deps.CEnum]] +git-tree-sha1 = "389ad5c84de1ae7cf0e28e381131c98ea87d54fc" +uuid = "fa961155-64e5-5f13-b03f-caf6b980ea82" +version = "0.5.0" + +[[deps.Cairo_jll]] +deps = ["Artifacts", "Bzip2_jll", "CompilerSupportLibraries_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "JLLWrappers", "LZO_jll", "Libdl", "Pixman_jll", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Zlib_jll", "libpng_jll"] +git-tree-sha1 = "009060c9a6168704143100f36ab08f06c2af4642" +uuid = "83423d85-b0ee-5818-9007-b63ccbeb887a" +version = "1.18.2+1" + +[[deps.ChainRules]] +deps = ["Adapt", "ChainRulesCore", "Compat", "Distributed", "GPUArraysCore", "IrrationalConstants", "LinearAlgebra", "Random", "RealDot", "SparseArrays", "SparseInverseSubset", "Statistics", "StructArrays", "SuiteSparse"] +git-tree-sha1 = "be227d253d132a6d57f9ccf5f67c0fb6488afd87" +uuid = "082447d4-558c-5d27-93f4-14fc19e9eca2" +version = "1.71.0" + +[[deps.ChainRulesCore]] +deps = ["Compat", "LinearAlgebra"] +git-tree-sha1 = "3e4b134270b372f2ed4d4d0e936aabaefc1802bc" +uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" +version = "1.25.0" +weakdeps = ["SparseArrays"] + + [deps.ChainRulesCore.extensions] + ChainRulesCoreSparseArraysExt = "SparseArrays" + +[[deps.ChangesOfVariables]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "799b25ca3a8a24936ae7b5c52ad194685fc3e6ef" +uuid = "9e997f8a-9a97-42d5-a9f1-ce6bfc15e2c0" +version = "0.1.9" +weakdeps = ["InverseFunctions", "Test"] + + [deps.ChangesOfVariables.extensions] + ChangesOfVariablesInverseFunctionsExt = "InverseFunctions" + ChangesOfVariablesTestExt = "Test" + +[[deps.CodecZlib]] +deps = ["TranscodingStreams", "Zlib_jll"] +git-tree-sha1 = "bce6804e5e6044c6daab27bb533d1295e4a2e759" +uuid = "944b1d66-785c-5afd-91f1-9de20f533193" +version = "0.7.6" + +[[deps.ColorSchemes]] +deps = ["ColorTypes", "ColorVectorSpace", "Colors", "FixedPointNumbers", "PrecompileTools", "Random"] +git-tree-sha1 = "b5278586822443594ff615963b0c09755771b3e0" +uuid = "35d6a980-a343-548e-a6ea-1d62b119f2f4" +version = "3.26.0" + +[[deps.ColorTypes]] +deps = ["FixedPointNumbers", "Random"] +git-tree-sha1 = "b10d0b65641d57b8b4d5e234446582de5047050d" +uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f" +version = "0.11.5" + +[[deps.ColorVectorSpace]] +deps = ["ColorTypes", "FixedPointNumbers", "LinearAlgebra", "Requires", "Statistics", "TensorCore"] +git-tree-sha1 = "a1f44953f2382ebb937d60dafbe2deea4bd23249" +uuid = "c3611d14-8923-5661-9e6a-0046d554d3a4" +version = "0.10.0" +weakdeps = ["SpecialFunctions"] + + [deps.ColorVectorSpace.extensions] + SpecialFunctionsExt = "SpecialFunctions" + +[[deps.Colors]] +deps = ["ColorTypes", "FixedPointNumbers", "Reexport"] +git-tree-sha1 = "362a287c3aa50601b0bc359053d5c2468f0e7ce0" +uuid = "5ae59095-9a9b-59fe-a467-6f913c188581" +version = "0.12.11" + +[[deps.Combinatorics]] +git-tree-sha1 = "08c8b6831dc00bfea825826be0bc8336fc369860" +uuid = "861a8166-3701-5b0c-9a16-15d98fcdc6aa" +version = "1.0.2" + +[[deps.CommonSolve]] +git-tree-sha1 = "0eee5eb66b1cf62cd6ad1b460238e60e4b09400c" +uuid = "38540f10-b2f7-11e9-35d8-d573e4eb0ff2" +version = "0.2.4" + +[[deps.CommonSubexpressions]] +deps = ["MacroTools"] +git-tree-sha1 = "cda2cfaebb4be89c9084adaca7dd7333369715c5" +uuid = "bbf7d656-a473-5ed7-a52c-81e309532950" +version = "0.3.1" + +[[deps.CommonWorldInvalidations]] +git-tree-sha1 = "ae52d1c52048455e85a387fbee9be553ec2b68d0" +uuid = "f70d9fcc-98c5-4d4a-abd7-e4cdeebd8ca8" +version = "1.0.0" + +[[deps.Compat]] +deps = ["TOML", "UUIDs"] +git-tree-sha1 = "8ae8d32e09f0dcf42a36b90d4e17f5dd2e4c4215" +uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" +version = "4.16.0" +weakdeps = ["Dates", "LinearAlgebra"] + + [deps.Compat.extensions] + CompatLinearAlgebraExt = "LinearAlgebra" + +[[deps.CompilerSupportLibraries_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" +version = "1.1.1+0" + +[[deps.CompositeTypes]] +git-tree-sha1 = "bce26c3dab336582805503bed209faab1c279768" +uuid = "b152e2b5-7a66-4b01-a709-34e65c35f657" +version = "0.1.4" + +[[deps.CompositionsBase]] +git-tree-sha1 = "802bb88cd69dfd1509f6670416bd4434015693ad" +uuid = "a33af91c-f02d-484b-be07-31d278c5ca2b" +version = "0.1.2" +weakdeps = ["InverseFunctions"] + + [deps.CompositionsBase.extensions] + CompositionsBaseInverseFunctionsExt = "InverseFunctions" + +[[deps.ConcurrentUtilities]] +deps = ["Serialization", "Sockets"] +git-tree-sha1 = "ea32b83ca4fefa1768dc84e504cc0a94fb1ab8d1" +uuid = "f0e56b4a-5159-44fe-b623-3e5288b988bb" +version = "2.4.2" + +[[deps.ConsoleProgressMonitor]] +deps = ["Logging", "ProgressMeter"] +git-tree-sha1 = "3ab7b2136722890b9af903859afcf457fa3059e8" +uuid = "88cd18e8-d9cc-4ea6-8889-5259c0d15c8b" +version = "0.1.2" + +[[deps.ConstructionBase]] +git-tree-sha1 = "76219f1ed5771adbb096743bff43fb5fdd4c1157" +uuid = "187b0558-2788-49d3-abe0-74a17ed4e7c9" +version = "1.5.8" +weakdeps = ["IntervalSets", "LinearAlgebra", "StaticArrays"] + + [deps.ConstructionBase.extensions] + ConstructionBaseIntervalSetsExt = "IntervalSets" + ConstructionBaseLinearAlgebraExt = "LinearAlgebra" + ConstructionBaseStaticArraysExt = "StaticArrays" + +[[deps.Contour]] +git-tree-sha1 = "439e35b0b36e2e5881738abc8857bd92ad6ff9a8" +uuid = "d38c429a-6771-53c6-b99e-75d170b6e991" +version = "0.6.3" + +[[deps.Crayons]] +git-tree-sha1 = "249fe38abf76d48563e2f4556bebd215aa317e15" +uuid = "a8cc5b0e-0ffa-5ad4-8c14-923d3ee1735f" +version = "4.1.1" + +[[deps.DSP]] +deps = ["Compat", "FFTW", "IterTools", "LinearAlgebra", "Polynomials", "Random", "Reexport", "SpecialFunctions", "Statistics"] +git-tree-sha1 = "0df00546373af8eee1598fb4b2ba480b1ebe895c" +uuid = "717857b8-e6f2-59f4-9121-6e50c889abd2" +version = "0.7.10" + +[[deps.DataAPI]] +git-tree-sha1 = "abe83f3a2f1b857aac70ef8b269080af17764bbe" +uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a" +version = "1.16.0" + +[[deps.DataStructures]] +deps = ["Compat", "InteractiveUtils", "OrderedCollections"] +git-tree-sha1 = "1d0a14036acb104d9e89698bd408f63ab58cdc82" +uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" +version = "0.18.20" + +[[deps.DataValueInterfaces]] +git-tree-sha1 = "bfc1187b79289637fa0ef6d4436ebdfe6905cbd6" +uuid = "e2d170a0-9d28-54be-80f0-106bbe20a464" +version = "1.0.0" + +[[deps.Dates]] +deps = ["Printf"] +uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" + +[[deps.Dbus_jll]] +deps = ["Artifacts", "Expat_jll", "JLLWrappers", "Libdl"] +git-tree-sha1 = "fc173b380865f70627d7dd1190dc2fce6cc105af" +uuid = "ee1fde0b-3d02-5ea6-8484-8dfef6360eab" +version = "1.14.10+0" + +[[deps.DefineSingletons]] +git-tree-sha1 = "0fba8b706d0178b4dc7fd44a96a92382c9065c2c" +uuid = "244e2a9f-e319-4986-a169-4d1fe445cd52" +version = "0.1.2" + +[[deps.DelimitedFiles]] +deps = ["Mmap"] +git-tree-sha1 = "9e2f36d3c96a820c678f2f1f1782582fcf685bae" +uuid = "8bb1440f-4735-579b-a4ab-409b98df4dab" +version = "1.9.1" + +[[deps.DensityInterface]] +deps = ["InverseFunctions", "Test"] +git-tree-sha1 = "80c3e8639e3353e5d2912fb3a1916b8455e2494b" +uuid = "b429d917-457f-4dbc-8f4c-0cc954292b1d" +version = "0.4.0" + +[[deps.Dictionaries]] +deps = ["Indexing", "Random", "Serialization"] +git-tree-sha1 = "35b66b6744b2d92c778afd3a88d2571875664a2a" +uuid = "85a47980-9c8c-11e8-2b9f-f7ca1fa99fb4" +version = "0.4.2" + +[[deps.DiffResults]] +deps = ["StaticArraysCore"] +git-tree-sha1 = "782dd5f4561f5d267313f23853baaaa4c52ea621" +uuid = "163ba53b-c6d8-5494-b064-1a9d43ac40c5" +version = "1.1.0" + +[[deps.DiffRules]] +deps = ["IrrationalConstants", "LogExpFunctions", "NaNMath", "Random", "SpecialFunctions"] +git-tree-sha1 = "23163d55f885173722d1e4cf0f6110cdbaf7e272" +uuid = "b552c78f-8df3-52c6-915a-8e097449b14b" +version = "1.15.1" + +[[deps.Distributed]] +deps = ["Random", "Serialization", "Sockets"] +uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" + +[[deps.Distributions]] +deps = ["AliasTables", "FillArrays", "LinearAlgebra", "PDMats", "Printf", "QuadGK", "Random", "SpecialFunctions", "Statistics", "StatsAPI", "StatsBase", "StatsFuns"] +git-tree-sha1 = "d7477ecdafb813ddee2ae727afa94e9dcb5f3fb0" +uuid = "31c24e10-a181-5473-b8eb-7969acd0382f" +version = "0.25.112" +weakdeps = ["ChainRulesCore", "DensityInterface", "Test"] + + [deps.Distributions.extensions] + DistributionsChainRulesCoreExt = "ChainRulesCore" + DistributionsDensityInterfaceExt = "DensityInterface" + DistributionsTestExt = "Test" + +[[deps.DistributionsAD]] +deps = ["Adapt", "ChainRules", "ChainRulesCore", "Compat", "Distributions", "FillArrays", "LinearAlgebra", "PDMats", "Random", "Requires", "SpecialFunctions", "StaticArrays", "StatsFuns", "ZygoteRules"] +git-tree-sha1 = "02c2e6e6a137069227439fe884d729cca5b70e56" +uuid = "ced4e74d-a319-5a8a-b0ac-84af2272839c" +version = "0.6.57" + + [deps.DistributionsAD.extensions] + DistributionsADForwardDiffExt = "ForwardDiff" + DistributionsADLazyArraysExt = "LazyArrays" + DistributionsADReverseDiffExt = "ReverseDiff" + DistributionsADTrackerExt = "Tracker" + + [deps.DistributionsAD.weakdeps] + ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + LazyArrays = "5078a376-72f3-5289-bfd5-ec5146d43c02" + ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" + +[[deps.DocStringExtensions]] +deps = ["LibGit2"] +git-tree-sha1 = "2fb1e02f2b635d0845df5d7c167fec4dd739b00d" +uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" +version = "0.9.3" + +[[deps.DomainSets]] +deps = ["CompositeTypes", "IntervalSets", "LinearAlgebra", "Random", "StaticArrays"] +git-tree-sha1 = "490392af2c7d63183bfa2c8aaa6ab981c5ba7561" +uuid = "5b8099bc-c8ec-5219-889f-1d9e522a28bf" +version = "0.7.14" + + [deps.DomainSets.extensions] + DomainSetsMakieExt = "Makie" + + [deps.DomainSets.weakdeps] + Makie = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a" + +[[deps.Downloads]] +deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] +uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" +version = "1.6.0" + +[[deps.DynamicPPL]] +deps = ["ADTypes", "AbstractMCMC", "AbstractPPL", "Accessors", "BangBang", "Bijectors", "Compat", "ConstructionBase", "Distributions", "DocStringExtensions", "LinearAlgebra", "LogDensityProblems", "LogDensityProblemsAD", "MacroTools", "OrderedCollections", "Random", "Requires", "Test"] +git-tree-sha1 = "6e5aa7546a0281a1b4bb51a26d0145bb92813a34" +uuid = "366bfd00-2699-11ea-058f-f148b4cae6d8" +version = "0.28.5" + + [deps.DynamicPPL.extensions] + DynamicPPLChainRulesCoreExt = ["ChainRulesCore"] + DynamicPPLEnzymeCoreExt = ["EnzymeCore"] + DynamicPPLForwardDiffExt = ["ForwardDiff"] + DynamicPPLMCMCChainsExt = ["MCMCChains"] + DynamicPPLReverseDiffExt = ["ReverseDiff"] + DynamicPPLZygoteRulesExt = ["ZygoteRules"] + + [deps.DynamicPPL.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + EnzymeCore = "f151be2c-9106-41f4-ab19-57ee4f262869" + ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + MCMCChains = "c7f686f2-ff18-58e9-bc7b-31028e88f75d" + ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + ZygoteRules = "700de1a5-db45-46bc-99cf-38207098b444" + +[[deps.DynamicPolynomials]] +deps = ["Future", "LinearAlgebra", "MultivariatePolynomials", "MutableArithmetics", "Reexport", "Test"] +git-tree-sha1 = "bbf1ace0781d9744cb697fb856bd2c3f6568dadb" +uuid = "7c1d4256-1411-5781-91ec-d7bc3513ac07" +version = "0.6.0" + +[[deps.Einsum]] +deps = ["Compat"] +git-tree-sha1 = "4a6b3eee0161c89700b6c1949feae8b851da5494" +uuid = "b7d42ee7-0b51-5a75-98ca-779d3107e4c0" +version = "0.4.1" + +[[deps.EllipticalSliceSampling]] +deps = ["AbstractMCMC", "ArrayInterface", "Distributions", "Random", "Statistics"] +git-tree-sha1 = "e611b7fdfbfb5b18d5e98776c30daede41b44542" +uuid = "cad2338a-1db2-11e9-3401-43bc07c9ede2" +version = "2.0.0" + +[[deps.EnumX]] +git-tree-sha1 = "bdb1942cd4c45e3c678fd11569d5cccd80976237" +uuid = "4e289a0a-7415-4d19-859d-a7e5c4648b56" +version = "1.0.4" + +[[deps.EpollShim_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "8e9441ee83492030ace98f9789a654a6d0b1f643" +uuid = "2702e6a9-849d-5ed8-8c21-79e8b8f9ee43" +version = "0.0.20230411+0" + +[[deps.ExceptionUnwrapping]] +deps = ["Test"] +git-tree-sha1 = "dcb08a0d93ec0b1cdc4af184b26b591e9695423a" +uuid = "460bff9d-24e4-43bc-9d9f-a8973cb893f4" +version = "0.1.10" + +[[deps.Expat_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "1c6317308b9dc757616f0b5cb379db10494443a7" +uuid = "2e619515-83b5-522b-bb60-26c02a35a201" +version = "2.6.2+0" + +[[deps.ExprTools]] +git-tree-sha1 = "27415f162e6028e81c72b82ef756bf321213b6ec" +uuid = "e2ba6199-217a-4e67-a87a-7c52f15ade04" +version = "0.1.10" + +[[deps.Expronicon]] +deps = ["MLStyle", "Pkg", "TOML"] +git-tree-sha1 = "fc3951d4d398b5515f91d7fe5d45fc31dccb3c9b" +uuid = "6b7a57c9-7cc1-4fdf-b7f5-e857abae3636" +version = "0.8.5" + +[[deps.FFMPEG]] +deps = ["FFMPEG_jll"] +git-tree-sha1 = "53ebe7511fa11d33bec688a9178fac4e49eeee00" +uuid = "c87230d0-a227-11e9-1b43-d7ebe4e7570a" +version = "0.4.2" + +[[deps.FFMPEG_jll]] +deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "JLLWrappers", "LAME_jll", "Libdl", "Ogg_jll", "OpenSSL_jll", "Opus_jll", "PCRE2_jll", "Zlib_jll", "libaom_jll", "libass_jll", "libfdk_aac_jll", "libvorbis_jll", "x264_jll", "x265_jll"] +git-tree-sha1 = "466d45dc38e15794ec7d5d63ec03d776a9aff36e" +uuid = "b22a6f82-2f65-5046-a5b2-351ab43fb4e5" +version = "4.4.4+1" + +[[deps.FFTW]] +deps = ["AbstractFFTs", "FFTW_jll", "LinearAlgebra", "MKL_jll", "Preferences", "Reexport"] +git-tree-sha1 = "4820348781ae578893311153d69049a93d05f39d" +uuid = "7a1cc6ca-52ef-59f5-83cd-3a7055c09341" +version = "1.8.0" + +[[deps.FFTW_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "4d81ed14783ec49ce9f2e168208a12ce1815aa25" +uuid = "f5851436-0d7a-5f13-b9de-f02708fd171a" +version = "3.3.10+1" + +[[deps.FileWatching]] +uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" + +[[deps.FillArrays]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "6a70198746448456524cb442b8af316927ff3e1a" +uuid = "1a297f60-69ca-5386-bcde-b61e274b549b" +version = "1.13.0" +weakdeps = ["PDMats", "SparseArrays", "Statistics"] + + [deps.FillArrays.extensions] + FillArraysPDMatsExt = "PDMats" + FillArraysSparseArraysExt = "SparseArrays" + FillArraysStatisticsExt = "Statistics" + +[[deps.FiniteDiff]] +deps = ["ArrayInterface", "LinearAlgebra", "Setfield"] +git-tree-sha1 = "b10bdafd1647f57ace3885143936749d61638c3b" +uuid = "6a86dc24-6348-571c-b903-95158fe2bd41" +version = "2.26.0" + + [deps.FiniteDiff.extensions] + FiniteDiffBandedMatricesExt = "BandedMatrices" + FiniteDiffBlockBandedMatricesExt = "BlockBandedMatrices" + FiniteDiffSparseArraysExt = "SparseArrays" + FiniteDiffStaticArraysExt = "StaticArrays" + + [deps.FiniteDiff.weakdeps] + BandedMatrices = "aae01518-5342-5314-be14-df237901396f" + BlockBandedMatrices = "ffab5731-97b5-5995-9138-79e8c1846df0" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + +[[deps.FixedPointNumbers]] +deps = ["Statistics"] +git-tree-sha1 = "05882d6995ae5c12bb5f36dd2ed3f61c98cbb172" +uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" +version = "0.8.5" + +[[deps.Fontconfig_jll]] +deps = ["Artifacts", "Bzip2_jll", "Expat_jll", "FreeType2_jll", "JLLWrappers", "Libdl", "Libuuid_jll", "Zlib_jll"] +git-tree-sha1 = "db16beca600632c95fc8aca29890d83788dd8b23" +uuid = "a3f928ae-7b40-5064-980b-68af3947d34b" +version = "2.13.96+0" + +[[deps.Format]] +git-tree-sha1 = "9c68794ef81b08086aeb32eeaf33531668d5f5fc" +uuid = "1fa38f19-a742-5d3f-a2b9-30dd87b9d5f8" +version = "1.3.7" + +[[deps.ForwardDiff]] +deps = ["CommonSubexpressions", "DiffResults", "DiffRules", "LinearAlgebra", "LogExpFunctions", "NaNMath", "Preferences", "Printf", "Random", "SpecialFunctions"] +git-tree-sha1 = "cf0fe81336da9fb90944683b8c41984b08793dad" +uuid = "f6369f11-7733-5829-9624-2563aa707210" +version = "0.10.36" +weakdeps = ["StaticArrays"] + + [deps.ForwardDiff.extensions] + ForwardDiffStaticArraysExt = "StaticArrays" + +[[deps.FreeType2_jll]] +deps = ["Artifacts", "Bzip2_jll", "JLLWrappers", "Libdl", "Zlib_jll"] +git-tree-sha1 = "5c1d8ae0efc6c2e7b1fc502cbe25def8f661b7bc" +uuid = "d7e528f0-a631-5988-bf34-fe36492bcfd7" +version = "2.13.2+0" + +[[deps.FriBidi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "1ed150b39aebcc805c26b93a8d0122c940f64ce2" +uuid = "559328eb-81f9-559d-9380-de523a88c83c" +version = "1.0.14+0" + +[[deps.FunctionWrappers]] +git-tree-sha1 = "d62485945ce5ae9c0c48f124a84998d755bae00e" +uuid = "069b7b12-0de2-55c6-9aab-29f3d0a68a2e" +version = "1.1.3" + +[[deps.FunctionWrappersWrappers]] +deps = ["FunctionWrappers"] +git-tree-sha1 = "b104d487b34566608f8b4e1c39fb0b10aa279ff8" +uuid = "77dc65aa-8811-40c2-897b-53d922fa7daf" +version = "0.1.3" + +[[deps.Functors]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "64d8e93700c7a3f28f717d265382d52fac9fa1c1" +uuid = "d9f16b24-f501-4c13-a1f2-28368ffc5196" +version = "0.4.12" + +[[deps.Future]] +deps = ["Random"] +uuid = "9fa8497b-333b-5362-9e8d-4d0656e87820" + +[[deps.GLFW_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libglvnd_jll", "Xorg_libXcursor_jll", "Xorg_libXi_jll", "Xorg_libXinerama_jll", "Xorg_libXrandr_jll", "libdecor_jll", "xkbcommon_jll"] +git-tree-sha1 = "532f9126ad901533af1d4f5c198867227a7bb077" +uuid = "0656b61e-2033-5cc2-a64a-77c0f6c09b89" +version = "3.4.0+1" + +[[deps.GPUArraysCore]] +deps = ["Adapt"] +git-tree-sha1 = "ec632f177c0d990e64d955ccc1b8c04c485a0950" +uuid = "46192b85-c4d5-4398-a991-12ede77f4527" +version = "0.1.6" + +[[deps.GR]] +deps = ["Artifacts", "Base64", "DelimitedFiles", "Downloads", "GR_jll", "HTTP", "JSON", "Libdl", "LinearAlgebra", "Preferences", "Printf", "Qt6Wayland_jll", "Random", "Serialization", "Sockets", "TOML", "Tar", "Test", "p7zip_jll"] +git-tree-sha1 = "ee28ddcd5517d54e417182fec3886e7412d3926f" +uuid = "28b8d3ca-fb5f-59d9-8090-bfdbd6d07a71" +version = "0.73.8" + +[[deps.GR_jll]] +deps = ["Artifacts", "Bzip2_jll", "Cairo_jll", "FFMPEG_jll", "Fontconfig_jll", "FreeType2_jll", "GLFW_jll", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Libtiff_jll", "Pixman_jll", "Qt6Base_jll", "Zlib_jll", "libpng_jll"] +git-tree-sha1 = "f31929b9e67066bee48eec8b03c0df47d31a74b3" +uuid = "d2c73de3-f751-5644-a686-071e5b155ba9" +version = "0.73.8+0" + +[[deps.Gettext_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Libiconv_jll", "Pkg", "XML2_jll"] +git-tree-sha1 = "9b02998aba7bf074d14de89f9d37ca24a1a0b046" +uuid = "78b55507-aeef-58d4-861c-77aaff3498b1" +version = "0.21.0+0" + +[[deps.Glib_jll]] +deps = ["Artifacts", "Gettext_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Libiconv_jll", "Libmount_jll", "PCRE2_jll", "Zlib_jll"] +git-tree-sha1 = "674ff0db93fffcd11a3573986e550d66cd4fd71f" +uuid = "7746bdde-850d-59dc-9ae8-88ece973131d" +version = "2.80.5+0" + +[[deps.Graphite2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "344bf40dcab1073aca04aa0df4fb092f920e4011" +uuid = "3b182d85-2403-5c21-9c21-1e1f0cc25472" +version = "1.3.14+0" + +[[deps.Graphs]] +deps = ["ArnoldiMethod", "Compat", "DataStructures", "Distributed", "Inflate", "LinearAlgebra", "Random", "SharedArrays", "SimpleTraits", "SparseArrays", "Statistics"] +git-tree-sha1 = "1dc470db8b1131cfc7fb4c115de89fe391b9e780" +uuid = "86223c79-3864-5bf0-83f7-82e725a168b6" +version = "1.12.0" + +[[deps.Grisu]] +git-tree-sha1 = "53bb909d1151e57e2484c3d1b53e19552b887fb2" +uuid = "42e2da0e-8278-4e71-bc24-59509adca0fe" +version = "1.0.2" + +[[deps.HTTP]] +deps = ["Base64", "CodecZlib", "ConcurrentUtilities", "Dates", "ExceptionUnwrapping", "Logging", "LoggingExtras", "MbedTLS", "NetworkOptions", "OpenSSL", "Random", "SimpleBufferStream", "Sockets", "URIs", "UUIDs"] +git-tree-sha1 = "d1d712be3164d61d1fb98e7ce9bcbc6cc06b45ed" +uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3" +version = "1.10.8" + +[[deps.HarfBuzz_jll]] +deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "Graphite2_jll", "JLLWrappers", "Libdl", "Libffi_jll"] +git-tree-sha1 = "401e4f3f30f43af2c8478fc008da50096ea5240f" +uuid = "2e76f6c2-a576-52d4-95c1-20adfe4de566" +version = "8.3.1+0" + +[[deps.HybridArrays]] +deps = ["LinearAlgebra", "Requires", "StaticArrays"] +git-tree-sha1 = "6c3e57bc26728b99f470b267a437f0d380eac4fc" +uuid = "1baab800-613f-4b0a-84e4-9cd3431bfbb9" +version = "0.4.16" + +[[deps.HypergeometricFunctions]] +deps = ["LinearAlgebra", "OpenLibm_jll", "SpecialFunctions"] +git-tree-sha1 = "7c4195be1649ae622304031ed46a2f4df989f1eb" +uuid = "34004b35-14d8-5ef3-9330-4cdb6864b03a" +version = "0.3.24" + +[[deps.Hyperscript]] +deps = ["Test"] +git-tree-sha1 = "179267cfa5e712760cd43dcae385d7ea90cc25a4" +uuid = "47d2ed2b-36de-50cf-bf87-49c2cf4b8b91" +version = "0.0.5" + +[[deps.HypertextLiteral]] +deps = ["Tricks"] +git-tree-sha1 = "7134810b1afce04bbc1045ca1985fbe81ce17653" +uuid = "ac1192a8-f4b3-4bfe-ba22-af5b92cd3ab2" +version = "0.9.5" + +[[deps.IOCapture]] +deps = ["Logging", "Random"] +git-tree-sha1 = "b6d6bfdd7ce25b0f9b2f6b3dd56b2673a66c8770" +uuid = "b5f81e59-6552-4d32-b1f0-c071b021bf89" +version = "0.2.5" + +[[deps.IfElse]] +git-tree-sha1 = "debdd00ffef04665ccbb3e150747a77560e8fad1" +uuid = "615f187c-cbe4-4ef1-ba3b-2fcf58d6d173" +version = "0.1.1" + +[[deps.Indexing]] +git-tree-sha1 = "ce1566720fd6b19ff3411404d4b977acd4814f9f" +uuid = "313cdc1a-70c2-5d6a-ae34-0150d3930a38" +version = "1.1.1" + +[[deps.Inflate]] +git-tree-sha1 = "d1b1b796e47d94588b3757fe84fbf65a5ec4a80d" +uuid = "d25df0c9-e2be-5dd7-82c8-3ad0b3e990b9" +version = "0.1.5" + +[[deps.InitialValues]] +git-tree-sha1 = "4da0f88e9a39111c2fa3add390ab15f3a44f3ca3" +uuid = "22cec73e-a1b8-11e9-2c92-598750a2cf9c" +version = "0.3.1" + +[[deps.InplaceOps]] +deps = ["LinearAlgebra", "Test"] +git-tree-sha1 = "50b41d59e7164ab6fda65e71049fee9d890731ff" +uuid = "505f98c9-085e-5b2c-8e89-488be7bf1f34" +version = "0.3.0" + +[[deps.IntegerMathUtils]] +git-tree-sha1 = "b8ffb903da9f7b8cf695a8bead8e01814aa24b30" +uuid = "18e54dd8-cb9d-406c-a71d-865a43cbb235" +version = "0.1.2" + +[[deps.IntelOpenMP_jll]] +deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl"] +git-tree-sha1 = "10bd689145d2c3b2a9844005d01087cc1194e79e" +uuid = "1d5cc7b8-4909-519e-a0f8-d0f5ad9712d0" +version = "2024.2.1+0" + +[[deps.InteractiveUtils]] +deps = ["Markdown"] +uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" + +[[deps.Interpolations]] +deps = ["Adapt", "AxisAlgorithms", "ChainRulesCore", "LinearAlgebra", "OffsetArrays", "Random", "Ratios", "Requires", "SharedArrays", "SparseArrays", "StaticArrays", "WoodburyMatrices"] +git-tree-sha1 = "88a101217d7cb38a7b481ccd50d21876e1d1b0e0" +uuid = "a98d9a8b-a2ab-59e6-89dd-64a1c18fca59" +version = "0.15.1" +weakdeps = ["Unitful"] + + [deps.Interpolations.extensions] + InterpolationsUnitfulExt = "Unitful" + +[[deps.IntervalSets]] +git-tree-sha1 = "dba9ddf07f77f60450fe5d2e2beb9854d9a49bd0" +uuid = "8197267c-284f-5f27-9208-e0e47529a953" +version = "0.7.10" +weakdeps = ["Random", "RecipesBase", "Statistics"] + + [deps.IntervalSets.extensions] + IntervalSetsRandomExt = "Random" + IntervalSetsRecipesBaseExt = "RecipesBase" + IntervalSetsStatisticsExt = "Statistics" + +[[deps.InverseFunctions]] +git-tree-sha1 = "a779299d77cd080bf77b97535acecd73e1c5e5cb" +uuid = "3587e190-3f89-42d0-90ee-14403ec27112" +version = "0.1.17" +weakdeps = ["Dates", "Test"] + + [deps.InverseFunctions.extensions] + InverseFunctionsDatesExt = "Dates" + InverseFunctionsTestExt = "Test" + +[[deps.InvertedIndices]] +git-tree-sha1 = "0dc7b50b8d436461be01300fd8cd45aa0274b038" +uuid = "41ab1584-1d38-5bbf-9106-f11c6c58b48f" +version = "1.3.0" + +[[deps.IrrationalConstants]] +git-tree-sha1 = "630b497eafcc20001bba38a4651b327dcfc491d2" +uuid = "92d709cd-6900-40b7-9082-c6be49f344b6" +version = "0.2.2" + +[[deps.IterTools]] +git-tree-sha1 = "42d5f897009e7ff2cf88db414a389e5ed1bdd023" +uuid = "c8e1da08-722c-5040-9ed9-7db0dc04731e" +version = "1.10.0" + +[[deps.IteratorInterfaceExtensions]] +git-tree-sha1 = "a3f24677c21f5bbe9d2a714f95dcd58337fb2856" +uuid = "82899510-4779-5014-852e-03e436cf321d" +version = "1.0.0" + +[[deps.JLFzf]] +deps = ["Pipe", "REPL", "Random", "fzf_jll"] +git-tree-sha1 = "39d64b09147620f5ffbf6b2d3255be3c901bec63" +uuid = "1019f520-868f-41f5-a6de-eb00f4b6a39c" +version = "0.1.8" + +[[deps.JLLWrappers]] +deps = ["Artifacts", "Preferences"] +git-tree-sha1 = "be3dc50a92e5a386872a493a10050136d4703f9b" +uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" +version = "1.6.1" + +[[deps.JSON]] +deps = ["Dates", "Mmap", "Parsers", "Unicode"] +git-tree-sha1 = "31e996f0a15c7b280ba9f76636b3ff9e2ae58c9a" +uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" +version = "0.21.4" + +[[deps.JpegTurbo_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "25ee0be4d43d0269027024d75a24c24d6c6e590c" +uuid = "aacddb02-875f-59d6-b918-886e6ef4fbf8" +version = "3.0.4+0" + +[[deps.KernelAbstractions]] +deps = ["Adapt", "Atomix", "InteractiveUtils", "MacroTools", "PrecompileTools", "Requires", "StaticArrays", "UUIDs", "UnsafeAtomics", "UnsafeAtomicsLLVM"] +git-tree-sha1 = "04e52f596d0871fa3890170fa79cb15e481e4cd8" +uuid = "63c18a36-062a-441e-b654-da1e3ab1ce7c" +version = "0.9.28" + + [deps.KernelAbstractions.extensions] + EnzymeExt = "EnzymeCore" + LinearAlgebraExt = "LinearAlgebra" + SparseArraysExt = "SparseArrays" + + [deps.KernelAbstractions.weakdeps] + EnzymeCore = "f151be2c-9106-41f4-ab19-57ee4f262869" + LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + +[[deps.KernelDensity]] +deps = ["Distributions", "DocStringExtensions", "FFTW", "Interpolations", "StatsBase"] +git-tree-sha1 = "7d703202e65efa1369de1279c162b915e245eed1" +uuid = "5ab0869b-81aa-558d-bb23-cbf5423bbe9b" +version = "0.6.9" + +[[deps.Kronecker]] +deps = ["LinearAlgebra", "NamedDims", "SparseArrays", "StatsBase"] +git-tree-sha1 = "9253429e28cceae6e823bec9ffde12460d79bb38" +uuid = "2c470bb0-bcc8-11e8-3dad-c9649493f05e" +version = "0.5.5" + +[[deps.LAME_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "170b660facf5df5de098d866564877e119141cbd" +uuid = "c1c5ebd0-6772-5130-a774-d5fcae4a789d" +version = "3.100.2+0" + +[[deps.LBFGSB]] +deps = ["L_BFGS_B_jll"] +git-tree-sha1 = "e2e6f53ee20605d0ea2be473480b7480bd5091b5" +uuid = "5be7bae1-8223-5378-bac3-9e7378a2f6e6" +version = "0.4.1" + +[[deps.LERC_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "36bdbc52f13a7d1dcb0f3cd694e01677a515655b" +uuid = "88015f11-f218-50d7-93a8-a6af411a945d" +version = "4.0.0+0" + +[[deps.LLVM]] +deps = ["CEnum", "LLVMExtra_jll", "Libdl", "Preferences", "Printf", "Unicode"] +git-tree-sha1 = "d422dfd9707bec6617335dc2ea3c5172a87d5908" +uuid = "929cbde3-209d-540e-8aea-75f648917ca0" +version = "9.1.3" + + [deps.LLVM.extensions] + BFloat16sExt = "BFloat16s" + + [deps.LLVM.weakdeps] + BFloat16s = "ab4f0b2a-ad5b-11e8-123f-65d77653426b" + +[[deps.LLVMExtra_jll]] +deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl", "TOML"] +git-tree-sha1 = "05a8bd5a42309a9ec82f700876903abce1017dd3" +uuid = "dad2f222-ce93-54a1-a47d-0025e8a3acab" +version = "0.0.34+0" + +[[deps.LLVMOpenMP_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "78211fb6cbc872f77cad3fc0b6cf647d923f4929" +uuid = "1d63c593-3942-5779-bab2-d838dc0a180e" +version = "18.1.7+0" + +[[deps.LRUCache]] +git-tree-sha1 = "b3cc6698599b10e652832c2f23db3cab99d51b59" +uuid = "8ac3fa9e-de4c-5943-b1dc-09c6b5f20637" +version = "1.6.1" +weakdeps = ["Serialization"] + + [deps.LRUCache.extensions] + SerializationExt = ["Serialization"] + +[[deps.LZO_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "854a9c268c43b77b0a27f22d7fab8d33cdb3a731" +uuid = "dd4b983a-f0e5-5f8d-a1b7-129d4a5fb1ac" +version = "2.10.2+1" + +[[deps.L_BFGS_B_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "77feda930ed3f04b2b0fbb5bea89e69d3677c6b0" +uuid = "81d17ec3-03a1-5e46-b53e-bddc35a13473" +version = "3.0.1+0" + +[[deps.LaTeXStrings]] +git-tree-sha1 = "dda21b8cbd6a6c40d9d02a73230f9d70fed6918c" +uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" +version = "1.4.0" + +[[deps.Latexify]] +deps = ["Format", "InteractiveUtils", "LaTeXStrings", "MacroTools", "Markdown", "OrderedCollections", "Requires"] +git-tree-sha1 = "ce5f5621cac23a86011836badfedf664a612cee4" +uuid = "23fbe1c1-3f47-55db-b15f-69d7ec21a316" +version = "0.16.5" + + [deps.Latexify.extensions] + DataFramesExt = "DataFrames" + SparseArraysExt = "SparseArrays" + SymEngineExt = "SymEngine" + + [deps.Latexify.weakdeps] + DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + SymEngine = "123dc426-2d89-5057-bbad-38513e3affd8" + +[[deps.LazyArtifacts]] +deps = ["Artifacts", "Pkg"] +uuid = "4af54fe1-eca0-43a8-85a7-787d91b784e3" + +[[deps.LeftChildRightSiblingTrees]] +deps = ["AbstractTrees"] +git-tree-sha1 = "fb6803dafae4a5d62ea5cab204b1e657d9737e7f" +uuid = "1d6d02ad-be62-4b6b-8a6d-2f90e265016e" +version = "0.2.0" + +[[deps.LibCURL]] +deps = ["LibCURL_jll", "MozillaCACerts_jll"] +uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" +version = "0.6.4" + +[[deps.LibCURL_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] +uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" +version = "8.4.0+0" + +[[deps.LibGit2]] +deps = ["Base64", "LibGit2_jll", "NetworkOptions", "Printf", "SHA"] +uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" + +[[deps.LibGit2_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll"] +uuid = "e37daf67-58a4-590a-8e99-b0245dd2ffc5" +version = "1.6.4+0" + +[[deps.LibSSH2_jll]] +deps = ["Artifacts", "Libdl", "MbedTLS_jll"] +uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" +version = "1.11.0+1" + +[[deps.Libdl]] +uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" + +[[deps.Libffi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "0b4a5d71f3e5200a7dff793393e09dfc2d874290" +uuid = "e9f186c6-92d2-5b65-8a66-fee21dc1b490" +version = "3.2.2+1" + +[[deps.Libgcrypt_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgpg_error_jll"] +git-tree-sha1 = "9fd170c4bbfd8b935fdc5f8b7aa33532c991a673" +uuid = "d4300ac3-e22c-5743-9152-c294e39db1e4" +version = "1.8.11+0" + +[[deps.Libglvnd_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll", "Xorg_libXext_jll"] +git-tree-sha1 = "6f73d1dd803986947b2c750138528a999a6c7733" +uuid = "7e76a0d4-f3c7-5321-8279-8d96eeed0f29" +version = "1.6.0+0" + +[[deps.Libgpg_error_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "fbb1f2bef882392312feb1ede3615ddc1e9b99ed" +uuid = "7add5ba3-2f88-524e-9cd5-f83b8a55f7b8" +version = "1.49.0+0" + +[[deps.Libiconv_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "f9557a255370125b405568f9767d6d195822a175" +uuid = "94ce4f54-9a6c-5748-9c1c-f9c7231a4531" +version = "1.17.0+0" + +[[deps.Libmount_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "0c4f9c4f1a50d8f35048fa0532dabbadf702f81e" +uuid = "4b2f31a3-9ecc-558c-b454-b3730dcb73e9" +version = "2.40.1+0" + +[[deps.Libtask]] +deps = ["FunctionWrappers", "LRUCache", "LinearAlgebra", "Statistics"] +git-tree-sha1 = "902ece54b0cb5c5413a8a15db0ad2aa2ec4172d2" +uuid = "6f1fad26-d15e-5dc8-ae53-837a1d7b8c9f" +version = "0.8.8" + +[[deps.Libtiff_jll]] +deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "LERC_jll", "Libdl", "XZ_jll", "Zlib_jll", "Zstd_jll"] +git-tree-sha1 = "b404131d06f7886402758c9ce2214b636eb4d54a" +uuid = "89763e89-9b03-5906-acba-b20f662cd828" +version = "4.7.0+0" + +[[deps.Libuuid_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "5ee6203157c120d79034c748a2acba45b82b8807" +uuid = "38a345b3-de98-5d2b-a5d3-14cd9215e700" +version = "2.40.1+0" + +[[deps.LineSearches]] +deps = ["LinearAlgebra", "NLSolversBase", "NaNMath", "Parameters", "Printf"] +git-tree-sha1 = "e4c3be53733db1051cc15ecf573b1042b3a712a1" +uuid = "d3d80556-e9d4-5f37-9878-2ab0fcc64255" +version = "7.3.0" + +[[deps.LinearAlgebra]] +deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"] +uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + +[[deps.LinearMaps]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "ee79c3208e55786de58f8dcccca098ced79f743f" +uuid = "7a12625a-238d-50fd-b39a-03d52299707e" +version = "3.11.3" +weakdeps = ["ChainRulesCore", "SparseArrays", "Statistics"] + + [deps.LinearMaps.extensions] + LinearMapsChainRulesCoreExt = "ChainRulesCore" + LinearMapsSparseArraysExt = "SparseArrays" + LinearMapsStatisticsExt = "Statistics" + +[[deps.LogDensityProblems]] +deps = ["ArgCheck", "DocStringExtensions", "Random"] +git-tree-sha1 = "4e0128c1590d23a50dcdb106c7e2dbca99df85c0" +uuid = "6fdf6af0-433a-55f7-b3ed-c6c6e0b8df7c" +version = "2.1.2" + +[[deps.LogDensityProblemsAD]] +deps = ["DocStringExtensions", "LogDensityProblems"] +git-tree-sha1 = "3092250f021aca6d3e24036019cbb24c0c5d89df" +uuid = "996a588d-648d-4e1f-a8f0-a84b347e47b1" +version = "1.11.0" + + [deps.LogDensityProblemsAD.extensions] + LogDensityProblemsADADTypesExt = "ADTypes" + LogDensityProblemsADEnzymeExt = "Enzyme" + LogDensityProblemsADFiniteDifferencesExt = "FiniteDifferences" + LogDensityProblemsADForwardDiffBenchmarkToolsExt = ["BenchmarkTools", "ForwardDiff"] + LogDensityProblemsADForwardDiffExt = "ForwardDiff" + LogDensityProblemsADReverseDiffExt = "ReverseDiff" + LogDensityProblemsADTrackerExt = "Tracker" + LogDensityProblemsADZygoteExt = "Zygote" + + [deps.LogDensityProblemsAD.weakdeps] + ADTypes = "47edcb42-4c32-4615-8424-f2b9edc5f35b" + BenchmarkTools = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf" + Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9" + FiniteDifferences = "26cc04aa-876d-5657-8c51-4c34ba976000" + ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" + Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f" + +[[deps.LogExpFunctions]] +deps = ["DocStringExtensions", "IrrationalConstants", "LinearAlgebra"] +git-tree-sha1 = "a2d09619db4e765091ee5c6ffe8872849de0feea" +uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688" +version = "0.3.28" +weakdeps = ["ChainRulesCore", "ChangesOfVariables", "InverseFunctions"] + + [deps.LogExpFunctions.extensions] + LogExpFunctionsChainRulesCoreExt = "ChainRulesCore" + LogExpFunctionsChangesOfVariablesExt = "ChangesOfVariables" + LogExpFunctionsInverseFunctionsExt = "InverseFunctions" + +[[deps.Logging]] +uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" + +[[deps.LoggingExtras]] +deps = ["Dates", "Logging"] +git-tree-sha1 = "c1dd6d7978c12545b4179fb6153b9250c96b0075" +uuid = "e6f89c97-d47a-5376-807f-9c37f3926c36" +version = "1.0.3" + +[[deps.MCMCChains]] +deps = ["AbstractMCMC", "AxisArrays", "Dates", "Distributions", "IteratorInterfaceExtensions", "KernelDensity", "LinearAlgebra", "MCMCDiagnosticTools", "MLJModelInterface", "NaturalSort", "OrderedCollections", "PrettyTables", "Random", "RecipesBase", "Statistics", "StatsBase", "StatsFuns", "TableTraits", "Tables"] +git-tree-sha1 = "d28056379864318172ff4b7958710cfddd709339" +uuid = "c7f686f2-ff18-58e9-bc7b-31028e88f75d" +version = "6.0.6" + +[[deps.MCMCDiagnosticTools]] +deps = ["AbstractFFTs", "DataAPI", "DataStructures", "Distributions", "LinearAlgebra", "MLJModelInterface", "Random", "SpecialFunctions", "Statistics", "StatsBase", "StatsFuns", "Tables"] +git-tree-sha1 = "8ba8b1840d3ab5b38e7c71c23c3193bb5cbc02b5" +uuid = "be115224-59cd-429b-ad48-344e309966f0" +version = "0.3.10" + +[[deps.MIMEs]] +git-tree-sha1 = "65f28ad4b594aebe22157d6fac869786a255b7eb" +uuid = "6c6e2e6c-3030-632d-7369-2d6c69616d65" +version = "0.1.4" + +[[deps.MKL_jll]] +deps = ["Artifacts", "IntelOpenMP_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "oneTBB_jll"] +git-tree-sha1 = "f046ccd0c6db2832a9f639e2c669c6fe867e5f4f" +uuid = "856f044c-d86e-5d09-b602-aeab76dc8ba7" +version = "2024.2.0+0" + +[[deps.MLJModelInterface]] +deps = ["Random", "ScientificTypesBase", "StatisticalTraits"] +git-tree-sha1 = "ceaff6618408d0e412619321ae43b33b40c1a733" +uuid = "e80e1ace-859a-464e-9ed9-23947d8ae3ea" +version = "1.11.0" + +[[deps.MLStyle]] +git-tree-sha1 = "bc38dff0548128765760c79eb7388a4b37fae2c8" +uuid = "d8e11817-5142-5d16-987a-aa16d5891078" +version = "0.4.17" + +[[deps.MacroTools]] +deps = ["Markdown", "Random"] +git-tree-sha1 = "2fa9ee3e63fd3a4f7a9a4f4744a52f4856de82df" +uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" +version = "0.5.13" + +[[deps.ManifoldDiff]] +deps = ["LinearAlgebra", "ManifoldsBase", "Markdown", "Random", "Requires"] +git-tree-sha1 = "62fccd67f9fb83526bff40a1432f63464eb6d282" +uuid = "af67fdf4-a580-4b9f-bbec-742ef357defd" +version = "0.3.12" + + [deps.ManifoldDiff.extensions] + ManifoldDiffFiniteDiffExt = "FiniteDiff" + ManifoldDiffFiniteDifferencesExt = "FiniteDifferences" + ManifoldDiffForwardDiffExt = "ForwardDiff" + ManifoldDiffReverseDiffExt = "ReverseDiff" + ManifoldDiffZygoteExt = "Zygote" + + [deps.ManifoldDiff.weakdeps] + FiniteDiff = "6a86dc24-6348-571c-b903-95158fe2bd41" + FiniteDifferences = "26cc04aa-876d-5657-8c51-4c34ba976000" + ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f" + +[[deps.Manifolds]] +deps = ["Distributions", "Einsum", "Graphs", "HybridArrays", "Kronecker", "LinearAlgebra", "ManifoldDiff", "ManifoldsBase", "Markdown", "MatrixEquations", "Quaternions", "Random", "RecursiveArrayTools", "Requires", "SimpleWeightedGraphs", "SpecialFunctions", "StaticArrays", "Statistics", "StatsBase"] +git-tree-sha1 = "58eb09899273a3ed17aae1f56435f440669b810c" +uuid = "1cead3c2-87b3-11e9-0ccd-23c62b72b94e" +version = "0.9.20" + + [deps.Manifolds.extensions] + ManifoldsBoundaryValueDiffEqExt = "BoundaryValueDiffEq" + ManifoldsNLsolveExt = "NLsolve" + ManifoldsOrdinaryDiffEqDiffEqCallbacksExt = ["DiffEqCallbacks", "OrdinaryDiffEq"] + ManifoldsOrdinaryDiffEqExt = "OrdinaryDiffEq" + ManifoldsRecipesBaseExt = ["Colors", "RecipesBase"] + ManifoldsTestExt = "Test" + + [deps.Manifolds.weakdeps] + BoundaryValueDiffEq = "764a87c0-6b3e-53db-9096-fe964310641d" + Colors = "5ae59095-9a9b-59fe-a467-6f913c188581" + DiffEqCallbacks = "459566f4-90b8-5000-8ac3-15dfb0a30def" + NLsolve = "2774e3e8-f4cf-5e23-947b-6d7e65073b56" + OrdinaryDiffEq = "1dea7af3-3e70-54e6-95c3-0bf5283fa5ed" + RecipesBase = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" + Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[[deps.ManifoldsBase]] +deps = ["LinearAlgebra", "Markdown", "Printf", "Random", "Requires"] +git-tree-sha1 = "4259c5f29dbe9d7441ec0f5ce31c2a6895285495" +uuid = "3362f125-f0bb-47a3-aa74-596ffd7ef2fb" +version = "0.15.17" +weakdeps = ["Plots", "Quaternions", "RecursiveArrayTools", "Statistics"] + + [deps.ManifoldsBase.extensions] + ManifoldsBasePlotsExt = "Plots" + ManifoldsBaseQuaternionsExt = "Quaternions" + ManifoldsBaseRecursiveArrayToolsExt = "RecursiveArrayTools" + ManifoldsBaseStatisticsExt = "Statistics" + +[[deps.MappedArrays]] +git-tree-sha1 = "2dab0221fe2b0f2cb6754eaa743cc266339f527e" +uuid = "dbb5928d-eab1-5f90-85c2-b9b0edb7c900" +version = "0.4.2" + +[[deps.Markdown]] +deps = ["Base64"] +uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" + +[[deps.MatrixEquations]] +deps = ["LinearAlgebra", "LinearMaps"] +git-tree-sha1 = "f765b4eda3ea9be8e644b9127809ca5151f3d9ea" +uuid = "99c1a7ee-ab34-5fd5-8076-27c950a045f4" +version = "2.4.2" + +[[deps.MbedTLS]] +deps = ["Dates", "MbedTLS_jll", "MozillaCACerts_jll", "NetworkOptions", "Random", "Sockets"] +git-tree-sha1 = "c067a280ddc25f196b5e7df3877c6b226d390aaf" +uuid = "739be429-bea8-5141-9913-cc70e7f3736d" +version = "1.1.9" + +[[deps.MbedTLS_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" +version = "2.28.2+1" + +[[deps.Measures]] +git-tree-sha1 = "c13304c81eec1ed3af7fc20e75fb6b26092a1102" +uuid = "442fdcdd-2543-5da2-b0f3-8c86c306513e" +version = "0.3.2" + +[[deps.MicroCollections]] +deps = ["Accessors", "BangBang", "InitialValues"] +git-tree-sha1 = "44d32db644e84c75dab479f1bc15ee76a1a3618f" +uuid = "128add7d-3638-4c79-886c-908ea0c25c34" +version = "0.2.0" + +[[deps.Missings]] +deps = ["DataAPI"] +git-tree-sha1 = "ec4f7fbeab05d7747bdf98eb74d130a2a2ed298d" +uuid = "e1d29d7a-bbdc-5cf2-9ac0-f12de2c33e28" +version = "1.2.0" + +[[deps.Mmap]] +uuid = "a63ad114-7e13-5084-954f-fe012c677804" + +[[deps.MozillaCACerts_jll]] +uuid = "14a3606d-f60d-562e-9121-12d972cd8159" +version = "2023.1.10" + +[[deps.MultivariatePolynomials]] +deps = ["ChainRulesCore", "DataStructures", "LinearAlgebra", "MutableArithmetics"] +git-tree-sha1 = "8d39779e29f80aa6c071e7ac17101c6e31f075d7" +uuid = "102ac46a-7ee4-5c85-9060-abc95bfdeaa3" +version = "0.5.7" + +[[deps.MutableArithmetics]] +deps = ["LinearAlgebra", "SparseArrays", "Test"] +git-tree-sha1 = "90077f1e79de8c9c7c8a90644494411111f4e07b" +uuid = "d8a4904e-b15c-11e9-3269-09a3773c0cb0" +version = "1.5.2" + +[[deps.NLSolversBase]] +deps = ["DiffResults", "Distributed", "FiniteDiff", "ForwardDiff"] +git-tree-sha1 = "a0b464d183da839699f4c79e7606d9d186ec172c" +uuid = "d41bc354-129a-5804-8e4c-c37616107c6c" +version = "7.8.3" + +[[deps.NNlib]] +deps = ["Adapt", "Atomix", "ChainRulesCore", "GPUArraysCore", "KernelAbstractions", "LinearAlgebra", "Random", "Statistics"] +git-tree-sha1 = "da09a1e112fd75f9af2a5229323f01b56ec96a4c" +uuid = "872c559c-99b0-510c-b3b7-b6c96a88d5cd" +version = "0.9.24" + + [deps.NNlib.extensions] + NNlibAMDGPUExt = "AMDGPU" + NNlibCUDACUDNNExt = ["CUDA", "cuDNN"] + NNlibCUDAExt = "CUDA" + NNlibEnzymeCoreExt = "EnzymeCore" + NNlibFFTWExt = "FFTW" + NNlibForwardDiffExt = "ForwardDiff" + + [deps.NNlib.weakdeps] + AMDGPU = "21141c5a-9bdb-4563-92ae-f87d6854732e" + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + EnzymeCore = "f151be2c-9106-41f4-ab19-57ee4f262869" + FFTW = "7a1cc6ca-52ef-59f5-83cd-3a7055c09341" + ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + cuDNN = "02a925ec-e4fe-4b08-9a7e-0d78e3d38ccd" + +[[deps.NaNMath]] +deps = ["OpenLibm_jll"] +git-tree-sha1 = "0877504529a3e5c3343c6f8b4c0381e57e4387e4" +uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" +version = "1.0.2" + +[[deps.NamedArrays]] +deps = ["Combinatorics", "DataStructures", "DelimitedFiles", "InvertedIndices", "LinearAlgebra", "Random", "Requires", "SparseArrays", "Statistics"] +git-tree-sha1 = "58e317b3b956b8aaddfd33ff4c3e33199cd8efce" +uuid = "86f7a689-2022-50b4-a561-43c23ac3c673" +version = "0.10.3" + +[[deps.NamedDims]] +deps = ["LinearAlgebra", "Pkg", "Statistics"] +git-tree-sha1 = "90178dc801073728b8b2d0d8677d10909feb94d8" +uuid = "356022a1-0364-5f58-8944-0da4b18d706f" +version = "1.2.2" + + [deps.NamedDims.extensions] + AbstractFFTsExt = "AbstractFFTs" + ChainRulesCoreExt = "ChainRulesCore" + CovarianceEstimationExt = "CovarianceEstimation" + TrackerExt = "Tracker" + + [deps.NamedDims.weakdeps] + AbstractFFTs = "621f4979-c628-5d54-868e-fcf4e3e8185c" + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + CovarianceEstimation = "587fd27a-f159-11e8-2dae-1979310e6154" + Requires = "ae029012-a4dd-5104-9daa-d747884805df" + Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" + +[[deps.NaturalSort]] +git-tree-sha1 = "eda490d06b9f7c00752ee81cfa451efe55521e21" +uuid = "c020b1a1-e9b0-503a-9c33-f039bfc54a85" +version = "1.0.0" + +[[deps.NetworkOptions]] +uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" +version = "1.2.0" + +[[deps.OffsetArrays]] +git-tree-sha1 = "1a27764e945a152f7ca7efa04de513d473e9542e" +uuid = "6fe1bfb0-de20-5000-8ca7-80f57d26f881" +version = "1.14.1" +weakdeps = ["Adapt"] + + [deps.OffsetArrays.extensions] + OffsetArraysAdaptExt = "Adapt" + +[[deps.Ogg_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "887579a3eb005446d514ab7aeac5d1d027658b8f" +uuid = "e7412a2a-1a6e-54c0-be00-318e2571c051" +version = "1.3.5+1" + +[[deps.OpenBLAS_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] +uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" +version = "0.3.23+4" + +[[deps.OpenLibm_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "05823500-19ac-5b8b-9628-191a04bc5112" +version = "0.8.1+2" + +[[deps.OpenSSL]] +deps = ["BitFlags", "Dates", "MozillaCACerts_jll", "OpenSSL_jll", "Sockets"] +git-tree-sha1 = "38cb508d080d21dc1128f7fb04f20387ed4c0af4" +uuid = "4d8831e6-92b7-49fb-bdf8-b643e874388c" +version = "1.4.3" + +[[deps.OpenSSL_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "7493f61f55a6cce7325f197443aa80d32554ba10" +uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95" +version = "3.0.15+1" + +[[deps.OpenSpecFun_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "13652491f6856acfd2db29360e1bbcd4565d04f1" +uuid = "efe28fd5-8261-553b-a9e1-b2916fc3738e" +version = "0.5.5+0" + +[[deps.Optim]] +deps = ["Compat", "FillArrays", "ForwardDiff", "LineSearches", "LinearAlgebra", "NLSolversBase", "NaNMath", "Parameters", "PositiveFactorizations", "Printf", "SparseArrays", "StatsBase"] +git-tree-sha1 = "ab7edad78cdef22099f43c54ef77ac63c2c9cc64" +uuid = "429524aa-4258-5aef-a3af-852621145aeb" +version = "1.10.0" + + [deps.Optim.extensions] + OptimMOIExt = "MathOptInterface" + + [deps.Optim.weakdeps] + MathOptInterface = "b8f27783-ece8-5eb3-8dc8-9495eed66fee" + +[[deps.Optimisers]] +deps = ["ChainRulesCore", "Functors", "LinearAlgebra", "Random", "Statistics"] +git-tree-sha1 = "6572fe0c5b74431aaeb0b18a4aa5ef03c84678be" +uuid = "3bd65402-5787-11e9-1adc-39752487f4e2" +version = "0.3.3" + +[[deps.Optimization]] +deps = ["ADTypes", "ArrayInterface", "ConsoleProgressMonitor", "DocStringExtensions", "LBFGSB", "LinearAlgebra", "Logging", "LoggingExtras", "OptimizationBase", "Printf", "ProgressLogging", "Reexport", "SciMLBase", "SparseArrays", "TerminalLoggers"] +git-tree-sha1 = "0b2a631276dc92ab147535689fa43f1e22a657b8" +uuid = "7f7a1694-90dd-40f0-9382-eb1efda571ba" +version = "3.28.0" + +[[deps.OptimizationBase]] +deps = ["ADTypes", "ArrayInterface", "DocStringExtensions", "LinearAlgebra", "PDMats", "Reexport", "Requires", "SciMLBase", "SparseArrays", "SymbolicAnalysis", "SymbolicIndexingInterface", "Symbolics"] +git-tree-sha1 = "3e5e5e8cbe572200dcd94a6084a63ca68fe76279" +uuid = "bca83a33-5cc9-4baa-983d-23429ab6bcbb" +version = "1.5.0" + + [deps.OptimizationBase.extensions] + OptimizationEnzymeExt = "Enzyme" + OptimizationFiniteDiffExt = "FiniteDiff" + OptimizationForwardDiffExt = "ForwardDiff" + OptimizationMTKExt = "ModelingToolkit" + OptimizationReverseDiffExt = "ReverseDiff" + OptimizationSparseDiffExt = ["SparseDiffTools", "ReverseDiff"] + OptimizationTrackerExt = "Tracker" + OptimizationZygoteExt = "Zygote" + + [deps.OptimizationBase.weakdeps] + Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9" + FiniteDiff = "6a86dc24-6348-571c-b903-95158fe2bd41" + ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + ModelingToolkit = "961ee093-0014-501f-94e3-6117800e7a78" + ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + SparseDiffTools = "47a9eef4-7e08-11e9-0b38-333d64bd3804" + Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" + Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f" + +[[deps.OptimizationOptimJL]] +deps = ["Optim", "Optimization", "Reexport", "SparseArrays"] +git-tree-sha1 = "43870d726f883a47d158beebb1fc3c9fab1da9d6" +uuid = "36348300-93cb-4f02-beb5-3c3902f8871e" +version = "0.3.2" + +[[deps.Opus_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "6703a85cb3781bd5909d48730a67205f3f31a575" +uuid = "91d4177d-7536-5919-b921-800302f37372" +version = "1.3.3+0" + +[[deps.OrderedCollections]] +git-tree-sha1 = "dfdf5519f235516220579f949664f1bf44e741c5" +uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" +version = "1.6.3" + +[[deps.PCRE2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "efcefdf7-47ab-520b-bdef-62a2eaa19f15" +version = "10.42.0+1" + +[[deps.PDMats]] +deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"] +git-tree-sha1 = "949347156c25054de2db3b166c52ac4728cbad65" +uuid = "90014a1f-27ba-587c-ab20-58faa44d9150" +version = "0.11.31" + +[[deps.Pango_jll]] +deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "FriBidi_jll", "Glib_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl"] +git-tree-sha1 = "e127b609fb9ecba6f201ba7ab753d5a605d53801" +uuid = "36c8627f-9965-5494-a995-c6b170f724f3" +version = "1.54.1+0" + +[[deps.Parameters]] +deps = ["OrderedCollections", "UnPack"] +git-tree-sha1 = "34c0e9ad262e5f7fc75b10a9952ca7692cfc5fbe" +uuid = "d96e819e-fc66-5662-9728-84c9c7592b0a" +version = "0.12.3" + +[[deps.Parsers]] +deps = ["Dates", "PrecompileTools", "UUIDs"] +git-tree-sha1 = "8489905bcdbcfac64d1daa51ca07c0d8f0283821" +uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" +version = "2.8.1" + +[[deps.Pipe]] +git-tree-sha1 = "6842804e7867b115ca9de748a0cf6b364523c16d" +uuid = "b98c9c47-44ae-5843-9183-064241ee97a0" +version = "1.3.0" + +[[deps.Pixman_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LLVMOpenMP_jll", "Libdl"] +git-tree-sha1 = "35621f10a7531bc8fa58f74610b1bfb70a3cfc6b" +uuid = "30392449-352a-5448-841d-b1acce4e97dc" +version = "0.43.4+0" + +[[deps.Pkg]] +deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] +uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" +version = "1.10.0" + +[[deps.PlotThemes]] +deps = ["PlotUtils", "Statistics"] +git-tree-sha1 = "6e55c6841ce3411ccb3457ee52fc48cb698d6fb0" +uuid = "ccf2f8ad-2431-5c83-bf29-c5338b663b6a" +version = "3.2.0" + +[[deps.PlotUtils]] +deps = ["ColorSchemes", "Colors", "Dates", "PrecompileTools", "Printf", "Random", "Reexport", "StableRNGs", "Statistics"] +git-tree-sha1 = "650a022b2ce86c7dcfbdecf00f78afeeb20e5655" +uuid = "995b91a9-d308-5afd-9ec6-746e21dbc043" +version = "1.4.2" + +[[deps.Plots]] +deps = ["Base64", "Contour", "Dates", "Downloads", "FFMPEG", "FixedPointNumbers", "GR", "JLFzf", "JSON", "LaTeXStrings", "Latexify", "LinearAlgebra", "Measures", "NaNMath", "Pkg", "PlotThemes", "PlotUtils", "PrecompileTools", "Printf", "REPL", "Random", "RecipesBase", "RecipesPipeline", "Reexport", "RelocatableFolders", "Requires", "Scratch", "Showoff", "SparseArrays", "Statistics", "StatsBase", "TOML", "UUIDs", "UnicodeFun", "UnitfulLatexify", "Unzip"] +git-tree-sha1 = "45470145863035bb124ca51b320ed35d071cc6c2" +uuid = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" +version = "1.40.8" + + [deps.Plots.extensions] + FileIOExt = "FileIO" + GeometryBasicsExt = "GeometryBasics" + IJuliaExt = "IJulia" + ImageInTerminalExt = "ImageInTerminal" + UnitfulExt = "Unitful" + + [deps.Plots.weakdeps] + FileIO = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" + GeometryBasics = "5c1252a2-5f33-56bf-86c9-59e7332b4326" + IJulia = "7073ff75-c697-5162-941a-fcdaad2a7d2a" + ImageInTerminal = "d8c32880-2388-543b-8c61-d9f865259254" + Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" + +[[deps.PlutoUI]] +deps = ["AbstractPlutoDingetjes", "Base64", "ColorTypes", "Dates", "FixedPointNumbers", "Hyperscript", "HypertextLiteral", "IOCapture", "InteractiveUtils", "JSON", "Logging", "MIMEs", "Markdown", "Random", "Reexport", "URIs", "UUIDs"] +git-tree-sha1 = "eba4810d5e6a01f612b948c9fa94f905b49087b0" +uuid = "7f904dfe-b85e-4ff6-b463-dae2292396a8" +version = "0.7.60" + +[[deps.Polynomials]] +deps = ["LinearAlgebra", "RecipesBase", "Requires", "Setfield", "SparseArrays"] +git-tree-sha1 = "1a9cfb2dc2c2f1bd63f1906d72af39a79b49b736" +uuid = "f27b6e38-b328-58d1-80ce-0feddd5e7a45" +version = "4.0.11" + + [deps.Polynomials.extensions] + PolynomialsChainRulesCoreExt = "ChainRulesCore" + PolynomialsFFTWExt = "FFTW" + PolynomialsMakieCoreExt = "MakieCore" + PolynomialsMutableArithmeticsExt = "MutableArithmetics" + + [deps.Polynomials.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + FFTW = "7a1cc6ca-52ef-59f5-83cd-3a7055c09341" + MakieCore = "20f20a25-4f0e-4fdf-b5d1-57303727442b" + MutableArithmetics = "d8a4904e-b15c-11e9-3269-09a3773c0cb0" + +[[deps.PositiveFactorizations]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "17275485f373e6673f7e7f97051f703ed5b15b20" +uuid = "85a6dd25-e78a-55b7-8502-1745935b8125" +version = "0.2.4" + +[[deps.PrecompileTools]] +deps = ["Preferences"] +git-tree-sha1 = "5aa36f7049a63a1528fe8f7c3f2113413ffd4e1f" +uuid = "aea7be01-6a6a-4083-8856-8a6e6704d82a" +version = "1.2.1" + +[[deps.Preferences]] +deps = ["TOML"] +git-tree-sha1 = "9306f6085165d270f7e3db02af26a400d580f5c6" +uuid = "21216c6a-2e73-6563-6e65-726566657250" +version = "1.4.3" + +[[deps.PrettyTables]] +deps = ["Crayons", "LaTeXStrings", "Markdown", "PrecompileTools", "Printf", "Reexport", "StringManipulation", "Tables"] +git-tree-sha1 = "1101cd475833706e4d0e7b122218257178f48f34" +uuid = "08abe8d2-0d0c-5749-adfa-8a2ac140af0d" +version = "2.4.0" + +[[deps.Primes]] +deps = ["IntegerMathUtils"] +git-tree-sha1 = "cb420f77dc474d23ee47ca8d14c90810cafe69e7" +uuid = "27ebfcd6-29c5-5fa9-bf4b-fb8fc14df3ae" +version = "0.5.6" + +[[deps.Printf]] +deps = ["Unicode"] +uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" + +[[deps.ProgressLogging]] +deps = ["Logging", "SHA", "UUIDs"] +git-tree-sha1 = "80d919dee55b9c50e8d9e2da5eeafff3fe58b539" +uuid = "33c8b6b6-d38a-422a-b730-caa89a2f386c" +version = "0.1.4" + +[[deps.ProgressMeter]] +deps = ["Distributed", "Printf"] +git-tree-sha1 = "8f6bc219586aef8baf0ff9a5fe16ee9c70cb65e4" +uuid = "92933f4c-e287-5a05-a399-4b506db050ca" +version = "1.10.2" + +[[deps.PtrArrays]] +git-tree-sha1 = "77a42d78b6a92df47ab37e177b2deac405e1c88f" +uuid = "43287f4e-b6f4-7ad1-bb20-aadabca52c3d" +version = "1.2.1" + +[[deps.Qt6Base_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Fontconfig_jll", "Glib_jll", "JLLWrappers", "Libdl", "Libglvnd_jll", "OpenSSL_jll", "Vulkan_Loader_jll", "Xorg_libSM_jll", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Xorg_libxcb_jll", "Xorg_xcb_util_cursor_jll", "Xorg_xcb_util_image_jll", "Xorg_xcb_util_keysyms_jll", "Xorg_xcb_util_renderutil_jll", "Xorg_xcb_util_wm_jll", "Zlib_jll", "libinput_jll", "xkbcommon_jll"] +git-tree-sha1 = "492601870742dcd38f233b23c3ec629628c1d724" +uuid = "c0090381-4147-56d7-9ebc-da0b1113ec56" +version = "6.7.1+1" + +[[deps.Qt6Declarative_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Qt6Base_jll", "Qt6ShaderTools_jll"] +git-tree-sha1 = "e5dd466bf2569fe08c91a2cc29c1003f4797ac3b" +uuid = "629bc702-f1f5-5709-abd5-49b8460ea067" +version = "6.7.1+2" + +[[deps.Qt6ShaderTools_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Qt6Base_jll"] +git-tree-sha1 = "1a180aeced866700d4bebc3120ea1451201f16bc" +uuid = "ce943373-25bb-56aa-8eca-768745ed7b5a" +version = "6.7.1+1" + +[[deps.Qt6Wayland_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Qt6Base_jll", "Qt6Declarative_jll"] +git-tree-sha1 = "729927532d48cf79f49070341e1d918a65aba6b0" +uuid = "e99dba38-086e-5de3-a5b1-6e4c66e897c3" +version = "6.7.1+1" + +[[deps.QuadGK]] +deps = ["DataStructures", "LinearAlgebra"] +git-tree-sha1 = "cda3b045cf9ef07a08ad46731f5a3165e56cf3da" +uuid = "1fd47b50-473d-5c70-9696-f719f8f3bcdc" +version = "2.11.1" + + [deps.QuadGK.extensions] + QuadGKEnzymeExt = "Enzyme" + + [deps.QuadGK.weakdeps] + Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9" + +[[deps.Quaternions]] +deps = ["LinearAlgebra", "Random", "RealDot"] +git-tree-sha1 = "994cc27cdacca10e68feb291673ec3a76aa2fae9" +uuid = "94ee1d12-ae83-5a48-8b1c-48b8ff168ae0" +version = "0.7.6" + +[[deps.REPL]] +deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] +uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" + +[[deps.Random]] +deps = ["SHA"] +uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" + +[[deps.Random123]] +deps = ["Random", "RandomNumbers"] +git-tree-sha1 = "4743b43e5a9c4a2ede372de7061eed81795b12e7" +uuid = "74087812-796a-5b5d-8853-05524746bad3" +version = "1.7.0" + +[[deps.RandomNumbers]] +deps = ["Random"] +git-tree-sha1 = "c6ec94d2aaba1ab2ff983052cf6a606ca5985902" +uuid = "e6cf234a-135c-5ec9-84dd-332b85af5143" +version = "1.6.0" + +[[deps.RangeArrays]] +git-tree-sha1 = "b9039e93773ddcfc828f12aadf7115b4b4d225f5" +uuid = "b3c3ace0-ae52-54e7-9d0b-2c1406fd6b9d" +version = "0.3.2" + +[[deps.Ratios]] +deps = ["Requires"] +git-tree-sha1 = "1342a47bf3260ee108163042310d26f2be5ec90b" +uuid = "c84ed2f1-dad5-54f0-aa8e-dbefe2724439" +version = "0.4.5" +weakdeps = ["FixedPointNumbers"] + + [deps.Ratios.extensions] + RatiosFixedPointNumbersExt = "FixedPointNumbers" + +[[deps.RealDot]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "9f0a1b71baaf7650f4fa8a1d168c7fb6ee41f0c9" +uuid = "c1ae055f-0cd5-4b69-90a6-9a35b1a98df9" +version = "0.1.0" + +[[deps.RecipesBase]] +deps = ["PrecompileTools"] +git-tree-sha1 = "5c3d09cc4f31f5fc6af001c250bf1278733100ff" +uuid = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" +version = "1.3.4" + +[[deps.RecipesPipeline]] +deps = ["Dates", "NaNMath", "PlotUtils", "PrecompileTools", "RecipesBase"] +git-tree-sha1 = "45cf9fd0ca5839d06ef333c8201714e888486342" +uuid = "01d81517-befc-4cb6-b9ec-a95719d0359c" +version = "0.6.12" + +[[deps.RecursiveArrayTools]] +deps = ["Adapt", "ArrayInterface", "DocStringExtensions", "GPUArraysCore", "IteratorInterfaceExtensions", "LinearAlgebra", "RecipesBase", "StaticArraysCore", "Statistics", "SymbolicIndexingInterface", "Tables"] +git-tree-sha1 = "b034171b93aebc81b3e1890a036d13a9c4a9e3e0" +uuid = "731186ca-8d62-57ce-b412-fbd966d074cd" +version = "3.27.0" + + [deps.RecursiveArrayTools.extensions] + RecursiveArrayToolsFastBroadcastExt = "FastBroadcast" + RecursiveArrayToolsForwardDiffExt = "ForwardDiff" + RecursiveArrayToolsMeasurementsExt = "Measurements" + RecursiveArrayToolsMonteCarloMeasurementsExt = "MonteCarloMeasurements" + RecursiveArrayToolsReverseDiffExt = ["ReverseDiff", "Zygote"] + RecursiveArrayToolsSparseArraysExt = ["SparseArrays"] + RecursiveArrayToolsTrackerExt = "Tracker" + RecursiveArrayToolsZygoteExt = "Zygote" + + [deps.RecursiveArrayTools.weakdeps] + FastBroadcast = "7034ab61-46d4-4ed7-9d0f-46aef9175898" + ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + Measurements = "eff96d63-e80a-5855-80a2-b1b0885c5ab7" + MonteCarloMeasurements = "0987c9cc-fe09-11e8-30f0-b96dd679fdca" + ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" + Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f" + +[[deps.Reexport]] +git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" +uuid = "189a3867-3050-52da-a836-e630ba90ab69" +version = "1.2.2" + +[[deps.RelocatableFolders]] +deps = ["SHA", "Scratch"] +git-tree-sha1 = "ffdaf70d81cf6ff22c2b6e733c900c3321cab864" +uuid = "05181044-ff0b-4ac5-8273-598c1e38db00" +version = "1.0.1" + +[[deps.Requires]] +deps = ["UUIDs"] +git-tree-sha1 = "838a3a4188e2ded87a4f9f184b4b0d78a1e91cb7" +uuid = "ae029012-a4dd-5104-9daa-d747884805df" +version = "1.3.0" + +[[deps.Rmath]] +deps = ["Random", "Rmath_jll"] +git-tree-sha1 = "852bd0f55565a9e973fcfee83a84413270224dc4" +uuid = "79098fc4-a85e-5d69-aa6a-4863f24498fa" +version = "0.8.0" + +[[deps.Rmath_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "58cdd8fb2201a6267e1db87ff148dd6c1dbd8ad8" +uuid = "f50d1b31-88e8-58de-be2c-1cc44531875f" +version = "0.5.1+0" + +[[deps.Roots]] +deps = ["Accessors", "CommonSolve", "Printf"] +git-tree-sha1 = "3a7c7e5c3f015415637f5debdf8a674aa2c979c4" +uuid = "f2b01f46-fcfa-551c-844a-d8ac1e96c665" +version = "2.2.1" + + [deps.Roots.extensions] + RootsChainRulesCoreExt = "ChainRulesCore" + RootsForwardDiffExt = "ForwardDiff" + RootsIntervalRootFindingExt = "IntervalRootFinding" + RootsSymPyExt = "SymPy" + RootsSymPyPythonCallExt = "SymPyPythonCall" + + [deps.Roots.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + IntervalRootFinding = "d2bf35a9-74e0-55ec-b149-d360ff49b807" + SymPy = "24249f21-da20-56a4-8eb1-6a02cf4ae2e6" + SymPyPythonCall = "bc8888f7-b21e-4b7c-a06a-5d9c9496438c" + +[[deps.RuntimeGeneratedFunctions]] +deps = ["ExprTools", "SHA", "Serialization"] +git-tree-sha1 = "04c968137612c4a5629fa531334bb81ad5680f00" +uuid = "7e49a35a-f44a-4d26-94aa-eba1b4ca6b47" +version = "0.5.13" + +[[deps.SHA]] +uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" +version = "0.7.0" + +[[deps.SSMProblems]] +deps = ["AbstractMCMC"] +git-tree-sha1 = "f640e4e8343c9d5f470e2f6ca6ce79f708ab6376" +uuid = "26aad666-b158-4e64-9d35-0e672562fa48" +version = "0.1.1" + +[[deps.SciMLBase]] +deps = ["ADTypes", "Accessors", "ArrayInterface", "CommonSolve", "ConstructionBase", "Distributed", "DocStringExtensions", "EnumX", "Expronicon", "FunctionWrappersWrappers", "IteratorInterfaceExtensions", "LinearAlgebra", "Logging", "Markdown", "PrecompileTools", "Preferences", "Printf", "RecipesBase", "RecursiveArrayTools", "Reexport", "RuntimeGeneratedFunctions", "SciMLOperators", "SciMLStructures", "StaticArraysCore", "Statistics", "SymbolicIndexingInterface"] +git-tree-sha1 = "26fea1911818cd480400f1a2b7f6b32c3cc3836a" +uuid = "0bca4576-84f4-4d90-8ffe-ffa030f20462" +version = "2.56.4" + + [deps.SciMLBase.extensions] + SciMLBaseChainRulesCoreExt = "ChainRulesCore" + SciMLBaseMakieExt = "Makie" + SciMLBasePartialFunctionsExt = "PartialFunctions" + SciMLBasePyCallExt = "PyCall" + SciMLBasePythonCallExt = "PythonCall" + SciMLBaseRCallExt = "RCall" + SciMLBaseZygoteExt = "Zygote" + + [deps.SciMLBase.weakdeps] + ChainRules = "082447d4-558c-5d27-93f4-14fc19e9eca2" + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + Makie = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a" + PartialFunctions = "570af359-4316-4cb7-8c74-252c00c2016b" + PyCall = "438e738f-606a-5dbb-bf0a-cddfbfd45ab0" + PythonCall = "6099a3de-0909-46bc-b1f4-468b9a2dfc0d" + RCall = "6f49c342-dc21-5d91-9882-a32aef131414" + Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f" + +[[deps.SciMLOperators]] +deps = ["Accessors", "ArrayInterface", "DocStringExtensions", "LinearAlgebra", "MacroTools"] +git-tree-sha1 = "ef388ca9e4921ec5614ce714f8aa59a5cd33d867" +uuid = "c0aeaf25-5076-4817-a8d5-81caf7dfa961" +version = "0.3.11" +weakdeps = ["SparseArrays", "StaticArraysCore"] + + [deps.SciMLOperators.extensions] + SciMLOperatorsSparseArraysExt = "SparseArrays" + SciMLOperatorsStaticArraysCoreExt = "StaticArraysCore" + +[[deps.SciMLStructures]] +deps = ["ArrayInterface"] +git-tree-sha1 = "25514a6f200219cd1073e4ff23a6324e4a7efe64" +uuid = "53ae85a6-f571-4167-b2af-e1d143709226" +version = "1.5.0" + +[[deps.ScientificTypesBase]] +git-tree-sha1 = "a8e18eb383b5ecf1b5e6fc237eb39255044fd92b" +uuid = "30f210dd-8aff-4c5f-94ba-8e64358c1161" +version = "3.0.0" + +[[deps.Scratch]] +deps = ["Dates"] +git-tree-sha1 = "3bac05bc7e74a75fd9cba4295cde4045d9fe2386" +uuid = "6c6a2e73-6563-6170-7368-637461726353" +version = "1.2.1" + +[[deps.Serialization]] +uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" + +[[deps.Setfield]] +deps = ["ConstructionBase", "Future", "MacroTools", "StaticArraysCore"] +git-tree-sha1 = "e2cc6d8c88613c05e1defb55170bf5ff211fbeac" +uuid = "efcf1570-3423-57d1-acb7-fd33fddbac46" +version = "1.1.1" + +[[deps.SharedArrays]] +deps = ["Distributed", "Mmap", "Random", "Serialization"] +uuid = "1a1011a3-84de-559e-8e89-a11a2f7dc383" + +[[deps.Showoff]] +deps = ["Dates", "Grisu"] +git-tree-sha1 = "91eddf657aca81df9ae6ceb20b959ae5653ad1de" +uuid = "992d4aef-0814-514b-bc4d-f2e9a6c4116f" +version = "1.0.3" + +[[deps.SimpleBufferStream]] +git-tree-sha1 = "f305871d2f381d21527c770d4788c06c097c9bc1" +uuid = "777ac1f9-54b0-4bf8-805c-2214025038e7" +version = "1.2.0" + +[[deps.SimpleTraits]] +deps = ["InteractiveUtils", "MacroTools"] +git-tree-sha1 = "5d7e3f4e11935503d3ecaf7186eac40602e7d231" +uuid = "699a6c99-e7fa-54fc-8d76-47d257e15c1d" +version = "0.9.4" + +[[deps.SimpleUnPack]] +git-tree-sha1 = "58e6353e72cde29b90a69527e56df1b5c3d8c437" +uuid = "ce78b400-467f-4804-87d8-8f486da07d0a" +version = "1.1.0" + +[[deps.SimpleWeightedGraphs]] +deps = ["Graphs", "LinearAlgebra", "Markdown", "SparseArrays"] +git-tree-sha1 = "4b33e0e081a825dbfaf314decf58fa47e53d6acb" +uuid = "47aef6b3-ad0c-573a-a1e2-d07658019622" +version = "1.4.0" + +[[deps.Sockets]] +uuid = "6462fe0b-24de-5631-8697-dd941f90decc" + +[[deps.SortingAlgorithms]] +deps = ["DataStructures"] +git-tree-sha1 = "66e0a8e672a0bdfca2c3f5937efb8538b9ddc085" +uuid = "a2af1166-a08f-5f64-846c-94a0d3cef48c" +version = "1.2.1" + +[[deps.SparseArrays]] +deps = ["Libdl", "LinearAlgebra", "Random", "Serialization", "SuiteSparse_jll"] +uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" +version = "1.10.0" + +[[deps.SparseInverseSubset]] +deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"] +git-tree-sha1 = "52962839426b75b3021296f7df242e40ecfc0852" +uuid = "dc90abb0-5640-4711-901d-7e5b23a2fada" +version = "0.1.2" + +[[deps.SpecialFunctions]] +deps = ["IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"] +git-tree-sha1 = "2f5d4697f21388cbe1ff299430dd169ef97d7e14" +uuid = "276daf66-3868-5448-9aa4-cd146d93841b" +version = "2.4.0" +weakdeps = ["ChainRulesCore"] + + [deps.SpecialFunctions.extensions] + SpecialFunctionsChainRulesCoreExt = "ChainRulesCore" + +[[deps.SplittablesBase]] +deps = ["Setfield", "Test"] +git-tree-sha1 = "e08a62abc517eb79667d0a29dc08a3b589516bb5" +uuid = "171d559e-b47b-412a-8079-5efa626c420e" +version = "0.1.15" + +[[deps.StableRNGs]] +deps = ["Random"] +git-tree-sha1 = "83e6cce8324d49dfaf9ef059227f91ed4441a8e5" +uuid = "860ef19b-820b-49d6-a774-d7a799459cd3" +version = "1.0.2" + +[[deps.StaticArrays]] +deps = ["LinearAlgebra", "PrecompileTools", "Random", "StaticArraysCore"] +git-tree-sha1 = "777657803913ffc7e8cc20f0fd04b634f871af8f" +uuid = "90137ffa-7385-5640-81b9-e52037218182" +version = "1.9.8" +weakdeps = ["ChainRulesCore", "Statistics"] + + [deps.StaticArrays.extensions] + StaticArraysChainRulesCoreExt = "ChainRulesCore" + StaticArraysStatisticsExt = "Statistics" + +[[deps.StaticArraysCore]] +git-tree-sha1 = "192954ef1208c7019899fbf8049e717f92959682" +uuid = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" +version = "1.4.3" + +[[deps.StatisticalTraits]] +deps = ["ScientificTypesBase"] +git-tree-sha1 = "542d979f6e756f13f862aa00b224f04f9e445f11" +uuid = "64bff920-2084-43da-a3e6-9bb72801c0c9" +version = "3.4.0" + +[[deps.Statistics]] +deps = ["LinearAlgebra", "SparseArrays"] +uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" +version = "1.10.0" + +[[deps.StatsAPI]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "1ff449ad350c9c4cbc756624d6f8a8c3ef56d3ed" +uuid = "82ae8749-77ed-4fe6-ae5f-f523153014b0" +version = "1.7.0" + +[[deps.StatsBase]] +deps = ["DataAPI", "DataStructures", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"] +git-tree-sha1 = "5cf7606d6cef84b543b483848d4ae08ad9832b21" +uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" +version = "0.34.3" + +[[deps.StatsFuns]] +deps = ["HypergeometricFunctions", "IrrationalConstants", "LogExpFunctions", "Reexport", "Rmath", "SpecialFunctions"] +git-tree-sha1 = "b423576adc27097764a90e163157bcfc9acf0f46" +uuid = "4c63d2b9-4356-54db-8cca-17b64c39e42c" +version = "1.3.2" +weakdeps = ["ChainRulesCore", "InverseFunctions"] + + [deps.StatsFuns.extensions] + StatsFunsChainRulesCoreExt = "ChainRulesCore" + StatsFunsInverseFunctionsExt = "InverseFunctions" + +[[deps.StringManipulation]] +deps = ["PrecompileTools"] +git-tree-sha1 = "a6b1675a536c5ad1a60e5a5153e1fee12eb146e3" +uuid = "892a3eda-7b42-436c-8928-eab12a02cf0e" +version = "0.4.0" + +[[deps.StructArrays]] +deps = ["ConstructionBase", "DataAPI", "Tables"] +git-tree-sha1 = "f4dc295e983502292c4c3f951dbb4e985e35b3be" +uuid = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" +version = "0.6.18" +weakdeps = ["Adapt", "GPUArraysCore", "SparseArrays", "StaticArrays"] + + [deps.StructArrays.extensions] + StructArraysAdaptExt = "Adapt" + StructArraysGPUArraysCoreExt = "GPUArraysCore" + StructArraysSparseArraysExt = "SparseArrays" + StructArraysStaticArraysExt = "StaticArrays" + +[[deps.SuiteSparse]] +deps = ["Libdl", "LinearAlgebra", "Serialization", "SparseArrays"] +uuid = "4607b0f0-06f3-5cda-b6b1-a6196a1729e9" + +[[deps.SuiteSparse_jll]] +deps = ["Artifacts", "Libdl", "libblastrampoline_jll"] +uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c" +version = "7.2.1+1" + +[[deps.SymbolicAnalysis]] +deps = ["DSP", "DataStructures", "Dictionaries", "Distributions", "DomainSets", "IfElse", "LinearAlgebra", "LogExpFunctions", "Manifolds", "PDMats", "RecursiveArrayTools", "StatsBase", "SymbolicUtils", "Symbolics"] +git-tree-sha1 = "64f26bb4a666bb97baa16f063164ade83ca29ec9" +uuid = "4297ee4d-0239-47d8-ba5d-195ecdf594fe" +version = "0.3.0" + +[[deps.SymbolicIndexingInterface]] +deps = ["Accessors", "ArrayInterface", "RuntimeGeneratedFunctions", "StaticArraysCore"] +git-tree-sha1 = "4bc96df5d71515b1cb86dd626915f06f4c0d46f5" +uuid = "2efcf032-c050-4f8e-a9bb-153293bab1f5" +version = "0.3.33" + +[[deps.SymbolicLimits]] +deps = ["SymbolicUtils"] +git-tree-sha1 = "fabf4650afe966a2ba646cabd924c3fd43577fc3" +uuid = "19f23fe9-fdab-4a78-91af-e7b7767979c3" +version = "0.2.2" + +[[deps.SymbolicUtils]] +deps = ["AbstractTrees", "ArrayInterface", "Bijections", "ChainRulesCore", "Combinatorics", "ConstructionBase", "DataStructures", "DocStringExtensions", "DynamicPolynomials", "IfElse", "LinearAlgebra", "MultivariatePolynomials", "NaNMath", "Setfield", "SparseArrays", "SpecialFunctions", "StaticArrays", "SymbolicIndexingInterface", "TermInterface", "TimerOutputs", "Unityper"] +git-tree-sha1 = "04e9157537ba51dad58336976f8d04b9ab7122f0" +uuid = "d1185830-fcd6-423d-90d6-eec64667417b" +version = "3.7.2" + + [deps.SymbolicUtils.extensions] + SymbolicUtilsLabelledArraysExt = "LabelledArrays" + SymbolicUtilsReverseDiffExt = "ReverseDiff" + + [deps.SymbolicUtils.weakdeps] + LabelledArrays = "2ee39098-c373-598a-b85f-a56591580800" + ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + +[[deps.Symbolics]] +deps = ["ADTypes", "ArrayInterface", "Bijections", "CommonWorldInvalidations", "ConstructionBase", "DataStructures", "DiffRules", "Distributions", "DocStringExtensions", "DomainSets", "DynamicPolynomials", "IfElse", "LaTeXStrings", "Latexify", "Libdl", "LinearAlgebra", "LogExpFunctions", "MacroTools", "Markdown", "NaNMath", "PrecompileTools", "Primes", "RecipesBase", "Reexport", "RuntimeGeneratedFunctions", "SciMLBase", "Setfield", "SparseArrays", "SpecialFunctions", "StaticArraysCore", "SymbolicIndexingInterface", "SymbolicLimits", "SymbolicUtils", "TermInterface"] +git-tree-sha1 = "9cd83b6a270bb6135666c4d566cb8d85730ea9e5" +uuid = "0c5d862f-8b57-4792-8d23-62f2024744c7" +version = "6.14.0" + + [deps.Symbolics.extensions] + SymbolicsForwardDiffExt = "ForwardDiff" + SymbolicsGroebnerExt = "Groebner" + SymbolicsLuxExt = "Lux" + SymbolicsNemoExt = "Nemo" + SymbolicsPreallocationToolsExt = ["PreallocationTools", "ForwardDiff"] + SymbolicsSymPyExt = "SymPy" + + [deps.Symbolics.weakdeps] + ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + Groebner = "0b43b601-686d-58a3-8a1c-6623616c7cd4" + Lux = "b2108857-7c20-44ae-9111-449ecde12c47" + Nemo = "2edaba10-b0f1-5616-af89-8c11ac63239a" + PreallocationTools = "d236fae5-4411-538c-8e31-a6e3d9e00b46" + SymPy = "24249f21-da20-56a4-8eb1-6a02cf4ae2e6" + +[[deps.TOML]] +deps = ["Dates"] +uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" +version = "1.0.3" + +[[deps.TableTraits]] +deps = ["IteratorInterfaceExtensions"] +git-tree-sha1 = "c06b2f539df1c6efa794486abfb6ed2022561a39" +uuid = "3783bdb8-4a98-5b6b-af9a-565f29a5fe9c" +version = "1.0.1" + +[[deps.Tables]] +deps = ["DataAPI", "DataValueInterfaces", "IteratorInterfaceExtensions", "OrderedCollections", "TableTraits"] +git-tree-sha1 = "598cd7c1f68d1e205689b1c2fe65a9f85846f297" +uuid = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" +version = "1.12.0" + +[[deps.Tar]] +deps = ["ArgTools", "SHA"] +uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" +version = "1.10.0" + +[[deps.TensorCore]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "1feb45f88d133a655e001435632f019a9a1bcdb6" +uuid = "62fd8b95-f654-4bbd-a8a5-9c27f68ccd50" +version = "0.1.1" + +[[deps.TermInterface]] +git-tree-sha1 = "d673e0aca9e46a2f63720201f55cc7b3e7169b16" +uuid = "8ea1fca8-c5ef-4a55-8b96-4e9afe9c9a3c" +version = "2.0.0" + +[[deps.TerminalLoggers]] +deps = ["LeftChildRightSiblingTrees", "Logging", "Markdown", "Printf", "ProgressLogging", "UUIDs"] +git-tree-sha1 = "f133fab380933d042f6796eda4e130272ba520ca" +uuid = "5d786b92-1e48-4d6f-9151-6b4477ca9bed" +version = "0.1.7" + +[[deps.Test]] +deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] +uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[[deps.TimerOutputs]] +deps = ["ExprTools", "Printf"] +git-tree-sha1 = "3a6f063d690135f5c1ba351412c82bae4d1402bf" +uuid = "a759f4b9-e2f1-59dc-863e-4aeb61b1ea8f" +version = "0.5.25" + +[[deps.Tracker]] +deps = ["Adapt", "ChainRulesCore", "DiffRules", "ForwardDiff", "Functors", "LinearAlgebra", "LogExpFunctions", "MacroTools", "NNlib", "NaNMath", "Optimisers", "Printf", "Random", "Requires", "SpecialFunctions", "Statistics"] +git-tree-sha1 = "da45269e1da051c2a13624194fcdc74d6483fad5" +uuid = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" +version = "0.2.35" +weakdeps = ["PDMats"] + + [deps.Tracker.extensions] + TrackerPDMatsExt = "PDMats" + +[[deps.TranscodingStreams]] +git-tree-sha1 = "0c45878dcfdcfa8480052b6ab162cdd138781742" +uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa" +version = "0.11.3" + +[[deps.Transducers]] +deps = ["Accessors", "ArgCheck", "BangBang", "Baselet", "CompositionsBase", "ConstructionBase", "DefineSingletons", "Distributed", "InitialValues", "Logging", "Markdown", "MicroCollections", "Requires", "SplittablesBase", "Tables"] +git-tree-sha1 = "7deeab4ff96b85c5f72c824cae53a1398da3d1cb" +uuid = "28d57a85-8fef-5791-bfe6-a80928e7c999" +version = "0.4.84" + + [deps.Transducers.extensions] + TransducersAdaptExt = "Adapt" + TransducersBlockArraysExt = "BlockArrays" + TransducersDataFramesExt = "DataFrames" + TransducersLazyArraysExt = "LazyArrays" + TransducersOnlineStatsBaseExt = "OnlineStatsBase" + TransducersReferenceablesExt = "Referenceables" + + [deps.Transducers.weakdeps] + Adapt = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" + BlockArrays = "8e7c35d0-a365-5155-bbbb-fb81a777f24e" + DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" + LazyArrays = "5078a376-72f3-5289-bfd5-ec5146d43c02" + OnlineStatsBase = "925886fa-5bf2-5e8e-b522-a9147a512338" + Referenceables = "42d2dcc6-99eb-4e98-b66c-637b7d73030e" + +[[deps.Tricks]] +git-tree-sha1 = "7822b97e99a1672bfb1b49b668a6d46d58d8cbcb" +uuid = "410a4b4d-49e4-4fbc-ab6d-cb71b17b3775" +version = "0.1.9" + +[[deps.Turing]] +deps = ["ADTypes", "AbstractMCMC", "Accessors", "AdvancedHMC", "AdvancedMH", "AdvancedPS", "AdvancedVI", "BangBang", "Bijectors", "Compat", "DataStructures", "Distributions", "DistributionsAD", "DocStringExtensions", "DynamicPPL", "EllipticalSliceSampling", "ForwardDiff", "Libtask", "LinearAlgebra", "LogDensityProblems", "LogDensityProblemsAD", "MCMCChains", "NamedArrays", "Optimization", "OptimizationOptimJL", "OrderedCollections", "Printf", "Random", "Reexport", "Requires", "SciMLBase", "SpecialFunctions", "Statistics", "StatsAPI", "StatsBase", "StatsFuns"] +git-tree-sha1 = "f69f33f7862a66674c279fe9b86b457a96767e35" +uuid = "fce5fe82-541a-59a6-adf8-730c64b5f9a0" +version = "0.34.1" + + [deps.Turing.extensions] + TuringDynamicHMCExt = "DynamicHMC" + TuringOptimExt = "Optim" + + [deps.Turing.weakdeps] + DynamicHMC = "bbc10e6e-7c05-544b-b16e-64fede858acb" + Optim = "429524aa-4258-5aef-a3af-852621145aeb" + +[[deps.URIs]] +git-tree-sha1 = "67db6cc7b3821e19ebe75791a9dd19c9b1188f2b" +uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" +version = "1.5.1" + +[[deps.UUIDs]] +deps = ["Random", "SHA"] +uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" + +[[deps.UnPack]] +git-tree-sha1 = "387c1f73762231e86e0c9c5443ce3b4a0a9a0c2b" +uuid = "3a884ed6-31ef-47d7-9d2a-63182c4928ed" +version = "1.0.2" + +[[deps.Unicode]] +uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" + +[[deps.UnicodeFun]] +deps = ["REPL"] +git-tree-sha1 = "53915e50200959667e78a92a418594b428dffddf" +uuid = "1cfade01-22cf-5700-b092-accc4b62d6e1" +version = "0.4.1" + +[[deps.Unitful]] +deps = ["Dates", "LinearAlgebra", "Random"] +git-tree-sha1 = "d95fe458f26209c66a187b1114df96fd70839efd" +uuid = "1986cc42-f94f-5a68-af5c-568840ba703d" +version = "1.21.0" +weakdeps = ["ConstructionBase", "InverseFunctions"] + + [deps.Unitful.extensions] + ConstructionBaseUnitfulExt = "ConstructionBase" + InverseFunctionsUnitfulExt = "InverseFunctions" + +[[deps.UnitfulLatexify]] +deps = ["LaTeXStrings", "Latexify", "Unitful"] +git-tree-sha1 = "975c354fcd5f7e1ddcc1f1a23e6e091d99e99bc8" +uuid = "45397f5d-5981-4c77-b2b3-fc36d6e9b728" +version = "1.6.4" + +[[deps.Unityper]] +deps = ["ConstructionBase"] +git-tree-sha1 = "25008b734a03736c41e2a7dc314ecb95bd6bbdb0" +uuid = "a7c27f48-0311-42f6-a7f8-2c11e75eb415" +version = "0.1.6" + +[[deps.UnsafeAtomics]] +git-tree-sha1 = "6331ac3440856ea1988316b46045303bef658278" +uuid = "013be700-e6cd-48c3-b4a1-df204f14c38f" +version = "0.2.1" + +[[deps.UnsafeAtomicsLLVM]] +deps = ["LLVM", "UnsafeAtomics"] +git-tree-sha1 = "2d17fabcd17e67d7625ce9c531fb9f40b7c42ce4" +uuid = "d80eeb9a-aca5-4d75-85e5-170c8b632249" +version = "0.2.1" + +[[deps.Unzip]] +git-tree-sha1 = "ca0969166a028236229f63514992fc073799bb78" +uuid = "41fe7b60-77ed-43a1-b4f0-825fd5a5650d" +version = "0.2.0" + +[[deps.Vulkan_Loader_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Wayland_jll", "Xorg_libX11_jll", "Xorg_libXrandr_jll", "xkbcommon_jll"] +git-tree-sha1 = "2f0486047a07670caad3a81a075d2e518acc5c59" +uuid = "a44049a8-05dd-5a78-86c9-5fde0876e88c" +version = "1.3.243+0" + +[[deps.Wayland_jll]] +deps = ["Artifacts", "EpollShim_jll", "Expat_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Pkg", "XML2_jll"] +git-tree-sha1 = "7558e29847e99bc3f04d6569e82d0f5c54460703" +uuid = "a2964d1f-97da-50d4-b82a-358c7fce9d89" +version = "1.21.0+1" + +[[deps.Wayland_protocols_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "93f43ab61b16ddfb2fd3bb13b3ce241cafb0e6c9" +uuid = "2381bf8a-dfd0-557d-9999-79630e7b1b91" +version = "1.31.0+0" + +[[deps.WoodburyMatrices]] +deps = ["LinearAlgebra", "SparseArrays"] +git-tree-sha1 = "c1a7aa6219628fcd757dede0ca95e245c5cd9511" +uuid = "efce3f68-66dc-5838-9240-27a6d6f5f9b6" +version = "1.0.0" + +[[deps.XML2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Zlib_jll"] +git-tree-sha1 = "1165b0443d0eca63ac1e32b8c0eb69ed2f4f8127" +uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a" +version = "2.13.3+0" + +[[deps.XSLT_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgcrypt_jll", "Libgpg_error_jll", "Libiconv_jll", "XML2_jll", "Zlib_jll"] +git-tree-sha1 = "a54ee957f4c86b526460a720dbc882fa5edcbefc" +uuid = "aed1982a-8fda-507f-9586-7b0439959a61" +version = "1.1.41+0" + +[[deps.XZ_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "ac88fb95ae6447c8dda6a5503f3bafd496ae8632" +uuid = "ffd25f8a-64ca-5728-b0f7-c24cf3aae800" +version = "5.4.6+0" + +[[deps.Xorg_libICE_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "326b4fea307b0b39892b3e85fa451692eda8d46c" +uuid = "f67eecfb-183a-506d-b269-f58e52b52d7c" +version = "1.1.1+0" + +[[deps.Xorg_libSM_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libICE_jll"] +git-tree-sha1 = "3796722887072218eabafb494a13c963209754ce" +uuid = "c834827a-8449-5923-a945-d239c165b7dd" +version = "1.2.4+0" + +[[deps.Xorg_libX11_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxcb_jll", "Xorg_xtrans_jll"] +git-tree-sha1 = "afead5aba5aa507ad5a3bf01f58f82c8d1403495" +uuid = "4f6342f7-b3d2-589e-9d20-edeb45f2b2bc" +version = "1.8.6+0" + +[[deps.Xorg_libXau_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "6035850dcc70518ca32f012e46015b9beeda49d8" +uuid = "0c0b7dd1-d40b-584c-a123-a41640f87eec" +version = "1.0.11+0" + +[[deps.Xorg_libXcursor_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXfixes_jll", "Xorg_libXrender_jll"] +git-tree-sha1 = "12e0eb3bc634fa2080c1c37fccf56f7c22989afd" +uuid = "935fb764-8cf2-53bf-bb30-45bb1f8bf724" +version = "1.2.0+4" + +[[deps.Xorg_libXdmcp_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "34d526d318358a859d7de23da945578e8e8727b7" +uuid = "a3789734-cfe1-5b06-b2d0-1dd0d9d62d05" +version = "1.1.4+0" + +[[deps.Xorg_libXext_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] +git-tree-sha1 = "d2d1a5c49fae4ba39983f63de6afcbea47194e85" +uuid = "1082639a-0dae-5f34-9b06-72781eeb8cb3" +version = "1.3.6+0" + +[[deps.Xorg_libXfixes_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll"] +git-tree-sha1 = "0e0dc7431e7a0587559f9294aeec269471c991a4" +uuid = "d091e8ba-531a-589c-9de9-94069b037ed8" +version = "5.0.3+4" + +[[deps.Xorg_libXi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXext_jll", "Xorg_libXfixes_jll"] +git-tree-sha1 = "89b52bc2160aadc84d707093930ef0bffa641246" +uuid = "a51aa0fd-4e3c-5386-b890-e753decda492" +version = "1.7.10+4" + +[[deps.Xorg_libXinerama_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXext_jll"] +git-tree-sha1 = "26be8b1c342929259317d8b9f7b53bf2bb73b123" +uuid = "d1454406-59df-5ea1-beac-c340f2130bc3" +version = "1.1.4+4" + +[[deps.Xorg_libXrandr_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXext_jll", "Xorg_libXrender_jll"] +git-tree-sha1 = "34cea83cb726fb58f325887bf0612c6b3fb17631" +uuid = "ec84b674-ba8e-5d96-8ba1-2a689ba10484" +version = "1.5.2+4" + +[[deps.Xorg_libXrender_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] +git-tree-sha1 = "47e45cd78224c53109495b3e324df0c37bb61fbe" +uuid = "ea2f1a96-1ddc-540d-b46f-429655e07cfa" +version = "0.9.11+0" + +[[deps.Xorg_libpthread_stubs_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "8fdda4c692503d44d04a0603d9ac0982054635f9" +uuid = "14d82f49-176c-5ed1-bb49-ad3f5cbd8c74" +version = "0.1.1+0" + +[[deps.Xorg_libxcb_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "XSLT_jll", "Xorg_libXau_jll", "Xorg_libXdmcp_jll", "Xorg_libpthread_stubs_jll"] +git-tree-sha1 = "bcd466676fef0878338c61e655629fa7bbc69d8e" +uuid = "c7cfdc94-dc32-55de-ac96-5a1b8d977c5b" +version = "1.17.0+0" + +[[deps.Xorg_libxkbfile_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] +git-tree-sha1 = "730eeca102434283c50ccf7d1ecdadf521a765a4" +uuid = "cc61e674-0454-545c-8b26-ed2c68acab7a" +version = "1.1.2+0" + +[[deps.Xorg_xcb_util_cursor_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_xcb_util_image_jll", "Xorg_xcb_util_jll", "Xorg_xcb_util_renderutil_jll"] +git-tree-sha1 = "04341cb870f29dcd5e39055f895c39d016e18ccd" +uuid = "e920d4aa-a673-5f3a-b3d7-f755a4d47c43" +version = "0.1.4+0" + +[[deps.Xorg_xcb_util_image_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] +git-tree-sha1 = "0fab0a40349ba1cba2c1da699243396ff8e94b97" +uuid = "12413925-8142-5f55-bb0e-6d7ca50bb09b" +version = "0.4.0+1" + +[[deps.Xorg_xcb_util_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libxcb_jll"] +git-tree-sha1 = "e7fd7b2881fa2eaa72717420894d3938177862d1" +uuid = "2def613f-5ad1-5310-b15b-b15d46f528f5" +version = "0.4.0+1" + +[[deps.Xorg_xcb_util_keysyms_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] +git-tree-sha1 = "d1151e2c45a544f32441a567d1690e701ec89b00" +uuid = "975044d2-76e6-5fbe-bf08-97ce7c6574c7" +version = "0.4.0+1" + +[[deps.Xorg_xcb_util_renderutil_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] +git-tree-sha1 = "dfd7a8f38d4613b6a575253b3174dd991ca6183e" +uuid = "0d47668e-0667-5a69-a72c-f761630bfb7e" +version = "0.3.9+1" + +[[deps.Xorg_xcb_util_wm_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] +git-tree-sha1 = "e78d10aab01a4a154142c5006ed44fd9e8e31b67" +uuid = "c22f9ab0-d5fe-5066-847c-f4bb1cd4e361" +version = "0.4.1+1" + +[[deps.Xorg_xkbcomp_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxkbfile_jll"] +git-tree-sha1 = "330f955bc41bb8f5270a369c473fc4a5a4e4d3cb" +uuid = "35661453-b289-5fab-8a00-3d9160c6a3a4" +version = "1.4.6+0" + +[[deps.Xorg_xkeyboard_config_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_xkbcomp_jll"] +git-tree-sha1 = "691634e5453ad362044e2ad653e79f3ee3bb98c3" +uuid = "33bec58e-1273-512f-9401-5d533626f822" +version = "2.39.0+0" + +[[deps.Xorg_xtrans_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "e92a1a012a10506618f10b7047e478403a046c77" +uuid = "c5fb5394-a638-5e4d-96e5-b29de1b5cf10" +version = "1.5.0+0" + +[[deps.Zlib_jll]] +deps = ["Libdl"] +uuid = "83775a58-1f1d-513f-b197-d71354ab007a" +version = "1.2.13+1" + +[[deps.Zstd_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "555d1076590a6cc2fdee2ef1469451f872d8b41b" +uuid = "3161d3a3-bdf6-5164-811a-617609db77b4" +version = "1.5.6+1" + +[[deps.ZygoteRules]] +deps = ["ChainRulesCore", "MacroTools"] +git-tree-sha1 = "27798139afc0a2afa7b1824c206d5e87ea587a00" +uuid = "700de1a5-db45-46bc-99cf-38207098b444" +version = "0.2.5" + +[[deps.eudev_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "gperf_jll"] +git-tree-sha1 = "431b678a28ebb559d224c0b6b6d01afce87c51ba" +uuid = "35ca27e7-8b34-5b7f-bca9-bdc33f59eb06" +version = "3.2.9+0" + +[[deps.fzf_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "936081b536ae4aa65415d869287d43ef3cb576b2" +uuid = "214eeab7-80f7-51ab-84ad-2988db7cef09" +version = "0.53.0+0" + +[[deps.gperf_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "3516a5630f741c9eecb3720b1ec9d8edc3ecc033" +uuid = "1a1c6b14-54f6-533d-8383-74cd7377aa70" +version = "3.1.1+0" + +[[deps.libaom_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "1827acba325fdcdf1d2647fc8d5301dd9ba43a9d" +uuid = "a4ae2306-e953-59d6-aa16-d00cac43593b" +version = "3.9.0+0" + +[[deps.libass_jll]] +deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl", "Zlib_jll"] +git-tree-sha1 = "e17c115d55c5fbb7e52ebedb427a0dca79d4484e" +uuid = "0ac62f75-1d6f-5e53-bd7c-93b484bb37c0" +version = "0.15.2+0" + +[[deps.libblastrampoline_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" +version = "5.8.0+1" + +[[deps.libdecor_jll]] +deps = ["Artifacts", "Dbus_jll", "JLLWrappers", "Libdl", "Libglvnd_jll", "Pango_jll", "Wayland_jll", "xkbcommon_jll"] +git-tree-sha1 = "9bf7903af251d2050b467f76bdbe57ce541f7f4f" +uuid = "1183f4f0-6f2a-5f1a-908b-139f9cdfea6f" +version = "0.2.2+0" + +[[deps.libevdev_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "141fe65dc3efabb0b1d5ba74e91f6ad26f84cc22" +uuid = "2db6ffa8-e38f-5e21-84af-90c45d0032cc" +version = "1.11.0+0" + +[[deps.libfdk_aac_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "8a22cf860a7d27e4f3498a0fe0811a7957badb38" +uuid = "f638f0a6-7fb0-5443-88ba-1cc74229b280" +version = "2.0.3+0" + +[[deps.libinput_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "eudev_jll", "libevdev_jll", "mtdev_jll"] +git-tree-sha1 = "ad50e5b90f222cfe78aa3d5183a20a12de1322ce" +uuid = "36db933b-70db-51c0-b978-0f229ee0e533" +version = "1.18.0+0" + +[[deps.libpng_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Zlib_jll"] +git-tree-sha1 = "b70c870239dc3d7bc094eb2d6be9b73d27bef280" +uuid = "b53b4c65-9356-5827-b1ea-8c7a1a84506f" +version = "1.6.44+0" + +[[deps.libvorbis_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Ogg_jll", "Pkg"] +git-tree-sha1 = "490376214c4721cdaca654041f635213c6165cb3" +uuid = "f27f6e37-5d2b-51aa-960f-b287f2bc3b7a" +version = "1.3.7+2" + +[[deps.mtdev_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "814e154bdb7be91d78b6802843f76b6ece642f11" +uuid = "009596ad-96f7-51b1-9f1b-5ce2d5e8a71e" +version = "1.1.6+0" + +[[deps.nghttp2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" +version = "1.52.0+1" + +[[deps.oneTBB_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "7d0ea0f4895ef2f5cb83645fa689e52cb55cf493" +uuid = "1317d2d5-d96f-522e-a858-c73665f53c3e" +version = "2021.12.0+0" + +[[deps.p7zip_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" +version = "17.4.0+2" + +[[deps.x264_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "4fea590b89e6ec504593146bf8b988b2c00922b2" +uuid = "1270edf5-f2f9-52d2-97e9-ab00b5d0237a" +version = "2021.5.5+0" + +[[deps.x265_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "ee567a171cce03570d77ad3a43e90218e38937a9" +uuid = "dfaa095f-4041-5dcd-9319-2fabd8486b76" +version = "3.5.0+0" + +[[deps.xkbcommon_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Wayland_jll", "Wayland_protocols_jll", "Xorg_libxcb_jll", "Xorg_xkeyboard_config_jll"] +git-tree-sha1 = "9c304562909ab2bab0262639bd4f444d7bc2be37" +uuid = "d8fb68d0-12a3-5cfd-a85a-d49703b185fd" +version = "1.4.1+1" +""" + +# ╔═║ Cell order: +# ╠═2c1a0946-a740-11ef-250e-f9996d64ceef +# β•Ÿβ”€0e45d65e-a24c-4907-85a2-b007137d4c8f +# ╠═1f6a1199-b68e-4306-a0b6-68eeb0ab0c35 +# ╠═f23717b9-cdd8-45da-9d40-8df16a77bbb9 +# ╠═a6d98c47-0e93-47ee-88bc-928606f22817 +# ╠═700236c1-c8d5-4b00-a14f-f87cf9b2a4f4 +# ╠═6c5542c5-c413-4383-9a76-517324b56eed +# ╠═3b4b22a1-e1dc-4049-9de5-3b3ea1838ac7 +# β•Ÿβ”€a92ed5c6-9fb3-4b83-919d-bbbe170fd2b0 +# β•Ÿβ”€41e1e987-1c8b-4f5b-aaa1-c6d9221dd718 +# β•Ÿβ”€16a240f0-f8b6-445a-b28c-e8e04682121d +# ╠═865c0b8c-8154-412f-a5ce-828767e3fe4c +# ╠═6a884693-6a8b-423e-889e-4fb72823dd52 +# β•Ÿβ”€d103555c-6f5a-4436-8e0c-56ba1a82ed8a +# β•Ÿβ”€60d39b99-826b-4d25-a589-0939218b9dda +# β•Ÿβ”€2597d512-10ce-4dfb-a21e-33ac20a59442 +# β•Ÿβ”€a3c06ab2-4107-4ecf-903b-71ad1d4e2749 +# β•Ÿβ”€1f9e8740-5f69-465c-9428-010959ad6e54 +# ╠═72f991f2-d65a-4197-bbe4-218457ca126e +# ╠═d7375d2b-5b9b-4729-bd99-24ca5e5696e5 +# ╠═a09ab912-9591-4c98-b68c-18a158cee8bb +# ╠═93c6a456-4c2a-4de8-b0d0-ba8ab5f84568 +# ╠═c97046d2-1086-4226-a805-b0daaeb69cec +# ╠═74618951-6323-4ed6-8f1c-7b67e72aca0c +# ╠═54800758-a1fc-40cc-89b6-821f7be696f8 +# ╠═41bcacee-505a-4199-b482-f70900fded60 +# ╠═a0020d1e-09c0-4b1d-a46a-68c5c59e9dc8 +# ╠═65a4a9ec-b858-4850-8c02-e3432424717d +# ╠═19780c4e-8fe4-42eb-b9bb-52483dfcb9df +# ╠═acf4f4e1-785c-4ce0-817f-0ea98e05b463 +# ╠═2b1b47d9-984e-4cd4-9b82-5476c6ff571e +# ╠═cb9551a6-6235-4be9-85f4-e2f0b8e75a27 +# ╠═bc086d8e-1df6-47f7-a337-9a4c30f81066 +# ╠═56d28d18-0111-44a5-aead-2bfbcf55cd96 +# ╠═9b588684-d5f6-495e-9830-64f478636d44 +# ╠═e199bbb9-64f9-4e7d-9561-e40eb5b5f6f4 +# ╠═f659c53f-0fbb-4329-a06c-daa81346c5a3 +# ╠═38bbea6c-b53d-4034-9b05-04791282005e +# β•Ÿβ”€00000000-0000-0000-0000-000000000001 +# β•Ÿβ”€00000000-0000-0000-0000-000000000002 diff --git a/scripts/image_complexity.jl b/scripts/image_complexity.jl new file mode 100644 index 00000000..b06d9980 --- /dev/null +++ b/scripts/image_complexity.jl @@ -0,0 +1,2018 @@ +### A Pluto.jl notebook ### +# v0.19.42 + +using Markdown +using InteractiveUtils + +# ╔═║ f913ef2c-3097-11ef-1c5c-b37475ff1d33 +using Colors, Images, Plots, PlutoUI, ColorSchemes, ImageIO + +# ╔═║ a0622b2b-b9fe-4805-90d9-d5d9b860c0c6 +dims = 266, 266 + +# ╔═║ a9845cb8-ef04-48dc-a4a4-ba8c613d8145 +figures = Dict() + +# ╔═║ aab37f4c-4c1a-4be2-ae66-c4aa67e16c3d +n, m = dims + +# ╔═║ 1267030a-70b2-41b3-9d3e-813a14a0cb8f +randc() = RGB(rand(), rand(), rand()) + +# ╔═║ 3747275a-dfed-47e3-a4f8-d0067605e816 +figures["random"] = imgrand = [randc() for i in 1:n, j in 1:m] + +# ╔═║ 322d6e4b-999a-4658-a191-6b7ac1ae403d +figures["randomrows"] = imgrows = repeat([randc() for i in 1:n], 1, m) + +# ╔═║ 7641560f-23c9-44e3-b4de-84bec08dd388 +function mandelbrot(c, maxiter=80) + z = zero(c) + for i in 1:maxiter + z = z^2 + c + abs2(z) > 5 && return i + end + return maxiter +end + +# ╔═║ 3e925c2a-9b15-45c9-9122-36f7632de56c +cs = cgrad(:gist_ncar) + +# ╔═║ c54910df-405c-4d00-8cd7-e1dc1015e30c +function compute_mandelbrot(xmin=-2.0, xmax=0.5, ymin=-1.25, ymax=1.25; + width=n, height=m, maxiter=200, colorscheme=cs) + x = range(xmin, stop=xmax, length=width) + y = range(ymin, stop=ymax, length=height) + + #img = [RGB(0, 0, mandelbrot(xi + yj*im, maxiter)/maxiter) for xi in x, yj in y] + img = [get(cs, mandelbrot(xi + yj*im, maxiter)/maxiter) for xi in x, yj in y] + return img +end + +# ╔═║ 98f8027f-b2d5-46eb-866b-ba3b1296e3a7 +get(cs, 0.7) + +# ╔═║ b3faeee5-9d51-418b-b70b-a394a76dc25e +figures["mandelbrod1"] = imgmandelbrot = compute_mandelbrot() + +# ╔═║ 4c3aa5c2-088a-492f-a612-a3ba515515bd +# ╠═║ disabled = true +#=╠═║ +imgmandelbrot_huge = compute_mandelbrot(width=5000, height=5000) + ╠═║ =# + +# ╔═║ ea874791-ea70-4bc3-8db6-a3a6aea980b9 +#=╠═║ +save("mandlebrot_huge.png", imgmandelbrot_huge) + ╠═║ =# + +# ╔═║ 009bbf67-ed83-4be9-9e86-c989ca804a3a +imgmandelbrot2 = compute_mandelbrot(-0.75-0.01, -0.75+0.01, + 0.11 - 0.01, 0.11+0.01) + +# ╔═║ ca0146f6-8ac8-4167-b9ba-135c08bedd14 +imgmandelbrot3 = compute_mandelbrot(-0.09-0.01, -0.09+0.01, + 0.651 - 0.01, 0.651+0.01) + +# ╔═║ 48f19828-8ba4-4e5f-a676-37e65b2bbb58 +figures["mandlebrot2"] = imgmandelbrot4 = compute_mandelbrot(-0.088-0.01, -0.088+0.01, + 0.654 - 0.01, 0.654+0.01) + +# ╔═║ eb8e90a4-29e8-4c9a-b9c9-32d9eb694e37 +getbinarydigit(rule, i) = isodd(rule >> i) + +# ╔═║ 4221299c-ad68-4aeb-8aa8-34ab8c8b47be +begin + +nextstate(l::Bool, s::Bool, r::Bool, rule::Int) = nextstate(l, s, r, UInt8(rule)) + +function nextstate(l::Bool, s::Bool, r::Bool, rule::UInt8) + return getbinarydigit(rule, 4l+2s+1r) +end +end + +# ╔═║ 1180704b-b144-496e-8b2d-eb78facb2c2e +function update1dca!(xnew, x, rule::Integer) + n = length(x) + xnew[1] = nextstate(x[end], x[1], x[2], rule) + xnew[end] = nextstate(x[end-1], x[end], x[1], rule) + for i in 2:n-1 + xnew[i] = nextstate(x[i-1], x[i], x[i+1], rule) + end + return xnew +end + +# ╔═║ 40e75117-6d94-487f-9096-051ef9627cdc +update1dca(x, rule::Integer) = update1dca!(similar(x), x, rule) + +# ╔═║ a277a2c1-2f54-4dd3-9b3a-f14ef682164a +function simulate(x0, rule::UInt8; nsteps=100) + n = length(x0) + X = zeros(Bool, nsteps+1, n) + X[1,:] = x0 + for t in 1:nsteps-1 + x = @view X[t,:] + xnew = @view X[t+1,:] + update1dca!(xnew, x, rule) + end + return X +end + +# ╔═║ 17400d22-22fc-43fc-894b-029252b2eb4a +#x0 = [i==mΓ·2 for i in 1:m] +x0 = rand(Bool, m) + +# ╔═║ e602efbf-0370-4edf-8e2b-25312d250800 +rule=UInt8(89) + +# ╔═║ 31c4d521-76c7-4e4f-bfbb-726da1fa0d5a +CA = simulate(x0, rule; nsteps=n) + +# ╔═║ c9e944c1-4bca-4938-8276-ddc36c6ec505 +heatmap(CA) + +# ╔═║ 36ffa0e5-48b2-4ef2-ab25-3460039a1aae +c1 = colorant"#1e66f5" + +# ╔═║ 92a3caec-16b9-45b8-851b-bff90ada9e6b +c2 = colorant"#df8e1d" + +# ╔═║ 084bf722-c287-4821-a402-dbe2969daa04 +figures["CA"] = imca = ifelse.(CA, Ref(c1), Ref(c2)) + +# ╔═║ 433d0b84-0570-47c1-921f-384b2ded3c95 +for (n, img) in figures + save("../" * n *".png", img) +end + +# ╔═║ 0726e0df-96c7-47b9-ad4a-50cf28c6d31e + + +# ╔═║ 00000000-0000-0000-0000-000000000001 +PLUTO_PROJECT_TOML_CONTENTS = """ +[deps] +ColorSchemes = "35d6a980-a343-548e-a6ea-1d62b119f2f4" +Colors = "5ae59095-9a9b-59fe-a467-6f913c188581" +ImageIO = "82e4d734-157c-48bb-816b-45c225c6df19" +Images = "916415d5-f1e6-5110-898d-aaa5f9f070e0" +Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" +PlutoUI = "7f904dfe-b85e-4ff6-b463-dae2292396a8" + +[compat] +ColorSchemes = "~3.25.0" +Colors = "~0.12.11" +ImageIO = "~0.6.8" +Images = "~0.26.1" +Plots = "~1.40.4" +PlutoUI = "~0.7.59" +""" + +# ╔═║ 00000000-0000-0000-0000-000000000002 +PLUTO_MANIFEST_TOML_CONTENTS = """ +# This file is machine-generated - editing it directly is not advised + +julia_version = "1.10.3" +manifest_format = "2.0" +project_hash = "a7455687e7c75885e4eebf544c917582edbf6d19" + +[[deps.AbstractFFTs]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "d92ad398961a3ed262d8bf04a1a2b8340f915fef" +uuid = "621f4979-c628-5d54-868e-fcf4e3e8185c" +version = "1.5.0" +weakdeps = ["ChainRulesCore", "Test"] + + [deps.AbstractFFTs.extensions] + AbstractFFTsChainRulesCoreExt = "ChainRulesCore" + AbstractFFTsTestExt = "Test" + +[[deps.AbstractPlutoDingetjes]] +deps = ["Pkg"] +git-tree-sha1 = "6e1d2a35f2f90a4bc7c2ed98079b2ba09c35b83a" +uuid = "6e696c72-6542-2067-7265-42206c756150" +version = "1.3.2" + +[[deps.Adapt]] +deps = ["LinearAlgebra", "Requires"] +git-tree-sha1 = "6a55b747d1812e699320963ffde36f1ebdda4099" +uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" +version = "4.0.4" +weakdeps = ["StaticArrays"] + + [deps.Adapt.extensions] + AdaptStaticArraysExt = "StaticArrays" + +[[deps.ArgTools]] +uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" +version = "1.1.1" + +[[deps.ArnoldiMethod]] +deps = ["LinearAlgebra", "Random", "StaticArrays"] +git-tree-sha1 = "d57bd3762d308bded22c3b82d033bff85f6195c6" +uuid = "ec485272-7323-5ecc-a04f-4719b315124d" +version = "0.4.0" + +[[deps.ArrayInterface]] +deps = ["Adapt", "LinearAlgebra", "SparseArrays", "SuiteSparse"] +git-tree-sha1 = "ed2ec3c9b483842ae59cd273834e5b46206d6dda" +uuid = "4fba245c-0d91-5ea0-9b3e-6abc04ee57a9" +version = "7.11.0" + + [deps.ArrayInterface.extensions] + ArrayInterfaceBandedMatricesExt = "BandedMatrices" + ArrayInterfaceBlockBandedMatricesExt = "BlockBandedMatrices" + ArrayInterfaceCUDAExt = "CUDA" + ArrayInterfaceCUDSSExt = "CUDSS" + ArrayInterfaceChainRulesExt = "ChainRules" + ArrayInterfaceGPUArraysCoreExt = "GPUArraysCore" + ArrayInterfaceReverseDiffExt = "ReverseDiff" + ArrayInterfaceStaticArraysCoreExt = "StaticArraysCore" + ArrayInterfaceTrackerExt = "Tracker" + + [deps.ArrayInterface.weakdeps] + BandedMatrices = "aae01518-5342-5314-be14-df237901396f" + BlockBandedMatrices = "ffab5731-97b5-5995-9138-79e8c1846df0" + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + CUDSS = "45b445bb-4962-46a0-9369-b4df9d0f772e" + ChainRules = "082447d4-558c-5d27-93f4-14fc19e9eca2" + GPUArraysCore = "46192b85-c4d5-4398-a991-12ede77f4527" + ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + StaticArraysCore = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" + Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" + +[[deps.Artifacts]] +uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" + +[[deps.AxisAlgorithms]] +deps = ["LinearAlgebra", "Random", "SparseArrays", "WoodburyMatrices"] +git-tree-sha1 = "01b8ccb13d68535d73d2b0c23e39bd23155fb712" +uuid = "13072b0f-2c55-5437-9ae7-d433b7a33950" +version = "1.1.0" + +[[deps.AxisArrays]] +deps = ["Dates", "IntervalSets", "IterTools", "RangeArrays"] +git-tree-sha1 = "16351be62963a67ac4083f748fdb3cca58bfd52f" +uuid = "39de3d68-74b9-583c-8d2d-e117c070f3a9" +version = "0.4.7" + +[[deps.Base64]] +uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" + +[[deps.BitFlags]] +git-tree-sha1 = "2dc09997850d68179b69dafb58ae806167a32b1b" +uuid = "d1d4a3ce-64b1-5f1a-9ba4-7e7e69966f35" +version = "0.1.8" + +[[deps.BitTwiddlingConvenienceFunctions]] +deps = ["Static"] +git-tree-sha1 = "0c5f81f47bbbcf4aea7b2959135713459170798b" +uuid = "62783981-4cbd-42fc-bca8-16325de8dc4b" +version = "0.1.5" + +[[deps.Bzip2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "9e2a6b69137e6969bab0152632dcb3bc108c8bdd" +uuid = "6e34b625-4abd-537c-b88f-471c36dfa7a0" +version = "1.0.8+1" + +[[deps.CEnum]] +git-tree-sha1 = "389ad5c84de1ae7cf0e28e381131c98ea87d54fc" +uuid = "fa961155-64e5-5f13-b03f-caf6b980ea82" +version = "0.5.0" + +[[deps.CPUSummary]] +deps = ["CpuId", "IfElse", "PrecompileTools", "Static"] +git-tree-sha1 = "585a387a490f1c4bd88be67eea15b93da5e85db7" +uuid = "2a0fbf3d-bb9c-48f3-b0a9-814d99fd7ab9" +version = "0.2.5" + +[[deps.Cairo_jll]] +deps = ["Artifacts", "Bzip2_jll", "CompilerSupportLibraries_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "JLLWrappers", "LZO_jll", "Libdl", "Pixman_jll", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Zlib_jll", "libpng_jll"] +git-tree-sha1 = "a2f1c8c668c8e3cb4cca4e57a8efdb09067bb3fd" +uuid = "83423d85-b0ee-5818-9007-b63ccbeb887a" +version = "1.18.0+2" + +[[deps.CatIndices]] +deps = ["CustomUnitRanges", "OffsetArrays"] +git-tree-sha1 = "a0f80a09780eed9b1d106a1bf62041c2efc995bc" +uuid = "aafaddc9-749c-510e-ac4f-586e18779b91" +version = "0.2.2" + +[[deps.ChainRulesCore]] +deps = ["Compat", "LinearAlgebra"] +git-tree-sha1 = "71acdbf594aab5bbb2cec89b208c41b4c411e49f" +uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" +version = "1.24.0" +weakdeps = ["SparseArrays"] + + [deps.ChainRulesCore.extensions] + ChainRulesCoreSparseArraysExt = "SparseArrays" + +[[deps.CloseOpenIntervals]] +deps = ["Static", "StaticArrayInterface"] +git-tree-sha1 = "70232f82ffaab9dc52585e0dd043b5e0c6b714f1" +uuid = "fb6a15b2-703c-40df-9091-08a04967cfa9" +version = "0.1.12" + +[[deps.Clustering]] +deps = ["Distances", "LinearAlgebra", "NearestNeighbors", "Printf", "Random", "SparseArrays", "Statistics", "StatsBase"] +git-tree-sha1 = "9ebb045901e9bbf58767a9f34ff89831ed711aae" +uuid = "aaaa29a8-35af-508c-8bc3-b662a17a0fe5" +version = "0.15.7" + +[[deps.CodecZlib]] +deps = ["TranscodingStreams", "Zlib_jll"] +git-tree-sha1 = "59939d8a997469ee05c4b4944560a820f9ba0d73" +uuid = "944b1d66-785c-5afd-91f1-9de20f533193" +version = "0.7.4" + +[[deps.ColorSchemes]] +deps = ["ColorTypes", "ColorVectorSpace", "Colors", "FixedPointNumbers", "PrecompileTools", "Random"] +git-tree-sha1 = "4b270d6465eb21ae89b732182c20dc165f8bf9f2" +uuid = "35d6a980-a343-548e-a6ea-1d62b119f2f4" +version = "3.25.0" + +[[deps.ColorTypes]] +deps = ["FixedPointNumbers", "Random"] +git-tree-sha1 = "b10d0b65641d57b8b4d5e234446582de5047050d" +uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f" +version = "0.11.5" + +[[deps.ColorVectorSpace]] +deps = ["ColorTypes", "FixedPointNumbers", "LinearAlgebra", "SpecialFunctions", "Statistics", "TensorCore"] +git-tree-sha1 = "600cc5508d66b78aae350f7accdb58763ac18589" +uuid = "c3611d14-8923-5661-9e6a-0046d554d3a4" +version = "0.9.10" + +[[deps.Colors]] +deps = ["ColorTypes", "FixedPointNumbers", "Reexport"] +git-tree-sha1 = "362a287c3aa50601b0bc359053d5c2468f0e7ce0" +uuid = "5ae59095-9a9b-59fe-a467-6f913c188581" +version = "0.12.11" + +[[deps.Compat]] +deps = ["TOML", "UUIDs"] +git-tree-sha1 = "b1c55339b7c6c350ee89f2c1604299660525b248" +uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" +version = "4.15.0" +weakdeps = ["Dates", "LinearAlgebra"] + + [deps.Compat.extensions] + CompatLinearAlgebraExt = "LinearAlgebra" + +[[deps.CompilerSupportLibraries_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" +version = "1.1.1+0" + +[[deps.ComputationalResources]] +git-tree-sha1 = "52cb3ec90e8a8bea0e62e275ba577ad0f74821f7" +uuid = "ed09eef8-17a6-5b46-8889-db040fac31e3" +version = "0.3.2" + +[[deps.ConcurrentUtilities]] +deps = ["Serialization", "Sockets"] +git-tree-sha1 = "6cbbd4d241d7e6579ab354737f4dd95ca43946e1" +uuid = "f0e56b4a-5159-44fe-b623-3e5288b988bb" +version = "2.4.1" + +[[deps.Contour]] +git-tree-sha1 = "439e35b0b36e2e5881738abc8857bd92ad6ff9a8" +uuid = "d38c429a-6771-53c6-b99e-75d170b6e991" +version = "0.6.3" + +[[deps.CoordinateTransformations]] +deps = ["LinearAlgebra", "StaticArrays"] +git-tree-sha1 = "f9d7112bfff8a19a3a4ea4e03a8e6a91fe8456bf" +uuid = "150eb455-5306-5404-9cee-2592286d6298" +version = "0.6.3" + +[[deps.CpuId]] +deps = ["Markdown"] +git-tree-sha1 = "fcbb72b032692610bfbdb15018ac16a36cf2e406" +uuid = "adafc99b-e345-5852-983c-f28acb93d879" +version = "0.3.1" + +[[deps.CustomUnitRanges]] +git-tree-sha1 = "1a3f97f907e6dd8983b744d2642651bb162a3f7a" +uuid = "dc8bdbbb-1ca9-579f-8c36-e416f6a65cce" +version = "1.0.2" + +[[deps.DataAPI]] +git-tree-sha1 = "abe83f3a2f1b857aac70ef8b269080af17764bbe" +uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a" +version = "1.16.0" + +[[deps.DataStructures]] +deps = ["Compat", "InteractiveUtils", "OrderedCollections"] +git-tree-sha1 = "1d0a14036acb104d9e89698bd408f63ab58cdc82" +uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" +version = "0.18.20" + +[[deps.Dates]] +deps = ["Printf"] +uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" + +[[deps.DelimitedFiles]] +deps = ["Mmap"] +git-tree-sha1 = "9e2f36d3c96a820c678f2f1f1782582fcf685bae" +uuid = "8bb1440f-4735-579b-a4ab-409b98df4dab" +version = "1.9.1" + +[[deps.Distances]] +deps = ["LinearAlgebra", "Statistics", "StatsAPI"] +git-tree-sha1 = "66c4c81f259586e8f002eacebc177e1fb06363b0" +uuid = "b4f34e82-e78d-54a5-968a-f98e89d6e8f7" +version = "0.10.11" +weakdeps = ["ChainRulesCore", "SparseArrays"] + + [deps.Distances.extensions] + DistancesChainRulesCoreExt = "ChainRulesCore" + DistancesSparseArraysExt = "SparseArrays" + +[[deps.Distributed]] +deps = ["Random", "Serialization", "Sockets"] +uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" + +[[deps.DocStringExtensions]] +deps = ["LibGit2"] +git-tree-sha1 = "2fb1e02f2b635d0845df5d7c167fec4dd739b00d" +uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" +version = "0.9.3" + +[[deps.Downloads]] +deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] +uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" +version = "1.6.0" + +[[deps.EpollShim_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "8e9441ee83492030ace98f9789a654a6d0b1f643" +uuid = "2702e6a9-849d-5ed8-8c21-79e8b8f9ee43" +version = "0.0.20230411+0" + +[[deps.ExceptionUnwrapping]] +deps = ["Test"] +git-tree-sha1 = "dcb08a0d93ec0b1cdc4af184b26b591e9695423a" +uuid = "460bff9d-24e4-43bc-9d9f-a8973cb893f4" +version = "0.1.10" + +[[deps.Expat_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "1c6317308b9dc757616f0b5cb379db10494443a7" +uuid = "2e619515-83b5-522b-bb60-26c02a35a201" +version = "2.6.2+0" + +[[deps.FFMPEG]] +deps = ["FFMPEG_jll"] +git-tree-sha1 = "b57e3acbe22f8484b4b5ff66a7499717fe1a9cc8" +uuid = "c87230d0-a227-11e9-1b43-d7ebe4e7570a" +version = "0.4.1" + +[[deps.FFMPEG_jll]] +deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "JLLWrappers", "LAME_jll", "Libdl", "Ogg_jll", "OpenSSL_jll", "Opus_jll", "PCRE2_jll", "Zlib_jll", "libaom_jll", "libass_jll", "libfdk_aac_jll", "libvorbis_jll", "x264_jll", "x265_jll"] +git-tree-sha1 = "466d45dc38e15794ec7d5d63ec03d776a9aff36e" +uuid = "b22a6f82-2f65-5046-a5b2-351ab43fb4e5" +version = "4.4.4+1" + +[[deps.FFTViews]] +deps = ["CustomUnitRanges", "FFTW"] +git-tree-sha1 = "cbdf14d1e8c7c8aacbe8b19862e0179fd08321c2" +uuid = "4f61f5a4-77b1-5117-aa51-3ab5ef4ef0cd" +version = "0.3.2" + +[[deps.FFTW]] +deps = ["AbstractFFTs", "FFTW_jll", "LinearAlgebra", "MKL_jll", "Preferences", "Reexport"] +git-tree-sha1 = "4820348781ae578893311153d69049a93d05f39d" +uuid = "7a1cc6ca-52ef-59f5-83cd-3a7055c09341" +version = "1.8.0" + +[[deps.FFTW_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "c6033cc3892d0ef5bb9cd29b7f2f0331ea5184ea" +uuid = "f5851436-0d7a-5f13-b9de-f02708fd171a" +version = "3.3.10+0" + +[[deps.FileIO]] +deps = ["Pkg", "Requires", "UUIDs"] +git-tree-sha1 = "82d8afa92ecf4b52d78d869f038ebfb881267322" +uuid = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" +version = "1.16.3" + +[[deps.FileWatching]] +uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" + +[[deps.FixedPointNumbers]] +deps = ["Statistics"] +git-tree-sha1 = "05882d6995ae5c12bb5f36dd2ed3f61c98cbb172" +uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" +version = "0.8.5" + +[[deps.Fontconfig_jll]] +deps = ["Artifacts", "Bzip2_jll", "Expat_jll", "FreeType2_jll", "JLLWrappers", "Libdl", "Libuuid_jll", "Zlib_jll"] +git-tree-sha1 = "db16beca600632c95fc8aca29890d83788dd8b23" +uuid = "a3f928ae-7b40-5064-980b-68af3947d34b" +version = "2.13.96+0" + +[[deps.Format]] +git-tree-sha1 = "9c68794ef81b08086aeb32eeaf33531668d5f5fc" +uuid = "1fa38f19-a742-5d3f-a2b9-30dd87b9d5f8" +version = "1.3.7" + +[[deps.FreeType2_jll]] +deps = ["Artifacts", "Bzip2_jll", "JLLWrappers", "Libdl", "Zlib_jll"] +git-tree-sha1 = "5c1d8ae0efc6c2e7b1fc502cbe25def8f661b7bc" +uuid = "d7e528f0-a631-5988-bf34-fe36492bcfd7" +version = "2.13.2+0" + +[[deps.FriBidi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "1ed150b39aebcc805c26b93a8d0122c940f64ce2" +uuid = "559328eb-81f9-559d-9380-de523a88c83c" +version = "1.0.14+0" + +[[deps.GLFW_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libglvnd_jll", "Xorg_libXcursor_jll", "Xorg_libXi_jll", "Xorg_libXinerama_jll", "Xorg_libXrandr_jll"] +git-tree-sha1 = "ff38ba61beff76b8f4acad8ab0c97ef73bb670cb" +uuid = "0656b61e-2033-5cc2-a64a-77c0f6c09b89" +version = "3.3.9+0" + +[[deps.GR]] +deps = ["Artifacts", "Base64", "DelimitedFiles", "Downloads", "GR_jll", "HTTP", "JSON", "Libdl", "LinearAlgebra", "Preferences", "Printf", "Random", "Serialization", "Sockets", "TOML", "Tar", "Test", "p7zip_jll"] +git-tree-sha1 = "ddda044ca260ee324c5fc07edb6d7cf3f0b9c350" +uuid = "28b8d3ca-fb5f-59d9-8090-bfdbd6d07a71" +version = "0.73.5" + +[[deps.GR_jll]] +deps = ["Artifacts", "Bzip2_jll", "Cairo_jll", "FFMPEG_jll", "Fontconfig_jll", "FreeType2_jll", "GLFW_jll", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Libtiff_jll", "Pixman_jll", "Qt6Base_jll", "Zlib_jll", "libpng_jll"] +git-tree-sha1 = "278e5e0f820178e8a26df3184fcb2280717c79b1" +uuid = "d2c73de3-f751-5644-a686-071e5b155ba9" +version = "0.73.5+0" + +[[deps.Gettext_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Libiconv_jll", "Pkg", "XML2_jll"] +git-tree-sha1 = "9b02998aba7bf074d14de89f9d37ca24a1a0b046" +uuid = "78b55507-aeef-58d4-861c-77aaff3498b1" +version = "0.21.0+0" + +[[deps.Ghostscript_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "43ba3d3c82c18d88471cfd2924931658838c9d8f" +uuid = "61579ee1-b43e-5ca0-a5da-69d92c66a64b" +version = "9.55.0+4" + +[[deps.Glib_jll]] +deps = ["Artifacts", "Gettext_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Libiconv_jll", "Libmount_jll", "PCRE2_jll", "Zlib_jll"] +git-tree-sha1 = "7c82e6a6cd34e9d935e9aa4051b66c6ff3af59ba" +uuid = "7746bdde-850d-59dc-9ae8-88ece973131d" +version = "2.80.2+0" + +[[deps.Graphics]] +deps = ["Colors", "LinearAlgebra", "NaNMath"] +git-tree-sha1 = "d61890399bc535850c4bf08e4e0d3a7ad0f21cbd" +uuid = "a2bd30eb-e257-5431-a919-1863eab51364" +version = "1.1.2" + +[[deps.Graphite2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "344bf40dcab1073aca04aa0df4fb092f920e4011" +uuid = "3b182d85-2403-5c21-9c21-1e1f0cc25472" +version = "1.3.14+0" + +[[deps.Graphs]] +deps = ["ArnoldiMethod", "Compat", "DataStructures", "Distributed", "Inflate", "LinearAlgebra", "Random", "SharedArrays", "SimpleTraits", "SparseArrays", "Statistics"] +git-tree-sha1 = "334d300809ae0a68ceee3444c6e99ded412bf0b3" +uuid = "86223c79-3864-5bf0-83f7-82e725a168b6" +version = "1.11.1" + +[[deps.Grisu]] +git-tree-sha1 = "53bb909d1151e57e2484c3d1b53e19552b887fb2" +uuid = "42e2da0e-8278-4e71-bc24-59509adca0fe" +version = "1.0.2" + +[[deps.HTTP]] +deps = ["Base64", "CodecZlib", "ConcurrentUtilities", "Dates", "ExceptionUnwrapping", "Logging", "LoggingExtras", "MbedTLS", "NetworkOptions", "OpenSSL", "Random", "SimpleBufferStream", "Sockets", "URIs", "UUIDs"] +git-tree-sha1 = "d1d712be3164d61d1fb98e7ce9bcbc6cc06b45ed" +uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3" +version = "1.10.8" + +[[deps.HarfBuzz_jll]] +deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "Graphite2_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Pkg"] +git-tree-sha1 = "129acf094d168394e80ee1dc4bc06ec835e510a3" +uuid = "2e76f6c2-a576-52d4-95c1-20adfe4de566" +version = "2.8.1+1" + +[[deps.HistogramThresholding]] +deps = ["ImageBase", "LinearAlgebra", "MappedArrays"] +git-tree-sha1 = "7194dfbb2f8d945abdaf68fa9480a965d6661e69" +uuid = "2c695a8d-9458-5d45-9878-1b8a99cf7853" +version = "0.3.1" + +[[deps.HostCPUFeatures]] +deps = ["BitTwiddlingConvenienceFunctions", "IfElse", "Libdl", "Static"] +git-tree-sha1 = "eb8fed28f4994600e29beef49744639d985a04b2" +uuid = "3e5b6fbb-0976-4d2c-9146-d79de83f2fb0" +version = "0.1.16" + +[[deps.Hyperscript]] +deps = ["Test"] +git-tree-sha1 = "179267cfa5e712760cd43dcae385d7ea90cc25a4" +uuid = "47d2ed2b-36de-50cf-bf87-49c2cf4b8b91" +version = "0.0.5" + +[[deps.HypertextLiteral]] +deps = ["Tricks"] +git-tree-sha1 = "7134810b1afce04bbc1045ca1985fbe81ce17653" +uuid = "ac1192a8-f4b3-4bfe-ba22-af5b92cd3ab2" +version = "0.9.5" + +[[deps.IOCapture]] +deps = ["Logging", "Random"] +git-tree-sha1 = "b6d6bfdd7ce25b0f9b2f6b3dd56b2673a66c8770" +uuid = "b5f81e59-6552-4d32-b1f0-c071b021bf89" +version = "0.2.5" + +[[deps.IfElse]] +git-tree-sha1 = "debdd00ffef04665ccbb3e150747a77560e8fad1" +uuid = "615f187c-cbe4-4ef1-ba3b-2fcf58d6d173" +version = "0.1.1" + +[[deps.ImageAxes]] +deps = ["AxisArrays", "ImageBase", "ImageCore", "Reexport", "SimpleTraits"] +git-tree-sha1 = "2e4520d67b0cef90865b3ef727594d2a58e0e1f8" +uuid = "2803e5a7-5153-5ecf-9a86-9b4c37f5f5ac" +version = "0.6.11" + +[[deps.ImageBase]] +deps = ["ImageCore", "Reexport"] +git-tree-sha1 = "b51bb8cae22c66d0f6357e3bcb6363145ef20835" +uuid = "c817782e-172a-44cc-b673-b171935fbb9e" +version = "0.1.5" + +[[deps.ImageBinarization]] +deps = ["HistogramThresholding", "ImageCore", "LinearAlgebra", "Polynomials", "Reexport", "Statistics"] +git-tree-sha1 = "f5356e7203c4a9954962e3757c08033f2efe578a" +uuid = "cbc4b850-ae4b-5111-9e64-df94c024a13d" +version = "0.3.0" + +[[deps.ImageContrastAdjustment]] +deps = ["ImageBase", "ImageCore", "ImageTransformations", "Parameters"] +git-tree-sha1 = "eb3d4365a10e3f3ecb3b115e9d12db131d28a386" +uuid = "f332f351-ec65-5f6a-b3d1-319c6670881a" +version = "0.3.12" + +[[deps.ImageCore]] +deps = ["AbstractFFTs", "ColorVectorSpace", "Colors", "FixedPointNumbers", "Graphics", "MappedArrays", "MosaicViews", "OffsetArrays", "PaddedViews", "Reexport"] +git-tree-sha1 = "acf614720ef026d38400b3817614c45882d75500" +uuid = "a09fc81d-aa75-5fe9-8630-4744c3626534" +version = "0.9.4" + +[[deps.ImageCorners]] +deps = ["ImageCore", "ImageFiltering", "PrecompileTools", "StaticArrays", "StatsBase"] +git-tree-sha1 = "24c52de051293745a9bad7d73497708954562b79" +uuid = "89d5987c-236e-4e32-acd0-25bd6bd87b70" +version = "0.1.3" + +[[deps.ImageDistances]] +deps = ["Distances", "ImageCore", "ImageMorphology", "LinearAlgebra", "Statistics"] +git-tree-sha1 = "08b0e6354b21ef5dd5e49026028e41831401aca8" +uuid = "51556ac3-7006-55f5-8cb3-34580c88182d" +version = "0.2.17" + +[[deps.ImageFiltering]] +deps = ["CatIndices", "ComputationalResources", "DataStructures", "FFTViews", "FFTW", "ImageBase", "ImageCore", "LinearAlgebra", "OffsetArrays", "PrecompileTools", "Reexport", "SparseArrays", "StaticArrays", "Statistics", "TiledIteration"] +git-tree-sha1 = "3447781d4c80dbe6d71d239f7cfb1f8049d4c84f" +uuid = "6a3955dd-da59-5b1f-98d4-e7296123deb5" +version = "0.7.6" + +[[deps.ImageIO]] +deps = ["FileIO", "IndirectArrays", "JpegTurbo", "LazyModules", "Netpbm", "OpenEXR", "PNGFiles", "QOI", "Sixel", "TiffImages", "UUIDs"] +git-tree-sha1 = "437abb322a41d527c197fa800455f79d414f0a3c" +uuid = "82e4d734-157c-48bb-816b-45c225c6df19" +version = "0.6.8" + +[[deps.ImageMagick]] +deps = ["FileIO", "ImageCore", "ImageMagick_jll", "InteractiveUtils", "Libdl", "Pkg", "Random"] +git-tree-sha1 = "5bc1cb62e0c5f1005868358db0692c994c3a13c6" +uuid = "6218d12a-5da1-5696-b52f-db25d2ecc6d1" +version = "1.2.1" + +[[deps.ImageMagick_jll]] +deps = ["Artifacts", "Ghostscript_jll", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Libtiff_jll", "OpenJpeg_jll", "Zlib_jll", "libpng_jll"] +git-tree-sha1 = "d65554bad8b16d9562050c67e7223abf91eaba2f" +uuid = "c73af94c-d91f-53ed-93a7-00f77d67a9d7" +version = "6.9.13+0" + +[[deps.ImageMetadata]] +deps = ["AxisArrays", "ImageAxes", "ImageBase", "ImageCore"] +git-tree-sha1 = "355e2b974f2e3212a75dfb60519de21361ad3cb7" +uuid = "bc367c6b-8a6b-528e-b4bd-a4b897500b49" +version = "0.9.9" + +[[deps.ImageMorphology]] +deps = ["DataStructures", "ImageCore", "LinearAlgebra", "LoopVectorization", "OffsetArrays", "Requires", "TiledIteration"] +git-tree-sha1 = "6f0a801136cb9c229aebea0df296cdcd471dbcd1" +uuid = "787d08f9-d448-5407-9aad-5290dd7ab264" +version = "0.4.5" + +[[deps.ImageQualityIndexes]] +deps = ["ImageContrastAdjustment", "ImageCore", "ImageDistances", "ImageFiltering", "LazyModules", "OffsetArrays", "PrecompileTools", "Statistics"] +git-tree-sha1 = "783b70725ed326340adf225be4889906c96b8fd1" +uuid = "2996bd0c-7a13-11e9-2da2-2f5ce47296a9" +version = "0.3.7" + +[[deps.ImageSegmentation]] +deps = ["Clustering", "DataStructures", "Distances", "Graphs", "ImageCore", "ImageFiltering", "ImageMorphology", "LinearAlgebra", "MetaGraphs", "RegionTrees", "SimpleWeightedGraphs", "StaticArrays", "Statistics"] +git-tree-sha1 = "44664eea5408828c03e5addb84fa4f916132fc26" +uuid = "80713f31-8817-5129-9cf8-209ff8fb23e1" +version = "1.8.1" + +[[deps.ImageShow]] +deps = ["Base64", "ColorSchemes", "FileIO", "ImageBase", "ImageCore", "OffsetArrays", "StackViews"] +git-tree-sha1 = "3b5344bcdbdc11ad58f3b1956709b5b9345355de" +uuid = "4e3cecfd-b093-5904-9786-8bbb286a6a31" +version = "0.3.8" + +[[deps.ImageTransformations]] +deps = ["AxisAlgorithms", "CoordinateTransformations", "ImageBase", "ImageCore", "Interpolations", "OffsetArrays", "Rotations", "StaticArrays"] +git-tree-sha1 = "e0884bdf01bbbb111aea77c348368a86fb4b5ab6" +uuid = "02fcd773-0e25-5acc-982a-7f6622650795" +version = "0.10.1" + +[[deps.Images]] +deps = ["Base64", "FileIO", "Graphics", "ImageAxes", "ImageBase", "ImageBinarization", "ImageContrastAdjustment", "ImageCore", "ImageCorners", "ImageDistances", "ImageFiltering", "ImageIO", "ImageMagick", "ImageMetadata", "ImageMorphology", "ImageQualityIndexes", "ImageSegmentation", "ImageShow", "ImageTransformations", "IndirectArrays", "IntegralArrays", "Random", "Reexport", "SparseArrays", "StaticArrays", "Statistics", "StatsBase", "TiledIteration"] +git-tree-sha1 = "12fdd617c7fe25dc4a6cc804d657cc4b2230302b" +uuid = "916415d5-f1e6-5110-898d-aaa5f9f070e0" +version = "0.26.1" + +[[deps.Imath_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "0936ba688c6d201805a83da835b55c61a180db52" +uuid = "905a6f67-0a94-5f89-b386-d35d92009cd1" +version = "3.1.11+0" + +[[deps.IndirectArrays]] +git-tree-sha1 = "012e604e1c7458645cb8b436f8fba789a51b257f" +uuid = "9b13fd28-a010-5f03-acff-a1bbcff69959" +version = "1.0.0" + +[[deps.Inflate]] +git-tree-sha1 = "d1b1b796e47d94588b3757fe84fbf65a5ec4a80d" +uuid = "d25df0c9-e2be-5dd7-82c8-3ad0b3e990b9" +version = "0.1.5" + +[[deps.IntegralArrays]] +deps = ["ColorTypes", "FixedPointNumbers", "IntervalSets"] +git-tree-sha1 = "be8e690c3973443bec584db3346ddc904d4884eb" +uuid = "1d092043-8f09-5a30-832f-7509e371ab51" +version = "0.1.5" + +[[deps.IntelOpenMP_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "be50fe8df3acbffa0274a744f1a99d29c45a57f4" +uuid = "1d5cc7b8-4909-519e-a0f8-d0f5ad9712d0" +version = "2024.1.0+0" + +[[deps.InteractiveUtils]] +deps = ["Markdown"] +uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" + +[[deps.Interpolations]] +deps = ["Adapt", "AxisAlgorithms", "ChainRulesCore", "LinearAlgebra", "OffsetArrays", "Random", "Ratios", "Requires", "SharedArrays", "SparseArrays", "StaticArrays", "WoodburyMatrices"] +git-tree-sha1 = "88a101217d7cb38a7b481ccd50d21876e1d1b0e0" +uuid = "a98d9a8b-a2ab-59e6-89dd-64a1c18fca59" +version = "0.15.1" +weakdeps = ["Unitful"] + + [deps.Interpolations.extensions] + InterpolationsUnitfulExt = "Unitful" + +[[deps.IntervalSets]] +git-tree-sha1 = "dba9ddf07f77f60450fe5d2e2beb9854d9a49bd0" +uuid = "8197267c-284f-5f27-9208-e0e47529a953" +version = "0.7.10" +weakdeps = ["Random", "RecipesBase", "Statistics"] + + [deps.IntervalSets.extensions] + IntervalSetsRandomExt = "Random" + IntervalSetsRecipesBaseExt = "RecipesBase" + IntervalSetsStatisticsExt = "Statistics" + +[[deps.IrrationalConstants]] +git-tree-sha1 = "630b497eafcc20001bba38a4651b327dcfc491d2" +uuid = "92d709cd-6900-40b7-9082-c6be49f344b6" +version = "0.2.2" + +[[deps.IterTools]] +git-tree-sha1 = "42d5f897009e7ff2cf88db414a389e5ed1bdd023" +uuid = "c8e1da08-722c-5040-9ed9-7db0dc04731e" +version = "1.10.0" + +[[deps.JLD2]] +deps = ["FileIO", "MacroTools", "Mmap", "OrderedCollections", "Pkg", "PrecompileTools", "Reexport", "Requires", "TranscodingStreams", "UUIDs", "Unicode"] +git-tree-sha1 = "bdbe8222d2f5703ad6a7019277d149ec6d78c301" +uuid = "033835bb-8acc-5ee8-8aae-3f567f8a3819" +version = "0.4.48" + +[[deps.JLFzf]] +deps = ["Pipe", "REPL", "Random", "fzf_jll"] +git-tree-sha1 = "a53ebe394b71470c7f97c2e7e170d51df21b17af" +uuid = "1019f520-868f-41f5-a6de-eb00f4b6a39c" +version = "0.1.7" + +[[deps.JLLWrappers]] +deps = ["Artifacts", "Preferences"] +git-tree-sha1 = "7e5d6779a1e09a36db2a7b6cff50942a0a7d0fca" +uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" +version = "1.5.0" + +[[deps.JSON]] +deps = ["Dates", "Mmap", "Parsers", "Unicode"] +git-tree-sha1 = "31e996f0a15c7b280ba9f76636b3ff9e2ae58c9a" +uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" +version = "0.21.4" + +[[deps.JpegTurbo]] +deps = ["CEnum", "FileIO", "ImageCore", "JpegTurbo_jll", "TOML"] +git-tree-sha1 = "fa6d0bcff8583bac20f1ffa708c3913ca605c611" +uuid = "b835a17e-a41a-41e7-81f0-2f016b05efe0" +version = "0.1.5" + +[[deps.JpegTurbo_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "c84a835e1a09b289ffcd2271bf2a337bbdda6637" +uuid = "aacddb02-875f-59d6-b918-886e6ef4fbf8" +version = "3.0.3+0" + +[[deps.LAME_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "170b660facf5df5de098d866564877e119141cbd" +uuid = "c1c5ebd0-6772-5130-a774-d5fcae4a789d" +version = "3.100.2+0" + +[[deps.LERC_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "bf36f528eec6634efc60d7ec062008f171071434" +uuid = "88015f11-f218-50d7-93a8-a6af411a945d" +version = "3.0.0+1" + +[[deps.LLVMOpenMP_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "d986ce2d884d49126836ea94ed5bfb0f12679713" +uuid = "1d63c593-3942-5779-bab2-d838dc0a180e" +version = "15.0.7+0" + +[[deps.LZO_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "70c5da094887fd2cae843b8db33920bac4b6f07d" +uuid = "dd4b983a-f0e5-5f8d-a1b7-129d4a5fb1ac" +version = "2.10.2+0" + +[[deps.LaTeXStrings]] +git-tree-sha1 = "50901ebc375ed41dbf8058da26f9de442febbbec" +uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" +version = "1.3.1" + +[[deps.Latexify]] +deps = ["Format", "InteractiveUtils", "LaTeXStrings", "MacroTools", "Markdown", "OrderedCollections", "Requires"] +git-tree-sha1 = "e0b5cd21dc1b44ec6e64f351976f961e6f31d6c4" +uuid = "23fbe1c1-3f47-55db-b15f-69d7ec21a316" +version = "0.16.3" + + [deps.Latexify.extensions] + DataFramesExt = "DataFrames" + SymEngineExt = "SymEngine" + + [deps.Latexify.weakdeps] + DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" + SymEngine = "123dc426-2d89-5057-bbad-38513e3affd8" + +[[deps.LayoutPointers]] +deps = ["ArrayInterface", "LinearAlgebra", "ManualMemory", "SIMDTypes", "Static", "StaticArrayInterface"] +git-tree-sha1 = "62edfee3211981241b57ff1cedf4d74d79519277" +uuid = "10f19ff3-798f-405d-979b-55457f8fc047" +version = "0.1.15" + +[[deps.LazyArtifacts]] +deps = ["Artifacts", "Pkg"] +uuid = "4af54fe1-eca0-43a8-85a7-787d91b784e3" + +[[deps.LazyModules]] +git-tree-sha1 = "a560dd966b386ac9ae60bdd3a3d3a326062d3c3e" +uuid = "8cdb02fc-e678-4876-92c5-9defec4f444e" +version = "0.3.1" + +[[deps.LibCURL]] +deps = ["LibCURL_jll", "MozillaCACerts_jll"] +uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" +version = "0.6.4" + +[[deps.LibCURL_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] +uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" +version = "8.4.0+0" + +[[deps.LibGit2]] +deps = ["Base64", "LibGit2_jll", "NetworkOptions", "Printf", "SHA"] +uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" + +[[deps.LibGit2_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll"] +uuid = "e37daf67-58a4-590a-8e99-b0245dd2ffc5" +version = "1.6.4+0" + +[[deps.LibSSH2_jll]] +deps = ["Artifacts", "Libdl", "MbedTLS_jll"] +uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" +version = "1.11.0+1" + +[[deps.Libdl]] +uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" + +[[deps.Libffi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "0b4a5d71f3e5200a7dff793393e09dfc2d874290" +uuid = "e9f186c6-92d2-5b65-8a66-fee21dc1b490" +version = "3.2.2+1" + +[[deps.Libgcrypt_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgpg_error_jll"] +git-tree-sha1 = "9fd170c4bbfd8b935fdc5f8b7aa33532c991a673" +uuid = "d4300ac3-e22c-5743-9152-c294e39db1e4" +version = "1.8.11+0" + +[[deps.Libglvnd_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll", "Xorg_libXext_jll"] +git-tree-sha1 = "6f73d1dd803986947b2c750138528a999a6c7733" +uuid = "7e76a0d4-f3c7-5321-8279-8d96eeed0f29" +version = "1.6.0+0" + +[[deps.Libgpg_error_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "fbb1f2bef882392312feb1ede3615ddc1e9b99ed" +uuid = "7add5ba3-2f88-524e-9cd5-f83b8a55f7b8" +version = "1.49.0+0" + +[[deps.Libiconv_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "f9557a255370125b405568f9767d6d195822a175" +uuid = "94ce4f54-9a6c-5748-9c1c-f9c7231a4531" +version = "1.17.0+0" + +[[deps.Libmount_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "0c4f9c4f1a50d8f35048fa0532dabbadf702f81e" +uuid = "4b2f31a3-9ecc-558c-b454-b3730dcb73e9" +version = "2.40.1+0" + +[[deps.Libtiff_jll]] +deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "LERC_jll", "Libdl", "XZ_jll", "Zlib_jll", "Zstd_jll"] +git-tree-sha1 = "2da088d113af58221c52828a80378e16be7d037a" +uuid = "89763e89-9b03-5906-acba-b20f662cd828" +version = "4.5.1+1" + +[[deps.Libuuid_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "5ee6203157c120d79034c748a2acba45b82b8807" +uuid = "38a345b3-de98-5d2b-a5d3-14cd9215e700" +version = "2.40.1+0" + +[[deps.LinearAlgebra]] +deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"] +uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + +[[deps.LittleCMS_jll]] +deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Libtiff_jll"] +git-tree-sha1 = "fa7fd067dca76cadd880f1ca937b4f387975a9f5" +uuid = "d3a379c0-f9a3-5b72-a4c0-6bf4d2e8af0f" +version = "2.16.0+0" + +[[deps.LogExpFunctions]] +deps = ["DocStringExtensions", "IrrationalConstants", "LinearAlgebra"] +git-tree-sha1 = "a2d09619db4e765091ee5c6ffe8872849de0feea" +uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688" +version = "0.3.28" + + [deps.LogExpFunctions.extensions] + LogExpFunctionsChainRulesCoreExt = "ChainRulesCore" + LogExpFunctionsChangesOfVariablesExt = "ChangesOfVariables" + LogExpFunctionsInverseFunctionsExt = "InverseFunctions" + + [deps.LogExpFunctions.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + ChangesOfVariables = "9e997f8a-9a97-42d5-a9f1-ce6bfc15e2c0" + InverseFunctions = "3587e190-3f89-42d0-90ee-14403ec27112" + +[[deps.Logging]] +uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" + +[[deps.LoggingExtras]] +deps = ["Dates", "Logging"] +git-tree-sha1 = "c1dd6d7978c12545b4179fb6153b9250c96b0075" +uuid = "e6f89c97-d47a-5376-807f-9c37f3926c36" +version = "1.0.3" + +[[deps.LoopVectorization]] +deps = ["ArrayInterface", "CPUSummary", "CloseOpenIntervals", "DocStringExtensions", "HostCPUFeatures", "IfElse", "LayoutPointers", "LinearAlgebra", "OffsetArrays", "PolyesterWeave", "PrecompileTools", "SIMDTypes", "SLEEFPirates", "Static", "StaticArrayInterface", "ThreadingUtilities", "UnPack", "VectorizationBase"] +git-tree-sha1 = "8f6786d8b2b3248d79db3ad359ce95382d5a6df8" +uuid = "bdcacae8-1622-11e9-2a5c-532679323890" +version = "0.12.170" + + [deps.LoopVectorization.extensions] + ForwardDiffExt = ["ChainRulesCore", "ForwardDiff"] + SpecialFunctionsExt = "SpecialFunctions" + + [deps.LoopVectorization.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + SpecialFunctions = "276daf66-3868-5448-9aa4-cd146d93841b" + +[[deps.MIMEs]] +git-tree-sha1 = "65f28ad4b594aebe22157d6fac869786a255b7eb" +uuid = "6c6e2e6c-3030-632d-7369-2d6c69616d65" +version = "0.1.4" + +[[deps.MKL_jll]] +deps = ["Artifacts", "IntelOpenMP_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "oneTBB_jll"] +git-tree-sha1 = "80b2833b56d466b3858d565adcd16a4a05f2089b" +uuid = "856f044c-d86e-5d09-b602-aeab76dc8ba7" +version = "2024.1.0+0" + +[[deps.MacroTools]] +deps = ["Markdown", "Random"] +git-tree-sha1 = "2fa9ee3e63fd3a4f7a9a4f4744a52f4856de82df" +uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" +version = "0.5.13" + +[[deps.ManualMemory]] +git-tree-sha1 = "bcaef4fc7a0cfe2cba636d84cda54b5e4e4ca3cd" +uuid = "d125e4d3-2237-4719-b19c-fa641b8a4667" +version = "0.1.8" + +[[deps.MappedArrays]] +git-tree-sha1 = "2dab0221fe2b0f2cb6754eaa743cc266339f527e" +uuid = "dbb5928d-eab1-5f90-85c2-b9b0edb7c900" +version = "0.4.2" + +[[deps.Markdown]] +deps = ["Base64"] +uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" + +[[deps.MbedTLS]] +deps = ["Dates", "MbedTLS_jll", "MozillaCACerts_jll", "NetworkOptions", "Random", "Sockets"] +git-tree-sha1 = "c067a280ddc25f196b5e7df3877c6b226d390aaf" +uuid = "739be429-bea8-5141-9913-cc70e7f3736d" +version = "1.1.9" + +[[deps.MbedTLS_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" +version = "2.28.2+1" + +[[deps.Measures]] +git-tree-sha1 = "c13304c81eec1ed3af7fc20e75fb6b26092a1102" +uuid = "442fdcdd-2543-5da2-b0f3-8c86c306513e" +version = "0.3.2" + +[[deps.MetaGraphs]] +deps = ["Graphs", "JLD2", "Random"] +git-tree-sha1 = "1130dbe1d5276cb656f6e1094ce97466ed700e5a" +uuid = "626554b9-1ddb-594c-aa3c-2596fe9399a5" +version = "0.7.2" + +[[deps.Missings]] +deps = ["DataAPI"] +git-tree-sha1 = "ec4f7fbeab05d7747bdf98eb74d130a2a2ed298d" +uuid = "e1d29d7a-bbdc-5cf2-9ac0-f12de2c33e28" +version = "1.2.0" + +[[deps.Mmap]] +uuid = "a63ad114-7e13-5084-954f-fe012c677804" + +[[deps.MosaicViews]] +deps = ["MappedArrays", "OffsetArrays", "PaddedViews", "StackViews"] +git-tree-sha1 = "7b86a5d4d70a9f5cdf2dacb3cbe6d251d1a61dbe" +uuid = "e94cdb99-869f-56ef-bcf0-1ae2bcbe0389" +version = "0.3.4" + +[[deps.MozillaCACerts_jll]] +uuid = "14a3606d-f60d-562e-9121-12d972cd8159" +version = "2023.1.10" + +[[deps.NaNMath]] +deps = ["OpenLibm_jll"] +git-tree-sha1 = "0877504529a3e5c3343c6f8b4c0381e57e4387e4" +uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" +version = "1.0.2" + +[[deps.NearestNeighbors]] +deps = ["Distances", "StaticArrays"] +git-tree-sha1 = "91a67b4d73842da90b526011fa85c5c4c9343fe0" +uuid = "b8a86587-4115-5ab1-83bc-aa920d37bbce" +version = "0.4.18" + +[[deps.Netpbm]] +deps = ["FileIO", "ImageCore", "ImageMetadata"] +git-tree-sha1 = "d92b107dbb887293622df7697a2223f9f8176fcd" +uuid = "f09324ee-3d7c-5217-9330-fc30815ba969" +version = "1.1.1" + +[[deps.NetworkOptions]] +uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" +version = "1.2.0" + +[[deps.OffsetArrays]] +git-tree-sha1 = "e64b4f5ea6b7389f6f046d13d4896a8f9c1ba71e" +uuid = "6fe1bfb0-de20-5000-8ca7-80f57d26f881" +version = "1.14.0" +weakdeps = ["Adapt"] + + [deps.OffsetArrays.extensions] + OffsetArraysAdaptExt = "Adapt" + +[[deps.Ogg_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "887579a3eb005446d514ab7aeac5d1d027658b8f" +uuid = "e7412a2a-1a6e-54c0-be00-318e2571c051" +version = "1.3.5+1" + +[[deps.OpenBLAS_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] +uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" +version = "0.3.23+4" + +[[deps.OpenEXR]] +deps = ["Colors", "FileIO", "OpenEXR_jll"] +git-tree-sha1 = "327f53360fdb54df7ecd01e96ef1983536d1e633" +uuid = "52e1d378-f018-4a11-a4be-720524705ac7" +version = "0.3.2" + +[[deps.OpenEXR_jll]] +deps = ["Artifacts", "Imath_jll", "JLLWrappers", "Libdl", "Zlib_jll"] +git-tree-sha1 = "8292dd5c8a38257111ada2174000a33745b06d4e" +uuid = "18a262bb-aa17-5467-a713-aee519bc75cb" +version = "3.2.4+0" + +[[deps.OpenJpeg_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libtiff_jll", "LittleCMS_jll", "libpng_jll"] +git-tree-sha1 = "f4cb457ffac5f5cf695699f82c537073958a6a6c" +uuid = "643b3616-a352-519d-856d-80112ee9badc" +version = "2.5.2+0" + +[[deps.OpenLibm_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "05823500-19ac-5b8b-9628-191a04bc5112" +version = "0.8.1+2" + +[[deps.OpenSSL]] +deps = ["BitFlags", "Dates", "MozillaCACerts_jll", "OpenSSL_jll", "Sockets"] +git-tree-sha1 = "38cb508d080d21dc1128f7fb04f20387ed4c0af4" +uuid = "4d8831e6-92b7-49fb-bdf8-b643e874388c" +version = "1.4.3" + +[[deps.OpenSSL_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "a028ee3cb5641cccc4c24e90c36b0a4f7707bdf5" +uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95" +version = "3.0.14+0" + +[[deps.OpenSpecFun_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "13652491f6856acfd2db29360e1bbcd4565d04f1" +uuid = "efe28fd5-8261-553b-a9e1-b2916fc3738e" +version = "0.5.5+0" + +[[deps.Opus_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "51a08fb14ec28da2ec7a927c4337e4332c2a4720" +uuid = "91d4177d-7536-5919-b921-800302f37372" +version = "1.3.2+0" + +[[deps.OrderedCollections]] +git-tree-sha1 = "dfdf5519f235516220579f949664f1bf44e741c5" +uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" +version = "1.6.3" + +[[deps.PCRE2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "efcefdf7-47ab-520b-bdef-62a2eaa19f15" +version = "10.42.0+1" + +[[deps.PNGFiles]] +deps = ["Base64", "CEnum", "ImageCore", "IndirectArrays", "OffsetArrays", "libpng_jll"] +git-tree-sha1 = "67186a2bc9a90f9f85ff3cc8277868961fb57cbd" +uuid = "f57f5aa1-a3ce-4bc8-8ab9-96f992907883" +version = "0.4.3" + +[[deps.PaddedViews]] +deps = ["OffsetArrays"] +git-tree-sha1 = "0fac6313486baae819364c52b4f483450a9d793f" +uuid = "5432bcbf-9aad-5242-b902-cca2824c8663" +version = "0.5.12" + +[[deps.Parameters]] +deps = ["OrderedCollections", "UnPack"] +git-tree-sha1 = "34c0e9ad262e5f7fc75b10a9952ca7692cfc5fbe" +uuid = "d96e819e-fc66-5662-9728-84c9c7592b0a" +version = "0.12.3" + +[[deps.Parsers]] +deps = ["Dates", "PrecompileTools", "UUIDs"] +git-tree-sha1 = "8489905bcdbcfac64d1daa51ca07c0d8f0283821" +uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" +version = "2.8.1" + +[[deps.Pipe]] +git-tree-sha1 = "6842804e7867b115ca9de748a0cf6b364523c16d" +uuid = "b98c9c47-44ae-5843-9183-064241ee97a0" +version = "1.3.0" + +[[deps.Pixman_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LLVMOpenMP_jll", "Libdl"] +git-tree-sha1 = "35621f10a7531bc8fa58f74610b1bfb70a3cfc6b" +uuid = "30392449-352a-5448-841d-b1acce4e97dc" +version = "0.43.4+0" + +[[deps.Pkg]] +deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] +uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" +version = "1.10.0" + +[[deps.PkgVersion]] +deps = ["Pkg"] +git-tree-sha1 = "f9501cc0430a26bc3d156ae1b5b0c1b47af4d6da" +uuid = "eebad327-c553-4316-9ea0-9fa01ccd7688" +version = "0.3.3" + +[[deps.PlotThemes]] +deps = ["PlotUtils", "Statistics"] +git-tree-sha1 = "6e55c6841ce3411ccb3457ee52fc48cb698d6fb0" +uuid = "ccf2f8ad-2431-5c83-bf29-c5338b663b6a" +version = "3.2.0" + +[[deps.PlotUtils]] +deps = ["ColorSchemes", "Colors", "Dates", "PrecompileTools", "Printf", "Random", "Reexport", "Statistics"] +git-tree-sha1 = "7b1a9df27f072ac4c9c7cbe5efb198489258d1f5" +uuid = "995b91a9-d308-5afd-9ec6-746e21dbc043" +version = "1.4.1" + +[[deps.Plots]] +deps = ["Base64", "Contour", "Dates", "Downloads", "FFMPEG", "FixedPointNumbers", "GR", "JLFzf", "JSON", "LaTeXStrings", "Latexify", "LinearAlgebra", "Measures", "NaNMath", "Pkg", "PlotThemes", "PlotUtils", "PrecompileTools", "Printf", "REPL", "Random", "RecipesBase", "RecipesPipeline", "Reexport", "RelocatableFolders", "Requires", "Scratch", "Showoff", "SparseArrays", "Statistics", "StatsBase", "UUIDs", "UnicodeFun", "UnitfulLatexify", "Unzip"] +git-tree-sha1 = "442e1e7ac27dd5ff8825c3fa62fbd1e86397974b" +uuid = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" +version = "1.40.4" + + [deps.Plots.extensions] + FileIOExt = "FileIO" + GeometryBasicsExt = "GeometryBasics" + IJuliaExt = "IJulia" + ImageInTerminalExt = "ImageInTerminal" + UnitfulExt = "Unitful" + + [deps.Plots.weakdeps] + FileIO = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" + GeometryBasics = "5c1252a2-5f33-56bf-86c9-59e7332b4326" + IJulia = "7073ff75-c697-5162-941a-fcdaad2a7d2a" + ImageInTerminal = "d8c32880-2388-543b-8c61-d9f865259254" + Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" + +[[deps.PlutoUI]] +deps = ["AbstractPlutoDingetjes", "Base64", "ColorTypes", "Dates", "FixedPointNumbers", "Hyperscript", "HypertextLiteral", "IOCapture", "InteractiveUtils", "JSON", "Logging", "MIMEs", "Markdown", "Random", "Reexport", "URIs", "UUIDs"] +git-tree-sha1 = "ab55ee1510ad2af0ff674dbcced5e94921f867a9" +uuid = "7f904dfe-b85e-4ff6-b463-dae2292396a8" +version = "0.7.59" + +[[deps.PolyesterWeave]] +deps = ["BitTwiddlingConvenienceFunctions", "CPUSummary", "IfElse", "Static", "ThreadingUtilities"] +git-tree-sha1 = "240d7170f5ffdb285f9427b92333c3463bf65bf6" +uuid = "1d0040c9-8b98-4ee7-8388-3f51789ca0ad" +version = "0.2.1" + +[[deps.Polynomials]] +deps = ["LinearAlgebra", "RecipesBase"] +git-tree-sha1 = "3aa2bb4982e575acd7583f01531f241af077b163" +uuid = "f27b6e38-b328-58d1-80ce-0feddd5e7a45" +version = "3.2.13" + + [deps.Polynomials.extensions] + PolynomialsChainRulesCoreExt = "ChainRulesCore" + PolynomialsMakieCoreExt = "MakieCore" + PolynomialsMutableArithmeticsExt = "MutableArithmetics" + + [deps.Polynomials.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + MakieCore = "20f20a25-4f0e-4fdf-b5d1-57303727442b" + MutableArithmetics = "d8a4904e-b15c-11e9-3269-09a3773c0cb0" + +[[deps.PrecompileTools]] +deps = ["Preferences"] +git-tree-sha1 = "5aa36f7049a63a1528fe8f7c3f2113413ffd4e1f" +uuid = "aea7be01-6a6a-4083-8856-8a6e6704d82a" +version = "1.2.1" + +[[deps.Preferences]] +deps = ["TOML"] +git-tree-sha1 = "9306f6085165d270f7e3db02af26a400d580f5c6" +uuid = "21216c6a-2e73-6563-6e65-726566657250" +version = "1.4.3" + +[[deps.Printf]] +deps = ["Unicode"] +uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" + +[[deps.ProgressMeter]] +deps = ["Distributed", "Printf"] +git-tree-sha1 = "763a8ceb07833dd51bb9e3bbca372de32c0605ad" +uuid = "92933f4c-e287-5a05-a399-4b506db050ca" +version = "1.10.0" + +[[deps.QOI]] +deps = ["ColorTypes", "FileIO", "FixedPointNumbers"] +git-tree-sha1 = "18e8f4d1426e965c7b532ddd260599e1510d26ce" +uuid = "4b34888f-f399-49d4-9bb3-47ed5cae4e65" +version = "1.0.0" + +[[deps.Qt6Base_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Fontconfig_jll", "Glib_jll", "JLLWrappers", "Libdl", "Libglvnd_jll", "OpenSSL_jll", "Vulkan_Loader_jll", "Xorg_libSM_jll", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Xorg_libxcb_jll", "Xorg_xcb_util_cursor_jll", "Xorg_xcb_util_image_jll", "Xorg_xcb_util_keysyms_jll", "Xorg_xcb_util_renderutil_jll", "Xorg_xcb_util_wm_jll", "Zlib_jll", "libinput_jll", "xkbcommon_jll"] +git-tree-sha1 = "37b7bb7aabf9a085e0044307e1717436117f2b3b" +uuid = "c0090381-4147-56d7-9ebc-da0b1113ec56" +version = "6.5.3+1" + +[[deps.Quaternions]] +deps = ["LinearAlgebra", "Random", "RealDot"] +git-tree-sha1 = "994cc27cdacca10e68feb291673ec3a76aa2fae9" +uuid = "94ee1d12-ae83-5a48-8b1c-48b8ff168ae0" +version = "0.7.6" + +[[deps.REPL]] +deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] +uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" + +[[deps.Random]] +deps = ["SHA"] +uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" + +[[deps.RangeArrays]] +git-tree-sha1 = "b9039e93773ddcfc828f12aadf7115b4b4d225f5" +uuid = "b3c3ace0-ae52-54e7-9d0b-2c1406fd6b9d" +version = "0.3.2" + +[[deps.Ratios]] +deps = ["Requires"] +git-tree-sha1 = "1342a47bf3260ee108163042310d26f2be5ec90b" +uuid = "c84ed2f1-dad5-54f0-aa8e-dbefe2724439" +version = "0.4.5" +weakdeps = ["FixedPointNumbers"] + + [deps.Ratios.extensions] + RatiosFixedPointNumbersExt = "FixedPointNumbers" + +[[deps.RealDot]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "9f0a1b71baaf7650f4fa8a1d168c7fb6ee41f0c9" +uuid = "c1ae055f-0cd5-4b69-90a6-9a35b1a98df9" +version = "0.1.0" + +[[deps.RecipesBase]] +deps = ["PrecompileTools"] +git-tree-sha1 = "5c3d09cc4f31f5fc6af001c250bf1278733100ff" +uuid = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" +version = "1.3.4" + +[[deps.RecipesPipeline]] +deps = ["Dates", "NaNMath", "PlotUtils", "PrecompileTools", "RecipesBase"] +git-tree-sha1 = "45cf9fd0ca5839d06ef333c8201714e888486342" +uuid = "01d81517-befc-4cb6-b9ec-a95719d0359c" +version = "0.6.12" + +[[deps.Reexport]] +git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" +uuid = "189a3867-3050-52da-a836-e630ba90ab69" +version = "1.2.2" + +[[deps.RegionTrees]] +deps = ["IterTools", "LinearAlgebra", "StaticArrays"] +git-tree-sha1 = "4618ed0da7a251c7f92e869ae1a19c74a7d2a7f9" +uuid = "dee08c22-ab7f-5625-9660-a9af2021b33f" +version = "0.3.2" + +[[deps.RelocatableFolders]] +deps = ["SHA", "Scratch"] +git-tree-sha1 = "ffdaf70d81cf6ff22c2b6e733c900c3321cab864" +uuid = "05181044-ff0b-4ac5-8273-598c1e38db00" +version = "1.0.1" + +[[deps.Requires]] +deps = ["UUIDs"] +git-tree-sha1 = "838a3a4188e2ded87a4f9f184b4b0d78a1e91cb7" +uuid = "ae029012-a4dd-5104-9daa-d747884805df" +version = "1.3.0" + +[[deps.Rotations]] +deps = ["LinearAlgebra", "Quaternions", "Random", "StaticArrays"] +git-tree-sha1 = "5680a9276685d392c87407df00d57c9924d9f11e" +uuid = "6038ab10-8711-5258-84ad-4b1120ba62dc" +version = "1.7.1" +weakdeps = ["RecipesBase"] + + [deps.Rotations.extensions] + RotationsRecipesBaseExt = "RecipesBase" + +[[deps.SHA]] +uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" +version = "0.7.0" + +[[deps.SIMD]] +deps = ["PrecompileTools"] +git-tree-sha1 = "2803cab51702db743f3fda07dd1745aadfbf43bd" +uuid = "fdea26ae-647d-5447-a871-4b548cad5224" +version = "3.5.0" + +[[deps.SIMDTypes]] +git-tree-sha1 = "330289636fb8107c5f32088d2741e9fd7a061a5c" +uuid = "94e857df-77ce-4151-89e5-788b33177be4" +version = "0.1.0" + +[[deps.SLEEFPirates]] +deps = ["IfElse", "Static", "VectorizationBase"] +git-tree-sha1 = "3aac6d68c5e57449f5b9b865c9ba50ac2970c4cf" +uuid = "476501e8-09a2-5ece-8869-fb82de89a1fa" +version = "0.6.42" + +[[deps.Scratch]] +deps = ["Dates"] +git-tree-sha1 = "3bac05bc7e74a75fd9cba4295cde4045d9fe2386" +uuid = "6c6a2e73-6563-6170-7368-637461726353" +version = "1.2.1" + +[[deps.Serialization]] +uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" + +[[deps.SharedArrays]] +deps = ["Distributed", "Mmap", "Random", "Serialization"] +uuid = "1a1011a3-84de-559e-8e89-a11a2f7dc383" + +[[deps.Showoff]] +deps = ["Dates", "Grisu"] +git-tree-sha1 = "91eddf657aca81df9ae6ceb20b959ae5653ad1de" +uuid = "992d4aef-0814-514b-bc4d-f2e9a6c4116f" +version = "1.0.3" + +[[deps.SimpleBufferStream]] +git-tree-sha1 = "874e8867b33a00e784c8a7e4b60afe9e037b74e1" +uuid = "777ac1f9-54b0-4bf8-805c-2214025038e7" +version = "1.1.0" + +[[deps.SimpleTraits]] +deps = ["InteractiveUtils", "MacroTools"] +git-tree-sha1 = "5d7e3f4e11935503d3ecaf7186eac40602e7d231" +uuid = "699a6c99-e7fa-54fc-8d76-47d257e15c1d" +version = "0.9.4" + +[[deps.SimpleWeightedGraphs]] +deps = ["Graphs", "LinearAlgebra", "Markdown", "SparseArrays"] +git-tree-sha1 = "4b33e0e081a825dbfaf314decf58fa47e53d6acb" +uuid = "47aef6b3-ad0c-573a-a1e2-d07658019622" +version = "1.4.0" + +[[deps.Sixel]] +deps = ["Dates", "FileIO", "ImageCore", "IndirectArrays", "OffsetArrays", "REPL", "libsixel_jll"] +git-tree-sha1 = "2da10356e31327c7096832eb9cd86307a50b1eb6" +uuid = "45858cf5-a6b0-47a3-bbea-62219f50df47" +version = "0.1.3" + +[[deps.Sockets]] +uuid = "6462fe0b-24de-5631-8697-dd941f90decc" + +[[deps.SortingAlgorithms]] +deps = ["DataStructures"] +git-tree-sha1 = "66e0a8e672a0bdfca2c3f5937efb8538b9ddc085" +uuid = "a2af1166-a08f-5f64-846c-94a0d3cef48c" +version = "1.2.1" + +[[deps.SparseArrays]] +deps = ["Libdl", "LinearAlgebra", "Random", "Serialization", "SuiteSparse_jll"] +uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" +version = "1.10.0" + +[[deps.SpecialFunctions]] +deps = ["IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"] +git-tree-sha1 = "2f5d4697f21388cbe1ff299430dd169ef97d7e14" +uuid = "276daf66-3868-5448-9aa4-cd146d93841b" +version = "2.4.0" +weakdeps = ["ChainRulesCore"] + + [deps.SpecialFunctions.extensions] + SpecialFunctionsChainRulesCoreExt = "ChainRulesCore" + +[[deps.StackViews]] +deps = ["OffsetArrays"] +git-tree-sha1 = "46e589465204cd0c08b4bd97385e4fa79a0c770c" +uuid = "cae243ae-269e-4f55-b966-ac2d0dc13c15" +version = "0.1.1" + +[[deps.Static]] +deps = ["IfElse"] +git-tree-sha1 = "d2fdac9ff3906e27f7a618d47b676941baa6c80c" +uuid = "aedffcd0-7271-4cad-89d0-dc628f76c6d3" +version = "0.8.10" + +[[deps.StaticArrayInterface]] +deps = ["ArrayInterface", "Compat", "IfElse", "LinearAlgebra", "PrecompileTools", "Requires", "SparseArrays", "Static", "SuiteSparse"] +git-tree-sha1 = "5d66818a39bb04bf328e92bc933ec5b4ee88e436" +uuid = "0d7ed370-da01-4f52-bd93-41d350b8b718" +version = "1.5.0" +weakdeps = ["OffsetArrays", "StaticArrays"] + + [deps.StaticArrayInterface.extensions] + StaticArrayInterfaceOffsetArraysExt = "OffsetArrays" + StaticArrayInterfaceStaticArraysExt = "StaticArrays" + +[[deps.StaticArrays]] +deps = ["LinearAlgebra", "PrecompileTools", "Random", "StaticArraysCore"] +git-tree-sha1 = "6e00379a24597be4ae1ee6b2d882e15392040132" +uuid = "90137ffa-7385-5640-81b9-e52037218182" +version = "1.9.5" +weakdeps = ["ChainRulesCore", "Statistics"] + + [deps.StaticArrays.extensions] + StaticArraysChainRulesCoreExt = "ChainRulesCore" + StaticArraysStatisticsExt = "Statistics" + +[[deps.StaticArraysCore]] +git-tree-sha1 = "192954ef1208c7019899fbf8049e717f92959682" +uuid = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" +version = "1.4.3" + +[[deps.Statistics]] +deps = ["LinearAlgebra", "SparseArrays"] +uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" +version = "1.10.0" + +[[deps.StatsAPI]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "1ff449ad350c9c4cbc756624d6f8a8c3ef56d3ed" +uuid = "82ae8749-77ed-4fe6-ae5f-f523153014b0" +version = "1.7.0" + +[[deps.StatsBase]] +deps = ["DataAPI", "DataStructures", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"] +git-tree-sha1 = "5cf7606d6cef84b543b483848d4ae08ad9832b21" +uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" +version = "0.34.3" + +[[deps.SuiteSparse]] +deps = ["Libdl", "LinearAlgebra", "Serialization", "SparseArrays"] +uuid = "4607b0f0-06f3-5cda-b6b1-a6196a1729e9" + +[[deps.SuiteSparse_jll]] +deps = ["Artifacts", "Libdl", "libblastrampoline_jll"] +uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c" +version = "7.2.1+1" + +[[deps.TOML]] +deps = ["Dates"] +uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" +version = "1.0.3" + +[[deps.Tar]] +deps = ["ArgTools", "SHA"] +uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" +version = "1.10.0" + +[[deps.TensorCore]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "1feb45f88d133a655e001435632f019a9a1bcdb6" +uuid = "62fd8b95-f654-4bbd-a8a5-9c27f68ccd50" +version = "0.1.1" + +[[deps.Test]] +deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] +uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[[deps.ThreadingUtilities]] +deps = ["ManualMemory"] +git-tree-sha1 = "eda08f7e9818eb53661b3deb74e3159460dfbc27" +uuid = "8290d209-cae3-49c0-8002-c8c24d57dab5" +version = "0.5.2" + +[[deps.TiffImages]] +deps = ["ColorTypes", "DataStructures", "DocStringExtensions", "FileIO", "FixedPointNumbers", "IndirectArrays", "Inflate", "Mmap", "OffsetArrays", "PkgVersion", "ProgressMeter", "SIMD", "UUIDs"] +git-tree-sha1 = "bc7fd5c91041f44636b2c134041f7e5263ce58ae" +uuid = "731e570b-9d59-4bfa-96dc-6df516fadf69" +version = "0.10.0" + +[[deps.TiledIteration]] +deps = ["OffsetArrays", "StaticArrayInterface"] +git-tree-sha1 = "1176cc31e867217b06928e2f140c90bd1bc88283" +uuid = "06e1c1a7-607b-532d-9fad-de7d9aa2abac" +version = "0.5.0" + +[[deps.TranscodingStreams]] +git-tree-sha1 = "a947ea21087caba0a798c5e494d0bb78e3a1a3a0" +uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa" +version = "0.10.9" +weakdeps = ["Random", "Test"] + + [deps.TranscodingStreams.extensions] + TestExt = ["Test", "Random"] + +[[deps.Tricks]] +git-tree-sha1 = "eae1bb484cd63b36999ee58be2de6c178105112f" +uuid = "410a4b4d-49e4-4fbc-ab6d-cb71b17b3775" +version = "0.1.8" + +[[deps.URIs]] +git-tree-sha1 = "67db6cc7b3821e19ebe75791a9dd19c9b1188f2b" +uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" +version = "1.5.1" + +[[deps.UUIDs]] +deps = ["Random", "SHA"] +uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" + +[[deps.UnPack]] +git-tree-sha1 = "387c1f73762231e86e0c9c5443ce3b4a0a9a0c2b" +uuid = "3a884ed6-31ef-47d7-9d2a-63182c4928ed" +version = "1.0.2" + +[[deps.Unicode]] +uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" + +[[deps.UnicodeFun]] +deps = ["REPL"] +git-tree-sha1 = "53915e50200959667e78a92a418594b428dffddf" +uuid = "1cfade01-22cf-5700-b092-accc4b62d6e1" +version = "0.4.1" + +[[deps.Unitful]] +deps = ["Dates", "LinearAlgebra", "Random"] +git-tree-sha1 = "dd260903fdabea27d9b6021689b3cd5401a57748" +uuid = "1986cc42-f94f-5a68-af5c-568840ba703d" +version = "1.20.0" + + [deps.Unitful.extensions] + ConstructionBaseUnitfulExt = "ConstructionBase" + InverseFunctionsUnitfulExt = "InverseFunctions" + + [deps.Unitful.weakdeps] + ConstructionBase = "187b0558-2788-49d3-abe0-74a17ed4e7c9" + InverseFunctions = "3587e190-3f89-42d0-90ee-14403ec27112" + +[[deps.UnitfulLatexify]] +deps = ["LaTeXStrings", "Latexify", "Unitful"] +git-tree-sha1 = "e2d817cc500e960fdbafcf988ac8436ba3208bfd" +uuid = "45397f5d-5981-4c77-b2b3-fc36d6e9b728" +version = "1.6.3" + +[[deps.Unzip]] +git-tree-sha1 = "ca0969166a028236229f63514992fc073799bb78" +uuid = "41fe7b60-77ed-43a1-b4f0-825fd5a5650d" +version = "0.2.0" + +[[deps.VectorizationBase]] +deps = ["ArrayInterface", "CPUSummary", "HostCPUFeatures", "IfElse", "LayoutPointers", "Libdl", "LinearAlgebra", "SIMDTypes", "Static", "StaticArrayInterface"] +git-tree-sha1 = "e863582a41c5731f51fd050563ae91eb33cf09be" +uuid = "3d5dd08c-fd9d-11e8-17fa-ed2836048c2f" +version = "0.21.68" + +[[deps.Vulkan_Loader_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Wayland_jll", "Xorg_libX11_jll", "Xorg_libXrandr_jll", "xkbcommon_jll"] +git-tree-sha1 = "2f0486047a07670caad3a81a075d2e518acc5c59" +uuid = "a44049a8-05dd-5a78-86c9-5fde0876e88c" +version = "1.3.243+0" + +[[deps.Wayland_jll]] +deps = ["Artifacts", "EpollShim_jll", "Expat_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Pkg", "XML2_jll"] +git-tree-sha1 = "7558e29847e99bc3f04d6569e82d0f5c54460703" +uuid = "a2964d1f-97da-50d4-b82a-358c7fce9d89" +version = "1.21.0+1" + +[[deps.Wayland_protocols_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "93f43ab61b16ddfb2fd3bb13b3ce241cafb0e6c9" +uuid = "2381bf8a-dfd0-557d-9999-79630e7b1b91" +version = "1.31.0+0" + +[[deps.WoodburyMatrices]] +deps = ["LinearAlgebra", "SparseArrays"] +git-tree-sha1 = "c1a7aa6219628fcd757dede0ca95e245c5cd9511" +uuid = "efce3f68-66dc-5838-9240-27a6d6f5f9b6" +version = "1.0.0" + +[[deps.XML2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Zlib_jll"] +git-tree-sha1 = "52ff2af32e591541550bd753c0da8b9bc92bb9d9" +uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a" +version = "2.12.7+0" + +[[deps.XSLT_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgcrypt_jll", "Libgpg_error_jll", "Libiconv_jll", "Pkg", "XML2_jll", "Zlib_jll"] +git-tree-sha1 = "91844873c4085240b95e795f692c4cec4d805f8a" +uuid = "aed1982a-8fda-507f-9586-7b0439959a61" +version = "1.1.34+0" + +[[deps.XZ_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "ac88fb95ae6447c8dda6a5503f3bafd496ae8632" +uuid = "ffd25f8a-64ca-5728-b0f7-c24cf3aae800" +version = "5.4.6+0" + +[[deps.Xorg_libICE_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "326b4fea307b0b39892b3e85fa451692eda8d46c" +uuid = "f67eecfb-183a-506d-b269-f58e52b52d7c" +version = "1.1.1+0" + +[[deps.Xorg_libSM_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libICE_jll"] +git-tree-sha1 = "3796722887072218eabafb494a13c963209754ce" +uuid = "c834827a-8449-5923-a945-d239c165b7dd" +version = "1.2.4+0" + +[[deps.Xorg_libX11_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxcb_jll", "Xorg_xtrans_jll"] +git-tree-sha1 = "afead5aba5aa507ad5a3bf01f58f82c8d1403495" +uuid = "4f6342f7-b3d2-589e-9d20-edeb45f2b2bc" +version = "1.8.6+0" + +[[deps.Xorg_libXau_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "6035850dcc70518ca32f012e46015b9beeda49d8" +uuid = "0c0b7dd1-d40b-584c-a123-a41640f87eec" +version = "1.0.11+0" + +[[deps.Xorg_libXcursor_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXfixes_jll", "Xorg_libXrender_jll"] +git-tree-sha1 = "12e0eb3bc634fa2080c1c37fccf56f7c22989afd" +uuid = "935fb764-8cf2-53bf-bb30-45bb1f8bf724" +version = "1.2.0+4" + +[[deps.Xorg_libXdmcp_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "34d526d318358a859d7de23da945578e8e8727b7" +uuid = "a3789734-cfe1-5b06-b2d0-1dd0d9d62d05" +version = "1.1.4+0" + +[[deps.Xorg_libXext_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] +git-tree-sha1 = "d2d1a5c49fae4ba39983f63de6afcbea47194e85" +uuid = "1082639a-0dae-5f34-9b06-72781eeb8cb3" +version = "1.3.6+0" + +[[deps.Xorg_libXfixes_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll"] +git-tree-sha1 = "0e0dc7431e7a0587559f9294aeec269471c991a4" +uuid = "d091e8ba-531a-589c-9de9-94069b037ed8" +version = "5.0.3+4" + +[[deps.Xorg_libXi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXext_jll", "Xorg_libXfixes_jll"] +git-tree-sha1 = "89b52bc2160aadc84d707093930ef0bffa641246" +uuid = "a51aa0fd-4e3c-5386-b890-e753decda492" +version = "1.7.10+4" + +[[deps.Xorg_libXinerama_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXext_jll"] +git-tree-sha1 = "26be8b1c342929259317d8b9f7b53bf2bb73b123" +uuid = "d1454406-59df-5ea1-beac-c340f2130bc3" +version = "1.1.4+4" + +[[deps.Xorg_libXrandr_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXext_jll", "Xorg_libXrender_jll"] +git-tree-sha1 = "34cea83cb726fb58f325887bf0612c6b3fb17631" +uuid = "ec84b674-ba8e-5d96-8ba1-2a689ba10484" +version = "1.5.2+4" + +[[deps.Xorg_libXrender_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] +git-tree-sha1 = "47e45cd78224c53109495b3e324df0c37bb61fbe" +uuid = "ea2f1a96-1ddc-540d-b46f-429655e07cfa" +version = "0.9.11+0" + +[[deps.Xorg_libpthread_stubs_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "8fdda4c692503d44d04a0603d9ac0982054635f9" +uuid = "14d82f49-176c-5ed1-bb49-ad3f5cbd8c74" +version = "0.1.1+0" + +[[deps.Xorg_libxcb_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "XSLT_jll", "Xorg_libXau_jll", "Xorg_libXdmcp_jll", "Xorg_libpthread_stubs_jll"] +git-tree-sha1 = "b4bfde5d5b652e22b9c790ad00af08b6d042b97d" +uuid = "c7cfdc94-dc32-55de-ac96-5a1b8d977c5b" +version = "1.15.0+0" + +[[deps.Xorg_libxkbfile_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] +git-tree-sha1 = "730eeca102434283c50ccf7d1ecdadf521a765a4" +uuid = "cc61e674-0454-545c-8b26-ed2c68acab7a" +version = "1.1.2+0" + +[[deps.Xorg_xcb_util_cursor_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_xcb_util_image_jll", "Xorg_xcb_util_jll", "Xorg_xcb_util_renderutil_jll"] +git-tree-sha1 = "04341cb870f29dcd5e39055f895c39d016e18ccd" +uuid = "e920d4aa-a673-5f3a-b3d7-f755a4d47c43" +version = "0.1.4+0" + +[[deps.Xorg_xcb_util_image_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] +git-tree-sha1 = "0fab0a40349ba1cba2c1da699243396ff8e94b97" +uuid = "12413925-8142-5f55-bb0e-6d7ca50bb09b" +version = "0.4.0+1" + +[[deps.Xorg_xcb_util_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libxcb_jll"] +git-tree-sha1 = "e7fd7b2881fa2eaa72717420894d3938177862d1" +uuid = "2def613f-5ad1-5310-b15b-b15d46f528f5" +version = "0.4.0+1" + +[[deps.Xorg_xcb_util_keysyms_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] +git-tree-sha1 = "d1151e2c45a544f32441a567d1690e701ec89b00" +uuid = "975044d2-76e6-5fbe-bf08-97ce7c6574c7" +version = "0.4.0+1" + +[[deps.Xorg_xcb_util_renderutil_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] +git-tree-sha1 = "dfd7a8f38d4613b6a575253b3174dd991ca6183e" +uuid = "0d47668e-0667-5a69-a72c-f761630bfb7e" +version = "0.3.9+1" + +[[deps.Xorg_xcb_util_wm_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] +git-tree-sha1 = "e78d10aab01a4a154142c5006ed44fd9e8e31b67" +uuid = "c22f9ab0-d5fe-5066-847c-f4bb1cd4e361" +version = "0.4.1+1" + +[[deps.Xorg_xkbcomp_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxkbfile_jll"] +git-tree-sha1 = "330f955bc41bb8f5270a369c473fc4a5a4e4d3cb" +uuid = "35661453-b289-5fab-8a00-3d9160c6a3a4" +version = "1.4.6+0" + +[[deps.Xorg_xkeyboard_config_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_xkbcomp_jll"] +git-tree-sha1 = "691634e5453ad362044e2ad653e79f3ee3bb98c3" +uuid = "33bec58e-1273-512f-9401-5d533626f822" +version = "2.39.0+0" + +[[deps.Xorg_xtrans_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "e92a1a012a10506618f10b7047e478403a046c77" +uuid = "c5fb5394-a638-5e4d-96e5-b29de1b5cf10" +version = "1.5.0+0" + +[[deps.Zlib_jll]] +deps = ["Libdl"] +uuid = "83775a58-1f1d-513f-b197-d71354ab007a" +version = "1.2.13+1" + +[[deps.Zstd_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "e678132f07ddb5bfa46857f0d7620fb9be675d3b" +uuid = "3161d3a3-bdf6-5164-811a-617609db77b4" +version = "1.5.6+0" + +[[deps.eudev_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "gperf_jll"] +git-tree-sha1 = "431b678a28ebb559d224c0b6b6d01afce87c51ba" +uuid = "35ca27e7-8b34-5b7f-bca9-bdc33f59eb06" +version = "3.2.9+0" + +[[deps.fzf_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "a68c9655fbe6dfcab3d972808f1aafec151ce3f8" +uuid = "214eeab7-80f7-51ab-84ad-2988db7cef09" +version = "0.43.0+0" + +[[deps.gperf_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "3516a5630f741c9eecb3720b1ec9d8edc3ecc033" +uuid = "1a1c6b14-54f6-533d-8383-74cd7377aa70" +version = "3.1.1+0" + +[[deps.libaom_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "1827acba325fdcdf1d2647fc8d5301dd9ba43a9d" +uuid = "a4ae2306-e953-59d6-aa16-d00cac43593b" +version = "3.9.0+0" + +[[deps.libass_jll]] +deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] +git-tree-sha1 = "5982a94fcba20f02f42ace44b9894ee2b140fe47" +uuid = "0ac62f75-1d6f-5e53-bd7c-93b484bb37c0" +version = "0.15.1+0" + +[[deps.libblastrampoline_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" +version = "5.8.0+1" + +[[deps.libevdev_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "141fe65dc3efabb0b1d5ba74e91f6ad26f84cc22" +uuid = "2db6ffa8-e38f-5e21-84af-90c45d0032cc" +version = "1.11.0+0" + +[[deps.libfdk_aac_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "daacc84a041563f965be61859a36e17c4e4fcd55" +uuid = "f638f0a6-7fb0-5443-88ba-1cc74229b280" +version = "2.0.2+0" + +[[deps.libinput_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "eudev_jll", "libevdev_jll", "mtdev_jll"] +git-tree-sha1 = "ad50e5b90f222cfe78aa3d5183a20a12de1322ce" +uuid = "36db933b-70db-51c0-b978-0f229ee0e533" +version = "1.18.0+0" + +[[deps.libpng_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Zlib_jll"] +git-tree-sha1 = "d7015d2e18a5fd9a4f47de711837e980519781a4" +uuid = "b53b4c65-9356-5827-b1ea-8c7a1a84506f" +version = "1.6.43+1" + +[[deps.libsixel_jll]] +deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Pkg", "libpng_jll"] +git-tree-sha1 = "d4f63314c8aa1e48cd22aa0c17ed76cd1ae48c3c" +uuid = "075b6546-f08a-558a-be8f-8157d0f608a5" +version = "1.10.3+0" + +[[deps.libvorbis_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Ogg_jll", "Pkg"] +git-tree-sha1 = "b910cb81ef3fe6e78bf6acee440bda86fd6ae00c" +uuid = "f27f6e37-5d2b-51aa-960f-b287f2bc3b7a" +version = "1.3.7+1" + +[[deps.mtdev_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "814e154bdb7be91d78b6802843f76b6ece642f11" +uuid = "009596ad-96f7-51b1-9f1b-5ce2d5e8a71e" +version = "1.1.6+0" + +[[deps.nghttp2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" +version = "1.52.0+1" + +[[deps.oneTBB_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "7d0ea0f4895ef2f5cb83645fa689e52cb55cf493" +uuid = "1317d2d5-d96f-522e-a858-c73665f53c3e" +version = "2021.12.0+0" + +[[deps.p7zip_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" +version = "17.4.0+2" + +[[deps.x264_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "4fea590b89e6ec504593146bf8b988b2c00922b2" +uuid = "1270edf5-f2f9-52d2-97e9-ab00b5d0237a" +version = "2021.5.5+0" + +[[deps.x265_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "ee567a171cce03570d77ad3a43e90218e38937a9" +uuid = "dfaa095f-4041-5dcd-9319-2fabd8486b76" +version = "3.5.0+0" + +[[deps.xkbcommon_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Wayland_jll", "Wayland_protocols_jll", "Xorg_libxcb_jll", "Xorg_xkeyboard_config_jll"] +git-tree-sha1 = "9c304562909ab2bab0262639bd4f444d7bc2be37" +uuid = "d8fb68d0-12a3-5cfd-a85a-d49703b185fd" +version = "1.4.1+1" +""" + +# ╔═║ Cell order: +# ╠═f913ef2c-3097-11ef-1c5c-b37475ff1d33 +# ╠═a0622b2b-b9fe-4805-90d9-d5d9b860c0c6 +# ╠═a9845cb8-ef04-48dc-a4a4-ba8c613d8145 +# ╠═aab37f4c-4c1a-4be2-ae66-c4aa67e16c3d +# ╠═1267030a-70b2-41b3-9d3e-813a14a0cb8f +# ╠═3747275a-dfed-47e3-a4f8-d0067605e816 +# ╠═322d6e4b-999a-4658-a191-6b7ac1ae403d +# ╠═7641560f-23c9-44e3-b4de-84bec08dd388 +# ╠═c54910df-405c-4d00-8cd7-e1dc1015e30c +# ╠═3e925c2a-9b15-45c9-9122-36f7632de56c +# ╠═98f8027f-b2d5-46eb-866b-ba3b1296e3a7 +# ╠═b3faeee5-9d51-418b-b70b-a394a76dc25e +# ╠═4c3aa5c2-088a-492f-a612-a3ba515515bd +# ╠═ea874791-ea70-4bc3-8db6-a3a6aea980b9 +# ╠═009bbf67-ed83-4be9-9e86-c989ca804a3a +# ╠═ca0146f6-8ac8-4167-b9ba-135c08bedd14 +# ╠═48f19828-8ba4-4e5f-a676-37e65b2bbb58 +# ╠═eb8e90a4-29e8-4c9a-b9c9-32d9eb694e37 +# ╠═1180704b-b144-496e-8b2d-eb78facb2c2e +# ╠═40e75117-6d94-487f-9096-051ef9627cdc +# ╠═a277a2c1-2f54-4dd3-9b3a-f14ef682164a +# ╠═4221299c-ad68-4aeb-8aa8-34ab8c8b47be +# ╠═17400d22-22fc-43fc-894b-029252b2eb4a +# ╠═31c4d521-76c7-4e4f-bfbb-726da1fa0d5a +# ╠═c9e944c1-4bca-4938-8276-ddc36c6ec505 +# ╠═e602efbf-0370-4edf-8e2b-25312d250800 +# ╠═36ffa0e5-48b2-4ef2-ab25-3460039a1aae +# ╠═92a3caec-16b9-45b8-851b-bff90ada9e6b +# ╠═084bf722-c287-4821-a402-dbe2969daa04 +# ╠═433d0b84-0570-47c1-921f-384b2ded3c95 +# ╠═0726e0df-96c7-47b9-ad4a-50cf28c6d31e +# β•Ÿβ”€00000000-0000-0000-0000-000000000001 +# β•Ÿβ”€00000000-0000-0000-0000-000000000002 diff --git a/scripts/introduction.jl b/scripts/introduction.jl new file mode 100644 index 00000000..73ce8a5f --- /dev/null +++ b/scripts/introduction.jl @@ -0,0 +1,79 @@ +### A Pluto.jl notebook ### +# v0.19.43 + +using Markdown +using InteractiveUtils + +# This Pluto notebook uses @bind for interactivity. When running this notebook outside of Pluto, the following 'mock version' of @bind gives bound variables a default value (instead of an error). +macro bind(def, element) + quote + local iv = try Base.loaded_modules[Base.PkgId(Base.UUID("6e696c72-6542-2067-7265-42206c756150"), "AbstractPlutoDingetjes")].Bonds.initial_value catch; b -> missing; end + local el = $(esc(element)) + global $(esc(def)) = Core.applicable(Base.get, el) ? Base.get(el) : iv(el) + el + end +end + +# ╔═║ f99b9e24-a7d8-48e5-b71e-a28e6abe2177 +begin + using Pkg + Pkg.activate("..") +end + +# ╔═║ 7b432fab-7e4a-49b7-9ccb-9487001f89a4 +using PlutoUI, Plots + +# ╔═║ 5d71d7a9-4bef-4988-bcab-bce5ad08448f +using Catalyst, DifferentialEquations + +# ╔═║ 2e3f042e-42bb-11ef-326c-f913245163cf +md""" +# Introduction +""" + +# ╔═║ 8f52f63a-43b4-4633-bac4-2f2a5ceb4c05 +oilfield = @reaction_network begin + hill(R, I * v, 20, 1), R --> C # turning resource into capital + hill(R, i, 20, 2), C --> I # invest capital into infrastructure + d, C --> 0 # depreciation of capital + r, I --> 0 # degradation of investment +end + +# ╔═║ ea8b91c5-621a-416f-9423-53f3970b370c +@bind R0 Slider(100:100:1000, default=100, show_value=true) + +# ╔═║ 3bcd4ec4-a65d-4561-b57f-805623d8183c +oilfieldproblem = ODEProblem(oilfield, [:R => R0, :I=>0.0, :C=>10.], (0., 100.), + [:v => 0.05, :i=>0.1, :d=>0.05, :r=>0.2]) + +# ╔═║ 07e15719-a544-4d88-a42c-152a875c2858 +oilfieldproblem |> solve |> plot + +# ╔═║ 0cc6be58-add9-4a58-b532-a43e33da414c +fishery = @reaction_network begin + hill(R, I * v, 20, 1), R --> C # turning resource into capital + hill(R, i, 20, 2), C --> I # invest capital into infrastructure + g * (1-R/R0), R --> 2R # growth of the resource + d, C --> 0 # depreciation of capital + r, I --> 0 # degradation of investment +end + +# ╔═║ d5f1ed22-e9c7-4164-b266-18cea9d15d14 +fisheryproblem = ODEProblem(fishery, [:R => R0, :I=>0.0, :C=>10.], (0., 100.), + [:v => 0.01, :i=>0.03, :d=>0.05, :r=>0.2, :R0=>R0, :g=>0.1]) + +# ╔═║ ed33e20f-cc2c-47e3-add2-298f4b46b8d2 +fisheryproblem |> solve |> plot + +# ╔═║ Cell order: +# ╠═2e3f042e-42bb-11ef-326c-f913245163cf +# ╠═f99b9e24-a7d8-48e5-b71e-a28e6abe2177 +# ╠═7b432fab-7e4a-49b7-9ccb-9487001f89a4 +# ╠═5d71d7a9-4bef-4988-bcab-bce5ad08448f +# ╠═8f52f63a-43b4-4633-bac4-2f2a5ceb4c05 +# ╠═ea8b91c5-621a-416f-9423-53f3970b370c +# ╠═3bcd4ec4-a65d-4561-b57f-805623d8183c +# ╠═07e15719-a544-4d88-a42c-152a875c2858 +# ╠═0cc6be58-add9-4a58-b532-a43e33da414c +# ╠═d5f1ed22-e9c7-4164-b266-18cea9d15d14 +# ╠═ed33e20f-cc2c-47e3-add2-298f4b46b8d2 diff --git a/scripts/model_selection.jl b/scripts/model_selection.jl new file mode 100644 index 00000000..b6e17822 --- /dev/null +++ b/scripts/model_selection.jl @@ -0,0 +1,382 @@ +### A Pluto.jl notebook ### +# v0.20.0 + +using Markdown +using InteractiveUtils + +# ╔═║ 80bc6542-2f0a-11ef-3308-8b1269e840a1 +begin + using Pkg + Pkg.activate("..") +end + +# ╔═║ 04b15fa3-536f-4676-a41e-f1c8147a2c97 +using PlutoUI, Plots + +# ╔═║ 39866945-8759-4034-acdb-0a34a6a26b6d +using Turing, Optim, StatsBase, LaTeXStrings + +# ╔═║ b1653a62-2456-4ec5-bc4d-f0c6be776f1e +using Distributions + +# ╔═║ 0376ff93-2c87-410a-8cf8-65d3c654b503 +md"# Model Selection" + +# ╔═║ 2e4beb9f-068d-498d-99bc-eb7b348a544a +md"## Growth model" + +# ╔═║ 3fa5346f-9e04-4406-b3ed-9e2882a6b3ac +solar_power = [488, 560, 1770, 2115, 2352, 2883, 3045, 3085, 3149, 3563, 3528, 4259, 4678, 6413, 7193] # in GWh, Belgian solar power production + +# ╔═║ 9212be24-0d15-4455-aa0d-eff226737cf9 +years = 2009:2023 + +# ╔═║ 26ddc2b4-591c-44a9-9373-e971cc2218a9 +t, y = 0:length(solar_power)-1, solar_power + +# ╔═║ efc29b29-45e0-44a7-9ab3-168cc4a8a0d8 +scatter(t, y) + +# ╔═║ 14d826a6-5506-4557-b8bc-85a70f961ea6 +@model function linear(t, y) + a ~ Turing.Flat() + b ~ Turing.Flat() + Οƒsq ~ Turing.FlatPos(0) + f = x -> a * x + b + for i in 1:length(y) + y[i] ~ Normal(f(t[i]), √(Οƒsq)) + end + return f +end + +# ╔═║ 6af89987-e8f6-4155-867a-38cafbdd113f +@model function quadratic(t, y) + a ~ Turing.Flat() + b ~ Turing.Flat() + c ~ Turing.Flat() + Οƒsq ~ Turing.FlatPos(0) + f = x -> a * x^2 + b * x + c + for i in 1:length(y) + y[i] ~ Normal(f(t[i]), √(Οƒsq)) + end + return f +end + +# ╔═║ 804e5e78-1831-4c04-a489-86eb7e8b23d1 +@model function exponential(t, y) + C ~ Turing.FlatPos(0) + k ~ Turing.FlatPos(0) + Οƒsq ~ Turing.FlatPos(0) + tmin = minimum(t) + f = x -> C * exp(k * x) + for i in 1:length(y) + y[i] ~ Normal(f(t[i]), √(Οƒsq)) + end + return f +end + +# ╔═║ bb67020b-ce43-46d3-9dde-8fb35fcde7f6 +@model function gompertz(t, y) + a ~ FlatPos(0) + b ~ FlatPos(0) + c ~ FlatPos(0) + Οƒsq ~ Turing.FlatPos(0) + f = x -> a * exp(-b * exp(-c * x)) + for i in 1:length(y) + y[i] ~ Normal(f(t[i]), √(Οƒsq)) + end + return f +end + +# ╔═║ 3c67dadb-875b-4398-bcc4-db53b4eaf813 +@model function verhulst(t, y) + K ~ FlatPos(0) + P0 ~ FlatPos(0) + r ~ FlatPos(0) + Οƒsq ~ Turing.FlatPos(0) + f = x -> K * P0 * exp(r*x) / (K + P0 * (exp(r*x) - 1)) + for i in 1:length(y) + y[i] ~ Normal(f(t[i]), √(Οƒsq)) + end + return f +end + +# ╔═║ 4a0d5500-dec5-46c9-9009-44fc7e2f2366 +@model function unstable_exponential(t, y) + C ~ Turing.FlatPos(0) + k ~ Turing.FlatPos(0) + t0 ~ Turing.Flat() + Οƒsq ~ Turing.FlatPos(0) + tmin = minimum(t) + f = x -> C * (x-t0) * exp(-k * (x-t0)) + for i in 1:length(y) + y[i] ~ Normal(f(t[i]), √(Οƒsq)) + end + return f +end + +# ╔═║ caaf6585-d370-4c81-a9fe-97eb0f3fdd66 +model_zoo = Dict( + "linear" => linear(t, y), + "quadratic" => quadratic(t, y), + "exponential" => exponential(t, y), + "Gompertz" => gompertz(t, y), + "Verhulst" => verhulst(t, y), + "unstable exp." => unstable_exponential(t, y), +) + +# ╔═║ d3ca79db-e156-4eac-8175-aafa80c74098 +logistic = t -> 13 * 2 * exp(1*t) / (13 + 2 * (exp(1*t) - 1)) + +# ╔═║ e564f79f-bba1-499b-adcc-495d6dc9ece0 +model_linear = linear(t, y) + +# ╔═║ a8c66ff0-c401-4308-9966-dccb570289dd +model_quadratic = quadratic(t, y) + +# ╔═║ ece8ac55-8c1e-4a9e-adfb-fd5ccb48bd99 +model_exponential = exponential(t, y) + +# ╔═║ cd182100-51f9-4deb-8911-741975fde98b +model_gompertz = gompertz(t, y) + +# ╔═║ a1732042-4c15-49a5-9218-ab9924dbd5b5 +model_verhulst = verhulst(t, y) + +# ╔═║ c5ce4945-b106-4b02-818d-4fd6993e7a1c +mle_verhulst = optimize(model_verhulst, MLE()) + +# ╔═║ 083ec9d8-d5b8-4c12-8254-aab4c323af2e +coeftable(mle_verhulst) + +# ╔═║ 87218738-418d-4c70-bc54-b6796524affe +mle_exp = optimize(model_exponential, MLE(), NelderMead()) + +# ╔═║ 87a4674c-09f5-47ca-a0b3-64a130595ba6 +coeftable(mle_exp) + +# ╔═║ 65dfbd5c-af8a-40fd-b2e3-4841357efb58 +model_unstab_exp = unstable_exponential(t, y) + +# ╔═║ e8054391-6151-4525-8bc9-2ce5ad4e9c28 +optimize(model_verhulst, MLE()) + +# ╔═║ 654f27e6-accd-4f70-b742-7b1ff80675be +optimize(model_quadratic, MLE()) + +# ╔═║ 98af497f-33e6-480f-9914-97aff274a002 +optimize(linear(t, y), MAP(), LBFGS()) + +# ╔═║ 6beb4f72-3e3c-40c3-a047-55ee0cbb5881 +mle_lin = optimize(linear(t, y), MLE(), BFGS()) + +# ╔═║ 430afbe8-e576-4ed1-beae-cefe3f79d6a7 +mle_lin.lp + +# ╔═║ 4b0eb819-4788-4ef0-a7f4-5fcb948b131a +params(mle_lin) .=> mle_lin.values + +# ╔═║ 96fdb096-e7fa-4721-8249-a63e87ab1244 +NamedTuple(zip(params(mle_lin), mle_lin.values)) + +# ╔═║ 7cba7c60-99ac-4b13-bdeb-e13487b0b6b6 +f = generated_quantities(mle_lin.f.model, NamedTuple(zip(params(mle_lin), mle_lin.values))) + +# ╔═║ ee8980b5-528b-465d-855b-ad17c01ac6c5 +pars = mle_lin.values + +# ╔═║ 8b89da5e-e842-4491-882a-d07cd04c7ecf +generated_quantities + +# ╔═║ ca8a9bad-26dd-4d08-a9f5-ca9ca683bc71 +md" ## Coin example" + +# ╔═║ f61522ad-00a7-447a-a249-0d387050248c +n = 100 + +# ╔═║ 4a37e039-db45-4688-8d29-b1662218db60 +x = 61 + +# ╔═║ 0f9dde78-9921-4bae-a4a7-e784275b82d6 +M1 = Binomial(n, 0.5) + +# ╔═║ 74ebbfe5-2e5f-4505-b5f5-8df50058da82 +M2 = Binomial(n, 0.6) + +# ╔═║ f2eddd98-eaf1-4a7e-99a8-c05a34efe89d +pM1 = pdf(M1, x) + +# ╔═║ 52f00679-3529-410e-ad6c-dd9a36414d6e +pM2 = pdf(M2, x) + +# ╔═║ a5a02d4e-b2d9-4a2f-aa1b-5c6811d6fb6b +KA = pM2 / pM1 + +# ╔═║ ba025f0f-e514-413e-8e7d-917bd64e47fe +prior_p = Beta(14, 10) + +# ╔═║ 8d39ea49-f38d-4be4-90e3-53078652ca45 +dp = 0.01 + +# ╔═║ cc250c89-5c4b-49be-8637-7763e4869605 +pM3 = sum(p->pdf(prior_p, p) * pdf(Binomial(n, p), x) * dp, 0:dp:1) + +# ╔═║ 657dc886-07be-496c-80aa-848565fef4c3 +KB = pM3 / pM1 + +# ╔═║ 35b75da1-97c8-4df7-bdcd-0ee0e1a428ca +md"## Appendix" + +# ╔═║ 56f2b018-de9f-4ad2-abfd-920dc2169983 +TableOfContents() + +# ╔═║ 31127a8d-365b-48c4-bfd8-2f968a72be09 +plots = Dict() + +# ╔═║ 1fc1e71e-1a68-48ad-a8ed-f4d0966a686c +plots["solar_data"] = scatter(years, solar_power, label="", title="Annual photovoltaic power generation in Belgium", xlab="year", ylab="Production [GWh]", color="gold") + +# ╔═║ 51f46a70-99e7-4d6a-b095-8acfcefb962d +let + p = plot(x->2x+1, 0, 5, lw=2, label="linear", xticks=[], yticks=[], xlab="t", title="Models for energy growth") + plot!(x->0.7x^2-0.2x+1, 0, 5, lw=2, ls=:auto, label="quadratic") + plot!(t->exp(t/2), 0, 5, lw=2, ls=:auto, label="exponential") + plot!(t->10exp(-2exp(-2t)), 0, 5, lw=2, ls=:auto, label="Gompertz") + plot!(logistic, 0, 5, lw=2, ls=:auto, label="Verhulst") + plot!(t->10(t+1)*exp(-(t+1)/2), 0, 5, lw=2, ls=:auto, label="unstable exp.") + plots["models"] = p +end + +# ╔═║ d4952d59-fcbd-4408-bbe8-ade98a2806a7 +plots["prior_p"] = plot(p->pdf(prior_p, p), 0, 1, title="Prior on p", xlab=L"p", label="Beta(14, 10)", legend=:left, lw=2) + +# ╔═║ 6c1f29a8-936e-40d3-86fa-ad8424749aa4 +# returns the model (generated quantities) of a MLE/MAP estimate of a model +get_model(mle) = generated_quantities(mle.f.model, NamedTuple(zip(params(mle), mle.values))) + +# ╔═║ bf79061b-5b34-4e0f-a452-a06de8ae5132 +begin + p = scatter(years, solar_power, label="", title="Annual photovoltaic power generation in Belgium", xlab="year", ylab="Production [GWh]", color="gold") + + aics = Dict{String,Float64}() + bics = Dict{String,Float64}() + + for (name, model) in model_zoo + println(name * " :") + mle = optimize(model, MLE()) + println("\tlog-likelihood = $(mle.lp)") + map = optimize(model, MAP()) + println("\tlog-posterior = $(map.lp)") + + k = length(mle.values) + + aic = 2k - 2mle.lp + bic = k * log(length(solar_power)) - 2mle.lp + println("\tAIC : $aic") + println("\tBIC : $bic") + println("\tsigma : $(sqrt(last(mle.values)))") + println("\tk : $k") + + aics[name] = aic + bics[name] = bic + + f_mod = get_model(mle) + tsteps = 0:0.1:20 + preds = f_mod.(tsteps) + years_forecast = tsteps .+ minimum(years) + plot!(p, years_forecast, preds, lw=2, alpha=0.6, ls=:auto, label=name) + end + plots["solar_forecast"] = p + +end + +# ╔═║ bb021c5f-8157-4c94-a385-ee1c7a1dc5cb +begin + aic_min = minimum(values(aics)) + p_model = Dict(name=>exp((aic_min-aic)/2) for (name, aic) in aics) + ptot = sum(values(p_model)) + for (n, p) in p_model + p_model[n] /= ptot + end + p_model +end + +# ╔═║ 59038a15-0ca8-4f77-a7d4-1840b80771ed +for (n, p) in p_model + println("$n : $p") +end + +# ╔═║ 8b7b9fab-2725-4e0c-af68-0687ec5921c1 +plots + +# ╔═║ 1eb4700c-20de-47a5-951d-3900d99461be +# ╠═║ disabled = true +#=╠═║ +for (n, p) in plots + savefig(p, "../figures/model_selection/$n.pdf") +end + ╠═║ =# + +# ╔═║ Cell order: +# ╠═04b15fa3-536f-4676-a41e-f1c8147a2c97 +# ╠═39866945-8759-4034-acdb-0a34a6a26b6d +# ╠═80bc6542-2f0a-11ef-3308-8b1269e840a1 +# ╠═0376ff93-2c87-410a-8cf8-65d3c654b503 +# ╠═2e4beb9f-068d-498d-99bc-eb7b348a544a +# ╠═3fa5346f-9e04-4406-b3ed-9e2882a6b3ac +# ╠═9212be24-0d15-4455-aa0d-eff226737cf9 +# ╠═1fc1e71e-1a68-48ad-a8ed-f4d0966a686c +# ╠═26ddc2b4-591c-44a9-9373-e971cc2218a9 +# ╠═efc29b29-45e0-44a7-9ab3-168cc4a8a0d8 +# ╠═14d826a6-5506-4557-b8bc-85a70f961ea6 +# ╠═6af89987-e8f6-4155-867a-38cafbdd113f +# ╠═804e5e78-1831-4c04-a489-86eb7e8b23d1 +# ╠═bb67020b-ce43-46d3-9dde-8fb35fcde7f6 +# ╠═3c67dadb-875b-4398-bcc4-db53b4eaf813 +# ╠═4a0d5500-dec5-46c9-9009-44fc7e2f2366 +# ╠═caaf6585-d370-4c81-a9fe-97eb0f3fdd66 +# ╠═51f46a70-99e7-4d6a-b095-8acfcefb962d +# ╠═d3ca79db-e156-4eac-8175-aafa80c74098 +# ╠═bf79061b-5b34-4e0f-a452-a06de8ae5132 +# ╠═bb021c5f-8157-4c94-a385-ee1c7a1dc5cb +# ╠═59038a15-0ca8-4f77-a7d4-1840b80771ed +# ╠═e564f79f-bba1-499b-adcc-495d6dc9ece0 +# ╠═a8c66ff0-c401-4308-9966-dccb570289dd +# ╠═ece8ac55-8c1e-4a9e-adfb-fd5ccb48bd99 +# ╠═cd182100-51f9-4deb-8911-741975fde98b +# ╠═a1732042-4c15-49a5-9218-ab9924dbd5b5 +# ╠═c5ce4945-b106-4b02-818d-4fd6993e7a1c +# ╠═083ec9d8-d5b8-4c12-8254-aab4c323af2e +# ╠═87218738-418d-4c70-bc54-b6796524affe +# ╠═87a4674c-09f5-47ca-a0b3-64a130595ba6 +# ╠═65dfbd5c-af8a-40fd-b2e3-4841357efb58 +# ╠═e8054391-6151-4525-8bc9-2ce5ad4e9c28 +# ╠═654f27e6-accd-4f70-b742-7b1ff80675be +# ╠═98af497f-33e6-480f-9914-97aff274a002 +# ╠═6beb4f72-3e3c-40c3-a047-55ee0cbb5881 +# ╠═430afbe8-e576-4ed1-beae-cefe3f79d6a7 +# ╠═4b0eb819-4788-4ef0-a7f4-5fcb948b131a +# ╠═96fdb096-e7fa-4721-8249-a63e87ab1244 +# ╠═7cba7c60-99ac-4b13-bdeb-e13487b0b6b6 +# ╠═ee8980b5-528b-465d-855b-ad17c01ac6c5 +# ╠═8b89da5e-e842-4491-882a-d07cd04c7ecf +# ╠═ca8a9bad-26dd-4d08-a9f5-ca9ca683bc71 +# ╠═b1653a62-2456-4ec5-bc4d-f0c6be776f1e +# ╠═f61522ad-00a7-447a-a249-0d387050248c +# ╠═4a37e039-db45-4688-8d29-b1662218db60 +# ╠═0f9dde78-9921-4bae-a4a7-e784275b82d6 +# ╠═74ebbfe5-2e5f-4505-b5f5-8df50058da82 +# ╠═f2eddd98-eaf1-4a7e-99a8-c05a34efe89d +# ╠═52f00679-3529-410e-ad6c-dd9a36414d6e +# ╠═a5a02d4e-b2d9-4a2f-aa1b-5c6811d6fb6b +# ╠═ba025f0f-e514-413e-8e7d-917bd64e47fe +# ╠═d4952d59-fcbd-4408-bbe8-ade98a2806a7 +# ╠═8d39ea49-f38d-4be4-90e3-53078652ca45 +# ╠═cc250c89-5c4b-49be-8637-7763e4869605 +# ╠═657dc886-07be-496c-80aa-848565fef4c3 +# ╠═35b75da1-97c8-4df7-bdcd-0ee0e1a428ca +# ╠═56f2b018-de9f-4ad2-abfd-920dc2169983 +# ╠═31127a8d-365b-48c4-bfd8-2f968a72be09 +# ╠═6c1f29a8-936e-40d3-86fa-ad8424749aa4 +# ╠═8b7b9fab-2725-4e0c-af68-0687ec5921c1 +# ╠═1eb4700c-20de-47a5-951d-3900d99461be diff --git a/scripts/modelling_ODEs.jl b/scripts/modelling_ODEs.jl new file mode 100644 index 00000000..fbc6be49 --- /dev/null +++ b/scripts/modelling_ODEs.jl @@ -0,0 +1,917 @@ +### A Pluto.jl notebook ### +# v0.20.3 + +using Markdown +using InteractiveUtils + +# This Pluto notebook uses @bind for interactivity. When running this notebook outside of Pluto, the following 'mock version' of @bind gives bound variables a default value (instead of an error). +macro bind(def, element) + #! format: off + quote + local iv = try Base.loaded_modules[Base.PkgId(Base.UUID("6e696c72-6542-2067-7265-42206c756150"), "AbstractPlutoDingetjes")].Bonds.initial_value catch; b -> missing; end + local el = $(esc(element)) + global $(esc(def)) = Core.applicable(Base.get, el) ? Base.get(el) : iv(el) + el + end + #! format: on +end + +# ╔═║ 093b722d-28af-4219-8546-39a3262146b2 +# ╠═║ skip_as_script = true +#=╠═║ +begin + using Pkg + Pkg.activate("..") +end + ╠═║ =# + +# ╔═║ a52da2c2-f7df-11ee-033f-8500edb3c03f +using Plots, PlutoUI, LaTeXStrings, Latexify + +# ╔═║ 8cff27a7-fde1-4b49-8ad6-513302997a4e +using Catalyst, DifferentialEquations + +# ╔═║ 0686fc66-5428-451f-aa72-c0250ad4bf67 +using Symbolics + +# ╔═║ f61f9ed2-8592-466c-93d0-e2ae59ed1e2e +using ModelingToolkit + +# ╔═║ 7f3a81ae-a285-4fa7-b034-cac9201115bc +using LinearAlgebra + +# ╔═║ dfca2f9f-0134-461c-a18b-f66f2bf02943 +md"# Modelling with ordinary differential equations" + +# ╔═║ 34bec0a1-40e8-48a2-9109-94872aaff1b9 +md"## Balance equations" + +# ╔═║ abebedae-b977-43ae-aaa0-6b00990a5de4 +md""" +### Water tank example + +Water flows with a constant flow $q$ (in m$^3$/h) into a cylindrical with a height $H$ (in m) and a floor area $A$ (in m$^2$). Water leaves the tank with a rate that is proportional to the height of the water: +$$q_\text{out}=rh(t)\,,$$ +Describe the volume $V(t)$ (in m$^3$) using an ODE and solve it when you know that at $t=0$, the tank is empty. + +In this system, we have a "conservation of water": the volume of water in the system is determined by the in-and outgoing flows. Let us consider what happens in a small time step $\Delta t$ and how this impacts a change in volume $\Delta V$: + +$$\Delta V = q \Delta t - rh(t)\Delta t$$ + +We see that the change in water volume in a small time interval is determined by: +- the ingoing flow $q$, which is constant here; +- the outgoing flow, $rh(t)$, which depends on the height, which in turn depends on how full the tank is. Note that, for this geometry, $h(t)=V(t)/A$. + +Putting things together and rearranging, we have: + +$$\Delta V / \Delta t= q - rV(t)/A\,.$$ + +If we take the limit of $\Delta t\rightarrow 0$, we obtain: + +$$\frac{\mathrm{d}V(t)}{\mathrm{d}t}= q - rV(t)/A\,.$$ + +This is a linear first-order differential equation. Its general solution is + +$$V(t)=Ce^{-r/At} + q/r\,,$$ + +and filling in the initial condition $V(0)=0$ allows us to obtain a specific solution to the initial value problem: + +$$V(t)=qA/re^{-rt} + qA/r\,,$$ +""" + +# ╔═║ 0d09ba2e-3cac-4051-b98f-26b79736b225 +q = 10 + +# ╔═║ fdc534e1-e334-48c1-aac4-5a89c47484e0 +A = 1^2 * Ο€ + +# ╔═║ 104ad25e-743b-4f47-8b10-0d3d6715f95c +r = 0.2 + +# ╔═║ 73eb7d0a-5433-4e3d-a008-748db66b8ef9 +md""" +### Coffee example + +A cup of coffee of 0.15 L has an initial temperature of 80 degrees Celsius. The drop in temperature is determined by Newton's law of cooling, which states that the temperature change is proportional to the temperature difference in the environment (with $k$ as the proportionality parameter). Assume 20 degrees Celsius for room temperature ($T_e$). After 2 minutes, we slowly pour 5 cl milk at a temperature of 5 degrees ($T_m$) in the cooling coffee. Pouring in the milk while stirring takes 1 minute. Describe the temperature of the coffee. You can assume the heat capacity and density for coffee and milk are constant and the same. + +Here, we need to keep track of two states: the volume of coffee $V(t)$ and the temperature of the coffee $T(t)$. Both will be needed to describe this stimulating system: we will obtain a system of differential equations! The change in volume is rather simple: + +$$V'(t)=q(t)$$ + +with + +$$q(t)=\begin{cases} +0.05\text{ L/min} & \text{if } 2 \le t < 3 \\ +0 & \text{otherwise} +\end{cases}$$ + + +For the temperature, we have to resort to an energy balance: + +$$\mathrm{d}(C_p\rho V(t)T(t)) = q(t)\rho C_p T_m\mathrm{d}t + \rho C_p kV(t) (T_e - T(t))\mathrm{d}t\,,$$ + +where the density $\rho$ (kg/L) and the specific heat capacity (J/(K $\cdot$kg)). As these are constants appearing in both terms, they can be eliminated. We see that the change in total heat in the system (relative to an arbitrary reference temperature) comprises 1) adding the (cooler) milk and 2) the passive cooling. Expanding the left hand side and dividing by $\mathrm{d}t$ gives: + +$$V(t)\frac{\mathrm{d}T(t)}{\mathrm{d}t} + T(t)\frac{\mathrm{d}V(t)}{\mathrm{d}t} = q(t)T_m + kV(t) (T_e - T(t))$$ + +So, the system can be described by the following set of coupled, nonlinear differential equations: + +""" + +# ╔═║ d3b84441-ed9f-436d-a690-660c5f4b8fbd +function coffee!(du, u, (q, Tmilk, Tenv, k), t) + V, T = u + du[1] = dV = q(t) + du[2] = dT = q(t) * (Tmilk - T) / V + (Tenv - T) * k + return du +end + +# ╔═║ ddd43577-eb2e-4c72-b829-d7195c165ddf +# nog niet correct, want Cp niet in rekening voor wet Newton + +# ╔═║ 10a26b97-8b0a-454e-afbf-141aef4aa04f +qin = t -> 2 ≀ t < 3 ? 5e-2 : 0.0 + +# ╔═║ 0d03953b-6c00-4ffd-abdf-e0540480eb57 +@bind k Slider(0:0.1:2, default=.1) + +# ╔═║ 206dbd4b-2ec0-4591-b7f9-d8e78d568c2f +coffee_prob = ODEProblem(coffee!, [1.5e-1, 80], (0.0, 8.0), (qin, 5, 20, k +)) + +# ╔═║ bf062835-538d-437a-bae6-6309c66ebd19 +coffee_sol = solve(coffee_prob, saveat=0.1, tstops=1.9:0.001:3.3) + +# ╔═║ f3737612-5458-4c6e-a634-246b2cb8cb05 +begin + plot(qin, 0:0.01:8, ls=:dash, label="q [L/min]", color=:red, lw=2, xlab="t", title="Inflow of milk added") + vspan!([2, 3], alpha=0.4, color=:pink, label="") +end + +# ╔═║ d036c1da-2fb7-42b4-81ba-97d40ee2bf8a +md""" +### Tanks in series + +Two tanks, with volumes $V_1$ and $V_2$, are connected in series: what exits in the first tank enters the second tank. Water enters the first tank at a constant flow $q$ but with a variable concentration $c_{in}(t)$ of dissolved organic matter. This first tank has the same outflow $q$ into the second tank from the bulk of the first tank. Both are well-mixed, meaning that we can assume that the concentration of both tanks is uniformly the same. + +In addition, the concentration of the organic matter in the tanks degrades at a rate proportional to their concentration. For the first tank, this rate is proportional to $r_1$ and $r_2$ for the second tank. Give the ODEs that describe the concentrations $C_1(t)$ and $C_2(t)$ of both tanks. + +We can solve this by making a balance of the total amount of organic matter in both tanks. For the first tank, this is + +$$(V_1C_1(t))' = qc_{in}(t) - q C_1(t) - r_1 C_1(t)$$ + +and the second tank + +$$(V_2C_2(t))' = q C_1(t) - q C_2(t) - r_2 C_1(t)$$ + +Note that, because the volumes are constant, we can extract it from the derivative. A bit of algebra allows us to rewrite this as a linear system of ODEs: + +$$\begin{bmatrix}C_1'(t)\\C_2'(t)\end{bmatrix} = \begin{bmatrix}-(q+r_1)/V_1 & 0\\q/V_2 & -(q+r_2)/V_2\end{bmatrix} + \begin{bmatrix}qc_{in}(t)/V_1\\0\end{bmatrix}$$ + +Suppose that + +$$c_{in}(t) = 5\times(1-\cos(2\pi t/24)) \text{ g/L}$$ + +""" + +# ╔═║ 6578e920-8bd8-4adb-aa45-7f601fce20e4 +function tanks!(du, u, (V1, V2, r1, r2, q, cin), t) + C1, C2 = u + du[1] = dV = - (q + r1) / V1 * C1 + q * cin(t) / V1 + du[2] = dT = - (q + r2) / V2 * C2 + q * C1 / V2 + return du +end + +# ╔═║ 071b8f85-75cc-487b-a13f-64428bab7147 +md"## Law of mass action" + +# ╔═║ 8ae850c8-ec2c-4a6c-9c37-1c1f93bb56e9 +function lma_illustration(n, m; Ο΅=0.05, kwargs...) + x1, y1 = rand(n), rand(n) + x2, y2 = rand(m), rand(m) + p = plot(aspect_ratio=:equal, xlim=(0,1), ylim=(0, 1), + xticks=[], yticks=[];kwargs...) + title!(p, "[A] = $n, [B] = $m") + scatter!(x1, y1, label="A") + scatter!(x2, y2, label="B", m=:^) + D = (x1 .- x2').^2 .+ (y1 .- y2').^2 .|> sqrt + d = minimum(D, dims=2) + n_events = count(<(Ο΅), d) + + title!(p, "[A] = $n, [B] = $m\n $(n_events) reaction events") + + ΞΈs = 0:0.1:2Ο€ + for i in 1:n + if d[i] < Ο΅ + x, y = x1[i], y1[i] + plot!(p, x.+Ο΅.*cos.(ΞΈs), y.+Ο΅.*sin.(ΞΈs), + ls=:dash, color=:red, alpha=0.5, label="") + end + end + return p +end + +# ╔═║ c01904be-7ee0-4b43-bd29-6fac1e38b3c6 +rn = @reaction_network begin + k1, A + B --> C + k2, C --> B + k3, A + A --> B + C +end + +# ╔═║ 689f9c80-5680-4cc5-a60d-bacd846f0925 +species(rn) + +# ╔═║ ad511e07-230f-4405-9613-40f2e55676e6 +parameters(rn) + +# ╔═║ 730255e3-ba36-482c-bff3-8435d348fe40 +reactions(rn) + +# ╔═║ 959b8b64-959a-4869-b499-159eccfa0768 +latexify(rn) |> clipboard + +# ╔═║ 0f19626f-5c0a-4fde-b7b0-824ec624cd96 +convert(ODESystem, rn) + +# ╔═║ 8a752cbe-8220-41f8-997f-f2eb321b2a2b +convert(ODESystem, rn) |> latexify |> clipboard + +# ╔═║ 063f7b0d-c8e6-4128-87f9-d3b5b5139670 +reactionsys = @reaction_network begin + (r1, r1), 2NO <--> N2O2 + r2, N2O2 + H2 --> N2O + H2O + r3, N2O + H2 --> N2 + H2O +end + +# ╔═║ 691b4a76-fc29-4cb9-a3ca-26d03bd84cec +latexify(reactionsys, kind=:ode) |> clipboard + +# ╔═║ 7c4e736b-fac7-47c1-b73c-ef7d46151e15 +convert(ODESystem, reactionsys) |> latexify |> clipboard + +# ╔═║ 2b80012d-78c8-4cd3-9b8b-6d0177afa963 +reactsyst_prob = ODEProblem(reactionsys, + [:NO=>5.2, :H2O=>0, :H2=>5.1, :N2O2=>0, :N2O=>0, :N2=>0], # initial values + (0.0, 60.0), # time interval + [:r1=>1e2, :r2=>0.1, :r3=>50]) # parameter values + +# ╔═║ 7ad626ab-12a5-4a53-9991-7512de5092fb +#g = Graph(reactionsys) + +# ╔═║ ca2304c8-9a09-4063-9478-2207925d6444 +reactionsys2 = @reaction_network begin + r * NO^2 * H2, 2H2 + 2NO => 0 +end + +# ╔═║ bbfd0201-c25e-446e-828e-6632a7e0c116 +convert(ODESystem, reactionsys2) |> latexify |> clipboard + +# ╔═║ c77660bc-a478-45d4-8d8b-c5147d70b123 +tank = @reaction_network begin + @species V(t)=0 + @parameters q=1 A=0.5^2*pi + q, 0 --> V # incoming water + r / A, V --> 0 # emptying +end + +# ╔═║ a5177857-d6e4-4004-92e1-34bbfb42de53 +growth1 = @reaction_network begin + @species B(t)=1 + @parameters r=log(2) + r, B --> 2B +end + +# ╔═║ e6b6eefb-6b29-4ac1-b3b7-769040252f3e +growth2 = @reaction_network begin + @species B(t)=1 + @parameters r=log(2) K=1e3 + r * (1-B/K), B --> 2B +end + +# ╔═║ b16be4b8-8ae7-4edf-9912-3c828d85d0c7 +growth3 = @reaction_network begin + @species B(t)=1 + @parameters r=log(2) K=1e3 + r, B --> 2B + r/K, B + B --> 0 +end + +# ╔═║ fa828b69-5b17-47cf-8461-7cc025d64501 +plot(solve(ODEProblem(growth3, [], (0., 20.))), lw=2, title="Logistic growth") + +# ╔═║ d71fccaa-e8ed-4943-9659-d51d34a10bba +lotka_volterra = @reaction_network begin + Ξ±, x --> 2x # reproduction prey + Ξ², y --> 0 # mortality pred + Ξ³, x + y --> y + Ξ΄ * y # predation +end + +# ╔═║ dfb27358-b5ab-443f-8f61-ff4bafc25b02 +lv_sys = convert(ODESystem, lotka_volterra, combinatoric_ratelaws=false) + +# ╔═║ cd632750-68e4-48de-91be-1fc6c06ffe02 +md"## Process dynamics" + +# ╔═║ 82d65028-e90a-4e91-bf67-d2f8da74134b + + +# ╔═║ 8001cf7b-ffce-48ba-923e-1e630106bf4b +md"### Saturated processes" + +# ╔═║ 7d119d0f-7e10-474e-b802-e7f91eb01ec4 +michaelis_menten_kinetics = @reaction_network begin + (k₁, k₋₁), E + S <--> ES + kβ‚‚, ES --> E + P +end + +# ╔═║ e1e6362e-bf87-46a8-9191-97e5a121a454 +@bind Ks Slider(0:0.1:5, default=1, show_value=true) + +# ╔═║ 8578c4f3-d72f-402e-b886-d34b14b95705 +@bind vmax Slider(0:0.1:5, default=1, show_value=true) + +# ╔═║ b8c26bea-b775-4ae2-a65d-edefa2f11c4f +convert(ODESystem, michaelis_menten_kinetics) + +# ╔═║ 52e846e3-b507-4c84-bedb-ce55207c6e2a +latexify(michaelis_menten_kinetics, form=:ode) |> clipboard + +# ╔═║ 5086bbf0-005c-47f8-81bb-029f5cf40614 +@variables k₁ k₋₁ ES Eβ‚œ S kβ‚‚ v_m K_s + +# ╔═║ 4fe3971f-0786-48f7-adbb-147c37b7dc24 +eqmm = (k₁ + k₋₁) * ES ~ kβ‚‚ * (Eβ‚œ - ES) * S + +# ╔═║ b38ed246-abf9-4808-b9eb-0f003224d98d +Symbolics.symbolic_linear_solve([eqmm], [ES]) + +# ╔═║ 03a01f2e-cf36-426f-9df2-b8d848be7526 +DS = Differential(S) + +# ╔═║ 35e2a2fe-c74a-4f61-bdac-46865f595a56 +v = v_m * S / (K_s+S) + +# ╔═║ b37068e8-1426-40d1-9028-347839605450 +substitute(expand_derivatives(DS(v)), S=>0) + +# ╔═║ f15f67bf-5c82-4503-b292-151549271917 +michealis_menten_direct = @reaction_network begin + mm(S, vmax, Ks), S --> P +end + +# ╔═║ 77830fad-7719-43c0-aeb2-0037b9017c4e +convert(ODESystem, michealis_menten_direct) + +# ╔═║ ba662f0d-7a45-4e90-b067-a57da5069b2b +md"### Hill function" + +# ╔═║ fe75d100-73b1-4f80-a2cb-bea922521365 +@bind n Slider(1:10, default=5) + +# ╔═║ 44be9a88-530d-47d8-bf22-543bcc63b6c5 +md"### Repressor" + +# ╔═║ b3217136-69b5-42f2-a4b5-f16371fcf827 +# time in minutes +repressor = @reaction_network begin + @species R(t)=0 mRNA(t)=0 + hillr(R, vtranscr, Ki, 4) , 0 --> mRNA # transcription + vtransl, mRNA --> mRNA + R # translation + d, mRNA --> 0 # degradation or mRNA + r, R --> 0 # degradation of R +end + +# ╔═║ ef74adcd-c1c2-49ba-b424-8d35881db4f7 +convert(ODESystem, repressor) + +# ╔═║ 19b752fa-aad6-4ee5-a28c-29f36e8496c9 +let + prob = ODEProblem(repressor, [], [0, 200], [:vtranscr=>1.2, :Ki=>5, :d=>1/100, :r=>1/10, :vtransl=>1.2]) + plot(solve(prob), lw=2) +end + +# ╔═║ 46b39ff2-7087-44ad-86b2-f630ec2195cc +md"### Logistic growth" + +# ╔═║ 4c73138a-fab1-405b-a442-007881dfd094 +logistic = @reaction_network begin + @species P(t)=2 + @parameters r=1 K=100 + r, P --> 2P + r/K, 2P --> 0 +end + +# ╔═║ 1955523c-7d60-4e7a-845b-8977dc9b01fb +convert(ODESystem, logistic) + +# ╔═║ 035391fc-09eb-467c-b4cc-27bec87a8120 +two_species_competition = @reaction_network begin + @species A(t)=1.0 B(t)=5.0 + @parameters ra=0.2 rb=0.15 K=100 m=0.1 + ra*(1-(A+B)/K), A --> 2A + rb*(1-(A+B)/K), B --> 2B + m, (A, B) --> 0 +end + +# ╔═║ 5140228d-a479-4232-8303-6f5b0da339d8 +md"## Compartmental models" + +# ╔═║ 350eb38a-4345-460f-89ca-63982ceadcb1 +md"### Pharmacokinetic model" + +# ╔═║ 43140694-0a7d-4fe6-af17-54662c856073 +pharkin = @reaction_network begin + @species B(t)=0 T(t)=0 + k₁, G --> B + kβ‚‚, B --> T +end + +# ╔═║ 4888025a-986f-4d68-88fb-24872d08a465 +convert(ODESystem, pharkin) + +# ╔═║ 8a4c283e-de4c-4ec4-9895-92b891269133 +md"## Cell compartment model" + +# ╔═║ d99d3d04-a384-4486-8817-a0f5c603643c +# transcription and regulation +nuc = @network_component nuc begin + Ξ±, G --> G + M + (ΞΊβ‚Š/V,ΞΊβ‚‹), D + G <--> DG +end + +# ╔═║ 22fc94fa-edbf-4852-bfad-f906f5de3d75 +# translation and dimerization +cyto = @network_component cyto begin + Ξ², M --> M + P + (kβ‚Š/V,kβ‚‹), 2P <--> D + Οƒ, P --> 0 + ΞΌ, M --> 0 +end + +# ╔═║ 15887746-475d-437a-844c-890223b051af +begin +# export reactions, +# Ξ³,Ξ΄=probability per time to be exported/imported +cell_model = @network_component model begin + Ξ³, $(nuc.M) --> $(cyto.M) + Ξ΄, $(cyto.D) --> $(nuc.D) +end + +@named cell_model = compose(cell_model, [nuc, cyto]) +end + +# ╔═║ 478a7d14-e01a-4216-9dc7-a87abc8efe77 +latexify(complete(cell_model)) |> clipboard + +# ╔═║ e346bff6-e406-46a2-b8df-d7746b1c01da + + +# ╔═║ f8e77802-db0a-42b4-9852-2be16186dc99 + + +# ╔═║ ff620b5c-8aa8-4b48-83bd-de533c53f52e +md"### Reactor with dead zone" + +# ╔═║ 17689a8f-6da2-470a-b015-c55098c8a723 +reactor2 = @reaction_network begin + @species Ad(t)=0 B(t)=0 + @parameters V=100 k=0.3 r=0.05 q=1 c=.1 + q*c, 0 --> Am # amount of A entering the bulk + q/(V*(1-f)), Am --> 0 # amount of A leaving the bulk + r, Am --> B # reaction + (k/(V*(1-f)), k/(V*f)), Am <--> Ad # exchange bulk-dead zone +end + +# ╔═║ 2f2398ed-355f-49ff-b5e0-1fa8215b51f6 +convert(ODESystem, reactor2) + +# ╔═║ 40aedd69-a6b0-4f5e-a220-197d2e72d21a +md"f: $(@bind f Slider(0.1:0.1:0.9, default=0.2, show_value=true))" + +# ╔═║ af9e366a-53e7-49d4-9354-44a05fb67888 +let + pars = [:f=>f] + u0 = [:Am=>0] + prob = ODEProblem(reactor2, u0, (0.0, 100.), pars) + sol = solve(prob) + plot(sol, lw=2, ls=:auto, ylab="amount [mol]", title="Reactor with dead zone\nf=$f") +end + +# ╔═║ 2f829ebd-9a8c-41d0-854c-a8407d2b161f +md"### SIR model" + +# ╔═║ 67422772-6ffe-499a-ba86-4cf70fb2fd53 +sir = @reaction_network begin + @species S(t)=50 I(t)=5 R(t)=0 + Ξ², S + I --> 2I + Ξ³, I --> R +end + +# ╔═║ 156385c2-09f6-48cb-bd2d-e3f7c53fac6f +convert(ODESystem, sir) |> latexify |> clipboard + +# ╔═║ e7c84c65-7f49-410e-99d8-b9345b4559d7 +md"### Leslie matrix model" + +# ╔═║ f4acd112-3341-4df2-b7f3-4738bf8b3bb3 +butterfly = @reaction_network begin + @species E(t)=10 C(t)=0 P(t)=0 B(t)=0 + @parameters f=1.5 s=0.05 m=0.05 + s, E --> C + s, C --> P + s, P --> B + m, (E, C, P, B) --> 0 + f, B --> B + E +end + +# ╔═║ 185c1d67-6b68-4f97-bf87-bc75bcc05894 +convert(ODESystem, butterfly) |> latexify |> clipboard + +# ╔═║ 79b13806-4d55-4524-9a43-09e3dc6603a5 +# oefening: draagkracht voor 100 rupsen + +# ╔═║ e0203b11-b75c-4e79-87d0-c74105894aa8 +convert(ODESystem, butterfly) + +# ╔═║ 92d35635-cc1c-4485-8a40-9ca16a3dbee3 +let + pars = [] #[:f=>5, :s=>0.05, :m=>0.12] + prob_sir = ODEProblem(butterfly, [], (0.0, 50.0), pars) + plot(solve(prob_sir), lw=2) +end + +# ╔═║ 380394bf-2c01-4efd-9d8e-6e5b0fe01dfc +netstoichmat(butterfly) + +# ╔═║ ba74ef61-1eda-4494-af29-3979ad2c63ca +matse, _ = ModelingToolkit.linearize(convert(ODESystem, butterfly), [], species(butterfly)) + +# ╔═║ 9864851c-50ff-40b5-bae0-e6b2716cc868 +eigen(matse[:A]) + +# ╔═║ 284a1a32-0d39-4922-8b9e-f0cf882f1eb5 +mats, simplified_sys = ModelingToolkit.linearize_symbolic(convert(ODESystem, butterfly), [], species(butterfly)) + +# ╔═║ bf840c64-056b-47da-b1ba-d11030e31753 +mats[:A] |> latexify |> clipboard + +# ╔═║ 9e99900f-833e-4a9d-8f5c-311b19090446 +simplified_sys + +# ╔═║ 380b6a1d-f5da-4ba9-b7b0-3dbca0e267b8 +md"## Appendix" + +# ╔═║ 07afed5f-6306-4620-98dc-ec729750850b +TableOfContents() + +# ╔═║ c7ee808d-3ec0-4130-b6d1-1fb993178f41 +plots = Dict() + +# ╔═║ e2b7dd60-327c-45fd-a8d7-683b5d4f1274 +plots["tank"] = plot(t->q*A/r - q*A/r*exp(-t*r/A), 0, 50, lw=2, label=L"V(t)", title="Tank filling problem", xlab="t") + +# ╔═║ 34906c24-e13c-422f-b330-bb905c356276 +let + p = plot(coffee_sol, idxs=1, label="V", title="Coffee volume", lw=2) + vspan!([2, 3], alpha=0.4, color=:pink, label="") + plots["coffeevol"] = p +end + +# ╔═║ 0cb4e475-676b-4d9c-9a75-ea0a0659c5b0 +let + p = plot(coffee_sol, idxs=2, label="T [Β°C]", title="Coffee temperature", color=:orange, lw=2) + vspan!([2, 3], alpha=0.4, color=:pink, label="") + plots["coffeetemp"] = p +end + +# ╔═║ 06ba3e44-f2af-45c7-917e-3c8d0ca8ba91 +let + V1 = 200 + V2 = 500 + r1 = 1 + r2 = 0.8 + q = 20 + cin = t-> 10 - 10exp(-t/10) + prob = ODEProblem(tanks!, [0., 0.], (0.0, 100.0), (V1, V2, r1, r2, q, cin)) + sol = solve(prob, saveat=0.1) + plot(cin, 0, 100, label=L"C_{in}(t)", lw=2, title="Tanks in series:\nexponential input") + ylabel!("concentration [g/L]") + plots["tanks_exp"] = plot!(sol, ls=:auto, label=[L"C_1(t)" L"C_2(t)"], lw=2) +end + +# ╔═║ 14be39e9-4f92-43e9-8a9a-6a38a545060b +let + V1 = 200 + V2 = 500 + r1 = 1 + r2 = 0.8 + q = 20 + cin = t -> 5 * (1 - cos(2Ο€ * t / 24)) + prob = ODEProblem(tanks!, [0., 0.], (0.0, 100.0), (V1, V2, r1, r2, q, cin)) + sol = solve(prob, saveat=0.1) + plot(cin, 0, 100, label=L"C_{in}(t)", lw=2, title="Tanks in series:\nsinusoidal input") + plots["tanks_cos"] = plot!(sol, ls=:auto, label=[L"C_1(t)" L"C_2(t)"], lw=2) +end + +# ╔═║ 92e9cb14-2db1-423d-ab97-e99c726844f7 +plots["LMA_50_50"] = lma_illustration(50, 50) + +# ╔═║ a4fb682e-0ae4-4d78-9f27-a3d0a4b6031e +plots["LMA_10_10"] = lma_illustration(10, 10) + +# ╔═║ e57db960-151e-4a49-9e0b-ab60b08a09f4 +plots["LMA_100_100"] = lma_illustration(100, 100) + +# ╔═║ 7ac71bef-c7f8-4a07-bc1f-7416757e70ac +plots["LMA_50_150"] = lma_illustration(50, 150) + +# ╔═║ b9e5e0bf-01a4-4a77-aec9-a081b606c66a +plots["LMA"] = plot(plots["LMA_50_50"], plots["LMA_10_10"], plots["LMA_100_100"], plots["LMA_50_150"], size=(800, 600)) + +# ╔═║ c8da6437-9981-4198-bcb3-9cd081181aa9 +plots["NO_H2"] = plot(solve(reactsyst_prob, Rosenbrock23()), lw=2, ylabel="concentration [mol/L]", ls=:auto, idxs=[1,2,3,4]) + +# ╔═║ ff4a8011-1d9d-4a5a-a89f-7f032f1619e1 +plots["exp_growth"] = plot(solve(ODEProblem(growth1, [], (0., 20.))), lw=2, title="Exponential growth", ylab="population size") + +# ╔═║ 8687a35e-5efd-45b7-b36e-acbe6d3932a3 +plots["log_growth"] = plot(solve(ODEProblem(growth2, [], (0., 20.))), lw=2, title="Logistic growth", ylab="population size") + +# ╔═║ d5e019dc-c8b4-4296-a3c0-921f7dc4a388 +let + lvp = ODEProblem(lotka_volterra, [:x=>1.0, :y=>1.0], (0., 50.), + [:Ξ±=>1.2, :Ξ²=>0.5, :Ξ³=>0.5, :Ξ΄=>.1], combinatoric_ratelaws=false) + plots["LK"] = plot(solve(lvp), lw=2, label=["prey" "predator"], title="Lotka-Volterra model") +end + +# ╔═║ 90e1b464-b025-4b11-8f97-1b6ef20714ed +let + p = plot(x->mm(x, vmax, Ks), 0, 5, lw=2, xlab=L"[S]", ylab=L"v", title="Michaelis-Menten kinetics", label="reaction rate") + hline!([vmax], ls=:auto, lw=2, label=L"v_{max}", alpha=0.6) + plot!([0, Ks, Ks], [.5vmax, .5vmax, 0], ls=:auto, lw=2, label=L"K_s", alpha=0.6) + plot!([0, 1/3], [0, (1/3)*vmax/Ks], label="slope at S=0", ls=:auto, lw=2, alpha=0.6) + plots["MM_default"] = p +end + +# ╔═║ 251cc4df-e800-4945-8923-ffade8a109d0 +let + p = plot(x->mm(x, 1, 1), 0, 5, lw=2, xlab=L"[S]", ylab=L"v", title="Michaelis-Menten kinetics\n parameters", label=L"v_{max}=1, K_s=1") + plot!(x->mm(x, 2, 1), 0, 5, lw=2, ls=:auto, label=L"v_{max}=2, K_s=1") + plot!(x->mm(x, 1, 2), 0, 5, lw=2, ls=:auto, label=L"v_{max}=1, K_s=2") + plot!(x->mm(x, 1, 1/2), 0, 5, lw=2, ls=:auto, label=L"v_{max}=1, K_s=1/2") + plots["MM_pars"] = p +end + +# ╔═║ f1a46e45-bc97-443e-b7a6-9706a24d6ab0 +let + p = plot(x->mmr(x, vmax, Ks), 0, 5, lw=2, xlab=L"[X]", ylab=L"v", title="repressing Michaelis-Menten\nkinetics", label="reaction rate") + hline!([vmax], ls=:dot, lw=2, label=L"v_{max}", alpha=0.6) + plot!([0, Ks, Ks], [.5vmax, .5vmax, 0], ls=:dash, lw=2, label=L"K_s", alpha=0.6) + plots["MMr_default"] = p +end + +# ╔═║ 213e3087-19c5-4226-828b-773fa2dcdbde +let + p = plot(x->hill(x, vmax, Ks, n), 0, 5, lw=2, xlab=L"[S]", ylab=L"v", title="Hill equation", label=("v_max=$vmax, Ks=$Ks, n=$(n)")) + #plot!(x->mm(x, 2, 1), 0, 5, lw=2, ls=:auto, label=L"v_{max}=2, K_s=1") + #plot!(x->mm(x, 1, 2), 0, 5, lw=2, ls=:auto, label=L"v_{max}=1, K_s=2") + #plot!(x->mm(x, 1, 1/2), 0, 5, lw=2, ls=:auto, label=L"v_{max}=1, K_s=1/2") + plots["hill"] = p +end + +# ╔═║ 3402d9fc-b636-4edd-aa42-68f87ca9c012 +let + p = plot(lw=2, xlab=L"[S]", ylab=L"v", title="Hill equation\nvmax=$vmax and Ks=$Ks") + for n in [1, 2, 5, 10] + plot!(x->hill(x, vmax, Ks, n), 0, 5, ls=:auto, label="n=$n", lw=2) + end + plot!(S->vmax*>(S, Ks), 0, 5, label="n=∞", lw=2) + plot!([0, Ks, Ks], [.5vmax, .5vmax, 0], ls=:dash, lw=2, label=L"K_s", alpha=0.6) + + plots["hill_n"] = p +end + +# ╔═║ 6732f82b-79e0-4e31-9b8d-3188246b692d +let + p = plot(x->hillr(x, vmax, Ks, n), 0, 5, lw=2, xlab=L"[S]", ylab=L"v", title="Reverse Hill equation", label=("v_max=$vmax, Ks=$Ks, n=$(n)")) + #plot!(x->mm(x, 2, 1), 0, 5, lw=2, ls=:auto, label=L"v_{max}=2, K_s=1") + #plot!(x->mm(x, 1, 2), 0, 5, lw=2, ls=:auto, label=L"v_{max}=1, K_s=2") + #plot!(x->mm(x, 1, 1/2), 0, 5, lw=2, ls=:auto, label=L"v_{max}=1, K_s=1/2") + plots["hillr"] = p +end + +# ╔═║ 6a5ba438-a5aa-4481-b5cb-472b94dac066 +let + p = plot(lw=2, xlab=L"[S]", ylab=L"v", title="Reverse Hill equation\nvmax=$vmax and Ks=$Ks") + for n in [1, 2, 5, 10] + plot!(x->hillr(x, vmax, Ks, n), 0, 5, ls=:auto, label="n=$n", lw=2) + end + plot!(S->vmax*<(S, Ks), 0, 5, label="n=∞", lw=2) + plot!([0, Ks, Ks], [.5vmax, .5vmax, 0], ls=:dash, lw=2, label=L"K_s", alpha=0.6) + + plots["hillr_n"] = p +end + +# ╔═║ 1d0e45e5-4ef8-46a1-9a7b-f76302889716 +let + p = plot(y->(1-y/100) * y, 0, 120, lw=2, xlab=L"P", ylab="growth", title="Logistic growth", label=L"r=1, K=100") + + vline!([50], ls=:auto, lw=2, label=L"K/2", alpha=0.6) + vline!([100], ls=:auto, lw=2, label=L"K", alpha=0.6) + + plots["logistic"] = p +end + +# ╔═║ 30bbcf76-f92e-4291-aec2-1bfdd89bdc38 +let + prob = ODEProblem(logistic, [], (0.0, 10.0)) + plots["logistic_sol"] = plot(solve(prob), lw=2, title="The logistic equation") +end + +# ╔═║ 1d5f8eb6-edda-4fff-bee0-8b35b3ccdb85 +let + A0, B0 = 1, 5 + plots["comp_A(0)=$(A0)_B(0)=$(B0)"] = plot(solve(ODEProblem(two_species_competition, [:A=>A0, :B=>B0], (0., 100.))), lw=2, title="Two-species competition\n A(0)=$A0; B(0)=$B0", ls=:auto) +end + +# ╔═║ 2f0d5dd8-c724-48da-b61e-1034b7a72781 +let + A0, B0 = 1, 1 + plots["comp_A(0)=$(A0)_B(0)=$(B0)"] = plot(solve(ODEProblem(two_species_competition, [:A=>A0, :B=>B0], (0., 100.))), lw=2, title="Two-species competition\n A(0)=$A0; B(0)=$B0", ls=:auto) +end + +# ╔═║ fdcfd565-349e-4047-842e-32d2dd8329e6 +let + for f in [0.1, 0.33, 0.66] + pars = [:f=>f] + u0 = [:Am=>0] + prob = ODEProblem(reactor2, u0, (0.0, 100.), pars) + sol = solve(prob) + plots["reactor_dead_zone_$(f)"] = plot(sol, lw=2, ls=:auto, ylab="amount [mol]", title="Reactor with dead zone\nf=$f") + end +end + +# ╔═║ 0e2b9af8-9701-4d1c-838d-c289669522d1 +let + Ξ², Ξ³ = 0.03, 0.3 + prob_sir = ODEProblem(sir, [], (0.0, 30.0), [:Ξ²=>Ξ², :Ξ³=>Ξ³]) + plots["sir_beta=$(Ξ²)_gamma=$Ξ³"] = plot(solve(prob_sir), lw=2, title="SIR model\nΞ²=$Ξ² and Ξ³=$Ξ³", ls=:auto) +end + +# ╔═║ ac6c7513-3476-4968-9d6e-eec6d09e019d +let + Ξ², Ξ³ = 0.3, 0.3 + prob_sir = ODEProblem(sir, [], (0.0, 30.0), [:Ξ²=>Ξ², :Ξ³=>Ξ³]) + plots["sir_beta=$(Ξ²)_gamma=$Ξ³"] = plot(solve(prob_sir), lw=2, title="SIR model\nΞ²=$Ξ² and Ξ³=$Ξ³", ls=:auto) +end + +# ╔═║ d408c7dc-4a57-400d-bad2-7ac02cc4fa14 +let + Ξ², Ξ³ = 0.01, 0.3 + prob_sir = ODEProblem(sir, [], (0.0, 30.0), [:Ξ²=>Ξ², :Ξ³=>Ξ³]) + plots["sir_beta=$(Ξ²)_gamma=$Ξ³"] = plot(solve(prob_sir), lw=2, title="SIR model\nΞ²=$Ξ² and Ξ³=$Ξ³", ls=:auto) +end + +# ╔═║ 2f4153cb-5aab-495b-98e8-cbdd8ae99816 +plots + +# ╔═║ 4d4d8bea-faf7-4045-a8a7-fc0e6b92d7ea +length(plots) + +# ╔═║ Cell order: +# ╠═dfca2f9f-0134-461c-a18b-f66f2bf02943 +# ╠═093b722d-28af-4219-8546-39a3262146b2 +# ╠═a52da2c2-f7df-11ee-033f-8500edb3c03f +# ╠═8cff27a7-fde1-4b49-8ad6-513302997a4e +# ╠═34bec0a1-40e8-48a2-9109-94872aaff1b9 +# β•Ÿβ”€abebedae-b977-43ae-aaa0-6b00990a5de4 +# ╠═0d09ba2e-3cac-4051-b98f-26b79736b225 +# ╠═fdc534e1-e334-48c1-aac4-5a89c47484e0 +# ╠═104ad25e-743b-4f47-8b10-0d3d6715f95c +# ╠═e2b7dd60-327c-45fd-a8d7-683b5d4f1274 +# ╠═73eb7d0a-5433-4e3d-a008-748db66b8ef9 +# ╠═d3b84441-ed9f-436d-a690-660c5f4b8fbd +# ╠═ddd43577-eb2e-4c72-b829-d7195c165ddf +# ╠═10a26b97-8b0a-454e-afbf-141aef4aa04f +# ╠═0d03953b-6c00-4ffd-abdf-e0540480eb57 +# ╠═206dbd4b-2ec0-4591-b7f9-d8e78d568c2f +# ╠═bf062835-538d-437a-bae6-6309c66ebd19 +# ╠═34906c24-e13c-422f-b330-bb905c356276 +# ╠═f3737612-5458-4c6e-a634-246b2cb8cb05 +# ╠═0cb4e475-676b-4d9c-9a75-ea0a0659c5b0 +# ╠═d036c1da-2fb7-42b4-81ba-97d40ee2bf8a +# ╠═6578e920-8bd8-4adb-aa45-7f601fce20e4 +# ╠═06ba3e44-f2af-45c7-917e-3c8d0ca8ba91 +# ╠═14be39e9-4f92-43e9-8a9a-6a38a545060b +# ╠═071b8f85-75cc-487b-a13f-64428bab7147 +# ╠═8ae850c8-ec2c-4a6c-9c37-1c1f93bb56e9 +# ╠═92e9cb14-2db1-423d-ab97-e99c726844f7 +# ╠═a4fb682e-0ae4-4d78-9f27-a3d0a4b6031e +# ╠═e57db960-151e-4a49-9e0b-ab60b08a09f4 +# ╠═7ac71bef-c7f8-4a07-bc1f-7416757e70ac +# ╠═b9e5e0bf-01a4-4a77-aec9-a081b606c66a +# ╠═c01904be-7ee0-4b43-bd29-6fac1e38b3c6 +# ╠═689f9c80-5680-4cc5-a60d-bacd846f0925 +# ╠═ad511e07-230f-4405-9613-40f2e55676e6 +# ╠═730255e3-ba36-482c-bff3-8435d348fe40 +# ╠═959b8b64-959a-4869-b499-159eccfa0768 +# ╠═0f19626f-5c0a-4fde-b7b0-824ec624cd96 +# ╠═8a752cbe-8220-41f8-997f-f2eb321b2a2b +# ╠═063f7b0d-c8e6-4128-87f9-d3b5b5139670 +# ╠═691b4a76-fc29-4cb9-a3ca-26d03bd84cec +# ╠═7c4e736b-fac7-47c1-b73c-ef7d46151e15 +# ╠═2b80012d-78c8-4cd3-9b8b-6d0177afa963 +# ╠═c8da6437-9981-4198-bcb3-9cd081181aa9 +# ╠═7ad626ab-12a5-4a53-9991-7512de5092fb +# ╠═ca2304c8-9a09-4063-9478-2207925d6444 +# ╠═bbfd0201-c25e-446e-828e-6632a7e0c116 +# ╠═c77660bc-a478-45d4-8d8b-c5147d70b123 +# ╠═a5177857-d6e4-4004-92e1-34bbfb42de53 +# ╠═ff4a8011-1d9d-4a5a-a89f-7f032f1619e1 +# ╠═e6b6eefb-6b29-4ac1-b3b7-769040252f3e +# ╠═8687a35e-5efd-45b7-b36e-acbe6d3932a3 +# ╠═b16be4b8-8ae7-4edf-9912-3c828d85d0c7 +# ╠═fa828b69-5b17-47cf-8461-7cc025d64501 +# ╠═d71fccaa-e8ed-4943-9659-d51d34a10bba +# ╠═dfb27358-b5ab-443f-8f61-ff4bafc25b02 +# ╠═d5e019dc-c8b4-4296-a3c0-921f7dc4a388 +# ╠═cd632750-68e4-48de-91be-1fc6c06ffe02 +# ╠═82d65028-e90a-4e91-bf67-d2f8da74134b +# ╠═8001cf7b-ffce-48ba-923e-1e630106bf4b +# ╠═7d119d0f-7e10-474e-b802-e7f91eb01ec4 +# ╠═e1e6362e-bf87-46a8-9191-97e5a121a454 +# ╠═8578c4f3-d72f-402e-b886-d34b14b95705 +# β•Ÿβ”€90e1b464-b025-4b11-8f97-1b6ef20714ed +# β•Ÿβ”€251cc4df-e800-4945-8923-ffade8a109d0 +# ╠═b8c26bea-b775-4ae2-a65d-edefa2f11c4f +# ╠═52e846e3-b507-4c84-bedb-ce55207c6e2a +# ╠═0686fc66-5428-451f-aa72-c0250ad4bf67 +# ╠═5086bbf0-005c-47f8-81bb-029f5cf40614 +# ╠═4fe3971f-0786-48f7-adbb-147c37b7dc24 +# ╠═b38ed246-abf9-4808-b9eb-0f003224d98d +# ╠═03a01f2e-cf36-426f-9df2-b8d848be7526 +# ╠═35e2a2fe-c74a-4f61-bdac-46865f595a56 +# ╠═b37068e8-1426-40d1-9028-347839605450 +# β•Ÿβ”€f1a46e45-bc97-443e-b7a6-9706a24d6ab0 +# ╠═f15f67bf-5c82-4503-b292-151549271917 +# ╠═77830fad-7719-43c0-aeb2-0037b9017c4e +# ╠═ba662f0d-7a45-4e90-b067-a57da5069b2b +# ╠═fe75d100-73b1-4f80-a2cb-bea922521365 +# ╠═213e3087-19c5-4226-828b-773fa2dcdbde +# ╠═3402d9fc-b636-4edd-aa42-68f87ca9c012 +# ╠═6732f82b-79e0-4e31-9b8d-3188246b692d +# ╠═6a5ba438-a5aa-4481-b5cb-472b94dac066 +# ╠═44be9a88-530d-47d8-bf22-543bcc63b6c5 +# ╠═b3217136-69b5-42f2-a4b5-f16371fcf827 +# ╠═ef74adcd-c1c2-49ba-b424-8d35881db4f7 +# β•Ÿβ”€19b752fa-aad6-4ee5-a28c-29f36e8496c9 +# ╠═46b39ff2-7087-44ad-86b2-f630ec2195cc +# ╠═1d0e45e5-4ef8-46a1-9a7b-f76302889716 +# ╠═4c73138a-fab1-405b-a442-007881dfd094 +# ╠═1955523c-7d60-4e7a-845b-8977dc9b01fb +# ╠═30bbcf76-f92e-4291-aec2-1bfdd89bdc38 +# ╠═035391fc-09eb-467c-b4cc-27bec87a8120 +# ╠═1d5f8eb6-edda-4fff-bee0-8b35b3ccdb85 +# ╠═2f0d5dd8-c724-48da-b61e-1034b7a72781 +# ╠═5140228d-a479-4232-8303-6f5b0da339d8 +# ╠═350eb38a-4345-460f-89ca-63982ceadcb1 +# ╠═43140694-0a7d-4fe6-af17-54662c856073 +# ╠═4888025a-986f-4d68-88fb-24872d08a465 +# ╠═8a4c283e-de4c-4ec4-9895-92b891269133 +# ╠═d99d3d04-a384-4486-8817-a0f5c603643c +# ╠═22fc94fa-edbf-4852-bfad-f906f5de3d75 +# ╠═15887746-475d-437a-844c-890223b051af +# ╠═478a7d14-e01a-4216-9dc7-a87abc8efe77 +# ╠═e346bff6-e406-46a2-b8df-d7746b1c01da +# ╠═f8e77802-db0a-42b4-9852-2be16186dc99 +# ╠═ff620b5c-8aa8-4b48-83bd-de533c53f52e +# ╠═17689a8f-6da2-470a-b015-c55098c8a723 +# ╠═2f2398ed-355f-49ff-b5e0-1fa8215b51f6 +# β•Ÿβ”€40aedd69-a6b0-4f5e-a220-197d2e72d21a +# ╠═af9e366a-53e7-49d4-9354-44a05fb67888 +# ╠═fdcfd565-349e-4047-842e-32d2dd8329e6 +# ╠═2f829ebd-9a8c-41d0-854c-a8407d2b161f +# ╠═67422772-6ffe-499a-ba86-4cf70fb2fd53 +# ╠═156385c2-09f6-48cb-bd2d-e3f7c53fac6f +# ╠═0e2b9af8-9701-4d1c-838d-c289669522d1 +# ╠═ac6c7513-3476-4968-9d6e-eec6d09e019d +# ╠═d408c7dc-4a57-400d-bad2-7ac02cc4fa14 +# ╠═e7c84c65-7f49-410e-99d8-b9345b4559d7 +# ╠═f4acd112-3341-4df2-b7f3-4738bf8b3bb3 +# ╠═185c1d67-6b68-4f97-bf87-bc75bcc05894 +# ╠═79b13806-4d55-4524-9a43-09e3dc6603a5 +# ╠═e0203b11-b75c-4e79-87d0-c74105894aa8 +# ╠═92d35635-cc1c-4485-8a40-9ca16a3dbee3 +# ╠═380394bf-2c01-4efd-9d8e-6e5b0fe01dfc +# ╠═f61f9ed2-8592-466c-93d0-e2ae59ed1e2e +# ╠═ba74ef61-1eda-4494-af29-3979ad2c63ca +# ╠═7f3a81ae-a285-4fa7-b034-cac9201115bc +# ╠═9864851c-50ff-40b5-bae0-e6b2716cc868 +# ╠═284a1a32-0d39-4922-8b9e-f0cf882f1eb5 +# ╠═bf840c64-056b-47da-b1ba-d11030e31753 +# ╠═9e99900f-833e-4a9d-8f5c-311b19090446 +# β•Ÿβ”€380b6a1d-f5da-4ba9-b7b0-3dbca0e267b8 +# ╠═07afed5f-6306-4620-98dc-ec729750850b +# ╠═c7ee808d-3ec0-4130-b6d1-1fb993178f41 +# ╠═2f4153cb-5aab-495b-98e8-cbdd8ae99816 +# ╠═4d4d8bea-faf7-4045-a8a7-fc0e6b92d7ea diff --git a/scripts/modelling_distributions.jl b/scripts/modelling_distributions.jl new file mode 100644 index 00000000..821c8ad8 --- /dev/null +++ b/scripts/modelling_distributions.jl @@ -0,0 +1,1345 @@ +### A Pluto.jl notebook ### +# v0.20.3 + +using Markdown +using InteractiveUtils + +# This Pluto notebook uses @bind for interactivity. When running this notebook outside of Pluto, the following 'mock version' of @bind gives bound variables a default value (instead of an error). +macro bind(def, element) + #! format: off + quote + local iv = try Base.loaded_modules[Base.PkgId(Base.UUID("6e696c72-6542-2067-7265-42206c756150"), "AbstractPlutoDingetjes")].Bonds.initial_value catch; b -> missing; end + local el = $(esc(element)) + global $(esc(def)) = Core.applicable(Base.get, el) ? Base.get(el) : iv(el) + el + end + #! format: on +end + +# ╔═║ 2d346892-cb15-11ee-2d81-73e08fcc3288 +# ╠═║ skip_as_script = true +#=╠═║ +begin + using Pkg + Pkg.activate("..") +end + ╠═║ =# + +# ╔═║ cf8dbe5e-d340-4ebb-8ad7-f483be07fffd + using PlutoUI, Plots, LinearAlgebra, Markdown, Random, LaTeXStrings + +# ╔═║ 4d96d7ea-1216-46d6-80fe-5859640eb9c9 +using Distributions + +# ╔═║ 2b79770c-00a8-4c3b-b39e-b31400593ea4 +using Sobol + +# ╔═║ ba4460b1-2855-4695-a3d8-4976666ef164 +using Turing + +# ╔═║ cfc49c56-f223-4b78-b6da-4e0c83a16bbf +md""" +# Monte Carlo methods and modeling with probability distributions + +In this chapter, we study random sampling to obtain certain numerical results that might be challenging to obtain in other ways. Within the context of modelling and simulation, these methods are often referred to as *Monte Carlo methods*. + +For example, suppose you want to estimate $\pi$ using a Monte Carlo method. First, you draw the unit circle ($x^2+y^2=1$). Then, you randomly pick a point in the unit square, i.e., in $[0,1]\times[0,1]$ (like throwing a dart!). The unit square has an area of $1\times 1=1$ and contains a quarter of the circle with an area of $(1/2)^2\pi=\pi/4$. Hence, the probability of a random throw falling in this circle quarter is $\pi/4$. In a simulation using 1000 throws, 751 ended up in the quarter circle. So, our estimate would be 751/1000 = 0.751, which is not too far from $\pi/4\approx 0.7853$. We can improve our estimation accuracy as much as we like by just performing more samples. + +The following recipe gives the general Monte Carlo method: +1. randomly sample a parameter value $\theta\sim P(\theta)$; +2. perform a simulation (called a *throw* or *simulation*) to generate an using the model (i.e. $P(X\mid \theta)$); +3. repeat steps 1 & 2 times to obtain a statistically representative sample; +4. combine all simulation results for statistical analysis. + +""" + +# ╔═║ c469b254-ffc4-458d-8676-db135e11b306 +md"n throws : $(@bind n_pi Slider(1000:1000:100_000, default=5000, show_value=true))" + +# ╔═║ 5e81b02d-a879-4023-a7fe-e6f187a558f1 +n_pi # number of throws + +# ╔═║ 9b3f076f-e50b-4f23-a282-91fac47de21b +md"Generate points in $[0,1]\times[0,1]$." + +# ╔═║ 5db3ed2d-ee29-4cd5-b438-b60d550a6ff8 +x_unif = rand(n_pi) + +# ╔═║ 7d1e1a93-510c-4f81-bb09-d87e3b40e136 +y_unif = rand(n_pi) + +# ╔═║ 5821aaf1-744d-452a-96d2-6516c7423fff +in_circle = x_unif.^2 .+ y_unif.^2 .≀ 1 + +# ╔═║ cb36a752-da05-4da8-8dc8-1c2d34a11ad5 +sum(in_circle) + +# ╔═║ 7c244dc0-6c7b-451e-b7c0-da25a77da657 +pi_est = 4sum(in_circle) / length(in_circle) + +# ╔═║ fe471a6a-5c29-49f6-afba-83be7ab5d770 +Ο€ # true value + +# ╔═║ e0f96ed2-bc51-467e-be3e-8617293e33e2 +md""" +## Revision of basic probability theory + +### Random variables and probability distributions +Let us start with revising the basics of probability theory. We will work with random or stochastic variables, usually denoted with a capital letter such as $X$ or $Y$. These can either be *continuous*, i.e., defined over the reals or some continuous subset of them, or can be *discrete*. The outcome of a random variable, for example when one performs an experiment to gain a measurement, will be denoted using the corresponding lowercase letter, here $x$ and $y$. + +Outcomes of random variables are assigned probabilities via probability functions. For discrete random variables, these are called *probability mass functions* (PMF): + +$$p_X(x) = P(X=x)\,,$$ + +which should satisfy that for every $x$ it holds that $p_X(x)\ge 0$ (probabilities are non-zero) and $\sum_x p_X(x) = 1$ (probabilities should be normalized). For example, for a simple fair die, the outcomes $x$ are $\{1,2,3,4,5,6\}$ with respective probabilities $\{1/6,1/6,1/6,1/6,1/6,1/6\}$. +""" + +# ╔═║ 12df460c-a547-410f-ac1c-90d41c8a37f1 +md"Much of our work will however deal with continuous variables, which are characterized using *probability density functions* (PDF) $f_X(x)$, which likewise are non-negative and normalized: + +$$\int_{-\infty}^\infty f_X(x) \mathrm{d}x = 1\,.$$ + +For example, we take a Weibull distribution:" + +# ╔═║ c0677edb-29a4-4c4d-8ca7-9d81eac05c85 +dist = Weibull(2, 7) + +# ╔═║ d786da44-5cfc-4c36-ae41-af6f623d5a4e +pdf(dist, 5.0) # density in x=5.0 + +# ╔═║ bce61d18-767d-4ae4-a211-759ef3e4da44 +f_X(x) = pdf(dist, x) # handy function for the pdf + +# ╔═║ 1f9b17a8-d8f1-4256-bebc-d5f92e085fe8 +f_X(5.0) + +# ╔═║ fce1c003-6483-44f1-bdbe-c6363d09807b +md""" +A probability density function is a bit harder to relate to probabilities. For example, $f_X(x)$ generally does not give the probability that $X=x$, though $f_X(x)/f_X(x')$ can be interpreted as the ratio probabilities of both both events. In general, probabilities are obtained by integrating to compute the probability of $X$ giving a value in some region $R$: + +$$\int_R f_X(x) \mathrm{d}x = P(X\in R)\,.$$ + +Those who followed a statistics course might have ingrained that for a standard normal distribution, the probability of seeing a value in $[-2,2]$ is 0.954 (hence an approximate 95% confidence interval is the estimate $\pm$ two times the standard error). + +Often, it is easier to work with *cumulative density functions* (CDF), which directly yield probabilities: + +$$F_X(x) = \int_{-\infty}^x f_X(s) \mathrm{d}s = P(X \le x)\,,$$ + +from which one can directly compute useful quantities, such as the probability of observing a value in some interval $[a,b]$: + +$$P(a < X\le b) = \int_a^b f_X(x) \mathrm{d}x= F_X(b)-F_X(a)\,.$$ +""" + +# ╔═║ dd8c1370-5fb9-4ab7-8729-ea756762788d +cdf(dist, 5.0) # P(X ≀ 5) + +# ╔═║ 1882bc65-abca-45b7-8f53-e76360b8dacd +F_X(x) = cdf(dist, x) + +# ╔═║ d04ea704-c9c5-4d57-8908-a7b19b5567a0 +F_X(5) - F_X(1) # P(1 < X ≀ 5) + +# ╔═║ 2538dd4a-96a3-4d4f-b03e-82d2e8b9ea1f +md"x : $(@bind xpdf Slider(0:0.2:20, default=5, show_value=true))" + +# ╔═║ fff75ceb-b21c-49fe-b1c0-0d2f3213b37d +md""" +Most probability distributions have one or more parameters, which are generally lumped as $\theta$. We can write this explicitly as $f_X(x;\theta)$ if we want to stress the parameterization. Familiar examples include the mean and standard deviation of a normal distribution ($\mu$ and $\sigma$) or the rate parameter $\lambda$ of a Poisson distribution. These parameters are either known, or we have to estimate them from data using, for example, the maximum likelihood principle. Or, as we will see later, we can assign probability distributions to the parameters themselves to encode our beliefs what these parameters would be. We will usually omit the dependency on the parameter and just write $f_X(x)$ if the parameters are known. + +Distributions can also be defined over two or more variables. For example, the *joint distribution* of the ensemble $X,Y$ would be written as $f_{XY}(x,y)$. We can obtain the *marginal distribution* of $X$ by integrating over all values of $Y$: + +$$F_X(x) = \int_{-\infty}^\infty f_{XY}(x,y)\mathrm{d}y\,.$$ +""" + +# ╔═║ 6ae427c7-a65e-4f9b-b5a7-8cb523fcd382 +md""" +### Expected value and other moments +A key concept is the *expected value* of a distribution: + +$$E[X] = \int_{-\infty}^\infty xf_X(x) \mathrm{d}x\,.$$ +""" + +# ╔═║ 090d0c6f-de9f-4ce8-befa-4ae9dbe1b38e +mean(dist) + +# ╔═║ 70cfc225-dd83-472c-b745-5266026c3bfc +md""" +Think of this as the center of mass or the first moment of the distribution. One often uses the symbol $\mu$ to denote the expected value. For discrete variables, replace the integral sign with a sum. The expected value is a linear operator (because integrating is a linear operator), so it holds that + +$$E[aX+bY] = aE[X]+bE[Y]\,,$$ + +for any constants $a$ and $b$. + +We are often interested in the expected value of functions of our random variable: + +$$E[g(x)] = \int_{-\infty}^\infty g(x)f_X(x) \mathrm{d}x\,.$$ + +The above identity is sometimes called the *Law of the Unconscious Statistician*. For example, if $X$ represents the distribution of the radii of particles in an emulsion, we might compute the average area or volume. However, $g(\cdot)$ might be much more complex! It could represent a simulator described by a large system of ordinary differential equations, for example, a complex, multi-step industrial process in food industry to process particles into delicious foods. The reader might already feel that in this case it becomes rather hard to compute this integral analytically. +""" + +# ╔═║ 36db4c41-6132-4082-a9e3-18b5560b69d4 +sum(x->4pi * x^2 * pdf(dist, x) * 0.01, 0:0.01:100) + +# ╔═║ 85e08b91-10f9-4808-ac53-195f90387688 +md""" +In addition to the expected value, which measures the location of the distribution, we often want to know the "spread" of the distribution, this is given by the *variance* (often denoted by $\sigma^2$), which is defined as the expected squared difference with the mean: + +$$\text{Var}[X] = E[(X-E[X])^2]\,.$$ + +A little algebra yields the useful formula + +$$\text{Var}[X] = E[X^2] - E[X]^2\,.$$ +""" + +# ╔═║ 36b475e9-a16b-464f-a423-a4fbfbf21ef0 +var(dist) + +# ╔═║ f1ee69eb-d8e5-4a6b-b408-a52d33a09e52 +md"Variance is not a linear operator. If $X$ and $Y$ are *independent*, it holds that + +$$\text{Var}[aX+bY] = a^2\text{Var}[X]+b^2\text{Var}[Y]\,.$$ + +Note that the units of variance also differ. If $X$ is given in $\mu$m, then $\text{Var}[X]$ is given in $\mu$m$^2$. For this reason, one often reports the *standard deviation* $\sigma$, which is the square root of the variance. The latter is easier to interpret, though the variance is easier to compute with." + +# ╔═║ ab4afb22-28e1-4d9e-8d89-a1a9f0741195 +std(dist) + +# ╔═║ 4d6e67d1-42b8-481f-b9fe-3df524d4b07b +sqrt(var(dist)) # same! + +# ╔═║ 2a30c7eb-de92-46a1-ac79-b15529e8f463 +md"The package `Distributions` also have several other convienient functions." + +# ╔═║ 83db8998-125e-4cae-b6fe-1cdddfe3f868 +median(dist) + +# ╔═║ 9f525fef-80b3-4417-85ea-e318ad387985 +mode(dist) + +# ╔═║ d249188a-a298-44b8-8dcb-691753331439 +md""" +### Conditional probabilities +Conditional probabilities allow to update probabilities of events in light of new information. For example: +- Given your probability of having COVID, how does this change when you test positive? +- What is the chance or rolling a six using a fair die, given that you have thrown an even number? +- What is the distribution of length for people who weigh 75 kg? +- What is the distribution of length, given that everyone is greater than 1.8 meter? + +Given two events $A$ (for example, having COVID) and $B$ (for example, testing positive for COVID), the *conditional probability* of $A$ given $B$ is defined as + +$$P(A\mid B) = \frac{P(A\cap B)}{P(B)}\,,$$ + +with $P(A\cap B)$ the chance of $A$ and $B$ occurring simultaneously. In the space of possible events, conditional probabilities "zoom in" to worlds where $B$ happens, hence $P(B)$ is used for renormalizing to probability of $A$ and $B$ happening. + +When modelling, we often know conditional probabilities better than joint probabilities, so this version variant is often used: + +$$P(A\cap B)= P(B\mid A)P(A)\,.$$ + +Keeping our example, we often know from health statistics the $P(A)$, the probability of a random person having COVID, and likewise the reliability a test, the probability of having a positive test given that you have the disease is often also known. Their product is the probability of both having the disease and testing positive. + +We know the the initial probability of a disease ($P(A)$) and the chance a diseased person will test positive ($P(B\mid A)$) is also known. The thing that we are interested in though, is the chance of having the disease, given that we test positive ($P(A\mid B)$)! This probability can be computed by applying the rule for conditional probability twice: + +$$P(A\mid B) = \frac{P(B\mid A)P(A)}{P(B)}\,.$$ + +The above equation is the famous *Bayes' theorem*, one of the most powerful equations in applied mathematics. It allows to flip conditional probabilities and make inferences based on data. Astute readers will notice however that applying this rule is not immediately obvious, we don't know $P(B)$ (chance of testing positive), which will depend on the probability that one has the disease or not and the probabilities and how reliable the test is when the patient has COVID or not! In your course of probability theory, you have seen that you can compute $P(A)$ using the law of total probability for simple cases as this example. For this course, we would like to stress the following: + +> We have $P(A\mid B)\propto P(B\mid A)P(A)$, though the normalization constant may be hard or even impossible to compute! We will need clever algorithms to condition. + +Conditional distributions can also be derived from the joint distribution: + +$$f_{X\mid Y=y}(x,y) = \frac{f_{XY}(x,y)}{f_Y(y)}=\frac{f_{Y\mid X=x}(x,y)f_X(x)}{f_Y(y)}\,.$$ + +Note that to compute the denominator, we need to evaluate +$$\int_{-\infty}^\infty f_{XY}(x,y)\mathrm{d}x\,.$$ + +We can also define conditional expectations (or other quantities): + +$$E[X\mid Y=y]=\int_{-\infty}^\infty xf_{X\mid Y=y}(x) \mathrm{d}x\,.$$ +Often, we shall use $X$ as a variable of interest and $Y$ the outcome of some noisy, indirect measurement of relating to $X$. Conditional probabilities will allow us to learn about $X$ given $Y$. +""" + +# ╔═║ 3b9e8f64-d307-48bc-9a71-1ab9accd134e +md""" +## Sampling from a distribution + +### The Law of Large Numbers + +The process of generating a value of a distribution, either computationally or by performing an experiment, is called *sampling*. A sample $x$ is thus a realization of a random variable $X$ and we will denote this as either +$$x\sim X$$ +or +$$x\sim f_X(x)\,.$$ +depending on the context. In this course, we will be somewhat flexible with our notation. + +If you take a very large number of samples, you expect their histogram (in case of a continuous distribution) of their frequencies closely match the PDF or PMF. One of the most important concepts in probability theory (or science in general) is the *Law of Large Numbers* (LLN): + +> The average of a **large** number of samples from a probability distribution closely matches the expected value of that distribution. + +For an average, one often uses the following notation: + +$$\bar{X}_n =\frac{X_1+ X_2 +\ldots+X_n}{n} = \frac{1}{n}\sum_{i=1}^n X_i\,,$$ + +where $X_1, X_2 ,\ldots,X_n$ represent independent and identically distributed (i.i.d.) draws from $X$. The LLN then states + +$$\bar{X}_n \rightarrow E[X]\,.$$ + +There are two version of this law, the weak and the strong law of large numbers: +- **Weak law** means convergence in probability: $\lim_{n\rightarrow\infty}P(|\bar{X}_n-\mu| < \varepsilon)=1$, for any $\varepsilon > 0$. So no matter how small you take a margin, the average will certainly get closer to the expected value. +- **Strong law** means that the sample average will almost surely converge to the true average: $P(\lim_{n\rightarrow\infty}\bar{X}_n=\mu)=1$. + +Note that the LLN only holds if the mean and variance are finite. For example, what would happen if you wanted to estimate the average mass of objects in our solar system by collecting a large number of them (cars, asteroids, particles, etc.)? Might some objects skew the mean? +""" + +# ╔═║ 1a991ac1-d4ed-4774-a9e2-a5f27f99e1ff +rand(dist) # one sample from a distribution + +# ╔═║ b5b55083-2fe3-4620-9759-8a2329154143 +rand(dist, 10) # ten samples from a distribution + +# ╔═║ f625d656-35de-47cf-985b-3ae9fa54c5d4 +md""" +So, if we have an easy way of sampling from a distribution, we can closely estimate expected values of our distribution. Even better, the Law of the Unconscious Statistician gives us a way of computing $E[g(X)]$ by merely applying our function $g(\cdot)$ to the samples before averaging. The implications are numerous: +- if you want to estimate the probability of $X\in R$, just count the number of occurrences where the samples are in this region; +- the sample variance will also approximate the true variance; +- a histogram will converge to the PDF, as the bin heights correspond the to expected fraction of observations in this interval. + +The difference between this course and your statistics course, is that while statisticians are very worried about how close their sample average is to the true population average (because experiments are expensive, so there usually are a limited number of observations) we will have a much more causal life view. Since our simulations are done _in silico_, they are (relatively) cheap, so we assume that we have enough observations that are close to the expected value we are interested in.""" + +# ╔═║ 482d1da0-3415-425c-84de-69f7fb821934 +g(r) = 4Ο€ * r^2 # area sphere + +# ╔═║ 7008afc0-785e-45a8-9b6d-5b8f26bae09d +dr = 1e-4 + +# ╔═║ 64e0265f-a621-495f-b73a-0af23b0ef1ac +AΜ„_integrate = sum(r->g(r) * pdf(dist, r) * dr, 0:dr:50) + +# ╔═║ 18a1b129-eac5-4080-8af9-7d9fbf800107 +g(mean(dist)) # g(E[X]) + +# ╔═║ 5a1522f7-411d-40f5-92e8-b5a154b8d735 +AΜ„_sampling = mean(g, rand(dist, 100_000)) # E[g(x)] + +# ╔═║ 8a493f5e-1f1b-4cf5-91e1-5504593cee9d +md""" +### Generating random numbers + +Given a probability distribution, we often want to *sample* from it, meaning that we would like draw random numbers that follow the given probability density or mass function. This practically means that if you make a histogram of a large number of samples from the distribution, you expect this to follow the PDF closely. Usually, one departs from random numbers from the uniform distribution in $[0, 1]$. For example, to generate a Bernoulli variable with $p=0.1$, one just takes a threshold on the uniformly randomly distributed number. + +For simple distributions, one can use *inverse transform sampling* where one uses the inverse of the CDF $F_X$ (which can either be computed analytically or represented numerically) to transform a number $U\sim \text{Unif}(0,1)$ into $F^{-1}_X(U)$. The resulting sample follows the distribution of $X$, as can easily be shown: + +$$P(F^{-1}_X(U)\le x) = P(U\le F_X(x))=F_X(x)\,.$$ +Libraries to work with probability distributions usually implement optimized methods for sampling from the standard distributions. + +In addition to inverse transform sampling, there exist a plethora of specialized sampling methods. Consider the normal distribution as an important special case. The *Box–Muller transform* generates two standard normally distributed values from two independent samples $U_1$ and $U_2$ from $\text{Unif}(0,1)$: + +$$Z_1=\sqrt{-2\log U_1}\cos(2\pi U_2)$$ +$$Z_2=\sqrt{-2\log U_2}\sin(2\pi U_1)$$ +""" + +# ╔═║ 03b2b204-5e4b-4d25-8c32-453a5c51926f +md"$$P(F^{-1}_X(U)\le x) = P(U\le F_X(x))=F_X(x)\,.$$ +Libraries to work with probability distributions usually implement optimized methods for sampling from the standard distributions. + +In addition to inverse transform sampling, there exist a plethora of specialized sampling methods. Consider the normal distribution as an important special case. The *Box–Muller transform* generates two standard normally distributed values from two independent samples $U_1$ and $U_2$ from $\text{Unif}(0,1)$: + +$$Z_1=\sqrt{-2\log U_1}\cos(2\pi U_2)$$ +$$Z_2=\sqrt{-2\log U_2}\sin(2\pi U_1)$$" + +# ╔═║ 6167f6cd-547d-4046-b1b2-600e5fc5ac0e +let + n = 20 + + u1 = rand(n) + u2 = rand(n) + p = plot(title="Box-Muller transform", aspect_ratio=:equal, xlims=[-3, 3], ylims=[-3, 3]) + + z1 = @. √(-2log(u1)) * cos(2Ο€*u2) + z2 = @. √(-2log(u2)) * sin(2Ο€*u1) + for i in 1:n + plot!([u1[i], z1[i]], [u2[i], z2[i]], label="", color=:red, alpha=0.6, ls=:dash, lw=2) + end + scatter!(u1, u2, xlab=L"x", ylab=L"y", color="gold", label=L"u_1,u_2") + scatter!(z1, z2, m=:^, label=L"z_1,z_2") +end + +# ╔═║ dc7eb2b3-b160-4943-84e9-8cf20d687d93 +md"Standard normal numbers are available in Base julia:" + +# ╔═║ 2d3e09ff-3766-46d5-abdd-4132c4fa06b9 +randn() + +# ╔═║ 3ecfb175-0c26-419e-9770-d406cd1dd2dc +rand(10) + +# ╔═║ 9ba45ba1-f2d3-4d08-a3e7-2ed8730e3d90 +md"Of course, you can also access them via Distributions:" + +# ╔═║ e67e0b43-1346-4d7c-8bcc-ca53949412b8 +normal = Normal(0, 1) # standard normal + +# ╔═║ ac78fddb-0b24-4956-8137-44615721bc06 +rand(normal) + +# ╔═║ 44ca88b0-4256-4123-93f8-82d1ba3b3b77 +rand(normal, 10) + +# ╔═║ 896da840-ad94-40d7-8a65-be92b174e88b +md""" + +In the next chapter, we will consider how to sample from much more complex, composite distributions. + +One might wonder how to obtain samples of $U$ in the first place! This is especially challenging on a computer, which is a deterministic machine. In practice, the random number one obtains are *pseudorandom numbers*, which result from an algorithm that generates a sequence of numbers that look random (i.e., have no statistically detectable patterns) but can be fully predicted if one has the algorithm and the starting value. This starting value is called the *seed*. One of the most frequently used psuedorandom generators is the *Mersenne Twister*, which generates a sequence of numbers based on the eponymous Mersenne primes (primes that can be written as $2^n-1$). For numerical simulations or statistical analyses using pseudorandom numbers, one often fixes the seed at the beginning of the script such that the results can be reproduced exactly. (Some students forget to set different seeds when running simulations of different cores of a cluster computer and learn to their horror that their overnight Monte Carlos simulations have all returned exactly the same result). + +For some specialized statistical studies or when safety is of concern, such as cryptography, pseudorandom numbers might not suffice, they require *true random numbers*. Such numbers can only be obtained by having a physical proces that is stochastic, such as throwing a die. One can buy *hardware random number generators* that convert a noise source, such as electrical noise or quantum processes, into random numbers. Some websites, such as https://www.random.org/ offer true random numbers based on atmospheric fluctuations for lotteries, passwords or other applications. True random number are, just like pseudorandom numbers, expensive to generate, so their free access is limited. + +For some applications, (pseudo-)random numbers are too random! This is because there are likely to cover the space uniformly in expected values (and hence only for large samples). For some Monte-Carlo application, such as estimating a volume in a space, one needs numbers that cover the space a bit more homogeneously. These are called low-discrepancy or *quasi-random numbers*. These would fail tests to check if they are random because they often look too 'regular'. One method to generate such numbers is the *Sobol method*. If we compare pseudo- and quasi-random numbers for estimating $\pi$ using simple rejection sampling, we see that the latter often converges faster. +""" + +# ╔═║ 3b5df17c-7110-4a6f-926b-6c6f6621b575 +let + n = 50 + p = plot(legend=false, title="10 series of $n random numbers in U(0,1)") + for i in 1:10 + scatter!(rand(n), i*ones(n), yaxis=false, alpha=0.8) + end + p +end + +# ╔═║ a8f762eb-e3b6-434a-9526-8f58ae227ae5 +md""" +### Convergence of the mean + +Finally, let us consider how many samples we would need so that the average is "close" to the expected value. Remember, the spread of a random variable can be quantified using the variance: + +$$ +\text{Var}[\bar{X}_n] = \frac{1}{n^2}\sum_{i=1}^n \text{Var}[X_i] = \frac{\text{Var}[X]}{n}\,. +$$ +Again, tactically assuming finite variances, we see that the variance of the mean scales inversely with the sample size or the standard error on the mean scales with $1/\sqrt{n}$. Note, however, that it does not scale with the dimension of the problem. In practice, this means that, to estimate an expected value to one additional significant digit (meaning reducing the standard error with a factor 10), we must generate a 100 times greater sample size! Looking at the graph of the standard error with sample size, we can draw the following conclusion about sampling methods: + +> Sampling methods can easily estimate an expected value up to an order of magnitude below the standard error (tens or hundreds of samples). When large precision is needed, you must generate extreme sample sizes! + +What does this mean, practically speaking? +- Suppose you want to numerically compute an definite integral (i.e. an area), it is very difficult to estimate this accurately using stochastic sampling methods so you better use deterministic numerical integration, such as Gaussian quadrature methods. Such methods can get an extremely impressive exponential error decay in the number of samples for smooth functions: $\mathcal{O}(e^{-n})$. +- However, when simulating, we might already be happy with a modest number of observations. For example, suppose $X$ represents the distribution of rainfall duration and intensity and $g(\cdot)$ is a complicated simulator of the hydraulics of the region, including ecohydrology, sewer systems etc. Obviously, there is a lot of variation in $X$ and $g(X)$. If we take a very modest number of independent 12 samples, we have a standard error of 1/4 of the standard error of $g(X)$, meaning we have a 95% confidence interval with a width of a single standard deviation. For these complex problems (and keeping the inherent error in the models into account) this might already suffice to guide management decisions! + +More quantitatively, one can bound probabilities using concentration bounds, such as Chebyshev's inequality: + +$$P(|X-\mu|\ge k\sigma) \le \frac{1}{k^2}\,,$$ + +or, specifically for using averages: + +$$P(|\bar{X}_n-\mu|\ge k\sigma) \le \frac{1}{nk^2}\,,$$ + +These bounds are extremely general, though in practice weak to the point of being nearly useless. For example, if we want to compute the probability that throwing a fair coin a 100 times gives exactly 50 times head ($p=0.5\times 100$ in a binomial distribution with $\sigma=\sqrt{100\times(0.5\times 0.5)}=5$) we would find that the probability is less than $1/0.1^2=100$, which is not very helpful to say the least... + +The *central limit theorem*, which states that sample averages of i.i.d. distributed values converge to a normal distribution with corresponding mean and standard deviation, is much more accurate. So, here $X$ is approximately distributed as Normal(50, 5). Here, we can easily estimate the probability $P(49.5 0$ | $\lambda$ | Number of events occurring in a fixed interval of time or space. | Number of mutations in a long sequence of DNA. | +| Geometric | $P(X=k) = (1-p)^{k-1}p$ | $k \in \{1, 2, ...\}$ | $p \in (0,1]$ | $\frac{1}{p}$ | Number of trials needed until the first success in Bernoulli trials. | Number of coin flips until the first head. | +| Uniform | $P(X=k) = \frac{1}{b-a+1}$ | $k \in \{a, a+1,\ldots, b-1, b\}$ | $a, b$ | $\frac{a+b}{2}$ | All outcomes in the integers $\{a, a+1,\ldots, b-1, b\}$ are equally likely. | Rolling a fair six-sided die. | + +**Example:** In a given period of time, a biologist is interested in counting the number of fish caught in a specific location. The average rate of fish caught per hour is $\lambda = 3$. The biologist can model the number of fish caught in a certain time interval using the Poisson distribution. The parameter $\lambda$ represents the average rate of events (in this case, catching fish) in a fixed time interval. The PMF of the Poisson distribution allows the biologist to calculate the probability of observing a specific number of fish caught within that time interval. This distribution is useful for studying rare events where the average rate is known and where each event is independent of others, such as counting occurrences of diseases in a population or arrivals at a service counter. +""" + +# ╔═║ 8ae351eb-c1b8-4934-aa48-023f8feba75c +md""" +### Distributions over unbounded real numbers + +| Distribution | PDF | Support | Parameters | $E[X]$ | Meaning | Example | +| ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------ | -------------------------------- | ---------------------------------------- | ----------------------------------------------------------------------------------------- | ----------------------------------------------------------- | +| Normal | $f_X(x) = \frac{1}{\sqrt{2\pi}\sigma} e^{-\frac{(x-\mu)^2}{2\sigma^2}}$ | $x \in \mathbb{R}$ | $\mu \in \mathbb{R}, \sigma > 0$ | $\mu$ | Models the distribution of a continuous random variable with symmetric bell-shaped curve. | Yearly rainfall | +| Student's t | $f_X(x) = \frac{\Gamma\left(\frac{\nu+1}{2}\right)}{\sqrt{\nu\pi}\Gamma\left(\frac{\nu}{2}\right)} \left(1 + \frac{x^2}{\nu}\right)^{-\frac{\nu+1}{2}}$ | $x \in \mathbb{R}$ | $\nu > 0$ | $0$, for $\nu > 1$, otherwise undefined. | Bell-shaped curve with potential unbounded variance. | Gene expression differences in small groups | +| Cauchy | $f_X(x) = \frac{1}{\pi\gamma(1 + (\frac{x-x_0}{\gamma})^2)}$ | $x \in \mathbb{R}$ | $x_0$, $\gamma$ | Undefined | Heavy-tailed distribution, ratio of two normal distributions. | Exteme events, such as the annual maximum one-day rainfall | +| Laplace | $f_X(x) = \frac{1}{2b} e^{-\frac{x-\mu}{b}}$ | $x \in \mathbb{R}$ | $\mu \in \mathbb{R}, b > 0$ | $\mu$ | Double exponential distibution. | Modelling noise in electronic devices or signal processing. | +The normal or Gaussian distribution is by far the most used probability distribution for unbounded real numbers. The central limit theorem and other justifications are used why many naturally occuring phenomena follow a normal distribution. Indeed, the main bulk of a PDF is often bell-shaped. However, a striking feature of the normal distribution are its very light tail: the log-probability-density decreases quadratically. Encountering events that occurs more than $5\sigma$ from the expected value should only occur with a frequency of $6\times 10^{-7}$, which (as who has invested in the stock market can attest) not very realistic. Extreme events can occur much more frequently than a normal distribution would suggest. Many of these alternative distributions, such as the Laplace distribution have much ticker tails and are more suitable to describe processes with extreme events, such as in climate change. +""" + +# ╔═║ af7119a0-2470-4bf0-8b30-59b38ddd8d5d +md""" +### Distributions over bounded real numbers + +| Distribution | PDF | Support | Parameters | $E[X]$ | Meaning | Example | +| ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------- | ----------------------------------------- | ------------------------------ | -------------------------------------------------------------------------------------------------------- | -------------------------------------------------------- | +| Exponential | $f_X(x) = \lambda e^{-\lambda x}$ | $x \geq 0$ | $\lambda > 0$ | $\frac{1}{\lambda}$ | Models the time between independent Poisson events. | Time between two cell divisions. | +| Gamma | $f_X(x) = \frac{\lambda^k}{\Gamma(k)} x^{k-1} e^{-\lambda x}$ | $x \geq 0$ | $k > 0, \lambda > 0$ | $\frac{k}{\lambda}$ | Sum of $k$ independent exponentially distributed random variables. | Copy number of constitutively expressed protein. | +| Inverse Gamma | $f_X(x) = \frac{\lambda^{\alpha}}{\Gamma(\alpha)} \frac{1}{x^{\alpha+1}} e^{-\frac{\lambda}{x}}$ | $x > 0$ | $\alpha > 0, \lambda > 0$ | $\frac{\lambda}{\alpha-1}$ | Reciprocal of a gamma-distributed random variable. | Modeling the precision of a normal distribution. | +| Log-normal | $f_X(x) = \frac{1}{x \sigma \sqrt{2\pi}} e^{-\frac{(\ln x - \mu)^2}{2\sigma^2}}$ | $x > 0$ | $\mu \in \mathbb{R}, \sigma > 0$ | $e^{\mu + \frac{\sigma^2}{2}}$ | Distribution of a random variable whose logarithm is normally distributed. | Distribution of particle sizes in a powder or a colloid. | +| Uniform | $f_X(x) = \frac{1}{b-a}$ | $x \in [a, b]$ | $a, b \in \mathbb{R}, a < b$ | $\frac{a+b}{2}$ | All outcomes in the interval $[a, b]$ are equally likely. | Generation of random numbers within a range. | +| Triangular | $f_X(x) = \begin{cases} \frac{2(x-a)}{(b-a)(c-a)} & \text{for } a \leq x < c \\ \frac{2}{b-a} & \text{for } c \leq x < b \\ 0 & \text{otherwise} \end{cases}$ | $x \in [a, b]$ | $a, b, c \in \mathbb{R}, a \leq c \leq b$ | $\frac{a+b+c}{3}$ | Continuous probability distribution with lower and upper limits. | Estimation of time to complete a task. | +| Beta | $f_X(x) = \frac{x^{\alpha-1}(1-x^{\beta-1}}{B(\alpha,\beta)}$ | $x\in [0,1]$ | $\alpha>0, \beta > 0$ | $\frac{\alpha}{\alpha+\beta}$ | Distribution over a success probability of a Bernoulli, having seen $\alpha$ success and $\beta$ misses. | Belief of a fraction of mutants. | + +""" + +# ╔═║ 4290b2c6-1f5f-4780-9f32-08ae949b666c +md""" +### MaxEnt: building distributions + +You might wonder how one can come up with sensible probability distributions. One way is using the *maximum entropy principe* (MaxEnt). For any probability function, one can compute the information entropy as: + +$$H(X)=-\int_{-\infty}^\infty f_X(x) \log(f_X(x))\,,$$ + +or, for discrete probability distributions + +$$H(X) = -\sum_ip_i\log(p_i)\,,$$ + +which measures the average degree of "uncertainty", "information" or "surprise" in the distribution. The MaxEnt method finds distributions that have a maximal entropy, given some fixed properties, such as the support, the mean, etc. For example, the normal distribution is the unique distribution with a mean $\mu$ and a variance $\sigma^2$ with the largest entropy. + +Maximum entropy can be motivated by: +1. It yields the least informative distributions with the largestΒ uncertaintyΒ given the data. +2. Nature tends to generate empirical distributions with highΒ entropy. +3. It just works. + +Most of the distributions you know and love can be obtained this way. The MaxEnt principle is used a lot in the life sciences. For example, in ecology in species distribution modelling, one often takes the distribution with the largest entropy that fits the data. +""" + +# ╔═║ 010eaf3e-b4ed-44df-aadc-1c315a835e05 +low_entropy_dist = Categorical([0, 0, 0, 1, 0, 0]) + +# ╔═║ e3a05983-1695-4459-a13a-7a3147dbfcc9 +el = entropy(low_entropy_dist) + +# ╔═║ 93f56253-380f-4fa4-b95d-70b87cb0b604 +Ep = Ξ» -> sum(i*exp(-Ξ»*i) for i in 1:6) / sum(exp(-Ξ»*i) for i in 1:6) + +# ╔═║ 4a9cc597-da77-4d93-b753-248222255df4 +plot(Ep, -0.2, -0.15) + +# ╔═║ d3f4b8ac-4eb9-41a9-bcf6-e06b66b1942e +begin + pme = exp.(0.175*(1:6)) + pme ./= sum(pme) +end + +# ╔═║ 9e877033-a02c-414e-8e52-e4ebdfdf5b71 +high_entropy_dist = Categorical(pme) + +# ╔═║ 94797811-3d8b-4610-b0ee-5b1a912553eb +mean(high_entropy_dist) + +# ╔═║ 74bfaae3-fb0c-471a-aa9a-2d1151ec9b6a +eh = round(entropy(high_entropy_dist), digits=2) + +# ╔═║ 07949347-3e7b-499f-9ca6-c62c131e2a65 +md"## Combining simple distributions into complex ones" + +# ╔═║ 8e7fa947-480d-4037-88a9-652ed7cc2cbd +md""" +### Joint distributions of independent variables + +The easiest way of combining univariate distributions of random variables into a multivariate distribution is by taking an ensemble of independent variables. The joint PDF can then be constructed from the product of the individual variables. So, combining two random variables $X$ and $Y$ the way results in the joint distribution of $X\times Y$: + +$$f_{X\times Y}(x,y) = f_X(x)f_Y(y)\,.$$ + +By definition, conditioning on one variable always leads to the distribution of the other variable because the variables are independent. This follows from the definition: + +$$f_{Y\mid X=x}(y) = \frac{f_{X\times Y}(x,y)}{f_X(x)}= \frac{ f_X(x)f_Y(y)}{f_X(x)} = f_Y(y)\,.$$ + +Using the `Distributions` library, one can create a product distribution of two or more distributions as `product_distribution([dist1, dist2])` (mind the brackets `[]`, the input is a vector of distributions). +""" + +# ╔═║ 1d883714-026b-4206-8ee3-a58e89a70c52 +distX = Laplace(8, 6) + +# ╔═║ 52fd8a26-93a1-4c83-a5fd-4247cdff3629 +distY = TriangularDist(-2, 2, 1) + +# ╔═║ 432c5cd3-a359-4f80-9a78-d8198b100524 +dist_prod = product_distribution([distX, distY]) + +# ╔═║ e495c24a-76d5-4cba-b1f9-76d3e25912d8 +md" x conditioning : $(@bind xslice Slider(-10:0.05:25, default=16, show_value=true))" + +# ╔═║ 46b4ef15-bd34-4b59-aef5-5dc4e1193ec3 +md"y conditioning : $(@bind yslice Slider(-2:0.01:2, default=0, show_value=true))" + +# ╔═║ ffa84522-dd02-47f8-ac3b-b1db08806b2d +md""" +### Mixtures of probability distribitions + +A mixture distribution is an elegant way of combining several simple distributions for a variable (or set of variables) into a more complex distribution. Given $k$ PDFs with as as input $x$, $f_{X_1}(x), \ldots f_{X_k}(x)$, we have the mixture density as: + +$$f(x) = \sum_{i=1}^kw_if_{X_i}(x)\,,$$ + +where the $w_i$'s with $w_i\ge 0$ and $\sum_iw_i=1$ are the mixing coefficients. Think of this as picking one of the PDFs randomly with a probability given by the weight according to categorical distribution (hence, why it was needed to that this could act as a probability vector) and use this one to generate generate a observation according to that distribution. So $w_i$ can be seen as a prior distribution for the components. Mixtures are flexible powerful models! For example, while the humble normal distribution is only a simple unimodal bump, one can combine several normal distributions into a multimodal distribution. For example: +- if you model properties of two populations, such as body weight in a flock of birds containing males and females or canopy size of a group of different species of trees; +- your model might contain a single, sharp peak given by a Gaussian, which you mix with a second distribution with a much larger variance to account for fat tails. + +In `Distributions`, one can easily compose a mixture using `MixtureModel([d1, d2, ...], [w1, w2, ...])`. + +""" + +# ╔═║ 0252887f-b133-426e-82fc-43ac091a7de6 +md"w₁ : $(@bind w1 Slider(0:0.05:1, default=0.2, show_value=true))" + +# ╔═║ 8bfd6e24-27ce-4caf-b68c-b13d89f08337 +w = [w1, 1-w1] + +# ╔═║ e79c0f96-02ca-4ebf-bcc5-0f6e0dc3d7d6 +d1 = Normal(-2, 1) + +# ╔═║ 5a4a0cb6-93b2-4194-8a65-eb84e396b999 +d2 = Normal(3, 2) + +# ╔═║ c580ca85-78ff-4cbc-b033-f0c5acde3193 +dist_mixture = MixtureModel([d1, d2], w) + +# ╔═║ f1906adc-79f7-44da-a085-486e8f46e027 +md""" +Using Bayes' rule, one can estimate the probability that an observation originates from one of the $k$ distributions: + +$$P(\text{sample $x$ originates from component $i$}) = \frac{w_i \times f_{X_i}(x)}{\sum_{i=1}^kw_if_{X_i}(x)}\propto w_i \times f_{X_i}(x)\,.$$ +""" + +# ╔═║ d6cd5202-0171-40f9-bc17-d001dadee567 +md" x : $(@bind xm Slider(-5:0.1:10, default=0, show_value=true))" + +# ╔═║ 89178521-511e-4c53-a2e1-c1d4dad03a23 +md"Mixtures allow for creating complex distributions of more simple variables. We have seen that product distributions are an easy way of combining different random variables $X$, $Y$ into a joint distribution $X\times Y$. They are not very exciting in themselves as there is no dependence between the two variables. However, combining multiple product distributions $X_1\times Y_1$, $X_2\times Y_2$, ... into a mixture, we can introduce some sophisticated dependencies between the variables! This way of combining distributions are sometimes called sum-product networks, for the operations that are used to combine them." + +# ╔═║ 67b154c9-3c14-4eb2-98f2-19f9e3f74d16 +begin + dmv1 = product_distribution([Normal(-2), Normal(-3)]) + dmv2 = product_distribution([Normal(2, 0.7), Normal(3, 2)]) + mvmixture = MixtureModel([dmv1, dmv2], [0.6, 0.4]) +end + +# ╔═║ 9381abbc-3715-4f1a-97cf-2487706e13f6 +md"Or, we can go very crazy!" + +# ╔═║ 36093484-bdd1-4b1b-bd68-39c7b18a9f6b +spn = MixtureModel( + [MixtureModel( + [product_distribution([Normal(10, 1), Normal(20, 1.5)]), + product_distribution([Normal(20, 1.5), Normal(21, 0.8)]), + product_distribution([Uniform(5, 25), Uniform(7, 9)]), + product_distribution([TriangularDist(12, 17), TriangularDist(14, 16, 15.5)]), + product_distribution([Uniform(2, 28), LogNormal(log(27), 0.1)]), + ],[0.3, 0.25, 0.25, 0.15, 0.05]), + product_distribution([Uniform(0, 30), Uniform(0, 30)])], [0.99, 0.01]); + +# ╔═║ 1efe9a9e-cd1b-4fe2-8392-2ce42c871a5f +md"""### The multivariate normal distribution + +The normal distribution is the most used (and, arguably, misused) probability univariate distribution. Similarly, the multivariate normal distribution (MVN) is undoubtedly the most important multivariate probability distribution. A key property of the normal distribution is that any linear combination of two normally distributed variables follows a normal distribution. The MVN defines random vectors for which arbitrary linear projections follow a normal distribution. The pdf in $k$ dimensions is given by + +$$f_{\mathbf {X} }(x_{1},\ldots ,x_{k})={\frac {\exp \left(-{\frac {1}{2}}\left({\mathbf {x} }-{\boldsymbol {\mu }}\right)^{\intercal }{\boldsymbol {\Sigma }}^{-1}\left({\mathbf {x} }-{\boldsymbol {\mu }}\right)\right)}{\sqrt {(2\pi )^{k}|{\boldsymbol {\Sigma }}|}}}$$ + +with $\boldsymbol{\mu}$ is the vector with the mean and $\boldsymbol{\Sigma}$ the covariance matrix, which has to be symmetric and positive-definite (all eigenvalues must be positive) to be valid. + +The MVN can again be motivated from a higher-dimensional case of the Central Limit Theorem or be derived using the MaxEnt principle. The MVN is powerful, as it encodes dependencies between the variables using the covariance matrix. It looks like a well-defined peak that extends in certain directions. Its contours are ellipsis. Intriguingly, the MVN is often both too flexible and not flexible enough: +- For a high number of dimensions $k$, one needs to define $k$ parameters to pinpoint the mean and $k(k-1)/2$ parameters for $\boldsymbol{\Sigma}$. For this reason, the covariance is sometimes considered diagonal (only $k$ parameters) or a scaled identity matrix (one parameter). +- Despite the large number of parameters, the MVN can only capture quite simple patterns: single peaks with only linear dependency between the variables. + +The MVN is key for many, many applied mathematics methods such as statistics, machine learning and control theory, for example, as a building block for the Kalman filter and Gaussian processes. The main reason is that linear transformations of an MVN random vector remain an MVN distributed. Likewise, conditioning is also particularly easy. As this course will predominantly use the sampling approach, we refer to standard works on probability, statistics or machine learning for these formulas. +""" + +# ╔═║ a1aed96d-8839-4c40-9f18-1ca453be740b +ΞΌ = [1, 1] + +# ╔═║ fb6698d6-c565-42f7-ab34-8a4c860f7ef4 +md""" +σ₁: $(@bind σ₁ Slider(0.1:0.2:2, show_value=true, default=1)) + +Οƒβ‚‚: $(@bind Οƒβ‚‚ Slider(0.1:0.2:2, show_value=true, default=2)) + +ρ: $(@bind ρ Slider(-0.95:0.05:0.95, show_value=true, default=0.9)) +""" + +# ╔═║ e0c947b7-306b-42d3-b004-5f37702be73a +Ξ£ = [σ₁^2 σ₁*Οƒβ‚‚*ρ; + σ₁*Οƒβ‚‚*ρ Οƒβ‚‚^2] + +# ╔═║ af983208-c64e-4efe-9322-000b2ce09072 +md""" +### Bayesian hierarchical modeling + +Bayesian hierarchical modeling* is a probabilistic approach approach where the parameters of one probability distribution are themselves treated as random variables and modeled using another distribution. In our notation, this would mean that: + +$$\theta \sim f_\theta(\theta)$$ + +and + +$$X\sim f_X(x;\theta)$$ + +The final joint PDF is given by (see rule for conditional probability): + +$$f_{X,\theta}(x, \theta) = f_X(x;\theta)\,f_\theta(\theta)\,.$$ + +This allows for the incorporation of hierarchical structures, capturing dependencies and variability at multiple levels. This way we create a joint distribution where $X$ depends on $\theta$. It enables the modeling of complex relationships and uncertainties in data by nesting probability distributions within each other. This approach is particularly useful when dealing with hierarchical or structured data, such as grouped data, repeated measurements, or data with varying levels of aggregation. By representing parameters as random variables, Bayesian hierarchical modeling provides a flexible framework for inference and prediction, allowing one to account for uncertainty at different levels of analysis and incorporate prior knowledge effectively. + +For example, suppose one orders packages of chili pepper seeds, usually sold in packages of 10 seeds. Assuming these seeds are similar, every seed has a germination probability $p$, and the number of seeds that germinate can be modeled using a Bernoulli distribution $X\sim$Binom(10, $p$). Now, the germination probability $p$ itself depends on the cultivar (hotter peppers typically have a lower chance of germinating). Suppose that over all cultivars, the germination probability $p\sim$Beta(8, 3). We will typically refer to this as a *prior distribution*. You would be free to invent a more complex model for $p$, maybe taking the specific cultivar into account or even considering the conditions in which the seeds are planted. To take a sample of the ensemble $p, X$ we just follow the flow: +1. sample a $p\sim$Beta(8, 3) +2. sample $X\sim$Binom(10, $p$). +You can see the resulting (marginal distribution) for the number of seeds germinated. + +Though simple, this model above already illustrates something pretty powerful. We have used our prior knowledge about some process (germination success) and have linked this to a concrete experiment that generates data. Using sampling, we can get an accurate picture of the germination frequency over all possible values of $p$ (without integrating!). It already hints to the inverse problem: given that we sow the ten seeds and observe, for example, eight germinating **can we obtain a better distribution for $p$, given this new data**? We will spend much effort to answer these kinds of questions. + +""" + +# ╔═║ e295e21f-40a7-47ae-b680-4831b3d0cdbb +dist_p = Beta(8, 3) + +# ╔═║ cc058abb-e7b6-433e-aacf-13295a401c5f +md"We use a `Turing` model to encode our distribution." + +# ╔═║ f24fffb4-deb7-428a-ba21-0e4999962624 +md"How many packages in this large sample have more than 8 seeds germinating?" + +# ╔═║ 95502761-d344-448a-9259-a1a6079a4a8b +md""" +Let us consider a second example. Precipitation intensity and rainfall duration are linked: more intense rainfalls are shorter. Suppose we model the intensity $X$ (in mm/h) and the rainfall duration $Y$ in h as follows using exponential distributions: + +$$X\sim Exp(10)$$ + +$$Y\sim Exp(2/(2+X))$$ + +We can again sample for the ensemble $X,Y$. By sampling, we can get insight in the total amount of water that pours from the sky during a rainfall (i.e., product of intensity and duration $XY$). (Question: is most of the rain generated by longer, low-intensity rain or short, high-intensity rain)? +""" + +# ╔═║ f3f5595a-e82d-4a9c-b6ab-8dadb553056f +@model function rainfall() + # we can just use names instead of symbols + intensity ~ Exponential(10) + duration ~ Exponential(2 / (2 + intensity)) +end + +# ╔═║ d999582d-5c0e-42df-850f-f7bbe4ccb636 +rainfall_samples = [rand(rainfall()) for i in 1:10_000] + +# ╔═║ 4b96292b-f0ad-48ac-99cd-360c0708ef72 +rainfall_amount = prod.(rainfall_samples) + +# ╔═║ cb903ece-6f36-4840-ad53-1b095f189070 +md""" +Many textbooks describe such hierarchical models a *graphical models*. These are networks where the nodes represent distributions and the links the connections between them. There are many variants, such as Markov random fields (undirected) or (directed) *Bayesian networks*. We focus only on the latter, where distributions are placed in a directed acyclic graph as seen below. + +![](https://upload.wikimedia.org/wikipedia/commons/thumb/e/e2/Example_of_a_Directed_Graph.svg/440px-Example_of_a_Directed_Graph.svg.png) + +You will find it likely not too tricky to sample from Bayesian networks by sampling from the 'root' distributions and working yourself through the graph. We will however use a systematic approach were we will encode our hierarchical distribution in a called "probabilistic program". Probabilistic programming allows one to implement complex hierarchical probability distributions and has convenient methods for sampling from these (the topic of this chapter) and perform inference (the topic of next chapter). There are many probabilistic programming languages. We will use Turing, which is a domain-specific language in Julia. +""" + +# ╔═║ 0681ddf3-0aba-42e2-831d-c5058c417009 +md"Here is a Turing version to estimate $\pi$:" + +# ╔═║ 875cb743-7c6e-4aed-893d-03b969dc4c35 +@model function circle_throw() + # generate a random point in the [-1, 1] Γ— [-1, 1] square + x ~ Uniform(-1, 1) + y ~ Uniform(-1, 1) + # check if (x, y) is in the circle + in_circle ~ Dirac(x^2 + y^2 ≀ 1) # Dirac stores a value +end + +# ╔═║ c12e165f-14b1-4df3-bc88-28ada3bf5add +rand(circle_throw()) + +# ╔═║ b76245bf-a5a4-41f4-a20b-0327280e68e6 +4mean([rand(circle_throw())[:in_circle] for i in 1:10_000]) + +# ╔═║ 9197faa7-603f-4626-b886-a6f71e4111f0 +md"Note that we have used the special `Dirac` distribution, which has a probability mass of 1 when its input is true and zero elsewhere. It is a convenient way of sotoring a value." + +# ╔═║ 43305b47-9e34-40dd-aa5f-fb54410fc45e +md""" +## Putting it all together + +With what we have seen up to now, we approximately answer many interesting questions of probability. To summarize what we have seen: +1. Using the ideas of Bayesian hierarchical modeling, mixture modeling and the like, we can easily create a probabilistic program of complex, joint distributions. +2. Simply by using the `rand` function, we can generate a large number of samples from this distribution. +3. Most questions that we can think of, can be phrased as expected values, which the LLN allows us to estimate by averaging from a large sample. + +Let us revise the pepper seed germination example. What if we want to know the probability that more than eight seed germinate? Using conventional probability, this would boils down to integrating over all values of $p$ + +$$P(X\ge 9) = \sum_{k=9}^{10}\int_0^1f_X(k;p)f_p(p)\mathrm{d}p\,,$$ +which does not look very fun to compute! However, suppose we generate 10,000 samples from this model (so over all possible values of $p$), we can estimate this probability as the fraction in which nine or more seed germinated! We can use the the function `count` to estimate this probability: `count(pX->pX[:X]>8, seed_sample)`, which evaluates (in this run) to 2912, so $P(X>8)\approx 0.2912$. An alternative way would be using the `mean` function, where `mean(g, X)` is equivalent to `mean(g.(X))`. So the same result is obtained using `mean(pX->pX[:X]>8, seed_sample)`. A third way is to use the function `filter`, which works the same way, but just keeps the subset of samples that satisfy the indicator function. So the length of `filter(pX->pX[:X]>8, seed_sample)` retains only samples where $X>8$. + +The `filter` function can be used to create conditional distributions. For example, can we obtain the distribution of $p$ given that $X=8$? This subsample can be obtained using `filter(pX->pX[:X]==8, seed_sample)`. We can plot the histogram of `p` in this subsample to view this distribution! You might find it easier to use this list comprehension to extract these conditional values: +""" + +# ╔═║ b1e85d42-199e-4874-843c-f5aa81728c38 +md"$(@bind ngerm Slider(0:10, default=8))" + +# ╔═║ 6d8c2a59-baf3-45e4-8811-adc7857e1732 +ngerm + +# ╔═║ a0e20b67-3d84-44cf-b12e-8c0b2edba982 +md""" +In this syntax, you can iterate over all values in `seed_sample` and chose which value to retain under what condition! We can compute the conditional mean and variance of `p_cond`, compute the posterior likelihood that $p$ is greater than some value and much more! + +Let us systematically go over the main probabilistic quantities you can compute using a sample $\{x_1,\ldots, x_n\}$ drawn i.i.d. from $X$: +- **Expected values**: Let $g$ be any function, we can estimate $E[g(X)]$ as $\frac{1}{n}\sum_{i=1}^ng(x_i)$, or, in Julia either as `mean(g, Xs)` or, equivalently `mean(g.(Xs))`. For example, the average number of seeds that grow from a package of 10. +- **Probabilities**: In the most general form, we can an event using a function $b(x)$, which either returns 1 if $x$ satisfies the condition of the event or 0 otherwise. This can be computed using expected vales using `mean(b, Xs)`, which computes $P(b(X)=1)=E[b(X)]$. For example, to compute the probability $P(5 < X < 8)$ one would use `mean(x->5 < x < 8, Xs)` or `mean(5 .< Xs .< 8)`. +- **Conditional expectations** of the form $E[g(x)\mid b(x)=1]$, which can be attained using `filter` and `mean`: `mean(g, filter(b, Xs))`. +""" + +# ╔═║ 1ad364c5-b65d-48d7-a829-e284c5e8eebc +md""" +## Appendix πŸ‰ +""" + +# ╔═║ 5614c4b1-2c78-4fee-a480-3998a8e1ce6e +TableOfContents() + +# ╔═║ efd7bcba-f393-4659-ac5b-006740085144 +cummean(x) = cumsum(x) ./ (1:length(x)) + +# ╔═║ 0b9060d0-9c5a-4806-8d68-20e4ffd8f864 +dist2pdf(distribution) = x -> pdf(distribution, x) + +# ╔═║ 7d71303b-defc-4e5f-beee-2bf684674ecf +dist2cdf(distribution) = x -> cdf(distribution, x) + +# ╔═║ 57052ba3-151c-4dda-904a-dac9c421241c +plots = Dict() # storing all the figures + +# ╔═║ 41967e5b-9068-4318-acb6-d958b608c8f7 +let + p = plot(x->sqrt(1-x^2), 0, 1, aspect_ratio=:equal, xlim=[0,1], ylim=[0, 1], lw=2, fillrange=zero, fillalpha=0.3, xlab=L"x", ylab=L"y", label="circle", title="Monte Carlo \nfor estimating Ο€/4", legend=:outertopright) + scatter!(x_unif[in_circle], y_unif[in_circle], ms=0.8, markercolor="orange", markerstrokewidth=0, label="in circle") + scatter!(x_unif[.!in_circle], y_unif[.!in_circle], ms=0.8, markercolor="green", markerstrokewidth=0, label="out of circle") + plots["pi_sample"] = p + p +end + +# ╔═║ 47924cdc-b5bc-4612-949b-d0d23c8c47d9 +let + p = [1, 2, 1, 4, 3, 6] + p /= sum(p) + + pl = plot() + for i in 1:6 + plot!(pl, [i, i], [0, p[i]], label="", ls=:dash, color=:red, lw=2, alpha=0.6) + end + scatter!(p, xlab=L"x", label="PMF", ylab=L"p_X(x)", title="PMF loaded die", color=:blue) + plots["PMF"] = pl +end + +# ╔═║ b9be819e-2db9-4952-9453-98bf815b00e8 +let + pfx = plot(f_X, 0, 20, label="pdf", xlab=L"x", lw=2, ylab=L"f_X(x)") + plot!(pfx, zero, 0, xpdf, fillrange=f_X, fillalpha=0.5, label="P(X≀$xpdf)", title="Probability density function of Weibull distributon") + pFx = plot(F_X, 0, 20, label="cdf", lw=2) + scatter!(pFx, [xpdf], [F_X(xpdf)], label="P(X≀$xpdf)", xlab=L"x", ylab=L"F_X(x)",title="Cumulative density function of Weibull distributon") + p = plot(pfx, pFx, layout=(2,1)) + plots["pdf_cdf"] = p + plots["pdf"] = pfx + plots["cdf"] = pFx + p +end + +# ╔═║ d45fbe7b-168f-4c1e-8ab2-f17665b96938 +plots["area_weibull"]=histogram(g.(rand(dist, 100_000)), xlab=L"x", label=L"4\pi r^2", title="Sampled areas of a Weibull distribution") + +# ╔═║ 7779254a-83b9-4849-957c-af4b62c3916a +let + ps = [] + for n in [10, 100, 1000, 10_000] + p = histogram(rand(dist, n), label="", title="n=$n", normalize=true) + plot!(x -> pdf(dist, x), 0, 20, label="", lw=2) + push!(ps, p) + plots["lln_$(n)"] = p + end + plots["lln"] = plot(ps...) + plot(ps...) +end + +# ╔═║ 7676138b-d99f-4610-b522-ccd6ea625ed4 +savefig( plots["lln"], "lnn.pdf") + +# ╔═║ 73898b6c-d8bd-49a9-ba36-a068e62a7ec3 +let + d = Binomial(30, 0.3) + #d = dist + p = hline([mean(d)], linestyle=:dash, lw=2, color=:red, label=L"E[X]", xlab=L"n", ylabel=L"\bar{X}_n", title="The Law of Large Numbers") + for i in 1:5 + plot!(cummean(rand(d, 250)), lw=2, label="", alpha=0.6) + end + #ylims!(8, 10) + plots["llm_conv"] = p + p +end + +# ╔═║ 4415cdd0-481b-4e14-bda9-d118c0acead5 +let + n = 10 + u = rand(n) + p = plot(x->cdf(dist, x), 0, 20, xlab=L"x", label=L"F_X(x)", xlim=(0,20), lw=2, legend=:bottomright) + + title!("Inverse transform sampling") + x = Float64[] + for ui in u + xi = invlogcdf(dist, log(ui)) + plot!([0, xi, xi], [ui, ui, 0], label="", color=:red, alpha=0.6, ls=:dash, lw=2) + push!(x, xi) + end + scatter!(zeros(n), u, label="draws from U(0,1)", color="gold") + scatter!(x, zeros(n), label="draws from X", m=:^) + plots["inverse_transform_sampling"] = p +end + +# ╔═║ d7e88a1a-73e9-48ff-bb51-2292346f88e0 +let + p = scatter(rand(200), rand(200), label="", title="200 pseudo-random numbers", aspect_ratio=:equal, xlims=[0,1]) + plots["PRN"] = p +end + +# ╔═║ 74e50a3d-7623-45c2-8d3a-2c34f363177e +begin + s = SobolSeq(2) + p = reduce(hcat, next!(s) for i = 1:200)' + pl = scatter(p[:,1], p[:,2], label="", title="200 Sobol quasi-random numbers", aspect_ratio=:equal, xlims=[0,1]) + plots["QRN"] = pl +end + +# ╔═║ a3c7cd83-4488-40a1-8f0f-b79be73afb44 +@model function seed_germ(n=10) + p ~ Beta(8, 3) + X ~ Binomial(n, p) +end + +# ╔═║ 8f13d578-f400-4885-a071-a54259b93f12 +Xp = rand(seed_germ()) # sample from the seed distribution + +# ╔═║ 788193d3-742b-4c27-aad4-41a9024ff0d0 +Xp[:p] # value of p + +# ╔═║ dc668eb0-899a-42dd-901b-bbbde5d3d0dd +Xp[:X] # value of X + +# ╔═║ 03cedb9e-f74e-4662-abc8-e3cc87cad581 +seed_sample = [rand(seed_germ()) for i in 1:10_000] # many samples + +# ╔═║ c6e08f0d-e30e-4d30-989e-2463289ee038 +germination_counts = [Xp[:X] for Xp in seed_sample] # extract X + +# ╔═║ 42867e88-cd02-4634-a225-a9bf0ae46b70 +count(>(8), germination_counts) + +# ╔═║ 13cf931e-5333-46ff-a00a-ea94c0b2e509 +mean(>(8), germination_counts) # P(X > 8) + +# ╔═║ 6d565e90-7aa6-480f-96fb-25c745ec6974 +count(((p, X),)->X>8, seed_sample) + +# ╔═║ 79be0044-9856-4b3b-80e3-6c362e23b9f4 +p_cond = [p for (p, X) in seed_sample if X==ngerm] + +# ╔═║ 18e788ca-5b74-4a0b-81f0-5f307857e7e2 +mean(>(0.9), p_cond) # probability of p > 0.9 given x + +# ╔═║ 037a2175-22b2-48c9-9664-3743b11e8f7c +mean(p_cond), var(p_cond) # mean and variance of the conditional distr. of p + +# ╔═║ 6fe05275-f1f7-4b3f-bbc2-8077bf981391 +length(p_cond) + +# ╔═║ 67594833-14c8-423c-94ce-91ce2a44b6c9 +let + Random.seed!(12) + psob = reduce(hcat, next!(s) for i = 1:1024)' + ppseu = rand(1024, 2) + + pi_sob = pi .- 4cummean(norm.(eachrow(psob)) .≀ 1) .|> abs + pi_pseu = pi .- 4cummean(norm.(eachrow(ppseu)) .≀ 1) .|> abs + + p = plot(pi_pseu, yscale=:log10, label="pseudo-random", xlab=L"n", ylab=L"|E[X]-\bar{X}_n|", lw=2) + plot!(pi_sob, label="quasi-random", lw=2) + title!("Error estimating Ο€ using sampling") + plots["pi_sampling_conv"] = p +end + +# ╔═║ e3d9a5b7-73ec-4c16-8799-2e2a4f99c018 +let + p = plot(n->1/√(n), 1, 100, lw=2, label=L"1/\sqrt{n}", ylab=L"\sigma_{\bar{X}_n}", xlabel=L"n", title="Standard error of the mean") + plots["ste_mean"] = p +end + +# ╔═║ e94fa51a-e1a7-4a1b-88ef-76b38d3a6d74 +let + p = plot(n->1/√(n), 1, 1000_000, lw=2, yscale=:log10, xscale=:log10, label=L"1/\sqrt{n}", ylab=L"\sigma_{\bar{X}_n}", xlabel=L"n", title="Standard error of the mean (log-scale)") + plots["ste_mean_log"] = p +end + +# ╔═║ 222cdcae-5b51-4fdc-a794-11471449ebcd +let +# Binomial + pbin = scatter(k->pdf(Binomial(20, .5), k), 0:25, label="n=25, p=0.5", xlab=L"k", ylab=L"P(X=k)") + scatter!(pbin, k->pdf(Binomial(20, .25), k), 0:25, label="n=25, p=0.25", marker=:^) + title!("Binomial distribution") + plots["binomial_distr"] = pbin + + # Poisson + ppois = scatter(k->pdf(Poisson(1), k), 0:20, label="Ξ»=1", xlab=L"k", ylab=L"P(X=k)") + scatter!(ppois, k->pdf(Poisson(5), k), 0:20, label="Ξ»=5", marker=:^) + scatter!(ppois, k->pdf(Poisson(10), k), 0:20, label="Ξ»=10", marker=:v) + title!("Poisson distribution") + plots["poisson_distr"] = ppois + + # Geometric + pgeo = scatter(k->pdf(Geometric(0.1), k), 1:25, label="p=0.1", xlab=L"k", ylab=L"P(X=k)") + scatter!(pgeo, k->pdf(Geometric(0.2), k), 0:25, label="p=0.2", marker=:^) + scatter!(pgeo, k->pdf(Geometric(0.05), k), 0:25, label="p=0.05", marker=:v) + title!("Geometric distribution") + plots["geom_distr"] = pgeo + + # Geometric + punif = scatter(k->pdf(DiscreteUniform(5, 10), k), 0:30, label="a=5, b=10", xlab=L"k", ylab=L"P(X=k)") + scatter!(punif, k->pdf(DiscreteUniform(10, 25), k), 0:30, label="a=10, b=25", marker=:^) + title!("Uniform distribution") + plots["unif_discr_distr"] = punif + + plot(pbin, ppois, pgeo, punif) +end + +# ╔═║ ebe190e6-da7a-4c88-bd31-b5dc53f6a3e1 +let + # normal + pnorm = plot(xlabel=L"x", ylabel=L"f_X(x)", title="Normal distribution") + for (ΞΌ, Οƒ) in [(0, 1), (2, 1), (0, 2), (-1, 2)] + plot!(x->pdf(Normal(ΞΌ, Οƒ),x),-5, 5, lw=2, label="N($ΞΌ, $Οƒ)", ls=:auto) + end + plots["normal_distr"] = pnorm + + + + +end + +# ╔═║ 3de53132-5b89-483a-872e-4cf1142fc90b +let + # Laplace + plaplace = plot(xlabel=L"x", ylabel=L"f_X(x)", title="Laplace distribution") + for (ΞΌ, ΞΈ) in [(0, 1), (2, 1), (0, 2), (-1, 2)] + plot!(x->pdf(Laplace(ΞΌ, ΞΈ),x),-8, 8, lw=2, label="Laplace($ΞΌ, $ΞΈ)", ls=:auto) + end + plaplace + + plots["laplace_distr"] = plaplace +end + +# ╔═║ 4360ca84-c0bd-4c7a-afbc-edfef5a5f976 +let + dist_trian = TriangularDist(-2, 2) + dist_trian2 = TriangularDist(-2, 2, 1) # non-symmetric + + p = plot(dist2pdf(dist_trian), -3, 3, xlab=L"x", label="Triang(-2, 2)", lw=2,ylab=L"f_X(x)", title="Triangular distribution") + plot!(dist2pdf(dist_trian2), -3, 3, label="Triang(-2, 2, 1)", lw=2, ls=:auto) + plot!(dist2pdf(TriangularDist(-3, 1, -2)), -3, 3, label="Triang(-3, 1, -2)", lw=2, ls=:auto) + plots["triangular_distr"] = p +end + +# ╔═║ dbdf1da5-67fd-47ea-b363-f03e1e0cdeb0 +let + p = plot(dist2pdf(Exponential(1)), 0, 8, xlab=L"x", label="Exp(1)", lw=2,ylab=L"f_X(x)", title="Exponential distribution") + plot!(dist2pdf(Exponential(2)), 0, 8, label="Exp(2)", lw=2, ls=:dash) + plot!(dist2pdf(Exponential(1/2)), 0, 8, label="Exp(1/2)", lw=2, ls=:dot) + plots["exp_distr"] = p +end + +# ╔═║ 0b3e16bd-032b-4630-8cb3-57c63bc44572 +let + p = plot(dist2cdf(Exponential(1)), 0, 8, xlab=L"x", label="Exp(1)", lw=2,ylab=L"F_X(x)", title="Exponential distribution (CDF)") + plot!(dist2cdf(Exponential(2)), 0, 8, label="Exp(2)", lw=2, ls=:dash) + plot!(dist2cdf(Exponential(1/2)), 0, 8, label="Exp(1/2)", lw=2, ls=:dot) + plots["exp_distr_CDF"] = p +end + +# ╔═║ 05152721-dbb5-4e26-86ba-2fc16c03dac8 +let + xm = 4 + p = plot(dist2pdf(LogNormal()), 0, xm, xlab=L"x", label="Log-normal(0, 1)", lw=2,ylab=L"f_X(x)", title="Log-normal distribution") + plot!(dist2pdf(LogNormal(1, 1)), 0, xm, label="log-normal(1, 1)", lw=2, ls=:auto) + plot!(dist2pdf(LogNormal(0, 2)), 0, xm, label="log-normal(0, 2)", lw=2, ls=:auto) + plot!(dist2pdf(LogNormal(1, 2)), 0, xm, label="log-normal(1, 2)", lw=2, ls=:auto) + plots["lognorm_distr"] = p +end + +# ╔═║ adbb17b4-56d2-49ca-8bdb-ecd2d3f418cd +let + p = plot(dist2pdf(Beta(1, 1)), 0, 1, xlab=L"x", label="Beta(1, 1)", lw=2,ylab=L"f_X(x)", title="Beta distribution") + plot!(dist2pdf(Beta(4, 4)), 0, 1, label="Beta(4, 4)", lw=2, ls=:auto) + plot!(dist2pdf(Beta(8, 2)), 0, 1, label="Beta(8, 2)", lw=2, ls=:auto) + plot!(dist2pdf(Beta(1, 3)), 0, 1, label="Beta(1, 3)", lw=2, ls=:auto) + plots["beta_distr"] = p +end + +# ╔═║ 05be43b4-175e-4f5c-8ae1-ff7086ed1736 +plots["low_entropy"] = scatter([0, 0, 0, 1, 0, 0], xlab="x", ylab=L"P(X=x)", + color=:blue, + label="PMF", + title="Low-entropy die\n H(X)=$el, E[X]=4") + +# ╔═║ a09dc827-8415-4094-990e-a20256e0be2b +plots["high_entropy"] = scatter(pme, xlab="x", ylab=L"P(X=x)", + color=:blue, + label="PMF", + title="High-entropy die\n H(X)=$eh, E[X]=4", ylims=[0, maximum(pme)+0.01]) + +# ╔═║ f2faec3d-3d44-43e9-bf03-37ba68e37300 +let + p = contourf(-10:0.05:25, -2:0.01:2, (x,y)->pdf(dist_prod, [x,y]), color=:speed, xlab=L"x", ylab=L"y") + vline!([xslice], label="Y | X=$xslice", color="orange", lw=2) + hline!([yslice], label="X | Y=$yslice", color="blue", ls=:dash, lw=2) + title!("Joint PDF of a Laplace and Triangular distribution") + plots["prod_distr"] = p +end + +# ╔═║ 4bd5e387-ac06-4f4b-822f-cbc89e7509f9 +plots["prod_cond_y"] = plot(y->pdf(distY, y), -2:0.01:2, label="Y | X=$xslice", color="orange", lw=2, xlabel="y", title="Marginal of Y") + +# ╔═║ c7b2fc1e-9dd3-42e9-aa55-f9aea4781784 +plots["prod_cond_x"] = plot(x->pdf(distX, x), -10:0.05:25, label="X | Y=$yslice", color="blue", ls=:dash, lw=2, xlabel="x", title="Marginal of X") + +# ╔═║ 6f9f8748-d07b-41fe-a59e-12896b37ec98 +plots["plot_prod_margs"] = plot(plots["prod_cond_y"], plots["prod_cond_x"]); + +# ╔═║ 94dd1214-e63c-44d5-b5c3-9ca834a89ebf +let + p = plot(x->pdf(dist_mixture, x), -5, 10, label="mixture", lw=2, xlab=L"x") + plot!(x->pdf(d1, x), -5, 10, label="component 1", ls=:dash) + plot!(x->pdf(d2, x), -5, 10, label="component 2", ls=:dash) + plots["mixture"] = p +end + +# ╔═║ fc3a7a70-89e5-43e4-8dae-b7d2d8b54355 +let + p = plot(x->pdf(dist_mixture, x), -5, 10, label="mixture", lw=2, xlab=L"x", ylab=L"f_X(x)") + plot!(x->pdf(d1, x), -5, 10, label="component 1", ls=:dash) + plot!(x->pdf(d2, x), -5, 10, label="component 2", ls=:dash) + vline!([xm], color=:gold, lw=2, label="x=$xm") + plots["cond_mixture"] = p +end + +# ╔═║ e61e45a0-d9ec-4ab6-8c1b-fc8579a9a9b3 +let + likelihood = [pdf(d1, xm), pdf(d2, xm)] + posterior = likelihood .* w ./ pdf(dist_mixture, xm) + plots["mixture_likelihood"] = bar(posterior, xticks=1:length(w), xlabel="component", ylabel="posterior probability", label="X=$xm", color=:gold) +end + +# ╔═║ ebf13b85-7fa0-4859-88d1-a5189c5bbd40 +let + + plots["gaussian_mixture"] = contourf(-5:0.1:5, -5:0.1:8, (x,y)->pdf(mvmixture, [x,y]), color=:speed, xlab=L"x", ylab=L"y", title="mixture of two MVN") +end + +# ╔═║ 40fbbc43-4a73-4d25-a37c-b39798d60761 +plots["spn"] = contourf(0:0.1:30, 0:0.1:30, (x,y)->logpdf(spn, [x,y]), color=:speed, xlab=L"x", ylab=L"y") + +# ╔═║ ccbcce90-c46f-4f61-8907-2ccc3e692184 +let + mvn = MultivariateNormal(ΞΌ, Ξ£) + p = contourf(-5:0.05:5, -5:0.05:5, (x,y)->pdf(mvn, [x,y]), color=:speed, xlab=L"x", ylab=L"y") + title!("PDF of a MVN") + plots["mvn"] = p +end + +# ╔═║ 6602c372-158d-4b40-b7fe-aea7e534bd39 +plots["beta"] = plot(p->pdf(dist_p, p), 0, 1, lw=2, label="Beta(8,3)", xlab=L"x", ylab=L"f_p(p)") + +# ╔═║ 77664b93-4b90-43b3-a0cc-0b09c7bd9854 +plots["seeds"] = histogram(germination_counts, xticks=0:10, + xlabel=L"k", ylabel="frequency in sample", + label="germination succes X", title="Numer of pepper seeds that germinated") + +# ╔═║ cda5faf1-8d74-4679-a335-7a5974010f5a +plots["rainfall"] = scatter(first.(rainfall_samples), last.(rainfall_samples), alpha=0.2, xlab="intensity (mm/h)", ylab="duration (h)", label="") + +# ╔═║ f7ca0af5-dcdf-4e75-9063-2d194738be64 +plots["rain_cond"] = histogram(rainfall_amount, xlab="rainfall amount (mm)", ylab="frequency", label="intensity * duration") + +# ╔═║ cbb71827-67cd-43aa-8a36-757bdf98e16a +plots["seeds_cond"] = histogram(p_cond, ylabel="frequency", xlab=L"p", label="p given n=$ngerm", xlims=[0,1]) + +# ╔═║ a9a8f40f-da04-475b-aeaa-07add585ad9c +plots # dictionary of all the figures, for saving + +# ╔═║ Cell order: +# ╠═2d346892-cb15-11ee-2d81-73e08fcc3288 +# ╠═cf8dbe5e-d340-4ebb-8ad7-f483be07fffd +# ╠═4d96d7ea-1216-46d6-80fe-5859640eb9c9 +# β•Ÿβ”€cfc49c56-f223-4b78-b6da-4e0c83a16bbf +# β•Ÿβ”€c469b254-ffc4-458d-8676-db135e11b306 +# ╠═5e81b02d-a879-4023-a7fe-e6f187a558f1 +# β•Ÿβ”€9b3f076f-e50b-4f23-a282-91fac47de21b +# ╠═5db3ed2d-ee29-4cd5-b438-b60d550a6ff8 +# ╠═7d1e1a93-510c-4f81-bb09-d87e3b40e136 +# β•Ÿβ”€41967e5b-9068-4318-acb6-d958b608c8f7 +# ╠═5821aaf1-744d-452a-96d2-6516c7423fff +# ╠═cb36a752-da05-4da8-8dc8-1c2d34a11ad5 +# ╠═7c244dc0-6c7b-451e-b7c0-da25a77da657 +# ╠═fe471a6a-5c29-49f6-afba-83be7ab5d770 +# β•Ÿβ”€e0f96ed2-bc51-467e-be3e-8617293e33e2 +# β•Ÿβ”€47924cdc-b5bc-4612-949b-d0d23c8c47d9 +# β•Ÿβ”€12df460c-a547-410f-ac1c-90d41c8a37f1 +# ╠═c0677edb-29a4-4c4d-8ca7-9d81eac05c85 +# ╠═d786da44-5cfc-4c36-ae41-af6f623d5a4e +# ╠═bce61d18-767d-4ae4-a211-759ef3e4da44 +# ╠═1f9b17a8-d8f1-4256-bebc-d5f92e085fe8 +# β•Ÿβ”€fce1c003-6483-44f1-bdbe-c6363d09807b +# ╠═dd8c1370-5fb9-4ab7-8729-ea756762788d +# ╠═1882bc65-abca-45b7-8f53-e76360b8dacd +# ╠═d04ea704-c9c5-4d57-8908-a7b19b5567a0 +# β•Ÿβ”€b9be819e-2db9-4952-9453-98bf815b00e8 +# β•Ÿβ”€2538dd4a-96a3-4d4f-b03e-82d2e8b9ea1f +# β•Ÿβ”€fff75ceb-b21c-49fe-b1c0-0d2f3213b37d +# β•Ÿβ”€6ae427c7-a65e-4f9b-b5a7-8cb523fcd382 +# ╠═090d0c6f-de9f-4ce8-befa-4ae9dbe1b38e +# β•Ÿβ”€70cfc225-dd83-472c-b745-5266026c3bfc +# ╠═36db4c41-6132-4082-a9e3-18b5560b69d4 +# β•Ÿβ”€85e08b91-10f9-4808-ac53-195f90387688 +# ╠═36b475e9-a16b-464f-a423-a4fbfbf21ef0 +# β•Ÿβ”€f1ee69eb-d8e5-4a6b-b408-a52d33a09e52 +# ╠═ab4afb22-28e1-4d9e-8d89-a1a9f0741195 +# ╠═4d6e67d1-42b8-481f-b9fe-3df524d4b07b +# β•Ÿβ”€2a30c7eb-de92-46a1-ac79-b15529e8f463 +# ╠═83db8998-125e-4cae-b6fe-1cdddfe3f868 +# ╠═9f525fef-80b3-4417-85ea-e318ad387985 +# β•Ÿβ”€d249188a-a298-44b8-8dcb-691753331439 +# β•Ÿβ”€3b9e8f64-d307-48bc-9a71-1ab9accd134e +# ╠═1a991ac1-d4ed-4774-a9e2-a5f27f99e1ff +# ╠═b5b55083-2fe3-4620-9759-8a2329154143 +# β•Ÿβ”€f625d656-35de-47cf-985b-3ae9fa54c5d4 +# ╠═482d1da0-3415-425c-84de-69f7fb821934 +# ╠═7008afc0-785e-45a8-9b6d-5b8f26bae09d +# ╠═64e0265f-a621-495f-b73a-0af23b0ef1ac +# ╠═18a1b129-eac5-4080-8af9-7d9fbf800107 +# ╠═5a1522f7-411d-40f5-92e8-b5a154b8d735 +# β•Ÿβ”€d45fbe7b-168f-4c1e-8ab2-f17665b96938 +# ╠═7779254a-83b9-4849-957c-af4b62c3916a +# ╠═7676138b-d99f-4610-b522-ccd6ea625ed4 +# ╠═73898b6c-d8bd-49a9-ba36-a068e62a7ec3 +# β•Ÿβ”€8a493f5e-1f1b-4cf5-91e1-5504593cee9d +# β•Ÿβ”€4415cdd0-481b-4e14-bda9-d118c0acead5 +# β•Ÿβ”€03b2b204-5e4b-4d25-8c32-453a5c51926f +# ╠═6167f6cd-547d-4046-b1b2-600e5fc5ac0e +# β•Ÿβ”€dc7eb2b3-b160-4943-84e9-8cf20d687d93 +# ╠═2d3e09ff-3766-46d5-abdd-4132c4fa06b9 +# ╠═3ecfb175-0c26-419e-9770-d406cd1dd2dc +# β•Ÿβ”€9ba45ba1-f2d3-4d08-a3e7-2ed8730e3d90 +# ╠═e67e0b43-1346-4d7c-8bcc-ca53949412b8 +# ╠═ac78fddb-0b24-4956-8137-44615721bc06 +# ╠═44ca88b0-4256-4123-93f8-82d1ba3b3b77 +# β•Ÿβ”€896da840-ad94-40d7-8a65-be92b174e88b +# ╠═3b5df17c-7110-4a6f-926b-6c6f6621b575 +# β•Ÿβ”€d7e88a1a-73e9-48ff-bb51-2292346f88e0 +# ╠═2b79770c-00a8-4c3b-b39e-b31400593ea4 +# β•Ÿβ”€74e50a3d-7623-45c2-8d3a-2c34f363177e +# β•Ÿβ”€67594833-14c8-423c-94ce-91ce2a44b6c9 +# β•Ÿβ”€a8f762eb-e3b6-434a-9526-8f58ae227ae5 +# β•Ÿβ”€e3d9a5b7-73ec-4c16-8799-2e2a4f99c018 +# β•Ÿβ”€e94fa51a-e1a7-4a1b-88ef-76b38d3a6d74 +# β•Ÿβ”€fe24583f-afc7-43ee-901f-c81585677ecd +# β•Ÿβ”€2db26aa9-7516-400c-905f-b6b710820667 +# β•Ÿβ”€222cdcae-5b51-4fdc-a794-11471449ebcd +# β•Ÿβ”€8ae351eb-c1b8-4934-aa48-023f8feba75c +# β•Ÿβ”€ebe190e6-da7a-4c88-bd31-b5dc53f6a3e1 +# β•Ÿβ”€3de53132-5b89-483a-872e-4cf1142fc90b +# β•Ÿβ”€4360ca84-c0bd-4c7a-afbc-edfef5a5f976 +# β•Ÿβ”€af7119a0-2470-4bf0-8b30-59b38ddd8d5d +# β•Ÿβ”€dbdf1da5-67fd-47ea-b363-f03e1e0cdeb0 +# β•Ÿβ”€0b3e16bd-032b-4630-8cb3-57c63bc44572 +# β•Ÿβ”€05152721-dbb5-4e26-86ba-2fc16c03dac8 +# β•Ÿβ”€adbb17b4-56d2-49ca-8bdb-ecd2d3f418cd +# β•Ÿβ”€4290b2c6-1f5f-4780-9f32-08ae949b666c +# ╠═010eaf3e-b4ed-44df-aadc-1c315a835e05 +# ╠═05be43b4-175e-4f5c-8ae1-ff7086ed1736 +# ╠═e3a05983-1695-4459-a13a-7a3147dbfcc9 +# ╠═93f56253-380f-4fa4-b95d-70b87cb0b604 +# ╠═4a9cc597-da77-4d93-b753-248222255df4 +# ╠═d3f4b8ac-4eb9-41a9-bcf6-e06b66b1942e +# ╠═9e877033-a02c-414e-8e52-e4ebdfdf5b71 +# ╠═94797811-3d8b-4610-b0ee-5b1a912553eb +# ╠═74bfaae3-fb0c-471a-aa9a-2d1151ec9b6a +# ╠═a09dc827-8415-4094-990e-a20256e0be2b +# ╠═07949347-3e7b-499f-9ca6-c62c131e2a65 +# β•Ÿβ”€8e7fa947-480d-4037-88a9-652ed7cc2cbd +# ╠═1d883714-026b-4206-8ee3-a58e89a70c52 +# ╠═52fd8a26-93a1-4c83-a5fd-4247cdff3629 +# ╠═432c5cd3-a359-4f80-9a78-d8198b100524 +# β•Ÿβ”€f2faec3d-3d44-43e9-bf03-37ba68e37300 +# β•Ÿβ”€e495c24a-76d5-4cba-b1f9-76d3e25912d8 +# β•Ÿβ”€4bd5e387-ac06-4f4b-822f-cbc89e7509f9 +# β•Ÿβ”€46b4ef15-bd34-4b59-aef5-5dc4e1193ec3 +# β•Ÿβ”€c7b2fc1e-9dd3-42e9-aa55-f9aea4781784 +# β•Ÿβ”€6f9f8748-d07b-41fe-a59e-12896b37ec98 +# β•Ÿβ”€ffa84522-dd02-47f8-ac3b-b1db08806b2d +# β•Ÿβ”€0252887f-b133-426e-82fc-43ac091a7de6 +# β•Ÿβ”€8bfd6e24-27ce-4caf-b68c-b13d89f08337 +# ╠═e79c0f96-02ca-4ebf-bcc5-0f6e0dc3d7d6 +# ╠═5a4a0cb6-93b2-4194-8a65-eb84e396b999 +# ╠═c580ca85-78ff-4cbc-b033-f0c5acde3193 +# β•Ÿβ”€94dd1214-e63c-44d5-b5c3-9ca834a89ebf +# β•Ÿβ”€f1906adc-79f7-44da-a085-486e8f46e027 +# β•Ÿβ”€d6cd5202-0171-40f9-bc17-d001dadee567 +# β•Ÿβ”€fc3a7a70-89e5-43e4-8dae-b7d2d8b54355 +# β•Ÿβ”€e61e45a0-d9ec-4ab6-8c1b-fc8579a9a9b3 +# β•Ÿβ”€89178521-511e-4c53-a2e1-c1d4dad03a23 +# ╠═67b154c9-3c14-4eb2-98f2-19f9e3f74d16 +# β•Ÿβ”€ebf13b85-7fa0-4859-88d1-a5189c5bbd40 +# β•Ÿβ”€9381abbc-3715-4f1a-97cf-2487706e13f6 +# ╠═36093484-bdd1-4b1b-bd68-39c7b18a9f6b +# β•Ÿβ”€40fbbc43-4a73-4d25-a37c-b39798d60761 +# β•Ÿβ”€1efe9a9e-cd1b-4fe2-8392-2ce42c871a5f +# ╠═a1aed96d-8839-4c40-9f18-1ca453be740b +# β•Ÿβ”€fb6698d6-c565-42f7-ab34-8a4c860f7ef4 +# β•Ÿβ”€e0c947b7-306b-42d3-b004-5f37702be73a +# β•Ÿβ”€ccbcce90-c46f-4f61-8907-2ccc3e692184 +# β•Ÿβ”€af983208-c64e-4efe-9322-000b2ce09072 +# ╠═ba4460b1-2855-4695-a3d8-4976666ef164 +# ╠═e295e21f-40a7-47ae-b680-4831b3d0cdbb +# β•Ÿβ”€6602c372-158d-4b40-b7fe-aea7e534bd39 +# β•Ÿβ”€cc058abb-e7b6-433e-aacf-13295a401c5f +# ╠═a3c7cd83-4488-40a1-8f0f-b79be73afb44 +# ╠═8f13d578-f400-4885-a071-a54259b93f12 +# ╠═788193d3-742b-4c27-aad4-41a9024ff0d0 +# ╠═dc668eb0-899a-42dd-901b-bbbde5d3d0dd +# ╠═03cedb9e-f74e-4662-abc8-e3cc87cad581 +# ╠═c6e08f0d-e30e-4d30-989e-2463289ee038 +# β•Ÿβ”€77664b93-4b90-43b3-a0cc-0b09c7bd9854 +# β•Ÿβ”€f24fffb4-deb7-428a-ba21-0e4999962624 +# ╠═6d565e90-7aa6-480f-96fb-25c745ec6974 +# ╠═42867e88-cd02-4634-a225-a9bf0ae46b70 +# ╠═13cf931e-5333-46ff-a00a-ea94c0b2e509 +# ╠═18e788ca-5b74-4a0b-81f0-5f307857e7e2 +# β•Ÿβ”€95502761-d344-448a-9259-a1a6079a4a8b +# ╠═f3f5595a-e82d-4a9c-b6ab-8dadb553056f +# ╠═d999582d-5c0e-42df-850f-f7bbe4ccb636 +# β•Ÿβ”€cda5faf1-8d74-4679-a335-7a5974010f5a +# ╠═4b96292b-f0ad-48ac-99cd-360c0708ef72 +# β•Ÿβ”€f7ca0af5-dcdf-4e75-9063-2d194738be64 +# β•Ÿβ”€cb903ece-6f36-4840-ad53-1b095f189070 +# β•Ÿβ”€0681ddf3-0aba-42e2-831d-c5058c417009 +# ╠═875cb743-7c6e-4aed-893d-03b969dc4c35 +# ╠═c12e165f-14b1-4df3-bc88-28ada3bf5add +# ╠═b76245bf-a5a4-41f4-a20b-0327280e68e6 +# β•Ÿβ”€9197faa7-603f-4626-b886-a6f71e4111f0 +# β•Ÿβ”€43305b47-9e34-40dd-aa5f-fb54410fc45e +# β•Ÿβ”€b1e85d42-199e-4874-843c-f5aa81728c38 +# ╠═6d8c2a59-baf3-45e4-8811-adc7857e1732 +# ╠═79be0044-9856-4b3b-80e3-6c362e23b9f4 +# ╠═037a2175-22b2-48c9-9664-3743b11e8f7c +# ╠═6fe05275-f1f7-4b3f-bbc2-8077bf981391 +# β•Ÿβ”€cbb71827-67cd-43aa-8a36-757bdf98e16a +# β•Ÿβ”€a0e20b67-3d84-44cf-b12e-8c0b2edba982 +# β•Ÿβ”€1ad364c5-b65d-48d7-a829-e284c5e8eebc +# ╠═5614c4b1-2c78-4fee-a480-3998a8e1ce6e +# ╠═efd7bcba-f393-4659-ac5b-006740085144 +# ╠═0b9060d0-9c5a-4806-8d68-20e4ffd8f864 +# ╠═7d71303b-defc-4e5f-beee-2bf684674ecf +# ╠═57052ba3-151c-4dda-904a-dac9c421241c +# ╠═a9a8f40f-da04-475b-aeaa-07add585ad9c diff --git a/scripts/optimization.jl b/scripts/optimization.jl new file mode 100644 index 00000000..ce424827 --- /dev/null +++ b/scripts/optimization.jl @@ -0,0 +1,458 @@ +### A Pluto.jl notebook ### +# v0.20.3 + +using Markdown +using InteractiveUtils + +# This Pluto notebook uses @bind for interactivity. When running this notebook outside of Pluto, the following 'mock version' of @bind gives bound variables a default value (instead of an error). +macro bind(def, element) + #! format: off + quote + local iv = try Base.loaded_modules[Base.PkgId(Base.UUID("6e696c72-6542-2067-7265-42206c756150"), "AbstractPlutoDingetjes")].Bonds.initial_value catch; b -> missing; end + local el = $(esc(element)) + global $(esc(def)) = Core.applicable(Base.get, el) ? Base.get(el) : iv(el) + el + end + #! format: on +end + +# ╔═║ 99ff6d3d-0a9c-485c-87b0-d361080fd7ca +# ╠═║ skip_as_script = true +#=╠═║ +begin + using Pkg + Pkg.activate("..") +end + ╠═║ =# + +# ╔═║ 1e42a500-f18b-11ee-1d1b-c54e26589084 +using PlutoUI, LaTeXStrings, Plots, LinearAlgebra + +# ╔═║ 6f264016-64c4-4680-a0d3-6f161b7a6d67 +using Distributions + +# ╔═║ 279d873f-292e-4590-b4d0-0b933bcf325e +using Turing + +# ╔═║ fb45cbb5-1117-4201-ab57-a6c2cdf96599 +using Optim + +# ╔═║ ce7c6458-edad-49a6-9742-2377eb2a1071 +f_rosenbrock((x1, x2); a=1, b=100) = (a-x1)^2 + b * (x2-x1^2)^2 + +# ╔═║ d4af97db-51c2-43a6-9ffc-d8269af53a71 +f_rosenbrock(x1,x2) = f_rosenbrock((x1, x2)) + +# ╔═║ c2a0d824-6e0e-4594-9755-3521deac9051 +f = x->f_rosenbrock(x) + +# ╔═║ b7ea4943-a8e1-40ea-90bd-9220aa0eb901 +md"## Grid search and random search" + +# ╔═║ 3927ad66-4111-494c-9cb7-9c659ec57151 +x_grid = argmin(f_rosenbrock, ((x1, x2) for x1 in range(-2, 2, length=10) + for x2 in range(-1, 3, length=10))) + +# ╔═║ 71a0c6ef-c1a5-4ca3-8114-e496bc24813e +distr = product_distribution(Uniform(-2,2), Uniform(-1, 3)) + +# ╔═║ 1e5398ef-8666-4371-8fbd-78e5b35b3253 +x_rand = argmin(f, (rand(distr) for i in 1:100)) + +# ╔═║ ad7a5769-f325-4b6e-8a5e-04a65478dc0f +@model function sampling_dist() + x ~ Uniform(-2, 2) + y ~ Uniform(-1, 3) +end + +# ╔═║ 3308c8df-93a0-4eea-b45d-34859d5b2c0d +argmin(f, (rand(sampling_dist()) for i in 1:100)) + +# ╔═║ edb750a6-291a-42bb-9cba-b289f8ba801a +@model function sampling_dist2() + x ~ Normal(0, 1) + y ~ Normal(1, 1) +end + +# ╔═║ d7f8e367-4404-4d3f-98ef-a5fcb9436566 +argmin(f, (rand(sampling_dist2()) for i in 1:100)) + +# ╔═║ caa25351-585b-4d4d-a51f-2a7ee68f6bbe +x0 = [-1.0, 2.0] + +# ╔═║ f06fbf86-05fe-44d5-9dc2-e17bb0347597 +opts = Optim.Options(store_trace=true, iterations=10_000, extended_trace=true); + +# ╔═║ b0ded35f-3a77-479f-abf8-1f98b9c0bb7a +sol_GD = optimize(f_rosenbrock, x0, GradientDescent(), opts, autodiff = :forward) + +# ╔═║ 42c40178-ea40-44ce-a416-aefc1ae03662 +sol_GD.minimizer + +# ╔═║ 2adcab36-3436-443b-a11a-c25e2dac19c1 +# ╠═║ skip_as_script = true +#=╠═║ +p = sol_GD.trace[1] + ╠═║ =# + +# ╔═║ b2aaff23-c1d4-4f86-978f-32e592ac7072 +# ╠═║ skip_as_script = true +#=╠═║ +p.value + ╠═║ =# + +# ╔═║ 9d34850a-4069-42d5-abdf-4f8e7199a947 +# ╠═║ skip_as_script = true +#=╠═║ +p.metadata["x"] + ╠═║ =# + +# ╔═║ af2940b8-991b-4231-887a-ae48c60212d6 +[p.metadata["x"] for p in sol_GD.trace] + +# ╔═║ f5c307dc-7610-4f6a-abda-191443d3901c +sol_GD.time_run + +# ╔═║ eb974079-2187-4d2d-b2c7-19830d5ce6ee +sol_newton = optimize(f, x0, Newton(), opts, autodiff = :forward) + +# ╔═║ 0640276b-c6d8-46cf-a928-79a425306319 +sol_newton.time_run + +# ╔═║ f23d0a8c-5045-4071-be2d-389f1a796484 + + +# ╔═║ 49718e41-61ea-4934-918b-ef03a259d609 +@bind ΞΈ Slider(0:0.1:(2Ο€), default=deg2rad(67)) + +# ╔═║ d6e95454-b2ea-453a-aad2-75ce39f1a6e3 +ΞΈ + +# ╔═║ 3b285e28-d047-499a-99d8-0dde5c80cab2 +R = [cos(ΞΈ) -sin(ΞΈ); + sin(ΞΈ) cos(ΞΈ)] + +# ╔═║ 414a8764-2310-4a5a-90ba-ed7b126fb4f8 +rot = x -> R * x + +# ╔═║ 082e119f-5a2b-44f4-8357-55f518c0a64d +frot(x, y) = f_rosenbrock(rot([x, y])) + +# ╔═║ 4392fa7e-3e56-4944-aee2-66150a02e5f4 +frot((x,y)) = frot(x, y) + +# ╔═║ b7dda6c0-1b52-4f30-a9b8-427d6768d793 +optimize(frot, rot(x0), Newton(), opts, autodiff=:forward) + +# ╔═║ 376db0fa-cfc6-48c6-a65d-f58e3afb24f7 +rot(x0) + +# ╔═║ f4e05e34-8aba-4610-8a2d-fcf6752e0f1d + + +# ╔═║ da830667-9ef4-4b88-a07b-9ec50dd4e815 +frescaled(x, y) = f_rosenbrock(10x, y/10) + +# ╔═║ 3556cd4c-eb43-48f8-84a6-80246683a8bc +frescaled((x, y)) = frescaled(x, y) + +# ╔═║ 4047e168-0906-4704-a191-1d4d6a0adba4 +optimize(frescaled, [x0[1]/10, x0[2]*10], Newton(), opts) + +# ╔═║ 0267e113-71d9-4b26-bed6-41ceae37c1ce +optimize(frescaled, [x0[1]/10, x0[2]*10], GradientDescent(), opts) + +# ╔═║ f053529a-2726-48c6-a848-f6bc220ee1f0 +sol_LBFGS = optimize(f, x0, LBFGS(), opts, autodiff=:forward) + +# ╔═║ 7fd70049-b91c-41d1-bf34-688d3461c9df +sol_LBFGS.trace + +# ╔═║ 4e4e6c03-f2dd-4f7f-8c00-82d47286d019 +sol_LBFGS.time_run + +# ╔═║ b60d91f5-f635-4dc0-95fd-a35fbac97978 +sol_NM = optimize(f, x0, NelderMead(), opts) + +# ╔═║ 63231b16-b6f5-41be-8039-4dd3b254c31e +sol_NM.time_run + +# ╔═║ 171dab60-921a-40e3-b215-6ba712a780eb +sol_NM.trace + +# ╔═║ a1f5e697-3363-4406-8dd4-8dd66c76f23c +sol_PSO = optimize(f, x0, ParticleSwarm(lower=[-2.0, -1.0], + upper=[2.0, 3.0], n_particles=20), opts) + +# ╔═║ ee5f554b-ead2-40bb-bfe8-b1cc7053a070 +#=╠═║ +typeof(p) + ╠═║ =# + +# ╔═║ 6bbee6f5-ae16-428e-86bd-67b7b35ed4c5 +@model function g(x) + m ~ Normal(0, 1) + b ~ Exponential( 10) + x ~ Normal(exp(-m), b) +end + +# ╔═║ 523a9f90-4a02-4716-abb5-fda48c948816 +optimize(g(10), MLE()) + +# ╔═║ cf1a8701-ec6a-4dfa-b72f-64d4168f332e +optimize(g(10), MAP()) + +# ╔═║ a8fcc4bb-0360-402a-8992-5c5883138b11 +md"# Appendix" + +# ╔═║ 17e6402f-2bc0-41b1-ab62-54b8edd6ffa8 +plots = Dict() + +# ╔═║ 90125dda-fa19-415c-a8d7-eb37bc1dbf14 +begin + p_ros = contourf(-2:0.01:2, -1:0.01:3, log10 ∘ f_rosenbrock, color= cgrad(:speed), xlab=L"x_1", ylab=L"x_2", title="Rosenbrock function", xlims=[-2,2], ylims=[-1, 3]) + plots["rosenbrock"] = scatter!([1], [1], label="", color="red") +end + +# ╔═║ 1adee9b4-7cbe-4d14-8004-8cf54613231d +begin + p_ros2 = contour(-2:0.01:2, -1:0.01:3, log10 ∘ f_rosenbrock, color= cgrad(:speed), xlab=L"x_1", ylab=L"x_2", title="Rosenbrock function", xlims=[-2,2], ylims=[-1, 3]) + plots["rosenbrock_light"] = scatter!([1], [1], label="", color="red") +end + +# ╔═║ bd20d253-9238-4260-ae87-159dc34e10d9 +let + p = contour(-2:0.01:2, -1:0.01:3, log10 ∘ f_rosenbrock, color= cgrad(:speed), xlab=L"x_1", ylab=L"x_2", title="Rosenbrock function", xlims=[-2,2], ylims=[-1, 3]) + scatter!([1], [1], label=L"x^\star", color="red") + grid = [(x, y) for x in range(-2, 2, length=10) + for y in range(-1, 3, length=10)] + plots["grid_search"] = scatter!(first.(grid), last.(grid), title="Grid search", + color="orange", label="", ms=3, m=:x) +end + +# ╔═║ adb796f0-8296-4451-9086-8ba731f80608 +let + p = contour(-2:0.01:2, -1:0.01:3, log10 ∘ f_rosenbrock, color= cgrad(:speed), xlab=L"x_1", ylab=L"x_2", title="Rosenbrock function", xlims=[-2,2], ylims=[-1, 3]) + scatter!([1], [1], label=L"x^\star", color="red") + grid = [rand(distr) for i in 1:100] + plots["random_search"] = scatter!(first.(grid), last.(grid), title="Random search (uniform)", + color="orange", label="", ms=3, m=:x) +end + +# ╔═║ 6391bbce-bdad-4833-82a9-3cde82fa0952 +let + contour(-2:0.01:2, -1:0.01:3, log10 ∘ f_rosenbrock, color= cgrad(:speed), xlab=L"x_1", ylab=L"x_2", title="Rosenbrock function", xlims=[-2,2], ylims=[-1, 3]) + scatter!([1], [1], label="", color="red") + grid = [rand(sampling_dist2()) for i in 1:100] + plots["random_search_norm"] = scatter!(first.(grid), last.(grid), title="Random search (non-uniform)", + color="orange", label="", ms=3, m=:x) +end + +# ╔═║ 462774d1-c1c5-48d7-8f25-2c091ad86943 +let + p = contour(-2:0.01:2, -1:0.01:3, log10 ∘ f_rosenbrock, color= cgrad(:speed), xlab=L"x", ylab=L"y", title="Stratified sampling", xlims=[-2,2], ylims=[-1, 3]) + vline!(range(-2, 2, length=7), ls=:dash, color=:blue, alpha=0.7, label="") + hline!(range(-1, 3, length=7), ls=:dash, color=:blue, alpha=0.7, label="") + points = [] + for a in range(-2, length=6, step=2/3) + for b in range(-1, length=6, step=2/3) + x = 2rand()/3 + a + y = 2rand()/3 + b + push!(points, (x, y)) + end + end + plots["stratified_sampling"] = scatter!(first.(points), last.(points), color="orange", label="", ms=3, m=:x) +end + +# ╔═║ ee76b80d-64b2-4e6a-8384-d3179c996d55 +let + sol = sol_GD + x1, x2 = sol.minimizer + p = contour(-2:0.01:2, -1:0.01:3, log10 ∘ f_rosenbrock, color= cgrad(:speed), xlab=L"x_1", ylab=L"x_2", title="Gradient descent", xlims=[-2,2], ylims=[-1, 3]) + scatter!([1], [1], label=L"x^\star", color="red") + scatter!([x1], [x2], label="minimizer", color=:gold) + path = [p.metadata["x"] for p in sol.trace] + plot!(first.(path), last.(path), lw=2, color=:blue, alpha=0.7, label="path") + plots["Rosenbrock_GD"] = p +end + +# ╔═║ 320939b3-617e-43f8-a915-7b01637cf3d0 +let + sol = sol_newton + x1, x2 = sol.minimizer + p = contour(-2:0.01:2, -1:0.01:3, log10 ∘ f_rosenbrock, color= cgrad(:speed), xlab=L"x_1", ylab=L"x_2", title="Newton's method", xlims=[-2,2], ylims=[-1, 3]) + scatter!([1], [1], label=L"x^\star", color="red") + scatter!([x1], [x2], label="minimizer", color=:gold) + path = [p.metadata["x"] for p in sol.trace] + plot!(first.(path), last.(path), lw=2, color=:orange, alpha=0.7, label="path") + plots["Rosenbrock_Newton"] = p +end + +# ╔═║ 4eaa94d1-00ff-4baa-91ff-0bd380f30fb1 +let + quadr(x) = x' * A * x / 2 + A = [5 -2; -2 1] + x = [-1., 3.] + x1, x2 = x + p = contourf(-5:.01:5, -5:.01:5, (x,y)->quadr([x,y]), color=:speed, aspect_ratio=:equal, xlims=(-5,5), ylims=(-5,5)) + title!("GD vs. Newton step") + scatter!([0], [0], label=L"x^\star", color=:red) + dx_gd = - A * x + dx_gd .*= 2/norm(dx_gd) + dx_newton = - x + dx_newton .*= 2/norm(dx_newton) + quiver!([x1], [x2], quiver=([dx_gd[1]], [dx_gd[2]]), label=L"\delta \mathbf{x}", lw=2, color=:blue2) + quiver!([x1], [x2], quiver=([dx_newton[1]], [dx_newton[2]]), lw=2, ls=:dash, color=:red) + xlabel!(L"x_1") + ylabel!(L"x_2") + title!("Negative gradient vs\nNewton step") + plots["steps"] = p +end + +# ╔═║ f8e0b77b-1d8b-4ae8-be97-1a233c8a94d2 +let + sol = optimize(frot, rot(x0), Newton(), opts) + x1, x2 = sol.minimizer + p = contour(-5:0.01:5, -3:0.01:3, log10 ∘ frot, color= cgrad(:speed), xlab=L"x_1", ylab=L"x_2", title="Newton's method", xlims=[-5,5], ylims=[-3, 3]) + x1m, x2m = rot([1, 1]) + scatter!([x1m], [x2m], label=L"x^\star", color="red") + scatter!([x1], [x2], label="minimizer", color=:gold) + path = [p.metadata["x"] for p in sol.trace] + plot!(first.(path), last.(path), lw=2, color=:orange, alpha=0.7, label="path") + plots["Rosenbrock_Newton_rot"] = p +end + +# ╔═║ 99bd0581-596b-4390-8248-d0de51caceac +let + sol = optimize(frescaled, [x0[1]/10, x0[2]*10], Newton(), opts) + x1, x2 = sol.minimizer + p = contour(-.2:0.001:.2, -10:0.1:30, log10 ∘ frescaled, color= cgrad(:speed), xlab=L"x_1", ylab=L"x_2", title="Newton's method (rescaled)", xlims=[-.2,.2], ylims=[-10, 30]) + scatter!([.1], [10], label=L"x^\star", color="red") + scatter!([x1], [x2], label="minimizer", color=:gold) + path = [p.metadata["x"] for p in sol.trace] + plot!(first.(path), last.(path), lw=2, color=:orange, alpha=0.7, label="path") + plots["Rosenbrock_Newton_rescaled"] = p +end + +# ╔═║ 60b92e5e-64bd-489b-8b87-873a5db3d7b1 +let + sol = optimize(frescaled, [x0[1]/10, x0[2]*10], GradientDescent(), opts) + x1, x2 = sol.minimizer + p = contour(-.2:0.001:.2, -10:0.1:30, log10 ∘ frescaled, color= cgrad(:speed), xlab=L"x_1", ylab=L"x_2", title="Gradient descent (rescaled)", xlims=[-.2,.2], ylims=[-10, 30]) + scatter!([.1], [10], label=L"x^\star", color="red") + scatter!([x1], [x2], label="minimizer", color=:gold) + path = [p.metadata["x"] for p in sol.trace] + plot!(first.(path), last.(path), lw=2, color=:blue, alpha=0.7, label="path") + plots["Rosenbrock_GD_rescaled"] = p +end + +# ╔═║ 401783fe-d82f-4c3c-84ad-ef982aa34f7d +let + sol = sol_LBFGS + x1, x2 = sol.minimizer + p = contour(-2:0.01:2, -1:0.01:3, log10 ∘ f_rosenbrock, color= cgrad(:speed), xlab=L"x_1", ylab=L"x_2", title="L-BFGS", xlims=[-2,2], ylims=[-1, 3]) + scatter!([1], [1], label=L"x^\star", color="red") + scatter!([x1], [x2], label="minimizer", color=:gold) + path = [p.metadata["x"] for p in sol.trace] + plot!(first.(path), last.(path), lw=2, color=:red, alpha=0.7, label="path") + plots["Rosenbrock_LBGS"] = p +end + +# ╔═║ d8ca4713-5063-47f4-8763-ae72694dac0b +let + p = plot(title="Convergence rates\nRosenbrock function", xscale=:log10, yscale=:log10, xlab=L"k+1", ylab=L"f(x^{(k)})-f(x^\star)", ls=:auto) + f_gd = [p.value for p in sol_GD.trace] + plot!(f_gd, label="gradient descent", lw=2, color=:blue, ls=:solid) + f_newton = [p.value for p in sol_newton.trace] + plot!(f_newton, label="Newton's method", lw=2, color=:orange, ls=:dash) + f_bfgs = [p.value for p in sol_LBFGS.trace] + plot!(f_bfgs, label="L-BFGS", lw=2, color=:red, ls=:dot) + plots["convergence_FO"] = p +end + +# ╔═║ f3baf67a-2085-4601-99ee-9dde9ac44dec +let + sol = sol_NM + x1, x2 = sol.minimizer + p = contour(-2:0.01:2, -1:0.01:3, log10 ∘ f_rosenbrock, color= cgrad(:speed), xlab=L"x_1", ylab=L"x_2", title="Nelder-Mead", xlims=[-2,2], ylims=[-1, 3]) + scatter!([1], [1], label=L"x^\star", color="red") + scatter!([x1], [x2], label="minimizer", color=:gold) + path = [p.metadata["centroid"] for p in sol.trace] + scatter!(first.(path), last.(path), color="orange", ms=3, m=:x, label="evaluations") + plots["Rosenbrock_NM"] = p +end + +# ╔═║ ef8c9e9e-974f-4970-b48a-6cde8ccd586b +plots + +# ╔═║ Cell order: +# ╠═1e42a500-f18b-11ee-1d1b-c54e26589084 +# ╠═99ff6d3d-0a9c-485c-87b0-d361080fd7ca +# ╠═ce7c6458-edad-49a6-9742-2377eb2a1071 +# ╠═d4af97db-51c2-43a6-9ffc-d8269af53a71 +# ╠═c2a0d824-6e0e-4594-9755-3521deac9051 +# ╠═90125dda-fa19-415c-a8d7-eb37bc1dbf14 +# ╠═1adee9b4-7cbe-4d14-8004-8cf54613231d +# ╠═b7ea4943-a8e1-40ea-90bd-9220aa0eb901 +# ╠═3927ad66-4111-494c-9cb7-9c659ec57151 +# ╠═bd20d253-9238-4260-ae87-159dc34e10d9 +# ╠═6f264016-64c4-4680-a0d3-6f161b7a6d67 +# ╠═71a0c6ef-c1a5-4ca3-8114-e496bc24813e +# ╠═1e5398ef-8666-4371-8fbd-78e5b35b3253 +# ╠═adb796f0-8296-4451-9086-8ba731f80608 +# ╠═279d873f-292e-4590-b4d0-0b933bcf325e +# ╠═ad7a5769-f325-4b6e-8a5e-04a65478dc0f +# ╠═3308c8df-93a0-4eea-b45d-34859d5b2c0d +# ╠═edb750a6-291a-42bb-9cba-b289f8ba801a +# ╠═d7f8e367-4404-4d3f-98ef-a5fcb9436566 +# ╠═6391bbce-bdad-4833-82a9-3cde82fa0952 +# ╠═462774d1-c1c5-48d7-8f25-2c091ad86943 +# ╠═fb45cbb5-1117-4201-ab57-a6c2cdf96599 +# ╠═caa25351-585b-4d4d-a51f-2a7ee68f6bbe +# ╠═f06fbf86-05fe-44d5-9dc2-e17bb0347597 +# ╠═b0ded35f-3a77-479f-abf8-1f98b9c0bb7a +# ╠═42c40178-ea40-44ce-a416-aefc1ae03662 +# ╠═2adcab36-3436-443b-a11a-c25e2dac19c1 +# ╠═b2aaff23-c1d4-4f86-978f-32e592ac7072 +# ╠═9d34850a-4069-42d5-abdf-4f8e7199a947 +# ╠═af2940b8-991b-4231-887a-ae48c60212d6 +# ╠═ee76b80d-64b2-4e6a-8384-d3179c996d55 +# ╠═f5c307dc-7610-4f6a-abda-191443d3901c +# ╠═eb974079-2187-4d2d-b2c7-19830d5ce6ee +# ╠═0640276b-c6d8-46cf-a928-79a425306319 +# ╠═320939b3-617e-43f8-a915-7b01637cf3d0 +# ╠═f23d0a8c-5045-4071-be2d-389f1a796484 +# ╠═49718e41-61ea-4934-918b-ef03a259d609 +# ╠═d6e95454-b2ea-453a-aad2-75ce39f1a6e3 +# ╠═3b285e28-d047-499a-99d8-0dde5c80cab2 +# ╠═414a8764-2310-4a5a-90ba-ed7b126fb4f8 +# ╠═082e119f-5a2b-44f4-8357-55f518c0a64d +# ╠═4392fa7e-3e56-4944-aee2-66150a02e5f4 +# ╠═b7dda6c0-1b52-4f30-a9b8-427d6768d793 +# ╠═376db0fa-cfc6-48c6-a65d-f58e3afb24f7 +# ╠═f4e05e34-8aba-4610-8a2d-fcf6752e0f1d +# ╠═4eaa94d1-00ff-4baa-91ff-0bd380f30fb1 +# ╠═f8e0b77b-1d8b-4ae8-be97-1a233c8a94d2 +# ╠═da830667-9ef4-4b88-a07b-9ec50dd4e815 +# ╠═3556cd4c-eb43-48f8-84a6-80246683a8bc +# ╠═4047e168-0906-4704-a191-1d4d6a0adba4 +# ╠═99bd0581-596b-4390-8248-d0de51caceac +# ╠═0267e113-71d9-4b26-bed6-41ceae37c1ce +# ╠═60b92e5e-64bd-489b-8b87-873a5db3d7b1 +# ╠═f053529a-2726-48c6-a848-f6bc220ee1f0 +# ╠═7fd70049-b91c-41d1-bf34-688d3461c9df +# ╠═401783fe-d82f-4c3c-84ad-ef982aa34f7d +# ╠═4e4e6c03-f2dd-4f7f-8c00-82d47286d019 +# ╠═d8ca4713-5063-47f4-8763-ae72694dac0b +# ╠═b60d91f5-f635-4dc0-95fd-a35fbac97978 +# ╠═63231b16-b6f5-41be-8039-4dd3b254c31e +# ╠═171dab60-921a-40e3-b215-6ba712a780eb +# ╠═f3baf67a-2085-4601-99ee-9dde9ac44dec +# ╠═a1f5e697-3363-4406-8dd4-8dd66c76f23c +# ╠═ee5f554b-ead2-40bb-bfe8-b1cc7053a070 +# ╠═6bbee6f5-ae16-428e-86bd-67b7b35ed4c5 +# ╠═523a9f90-4a02-4716-abb5-fda48c948816 +# ╠═cf1a8701-ec6a-4dfa-b72f-64d4168f332e +# ╠═a8fcc4bb-0360-402a-8992-5c5883138b11 +# ╠═17e6402f-2bc0-41b1-ab62-54b8edd6ffa8 +# ╠═ef8c9e9e-974f-4970-b48a-6cde8ccd586b diff --git a/scripts/sampling_algorithms.jl b/scripts/sampling_algorithms.jl new file mode 100644 index 00000000..9754ff76 --- /dev/null +++ b/scripts/sampling_algorithms.jl @@ -0,0 +1,160 @@ +### A Pluto.jl notebook ### +# v0.19.42 + +using Markdown +using InteractiveUtils + +# ╔═║ 89971672-d3d8-11ee-0f21-13c70f67d6f2 +begin + using Pkg + Pkg.activate("..") + using Plots, PlutoUI, LaTeXStrings + using Distributions, LinearAlgebra +end + +# ╔═║ 9d4d1812-0303-4fa7-a7e8-a10549b61fe6 +using Zygote + +# ╔═║ 4ced4f92-1832-4c81-a7a6-85f87aab5375 +#f(x, y; a=1, b=100) = (a - x)^2 + b * (y - x^2)^2 +f(x, y; R=2) = exp(-abs((x^2 + y^2) - R^2)) + +# ╔═║ 28475353-415b-49cf-9a1a-dd349f297b8c +p = MixtureModel([Normal(2, 0.4), Normal(4, 1.2)], [0.3, 0.7]) + +# ╔═║ c1ebb67d-8cce-4a12-b13a-fcb823729993 +plot(x->pdf(p, x), 0, 8) + +# ╔═║ da7fea34-4200-4ea2-a054-6f95d2313d47 +f(xy) = f(xy...) + +# ╔═║ 0cbe1a45-7090-4a54-9873-8a8ef1c43dcd +p_donut = contourf(-4:0.01:4, -4:0.01:4, f, color=:speed, aspect_ratio=:equal + , xlims=(-4, 4), ylims=(-4, 4), xlab=L"x", ylab=L"y") + +# ╔═║ df31ee7d-c8d8-4725-a1c2-ecf4bca8d61d +G = MultivariateNormal([0, 0], I) + +# ╔═║ c27bd239-25ef-428b-b267-773a025cb83b +M = 1.1f(0, 2) / pdf(G, [0, 2]) + +# ╔═║ efa7ac57-04c9-4845-995e-f1798bf77aa0 +function rejection_sampling(f, G; M, n=100) + y = rand(G) + samples = typeof(y)[] + rejected = typeof(y)[] + while length(samples) < n + y = rand(G) + Ξ± = f(y) / (M * pdf(G, y)) + if rand() < Ξ± + push!(samples, y) + else + push!(rejected, y) + end + end + return samples, rejected +end + +# ╔═║ c4710ca9-32a4-4afe-993c-9957af1c4956 +samples, rejected = rejection_sampling(f, G; M, n=100) + +# ╔═║ 98e65ea8-a9e4-458f-8ce7-661fe0b71ea0 +begin + scatter!(deepcopy(p_donut), first.(samples), last.(samples), label="accepted", ms=2) + scatter!(first.(rejected), last.(rejected), label="rejected", ms=2, alpha=0.2) +end + +# ╔═║ 7f979860-34de-40bf-8d8c-9fb937692185 +acceptence_ratio = length(samples) / (length(samples) + length(rejected)) + +# ╔═║ 3fbfbb95-223b-4ff3-a981-37cc69cd1f98 +1 / M + +# ╔═║ ace4ea8d-9669-4aa4-a3fd-eb126697e7d9 +function metropolings_hastings(f, g, xβ‚€; n=100) + samples = typeof(xβ‚€)[] + accepted = Bool[] + xβ‚œ = xβ‚€ + while count(accepted) < n + G = g(xβ‚œ) + xβ€² = rand(G) + push!(samples, xβ€²) + Ξ± = f(xβ€²) / f(xβ‚œ) + if rand() ≀ Ξ± + push!(accepted, true) + xβ‚œ = xβ€² + else + push!(accepted, false) + end + end + return samples, accepted +end + + +# ╔═║ ed5e7bb7-1a0f-4c89-9b88-d9a960400bda +samples_MH, accepted_MH = metropolings_hastings(f, x->MultivariateNormal(x, 0.3I), randn(2); n=100) + +# ╔═║ d51d6929-a6c6-4b31-ba42-201a783a1869 +begin + scatter!(deepcopy(p_donut), first.(samples_MH[accepted_MH]), last.(samples_MH[accepted_MH]), label="accepted", ms=2) + scatter!(first.(samples_MH[.!accepted_MH]), last.(samples_MH[.!accepted_MH]), label="rejected", ms=2, alpha=0.2) + plot!(first.(samples_MH), last.(samples_MH), label="", alpha=0.5, lw=0.5, color="grey") +end + +# ╔═║ 429e5106-76f2-4318-ae8b-63fcce7f685a +function leapfrog(xβ‚œ, pβ‚œ, Ο΅, βˆ‡U) + phalf = pβ‚œ .- Ο΅ / 2 .* βˆ‡U(xβ‚œ) + xβ‚œ = xβ‚œ .+ Ο΅ .* phalf + pβ‚œ = phalf .- Ο΅ /2 .* βˆ‡U(xβ‚œ) + return xβ‚œ, pβ‚œ +end + +# ╔═║ eea393d0-5c87-4911-8063-2a1ce27f37b6 +function hamiltonian_monte_carlo(f, xβ‚€; Οƒβ‚š=1, Ο΅, L, n=100) + U(x) = -log(f(x)) + βˆ‡U(x) = U'(x) + samples = typeof(xβ‚€)[] + pβ‚œ = randn(length(xβ‚€)) .* Οƒβ‚š + xβ‚œ = xβ‚€ + for i in 1:n + for _ in 1:L + xβ‚œ, pβ‚œ = leapfrog(xβ‚œ, pβ‚œ, Ο΅, βˆ‡U) + end + pβ‚œ .= randn(length(xβ‚€)) .* Οƒβ‚š + push!(samples, xβ‚œ) + end + return samples +end + +# ╔═║ 7a2dcc5c-b7b7-4e09-88b5-b38619a3e249 +samples_hmc = hamiltonian_monte_carlo(f, randn(2), Οƒβ‚š=1, Ο΅=0.1, L=5, n=100) + +# ╔═║ d5450495-3d9a-46b1-a53d-c0a3d69a6f5f +begin + scatter!(deepcopy(p_donut), first.(samples_hmc), last.(samples_hmc), label="HMC", ms=2) + + plot!(first.(samples_hmc), last.(samples_hmc), label="", alpha=0.5, lw=0.5, color="grey") +end + +# ╔═║ Cell order: +# ╠═89971672-d3d8-11ee-0f21-13c70f67d6f2 +# ╠═4ced4f92-1832-4c81-a7a6-85f87aab5375 +# ╠═28475353-415b-49cf-9a1a-dd349f297b8c +# ╠═c1ebb67d-8cce-4a12-b13a-fcb823729993 +# ╠═da7fea34-4200-4ea2-a054-6f95d2313d47 +# ╠═0cbe1a45-7090-4a54-9873-8a8ef1c43dcd +# ╠═df31ee7d-c8d8-4725-a1c2-ecf4bca8d61d +# ╠═c27bd239-25ef-428b-b267-773a025cb83b +# ╠═efa7ac57-04c9-4845-995e-f1798bf77aa0 +# ╠═c4710ca9-32a4-4afe-993c-9957af1c4956 +# ╠═98e65ea8-a9e4-458f-8ce7-661fe0b71ea0 +# ╠═7f979860-34de-40bf-8d8c-9fb937692185 +# ╠═3fbfbb95-223b-4ff3-a981-37cc69cd1f98 +# ╠═ace4ea8d-9669-4aa4-a3fd-eb126697e7d9 +# ╠═ed5e7bb7-1a0f-4c89-9b88-d9a960400bda +# ╠═d51d6929-a6c6-4b31-ba42-201a783a1869 +# ╠═9d4d1812-0303-4fa7-a7e8-a10549b61fe6 +# ╠═eea393d0-5c87-4911-8063-2a1ce27f37b6 +# ╠═429e5106-76f2-4318-ae8b-63fcce7f685a +# ╠═7a2dcc5c-b7b7-4e09-88b5-b38619a3e249 +# ╠═d5450495-3d9a-46b1-a53d-c0a3d69a6f5f diff --git a/scripts/simulation_tools backup 1.jl b/scripts/simulation_tools backup 1.jl new file mode 100644 index 00000000..92dc301d --- /dev/null +++ b/scripts/simulation_tools backup 1.jl @@ -0,0 +1,512 @@ +### A Pluto.jl notebook ### +# v0.19.40 + +using Markdown +using InteractiveUtils + +# ╔═║ eb128248-dfbc-11ee-2efb-cb60fad76024 +# ╠═║ skip_as_script = true +#=╠═║ +begin + using Pkg + Pkg.activate("..") +end + ╠═║ =# + +# ╔═║ 4f364a47-c45e-4264-9a00-fb705ff3f169 +using Plots, PlutoUI, LaTeXStrings + +# ╔═║ fd2f6fb4-d6da-4b07-8044-d3e2a09a6b4d +using Catalyst, DifferentialEquations + +# ╔═║ 0b52aede-1a71-4034-9921-2ffc9120c0ae +using Latexify + +# ╔═║ eb30d4b4-ced7-473a-a5df-5ebed6a1c357 +using Symbolics + +# ╔═║ 6e94632a-cad9-49ea-8cdc-e4ec55871682 +using Distributions + +# ╔═║ aec510c8-6f67-4bad-ac60-db8081dfc7f2 +md"## Getting derivatives" + +# ╔═║ 615370c3-4986-454e-85c5-11d447b51ff1 +@variables x + +# ╔═║ 1e7c7e9c-b286-48a2-920b-4ac2fe7e9533 +f(x) = log(x) + sin(x)^2 / x + +# ╔═║ 52082e32-8c8f-4699-a44a-2fbe99b96319 +a = 2 + +# ╔═║ 77e9ad42-87fb-4292-bb89-3b0cb271f1a2 +f(x) + +# ╔═║ 5bbf9db9-4537-416d-9edc-6487961b1690 +Dx = Differential(x) + +# ╔═║ a99a342d-5c69-411d-8bd6-55ed6f14f438 +Dx(f(x)) + +# ╔═║ 8b36f54a-420a-40ae-b655-d25c99fe7182 +df_sym = expand_derivatives(Dx(f(x))) # this expands the derviatve operator + +# ╔═║ 856890fb-a420-4ae0-8f6d-c40763d11cc2 +df = build_function(df_sym, x) |> eval #builds an expression and turns it into a function + +# ╔═║ 9d84b996-a3e2-48c1-ae51-2bfc343bff0f +df(a) + +# ╔═║ e0f9312f-dae9-49ea-9618-e786de59921f +diff_fordiff(f, x; h=1e-10) = (f(x+h) - f(x)) / h + +# ╔═║ 05bd415e-09db-4a19-8ccb-922096f218fc +diff_centrdiff(f, x; h=1e-10) = (f(x+h) - f(x-h)) / 2h + +# ╔═║ 459fe27d-bc53-469d-919d-724a5df98fe9 +diff_complstep(f, x; h=1e-10) = imag(f(x+im*h)) / h + +# ╔═║ f61a7f2d-faa2-4a54-bd4a-c2fac6da888f +g(x) = sin(cos(exp(x)) + x^2) + +# ╔═║ 6ae135a1-72b5-434c-89e6-a0df76338d46 +g(x) + +# ╔═║ 4aa42d80-81b5-4144-8b4a-6c3ebf29d84b +dgdt = Dx(g(x)) |> expand_derivatives |> simplify + +# ╔═║ 9be6aa61-46fe-4d53-941b-6cb0b21133a0 +d2gdt2 = Dx(Dx(g(x))) |> expand_derivatives |> simplify + +# ╔═║ 4c420cd0-975a-4d3b-a6cc-9eca35490c62 +md"## Stiff ODEs" + +# ╔═║ 081852cd-b589-4891-83c0-f19e4da2eb35 +combustion_model = @reaction_network begin + @species u(t)=1/100 + u^2, u => 2u # growth proportional with surface + u^3, u => 0 # decay proportional with volume (oxygen use) +end + +# ╔═║ 39ee1679-23ad-4448-ae20-b55345c950b4 +convert(ODESystem, combustion_model) + +# ╔═║ 43183390-219c-4ade-a92a-80373a7c8585 +combustion_problem = ODEProblem(combustion_model, [:u=>1/100], (0.0, 200.0)) + +# ╔═║ b446a764-b80a-43c6-9fd1-72b099cfed0d +radicals = @reaction_network begin + @species A(t)=10.0 B(t)=10.0 C(t)=10.0 + 0.04, A --> B + 3e7, B + B --> C + B + 1e4, B + C --> A + C +end + +# ╔═║ c90f5869-89f8-486e-a4ad-9e4fbbd1eccd +#latexify(radicals, form=:ode) |> println + +# ╔═║ 8372fad0-07ea-4905-8b8e-26316aa93f68 + + +# ╔═║ 312e9d28-ed88-47ae-92b1-b1334e2e9d7a +plot(solve(ODEProblem(radicals, [], (0.0, 40.0)), Rosenbrock23())) + +# ╔═║ 2aad9bca-736f-4aaa-ad50-74cc01661117 +plot(solve(ODEProblem(radicals, [], (0.0, 1e12)), Rosenbrock23())) + +# ╔═║ 945febc8-2954-4d5c-a4b1-7f95c70ef4b6 +md"## Stochastic differential equations" + +# ╔═║ 6501070e-9093-4928-89b9-b9dd34128810 +brownian_motion = @reaction_network begin + @species A(t)=1 + @parameters r₁=2 rβ‚‚=1 + r₁, βˆ… --> A + rβ‚‚, A --> βˆ… +end + +# ╔═║ 6c5f1ee1-ece0-4a44-8e92-c375f2bd40a7 +sprob_bm = SDEProblem(brownian_motion, [], (0., 20.)) + +# ╔═║ 7d0a5294-6fc2-45d5-b04f-2824649f5d81 +#println(latexify(brownian_motion)) + +# ╔═║ cba57c64-a43f-4a4c-a793-86358131ef70 +competition_model = @reaction_network begin + @species A(t)=2.0 B(t)=2.5 + @parameters r=0.5 K=100 d=0.1 + r * (1 - (A+B) / K), A --> 2A + r * (1 - (A+B) / K), B --> 2B + d, (A, B) --> βˆ… +end + +# ╔═║ 44142e83-1f6c-4644-996e-246817748b7e +println(competition_model) + +# ╔═║ 1924514f-0112-4ec8-830a-4eed54d81392 +latexify(competition_model, form=:ode) |> println + +# ╔═║ a807b275-99fa-47c8-abc0-e9afcde445b8 + + +# ╔═║ bc5adc9a-6f9c-4d55-ae8f-9bb8af5ff644 +convert(ODESystem, competition_model) + +# ╔═║ ffa88278-4f16-4f4a-9b12-9a475254dc63 +oprob_comp = ODEProblem(competition_model, [], (0., 50.)) + +# ╔═║ bc48b429-6382-47a9-91d5-02a9941f5c79 +sprob_comp = SDEProblem(competition_model, [], (0., 50.)) + +# ╔═║ 23f1da8d-7a67-4dab-8928-f1f5480fadd0 +sol_ode = solve(oprob_comp); + +# ╔═║ a72a568b-17c8-4350-b719-d72abbb10e84 +sol_sde = solve(sprob_comp); + +# ╔═║ 4f671499-19b2-426c-a689-2ee4b084f3d0 +md"## Discrete stochastic differential equations" + +# ╔═║ ade6e868-48ff-4b54-88ca-d180f115ca39 +function gillespie_sir(Sβ‚€, Iβ‚€, Rβ‚€, Ξ±, Ξ², t_end) + S, I, R = Sβ‚€, Iβ‚€, Rβ‚€ + t = 0.0 + timesteps = [t] + states = [(;S, I, R)] + while t < t_end + # compute propensities + a_i = Ξ± * S * I # infection + a_r = Ξ² * I # recovery + # total propensity + Rtot = a_i + a_r + Rtot == 0 && break + # sample time step + Ο„ = rand(Exponential(1 / Rtot)) + # update + if rand() < (a_i / Rtot) # infection + S -= 1 + I += 1 + else # recovery + I -= 1 + R += 1 + end + t += Ο„ + push!(states, (;S, I, R)) + push!(timesteps, t) + end + return timesteps, states +end + +# ╔═║ a9ba703a-c9f6-4c9a-930c-3d5c977bd559 +Sβ‚€ = 50 + +# ╔═║ a7049066-b990-470f-804d-00adb9201122 +Iβ‚€ = 2 + +# ╔═║ bfe45dd0-d429-40ef-859f-f5f6e2752904 +Rβ‚€ = 0 + +# ╔═║ 1e212d4d-5722-4c29-b27d-5d8ce128a1dd +Ξ± = 0.004 + +# ╔═║ addfa406-0a45-4ba1-a6e1-345ef987ca3e +Ξ² = 0.03 + +# ╔═║ 71d37d78-7a92-4971-aa6f-098030d618e4 +timesteps, sir_states = gillespie_sir(Sβ‚€, Iβ‚€, Rβ‚€, Ξ±, Ξ², 100) + +# ╔═║ aa9089b2-38b8-4ab1-9b34-87ee5b017c1d +sir_model = @reaction_network begin + Ξ±, S + I --> 2I + Ξ², I --> R +end + +# ╔═║ 3343b335-54c6-42b6-b2e1-f78bdf791b30 +first.(sir_states) + +# ╔═║ 1e2caf48-30b3-4094-a159-a94585e248b3 +pars_sir = [:Ξ±=>Ξ±, :Ξ²=>Ξ²] + +# ╔═║ 5ac23911-376f-4ee7-ba33-a120b80e1020 +u0_sir = [:S=>Sβ‚€, :I=>Iβ‚€, :R=>Rβ‚€] + +# ╔═║ 06cadbd3-01ae-4f68-ab1a-7e8bc4a7b00a + + +# ╔═║ f57de319-5025-4ec8-a437-163b8ab0b94e +sir_oprob = ODEProblem(sir_model, u0_sir, (0.0, 100.0), pars_sir) + +# ╔═║ d0aa9ea8-38cb-4f00-92d2-58740ab2d32a +sir_dprob = DiscreteProblem(sir_model, u0_sir, (0.0, 100.0), pars_sir) + +# ╔═║ 88a00ea8-9c7b-49fc-8771-2324576a0124 +sir_jprob = JumpProblem(sir_model, sir_dprob, Direct()) + +# ╔═║ 9265ba3b-5979-4755-a7b8-cd422040de8c + + +# ╔═║ 5c3c6af6-add6-4f1a-91ca-0251b43d5e1a +plot(solve(sir_oprob)) + +# ╔═║ c9fb3ebb-e37a-42dc-85f4-87b4fc5ca492 +plot(solve(sir_jprob, SSAStepper())) + +# ╔═║ 3122f1ec-7c47-4873-bd6c-94f1a8616088 +convert(ODESystem, sir_model) + +# ╔═║ 486c9c19-e2ed-4632-be5d-b76dadf433c4 +hcat(sir_states...) + +# ╔═║ 26c3f4e0-dc66-43cc-9215-94e5c73531d8 +timesteps + +# ╔═║ 04eeeae2-f525-4717-a397-39b895fa80eb +sir_states + +# ╔═║ 7055aa36-e4d8-42e6-a92c-f7d8ec5aa960 +second(x) = x[2] + +# ╔═║ 627418f5-33fe-4515-8a0e-7f79774814d8 +let + S_gp = first.(sir_states) + I_gp = second.(sir_states) + R_gp = last.(sir_states) + p_gp = plot(timesteps, S_gp, label="S", xlab="t") + plot!(timesteps, I_gp, label="I") + plot!(timesteps, R_gp, label="R") +end + +# ╔═║ 13036978-3008-4d7e-9661-a967381f4db6 +plots = Dict() + +# ╔═║ 6e433b23-3915-466a-85ca-31948896e3cb +plots["example_diff"] = plot(f, 1, 5, label=L"f(x)", lw=2, xlab=L"x") + +# ╔═║ 525ae0f8-026a-43a3-a8b4-3a101c8ad6a7 +if !ismissing(f(a)) +plot(f, 1, 10, label="\$f(x)\$", xlabel="\$x\$", lw=2) +plots["fdiff_example"] = plot!(df, 1, 10, label="\$f'(x)\$", lw=2) +end + +# ╔═║ ae5be024-863d-46f1-b5d9-fc691b10e63b +let + fexamp(x) = 64x*(1-x)*(1-2x)^2*(1-8x+8x^2)^2 + #dfexamp = diff(fexamp(x), x) + dfexamp = build_function(expand_derivatives(Dx(fexamp(x))), x) |> eval + error(diff, h; x=1.0) = max(abs(Float64(dfexamp(x)) - diff(fexamp, x, h=h)), 1e-50) + stepsizes = map(t->10.0^t, -20:0.1:-1); + p = plot(stepsizes, error.(diff_fordiff, stepsizes), label="forward difference", + xscale=:log10, yscale=:log10, lw=2, legend=:bottomright) + plot!(stepsizes, error.(diff_centrdiff, stepsizes), label="central difference", lw=2) + plot!(stepsizes, error.(diff_complstep, stepsizes), label="complex step", lw=2) + xlabel!("\$h\$") + ylabel!("absolute error") + plots["numdiff_error"] = p +end + +# ╔═║ e22ed4e6-6420-490c-9d55-fee19069f534 +let + p = plot(solve(combustion_problem, Tsit5()), lw=2, title="Combustion model (general solver)") + plots["combustion_Tsi5"] = p + p +end + +# ╔═║ f2201e7f-9aec-4962-a9b7-a7fd627d64e6 +let + p = plot(solve(combustion_problem, Rosenbrock23()), lw=2, title="Combustion model (stiff solver)") + plots["combustion_Rosenbrock"] = p + p +end + +# ╔═║ 8fcdad45-8789-473e-9d1a-2692b62d526d +let + # variant starting close to the equilibrium + combustion_problem2 = ODEProblem(combustion_model, [:u=>0.999], (0.0, 200.0)) + sol_combustion_nonstiff = solve(combustion_problem2, Tsit5()) + sol_combustion_stiff = solve(combustion_problem2, Rosenbrock23()) + p = plot(sol_combustion_nonstiff, label="non-stiff solver (Tsit5)", lw=2) + plot!(sol_combustion_stiff, label="stiff (Rosenbrock23)", lw=2) + plots["combustion_solvers"] = p + p +end + +# ╔═║ 5099fd5b-735e-4de3-918a-685dd4a82c22 +let + Ο„ = 0.01 # stepsize + tsteps = 0:Ο„:10 + X = randn(length(tsteps), 5) + W = cumsum(X, dims=1) + W .-= X[[1], :] # start at 0 + W .*= √(Ο„) + p = plot(tsteps, W, lw=2, xlab=L"t", ylab=L"W(t)", + title="Five draws form a Wiener process", label="") + plots["Wiener"] = p + p +end + +# ╔═║ 18def41b-0827-4356-adfa-d3fc63e23cfa +let + Ο„ = 0.001 # stepsize + tsteps = 0:Ο„:5 + mask = 2 .≀ tsteps .≀ 3 + + x = randn(length(tsteps)) + w = cumsum(x) + w .-= x[1] + w .*= √(Ο„) + plarge = plot(tsteps[1:10:end], w[1:10:end]) + vspan!(plarge, [2, 3], alpha=0.3) + psmall = plot(tsteps[mask], w[mask]) + p = plot(plarge, psmall, + layout=(2,1), xlab=L"t",ylab=L"W(t)", lw=2, label="") + plots["Wiener_scalefree"] = p + p +end + +# ╔═║ 3d549763-2ba2-48b6-b486-2ddd462977dd +let + p = plot(solve(sprob_bm), lw=2) + plots["brownian_motion"] = p + p +end + +# ╔═║ 98b16b2b-e792-41ef-a601-08289236af98 +let + p_ode = plot(sol_ode, lw=2, title="simulation competition ODE") + plots["competition_ode"] = p_ode + p_ode +end + +# ╔═║ 23b18b26-18de-4e08-abcf-ae5b5ac5af3d +let + p_sde = plot(sol_sde, lw=2, title="Monte Carlo simulation competition SDE") + plots["competition_sde"] = p_sde + p_sde +end + +# ╔═║ 53f1b6b4-a1e8-4e4d-b936-eebc5c37a712 +let + p_sde = plot(solve(sprob_comp), lw=2, title="Monte Carlo simulation competition SDE (second throw)") + plots["competition_sde2"] = p_sde + p_sde +end + +# ╔═║ b90e3157-3aed-4371-a396-283305a4d5b5 +let + + p = plot(sol_ode, idxs=(:A, :B), lw=2, label="ODE", title="Phase plot competition model", color="black", ls=:dash) + plot!(p, sol_sde, idxs=(1, 2), lw=2, label="SDE", xlab="A", ylab="B", color="grey") + scatter!([2], [2.5], color="red", label="xβ‚€") + plots["competition_phaseplot"] = p + p +end + +# ╔═║ bb562e40-daaf-47be-a1d0-1938bc227fc0 +begin + nβ‚€ = 20 + r = 0.1 + ns = [nβ‚€] + ts = [0.0] + while last(ns) > 0 + t, n = last(ts), last(ns) + Ο„ = rand(Exponential(1/(n*r))) + push!(ns, n-1) + push!(ts, t+Ο„) + end + + p_discrete_decay = scatter(ts, ns, xlab=L"t", ylab=L"n", label="", title="Random decay of $(nβ‚€) particles") + p_decay_times = bar(0:nβ‚€-1, diff(ts), xlab=L"n_0-n", ylabel=L"\tau",label="", title="Event times") + plot!(p_decay_times, inv.((nβ‚€:-1:1) .* r), label=L"1/nr", lw=2) + plots["discrete_decay"] = p_discrete_decay + plots["discrete_decay_eventtimes"] = p_decay_times +end; + +# ╔═║ e2dd1f82-031b-46eb-ac8e-9d03172db770 +p_discrete_decay + +# ╔═║ 38802384-48b0-4d29-aab3-2578527f995b +p_decay_times + +# ╔═║ aa3056b8-7140-4271-885d-8392c3634af6 +let + p = plot(solve(sir_jprob, SSAStepper()), lw=2, title="Discrete SIR model") + sol_sir_ode = solve(sir_oprob) + plot!(sol_sir_ode, idxs=:S, label="", alpha=0.5, color=:blue, ls=:dash, lw=2) + plot!(sol_sir_ode, idxs=:I, label="", alpha=0.5, color=:orange, ls=:dash, lw=2) + plot!(sol_sir_ode, idxs=:R, label="", alpha=0.5, color=:green, ls=:dash, lw=2) + plots["Gillespie_SIR"] = p + p +end + +# ╔═║ bfbccda0-8648-435f-8b12-13957c574f54 +plots + +# ╔═║ Cell order: +# ╠═eb128248-dfbc-11ee-2efb-cb60fad76024 +# ╠═4f364a47-c45e-4264-9a00-fb705ff3f169 +# ╠═fd2f6fb4-d6da-4b07-8044-d3e2a09a6b4d +# β•Ÿβ”€4c420cd0-975a-4d3b-a6cc-9eca35490c62 +# ╠═081852cd-b589-4891-83c0-f19e4da2eb35 +# ╠═39ee1679-23ad-4448-ae20-b55345c950b4 +# ╠═43183390-219c-4ade-a92a-80373a7c8585 +# β•Ÿβ”€e22ed4e6-6420-490c-9d55-fee19069f534 +# β•Ÿβ”€f2201e7f-9aec-4962-a9b7-a7fd627d64e6 +# β•Ÿβ”€8fcdad45-8789-473e-9d1a-2692b62d526d +# ╠═b446a764-b80a-43c6-9fd1-72b099cfed0d +# ╠═c90f5869-89f8-486e-a4ad-9e4fbbd1eccd +# ╠═8372fad0-07ea-4905-8b8e-26316aa93f68 +# ╠═312e9d28-ed88-47ae-92b1-b1334e2e9d7a +# ╠═2aad9bca-736f-4aaa-ad50-74cc01661117 +# ╠═945febc8-2954-4d5c-a4b1-7f95c70ef4b6 +# β•Ÿβ”€5099fd5b-735e-4de3-918a-685dd4a82c22 +# β•Ÿβ”€18def41b-0827-4356-adfa-d3fc63e23cfa +# ╠═6501070e-9093-4928-89b9-b9dd34128810 +# ╠═6c5f1ee1-ece0-4a44-8e92-c375f2bd40a7 +# ╠═7d0a5294-6fc2-45d5-b04f-2824649f5d81 +# ╠═3d549763-2ba2-48b6-b486-2ddd462977dd +# ╠═cba57c64-a43f-4a4c-a793-86358131ef70 +# ╠═44142e83-1f6c-4644-996e-246817748b7e +# ╠═1924514f-0112-4ec8-830a-4eed54d81392 +# ╠═a807b275-99fa-47c8-abc0-e9afcde445b8 +# ╠═bc5adc9a-6f9c-4d55-ae8f-9bb8af5ff644 +# ╠═ffa88278-4f16-4f4a-9b12-9a475254dc63 +# β•Ÿβ”€98b16b2b-e792-41ef-a601-08289236af98 +# ╠═bc48b429-6382-47a9-91d5-02a9941f5c79 +# β•Ÿβ”€23b18b26-18de-4e08-abcf-ae5b5ac5af3d +# β•Ÿβ”€53f1b6b4-a1e8-4e4d-b936-eebc5c37a712 +# β•Ÿβ”€b90e3157-3aed-4371-a396-283305a4d5b5 +# ╠═23f1da8d-7a67-4dab-8928-f1f5480fadd0 +# ╠═a72a568b-17c8-4350-b719-d72abbb10e84 +# ╠═4f671499-19b2-426c-a689-2ee4b084f3d0 +# ╠═6e94632a-cad9-49ea-8cdc-e4ec55871682 +# ╠═bb562e40-daaf-47be-a1d0-1938bc227fc0 +# β•Ÿβ”€e2dd1f82-031b-46eb-ac8e-9d03172db770 +# ╠═38802384-48b0-4d29-aab3-2578527f995b +# ╠═ade6e868-48ff-4b54-88ca-d180f115ca39 +# ╠═a9ba703a-c9f6-4c9a-930c-3d5c977bd559 +# ╠═a7049066-b990-470f-804d-00adb9201122 +# ╠═bfe45dd0-d429-40ef-859f-f5f6e2752904 +# ╠═1e212d4d-5722-4c29-b27d-5d8ce128a1dd +# ╠═addfa406-0a45-4ba1-a6e1-345ef987ca3e +# ╠═71d37d78-7a92-4971-aa6f-098030d618e4 +# ╠═627418f5-33fe-4515-8a0e-7f79774814d8 +# ╠═aa9089b2-38b8-4ab1-9b34-87ee5b017c1d +# ╠═3343b335-54c6-42b6-b2e1-f78bdf791b30 +# ╠═1e2caf48-30b3-4094-a159-a94585e248b3 +# ╠═5ac23911-376f-4ee7-ba33-a120b80e1020 +# ╠═06cadbd3-01ae-4f68-ab1a-7e8bc4a7b00a +# ╠═f57de319-5025-4ec8-a437-163b8ab0b94e +# ╠═d0aa9ea8-38cb-4f00-92d2-58740ab2d32a +# ╠═88a00ea8-9c7b-49fc-8771-2324576a0124 +# β•Ÿβ”€aa3056b8-7140-4271-885d-8392c3634af6 +# ╠═9265ba3b-5979-4755-a7b8-cd422040de8c +# ╠═5c3c6af6-add6-4f1a-91ca-0251b43d5e1a +# ╠═c9fb3ebb-e37a-42dc-85f4-87b4fc5ca492 +# ╠═3122f1ec-7c47-4873-bd6c-94f1a8616088 +# ╠═486c9c19-e2ed-4632-be5d-b76dadf433c4 +# ╠═26c3f4e0-dc66-43cc-9215-94e5c73531d8 +# ╠═04eeeae2-f525-4717-a397-39b895fa80eb +# ╠═7055aa36-e4d8-42e6-a92c-f7d8ec5aa960 +# ╠═13036978-3008-4d7e-9661-a967381f4db6 +# ╠═bfbccda0-8648-435f-8b12-13957c574f54 diff --git a/scripts/simulation_tools.jl b/scripts/simulation_tools.jl new file mode 100644 index 00000000..e7d2d212 --- /dev/null +++ b/scripts/simulation_tools.jl @@ -0,0 +1,750 @@ +### A Pluto.jl notebook ### +# v0.20.3 + +using Markdown +using InteractiveUtils + +# ╔═║ eb128248-dfbc-11ee-2efb-cb60fad76024 +# ╠═║ skip_as_script = true +#=╠═║ +begin + using Pkg + Pkg.activate("..") +end + ╠═║ =# + +# ╔═║ 4f364a47-c45e-4264-9a00-fb705ff3f169 +using Plots, PlutoUI, LaTeXStrings + +# ╔═║ fd2f6fb4-d6da-4b07-8044-d3e2a09a6b4d +using Catalyst, DifferentialEquations + +# ╔═║ 6e94632a-cad9-49ea-8cdc-e4ec55871682 +using Distributions + +# ╔═║ eb30d4b4-ced7-473a-a5df-5ebed6a1c357 +using Symbolics + +# ╔═║ 0b52aede-1a71-4034-9921-2ffc9120c0ae +using Latexify + +# ╔═║ ff86545c-64a2-4c6f-8c36-9066b270aa6b +md""" +## Events and callbacks +""" + +# ╔═║ 018d215a-41f4-4d21-b57f-fca3ac3a755d +md"### Bouncing ball" + +# ╔═║ 992d2b4f-6521-4368-910d-3e7ef07fb6df +function ball!(du, u, g, t) + y, v = u + du[1] = v + du[2] = -g + return du +end + +# ╔═║ 89d089b2-3220-4696-9ded-364c318b4a1e +md"### Dosed bioreactor" + +# ╔═║ 21e810e7-0879-4ffb-84f9-d67dafb900d6 +bacterial_growth = @reaction_network begin + @species X(t)=10 G(t)=8 + @parameters r=0.2 m=0.8 + r, X + G --> 2X + m, X --> 0 +end + +# ╔═║ 7b3ca635-5a3c-43f2-9690-5cdbd9074ed2 +# ╠═║ disabled = true +#=╠═║ +let + dosetimes = 5:5:20 + affect!(integrator) = integrator.u[2] += 10 + cb = PresetTimeCallback(dosetimes, affect!) + + prob = ODEProblem(bacterial_growth, [], (0, 20)) + sol = solve(prob, Tsit5(), callback=cb) + plots["undosed bioreactor"] = plot(solve(prob, Tsit5()), lw=2, + title="Undosed bioreactor") + plots["dosed_bioreactor"] = plot(sol, lw=2, title="Dosed bioreactor") +end + ╠═║ =# + +# ╔═║ 4c7feb9f-a039-48a8-a7d0-3633f1a635fe +dosetimes = 5:5:20 + +# ╔═║ 5ae78d7c-fc07-45f3-a59b-eb032ff2974d +timed_feeding = [dosetimes] => [bacterial_growth.G ~ bacterial_growth.G + 10] + +# ╔═║ 90a998c4-5fdd-42c3-9086-267a46fe3999 +#@named reactor_dosed = ReactionSystem(equations(bacterial_growth); discrete_events=timed_feeding) + +# ╔═║ 4c420cd0-975a-4d3b-a6cc-9eca35490c62 +md"## Stiff ODEs" + +# ╔═║ 081852cd-b589-4891-83c0-f19e4da2eb35 +combustion_model = @reaction_network begin + @species u(t)=1/100 + u^2, u => 2u # growth proportional with surface + u^3, u => 0 # decay proportional with volume (oxygen use) +end + +# ╔═║ 39ee1679-23ad-4448-ae20-b55345c950b4 +convert(ODESystem, combustion_model) + +# ╔═║ 43183390-219c-4ade-a92a-80373a7c8585 +combustion_problem = ODEProblem(combustion_model, [:u=>1/100], (0.0, 200.0)) + +# ╔═║ 22ff7a8b-fbae-4c5a-86c7-92d9c4eb7935 +plot(u->u^2 - u^3, 0, 1, xlab="u", ylab="u'", lw=2) + +# ╔═║ b446a764-b80a-43c6-9fd1-72b099cfed0d +radicals = @reaction_network begin + @species A(t)=10.0 B(t)=0 C(t)=0 + 0.04, A --> B + 3e7, B + B --> C + B + 1e4, B + C --> A + C +end + +# ╔═║ c90f5869-89f8-486e-a4ad-9e4fbbd1eccd +#latexify(radicals, form=:ode) |> println + +# ╔═║ 8372fad0-07ea-4905-8b8e-26316aa93f68 + + +# ╔═║ 312e9d28-ed88-47ae-92b1-b1334e2e9d7a +plot(solve(ODEProblem(radicals, [], (0.0, 10)), Tsit5())) + +# ╔═║ 2cba2928-c7a7-4304-97ab-2efb5d6a8297 +@time solve(ODEProblem(radicals, [], (0.0, 10)), Tsit5()) |> length + +# ╔═║ 2aad9bca-736f-4aaa-ad50-74cc01661117 +plot(solve(ODEProblem(radicals, [], (0.0, 10)), Rosenbrock23())) + +# ╔═║ 80404482-0534-43fd-8783-84ae6522706d +@time solve(ODEProblem(radicals, [], (0.0, 10)), Rosenbrock23()) |> length + +# ╔═║ 945febc8-2954-4d5c-a4b1-7f95c70ef4b6 +md"## Stochastic differential equations" + +# ╔═║ 6501070e-9093-4928-89b9-b9dd34128810 +brownian_motion = @reaction_network begin + @species A(t)=1 + @parameters r₁=2 rβ‚‚=1 + r₁, βˆ… --> A + rβ‚‚, A --> βˆ… +end + +# ╔═║ 6c5f1ee1-ece0-4a44-8e92-c375f2bd40a7 +sprob_bm = SDEProblem(brownian_motion, [], (0., 20.)) + +# ╔═║ 7d0a5294-6fc2-45d5-b04f-2824649f5d81 +#println(latexify(brownian_motion)) + +# ╔═║ cba57c64-a43f-4a4c-a793-86358131ef70 +competition_model = @reaction_network begin + @species A(t)=2.0 B(t)=2.5 + @parameters r=0.5 K=100 d=0.1 + r * (1 - (A+B) / K), A --> 2A + r * (1 - (A+B) / K), B --> 2B + d, (A, B) --> βˆ… +end + +# ╔═║ bc5adc9a-6f9c-4d55-ae8f-9bb8af5ff644 +convert(ODESystem, competition_model) + +# ╔═║ ffa88278-4f16-4f4a-9b12-9a475254dc63 +oprob_comp = ODEProblem(competition_model, [], (0., 50.)) + +# ╔═║ bc48b429-6382-47a9-91d5-02a9941f5c79 +sprob_comp = SDEProblem(competition_model, [], (0., 50.)) + +# ╔═║ 23f1da8d-7a67-4dab-8928-f1f5480fadd0 +sol_ode = solve(oprob_comp) + +# ╔═║ a72a568b-17c8-4350-b719-d72abbb10e84 +sol_sde = solve(sprob_comp); + +# ╔═║ 6826363e-d807-4c52-a26a-018e5c6868c9 +eprob = EnsembleProblem(sprob_comp) + +# ╔═║ 26f8a52c-3f8d-4928-9f33-a15995323cb5 +comp_ensemble = solve(eprob; trajectories = 20) + +# ╔═║ 3604baf4-7623-4842-aeb8-74785417b398 +e_sumary = EnsembleAnalysis.EnsembleSummary(comp_ensemble) + +# ╔═║ 4f671499-19b2-426c-a689-2ee4b084f3d0 +md"## Discrete stochastic differential equations" + +# ╔═║ 2ee4fe85-feed-471d-86e2-53212fc05650 +0.1/log(2) + +# ╔═║ ade6e868-48ff-4b54-88ca-d180f115ca39 +function gillespie_sir(Sβ‚€, Iβ‚€, Rβ‚€, Ξ±, Ξ², t_end) + S, I, R = Sβ‚€, Iβ‚€, Rβ‚€ + t = 0.0 + timesteps = [t] + states = [(;S, I, R)] + while t < t_end + # compute propensities + a_i = Ξ± * S * I # infection + a_r = Ξ² * I # recovery + # total propensity + Rtot = a_i + a_r + Rtot == 0 && break + # sample time step + Ο„ = rand(Exponential(1 / Rtot)) + # update + if rand() < (a_i / Rtot) # infection + S -= 1 + I += 1 + else # recovery + I -= 1 + R += 1 + end + t += Ο„ + push!(states, (;S, I, R)) + push!(timesteps, t) + end + return timesteps, states +end + +# ╔═║ a9ba703a-c9f6-4c9a-930c-3d5c977bd559 +Sβ‚€ = 50 + +# ╔═║ a7049066-b990-470f-804d-00adb9201122 +Iβ‚€ = 2 + +# ╔═║ bfe45dd0-d429-40ef-859f-f5f6e2752904 +Rβ‚€ = 0 + +# ╔═║ 1e212d4d-5722-4c29-b27d-5d8ce128a1dd +Ξ± = 0.004 + +# ╔═║ addfa406-0a45-4ba1-a6e1-345ef987ca3e +Ξ² = 0.03 + +# ╔═║ 71d37d78-7a92-4971-aa6f-098030d618e4 +timesteps, sir_states = gillespie_sir(Sβ‚€, Iβ‚€, Rβ‚€, Ξ±, Ξ², 100) + +# ╔═║ aa9089b2-38b8-4ab1-9b34-87ee5b017c1d +sir_model = @reaction_network begin + Ξ±, S + I --> 2I + Ξ², I --> R +end + +# ╔═║ 3343b335-54c6-42b6-b2e1-f78bdf791b30 +first.(sir_states) + +# ╔═║ 1e2caf48-30b3-4094-a159-a94585e248b3 +pars_sir = [:Ξ±=>Ξ±, :Ξ²=>Ξ²] + +# ╔═║ 5ac23911-376f-4ee7-ba33-a120b80e1020 +u0_sir = [:S=>Sβ‚€, :I=>Iβ‚€, :R=>Rβ‚€] + +# ╔═║ 06cadbd3-01ae-4f68-ab1a-7e8bc4a7b00a + + +# ╔═║ f57de319-5025-4ec8-a437-163b8ab0b94e +sir_oprob = ODEProblem(sir_model, u0_sir, (0.0, 100.0), pars_sir) + +# ╔═║ d0aa9ea8-38cb-4f00-92d2-58740ab2d32a +sir_dprob = DiscreteProblem(sir_model, u0_sir, (0.0, 100.0), pars_sir) + +# ╔═║ 88a00ea8-9c7b-49fc-8771-2324576a0124 +sir_jprob = JumpProblem(sir_model, sir_dprob, Direct()) + +# ╔═║ 5c3c6af6-add6-4f1a-91ca-0251b43d5e1a +plot(solve(sir_oprob), lw=2) + +# ╔═║ c9fb3ebb-e37a-42dc-85f4-87b4fc5ca492 +plot(solve(sir_jprob, SSAStepper())) + +# ╔═║ 3122f1ec-7c47-4873-bd6c-94f1a8616088 +convert(ODESystem, sir_model) + +# ╔═║ 486c9c19-e2ed-4632-be5d-b76dadf433c4 +hcat(sir_states...) + +# ╔═║ 26c3f4e0-dc66-43cc-9215-94e5c73531d8 +timesteps + +# ╔═║ 04eeeae2-f525-4717-a397-39b895fa80eb +sir_states + +# ╔═║ 7055aa36-e4d8-42e6-a92c-f7d8ec5aa960 +second(x) = x[2] + +# ╔═║ 627418f5-33fe-4515-8a0e-7f79774814d8 +let + S_gp = first.(sir_states) + I_gp = second.(sir_states) + R_gp = last.(sir_states) + p_gp = plot(timesteps, S_gp, label="S", xlab="t") + plot!(timesteps, I_gp, label="I") + plot!(timesteps, R_gp, label="R") +end + +# ╔═║ aec510c8-6f67-4bad-ac60-db8081dfc7f2 +md"## Getting derivatives" + +# ╔═║ 1e7c7e9c-b286-48a2-920b-4ac2fe7e9533 +# ╠═║ skip_as_script = true +#=╠═║ +f(x) = log(x) + sin(x)^2 / x + ╠═║ =# + +# ╔═║ 459fe27d-bc53-469d-919d-724a5df98fe9 +diff_complstep(f, x; h=1e-10) = imag(f(x+im*h)) / h + +# ╔═║ f61a7f2d-faa2-4a54-bd4a-c2fac6da888f +# ╠═║ skip_as_script = true +#=╠═║ +g(x) = sin(cos(exp(x)) + x^2) + ╠═║ =# + +# ╔═║ 615370c3-4986-454e-85c5-11d447b51ff1 +@variables x + +# ╔═║ 6ae135a1-72b5-434c-89e6-a0df76338d46 +# ╠═║ skip_as_script = true +#=╠═║ +g(x) + ╠═║ =# + +# ╔═║ 77e9ad42-87fb-4292-bb89-3b0cb271f1a2 +# ╠═║ skip_as_script = true +#=╠═║ +f(x) + ╠═║ =# + +# ╔═║ e0f9312f-dae9-49ea-9618-e786de59921f +# ╠═║ skip_as_script = true +#=╠═║ +diff_fordiff(f, x; h=1e-10) = (f(x+h) - f(x)) / h + ╠═║ =# + +# ╔═║ 05bd415e-09db-4a19-8ccb-922096f218fc +diff_centrdiff(f, x; h=1e-10) = (f(x+h) - f(x-h)) / 2h + +# ╔═║ 52082e32-8c8f-4699-a44a-2fbe99b96319 +a = 2 + +# ╔═║ 5bbf9db9-4537-416d-9edc-6487961b1690 +Dx = Differential(x) + +# ╔═║ a99a342d-5c69-411d-8bd6-55ed6f14f438 +#=╠═║ +Dx(f(x)) + ╠═║ =# + +# ╔═║ 8b36f54a-420a-40ae-b655-d25c99fe7182 +# ╠═║ skip_as_script = true +#=╠═║ +df_sym = expand_derivatives(Dx(f(x))) # this expands the derviatve operator + ╠═║ =# + +# ╔═║ 856890fb-a420-4ae0-8f6d-c40763d11cc2 +# ╠═║ skip_as_script = true +#=╠═║ +df = build_function(df_sym, x) |> eval #builds an expression and turns it into a function + ╠═║ =# + +# ╔═║ 9d84b996-a3e2-48c1-ae51-2bfc343bff0f +# ╠═║ skip_as_script = true +#=╠═║ +df(a) + ╠═║ =# + +# ╔═║ 9be6aa61-46fe-4d53-941b-6cb0b21133a0 +#=╠═║ +d2gdt2 = Dx(Dx(g(x))) |> expand_derivatives |> simplify + ╠═║ =# + +# ╔═║ 4aa42d80-81b5-4144-8b4a-6c3ebf29d84b +# ╠═║ skip_as_script = true +#=╠═║ +dgdt = Dx(g(x)) |> expand_derivatives |> simplify + ╠═║ =# + +# ╔═║ 6f6ba9c5-bc87-4b71-82a0-a4c64750a2ab +md"## Appendix" + +# ╔═║ 2bf198cd-4463-4f97-975e-f805a37fa780 +TableOfContents() + +# ╔═║ 13036978-3008-4d7e-9661-a967381f4db6 +plots = Dict() + +# ╔═║ 0de4a715-89d6-403b-ac65-adaed6062371 +let + + function condition(u, t, integrator) + u[1] # check when u[1] (i.e. x) == 0 + end + + function affect!(integrator) + # nearly elastic collision + integrator.u[2] = -0.9integrator.u[2] + end + + cb = ContinuousCallback(condition, affect!) + + u0 = [50.0, 0.0] + tspan = (0.0, 15.0) + g = 9.81 + prob = ODEProblem(ball!, u0, tspan, g) + sol = solve(prob, Tsit5(), callback = cb) + plots["bouncing_ball"] = plot(sol, lw=2, label=[L"y(t)" L"v(t)"], title="Bouncing ball with callbacks") +end + +# ╔═║ 5e7453ce-721b-4e4e-8f75-bb69aac8cf42 +let + @unpack G, X = bacterial_growth + dosing = [5, 10, 15, 20] => [G ~ G + 10] + + @named dosed_reactor = ReactionSystem(equations(bacterial_growth), + discrete_events=dosing) + + dosed_reactor = complete(dosed_reactor) + + oprob = ODEProblem(dosed_reactor, [], (0, 20)) + + sol = solve(oprob, Tsit5()) + + prob = ODEProblem(bacterial_growth, [], (0, 20)) + + plots["undosed bioreactor"] = plot(solve(prob, Tsit5()), lw=2, + title="Undosed bioreactor") + + plots["dosed_bioreactor"] = plot(sol, lw=2, title="Dosed bioreactor") + + #R = G / X + #plot(sol, idxs=[R]) + +end + +# ╔═║ e22ed4e6-6420-490c-9d55-fee19069f534 +let + p = plot(solve(combustion_problem, Tsit5()), lw=2, title="Combustion model (general solver)") + plots["combustion_Tsi5"] = p + p +end + +# ╔═║ f2201e7f-9aec-4962-a9b7-a7fd627d64e6 +let + p = plot(solve(combustion_problem, Rosenbrock23()), lw=2, title="Combustion model (stiff solver)") + plots["combustion_Rosenbrock"] = p + p +end + +# ╔═║ 8fcdad45-8789-473e-9d1a-2692b62d526d +let + # variant starting close to the equilibrium + combustion_problem2 = ODEProblem(combustion_model, [:u=>0.999], (0.0, 200.0)) + sol_combustion_nonstiff = solve(combustion_problem2, Tsit5()) + sol_combustion_stiff = solve(combustion_problem2, Rosenbrock23()) + p = plot(sol_combustion_nonstiff, label="non-stiff solver (Tsit5)", lw=2) + plot!(sol_combustion_stiff, label="stiff (Rosenbrock23)", lw=2) + plots["combustion_solvers"] = p + p +end + +# ╔═║ 5099fd5b-735e-4de3-918a-685dd4a82c22 +let + Ο„ = 0.01 # stepsize + tsteps = 0:Ο„:10 + X = randn(length(tsteps), 5) + W = cumsum(X, dims=1) + W .-= X[[1], :] # start at 0 + W .*= √(Ο„) + p = plot(tsteps, W, lw=2, xlab=L"t", ylab=L"W(t)", + title="Five draws from a Wiener process", label="") + plots["Wiener"] = p + p +end + +# ╔═║ 18def41b-0827-4356-adfa-d3fc63e23cfa +let + Ο„ = 0.001 # stepsize + tsteps = 0:Ο„:5 + mask = 2 .≀ tsteps .≀ 3 + + x = randn(length(tsteps)) + w = cumsum(x) + w .-= x[1] + w .*= √(Ο„) + plarge = plot(tsteps[1:10:end], w[1:10:end]) + vspan!(plarge, [2, 3], alpha=0.3) + psmall = plot(tsteps[mask], w[mask]) + p = plot(plarge, psmall, + layout=(2,1), xlab=L"t",ylab=L"W(t)", lw=2, label="") + plots["Wiener_scalefree"] = p + p +end + +# ╔═║ dc583986-3b76-44a7-ad5a-909aa392c38b +let + Ο„ = 0.01 # stepsize + tsteps = 0:Ο„:15 + X = randn(length(tsteps), 10) + W = cumsum(X, dims=1) + W .-= X[[1], :] # start at 0 + W .*= √(Ο„) + p = plot(W[:,1:2:end], W[:,2:2:end], lw=2, xlab=L"x", ylab=L"y", + title="Five draws from a Wiener process (2D)", label="", alpha=0.8, aspect_ratio=:equal) + plots["Wiener_2D"] = p + p +end + +# ╔═║ f3ec3c15-aa56-4b20-ad83-2acec0aad6b6 +let + Ο„ = 0.02 # stepsize + tsteps = 0:Ο„:20 + n=5 + X = randn(length(tsteps), 15) + W = cumsum(X, dims=1) + W .-= X[[1], :] # start at 0 + W .*= √(Ο„) + + p = plot(lw=2, xlab=L"x", ylab=L"y", zlab=L"z", + title="Five draws from a Wiener process (3D)", label="", alpha=0.8, aspect_ratio=:equal) + for i in 1:3:15 + plot3d!(W[:,i], W[:,i+1], W[:,i+2], alpha=0.8, label="") + end + plots["Wiener_3D"] = p + p +end + +# ╔═║ 3d549763-2ba2-48b6-b486-2ddd462977dd +let + p = plot(solve(sprob_bm), lw=2) + plots["brownian_motion"] = p + p +end + +# ╔═║ 98b16b2b-e792-41ef-a601-08289236af98 +let + p_ode = plot(sol_ode, lw=2, title="simulation competition ODE") + plots["competition_ode"] = p_ode + p_ode +end + +# ╔═║ 23b18b26-18de-4e08-abcf-ae5b5ac5af3d +let + p_sde = plot(sol_sde, lw=2, title="Monte Carlo simulation competition SDE") + plots["competition_sde"] = p_sde + p_sde +end + +# ╔═║ 53f1b6b4-a1e8-4e4d-b936-eebc5c37a712 +let + p_sde = plot(solve(sprob_comp), lw=2, title="Monte Carlo simulation competition SDE (second throw)") + plots["competition_sde2"] = p_sde + p_sde +end + +# ╔═║ b90e3157-3aed-4371-a396-283305a4d5b5 +let + + p = plot(sol_ode, idxs=(:A, :B), lw=2, label="ODE", title="Phase plot competition model", color="black", ls=:dash) + plot!(p, sol_sde, idxs=(1, 2), lw=2, label="SDE", xlab="A", ylab="B", color="grey") + scatter!([2], [2.5], color="red", label="xβ‚€") + plots["competition_phaseplot"] = p + p +end + +# ╔═║ ce7b1335-e43d-40dc-8ee8-d75b6df80dce +plots["competition_ensemble"] = plot(plot(comp_ensemble, idxs=:A, title="Species A"), plot(comp_ensemble, idxs=:B , title="Species B"), layout=(2,1)) + +# ╔═║ 6286a56e-90c4-41b0-8b62-f7189fd5505d +plots["competition_ensemble_summary"] = plot(e_sumary, xlab=:t, title="Competition ensemble summary") + +# ╔═║ bb562e40-daaf-47be-a1d0-1938bc227fc0 +begin + nβ‚€ = 20 + r = 0.1 + ns = [nβ‚€] + ts = [0.0] + while last(ns) > 0 + t, n = last(ts), last(ns) + Ο„ = rand(Exponential(1/(n*r))) + push!(ns, n-1) + push!(ts, t+Ο„) + end + + p_discrete_decay = scatter(ts, ns, xlab=L"t", ylab=L"n", label="", title="Random decay of $(nβ‚€) particles") + p_decay_times = bar(0:nβ‚€-1, diff(ts), xlab=L"n_0-n", ylabel=L"\tau",label="", title="Event times") + plot!(p_decay_times, inv.((nβ‚€:-1:1) .* r), label=L"1/nr", lw=2) + plots["discrete_decay"] = p_discrete_decay + plots["discrete_decay_eventtimes"] = p_decay_times +end; + +# ╔═║ e2dd1f82-031b-46eb-ac8e-9d03172db770 +p_discrete_decay + +# ╔═║ 38802384-48b0-4d29-aab3-2578527f995b +p_decay_times + +# ╔═║ aa3056b8-7140-4271-885d-8392c3634af6 +let + p = plot(solve(sir_jprob, SSAStepper()), lw=2, title="Discrete SIR model") + sol_sir_ode = solve(sir_oprob) + plot!(sol_sir_ode, idxs=:S, label="", alpha=0.5, color=:blue, ls=:dash, lw=2) + plot!(sol_sir_ode, idxs=:I, label="", alpha=0.5, color=:orange, ls=:dash, lw=2) + plot!(sol_sir_ode, idxs=:R, label="", alpha=0.5, color=:green, ls=:dash, lw=2) + plots["Gillespie_SIR"] = p + p +end + +# ╔═║ bfbccda0-8648-435f-8b12-13957c574f54 +plots + +# ╔═║ 6e433b23-3915-466a-85ca-31948896e3cb +#=╠═║ +plots["example_diff"] = plot(f, 1, 5, label=L"f(x)", lw=2, xlab=L"x") + ╠═║ =# + +# ╔═║ 525ae0f8-026a-43a3-a8b4-3a101c8ad6a7 +# ╠═║ skip_as_script = true +#=╠═║ +if !ismissing(f(a)) +plot(f, 1, 10, label="\$f(x)\$", xlabel="\$x\$", lw=2) +plots["fdiff_example"] = plot!(df, 1, 10, label="\$f'(x)\$", lw=2) +end + ╠═║ =# + +# ╔═║ ae5be024-863d-46f1-b5d9-fc691b10e63b +#=╠═║ +let + fexamp(x) = 64x*(1-x)*(1-2x)^2*(1-8x+8x^2)^2 + #dfexamp = diff(fexamp(x), x) + dfexamp = build_function(expand_derivatives(Dx(fexamp(x))), x) |> eval + error(diff, h; x=1.0) = max(abs(Float64(dfexamp(x)) - diff(fexamp, x, h=h)), 1e-50) + stepsizes = map(t->10.0^t, -20:0.1:-1); + p = plot(stepsizes, error.(diff_fordiff, stepsizes), label="forward difference", + xscale=:log10, yscale=:log10, lw=2, legend=:bottomright) + plot!(stepsizes, error.(diff_centrdiff, stepsizes), label="central difference", lw=2) + plot!(stepsizes, error.(diff_complstep, stepsizes), label="complex step", lw=2) + xlabel!("\$h\$") + ylabel!("absolute error") + plots["numdiff_error"] = p +end + ╠═║ =# + +# ╔═║ 23c38172-8916-42e3-a186-5cdd16939b5b +plots + +# ╔═║ Cell order: +# ╠═eb128248-dfbc-11ee-2efb-cb60fad76024 +# ╠═4f364a47-c45e-4264-9a00-fb705ff3f169 +# ╠═fd2f6fb4-d6da-4b07-8044-d3e2a09a6b4d +# ╠═ff86545c-64a2-4c6f-8c36-9066b270aa6b +# ╠═018d215a-41f4-4d21-b57f-fca3ac3a755d +# ╠═992d2b4f-6521-4368-910d-3e7ef07fb6df +# ╠═0de4a715-89d6-403b-ac65-adaed6062371 +# β•Ÿβ”€89d089b2-3220-4696-9ded-364c318b4a1e +# ╠═21e810e7-0879-4ffb-84f9-d67dafb900d6 +# ╠═5e7453ce-721b-4e4e-8f75-bb69aac8cf42 +# ╠═7b3ca635-5a3c-43f2-9690-5cdbd9074ed2 +# ╠═4c7feb9f-a039-48a8-a7d0-3633f1a635fe +# ╠═5ae78d7c-fc07-45f3-a59b-eb032ff2974d +# ╠═90a998c4-5fdd-42c3-9086-267a46fe3999 +# β•Ÿβ”€4c420cd0-975a-4d3b-a6cc-9eca35490c62 +# ╠═081852cd-b589-4891-83c0-f19e4da2eb35 +# ╠═39ee1679-23ad-4448-ae20-b55345c950b4 +# ╠═43183390-219c-4ade-a92a-80373a7c8585 +# β•Ÿβ”€e22ed4e6-6420-490c-9d55-fee19069f534 +# β•Ÿβ”€f2201e7f-9aec-4962-a9b7-a7fd627d64e6 +# β•Ÿβ”€8fcdad45-8789-473e-9d1a-2692b62d526d +# ╠═22ff7a8b-fbae-4c5a-86c7-92d9c4eb7935 +# ╠═b446a764-b80a-43c6-9fd1-72b099cfed0d +# ╠═c90f5869-89f8-486e-a4ad-9e4fbbd1eccd +# ╠═8372fad0-07ea-4905-8b8e-26316aa93f68 +# ╠═312e9d28-ed88-47ae-92b1-b1334e2e9d7a +# ╠═2cba2928-c7a7-4304-97ab-2efb5d6a8297 +# ╠═2aad9bca-736f-4aaa-ad50-74cc01661117 +# ╠═80404482-0534-43fd-8783-84ae6522706d +# ╠═945febc8-2954-4d5c-a4b1-7f95c70ef4b6 +# β•Ÿβ”€5099fd5b-735e-4de3-918a-685dd4a82c22 +# β•Ÿβ”€18def41b-0827-4356-adfa-d3fc63e23cfa +# β•Ÿβ”€dc583986-3b76-44a7-ad5a-909aa392c38b +# ╠═f3ec3c15-aa56-4b20-ad83-2acec0aad6b6 +# ╠═6501070e-9093-4928-89b9-b9dd34128810 +# ╠═6c5f1ee1-ece0-4a44-8e92-c375f2bd40a7 +# ╠═7d0a5294-6fc2-45d5-b04f-2824649f5d81 +# ╠═3d549763-2ba2-48b6-b486-2ddd462977dd +# ╠═cba57c64-a43f-4a4c-a793-86358131ef70 +# ╠═bc5adc9a-6f9c-4d55-ae8f-9bb8af5ff644 +# ╠═ffa88278-4f16-4f4a-9b12-9a475254dc63 +# β•Ÿβ”€98b16b2b-e792-41ef-a601-08289236af98 +# ╠═bc48b429-6382-47a9-91d5-02a9941f5c79 +# β•Ÿβ”€23b18b26-18de-4e08-abcf-ae5b5ac5af3d +# β•Ÿβ”€53f1b6b4-a1e8-4e4d-b936-eebc5c37a712 +# β•Ÿβ”€b90e3157-3aed-4371-a396-283305a4d5b5 +# ╠═23f1da8d-7a67-4dab-8928-f1f5480fadd0 +# ╠═a72a568b-17c8-4350-b719-d72abbb10e84 +# ╠═6826363e-d807-4c52-a26a-018e5c6868c9 +# ╠═26f8a52c-3f8d-4928-9f33-a15995323cb5 +# ╠═ce7b1335-e43d-40dc-8ee8-d75b6df80dce +# ╠═3604baf4-7623-4842-aeb8-74785417b398 +# ╠═6286a56e-90c4-41b0-8b62-f7189fd5505d +# β•Ÿβ”€4f671499-19b2-426c-a689-2ee4b084f3d0 +# ╠═6e94632a-cad9-49ea-8cdc-e4ec55871682 +# ╠═bb562e40-daaf-47be-a1d0-1938bc227fc0 +# ╠═2ee4fe85-feed-471d-86e2-53212fc05650 +# β•Ÿβ”€e2dd1f82-031b-46eb-ac8e-9d03172db770 +# ╠═38802384-48b0-4d29-aab3-2578527f995b +# ╠═ade6e868-48ff-4b54-88ca-d180f115ca39 +# ╠═a9ba703a-c9f6-4c9a-930c-3d5c977bd559 +# ╠═a7049066-b990-470f-804d-00adb9201122 +# ╠═bfe45dd0-d429-40ef-859f-f5f6e2752904 +# ╠═1e212d4d-5722-4c29-b27d-5d8ce128a1dd +# ╠═addfa406-0a45-4ba1-a6e1-345ef987ca3e +# ╠═71d37d78-7a92-4971-aa6f-098030d618e4 +# ╠═627418f5-33fe-4515-8a0e-7f79774814d8 +# ╠═aa9089b2-38b8-4ab1-9b34-87ee5b017c1d +# ╠═3343b335-54c6-42b6-b2e1-f78bdf791b30 +# ╠═1e2caf48-30b3-4094-a159-a94585e248b3 +# ╠═5ac23911-376f-4ee7-ba33-a120b80e1020 +# ╠═06cadbd3-01ae-4f68-ab1a-7e8bc4a7b00a +# ╠═f57de319-5025-4ec8-a437-163b8ab0b94e +# ╠═d0aa9ea8-38cb-4f00-92d2-58740ab2d32a +# ╠═88a00ea8-9c7b-49fc-8771-2324576a0124 +# β•Ÿβ”€aa3056b8-7140-4271-885d-8392c3634af6 +# ╠═5c3c6af6-add6-4f1a-91ca-0251b43d5e1a +# ╠═c9fb3ebb-e37a-42dc-85f4-87b4fc5ca492 +# ╠═3122f1ec-7c47-4873-bd6c-94f1a8616088 +# ╠═486c9c19-e2ed-4632-be5d-b76dadf433c4 +# ╠═26c3f4e0-dc66-43cc-9215-94e5c73531d8 +# ╠═04eeeae2-f525-4717-a397-39b895fa80eb +# ╠═7055aa36-e4d8-42e6-a92c-f7d8ec5aa960 +# ╠═bfbccda0-8648-435f-8b12-13957c574f54 +# ╠═6e433b23-3915-466a-85ca-31948896e3cb +# ╠═a99a342d-5c69-411d-8bd6-55ed6f14f438 +# ╠═aec510c8-6f67-4bad-ac60-db8081dfc7f2 +# ╠═1e7c7e9c-b286-48a2-920b-4ac2fe7e9533 +# ╠═6ae135a1-72b5-434c-89e6-a0df76338d46 +# ╠═459fe27d-bc53-469d-919d-724a5df98fe9 +# ╠═77e9ad42-87fb-4292-bb89-3b0cb271f1a2 +# ╠═eb30d4b4-ced7-473a-a5df-5ebed6a1c357 +# ╠═525ae0f8-026a-43a3-a8b4-3a101c8ad6a7 +# ╠═f61a7f2d-faa2-4a54-bd4a-c2fac6da888f +# ╠═615370c3-4986-454e-85c5-11d447b51ff1 +# ╠═e0f9312f-dae9-49ea-9618-e786de59921f +# ╠═8b36f54a-420a-40ae-b655-d25c99fe7182 +# ╠═9be6aa61-46fe-4d53-941b-6cb0b21133a0 +# ╠═856890fb-a420-4ae0-8f6d-c40763d11cc2 +# ╠═05bd415e-09db-4a19-8ccb-922096f218fc +# ╠═0b52aede-1a71-4034-9921-2ffc9120c0ae +# ╠═9d84b996-a3e2-48c1-ae51-2bfc343bff0f +# ╠═4aa42d80-81b5-4144-8b4a-6c3ebf29d84b +# β•Ÿβ”€ae5be024-863d-46f1-b5d9-fc691b10e63b +# ╠═52082e32-8c8f-4699-a44a-2fbe99b96319 +# ╠═5bbf9db9-4537-416d-9edc-6487961b1690 +# β•Ÿβ”€6f6ba9c5-bc87-4b71-82a0-a4c64750a2ab +# ╠═2bf198cd-4463-4f97-975e-f805a37fa780 +# ╠═13036978-3008-4d7e-9661-a967381f4db6 +# ╠═23c38172-8916-42e3-a186-5cdd16939b5b diff --git a/scripts/uncertainty.jl b/scripts/uncertainty.jl new file mode 100644 index 00000000..c3a74464 --- /dev/null +++ b/scripts/uncertainty.jl @@ -0,0 +1,474 @@ +### A Pluto.jl notebook ### +# v0.20.3 + +using Markdown +using InteractiveUtils + +# ╔═║ a981929c-2a53-11ef-16ce-f3918dd88313 +# ╠═║ skip_as_script = true +#=╠═║ +begin + using Pkg + Pkg.activate("..") +end + ╠═║ =# + +# ╔═║ 1f5c60e2-e3ec-41ba-9c3e-44083987d710 +using Catalyst, DifferentialEquations + +# ╔═║ 58eb5c0f-557d-42a1-ae5d-728de0c498bd +using Measurements, ForwardDiff, Turing + +# ╔═║ a5cbf15c-490e-4d63-9a99-1c579be36c7e +using Plots, LaTeXStrings, Latexify, PlutoUI, StatsPlots + +# ╔═║ d8818694-9270-4882-bc50-2eff71ea1c7a +using GlobalSensitivity + +# ╔═║ 9629b2f8-2c21-40f1-a48d-a206f8bad479 +md""" +# Uncertainty & sensitivity analysis +""" + +# ╔═║ 288c20e5-f1b2-4fbc-bc52-c1ec0e9d8422 +md""" +## Aleatoric vs epistemic uncertainty +""" + +# ╔═║ 2100c8b0-0f88-4228-a7f9-dc62f4a3cf9c +flogistic = (u, (r, K), t) -> r*u*(1-u/K) + +# ╔═║ 48856eee-8568-483a-bd0f-f3fb42c58906 +logode = ODEProblem(flogistic, 2.0, (0.0, 50.0), (0.28, 100)) + +# ╔═║ 6f6ee7e0-3413-43c5-a9bd-132267a96d82 +logsde = SDEProblem(flogistic, (u,p,t)->0.25sqrt(u), 2.0, (0, 50), (0.28, 100)) + +# ╔═║ e887a9ab-a4d8-4b05-a3f8-a8165d517a8a +Ξ² = 0.03 + +# ╔═║ 733ae8b7-b3d6-443a-b4a1-f8fdbde0e0b6 +Ξ³ = 0.3 + +# ╔═║ 9813f4f9-1ae0-4480-bf9d-14ab547d01c2 +md"## SIR example" + +# ╔═║ 9bed9078-0c22-4f29-96db-4274999adf9c +sir = @reaction_network begin + @species S(t)=99 I(t)=1 R(t)=0 + @parameters Ξ²=$Ξ² Ξ³=$Ξ³ + Ξ², S + I --> 2I # susceptible persons get infected + Ξ³, I --> R # infected persons become recovered +end + +# ╔═║ 34f47469-63b7-4e9a-98e8-e67827e4dbf4 +convert(ODESystem, sir) + +# ╔═║ e34de9d2-6189-46fa-88a6-a37f94294384 +sirprob = ODEProblem(sir, [], (0., 30.)); + +# ╔═║ 80eeefec-1fd5-4880-9209-df27375f9e1e +sirsol = solve(sirprob) + +# ╔═║ bdf2dd3b-55c8-445f-b9ed-66805014aa47 +md""" +## Uncertainty +""" + +# ╔═║ ea341f0b-b081-4eda-b7d8-5ca616261ee8 +Ξ²u = Ξ² Β± 0.006 + +# ╔═║ 6ed4121b-2b68-4446-bf24-e8ce61661f84 +Ξ³u = Ξ³ Β± 0.04 + +# ╔═║ 2645bb50-bec6-4b5e-b423-9cbc2f4dbd24 +sirprobu = remake(sirprob, p=[:Ξ²=>Ξ²u, :Ξ³=>Ξ³u]) + +# ╔═║ 02209c47-4ff3-4823-a998-fe1f173f749a +@model function sir_mc() + Ξ² ~ Normal(0.03, 0.006) + Ξ³ ~ TriangularDist(0.23, 0.37, 0.3) + return solve(remake(sirprob, p=[:Ξ²=>Ξ², :Ξ³=>Ξ³])) +end + +# ╔═║ 9b048268-30d7-4eaf-8a26-ab2e1c0404cd +throw = rand(sir_mc()) + +# ╔═║ 4f1cc2c6-254d-4f9c-b97a-09d22cb3838a +generated_quantities(sir_mc(), throw) + +# ╔═║ 118f4f61-12fb-4025-bd01-91a7fa6f9bd7 +md"[Using the Beer-Lambert Law to Calculate the Concentration of a Solution | Chemistry | Study.com](https://study.com/skill/learn/using-the-beer-lambert-law-to-calculate-the-concentration-of-a-solution-explanation.html)" + +# ╔═║ e6bfb7d1-e594-41c9-9ee2-9668cae70e71 +Iobs = 0.2 Β± 0.03; + +# ╔═║ ccf61cf5-33b2-4349-a422-16a7c883038d +I0 = 1.29 Β± 0.06; + +# ╔═║ 5a9da0cd-9809-445e-aeb3-b91875064106 +A = log10(I0 / Iobs) + +# ╔═║ ae807e33-3e05-4a3d-a591-2b0e04c9d6d8 +Ο΅ = 8850 Β± 50; + +# ╔═║ 260ba845-ae2f-4e9f-a2d0-f43c64648461 +l = 3 Β± 5e-4; + +# ╔═║ 8cf4e046-c979-4633-b922-43a46c914f3c +c = log10(I0 / Iobs) / (l * Ο΅) + +# ╔═║ a3f82cf6-b25d-4de1-b264-93d6e047ec6d +md"Radius of a circle" + +# ╔═║ 090f89e0-d1e2-4363-830e-4d0635749890 +r = 12.5 Β± 0.2 + +# ╔═║ 660c25d8-bcc5-4de3-9d04-013356acd22a +area = pi * r^2 + +# ╔═║ 06929445-f0ac-430f-a09f-1743f2de6f91 +md"## Local sensitivity" + +# ╔═║ 11c32674-9817-4b0c-bcb2-235c431a5519 +function sir_sim(pars) + Ξ², Ξ³ = pars + prob = remake(sirprob, p=[:Ξ²=>Ξ², :Ξ³=>Ξ³]) + sol = solve(prob, Tsit5(), saveat=0.1) + return sol +end + +# ╔═║ 1ed87d81-4b19-4de3-9735-fc36894b64c7 +sir_sim([Ξ², Ξ³]) + +# ╔═║ 633b06bf-ad63-418d-bf2d-899c51eee807 +sir_sim_S(pars) = sir_sim(pars)[:S] + +# ╔═║ 42908d09-768d-4004-b304-cb136ed5b791 +sir_sim_I(pars) = sir_sim(pars)[:I] + +# ╔═║ 449b2aa3-9efe-4399-8123-95fd952cb062 +sir_sim_R(pars) = sir_sim(pars)[:R] + +# ╔═║ 0bb3f53f-50a6-40d3-95ac-be64a8dc79da +tvals = 0:.1:30 + +# ╔═║ 10cafa44-8089-4aae-bd27-686be0496dc4 +Sv, Iv, Rv = sir_sim_S([Ξ², Ξ³]), sir_sim_I([Ξ², Ξ³]), sir_sim_R([Ξ², Ξ³]); + +# ╔═║ 305b0b4a-4051-409e-9c64-f95ab1778a60 +sens_S = ForwardDiff.jacobian(sir_sim_S, [Ξ², Ξ³]) + +# ╔═║ 718a957c-74e6-455d-b847-e3d10e7f2016 +sens_I = ForwardDiff.jacobian(sir_sim_I, [Ξ², Ξ³]) + +# ╔═║ 20af2948-d688-45ee-804c-26e35a59162c +sens_R = ForwardDiff.jacobian(sir_sim_R, [Ξ², Ξ³]) + +# ╔═║ 95d7287c-8008-4cad-9af6-ed3e77b9db41 +sens_Ξ² = [sens_S[:,1] sens_I[:,1] sens_R[:,1]] + +# ╔═║ 4c23f7ac-bf2e-42bd-aa2d-75d98cb691f1 +sens_Ξ³ = [sens_S[:,2] sens_I[:,2] sens_R[:,2]] + +# ╔═║ 611d9607-99e6-488a-95f2-18da8fb8759e +sens_Ξ²_rel = sens_Ξ² .* Ξ² ./ [Sv Iv Rv] + +# ╔═║ 34cfa9fc-d197-40aa-9987-4736493e533e +sens_Ξ³_rel = sens_Ξ³ .* Ξ³ ./ [Sv Iv Rv] + +# ╔═║ e436ef36-1f14-48fd-93af-aec0eadc51ed +Ks = 25 + +# ╔═║ 4c6849ca-723d-44da-b345-8373e6c67284 +mymm = x-> mm(x, 1, Ks) + +# ╔═║ 93f93512-8337-40cd-8697-e46de3fcd945 +sens_mm_Ks = x -> ForwardDiff.derivative(K->mm(x, 1, K), Ks) + +# ╔═║ f6aab879-37ad-4425-a5a5-82db2ca4d188 +sens_mm_Ks_rel = x -> sens_mm_Ks(x) * Ks / mm(x, 1, Ks) + +# ╔═║ bffa2e06-271f-4ddb-a6bf-cdf9903b5c31 +sens_mm_mumax = x -> ForwardDiff.derivative(ΞΌ->mm(x, ΞΌ, Ks), 1) + +# ╔═║ 3cf65781-9369-4219-9520-88cfd38adf0e +sens_mm_mumax_rel = x -> sens_mm_mumax(x) / mm(x, 1, Ks) + +# ╔═║ 415cbdec-71f3-4ac7-8479-14d0c7f6481c +sir_summary = function(p) + stepsize = 0.1 + # beta, gamma = pars + prob_new_pars = remake(sirprob; p = p) + sol = solve(prob_new_pars, Tsit5(); saveat = stepsize) + # effect on total and maximum of infected + tot_infected = stepsize * sum(sol[2, :]) + max_infected = maximum(sol[2, :]) + return [tot_infected, max_infected] +end + +# ╔═║ 95b84eb0-d3e2-4cc3-882b-d3a4e82c1c4f +Ξ²_vals = 1e-5:0.01:0.5 + +# ╔═║ 0ac6b303-183b-4256-8436-052071d989cd +Ξ³_vals = 1e-5:0.01:1 + +# ╔═║ 3f6491cf-d9d2-4be0-a341-db1a1e891029 +md"## Sobol sensitivity" + +# ╔═║ 6d1e0bc0-4b28-4353-8389-c5ff4d156b05 +p_range = [[1e-5, 0.5], [1e-5, 2]] # parameter ranges beta and gamma + +# ╔═║ 2d58a23a-7354-4e07-8cbb-ec1351051845 +sobol = gsa(sir_summary, Sobol(), p_range, samples = 1000) + +# ╔═║ 5d2ffa7b-1202-45b4-b3a7-536ea38e2bfc +# cols are parameters + +# ╔═║ 8c13eb13-4b54-40ab-8408-ede4f72d7af4 +sobol.S1 # first order effects + +# ╔═║ 55b7b2ca-0e80-42a0-9aea-12b46947305c +sobol.ST # total effects + +# ╔═║ f4869054-c5c6-4028-b9f3-0bb3e6b4305a +md"## Morris" + +# ╔═║ 9e4b6c92-03a9-4ddb-b4f1-97dddf1b7a30 +morris = gsa(sir_summary, Morris(num_trajectory=100), p_range, samples = 1000_000) + +# ╔═║ 14676d4b-a43a-4e4f-8eb1-d93c098df156 +morris.means + +# ╔═║ 1478f40c-f530-48de-9608-bdd24cab0f23 +morris.means_star + +# ╔═║ b455c7c0-d9d5-402f-b49d-fcd1f4b3626a +morris.variances + +# ╔═║ 8928645a-c20e-407c-8ba0-92f3f27206f0 +md""" + +## Appendix +""" + +# ╔═║ 3902e862-3bc9-4786-bdc5-0415bc17dbd7 +TableOfContents() + +# ╔═║ 30d0f3e0-a6c0-44c8-bcfd-7b163871b4f0 +plots = Dict() + +# ╔═║ 3ba4a491-c64d-48de-b263-83679b230b32 +let + p = plot(title="ODE throws of Verhulst model (epistemic)") + for i in 1:100 + u0 = 10rand() + r = max(0.28 + 0.1rand(), 0) + K = 20rand() + 90 + prob = remake(logode, u0=u0, p=(r, K)) + sol = solve(prob, Tsit5()) + plot!(p, sol, lw=0.5, alpha=0.5, color=1, label="") + end + plots["epistemic"] = p +end + +# ╔═║ 36eb6a4d-a167-47eb-9208-52d34949f37e +let + p = plot(title="SDE throws of Verhulst model (aleatoric)") + for i in 1:100 + prob = remake(logsde) + sol = solve(logsde, EM(), dt=0.1) + plot!(p, sol, lw=0.5, alpha=0.5, color=1, label="") + end + plots["aleatoric"] = p +end + +# ╔═║ 7305bd7b-e823-451d-9eb1-15f5229fe431 +plots["sir_sim"] = plot(sirsol, lw=2, title="SIR model with Ξ²=$Ξ² and Ξ³=$Ξ³", legend=:right) + +# ╔═║ ef6cb5d2-aa48-459d-931f-a5a79fcf2507 +plots["sir_uncertainty"] =plot(solve(sirprobu, saveat=2), lw=2, title="SIR model with Ξ²=$Ξ²u and Ξ³=$Ξ³u", legend=:right) + +# ╔═║ 5075c78a-56e3-4372-b605-de3dfec5cebc +let + p = plot(sirsol, lw=2, title="Monte Carlo of SIR model", legend=:right) + for i in 1:200 + throw = rand(sir_mc()) + sol = generated_quantities(sir_mc(), throw) + plot!(sol, alpha=0.2, color=[1 2 3], label="", lw=0.5) + end + plots["sir_MC"] = p +end + +# ╔═║ 7c5a9bca-a568-43d5-88f1-313bcf19bc96 +let + plots["sir_sens_beta"] = pΞ² = plot(tvals, sens_Ξ², label=["S" "I" "R"], lw=2, xlab="t", + title="Absolute sensitivity SIR w.r.t. Ξ²") +end + +# ╔═║ bb1f08d7-d551-4226-9873-21fc903ed10c +let + plots["sir_sens_gamma"] = pΞ³ = plot(tvals, sens_Ξ³, label=["S" "I" "R"], lw=2, xlab="t", + title="Absolute sensitivity SIR w.r.t. Ξ³") +end + +# ╔═║ 57107079-7baa-4bce-b801-b50d1dfc7a5f +let + plots["sir_sens_beta_rel"] = pΞ² = plot(tvals, sens_Ξ²_rel, label=["S" "I" "R"], lw=2, xlab="t", + title="Relative sensitivity SIR w.r.t. Ξ²") +end + +# ╔═║ 77b7b12f-1b91-4e78-af25-7de8996be2b7 +let + plots["sir_sens_gamma_rel"] = pΞ³ = plot(tvals, sens_Ξ³_rel, label=["S" "I" "R"], lw=2, xlab="t", + title="Relative sensitivity SIR w.r.t. Ξ³") +end + +# ╔═║ 136e14d5-2330-4e24-8085-4f13fa3b9e26 +plots["sir_sens"] = plot(plots["sir_sens_beta"], plots["sir_sens_gamma"], plots["sir_sens_beta_rel"], plots["sir_sens_gamma_rel"], size=(1200, 800)) + +# ╔═║ 9563199f-257b-4f89-a4c3-7cd1cc762bac +plots["mm"] = plot(mymm, 0, 100, lw=2, label="MM", xlab="X [mol/L]", ylab="Reaction rate", title="Michaelis-Menten") + +# ╔═║ 32cdba4c-84b9-4449-8a68-4a568592dce7 +plots["mm_sens_Ks"] = plot(sens_mm_Ks, 0, 100, lw=2, title="Michaelis-Menten sensitivity", label="local sensititivity w.r.t. Ks", xlab="S [mol/L]", ylab="Sensitivity") + +# ╔═║ aef87a3e-fa60-4666-8517-8c53fb797402 +plots["mm_sens_Ks_rel"] = plot(sens_mm_Ks_rel, 0, 100, lw=2, title="Michaelis-Menten sensitivity (relative)", label="local sensititivity w.r.t. Ks", xlab="S [mol/L]", ylab="Sensitivity") + +# ╔═║ a87311b2-bc02-48a8-9dea-11a0bcbb5377 +plots["mm_sens_vmax"] = plot(sens_mm_mumax, 0, 100, lw=2, title="Michaelis-Menten sensitivity", label="local sensititivity w.r.t. vmax", xlab="S [mol/L]", ylab="Sensitivity") + +# ╔═║ af4aa315-1411-41f1-bd01-f342c9d51bc2 +plots["mm_sens_vmax_rel"] = plot(sens_mm_mumax_rel, 0, 100, lw=2, title="Michaelis-Menten sensitivity (relative)", label="local sensititivity w.r.t. vmax", xlab="S [mol/L]", ylab="Sensitivity", ylims=(0, 2)) + +# ╔═║ 7e7956b5-43fc-48fb-92ff-67d0fdb875b1 +plots["mm_sens"] = plot(plots["mm_sens_Ks"], plots["mm_sens_vmax"], plots["mm_sens_Ks_rel"], plots["mm_sens_vmax_rel"], size=(1000, 800)) + +# ╔═║ 71e3de0e-03d6-491b-9a1d-071e03f1f6ef +plots["cuminf"] = contourf(Ξ²_vals, Ξ³_vals, (g, l)->sir_summary((g, l))[1], color=:speed, + xlab="Ξ²", ylab="Ξ³", title="Cumulative number of infected") + +# ╔═║ 164e1b01-18c8-4c23-b5a9-20c6c8d74ea8 +plots["maxinf"] = contourf(Ξ²_vals, Ξ³_vals, (g, l)->sir_summary((g, l))[2], color=:speed, + xlab="Ξ²", ylab="Ξ³", title="Maximum number of infected") + +# ╔═║ 2a10a3cc-cc24-4a62-9090-7ba424024706 +plots["sir_heatmaps"] = plot(plots["cuminf"], plots["maxinf"], size=(800, 400)) + +# ╔═║ b964e1e9-1dd2-4029-a4b9-66944d2c39ba +plots["sobol_sir_fo"] = groupedbar(["cumulative I", "maximum I"], sobol.S1, label=["Ξ²" "Ξ³"], title="Sobol SIR first order", ylab="variance") + +# ╔═║ f45583a1-5872-4500-b6ca-1f8b3a423bdb +plots["sobol_sir_tot"] = groupedbar(["cumulative I", "maximum I"], sobol.ST, label=["Ξ²" "Ξ³"], title="Sobol SIR total effects", ylab="variance") + +# ╔═║ 9c7ef318-38b7-49d5-a203-df0dccbe1e57 +plots["morris_sir_mu"] = groupedbar(["cumulative I", "maximum I"], morris.means, label=["Ξ²" "Ξ³"], title="Morris SIR ΞΌ") + +# ╔═║ 991e84f5-6711-45a7-b8ab-1e8199b314b9 +plots["morris_sir_mu_star"] =groupedbar(["cumulative I", "maximum I"], morris.means_star, label=["Ξ²" "Ξ³"], title="Morris SIR ΞΌ*") + +# ╔═║ 8866b3ee-de5d-448f-a995-9a4743cb511d +plots["morris_sir_var"] = groupedbar(["cumulative I", "maximum I"], morris.variances, label=["Ξ²" "Ξ³"], title="Morris SIR Var", yscale=:log10) + +# ╔═║ e5e0a0db-2662-4886-9621-8e0032cb6e42 +plots + +# ╔═║ Cell order: +# ╠═1f5c60e2-e3ec-41ba-9c3e-44083987d710 +# ╠═58eb5c0f-557d-42a1-ae5d-728de0c498bd +# ╠═a5cbf15c-490e-4d63-9a99-1c579be36c7e +# ╠═a981929c-2a53-11ef-16ce-f3918dd88313 +# ╠═9629b2f8-2c21-40f1-a48d-a206f8bad479 +# ╠═288c20e5-f1b2-4fbc-bc52-c1ec0e9d8422 +# ╠═2100c8b0-0f88-4228-a7f9-dc62f4a3cf9c +# ╠═48856eee-8568-483a-bd0f-f3fb42c58906 +# ╠═3ba4a491-c64d-48de-b263-83679b230b32 +# ╠═6f6ee7e0-3413-43c5-a9bd-132267a96d82 +# ╠═36eb6a4d-a167-47eb-9208-52d34949f37e +# ╠═e887a9ab-a4d8-4b05-a3f8-a8165d517a8a +# ╠═733ae8b7-b3d6-443a-b4a1-f8fdbde0e0b6 +# ╠═9813f4f9-1ae0-4480-bf9d-14ab547d01c2 +# ╠═9bed9078-0c22-4f29-96db-4274999adf9c +# ╠═34f47469-63b7-4e9a-98e8-e67827e4dbf4 +# ╠═e34de9d2-6189-46fa-88a6-a37f94294384 +# ╠═80eeefec-1fd5-4880-9209-df27375f9e1e +# ╠═7305bd7b-e823-451d-9eb1-15f5229fe431 +# ╠═bdf2dd3b-55c8-445f-b9ed-66805014aa47 +# ╠═ea341f0b-b081-4eda-b7d8-5ca616261ee8 +# ╠═6ed4121b-2b68-4446-bf24-e8ce61661f84 +# ╠═2645bb50-bec6-4b5e-b423-9cbc2f4dbd24 +# ╠═ef6cb5d2-aa48-459d-931f-a5a79fcf2507 +# ╠═02209c47-4ff3-4823-a998-fe1f173f749a +# ╠═5075c78a-56e3-4372-b605-de3dfec5cebc +# ╠═9b048268-30d7-4eaf-8a26-ab2e1c0404cd +# ╠═4f1cc2c6-254d-4f9c-b97a-09d22cb3838a +# ╠═118f4f61-12fb-4025-bd01-91a7fa6f9bd7 +# ╠═e6bfb7d1-e594-41c9-9ee2-9668cae70e71 +# ╠═ccf61cf5-33b2-4349-a422-16a7c883038d +# ╠═5a9da0cd-9809-445e-aeb3-b91875064106 +# ╠═ae807e33-3e05-4a3d-a591-2b0e04c9d6d8 +# ╠═260ba845-ae2f-4e9f-a2d0-f43c64648461 +# ╠═8cf4e046-c979-4633-b922-43a46c914f3c +# ╠═a3f82cf6-b25d-4de1-b264-93d6e047ec6d +# ╠═090f89e0-d1e2-4363-830e-4d0635749890 +# ╠═660c25d8-bcc5-4de3-9d04-013356acd22a +# ╠═06929445-f0ac-430f-a09f-1743f2de6f91 +# ╠═11c32674-9817-4b0c-bcb2-235c431a5519 +# ╠═1ed87d81-4b19-4de3-9735-fc36894b64c7 +# ╠═633b06bf-ad63-418d-bf2d-899c51eee807 +# ╠═42908d09-768d-4004-b304-cb136ed5b791 +# ╠═449b2aa3-9efe-4399-8123-95fd952cb062 +# ╠═0bb3f53f-50a6-40d3-95ac-be64a8dc79da +# ╠═10cafa44-8089-4aae-bd27-686be0496dc4 +# ╠═305b0b4a-4051-409e-9c64-f95ab1778a60 +# ╠═718a957c-74e6-455d-b847-e3d10e7f2016 +# ╠═20af2948-d688-45ee-804c-26e35a59162c +# ╠═95d7287c-8008-4cad-9af6-ed3e77b9db41 +# ╠═4c23f7ac-bf2e-42bd-aa2d-75d98cb691f1 +# ╠═611d9607-99e6-488a-95f2-18da8fb8759e +# ╠═34cfa9fc-d197-40aa-9987-4736493e533e +# ╠═7c5a9bca-a568-43d5-88f1-313bcf19bc96 +# ╠═bb1f08d7-d551-4226-9873-21fc903ed10c +# ╠═57107079-7baa-4bce-b801-b50d1dfc7a5f +# ╠═77b7b12f-1b91-4e78-af25-7de8996be2b7 +# ╠═136e14d5-2330-4e24-8085-4f13fa3b9e26 +# ╠═e436ef36-1f14-48fd-93af-aec0eadc51ed +# ╠═4c6849ca-723d-44da-b345-8373e6c67284 +# ╠═9563199f-257b-4f89-a4c3-7cd1cc762bac +# ╠═93f93512-8337-40cd-8697-e46de3fcd945 +# ╠═f6aab879-37ad-4425-a5a5-82db2ca4d188 +# ╠═bffa2e06-271f-4ddb-a6bf-cdf9903b5c31 +# ╠═3cf65781-9369-4219-9520-88cfd38adf0e +# ╠═32cdba4c-84b9-4449-8a68-4a568592dce7 +# ╠═aef87a3e-fa60-4666-8517-8c53fb797402 +# ╠═a87311b2-bc02-48a8-9dea-11a0bcbb5377 +# ╠═af4aa315-1411-41f1-bd01-f342c9d51bc2 +# ╠═7e7956b5-43fc-48fb-92ff-67d0fdb875b1 +# ╠═415cbdec-71f3-4ac7-8479-14d0c7f6481c +# ╠═95b84eb0-d3e2-4cc3-882b-d3a4e82c1c4f +# ╠═0ac6b303-183b-4256-8436-052071d989cd +# ╠═71e3de0e-03d6-491b-9a1d-071e03f1f6ef +# ╠═164e1b01-18c8-4c23-b5a9-20c6c8d74ea8 +# ╠═2a10a3cc-cc24-4a62-9090-7ba424024706 +# ╠═d8818694-9270-4882-bc50-2eff71ea1c7a +# ╠═3f6491cf-d9d2-4be0-a341-db1a1e891029 +# ╠═6d1e0bc0-4b28-4353-8389-c5ff4d156b05 +# ╠═2d58a23a-7354-4e07-8cbb-ec1351051845 +# ╠═5d2ffa7b-1202-45b4-b3a7-536ea38e2bfc +# ╠═8c13eb13-4b54-40ab-8408-ede4f72d7af4 +# ╠═b964e1e9-1dd2-4029-a4b9-66944d2c39ba +# ╠═55b7b2ca-0e80-42a0-9aea-12b46947305c +# ╠═f45583a1-5872-4500-b6ca-1f8b3a423bdb +# ╠═f4869054-c5c6-4028-b9f3-0bb3e6b4305a +# ╠═9e4b6c92-03a9-4ddb-b4f1-97dddf1b7a30 +# ╠═14676d4b-a43a-4e4f-8eb1-d93c098df156 +# ╠═1478f40c-f530-48de-9608-bdd24cab0f23 +# ╠═b455c7c0-d9d5-402f-b49d-fcd1f4b3626a +# ╠═9c7ef318-38b7-49d5-a203-df0dccbe1e57 +# ╠═991e84f5-6711-45a7-b8ab-1e8199b314b9 +# ╠═8866b3ee-de5d-448f-a995-9a4743cb511d +# β•Ÿβ”€8928645a-c20e-407c-8ba0-92f3f27206f0 +# ╠═3902e862-3bc9-4786-bdc5-0415bc17dbd7 +# ╠═30d0f3e0-a6c0-44c8-bcfd-7b163871b4f0 +# ╠═e5e0a0db-2662-4886-9621-8e0032cb6e42 diff --git a/src/_data/homepage.jl b/src/_data/homepage.jl index 90c1b602..bc6f0645 100644 --- a/src/_data/homepage.jl +++ b/src/_data/homepage.jl @@ -11,7 +11,7 @@ Dict( "highlights" => [ Dict("name" => "Course Notes", # FIXME Add link to download pdf - "text" => md"The MODSIM course notes in pdf format can be found as a download on Ufora or in the [release notes on this GitHub repository](https://github.com/Kermit-UGent/ModSim/releases).", + "text" => md"The MODSIM course notes in pdf format can be found as a download on Ufora or in the (release notes on this GitHub repository)[https://github.com/Kermit-UGent/ModSim/releases].", # FIXME change figure to small piece of the cover. "img" => "https://github.com/user-attachments/assets/0a178611-f4e3-4572-94a7-ac881aa20f21" ), diff --git a/src/_data/tracks.jl b/src/_data/tracks.jl new file mode 100644 index 00000000..8ad60994 --- /dev/null +++ b/src/_data/tracks.jl @@ -0,0 +1,5 @@ +[ + # "julia" => "πŸ’» Julia programming", + # "material" => "Material development", + # "setup" => "Website maintenance" +] \ No newline at end of file diff --git a/src/_includes/layout.jlhtml b/src/_includes/layout.jlhtml index 71020e60..701baf6b 100644 --- a/src/_includes/layout.jlhtml +++ b/src/_includes/layout.jlhtml @@ -57,6 +57,10 @@ end) + + + + $(pluto_head) @@ -101,15 +105,21 @@ $(pluto_head) tags = get(output.frontmatter, "tags", String[]) active = page.url == other_page.url + homework_number = get(output.frontmatter, "homework_number", nothing) + href = root_url * "/" * other_page.url class = [ active ? "active" : nothing, - "lecture", + homework_number === nothing ? "lecture" : "homework", ("tag_$(replace(x, " "=>"_"))" for x in tags)..., ] - @htl("""
  • $(number) $(name)
  • """) + if homework_number === nothing + @htl("""
  • $(number) $(name)
  • """) + else + @htl("""
  • Homework $(homework_number): $(name)
  • """) + end end for other_page in collections[section_id].pages ]) @@ -139,7 +149,9 @@ $(pluto_head)
    $(isempty(f("title", "")) ? nothing : @htl("""
    - $(if !isempty(f("chapter", "")) && !isempty(f("section", "")) + $(if !isempty(f("homework_number", "")) + @htl("""

    Homework $(f("homework_number", ""))

    """) + elseif !isempty(f("chapter", "")) && !isempty(f("section", "")) @htl("""

    Section $(f("chapter", "-")).$(f("section", "-"))

    """) else nothing diff --git a/src/assets/scripts/sidebar.js b/src/assets/scripts/sidebar.js index 6521ae70..d89482f6 100644 --- a/src/assets/scripts/sidebar.js +++ b/src/assets/scripts/sidebar.js @@ -13,3 +13,22 @@ window.addEventListener("click", function (e) { layout.classList.remove("pages_show_sidebar") } }) + +document.querySelectorAll(".track-chooser select").forEach((trackSelect) => { + const ontrack = () => { + let track = trackSelect.value + + localStorage.setItem("chosen track", track) + + let lectures_homeworks = Array.from(sidebar.querySelectorAll(".lecture,.homework")) + + lectures_homeworks.forEach((el) => { + let intrack = track === "" || el.classList.contains(`tag_track_${track}`) || el.classList.contains(`tag_welcome`) + el.classList.toggle("not_in_track", !intrack) + }) + } + + trackSelect.value = localStorage.getItem("chosen track") + ontrack() + trackSelect.addEventListener("change", ontrack) +}) diff --git a/src/assets/styles/layout.css b/src/assets/styles/layout.css index f2545af1..8dfc1b1c 100644 --- a/src/assets/styles/layout.css +++ b/src/assets/styles/layout.css @@ -167,13 +167,32 @@ align-items: stretch; } +#pages-sidebar li li.homework { + padding-left: 1ch; + /* background: yellow; */ +} + #pages-sidebar li li a { margin: 0.2em 0; } +#pages-sidebar li li.homework a { + /* background: #ffb60012; */ + margin: 0.4em 0px; + outline: 3px dashed #92929278; + outline-offset: -1px; +} + +/* #pages-sidebar li li.homework a::before { + content: "πŸ‘‰ "; +} */ + #pages-sidebar li li span.entry-number { opacity: 0.6; } +#pages-sidebar li li.homework span.entry-number { + display: block; +} #pages-sidebar li li.active a { background-color: var(--sidebar-li-active-bg); @@ -181,6 +200,9 @@ #pages-sidebar li li:hover a { background-color: var(--sidebar-li-hover-bg); } +#pages-sidebar li li.not_in_track { + opacity: 0.4; +} /* TRACK CHOOSER */ diff --git a/src/cheat_sheets/cheatsheets.md b/src/cheat_sheets/cheatsheets.md index afa0f4b4..126b7ec9 100644 --- a/src/cheat_sheets/cheatsheets.md +++ b/src/cheat_sheets/cheatsheets.md @@ -7,7 +7,7 @@ layout: "md.jlmd" # Overview Cheat Sheets -- [Intro to Julia](../intro_to_julia/) (interactive notebook, also listed in the sidebar). +- [Getting Started with Julia - live](/basic_syntax/). - [Fastrack to Julia](https://juliadocs.github.io/Julia-Cheat-Sheet/) cheatsheet. - [MATLAB-Julia-Python comparative cheatsheet](https://cheatsheets.quantecon.org/) by [QuantEcon group](https://quantecon.org) - [Plots.jl cheatsheet](https://github.com/sswatson/cheatsheets/blob/master/plotsjl-cheatsheet.pdf) diff --git a/src/exercises/ode_model_XTRA_tank_T_h_mtk.jl b/src/exercises/ode_model_XTRA_tank_T_h_mtk.jl index b87ba89d..13faf513 100644 --- a/src/exercises/ode_model_XTRA_tank_T_h_mtk.jl +++ b/src/exercises/ode_model_XTRA_tank_T_h_mtk.jl @@ -1,5 +1,5 @@ ### A Pluto.jl notebook ### -# v0.20.4 +# v0.20.13 #> [frontmatter] #> order = "6" diff --git a/src/exercises/ode_model_XTRA_temp_reactors_mtk.jl b/src/exercises/ode_model_XTRA_temp_reactors_mtk.jl index 185f36ef..64d8d4c8 100644 --- a/src/exercises/ode_model_XTRA_temp_reactors_mtk.jl +++ b/src/exercises/ode_model_XTRA_temp_reactors_mtk.jl @@ -1,5 +1,5 @@ ### A Pluto.jl notebook ### -# v0.20.4 +# v0.20.13 #> [frontmatter] #> order = "7" diff --git a/src/exercises/ode_model_XTRA_water_evap_infil_mtk.jl b/src/exercises/ode_model_XTRA_water_evap_infil_mtk.jl index 7f911251..a7af0b30 100644 --- a/src/exercises/ode_model_XTRA_water_evap_infil_mtk.jl +++ b/src/exercises/ode_model_XTRA_water_evap_infil_mtk.jl @@ -1,5 +1,5 @@ ### A Pluto.jl notebook ### -# v0.20.4 +# v0.20.13 #> [frontmatter] #> order = "8" diff --git a/src/exercises/ode_model_catalyst_intro.jl b/src/exercises/ode_model_catalyst_intro.jl index 1a32adad..3cffc2cb 100644 --- a/src/exercises/ode_model_catalyst_intro.jl +++ b/src/exercises/ode_model_catalyst_intro.jl @@ -1,5 +1,5 @@ ### A Pluto.jl notebook ### -# v0.20.21 +# v0.20.13 #> [frontmatter] #> order = "9" diff --git a/src/exercises/ode_model_diver_mtk.jl b/src/exercises/ode_model_diver_mtk.jl index e5cfd6f3..17750cf8 100644 --- a/src/exercises/ode_model_diver_mtk.jl +++ b/src/exercises/ode_model_diver_mtk.jl @@ -1,5 +1,5 @@ ### A Pluto.jl notebook ### -# v0.20.21 +# v0.20.13 #> [frontmatter] #> order = "3" diff --git a/src/exercises/ode_model_irrigation_mtk.jl b/src/exercises/ode_model_irrigation_mtk.jl index 249737f3..c1fa31bb 100644 --- a/src/exercises/ode_model_irrigation_mtk.jl +++ b/src/exercises/ode_model_irrigation_mtk.jl @@ -1,5 +1,5 @@ ### A Pluto.jl notebook ### -# v0.20.21 +# v0.20.13 #> [frontmatter] #> order = "2" diff --git a/src/exercises/ode_model_mtk_intro.jl b/src/exercises/ode_model_mtk_intro.jl index 6d6ced34..5accbc15 100644 --- a/src/exercises/ode_model_mtk_intro.jl +++ b/src/exercises/ode_model_mtk_intro.jl @@ -1,5 +1,5 @@ ### A Pluto.jl notebook ### -# v0.20.21 +# v0.20.13 #> [frontmatter] #> order = "1" diff --git a/src/exercises/ode_model_tank_h_mtk.jl b/src/exercises/ode_model_tank_h_mtk.jl index d6ec27d6..385edacd 100644 --- a/src/exercises/ode_model_tank_h_mtk.jl +++ b/src/exercises/ode_model_tank_h_mtk.jl @@ -1,5 +1,5 @@ ### A Pluto.jl notebook ### -# v0.20.21 +# v0.20.13 #> [frontmatter] #> order = "4" diff --git a/src/exercises/ode_model_tractor_seat_mtk.jl b/src/exercises/ode_model_tractor_seat_mtk.jl index 3a317016..0e9b53a8 100644 --- a/src/exercises/ode_model_tractor_seat_mtk.jl +++ b/src/exercises/ode_model_tractor_seat_mtk.jl @@ -1,5 +1,5 @@ ### A Pluto.jl notebook ### -# v0.20.21 +# v0.20.13 #> [frontmatter] #> order = "5" diff --git a/src/homework/hw1.jl b/src/homework/hw1.jl new file mode 100644 index 00000000..2160c6ad --- /dev/null +++ b/src/homework/hw1.jl @@ -0,0 +1,513 @@ +### A Pluto.jl notebook ### +# v0.20.6 + +#> [frontmatter] +#> homework_number = "1" +#> order = "2.5" +#> title = "sample homework" +#> tags = ["module2", "track_julia", "track_material", "homeworks", "pluto", "PlutoTeachingTools"] +#> layout = "layout.jlhtml" +#> description = "sample howework" + +using Markdown +using InteractiveUtils + +# ╔═║ 75b9bee9-7d03-4c90-b828-43e9e946517b +using PlutoTeachingTools, PlutoUI + +# ╔═║ e022e3ce-15d1-11ee-2c26-a506ce7d9895 +md""" +# Sample Homework + +This notebook showcases some of the features of [`PlutoTeachingTools.jl`](https://github.com/JuliaPluto/PlutoTeachingTools.jl) and how to use these to write homework assignment in Pluto. +""" + +# ╔═║ 2504b43f-f435-4dc6-8fe1-ce2df23ccfc1 +tip(md"""For a deeper tour of `PlutoTeachingTools.jl`, check their [documentation](https://juliapluto.github.io/PlutoTeachingTools.jl/example.html)""") + +# ╔═║ 98c25807-6acd-4d79-8b6d-a335f7d8395a +md""" +## Useful functionalities + +`PlutoTeachingTools.jl` has some functions like `correct`, `still_missing`, here a few demoes +""" + +# ╔═║ 4a6009fb-337e-4246-a086-a1571915bfef +correct() + +# ╔═║ 48090c34-8972-4ace-b9fc-d34fb609c4f9 +still_missing() + +# ╔═║ 71f176dd-27d7-4856-be4f-23c2a8815f24 +keep_working() + +# ╔═║ 520d73e9-0a29-4a00-9812-307e80cc061c +keep_working(md"you can also give custom text to the boxes") + +# ╔═║ c52bc95d-d195-48c9-92f2-fa6970387940 +hint(md"this is a hint, hover the box to unblur the text") + +# ╔═║ f31da618-dd0c-4adb-a8ba-924a5722848c +md""" +## Exercise 1: a simple exercise + +Replace missing with the value `1`. +""" + +# ╔═║ 0d208bc6-88fa-43b8-9b33-a6453ec23a71 +x = missing + +# ╔═║ 60c02a2a-1ea6-4629-842e-a00e45673ef1 +if ismissing(x) + still_missing() +elseif x == 1 && x isa Int + correct() +elseif x == 1 && !(x isa Int) + b1 = almost(md"""Your variable has the right value, but it's not quite the right answer. Read carefully the instructions""") + b2 = hint(md"""What type should the value of x be?""") + md""" + $b1 + $b2 + """ +else + keep_working(md"""That is not the right answer! Keep trying!""") +end + +# ╔═║ 110bcb95-04c2-4e5c-94ef-3c402eabf235 +md""" +here is a short demo of how it looks like when the student tries to solve the exercise +""" + +# ╔═║ 18014fde-b056-42f1-9dc8-f0b935a8630c +Resource("https://user-images.githubusercontent.com/49938764/249749643-8cc12de3-2b50-4182-b95d-686c2c18332c.mov", :width => 500, :autoplay => "", :loop => "") + +# ╔═║ 9f1cc6fd-d3ac-41a1-a761-897f421ce2f0 +md""" +## Exercise 2 + +Write a function called `myfun` that takes as input an integer and returns its square. + +Define a variable called `y` and assign `myfun(3)` to it. +""" + +# ╔═║ d56b3483-c1c8-4f31-929f-3d6e2b1124f4 +let +if !@isdefined(myfun) + func_not_defined(:myfun) +else + test_values = [1, 2, 3, 4, 5] + msg1 = correct() + for t in test_values + if myfun(t) != t^2 + msg1 = keep_working(md"Test failed for input $t, expected $(t^2), but got $(myfun(t))") + break + end + end + msg1 +end +end + +# ╔═║ 10fc3ffd-e4ec-40ab-b645-769d376794fe +if !@isdefined(y) + var_not_defined(:y) +elseif y == 9 + correct() +else + keep_working(md"Evaluated expression y = $y is incorrect.") +end + +# ╔═║ 9e18fc7b-758a-4a63-8550-e04296cbea04 +md""" +and here is a quick demo of the exercise in action +""" + +# ╔═║ 2fde68f8-7705-4e6f-84e4-27d720e7ab95 +Resource("https://user-images.githubusercontent.com/49938764/249748007-d0b2d773-6b21-49d4-89db-ad737af510fe.mov", :width => 500, :autoplay => "", :loop => "") + +# ╔═║ 00000000-0000-0000-0000-000000000001 +PLUTO_PROJECT_TOML_CONTENTS = """ +[deps] +PlutoTeachingTools = "661c6b06-c737-4d37-b85c-46df65de6f69" +PlutoUI = "7f904dfe-b85e-4ff6-b463-dae2292396a8" + +[compat] +PlutoTeachingTools = "~0.2.11" +PlutoUI = "~0.7.51" +""" + +# ╔═║ 00000000-0000-0000-0000-000000000002 +PLUTO_MANIFEST_TOML_CONTENTS = """ +# This file is machine-generated - editing it directly is not advised + +julia_version = "1.9.1" +manifest_format = "2.0" +project_hash = "525dcfd80d74b547385aa255d2a38f1acddad3f3" + +[[deps.AbstractPlutoDingetjes]] +deps = ["Pkg"] +git-tree-sha1 = "8eaf9f1b4921132a4cff3f36a1d9ba923b14a481" +uuid = "6e696c72-6542-2067-7265-42206c756150" +version = "1.1.4" + +[[deps.ArgTools]] +uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" +version = "1.1.1" + +[[deps.Artifacts]] +uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" + +[[deps.Base64]] +uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" + +[[deps.CodeTracking]] +deps = ["InteractiveUtils", "UUIDs"] +git-tree-sha1 = "d730914ef30a06732bdd9f763f6cc32e92ffbff1" +uuid = "da1fd8a2-8d9e-5ec2-8556-3022fb5608a2" +version = "1.3.1" + +[[deps.ColorTypes]] +deps = ["FixedPointNumbers", "Random"] +git-tree-sha1 = "eb7f0f8307f71fac7c606984ea5fb2817275d6e4" +uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f" +version = "0.11.4" + +[[deps.CompilerSupportLibraries_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" +version = "1.0.2+0" + +[[deps.Dates]] +deps = ["Printf"] +uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" + +[[deps.Distributed]] +deps = ["Random", "Serialization", "Sockets"] +uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" + +[[deps.Downloads]] +deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] +uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" +version = "1.6.0" + +[[deps.FileWatching]] +uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" + +[[deps.FixedPointNumbers]] +deps = ["Statistics"] +git-tree-sha1 = "335bfdceacc84c5cdf16aadc768aa5ddfc5383cc" +uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" +version = "0.8.4" + +[[deps.Formatting]] +deps = ["Printf"] +git-tree-sha1 = "8339d61043228fdd3eb658d86c926cb282ae72a8" +uuid = "59287772-0a20-5a39-b81b-1366585eb4c0" +version = "0.4.2" + +[[deps.Hyperscript]] +deps = ["Test"] +git-tree-sha1 = "8d511d5b81240fc8e6802386302675bdf47737b9" +uuid = "47d2ed2b-36de-50cf-bf87-49c2cf4b8b91" +version = "0.0.4" + +[[deps.HypertextLiteral]] +deps = ["Tricks"] +git-tree-sha1 = "c47c5fa4c5308f27ccaac35504858d8914e102f9" +uuid = "ac1192a8-f4b3-4bfe-ba22-af5b92cd3ab2" +version = "0.9.4" + +[[deps.IOCapture]] +deps = ["Logging", "Random"] +git-tree-sha1 = "d75853a0bdbfb1ac815478bacd89cd27b550ace6" +uuid = "b5f81e59-6552-4d32-b1f0-c071b021bf89" +version = "0.2.3" + +[[deps.InteractiveUtils]] +deps = ["Markdown"] +uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" + +[[deps.JSON]] +deps = ["Dates", "Mmap", "Parsers", "Unicode"] +git-tree-sha1 = "31e996f0a15c7b280ba9f76636b3ff9e2ae58c9a" +uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" +version = "0.21.4" + +[[deps.JuliaInterpreter]] +deps = ["CodeTracking", "InteractiveUtils", "Random", "UUIDs"] +git-tree-sha1 = "6a125e6a4cb391e0b9adbd1afa9e771c2179f8ef" +uuid = "aa1ae85d-cabe-5617-a682-6adf51b2e16a" +version = "0.9.23" + +[[deps.LaTeXStrings]] +git-tree-sha1 = "f2355693d6778a178ade15952b7ac47a4ff97996" +uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" +version = "1.3.0" + +[[deps.Latexify]] +deps = ["Formatting", "InteractiveUtils", "LaTeXStrings", "MacroTools", "Markdown", "OrderedCollections", "Printf", "Requires"] +git-tree-sha1 = "8c57307b5d9bb3be1ff2da469063628631d4d51e" +uuid = "23fbe1c1-3f47-55db-b15f-69d7ec21a316" +version = "0.15.21" + + [deps.Latexify.extensions] + DataFramesExt = "DataFrames" + DiffEqBiologicalExt = "DiffEqBiological" + ParameterizedFunctionsExt = "DiffEqBase" + SymEngineExt = "SymEngine" + + [deps.Latexify.weakdeps] + DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" + DiffEqBase = "2b5f629d-d688-5b77-993f-72d75c75574e" + DiffEqBiological = "eb300fae-53e8-50a0-950c-e21f52c2b7e0" + SymEngine = "123dc426-2d89-5057-bbad-38513e3affd8" + +[[deps.LibCURL]] +deps = ["LibCURL_jll", "MozillaCACerts_jll"] +uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" +version = "0.6.3" + +[[deps.LibCURL_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] +uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" +version = "7.84.0+0" + +[[deps.LibGit2]] +deps = ["Base64", "NetworkOptions", "Printf", "SHA"] +uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" + +[[deps.LibSSH2_jll]] +deps = ["Artifacts", "Libdl", "MbedTLS_jll"] +uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" +version = "1.10.2+0" + +[[deps.Libdl]] +uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" + +[[deps.LinearAlgebra]] +deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"] +uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + +[[deps.Logging]] +uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" + +[[deps.LoweredCodeUtils]] +deps = ["JuliaInterpreter"] +git-tree-sha1 = "60168780555f3e663c536500aa790b6368adc02a" +uuid = "6f1432cf-f94c-5a45-995e-cdbf5db27b0b" +version = "2.3.0" + +[[deps.MIMEs]] +git-tree-sha1 = "65f28ad4b594aebe22157d6fac869786a255b7eb" +uuid = "6c6e2e6c-3030-632d-7369-2d6c69616d65" +version = "0.1.4" + +[[deps.MacroTools]] +deps = ["Markdown", "Random"] +git-tree-sha1 = "42324d08725e200c23d4dfb549e0d5d89dede2d2" +uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" +version = "0.5.10" + +[[deps.Markdown]] +deps = ["Base64"] +uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" + +[[deps.MbedTLS_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" +version = "2.28.2+0" + +[[deps.Mmap]] +uuid = "a63ad114-7e13-5084-954f-fe012c677804" + +[[deps.MozillaCACerts_jll]] +uuid = "14a3606d-f60d-562e-9121-12d972cd8159" +version = "2022.10.11" + +[[deps.NetworkOptions]] +uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" +version = "1.2.0" + +[[deps.OpenBLAS_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] +uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" +version = "0.3.21+4" + +[[deps.OrderedCollections]] +git-tree-sha1 = "d321bf2de576bf25ec4d3e4360faca399afca282" +uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" +version = "1.6.0" + +[[deps.Parsers]] +deps = ["Dates", "PrecompileTools", "UUIDs"] +git-tree-sha1 = "4b2e829ee66d4218e0cef22c0a64ee37cf258c29" +uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" +version = "2.7.1" + +[[deps.Pkg]] +deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] +uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" +version = "1.9.0" + +[[deps.PlutoHooks]] +deps = ["InteractiveUtils", "Markdown", "UUIDs"] +git-tree-sha1 = "072cdf20c9b0507fdd977d7d246d90030609674b" +uuid = "0ff47ea0-7a50-410d-8455-4348d5de0774" +version = "0.0.5" + +[[deps.PlutoLinks]] +deps = ["FileWatching", "InteractiveUtils", "Markdown", "PlutoHooks", "Revise", "UUIDs"] +git-tree-sha1 = "8f5fa7056e6dcfb23ac5211de38e6c03f6367794" +uuid = "0ff47ea0-7a50-410d-8455-4348d5de0420" +version = "0.1.6" + +[[deps.PlutoTeachingTools]] +deps = ["Downloads", "HypertextLiteral", "LaTeXStrings", "Latexify", "Markdown", "PlutoLinks", "PlutoUI", "Random"] +git-tree-sha1 = "88222661708df26242d0bfb9237d023557d11718" +uuid = "661c6b06-c737-4d37-b85c-46df65de6f69" +version = "0.2.11" + +[[deps.PlutoUI]] +deps = ["AbstractPlutoDingetjes", "Base64", "ColorTypes", "Dates", "FixedPointNumbers", "Hyperscript", "HypertextLiteral", "IOCapture", "InteractiveUtils", "JSON", "Logging", "MIMEs", "Markdown", "Random", "Reexport", "URIs", "UUIDs"] +git-tree-sha1 = "b478a748be27bd2f2c73a7690da219d0844db305" +uuid = "7f904dfe-b85e-4ff6-b463-dae2292396a8" +version = "0.7.51" + +[[deps.PrecompileTools]] +deps = ["Preferences"] +git-tree-sha1 = "9673d39decc5feece56ef3940e5dafba15ba0f81" +uuid = "aea7be01-6a6a-4083-8856-8a6e6704d82a" +version = "1.1.2" + +[[deps.Preferences]] +deps = ["TOML"] +git-tree-sha1 = "7eb1686b4f04b82f96ed7a4ea5890a4f0c7a09f1" +uuid = "21216c6a-2e73-6563-6e65-726566657250" +version = "1.4.0" + +[[deps.Printf]] +deps = ["Unicode"] +uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" + +[[deps.REPL]] +deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] +uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" + +[[deps.Random]] +deps = ["SHA", "Serialization"] +uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" + +[[deps.Reexport]] +git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" +uuid = "189a3867-3050-52da-a836-e630ba90ab69" +version = "1.2.2" + +[[deps.Requires]] +deps = ["UUIDs"] +git-tree-sha1 = "838a3a4188e2ded87a4f9f184b4b0d78a1e91cb7" +uuid = "ae029012-a4dd-5104-9daa-d747884805df" +version = "1.3.0" + +[[deps.Revise]] +deps = ["CodeTracking", "Distributed", "FileWatching", "JuliaInterpreter", "LibGit2", "LoweredCodeUtils", "OrderedCollections", "Pkg", "REPL", "Requires", "UUIDs", "Unicode"] +git-tree-sha1 = "1e597b93700fa4045d7189afa7c004e0584ea548" +uuid = "295af30f-e4ad-537b-8983-00126c2a3abe" +version = "3.5.3" + +[[deps.SHA]] +uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" +version = "0.7.0" + +[[deps.Serialization]] +uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" + +[[deps.Sockets]] +uuid = "6462fe0b-24de-5631-8697-dd941f90decc" + +[[deps.SparseArrays]] +deps = ["Libdl", "LinearAlgebra", "Random", "Serialization", "SuiteSparse_jll"] +uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + +[[deps.Statistics]] +deps = ["LinearAlgebra", "SparseArrays"] +uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" +version = "1.9.0" + +[[deps.SuiteSparse_jll]] +deps = ["Artifacts", "Libdl", "Pkg", "libblastrampoline_jll"] +uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c" +version = "5.10.1+6" + +[[deps.TOML]] +deps = ["Dates"] +uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" +version = "1.0.3" + +[[deps.Tar]] +deps = ["ArgTools", "SHA"] +uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" +version = "1.10.0" + +[[deps.Test]] +deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] +uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[[deps.Tricks]] +git-tree-sha1 = "aadb748be58b492045b4f56166b5188aa63ce549" +uuid = "410a4b4d-49e4-4fbc-ab6d-cb71b17b3775" +version = "0.1.7" + +[[deps.URIs]] +git-tree-sha1 = "074f993b0ca030848b897beff716d93aca60f06a" +uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" +version = "1.4.2" + +[[deps.UUIDs]] +deps = ["Random", "SHA"] +uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" + +[[deps.Unicode]] +uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" + +[[deps.Zlib_jll]] +deps = ["Libdl"] +uuid = "83775a58-1f1d-513f-b197-d71354ab007a" +version = "1.2.13+0" + +[[deps.libblastrampoline_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" +version = "5.8.0+0" + +[[deps.nghttp2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" +version = "1.48.0+0" + +[[deps.p7zip_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" +version = "17.4.0+0" +""" + +# ╔═║ Cell order: +# ╠═75b9bee9-7d03-4c90-b828-43e9e946517b +# β•Ÿβ”€e022e3ce-15d1-11ee-2c26-a506ce7d9895 +# β•Ÿβ”€2504b43f-f435-4dc6-8fe1-ce2df23ccfc1 +# β•Ÿβ”€98c25807-6acd-4d79-8b6d-a335f7d8395a +# ╠═4a6009fb-337e-4246-a086-a1571915bfef +# ╠═48090c34-8972-4ace-b9fc-d34fb609c4f9 +# ╠═71f176dd-27d7-4856-be4f-23c2a8815f24 +# ╠═520d73e9-0a29-4a00-9812-307e80cc061c +# ╠═c52bc95d-d195-48c9-92f2-fa6970387940 +# β•Ÿβ”€f31da618-dd0c-4adb-a8ba-924a5722848c +# ╠═0d208bc6-88fa-43b8-9b33-a6453ec23a71 +# ╠═60c02a2a-1ea6-4629-842e-a00e45673ef1 +# β•Ÿβ”€110bcb95-04c2-4e5c-94ef-3c402eabf235 +# β•Ÿβ”€18014fde-b056-42f1-9dc8-f0b935a8630c +# β•Ÿβ”€9f1cc6fd-d3ac-41a1-a761-897f421ce2f0 +# ╠═d56b3483-c1c8-4f31-929f-3d6e2b1124f4 +# ╠═10fc3ffd-e4ec-40ab-b645-769d376794fe +# β•Ÿβ”€9e18fc7b-758a-4a63-8550-e04296cbea04 +# β•Ÿβ”€2fde68f8-7705-4e6f-84e4-27d720e7ab95 +# β•Ÿβ”€00000000-0000-0000-0000-000000000001 +# β•Ÿβ”€00000000-0000-0000-0000-000000000002 diff --git a/src/mod1_setup_website/basic_info.md b/src/mod1_setup_website/basic_info.md new file mode 100644 index 00000000..b849766b --- /dev/null +++ b/src/mod1_setup_website/basic_info.md @@ -0,0 +1,89 @@ +--- +title: "Fill course basic information" +order: 2 +chapter: 1 +section: 2 +layout: "md.jlmd" +image: "https://user-images.githubusercontent.com/49938764/249464984-ae268773-b804-459a-9c33-ed2839802ad8.png" +tags: ["module1", "track_setup", "teaching", "metadata"] +--- + +## Add basic information + +If you look at the homepage of the template website, you will see it has a bunch of placeholder text, such as "name of your course", "a short catchy phrase" etc. + +To customize this, you will need to customize the *metadata* of the website. That is, add basic info for your class. + +To do so, you will need to fill the info in the files under the folder `src/_data`. Let us analyze these one by one. + +## course_info.jl + +This file contains a julia `Dict` with the basic info of the class. For each key (`course_name`, `course_subtitle`, etc.) replace the corresponding placeholder with an appropriate text for your class. + +When filling the `institution_logo` data with the name of your university logo file, do not forget to actually put the file under `src/assets`. + +Authors are listed as a vector of pairs, where the first element is the author name and the second is their homepage address. If you dont have a homepage address for the author, put an empty string `""`. + +## `homepage.jl` + +This file contains metadata for the info displayed in the homepage, particularly + +- **`title`**: the title displayed on top of the homepage +- **`disclaimer`**: the disclaimer displayed below the title. If you don't want a disclaimer, you can remove this entry. +- **`highlights`**: in this entry you can specify the highlights of your class, which will be displayed on the homepage. This entry should be a vector of highlights. Each entry in the vector should be a dict with the following fields + - **`name`**: the title of the highlight + - **`text`**: short description of the highlight + - **`img`**: link to an image summarizing the highlight + +## `sidebar.jl` + +In this file you can specify the sidebar of the website. All lecture materials will be grouped in *modules* in the sidebar, which are defined in this file. + +The modules in the file are specified as a vector of pairs, in the form + +```julia +module_id => module_title +``` + +for example + +```julia +"module1" => "Week 1: Introduction to the class" +``` + +To link a file to a module, you will need to add the module identifier in the page tags. For more info about this, see [Add frontmatter](https://juliapluto.github.io/computational-thinking-template/add_markdown) + +## `tracks.jl` + +In this file you will specify tracks. Tracks can be used to group lectures across modules, e.g. if they have a commmon theme. When a track is selected on the sidebar, only the pages +belonging to that track will be highlighted. + +Similar to modules, tracks are stored in a vector of pairs in the form + +```julia +track_id => track_title +``` + +for example + +```julia +"julia" => "πŸ’» Julia programming" +``` + +To link a file to a track, you will need to add the track id, prefixed with `track_`, to the tags of the page. For example, to add a lesson to the julia track defined above, you would add the tag `track_julia` to the tags of that lesson file. + +## License + +Choosing an appropriate license is important to make your material properly reusable. + +- For text, popular licenses are [Creative Commons](https://creativecommons.org/about/cclicenses/), for example [CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/) + +- For code, an [OSI open source license](https://opensource.org/licenses/) is recommended. For example [MIT](https://opensource.org/license/mit/) or [Apache 2.0](https://opensource.org/license/apache-2-0/) license. + +To add the license, open the file `LICENSE.md` and replace the text + +``` + +``` + +with your license(s). \ No newline at end of file diff --git a/src/mod1_setup_website/getting_started.md b/src/mod1_setup_website/getting_started.md new file mode 100644 index 00000000..b0cbaabb --- /dev/null +++ b/src/mod1_setup_website/getting_started.md @@ -0,0 +1,46 @@ +--- +title: "Getting started" +order: 1 +chapter: 1 +section: 1 +layout: "md.jlmd" +image: "https://user-images.githubusercontent.com/49938764/249456747-c93b41a0-308a-4ad4-9afb-6ce3309633d1.png" +tags: ["module1", "track_setup", "teaching", "repository structure"] +--- + +## Fork the template + +Go to the [template repository](https://github.com/juliapluto/computational-thinking-template) and click `Use this template` on the top-right corner. This will fork the repository under your github profile. + +![](https://user-images.githubusercontent.com/49938764/249456747-c93b41a0-308a-4ad4-9afb-6ce3309633d1.png) + +## Folder structure + +Let us have a look at what this repository looks like. The most important folder, where you will be mainly working is `src`. Here you will place all your lecture materials. So let us take a closer look at this. + +Opening the `src` folder, you will see the following + +- `_data` folder: here you will place metadata about your website (university name, class semester, define tracks, etc.), more on this in the next lesson. +- `_include`: This folder contains the layout templates that are used to generate the final pages on your website. Unless you want to tweak the layout, you will not need to modify this. +- `assets`: in this folder you can place all attachements, such as your university logo and other pictures. The folder also contains the CSS and scripts used to render the website. + +That was for the "infrastructure part" of the website, the rest is content! To add new pages to your website, simply them under the `src` folder. You can group them in subfolders, as done in this template, but that is not a strict requirement. + +When downloading this template, you will get the following material: + +- **`installation.md`**: this page contains instructions on how to install Julia and Pluto. If you find it useful, you may keep it as is, or edit to match your wanted installation instructions. +- **`cheatsheets.md`**: contains a list of julia related resources. Again, you can keep it or remove it. +- **`logistics.md`**: empty markdown page, where you can describe the logistics of your class +- **`index.jlmd`**: this is used to render the homepage. **Do not remove or modify this!** +- **`search.md`**: this is used to render the search tab on the sidebar, do not modify or remove this file. + +The remaining folders + +- `mod1_setup_website` +- `mod2_add_material` +- `mod3_publish_website` +- `homework` + +are placeholder samples, used to showcase what a deployed website looks like. As a bonus, these placeholder files actually document how to use this template. You can read it and see what the final result looks like on the [template webpage](https://juliapluto.github.io/computational-thinking-template). + +When starting adding your course material, you will most likely want to remove these. \ No newline at end of file diff --git a/src/mod1_setup_website/working_locally.md b/src/mod1_setup_website/working_locally.md new file mode 100644 index 00000000..201adffc --- /dev/null +++ b/src/mod1_setup_website/working_locally.md @@ -0,0 +1,21 @@ +--- +title: "Working locally" +order: 3 +chapter: 1 +section: 3 +layout: "md.jlmd" +image: "https://user-images.githubusercontent.com/49938764/249456721-2ff021b2-326d-443d-a3ac-b433692647e0.png" +tags: ["module1", "track_setup", "track_julia", "PlutoSliderServer", "pluto"] +--- + +## Working locally + +Open this repository in VS Code, and install the recommended extensions. + +To start running the development server, open the VS Code *command palette* (press `Cmd+Shift+P`), and search for **`Tasks: Run Task`**, then **`PlutoPages: run development server`**. The first run can take some time, as it builds up the notebook outputs cache. Leave it running. + +This will start two things in parallel: the PlutoPages.jl notebook (which generates the website), and a static file server (with Deno_jll). It will open two tabs in your browser: one is the generation dashboard (PlutoPages), the other is the current site preview (Deno_jll). + +Whenever you edit a file, PlutoPages will automatically regenerate! Refresh your browser tab. If it does not pick up the change, go to the generation dashboard and click the "Read input files again" button. + +**Note!**: This workflow is recommended for writing static content, styles, and for site maintenance. But for writing Pluto notebooks, it's best to prepare the notebook first, and then run the site (because it re-runs the entire notebook on any change). \ No newline at end of file diff --git a/src/mod2_add_material/add_markdown.md b/src/mod2_add_material/add_markdown.md new file mode 100644 index 00000000..f34c1aa5 --- /dev/null +++ b/src/mod2_add_material/add_markdown.md @@ -0,0 +1,89 @@ +--- +title: "Add markdown files" +order: 1 +chapter: 2 +section: 1 +layout: "md.jlmd" +tags: ["module2", "track_material", "markdown", "frontmatter"] +--- + +## Add markdown files + +If your lecture does not need to run code or use interactivity. You can write it as a markdown file. + +As an extra twist, you can evaluate julia code inside a `\$` symbol. For example, + +```julia +\$(1 + 1) +``` +will become + +$(1 + 1) + +## Add Front-matter + +For each file, markdown or pluto, you will need to add a *front-matter*, which specifies the page metadata. For markdown files, the front-matter is specified at the top of the file between three dashes `---`. For example, the front-matter of this file is + +``` +--- +title: "Add markdown file" +order: 1 +chapter: 2 +section: 1 +layout: "md.jlmd" +tags: ["module2", "track_material", "markdown", "frontmatter"] +--- +``` + +You will need to specify the following attributes + +- **`title`**: title of the page +- **`order`**: the position of the page in the module on the sidebar. **Hint!**: You can also use fractional numbers, e.g. `1.5`. This can be handy for homeworks, so you can include the homework between the first and second lesson without messing up lessons counting. +- **`layout`**: set to `"md.jlmd"`, unless you are using some custom layout +- **`chapter`** and **`section`** (optional): used to number the page. If for example `chapter=1` and `section=2`, the page will be displayed as `1.2` on the sidebar and page header. +- **`image`** (optional): link to summarizing image to display in the `subjects` section on the homepage. If left empty, the page wont be included in the subjects section. If no page has an `image` field in the front-matter, the subjects section is not displayed. +- **`description`** (optional): short description of the notebook +- **`youtube_id`** (optional): youtube id of the video associated with the page. If included, the page header will embed the youtube video. +- **`homework_number`**: needed only for homeworks, the number of the homework +- **`tags`**: list of keywords for the page. It should at least include the module name, as defined in `_data/sidebar.jl` to include the page in the sidebar. You can also associate pages to a given track by adding the track id, prefixed with `track_` to the tags. For example, if you want to include the page in the julia track, add `track_julia` in the tags list. + + +## Markdown 101 + +If you are not familiar with markdown, you can see for example [here](https://www.markdowntutorial.com/). Here is a quick and dirty cheatsheet + +1. Use `#` for headers, for example + +```markdown +# Header +## Subheader +### Sub-sub-header +``` + +2. You can create links with the syntax + +```markdown +[text](adddress) +``` + +For example the link to the mardown tutorial above was typed as + +```markdown +[here](https://www.markdowntutorial.com/) +``` + +3. You can insert pictures with the syntax + +```markdown +![optional alternative text](link-to-picture) +``` + +for example + +``` +![](https://raw.githubusercontent.com/JuliaLang/julia-logo-graphics/master/images/julia-logo-color.png) +``` + +will give + +![](https://raw.githubusercontent.com/JuliaLang/julia-logo-graphics/master/images/julia-logo-color.png) \ No newline at end of file diff --git a/src/mod2_add_material/add_pluto.jl b/src/mod2_add_material/add_pluto.jl new file mode 100644 index 00000000..35b3143c --- /dev/null +++ b/src/mod2_add_material/add_pluto.jl @@ -0,0 +1,506 @@ +### A Pluto.jl notebook ### +# v0.19.25 + +#> [frontmatter] +#> chapter = 2 +#> section = 2 +#> order = 2 +#> image = "https://raw.githubusercontent.com/fonsp/Pluto.jl/580ab811f13d565cc81ebfa70ed36c84b125f55d/demo/plutodemo.gif" +#> title = "Add Pluto notebooks" +#> tags = ["module2", "track_julia", "track_material", "Pluto", "PlutoUI"] +#> layout = "layout.jlhtml" + +using Markdown +using InteractiveUtils + +# ╔═║ 055ef0df-8ab8-4e54-a476-89d521f29ee0 +using PlutoTeachingTools, PlutoUI + +# ╔═║ 4f643fd4-1e8d-4304-961b-a30a37a58de3 +TableOfContents() + +# ╔═║ acdd466e-14f5-11ee-1921-93e6c67d7ec4 +md""" +## Add Pluto notebooks + +[Pluto.jl](https://plutojl.org/) is a revolutionary text-editor for reactive and interactive programming. + +To start creating a Pluto notebook, open a terminal and launch Julia, then do + +```julia +using Pluto; Pluto.run() +``` + +This will launch a Pluto session, where you can write your notebook. + +To add the front-matter, you can use Plut FrontmatterGUI, as the following short video clip shows. + +$(danger(md"For pluto notebooks, you will need to set layout to layout.jlhtml")) +""" + +# ╔═║ 832a1b2f-42dc-4a5d-9389-9f8f35a1759b +html""" +""" + +# ╔═║ 8656f15c-a603-45f6-8ac6-4941580830e8 +md"""## Pluto 101 + +Pluto is a notebook for Julia! It is **reactive**, **lightweight** and has **powerful interactivity tools**. This will allow you to make your lesson material more engaging for students. Here are a few highlights of Pluto. + +$(tip(md" To learn more, check out [Pluto featured notebooks](https://featured.plutojl.org/), the JuliaCon video at the beginning of this notebook, or the presentations at [PlutoCon 2021](https://www.youtube.com/playlist?list=PLP8iPy9hna6T5sNOTeGdiqygHe_09geEW).")) +### Writing code in Pluto + +In Pluto code is written in cells, to add some code, simply create a new cell and type in. Each cell should contain 1 julia expression (function definition, if-statement, variable assignment, etc.). + +```julia +if rand() > 0.5 + "hi" +else + "there" +end +``` + +or + +```julia +a = 1 +``` + +or + +```julia +function f() + return rand() ^ 2 +end +``` + +**However**, multiple expressions in the same cell are not allowed, for example + +```julia +a = 1 +b = 2 +a + b +``` + +cannot be written in the same cell. You have two alternatives + +1. Split it into multiple cells (recommended to make reactivity better). +2. Wrap your staments inside a `begin ... end` or `let ... end` block. The difference is that the latter introduces a local scope, hence variables defined inside `let` are not visibles from outside. + +### Reactivity + +Pluto is reactive! This means that if you define a variable `a` in a cell, when you edit the variable value, all cells depending on that variable are automatically re-evaluated. A few notes + +1. As mentioned above, better to have a single variable assignment per cell, this will make the dependency graph slimmer and reactivity smoother. +2. Code modifying a given variable should be in the same cell, i.e. you cannot have two cells modifying the same variable. + +Here is a summarizing demo + +""" + +# ╔═║ ba9f13cc-bf18-4589-9e89-3d5c869e158f +Resource("https://raw.githubusercontent.com/fonsp/Pluto.jl/580ab811f13d565cc81ebfa70ed36c84b125f55d/demo/plutodemo.gif", :width => 350) + +# ╔═║ d97ae81e-fd53-4b0a-a990-abf173b0c1ab +md""" +### Built-in environment + +Pluto is designed with reproducibility in mind! + +To use packages registered in the Julia general registry, just type `using MyPackage` in some cells, as done at the beginning of this notebook. Pluto will automatically download the package! + +The `Project.toml` and `Manifest.toml` (what Julia uses to record all libraries, their versions and dependencies) are stored inside the notebook, making it fully batteries included! + +$(Resource("https://user-images.githubusercontent.com/6933510/134823403-fbb79d7f-dd3e-4712-b5d5-b48ad0770f13.gif", :width => 400)) +""" + +# ╔═║ 177b8901-68ad-4319-b4fa-28fb30f3a731 +md""" +### Interactivity + +Pluto has great support to make your notebooks interactive! It allows you to associate variables with sliders and buttons that you can use to interactively change the result of the code. + +![](https://user-images.githubusercontent.com/6933510/136196607-16207911-53be-4abb-b90e-d46c946e6aaf.gif) + + +The easiest way to harness the power of Pluto interactivity is to use [PlutoUI.jl](https://github.com/juliapluto/PlutoUI.jl), which is showcased in the [next lecture](https://juliapluto.github.io/mod2_add_material/plutoui_showcase/). +""" + +# ╔═║ 00000000-0000-0000-0000-000000000001 +PLUTO_PROJECT_TOML_CONTENTS = """ +[deps] +PlutoTeachingTools = "661c6b06-c737-4d37-b85c-46df65de6f69" +PlutoUI = "7f904dfe-b85e-4ff6-b463-dae2292396a8" + +[compat] +PlutoTeachingTools = "~0.2.11" +PlutoUI = "~0.7.51" +""" + +# ╔═║ 00000000-0000-0000-0000-000000000002 +PLUTO_MANIFEST_TOML_CONTENTS = """ +# This file is machine-generated - editing it directly is not advised + +julia_version = "1.9.1" +manifest_format = "2.0" +project_hash = "525dcfd80d74b547385aa255d2a38f1acddad3f3" + +[[deps.AbstractPlutoDingetjes]] +deps = ["Pkg"] +git-tree-sha1 = "8eaf9f1b4921132a4cff3f36a1d9ba923b14a481" +uuid = "6e696c72-6542-2067-7265-42206c756150" +version = "1.1.4" + +[[deps.ArgTools]] +uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" +version = "1.1.1" + +[[deps.Artifacts]] +uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" + +[[deps.Base64]] +uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" + +[[deps.CodeTracking]] +deps = ["InteractiveUtils", "UUIDs"] +git-tree-sha1 = "d730914ef30a06732bdd9f763f6cc32e92ffbff1" +uuid = "da1fd8a2-8d9e-5ec2-8556-3022fb5608a2" +version = "1.3.1" + +[[deps.ColorTypes]] +deps = ["FixedPointNumbers", "Random"] +git-tree-sha1 = "eb7f0f8307f71fac7c606984ea5fb2817275d6e4" +uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f" +version = "0.11.4" + +[[deps.CompilerSupportLibraries_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" +version = "1.0.2+0" + +[[deps.Dates]] +deps = ["Printf"] +uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" + +[[deps.Distributed]] +deps = ["Random", "Serialization", "Sockets"] +uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" + +[[deps.Downloads]] +deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] +uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" +version = "1.6.0" + +[[deps.FileWatching]] +uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" + +[[deps.FixedPointNumbers]] +deps = ["Statistics"] +git-tree-sha1 = "335bfdceacc84c5cdf16aadc768aa5ddfc5383cc" +uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" +version = "0.8.4" + +[[deps.Formatting]] +deps = ["Printf"] +git-tree-sha1 = "8339d61043228fdd3eb658d86c926cb282ae72a8" +uuid = "59287772-0a20-5a39-b81b-1366585eb4c0" +version = "0.4.2" + +[[deps.Hyperscript]] +deps = ["Test"] +git-tree-sha1 = "8d511d5b81240fc8e6802386302675bdf47737b9" +uuid = "47d2ed2b-36de-50cf-bf87-49c2cf4b8b91" +version = "0.0.4" + +[[deps.HypertextLiteral]] +deps = ["Tricks"] +git-tree-sha1 = "c47c5fa4c5308f27ccaac35504858d8914e102f9" +uuid = "ac1192a8-f4b3-4bfe-ba22-af5b92cd3ab2" +version = "0.9.4" + +[[deps.IOCapture]] +deps = ["Logging", "Random"] +git-tree-sha1 = "d75853a0bdbfb1ac815478bacd89cd27b550ace6" +uuid = "b5f81e59-6552-4d32-b1f0-c071b021bf89" +version = "0.2.3" + +[[deps.InteractiveUtils]] +deps = ["Markdown"] +uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" + +[[deps.JSON]] +deps = ["Dates", "Mmap", "Parsers", "Unicode"] +git-tree-sha1 = "31e996f0a15c7b280ba9f76636b3ff9e2ae58c9a" +uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" +version = "0.21.4" + +[[deps.JuliaInterpreter]] +deps = ["CodeTracking", "InteractiveUtils", "Random", "UUIDs"] +git-tree-sha1 = "6a125e6a4cb391e0b9adbd1afa9e771c2179f8ef" +uuid = "aa1ae85d-cabe-5617-a682-6adf51b2e16a" +version = "0.9.23" + +[[deps.LaTeXStrings]] +git-tree-sha1 = "f2355693d6778a178ade15952b7ac47a4ff97996" +uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" +version = "1.3.0" + +[[deps.Latexify]] +deps = ["Formatting", "InteractiveUtils", "LaTeXStrings", "MacroTools", "Markdown", "OrderedCollections", "Printf", "Requires"] +git-tree-sha1 = "8c57307b5d9bb3be1ff2da469063628631d4d51e" +uuid = "23fbe1c1-3f47-55db-b15f-69d7ec21a316" +version = "0.15.21" + + [deps.Latexify.extensions] + DataFramesExt = "DataFrames" + DiffEqBiologicalExt = "DiffEqBiological" + ParameterizedFunctionsExt = "DiffEqBase" + SymEngineExt = "SymEngine" + + [deps.Latexify.weakdeps] + DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" + DiffEqBase = "2b5f629d-d688-5b77-993f-72d75c75574e" + DiffEqBiological = "eb300fae-53e8-50a0-950c-e21f52c2b7e0" + SymEngine = "123dc426-2d89-5057-bbad-38513e3affd8" + +[[deps.LibCURL]] +deps = ["LibCURL_jll", "MozillaCACerts_jll"] +uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" +version = "0.6.3" + +[[deps.LibCURL_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] +uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" +version = "7.84.0+0" + +[[deps.LibGit2]] +deps = ["Base64", "NetworkOptions", "Printf", "SHA"] +uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" + +[[deps.LibSSH2_jll]] +deps = ["Artifacts", "Libdl", "MbedTLS_jll"] +uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" +version = "1.10.2+0" + +[[deps.Libdl]] +uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" + +[[deps.LinearAlgebra]] +deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"] +uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + +[[deps.Logging]] +uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" + +[[deps.LoweredCodeUtils]] +deps = ["JuliaInterpreter"] +git-tree-sha1 = "60168780555f3e663c536500aa790b6368adc02a" +uuid = "6f1432cf-f94c-5a45-995e-cdbf5db27b0b" +version = "2.3.0" + +[[deps.MIMEs]] +git-tree-sha1 = "65f28ad4b594aebe22157d6fac869786a255b7eb" +uuid = "6c6e2e6c-3030-632d-7369-2d6c69616d65" +version = "0.1.4" + +[[deps.MacroTools]] +deps = ["Markdown", "Random"] +git-tree-sha1 = "42324d08725e200c23d4dfb549e0d5d89dede2d2" +uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" +version = "0.5.10" + +[[deps.Markdown]] +deps = ["Base64"] +uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" + +[[deps.MbedTLS_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" +version = "2.28.2+0" + +[[deps.Mmap]] +uuid = "a63ad114-7e13-5084-954f-fe012c677804" + +[[deps.MozillaCACerts_jll]] +uuid = "14a3606d-f60d-562e-9121-12d972cd8159" +version = "2022.10.11" + +[[deps.NetworkOptions]] +uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" +version = "1.2.0" + +[[deps.OpenBLAS_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] +uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" +version = "0.3.21+4" + +[[deps.OrderedCollections]] +git-tree-sha1 = "d321bf2de576bf25ec4d3e4360faca399afca282" +uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" +version = "1.6.0" + +[[deps.Parsers]] +deps = ["Dates", "PrecompileTools", "UUIDs"] +git-tree-sha1 = "4b2e829ee66d4218e0cef22c0a64ee37cf258c29" +uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" +version = "2.7.1" + +[[deps.Pkg]] +deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] +uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" +version = "1.9.0" + +[[deps.PlutoHooks]] +deps = ["InteractiveUtils", "Markdown", "UUIDs"] +git-tree-sha1 = "072cdf20c9b0507fdd977d7d246d90030609674b" +uuid = "0ff47ea0-7a50-410d-8455-4348d5de0774" +version = "0.0.5" + +[[deps.PlutoLinks]] +deps = ["FileWatching", "InteractiveUtils", "Markdown", "PlutoHooks", "Revise", "UUIDs"] +git-tree-sha1 = "8f5fa7056e6dcfb23ac5211de38e6c03f6367794" +uuid = "0ff47ea0-7a50-410d-8455-4348d5de0420" +version = "0.1.6" + +[[deps.PlutoTeachingTools]] +deps = ["Downloads", "HypertextLiteral", "LaTeXStrings", "Latexify", "Markdown", "PlutoLinks", "PlutoUI", "Random"] +git-tree-sha1 = "88222661708df26242d0bfb9237d023557d11718" +uuid = "661c6b06-c737-4d37-b85c-46df65de6f69" +version = "0.2.11" + +[[deps.PlutoUI]] +deps = ["AbstractPlutoDingetjes", "Base64", "ColorTypes", "Dates", "FixedPointNumbers", "Hyperscript", "HypertextLiteral", "IOCapture", "InteractiveUtils", "JSON", "Logging", "MIMEs", "Markdown", "Random", "Reexport", "URIs", "UUIDs"] +git-tree-sha1 = "b478a748be27bd2f2c73a7690da219d0844db305" +uuid = "7f904dfe-b85e-4ff6-b463-dae2292396a8" +version = "0.7.51" + +[[deps.PrecompileTools]] +deps = ["Preferences"] +git-tree-sha1 = "9673d39decc5feece56ef3940e5dafba15ba0f81" +uuid = "aea7be01-6a6a-4083-8856-8a6e6704d82a" +version = "1.1.2" + +[[deps.Preferences]] +deps = ["TOML"] +git-tree-sha1 = "7eb1686b4f04b82f96ed7a4ea5890a4f0c7a09f1" +uuid = "21216c6a-2e73-6563-6e65-726566657250" +version = "1.4.0" + +[[deps.Printf]] +deps = ["Unicode"] +uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" + +[[deps.REPL]] +deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] +uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" + +[[deps.Random]] +deps = ["SHA", "Serialization"] +uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" + +[[deps.Reexport]] +git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" +uuid = "189a3867-3050-52da-a836-e630ba90ab69" +version = "1.2.2" + +[[deps.Requires]] +deps = ["UUIDs"] +git-tree-sha1 = "838a3a4188e2ded87a4f9f184b4b0d78a1e91cb7" +uuid = "ae029012-a4dd-5104-9daa-d747884805df" +version = "1.3.0" + +[[deps.Revise]] +deps = ["CodeTracking", "Distributed", "FileWatching", "JuliaInterpreter", "LibGit2", "LoweredCodeUtils", "OrderedCollections", "Pkg", "REPL", "Requires", "UUIDs", "Unicode"] +git-tree-sha1 = "1e597b93700fa4045d7189afa7c004e0584ea548" +uuid = "295af30f-e4ad-537b-8983-00126c2a3abe" +version = "3.5.3" + +[[deps.SHA]] +uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" +version = "0.7.0" + +[[deps.Serialization]] +uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" + +[[deps.Sockets]] +uuid = "6462fe0b-24de-5631-8697-dd941f90decc" + +[[deps.SparseArrays]] +deps = ["Libdl", "LinearAlgebra", "Random", "Serialization", "SuiteSparse_jll"] +uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + +[[deps.Statistics]] +deps = ["LinearAlgebra", "SparseArrays"] +uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" +version = "1.9.0" + +[[deps.SuiteSparse_jll]] +deps = ["Artifacts", "Libdl", "Pkg", "libblastrampoline_jll"] +uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c" +version = "5.10.1+6" + +[[deps.TOML]] +deps = ["Dates"] +uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" +version = "1.0.3" + +[[deps.Tar]] +deps = ["ArgTools", "SHA"] +uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" +version = "1.10.0" + +[[deps.Test]] +deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] +uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[[deps.Tricks]] +git-tree-sha1 = "aadb748be58b492045b4f56166b5188aa63ce549" +uuid = "410a4b4d-49e4-4fbc-ab6d-cb71b17b3775" +version = "0.1.7" + +[[deps.URIs]] +git-tree-sha1 = "074f993b0ca030848b897beff716d93aca60f06a" +uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" +version = "1.4.2" + +[[deps.UUIDs]] +deps = ["Random", "SHA"] +uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" + +[[deps.Unicode]] +uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" + +[[deps.Zlib_jll]] +deps = ["Libdl"] +uuid = "83775a58-1f1d-513f-b197-d71354ab007a" +version = "1.2.13+0" + +[[deps.libblastrampoline_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" +version = "5.8.0+0" + +[[deps.nghttp2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" +version = "1.48.0+0" + +[[deps.p7zip_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" +version = "17.4.0+0" +""" + +# ╔═║ Cell order: +# ╠═055ef0df-8ab8-4e54-a476-89d521f29ee0 +# ╠═4f643fd4-1e8d-4304-961b-a30a37a58de3 +# β•Ÿβ”€acdd466e-14f5-11ee-1921-93e6c67d7ec4 +# β•Ÿβ”€832a1b2f-42dc-4a5d-9389-9f8f35a1759b +# β•Ÿβ”€8656f15c-a603-45f6-8ac6-4941580830e8 +# β•Ÿβ”€ba9f13cc-bf18-4589-9e89-3d5c869e158f +# β•Ÿβ”€d97ae81e-fd53-4b0a-a990-abf173b0c1ab +# β•Ÿβ”€177b8901-68ad-4319-b4fa-28fb30f3a731 +# β•Ÿβ”€00000000-0000-0000-0000-000000000001 +# β•Ÿβ”€00000000-0000-0000-0000-000000000002 diff --git a/src/mod2_add_material/plutoui_showcase.jl b/src/mod2_add_material/plutoui_showcase.jl new file mode 100644 index 00000000..1cc62f9e --- /dev/null +++ b/src/mod2_add_material/plutoui_showcase.jl @@ -0,0 +1,1021 @@ +### A Pluto.jl notebook ### +# v0.19.25 + +#> [frontmatter] +#> chapter = "2" +#> image = "https://user-images.githubusercontent.com/6933510/174067690-50c8128d-748b-4f50-8a76-2ce18166642b.png" +#> order = "3" +#> section = "3" +#> title = "PlutoUI showcase" +#> tags = ["module2", "track_julia", "track_material", "Pluto", "PlutoUI", "interactivity"] +#> layout = "layout.jlhtml" + +using Markdown +using InteractiveUtils + +# This Pluto notebook uses @bind for interactivity. When running this notebook outside of Pluto, the following 'mock version' of @bind gives bound variables a default value (instead of an error). +macro bind(def, element) + quote + local iv = try Base.loaded_modules[Base.PkgId(Base.UUID("6e696c72-6542-2067-7265-42206c756150"), "AbstractPlutoDingetjes")].Bonds.initial_value catch; b -> missing; end + local el = $(esc(element)) + global $(esc(def)) = Core.applicable(Base.get, el) ? Base.get(el) : iv(el) + el + end +end + +# ╔═║ 071d9ca5-9b42-4583-ad96-a48f93453a0e +using PlutoUI + +# ╔═║ bc532cd2-c75b-11ea-313f-8b5e771c9227 +md"""# PlutoUI.jl + +Pluto notebooks can use **`@bind`** to add _interactivity_ to your notebook. It's a simple concept - it uses the same reactivity that you have when editing code, except now you use sliders and buttons, instead of editing code. + +This notebook showcases some features of [`PlutoUI.jl`](), which allows you to easily add interactivity to your notebooks. This notebook is from [Pluto featured notebooks](https://featured.plutojl.org/), make sure to also check the others to learn more cool Pluto tricks! +""" + +# ╔═║ 051f31fc-cc63-11ea-1e2c-0704285ea6a9 +md""" +#### To use it in other notebooks +Simply import the `PlutoUI` package, and Pluto's built-in package manager takes care of the rest! +""" + +# ╔═║ deadce6b-4abc-42b0-9997-07be8637ee94 +TableOfContents() # This is all you need to get a nice table of content + +# ╔═║ fddb794c-c75c-11ea-1f55-eb9c178424cd +md""" +# Basics +""" + +# ╔═║ b819e9a8-c760-11ea-11ee-dd01da663b5c +md"## Slider" + +# ╔═║ 34ebf81e-c760-11ea-05bb-376173e7ed10 +@bind x Slider(5:15) + +# ╔═║ a4488984-c760-11ea-2930-871f6b400ef5 +x + +# ╔═║ 1048d1e0-cc50-11ea-1bf3-d76cae42740a + + +# ╔═║ a709fd2e-c760-11ea-05c5-7bf673990de1 +md"The first argument is a `Vector` or range. You can set the _default value_ using a keyword argument:" + +# ╔═║ d3811ac2-c760-11ea-0811-131d9f1d3910 +@bind y Slider(20:0.1:30, default=25) + +# ╔═║ dfe10b6c-c760-11ea-2f77-79cc4cfa8dc4 +y + +# ╔═║ 06962cde-cc4f-11ea-0d96-69a8cb7eeda2 + + +# ╔═║ 6605d010-d0d1-4cc8-a34d-3158b8572b5d +md""" +## Scrubbable + +`Scrubbable` makes a number interactive, you can **click and drag** its value left or right. + +Try it in the text below: +""" + +# ╔═║ 756e2c82-6e2f-4d7b-a1ed-5de97be04269 +md""" +_If Alice has $(@bind a Scrubbable(20)) apples, +and she gives $(@bind b Scrubbable(3)) apples to Bob..._ +""" + +# ╔═║ c07c5a9e-61f9-4247-86e7-7c3f9956d0ff +md""" +_...then Alice has **$(a - b)** apples left._ +""" + +# ╔═║ c3fea1b2-fc11-4c19-9c01-a8e03fda2817 +md""" +Use the Live Docs to learn more about `Scrubbable`! +""" + +# ╔═║ 221c308e-3cbe-4689-aa67-8970957f8cb0 + + +# ╔═║ e49623ac-c760-11ea-3689-c15f2e2f6081 +md"## NumberField + +A `NumberField` can be used just like a `Slider`, it just looks different:" + +# ╔═║ 314cb85a-c761-11ea-1cba-b73f84a52be8 +@bind x_different NumberField(0:100, default=20) + +# ╔═║ 104b55ce-cc4f-11ea-1273-092a1717e399 + + +# ╔═║ 4513b730-c761-11ea-1460-2dca56081fcf +md"## CheckBox" + +# ╔═║ 4f8e4e1e-c761-11ea-1787-419cab59bb12 +@bind z CheckBox() + +# ╔═║ b787ead6-c761-11ea-3b17-41c0a5434f9b +z + +# ╔═║ 177e6bf0-cc50-11ea-0de2-e77544f5c615 + + +# ╔═║ b08c347e-c761-11ea-1b61-7b69631d078b +md"Default value:" + +# ╔═║ b53c8ffa-c761-11ea-38d1-2d4ad96a7bee +@bind having_fun CheckBox(default=true) + +# ╔═║ adcf4e68-c761-11ea-00bb-c3b15c6dedc0 +having_fun + +# ╔═║ 1a562ad4-cc50-11ea-2485-cdec6e1a78dc + + +# ╔═║ 5d420570-c764-11ea-396b-cf0db01d34aa +having_fun ? md"🎈🎈" : md"β˜•" + +# ╔═║ 09393bf2-cc4f-11ea-1e48-cfbedab8e6b4 + + +# ╔═║ cd1b5872-c761-11ea-2179-57a3cb34d235 +md"## TextField" + +# ╔═║ d9e85ed0-c761-11ea-30bf-83ce272526e0 +@bind s TextField() + +# ╔═║ e4c262d6-c761-11ea-36b2-055419bfc981 +s + +# ╔═║ 0934bc0c-cc50-11ea-0da8-0d6b2f275399 + + +# ╔═║ e690337c-c761-11ea-08be-ade40a464eb4 +md"With a default value:" + +# ╔═║ f1f83980-c761-11ea-1e34-97c0ffca3f67 +@bind sentence TextField(default="te dansen omdat men leeft") + +# ╔═║ f985c8de-c761-11ea-126c-1fd79d547b79 +sentence + +# ╔═║ 1cbfd28e-cc50-11ea-2c90-a7807e4979ef + + +# ╔═║ 0136af80-c762-11ea-2f1a-9dccff334a11 +md"You can also create a **multi-line** text box!" + +# ╔═║ 0e6f0508-c762-11ea-0352-09bd694a9b35 +@bind poem TextField((30, 3), "Je opent en sluit je armen,\nMaar houdt niets vast.\nHet is net zwemmen") + +# (poem by: Sanne de Kroon) + +# ╔═║ 3dcd7002-c765-11ea-323d-a1fb49409011 +split(poem, "\n") + +# ╔═║ 0aa3c85e-cc4f-11ea-2fba-4bdd513d9217 + + +# ╔═║ 5833f7f4-c763-11ea-0b95-9b21a40192a9 +md"## Select" + +# ╔═║ 690cf3ac-c763-11ea-10f0-b3e28c380be9 +@bind vegetable Select(["potato", "carrot"]) + +# ╔═║ 705662e2-c763-11ea-2f6d-cdaffc1fc73a +vegetable + +# ╔═║ 1feebd8f-667a-42fd-965d-5e3167ff7c7a +@bind favourite_function Select([sin, cos, tan, sqrt]) + +# ╔═║ 9128d2c1-364c-4446-baaa-6d0593edda47 +favourite_function(2) + +# ╔═║ 3930f0d8-cc50-11ea-3de6-d91ac5c6cd9f + + +# ╔═║ 787a2c88-c763-11ea-0a32-bb91ca60113d +md"Instead of an array of values, you can also give an array of **pairs**, where the first item is the bound value, and the second item is displayed. " + +# ╔═║ ac8c4dee-c763-11ea-1b2d-c590a2d50d7e +@bind fruit Select(["apple" => "🍎", "melon" => "πŸ‰"]) + +# ╔═║ dcda9ad2-c763-11ea-3ec6-093b823ba66d +fruit + +# ╔═║ 0c3ab1f8-cc4f-11ea-0cfb-8f076d2c9836 + + +# ╔═║ 62c6f866-f0fe-11ea-0961-319f28d040d4 +md""" +## MultiSelect + +This widget allows the user to select multiple element by holding `Ctrl` / `Cmd` while clicking a more items. +""" + +# ╔═║ a01c8096-f0fe-11ea-3e78-ad8551e84fa1 +@bind vegetable_basket MultiSelect(["potato", "carrot", "boerenkool"]) + +# ╔═║ a20e30f2-f0fe-11ea-0ca7-c5195c9eb24a +vegetable_basket + +# ╔═║ c819ef3e-f0fe-11ea-1213-9df7597e4e89 +md"Just like `Select`, you can also give an array of pairs." + +# ╔═║ b104ba6d-0293-4378-9652-f628f1d08d97 +md""" +## MultiCheckBox + +This widget allows the user to select multiple elements using checkboxes. +""" + +# ╔═║ 16f2218d-f1bc-4b34-a355-53acfa77fbf5 +@bind fruit_basket MultiCheckBox(["apple", "blueberry", "mango"]) + +# ╔═║ 2c7811cb-d9ea-470c-8cb7-2b3803489f3f +fruit_basket + +# ╔═║ 78be41d1-7dda-4bec-b75f-fbcf8b7594a7 +md""" +You can use `MultiSelect` and `MultiCheckBox` with any vector of objects, not just strings: +""" + +# ╔═║ 90d84f1b-042c-444e-8bac-fe358b6d68a1 +@bind my_functions MultiCheckBox([sin, cos, tan]) + +# ╔═║ b97cfb04-0c39-4709-9419-9294e677a872 +[f(Ο€) for f in my_functions] + +# ╔═║ 283d1177-c605-4652-905b-9a70354cf878 +md"Just like `Select`, you can also give an array of pairs. See the Live Docs for `MultiCheckBox` for all the customization options!" + +# ╔═║ 0b1ce22e-c764-11ea-3d60-e799d58aee30 +md"## Button" + +# ╔═║ 6d9108a8-c765-11ea-0a38-09a1364998b1 +@bind clicked Button("Hello world") + +# ╔═║ 7a14e496-c765-11ea-20a1-6fb960009251 +clicked + +# ╔═║ 3eff932a-cc50-11ea-366e-812d3854dd4c + + +# ╔═║ 7e10fb52-c765-11ea-2a71-0fc347d09885 +md""" +### Button as reactive trigger + +In the example above, _any cell that references `clicked` will re-evaluate_ when you click the button. This means that you can a button as a **reactive trigger**, by referencing its value in another cell. +""" + +# ╔═║ b91764e8-c765-11ea-27a2-4ba5777fbd89 +@bind go Button("Recompute") + +# ╔═║ bb356b12-c765-11ea-2c36-697f4314bb93 +let + go + + md"I am $(rand(1:15)) years old!" +end + +# ╔═║ 9276da28-cc4f-11ea-17b3-65eec41a181e + + +# ╔═║ 92def54a-cc4f-11ea-12c5-652f2bb46413 +md"## FilePicker" + +# ╔═║ 9920e56c-cc4f-11ea-2d5e-f5371c79f048 +@bind important_document FilePicker() + +# ╔═║ 44591b34-cc50-11ea-2005-2f7075e6f2db +important_document + +# ╔═║ 4fda3072-cc50-11ea-2804-197b6391b269 +md"The file picker is useful if you want to show off your notebook on a dataset or image **uploaded by the reader**. It will work anywhere - you don't access files using their path. + +The caveat is that large files might take a long time to get processed: everything needs to pass through the browser. If you are using large datasets, a better option is to use `Select` to let the reader pick a filename. You can then read the file using `Base.read(filename, type)`" + +# ╔═║ 3e5dd7d2-c760-11ea-1dca-6d8720b3558d +md"# Extras" + +# ╔═║ f31668c6-c768-11ea-1501-5f41afa7c83b +md"## Clock" + +# ╔═║ 417390ba-c760-11ea-27df-5908858ae88c +@bind t Clock() + +# ╔═║ 49e7cd06-c760-11ea-3f5d-2741d94278a6 +t + +# ╔═║ 31a2f3c4-cc51-11ea-3652-bd814517a4b5 + + +# ╔═║ 67709812-c760-11ea-2bda-9756ead35749 +md"You can set the interval (`5.0` seconds), and disable the UI (`true`):" + +# ╔═║ 4c2b45a0-c760-11ea-2b64-3fefc820cd5b +@bind t_slow Clock(5.0, true) + +# ╔═║ 5be148cc-c760-11ea-0819-a7bb403d27ff +t_slow + +# ╔═║ 347e3d06-cc51-11ea-012c-43e824eaffa2 + + +# ╔═║ 343d7118-cc51-11ea-387a-fb22d8c73506 +md"You can use a `Clock` to drive an animation! Or use it to repeat the same command at an interval: just like with `Button`, you can reference a bound (reactive) variable without actually using it!" + +# ╔═║ 32e41ac2-cc51-11ea-3358-bbead9c68123 + + +# ╔═║ f74f434a-c768-11ea-079c-fb707e6ba17b +md"## DownloadButton" + +# ╔═║ ea00721c-cc4b-11ea-1e82-0b3dbe6a7f1e +md""" +The download button is **not an input** element that you can `@bind` to, it's an **output** that you can use to get processed data from your notebook easily. The second argument is the _output filename_. +""" + +# ╔═║ fc12280c-c768-11ea-3ebc-ebcd6b3459c1 +DownloadButton(poem, "poem.txt") + +# ╔═║ 067cbcde-cc4c-11ea-3eed-972dc6d7bb3b +DownloadButton([0x01, 0x02, 0x03], "secret_data.bin") + +# ╔═║ 7da30d97-b28a-4eb9-a2ef-fad599b549d1 +md""" +# High-level inputs +""" + +# ╔═║ 170089cd-f366-4c0a-b58d-fe6e36049db7 +md""" +## Confirm + +Normally, when you move a [`Slider`](@ref) or type in a [`TextField`](@ref), all intermediate values are sent back to `@bind`. By wrapping an input element in `confirm`, you get a button to manually **control when the value is sent**, intermediate updates are hidden from Pluto. + +""" + +# ╔═║ b29215cb-8e7e-4382-822c-cdaa4c473ba1 +@bind distance confirm(Slider(1:100)) + +# ╔═║ 00f9f608-85bd-4932-b585-39f74dcf53b4 +distance + +# ╔═║ 48a9ffbd-cac7-4c4e-85e5-c3d0693e5550 +md""" +`confirm` can be wrapper around any input element to create a new one, including inputs from other packages, or inputs that you have made yourself! +""" + +# ╔═║ 5c85ee41-da68-4f5f-b45e-e1de7996747d + + +# ╔═║ 8c51343f-cb35-4ff9-9fd8-642ffab57e22 +md""" +## Combine + +This next high-level component is a bit tricky, but very powerful! + +Using `combine`, you can create a single input out of multiple existing ones! In the example below, we **create a new input, `wind_speed_input`**. Notice that the list of wind directions is *dynamic*: if you add a new direction, a 5th slider will appear! + +""" + +# ╔═║ 621f2e82-5ab4-4ab9-a0ff-fb1cc1b41295 +import PlutoUI: combine + +# ╔═║ a4837897-caae-447a-8db9-7775e7a4d0c8 + + +# ╔═║ d278189e-6a5b-428a-8c81-ce3d206b042c +function wind_speed_input(directions::Vector) + + return combine() do Child + + inputs = [ + md""" $(name): $( + Child(name, Slider(1:100)) + )""" + + for name in directions + ] + + md""" + #### Wind speeds + $(inputs) + """ + end +end + +# ╔═║ f5c421cc-dbdb-459a-9bb4-d648507a87d2 +@bind speeds wind_speed_input(["North", "East", "South", "West"]) + +# ╔═║ a4eac824-ba87-473a-b39a-783c4de3f933 +speeds + +# ╔═║ f9052ed8-84cc-4cca-abb2-9363aafc6040 +speeds.North + +# ╔═║ 4ca9c749-08ee-467f-af2c-9b2f13199d72 +md""" +Use the Live Docs to learn more about `combine` and to see additional examples. + +> πŸ™‹ `combine` is very useful in combination with [HypertextLiteral.jl](https://github.com/MechanicalRabbit/HypertextLiteral.jl), which you can learn using our JavaScript sample notebook. +""" + +# ╔═║ ad8e9b30-c75d-11ea-1fd0-0b53592135bf +md"""# Loading resources + +Notebooks use data from different places. For example, you use [`Base.read`](https://docs.julialang.org/en/v1/base/io-network/#:~:text=read(filename%3A%3AAbstractString%2C%20String)) to access local data (files) inside your Julia code, and [`Downloads.jl`](https://github.com/JuliaLang/Downloads.jl) for remote data (interwebs). + +`PlutoUI` helps you communicate with the person reading the notebook! +- To get **remote media** (URL) inside your **Markdown text**, use `PlutoUI.Resource`. +- To get **local media** (file) inside your **Markdown text**, use `PlutoUI.LocalResource`. + +(With _media_, we mean **images**, video and audio.) + +> We **strongly recommend** that you use _remote_ media inside Pluto notebooks! +> +> If your notebook uses local images, then those images **will not show** when someone else opens your notebook, unless they have the same images on their computer, at the exact same location. _More on this later._ + +""" + +# ╔═║ 87d088d0-cc54-11ea-02c6-bd673b95b9d3 +md"""## Resource + +If you just want to show **images inside Markdown**, you can use the built-in syntax (without `PlutoUI`): + +``` +md"Here is a _dog_: ![](https://fonsp.com/img/doggoSmall.jpg)" +``` + +`PlutoUI.Resource` has some extra features: +- specify **image dimensions** and spacing +- support for videos +- support for audio""" + +# ╔═║ 6a7e7e54-c75e-11ea-2ea7-ed3da37e9e96 +dog_url = "https://upload.wikimedia.org/wikipedia/commons/thumb/1/15/Welsh_Springer_Spaniel.jpg/640px-Welsh_Springer_Spaniel.jpg" + +# ╔═║ 3c68b25c-c761-11ea-226a-4f46579a6732 +Resource(dog_url, :width => x * x_different) + +# ╔═║ 9ac7921c-c75e-11ea-30f5-c35e6ee370cb +t_rex_url = "https://upload.wikimedia.org/wikipedia/commons/transcoded/6/62/Meow.ogg/Meow.ogg.mp3" + +# ╔═║ a8c57442-c75e-11ea-1913-7d82cbd2c69c +flower_url = "https://upload.wikimedia.org/wikipedia/commons/4/41/Sunflower_Flower_Opening_Time_Lapse.ogv" + +# ╔═║ cb37b916-c75b-11ea-0c83-6ba759536075 +md"""Hello I am a dog $(Resource(dog_url))""" + +# ╔═║ 16ea31fc-c75e-11ea-0f2d-dd790a56b2dc +md"""And I sound like this: $(Resource(t_rex_url))""" + +# ╔═║ 1dfd8cc6-c75e-11ea-3c04-a96734779c97 +md"""This is my flower friend + +$(Resource(flower_url, :width => 200))""" + +# ╔═║ 2fda30ea-c75e-11ea-2ff5-7f2dcf4f9b66 +md"### Attributes + +You can pass additional _HTML attributes_ to `Resource`, these will be added to the element. For example:" + +# ╔═║ 525ceea0-c75e-11ea-2766-f72418fd784e +md""" +$(Resource(dog_url, :width => 20)) +$(Resource(dog_url, :width => 50)) +$(Resource(dog_url, :width => 100)) +$(Resource(dog_url, + :width => 100, + :style => "filter: grayscale(100%); border: 3px solid black;")) +""" + +# ╔═║ 382d41d8-c75e-11ea-2ae3-2ffe96e04b5a +Resource(flower_url, :width => 200, :autoplay => "", :loop => "") + +# ╔═║ 958ab19c-cc56-11ea-162e-d3664e66ff66 +md"### YouTube, Vimeo, etc. + +If you use `Resource` for video, the URL has to point to a _video file_ (like `.mp4` or `.mov`). + +Popular video sites don't give you that link, instead, you can use their **embed codes**. You can find these inside the video player, by right clicking or using the menu buttons. You then use that inside an HTML block: +``` +html\"\"\" +~ paste embed code here ~ +\"\"\" +``` + +You might need to change the `width` to `100%` to make it fit." + +# ╔═║ 8477619c-cc57-11ea-0618-1778c502d28f +html""" + +
    + +""" + +# ╔═║ f743076c-cc57-11ea-1a8e-8799d9db985a + + +# ╔═║ c65d28a2-c75d-11ea-2e13-7332f93d9c5e +md"## LocalResource _(not recommended)_ + +The examples above use `Resource` to make media from a URL available inside Markdown. To use **local files**, simply **replace `Resource` with `LocalResource`**, and use a _file path_ instead of a URL." + +# ╔═║ c16dff74-cc5d-11ea-380c-aff1639b5551 + + +# ╔═║ dada2154-c75d-11ea-2312-b9156a9a531e +html"I really hope that this works" + +# ╔═║ f809110c-cc55-11ea-1551-e138c28d5d82 +md"""Hello I am a dog $(LocalResource("C:\\Users\\fons\\Pictures\\hannes.jpg"))""" + +# ╔═║ 1c930364-cc58-11ea-36c8-0ddf7c4700cd +md""" $(html"OOPS"), it didn't! + +$(html"
    ") + +Here are **two tips** for getting local images to work correctly: + +1. Go to [imgur.com](https://imgur.com) and drag&drop the image to the page. Right click on the image, and select "Copy image location". You can now use the image like so: + + ```PlutoUI.Resource("https://i.imgur.com/SAzsMMA.jpg")``` + + +2. If your notebook is part of a git repository, place the image in the repository and use a relative path: + + ```PlutoUI.LocalResource("../images/cat.jpg")``` + + +""" + +# ╔═║ c48b48f6-cc5d-11ea-0f3b-d3481238625d + + +# ╔═║ ea6ade22-cc5a-11ea-1782-97f2464fd148 +md"#### Why does it have to be so difficult? + +Pluto only stores _code_ in the notebook file, not images. This minimal file format is very valuable, but it means that images need to be _addressed_, not stored. + +Addressing _local files_ is fragile: if someone else opens the notebook, or if you move the notebook to a different folder, that image file needs to be available at exactly the same path. This is difficult to do correctly, and if it works for you, it is hard to tell if it will work for someone else. + +Putting images online might be a hassle, but once it works, it will work everywhere! The stateless nature of URLs means that the images will work regardless of how the notebook file is accessed, while keeping a minimal file format." + +# ╔═║ a245dddc-cc59-11ea-3e1d-1763673ff706 +md"# PlutoUI without Pluto + +Huh? + +Did you know that you can run Pluto notebooks _without Pluto_? If your notebook is called `wow.jl`, then +```sh +$ julia wow.jl +``` +will run the notebook just fine. + +When you use `@bind`, your notebook can still run without Pluto! Sort of. Normally, all bound variables are assigned the value `missing` when you run it elsewhere. However, the `PlutoUI` types have all been configured to assign a more sensible default value. + +For example, if your notebook contains +```julia +@bind x Slider(10:20) +``` +and you run it without Pluto, then this statement simply assigns `x = 10`. +" + +# ╔═║ 0cda8986-cc64-11ea-2acc-b5c38fdf17e5 + + +# ╔═║ 0da7bc30-cc64-11ea-1dde-2b7f2dd76036 +md"`Pluto` and `PlutoUI` work independently of each other! In fact, _you_ could write a package with fun input elements, or add `@bind`able values to existing packages." + +# ╔═║ 512fe760-cc4c-11ea-1c5b-2b32da035aad +md"# Appendix" + +# ╔═║ 55bcdbf8-cc4c-11ea-1549-87c076a59ff4 +space = html"


    " + +# ╔═║ ebfc61b0-c765-11ea-1d66-cbf1dcdb8bdb +space + +# ╔═║ f69a5d5e-c765-11ea-3fa0-230c6c619730 +space + +# ╔═║ 0b66c781-ecf2-445e-b2aa-82cb13371e46 +space + +# ╔═║ 35523932-cc4f-11ea-0908-2d51c57176b7 +space + +# ╔═║ d163f434-cc5a-11ea-19e9-9319ba994efa +space + +# ╔═║ 00000000-0000-0000-0000-000000000001 +PLUTO_PROJECT_TOML_CONTENTS = """ +[deps] +PlutoUI = "7f904dfe-b85e-4ff6-b463-dae2292396a8" + +[compat] +PlutoUI = "~0.7.50" +""" + +# ╔═║ 00000000-0000-0000-0000-000000000002 +PLUTO_MANIFEST_TOML_CONTENTS = """ +# This file is machine-generated - editing it directly is not advised + +[[AbstractPlutoDingetjes]] +deps = ["Pkg"] +git-tree-sha1 = "8eaf9f1b4921132a4cff3f36a1d9ba923b14a481" +uuid = "6e696c72-6542-2067-7265-42206c756150" +version = "1.1.4" + +[[ArgTools]] +uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" +version = "1.1.1" + +[[Artifacts]] +uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" + +[[Base64]] +uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" + +[[ColorTypes]] +deps = ["FixedPointNumbers", "Random"] +git-tree-sha1 = "eb7f0f8307f71fac7c606984ea5fb2817275d6e4" +uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f" +version = "0.11.4" + +[[CompilerSupportLibraries_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" +version = "1.0.2+0" + +[[Dates]] +deps = ["Printf"] +uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" + +[[Downloads]] +deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] +uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" +version = "1.6.0" + +[[FileWatching]] +uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" + +[[FixedPointNumbers]] +deps = ["Statistics"] +git-tree-sha1 = "335bfdceacc84c5cdf16aadc768aa5ddfc5383cc" +uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" +version = "0.8.4" + +[[Hyperscript]] +deps = ["Test"] +git-tree-sha1 = "8d511d5b81240fc8e6802386302675bdf47737b9" +uuid = "47d2ed2b-36de-50cf-bf87-49c2cf4b8b91" +version = "0.0.4" + +[[HypertextLiteral]] +deps = ["Tricks"] +git-tree-sha1 = "c47c5fa4c5308f27ccaac35504858d8914e102f9" +uuid = "ac1192a8-f4b3-4bfe-ba22-af5b92cd3ab2" +version = "0.9.4" + +[[IOCapture]] +deps = ["Logging", "Random"] +git-tree-sha1 = "f7be53659ab06ddc986428d3a9dcc95f6fa6705a" +uuid = "b5f81e59-6552-4d32-b1f0-c071b021bf89" +version = "0.2.2" + +[[InteractiveUtils]] +deps = ["Markdown"] +uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" + +[[JSON]] +deps = ["Dates", "Mmap", "Parsers", "Unicode"] +git-tree-sha1 = "3c837543ddb02250ef42f4738347454f95079d4e" +uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" +version = "0.21.3" + +[[LibCURL]] +deps = ["LibCURL_jll", "MozillaCACerts_jll"] +uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" +version = "0.6.3" + +[[LibCURL_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] +uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" +version = "7.84.0+0" + +[[LibGit2]] +deps = ["Base64", "NetworkOptions", "Printf", "SHA"] +uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" + +[[LibSSH2_jll]] +deps = ["Artifacts", "Libdl", "MbedTLS_jll"] +uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" +version = "1.10.2+0" + +[[Libdl]] +uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" + +[[LinearAlgebra]] +deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"] +uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + +[[Logging]] +uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" + +[[MIMEs]] +git-tree-sha1 = "65f28ad4b594aebe22157d6fac869786a255b7eb" +uuid = "6c6e2e6c-3030-632d-7369-2d6c69616d65" +version = "0.1.4" + +[[Markdown]] +deps = ["Base64"] +uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" + +[[MbedTLS_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" +version = "2.28.2+0" + +[[Mmap]] +uuid = "a63ad114-7e13-5084-954f-fe012c677804" + +[[MozillaCACerts_jll]] +uuid = "14a3606d-f60d-562e-9121-12d972cd8159" +version = "2022.10.11" + +[[NetworkOptions]] +uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" +version = "1.2.0" + +[[OpenBLAS_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] +uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" +version = "0.3.21+4" + +[[Parsers]] +deps = ["Dates", "SnoopPrecompile"] +git-tree-sha1 = "478ac6c952fddd4399e71d4779797c538d0ff2bf" +uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" +version = "2.5.8" + +[[Pkg]] +deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] +uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" +version = "1.9.0" + +[[PlutoUI]] +deps = ["AbstractPlutoDingetjes", "Base64", "ColorTypes", "Dates", "FixedPointNumbers", "Hyperscript", "HypertextLiteral", "IOCapture", "InteractiveUtils", "JSON", "Logging", "MIMEs", "Markdown", "Random", "Reexport", "URIs", "UUIDs"] +git-tree-sha1 = "5bb5129fdd62a2bbbe17c2756932259acf467386" +uuid = "7f904dfe-b85e-4ff6-b463-dae2292396a8" +version = "0.7.50" + +[[Preferences]] +deps = ["TOML"] +git-tree-sha1 = "47e5f437cc0e7ef2ce8406ce1e7e24d44915f88d" +uuid = "21216c6a-2e73-6563-6e65-726566657250" +version = "1.3.0" + +[[Printf]] +deps = ["Unicode"] +uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" + +[[REPL]] +deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] +uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" + +[[Random]] +deps = ["SHA", "Serialization"] +uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" + +[[Reexport]] +git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" +uuid = "189a3867-3050-52da-a836-e630ba90ab69" +version = "1.2.2" + +[[SHA]] +uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" +version = "0.7.0" + +[[Serialization]] +uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" + +[[SnoopPrecompile]] +deps = ["Preferences"] +git-tree-sha1 = "e760a70afdcd461cf01a575947738d359234665c" +uuid = "66db9d55-30c0-4569-8b51-7e840670fc0c" +version = "1.0.3" + +[[Sockets]] +uuid = "6462fe0b-24de-5631-8697-dd941f90decc" + +[[SparseArrays]] +deps = ["Libdl", "LinearAlgebra", "Random", "Serialization", "SuiteSparse_jll"] +uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + +[[Statistics]] +deps = ["LinearAlgebra", "SparseArrays"] +uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" +version = "1.9.0" + +[[SuiteSparse_jll]] +deps = ["Artifacts", "Libdl", "Pkg", "libblastrampoline_jll"] +uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c" +version = "5.10.1+6" + +[[TOML]] +deps = ["Dates"] +uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" +version = "1.0.3" + +[[Tar]] +deps = ["ArgTools", "SHA"] +uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" +version = "1.10.0" + +[[Test]] +deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] +uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[[Tricks]] +git-tree-sha1 = "aadb748be58b492045b4f56166b5188aa63ce549" +uuid = "410a4b4d-49e4-4fbc-ab6d-cb71b17b3775" +version = "0.1.7" + +[[URIs]] +git-tree-sha1 = "074f993b0ca030848b897beff716d93aca60f06a" +uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" +version = "1.4.2" + +[[UUIDs]] +deps = ["Random", "SHA"] +uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" + +[[Unicode]] +uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" + +[[Zlib_jll]] +deps = ["Libdl"] +uuid = "83775a58-1f1d-513f-b197-d71354ab007a" +version = "1.2.13+0" + +[[libblastrampoline_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" +version = "5.8.0+0" + +[[nghttp2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" +version = "1.48.0+0" + +[[p7zip_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" +version = "17.4.0+0" +""" + +# ╔═║ Cell order: +# β•Ÿβ”€bc532cd2-c75b-11ea-313f-8b5e771c9227 +# β•Ÿβ”€051f31fc-cc63-11ea-1e2c-0704285ea6a9 +# ╠═071d9ca5-9b42-4583-ad96-a48f93453a0e +# ╠═deadce6b-4abc-42b0-9997-07be8637ee94 +# β•Ÿβ”€fddb794c-c75c-11ea-1f55-eb9c178424cd +# β•Ÿβ”€b819e9a8-c760-11ea-11ee-dd01da663b5c +# ╠═34ebf81e-c760-11ea-05bb-376173e7ed10 +# ╠═a4488984-c760-11ea-2930-871f6b400ef5 +# β•Ÿβ”€1048d1e0-cc50-11ea-1bf3-d76cae42740a +# β•Ÿβ”€a709fd2e-c760-11ea-05c5-7bf673990de1 +# ╠═d3811ac2-c760-11ea-0811-131d9f1d3910 +# ╠═dfe10b6c-c760-11ea-2f77-79cc4cfa8dc4 +# β•Ÿβ”€06962cde-cc4f-11ea-0d96-69a8cb7eeda2 +# β•Ÿβ”€6605d010-d0d1-4cc8-a34d-3158b8572b5d +# ╠═756e2c82-6e2f-4d7b-a1ed-5de97be04269 +# ╠═c07c5a9e-61f9-4247-86e7-7c3f9956d0ff +# β•Ÿβ”€c3fea1b2-fc11-4c19-9c01-a8e03fda2817 +# β•Ÿβ”€221c308e-3cbe-4689-aa67-8970957f8cb0 +# β•Ÿβ”€e49623ac-c760-11ea-3689-c15f2e2f6081 +# ╠═314cb85a-c761-11ea-1cba-b73f84a52be8 +# β•Ÿβ”€3c68b25c-c761-11ea-226a-4f46579a6732 +# β•Ÿβ”€104b55ce-cc4f-11ea-1273-092a1717e399 +# β•Ÿβ”€4513b730-c761-11ea-1460-2dca56081fcf +# ╠═4f8e4e1e-c761-11ea-1787-419cab59bb12 +# β•Ÿβ”€b787ead6-c761-11ea-3b17-41c0a5434f9b +# β•Ÿβ”€177e6bf0-cc50-11ea-0de2-e77544f5c615 +# β•Ÿβ”€b08c347e-c761-11ea-1b61-7b69631d078b +# ╠═b53c8ffa-c761-11ea-38d1-2d4ad96a7bee +# β•Ÿβ”€adcf4e68-c761-11ea-00bb-c3b15c6dedc0 +# β•Ÿβ”€1a562ad4-cc50-11ea-2485-cdec6e1a78dc +# β•Ÿβ”€5d420570-c764-11ea-396b-cf0db01d34aa +# β•Ÿβ”€09393bf2-cc4f-11ea-1e48-cfbedab8e6b4 +# β•Ÿβ”€cd1b5872-c761-11ea-2179-57a3cb34d235 +# ╠═d9e85ed0-c761-11ea-30bf-83ce272526e0 +# ╠═e4c262d6-c761-11ea-36b2-055419bfc981 +# β•Ÿβ”€0934bc0c-cc50-11ea-0da8-0d6b2f275399 +# β•Ÿβ”€e690337c-c761-11ea-08be-ade40a464eb4 +# ╠═f1f83980-c761-11ea-1e34-97c0ffca3f67 +# β•Ÿβ”€f985c8de-c761-11ea-126c-1fd79d547b79 +# β•Ÿβ”€1cbfd28e-cc50-11ea-2c90-a7807e4979ef +# β•Ÿβ”€0136af80-c762-11ea-2f1a-9dccff334a11 +# ╠═0e6f0508-c762-11ea-0352-09bd694a9b35 +# ╠═3dcd7002-c765-11ea-323d-a1fb49409011 +# β•Ÿβ”€0aa3c85e-cc4f-11ea-2fba-4bdd513d9217 +# β•Ÿβ”€5833f7f4-c763-11ea-0b95-9b21a40192a9 +# ╠═690cf3ac-c763-11ea-10f0-b3e28c380be9 +# ╠═705662e2-c763-11ea-2f6d-cdaffc1fc73a +# ╠═1feebd8f-667a-42fd-965d-5e3167ff7c7a +# ╠═9128d2c1-364c-4446-baaa-6d0593edda47 +# β•Ÿβ”€3930f0d8-cc50-11ea-3de6-d91ac5c6cd9f +# β•Ÿβ”€787a2c88-c763-11ea-0a32-bb91ca60113d +# ╠═ac8c4dee-c763-11ea-1b2d-c590a2d50d7e +# ╠═dcda9ad2-c763-11ea-3ec6-093b823ba66d +# β•Ÿβ”€0c3ab1f8-cc4f-11ea-0cfb-8f076d2c9836 +# β•Ÿβ”€62c6f866-f0fe-11ea-0961-319f28d040d4 +# ╠═a01c8096-f0fe-11ea-3e78-ad8551e84fa1 +# ╠═a20e30f2-f0fe-11ea-0ca7-c5195c9eb24a +# β•Ÿβ”€c819ef3e-f0fe-11ea-1213-9df7597e4e89 +# β•Ÿβ”€b104ba6d-0293-4378-9652-f628f1d08d97 +# ╠═16f2218d-f1bc-4b34-a355-53acfa77fbf5 +# ╠═2c7811cb-d9ea-470c-8cb7-2b3803489f3f +# β•Ÿβ”€78be41d1-7dda-4bec-b75f-fbcf8b7594a7 +# ╠═90d84f1b-042c-444e-8bac-fe358b6d68a1 +# ╠═b97cfb04-0c39-4709-9419-9294e677a872 +# β•Ÿβ”€283d1177-c605-4652-905b-9a70354cf878 +# β•Ÿβ”€0b1ce22e-c764-11ea-3d60-e799d58aee30 +# ╠═6d9108a8-c765-11ea-0a38-09a1364998b1 +# ╠═7a14e496-c765-11ea-20a1-6fb960009251 +# β•Ÿβ”€3eff932a-cc50-11ea-366e-812d3854dd4c +# β•Ÿβ”€7e10fb52-c765-11ea-2a71-0fc347d09885 +# ╠═b91764e8-c765-11ea-27a2-4ba5777fbd89 +# ╠═bb356b12-c765-11ea-2c36-697f4314bb93 +# β•Ÿβ”€9276da28-cc4f-11ea-17b3-65eec41a181e +# β•Ÿβ”€92def54a-cc4f-11ea-12c5-652f2bb46413 +# ╠═9920e56c-cc4f-11ea-2d5e-f5371c79f048 +# ╠═44591b34-cc50-11ea-2005-2f7075e6f2db +# β•Ÿβ”€4fda3072-cc50-11ea-2804-197b6391b269 +# β•Ÿβ”€ebfc61b0-c765-11ea-1d66-cbf1dcdb8bdb +# β•Ÿβ”€3e5dd7d2-c760-11ea-1dca-6d8720b3558d +# β•Ÿβ”€f31668c6-c768-11ea-1501-5f41afa7c83b +# ╠═417390ba-c760-11ea-27df-5908858ae88c +# ╠═49e7cd06-c760-11ea-3f5d-2741d94278a6 +# β•Ÿβ”€31a2f3c4-cc51-11ea-3652-bd814517a4b5 +# β•Ÿβ”€67709812-c760-11ea-2bda-9756ead35749 +# ╠═4c2b45a0-c760-11ea-2b64-3fefc820cd5b +# ╠═5be148cc-c760-11ea-0819-a7bb403d27ff +# β•Ÿβ”€347e3d06-cc51-11ea-012c-43e824eaffa2 +# β•Ÿβ”€343d7118-cc51-11ea-387a-fb22d8c73506 +# β•Ÿβ”€32e41ac2-cc51-11ea-3358-bbead9c68123 +# β•Ÿβ”€f74f434a-c768-11ea-079c-fb707e6ba17b +# β•Ÿβ”€ea00721c-cc4b-11ea-1e82-0b3dbe6a7f1e +# ╠═fc12280c-c768-11ea-3ebc-ebcd6b3459c1 +# ╠═067cbcde-cc4c-11ea-3eed-972dc6d7bb3b +# β•Ÿβ”€f69a5d5e-c765-11ea-3fa0-230c6c619730 +# β•Ÿβ”€7da30d97-b28a-4eb9-a2ef-fad599b549d1 +# β•Ÿβ”€170089cd-f366-4c0a-b58d-fe6e36049db7 +# ╠═b29215cb-8e7e-4382-822c-cdaa4c473ba1 +# ╠═00f9f608-85bd-4932-b585-39f74dcf53b4 +# β•Ÿβ”€48a9ffbd-cac7-4c4e-85e5-c3d0693e5550 +# β•Ÿβ”€5c85ee41-da68-4f5f-b45e-e1de7996747d +# β•Ÿβ”€8c51343f-cb35-4ff9-9fd8-642ffab57e22 +# ╠═621f2e82-5ab4-4ab9-a0ff-fb1cc1b41295 +# β•Ÿβ”€a4837897-caae-447a-8db9-7775e7a4d0c8 +# ╠═f5c421cc-dbdb-459a-9bb4-d648507a87d2 +# ╠═a4eac824-ba87-473a-b39a-783c4de3f933 +# ╠═f9052ed8-84cc-4cca-abb2-9363aafc6040 +# ╠═d278189e-6a5b-428a-8c81-ce3d206b042c +# β•Ÿβ”€4ca9c749-08ee-467f-af2c-9b2f13199d72 +# β•Ÿβ”€0b66c781-ecf2-445e-b2aa-82cb13371e46 +# β•Ÿβ”€ad8e9b30-c75d-11ea-1fd0-0b53592135bf +# β•Ÿβ”€87d088d0-cc54-11ea-02c6-bd673b95b9d3 +# β•Ÿβ”€6a7e7e54-c75e-11ea-2ea7-ed3da37e9e96 +# β•Ÿβ”€9ac7921c-c75e-11ea-30f5-c35e6ee370cb +# β•Ÿβ”€a8c57442-c75e-11ea-1913-7d82cbd2c69c +# ╠═cb37b916-c75b-11ea-0c83-6ba759536075 +# ╠═16ea31fc-c75e-11ea-0f2d-dd790a56b2dc +# ╠═1dfd8cc6-c75e-11ea-3c04-a96734779c97 +# β•Ÿβ”€2fda30ea-c75e-11ea-2ff5-7f2dcf4f9b66 +# ╠═525ceea0-c75e-11ea-2766-f72418fd784e +# ╠═382d41d8-c75e-11ea-2ae3-2ffe96e04b5a +# β•Ÿβ”€958ab19c-cc56-11ea-162e-d3664e66ff66 +# ╠═8477619c-cc57-11ea-0618-1778c502d28f +# β•Ÿβ”€f743076c-cc57-11ea-1a8e-8799d9db985a +# β•Ÿβ”€c65d28a2-c75d-11ea-2e13-7332f93d9c5e +# β•Ÿβ”€c16dff74-cc5d-11ea-380c-aff1639b5551 +# β•Ÿβ”€dada2154-c75d-11ea-2312-b9156a9a531e +# ╠═f809110c-cc55-11ea-1551-e138c28d5d82 +# β•Ÿβ”€1c930364-cc58-11ea-36c8-0ddf7c4700cd +# β•Ÿβ”€c48b48f6-cc5d-11ea-0f3b-d3481238625d +# β•Ÿβ”€ea6ade22-cc5a-11ea-1782-97f2464fd148 +# β•Ÿβ”€35523932-cc4f-11ea-0908-2d51c57176b7 +# β•Ÿβ”€a245dddc-cc59-11ea-3e1d-1763673ff706 +# β•Ÿβ”€0cda8986-cc64-11ea-2acc-b5c38fdf17e5 +# β•Ÿβ”€0da7bc30-cc64-11ea-1dde-2b7f2dd76036 +# β•Ÿβ”€d163f434-cc5a-11ea-19e9-9319ba994efa +# β•Ÿβ”€512fe760-cc4c-11ea-1c5b-2b32da035aad +# ╠═55bcdbf8-cc4c-11ea-1549-87c076a59ff4 +# β•Ÿβ”€00000000-0000-0000-0000-000000000001 +# β•Ÿβ”€00000000-0000-0000-0000-000000000002 diff --git a/src/mod3_publish_website/deploy_static.md b/src/mod3_publish_website/deploy_static.md new file mode 100644 index 00000000..dd26dfa5 --- /dev/null +++ b/src/mod3_publish_website/deploy_static.md @@ -0,0 +1,34 @@ +--- +title: "Deploy your website as static" +order: 1 +chapter: 3 +section: 1 +layout: "md.jlmd" +tags: ["module3", "track_setup", "deploy", "netlify", "github actions", "github pages"] +--- + + +## Deploying with github pages + +Deploying your website as static page with github pages is a breeze. + +Whenever you push to main, the website will be deployed to a branch called `gh-pages`. All you need to do is go to your repository and from `Settings > Pages` choose to deploy from `gh-pages` branch, as the following picture shows. + + +![](https://user-images.githubusercontent.com/49938764/249790280-d9c46b7f-eecd-42aa-8e51-ce44dfdfce58.png) + +After that, the website will be available at + +``` +https://yourusername.github.io/your-repository-name +``` + +Note that this is a **static** webpage, so sliders will not work. Students will still be able to play with interactivity by downloading the notebook or running it on binder. + +If you want interactivity to work on the webpage, you can either + +1. [Precompute the notebooks outputs](https://juliapluto.github.io/computational-thinking-template/mod3_publish_website/precompute_output/) (experimental) + +or + +2. [Run your own server](https://juliapluto.github.io/computational-thinking-template/mod3_publish_website/setup_server/) \ No newline at end of file diff --git a/src/mod3_publish_website/precompute_output.md b/src/mod3_publish_website/precompute_output.md new file mode 100644 index 00000000..05291a41 --- /dev/null +++ b/src/mod3_publish_website/precompute_output.md @@ -0,0 +1,10 @@ +--- +title: "Precompute the pluto notebooks" +order: 2 +chapter: 3 +section: 2 +layout: "md.jlmd" +tags: ["module3", "track_setup", "track_julia", "deploy", "precompute", "Pluto", "PlutoSliderServer"] +--- + +COMING SOON \ No newline at end of file diff --git a/src/mod3_publish_website/setup_server.md b/src/mod3_publish_website/setup_server.md new file mode 100644 index 00000000..b9ec4126 --- /dev/null +++ b/src/mod3_publish_website/setup_server.md @@ -0,0 +1,11 @@ +--- +title: "Setup a server for your website" +order: 3 +chapter: 3 +section: 3 +layout: "md.jlmd" +tags: ["module3", "track_setup", "deploy", "server", "dynamic", "droplet"] +--- + +COMING SOON + diff --git a/src/netlify.toml b/src/netlify.toml new file mode 100644 index 00000000..44c32965 --- /dev/null +++ b/src/netlify.toml @@ -0,0 +1,4 @@ +[[headers]] + for = "/*" + [headers.values] + Access-Control-Allow-Origin = "*" diff --git a/src/welcome/installation.md b/src/welcome/installation.md index af7f6561..e39d3fcd 100644 --- a/src/welcome/installation.md +++ b/src/welcome/installation.md @@ -97,9 +97,9 @@ If nothing happens in the browser the first time, close Julia and try again. And ## Step 2a: Opening a notebook from the web -This is the main menu - here you can create new notebooks, or open existing ones. The exercise notebooks of this course are all available on this website. To start from one of them on the web, you can _paste the URL into the blue box_ and press ENTER. +This is the main menu - here you can create new notebooks, or open existing ones. Our homework assignments will always be based on a _template notebook_, available in this GitHub repository. To start from a template notebook on the web, you can _paste the URL into the blue box_ and press ENTER. -For example, the first exercise notebook is available [here](../../exercises/ode_model_mtk_intro/). Go to this page, and on the top right, click on the button that says "Edit or run this notebook". From these instructions, copy the notebook link, and paste it into the box. Press ENTER, and select OK in the confirmation box. +For example, homework 0 is available [here](/hw0/). Go to this page, and on the top right, click on the button that says "Edit or run this notebook". From these instructions, copy the notebook link, and paste it into the box. Press ENTER, and select OK in the confirmation box. ![image](https://user-images.githubusercontent.com/6933510/91441968-6b750100-e871-11ea-974e-3a6dfd80234a.png) diff --git a/website_maintenance.md b/website_maintenance.md index 62054ab8..4ffa2217 100644 --- a/website_maintenance.md +++ b/website_maintenance.md @@ -4,20 +4,18 @@ This document describes how the website works. # Overview -This is the source code for the ModSim course website. It uses a site generation system inspired by [https://www.11ty.dev/](https://www.11ty.dev/), but there are only three template systems: +This is the source code for the computational thinking website! It uses a site generation system inspired by [https://www.11ty.dev/](https://www.11ty.dev/), but there are only three template systems: - **`.jlhtml` files** are rendered by [HypertextLiteral.jl](https://github.com/JuliaPluto/HypertextLiteral.jl) -- **`.jlmd` and `.md` files** are rendered by [MarkdownLiteral.jl](https://github.com/JuliaPluto/MarkdownLiteral.jl) -- **`.jl` files** (Pluto notebooks) are rendered by [PlutoSliderServer.jl](https://github.com/JuliaPluto/PlutoSliderServer.jl) +- **`.jlmd` files** are rendered by [MarkdownLiteral.jl](https://github.com/JuliaPluto/MarkdownLiteral.jl) +- **`.jl` files** are rendered by [PlutoSliderServer.jl](https://github.com/JuliaPluto/PlutoSliderServer.jl) The `/src/` folder is scanned for files, and all files are turned into HTML pages. -Paths correspond to URLs. For example, `src/cheat_sheets/intro_to_julia.jl` will become available at `https://kermit-ugent.github.io/ModSim/cheat_sheets/intro_to_julia/`. For files called *"index"*, the URL will point to its parent, e.g. `src/index.jlmd` becomes `https://kermit-ugent.github.io/ModSim/`. Remember that changing URLs is very bad! You can't share this site with your friends if the links break. +Paths correspond to URLs. For example, `src/data_science/pca.jl` will become available at `https://kermit-ugent.github.io/ModSim/data_science/pca/`. For files called *"index"*, the URL will point to its parent, e.g. `src/docs/index.jlmd` becomes `https://kermit-ugent.github.io/ModSim/docs/`. Remember that changing URLs is very bad! You can't share this site with your friends if the links break. -Because the site is served under the `/ModSim/` prefix on GitHub Pages, use **relative links** between pages (e.g. `../intro_to_julia/`) rather than root-relative ones (`/cheat_sheets/intro_to_julia/`), which break under the prefix. +> **To add something to our website, just create a new file!** Fons will be happy to figure out the technical bits. -> **To add something to our website, just create a new file!** - -You can generate & preview the website locally (more on this later). The GitHub Action `.github/workflows/ExportNotebooks.yml` generates the website on every push to `main` and deploys the result to the `gh-pages` branch with GitHub Pages. Pull requests get a preview under `previews/PR` on the same branch. +You can generate & preview the website locally (more on this later), and we have a github action generating the website when we push to the `Fall23` branch. The result (in the `Fall23-output` branch) is deployed with GitHub Pages. # Content @@ -42,16 +40,6 @@ Visitors run the notebook themselves with the **"Edit or run this notebook"** bu Because nothing is executed, there is **no notebook output cache** anymore. Editing a notebook is picked up immediately β€” you never have to invalidate anything, and a full site build takes a few minutes instead of hours. -## Exercise notebooks (sync) - -The exercise pages under `src/exercises/` are **generated**, do not edit them by hand. - -1. Edit the notebooks in `exercises/student_notebooks/` (the single source of truth). -2. Run `julia notebook-checks/sync_exercises.jl` from the top level folder to regenerate `src/exercises/`. -3. Commit both `exercises/` and `src/exercises/`. - -CI runs `julia notebook-checks/sync_exercises.jl --check` and fails when `src/exercises/` is out of sync with `exercises/student_notebooks/`. - ## `.css`, `.html`, `.gif`, etc Web assets go through the system unchanged. @@ -75,8 +63,8 @@ here is how you do it Every page **should probably** include: - *`title`*: Will be used in the sidebar, on Google, in the window header, and on social media. - *`description`*: Will be used on hover, on Google, and on social media. -- *`tags`*: List of *tags* that are used to create collections out of pages. Our sidebar uses collections to know which pages to list. (more details in `src/_data/sidebar.jl`) -- *`layout`*: The name of a layout file in `src/_includes`. For basic Markdown or HTML, you probably want `md.jlmd`. For Pluto notebooks, you should use `layout.jlhtml`. The homepage uses `welcome.jlmd`. +- *`tags`*: List of *tags* that are used to create collections out of pages. Our sidebar uses collections to know which pages to list. (more details in `sidebar data.jl`) +- *`layout`*: The name of a layout file in `src/_includes`. For basic Markdown or HTML, you probably want `md.jlmd`. For Pluto, you should use `layout.jlhtml`. ## How to write front matter For `.jlmd` files, see the example above. @@ -91,9 +79,9 @@ For `.jlhtml`, we still need to figure something out πŸ˜„. Open this repository in VS Code, and install the recommended extensions. -To start running the development server, open the VS Code *command palette* (press `Cmd+Shift+P`), and search for **`Tasks: Run Task`**, then **`PlutoPages: run development server`** (this runs `julia develop.jl`). The first run can take some time, as it precompiles the packages in `pluto-deployment-environment`. Leave it running. +To start running the development server, open the VS Code *command palette* (press `Cmd+Shift+P`), and search for **`Tasks: Run Task`**, then **`PlutoPages: run development server`**. The first run can take some time, as it precompiles the packages in `pluto-deployment-environment`. Leave it running. -Use the same Julia version as the CI workflow (`1.12`, the version that `pluto-deployment-environment/Manifest.toml` was resolved with). With juliaup: `juliaup override set 1.12` inside this folder. +Use the same Julia version as the CI workflow (`1.11.2`, the version that `pluto-deployment-environment/Manifest.toml` was resolved with). With juliaup: `juliaup override set 1.11.2` inside this folder. This will start two things in parallel: the PlutoPages.jl notebook (which generates the website), and a static file server (with Deno_jll). It will open two tabs in your browser: one is the generation dashboard (PlutoPages), the other is the current site preview (Deno_jll). @@ -103,6 +91,7 @@ This workflow is recommended for writing static content, styles, and for site ma ## Developing PlutoPages itself + You need to manually run the notebook with Pluto: 1. Go to this folder, and run `julia --project=pluto-deployment-environment`. Then `import Pkg; Pkg.instantiate();`. 1. `import Pluto; Pluto.run()` and open the `PlutoPages.jl` notebook in this repository. The first run can take some time, as it precompiles packages. Leave it running. @@ -114,6 +103,6 @@ You need to manually run the notebook with Pluto: 3. Go to the URL printed to your terminal. 4. Whenever you edit a file, PlutoPages will automatically regenerate! Refresh your browser tab. If it does not pick up the change, go to the generation dashboard and click the "Read input files again" button. -# PlutoPages.jl +# PlutoPages.jl? -The site generator is a vendored copy of [PlutoPages.jl](https://github.com/JuliaPluto/PlutoPages.jl) (the `PlutoPages.jl` notebook in the top level folder); see that repository for its documentation and license. +The PlutoPages.jl is still in experimental stage, and I'm not sure if the Julia community is waiting for another SSG system. So right now it's sort of released in secret. If you use it, be sure to respect our LICENSE and be sure to share your feedback with fons@plutojl.org! Bug reports welcome.