diff --git a/Project.toml b/Project.toml
index 5e1d4dda..c151e857 100644
--- a/Project.toml
+++ b/Project.toml
@@ -1,6 +1,6 @@
name = "FMIFlux"
uuid = "fabad875-0d53-4e47-9446-963b74cae21f"
-version = "0.12.0"
+version = "0.12.1"
[deps]
Colors = "5ae59095-9a9b-59fe-a467-6f913c188581"
diff --git a/examples/pluto-src/HybridModelingUsingFMI/HybridModelingUsingFMI.jl b/examples/pluto-src/HybridModelingUsingFMI/HybridModelingUsingFMI.jl
index 673b080e..b4cfbee8 100644
--- a/examples/pluto-src/HybridModelingUsingFMI/HybridModelingUsingFMI.jl
+++ b/examples/pluto-src/HybridModelingUsingFMI/HybridModelingUsingFMI.jl
@@ -1,4093 +1,21 @@
### A Pluto.jl notebook ###
-# v0.19.38
+# 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
-
-# ╔═╡ a1ee798d-c57b-4cc3-9e19-fb607f3e1e43
-using PlutoUI # Notebook UI
-
-# ╔═╡ 72604eef-5951-4934-844d-d2eb7eb0292c
-using FMI # load and simulate FMUs
-
-# ╔═╡ 21104cd1-9fe8-45db-9c21-b733258ff155
-using FMIFlux # machine learning with FMUs
-
-# ╔═╡ 9d9e5139-d27e-48c8-a62e-33b2ae5b0086
-using FMIZoo # a collection of demo FMUs
-
-# ╔═╡ eaae989a-c9d2-48ca-9ef8-fd0dbff7bcca
-using FMIFlux.Flux # default Julia Machine Learning library
-
-# ╔═╡ 98c608d9-c60e-4eb6-b611-69d2ae7054c9
-using FMIFlux.DifferentialEquations # mighty (O)DE solver suite
-
-# ╔═╡ 45c4b9dd-0b04-43ae-a715-cd120c571424
-using Plots, PlotlyBase, PlotlyKaleido
-
# ╔═╡ 1470df0f-40e1-45d5-a4cc-519cc3b28fb8
md"""
-# Hands-on:$br Hybrid Modeling using FMI
+# Hands-on: Hybrid Modeling using FMI
Workshop @ MODPROD 2024 (Linköping University, Sweden)
-by Tobias Thummerer, Lars Mikelsons (University of Augsburg)
+by Tobias Thummerer (University of Augsburg)
*#hybridmodeling, #sciml, #neuralode, #neuralfmu, #penode*
-# Abstract
-If there is something YOU know about a physical system, AI shouldn’t need to learn it. How to integrate YOUR system knowledge into a ML development process is the core topic of this hands-on workshop. The entire workshop evolves around a challenging use case from robotics: Modeling a robot that is able to write arbitrary messages with a pen. After introducing the topic and the considered use case, participants can experiment with their very own hybrid model topology.
-
-# Introduction
-This workshop focuses on the integration of Functional Mock-Up Units (FMUs) into a machine learning topology. FMUs are simulation models that can be generated within a variety of modeling tools, see the [FMI homepage](https://fmi-standard.org/). Together with deep neural networks that complement and improve the FMU prediction, so called *NeuralFMUs* can be created.
-The workshop itself evolves around the hybrid modeling of a *Selective Compliance Assembly Robot Arm* (SCARA), that is able to write user defined words on a sheet of paper. A ready to use physical simulation model (FMU) for the SCARA is given and shortly highlighted in this workshop. However, this model – as any simulation model – shows some deviations if compared to measurements from the real system. These deviations results from unmodeled slip-stick-friction: The pen sticks to the paper until a force limit is reached, but then moves jerkily. A hard to model physical effect – but not for a NeuralFMU.
-
-More advanced code snippets are hidden by default and marked with a ghost `👻`. Computations, that are disabled for performance reasons, are marked with `ℹ️`. They offer a hint how to enable the idled computation, usually by enabling the corresponding checkbox.
-
-## Example Video
-If you haven't seen such a SCARA system yet, you can watch the following video. There are many more similar videos out there.
-"""
-
-# ╔═╡ 7d694be0-cd3f-46ae-96a3-49d07d7cf65a
-html"""
-
-"""
-
-# ╔═╡ 6fc16c34-c0c8-48ce-87b3-011a9a0f4e7c
-md"""
-This video is by *Alexandru Babaian* on YouTube.
-
-## Requirements
-To follow this workshop, you should ...
-- ... have a rough idea what the *Functional Mock-Up Interface* is and how the standard-conform models - the *Functional Mock-Up Units* - work. If not, a good source is the homepage of the standard, see the [FMI Homepage](https://fmi-standard.org/).
-- ... know the *Julia Programming Language* or at least have some programming skills in another high-level programming language like *Python* or *Matlab*. An introduction to Julia can be found on the [Julia Homepage](https://julialang.org/), but there are many more introductions in different formats available on the internet.
-- ... have an idea of how modeling (in terms of modeling ODE and DAE systems) and simulation (solving) of such models works.
-
-The technical requirements are:
-
-| | recommended | minimum |
-| ----- | ---- | ---- |
-| RAM | >= 16GB | 8GB |
-| OS | Windows | Windows / Linux |
-| Julia | 1.10 | 1.6 |
-
-This said, we can start "programming"! The entire notebook is pre-implemented, so you can use it without writing a single line of code. Users new to Julia can use interactive UI elements to interact, while more advance users can view and manipulate corresponding code. Let's go!
-"""
-
-# ╔═╡ 8a82d8c7-b781-4600-8780-0a0a003b676c
-md"""
-# Loading required Julia libraries
-Before starting with the actual coding, we load in the required Julia libraries.
-This Pluto-Notebook installs all required packages automatically.
-However, this will take some minutes when you start the notebook for the first time... it is recommended to not interact with the UI elements as long as the first compilation runs (orange status light in the bottom right corner).
-"""
-
-# ╔═╡ a02f77d1-00d2-46a3-91ba-8a7f5b4bbdc9
-md"""
-First, we load the Pluto UI elements:
-"""
-
-# ╔═╡ 02f0add7-9c4e-4358-8b5e-6863bae3ee75
-md"""
-Then, the three FMI-libraries we need for FMU loading, machine learning and the FMU itself:
-"""
-
-# ╔═╡ 85308992-04c4-4d20-a840-6220cab54680
-md"""
-Some additional libraries for machine learning and ODE solvers:
-"""
-
-# ╔═╡ 5cb505f7-01bd-4824-8876-3e0f5a922fb7
-md"""
-Load in the plotting library ...
-"""
-
-# ╔═╡ 1e9541b8-5394-418d-8c27-2831951c538d
-md"""
-... and use the beutiful `plotly` backend for interactive plots.
-"""
-
-# ╔═╡ bc077fdd-069b-41b0-b685-f9513d283346
-plotly()
-
-# ╔═╡ 44500f0a-1b89-44af-b135-39ce0fec5810
-md"""
-Next, we define some helper functions, that are not important to follow the workshop - they are hidden by default. However they are here, if you want to explore what it takes to write fully working code. If you do this workshop for the first time, it is recommended to skip the hidden part and directly go on.
-"""
-
-# ╔═╡ c88b0627-2e04-40ab-baa2-b4c1edfda0c3
-TableOfContents()
-
-# ╔═╡ 915e4601-12cc-4b7e-b2fe-574e116f3a92
-md"""
-# Loading Model (FMU) and Data
-We want to do hybrid modeling, so we need a simulation model and some data to work with. Fortunately, someone already prepared both for us. We start by loading some data from *FMIZoo.jl*, which is a collection of FMUs and corresponding data.
-"""
-
-# ╔═╡ f8e40baa-c1c5-424a-9780-718a42fd2b67
-md"""
-## Training Data
-First, we need some data to train our hybrid model on. We can load data for our SCARA (here called `RobotRR`) with the following line:
-"""
-
-# ╔═╡ 74289e0b-1292-41eb-b13b-a4a5763c72b0
-# load training data for the `RobotRR` from the FMIZoo
-data_train = FMIZoo.RobotRR(:train)
-
-# ╔═╡ 33223393-bfb9-4e9a-8ea6-a3ab6e2f22aa
-begin
-
-# define the prinintg messages used at different places in this notebook
-LIVE_RESULTS_MESSAGE = "ℹ️ Live Results are disabled to safe performance. Checkbox `Enable Live Results`."
-LIVE_TRAIN_MESSAGE = "ℹ️ Live Training is disabled to safe performance. Checkbox `Enable Live Training`."
-HIDDEN_CODE_MESSAGE = "👻 Hidden Code | You probably want to skip this code section on the first run."
-
-import FMI.FMIImport.FMICore: hasCurrentComponent, getCurrentComponent, FMU2Solution
-import Random
-
-function fmiSingleInstanceMode!(fmu::FMU2,
- mode::Bool,
- params=FMIZoo.getParameter(data_train, 0.0; friction=false),
- x0=FMIZoo.getState(data_train, 0.0))
-
- fmu.executionConfig = deepcopy(FMU2_EXECUTION_CONFIGURATION_NO_RESET)
-
- # for this model, state events are generated but don't need to be handled,
- # we can skip that to gain performance
- fmu.executionConfig.handleStateEvents = false
-
- if mode
- # switch to a more efficient execution configuration, allocate only a single FMU instance, see:
- # https://thummeto.github.io/FMI.jl/dev/features/#Execution-Configuration
- fmu.executionConfig.terminate = true
- fmu.executionConfig.instantiate = false
- fmu.executionConfig.reset = true
- fmu.executionConfig.setup = true
- fmu.executionConfig.freeInstance = false
- c, _ = FMIFlux.prepareSolveFMU(fmu, nothing, fmu.type, true, # instantiate
- false, # free
- true, # terminate
- true, # reset
- true, # setup
- params; x0=x0)
- else
- if !hasCurrentComponent(fmu)
- return nothing
- end
- c = getCurrentComponent(fmu)
- # switch back to the default execution configuration, allocate a new FMU instance for every run, see:
- # https://thummeto.github.io/FMI.jl/dev/features/#Execution-Configuration
- fmu.executionConfig.terminate = true
- fmu.executionConfig.instantiate = true
- fmu.executionConfig.reset = true
- fmu.executionConfig.setup = true
- fmu.executionConfig.freeInstance = true
- FMIFlux.finishSolveFMU(fmu, c, true, # free
- true) # terminate
- end
- return nothing
-end
-
-function dividePath(values)
- last_value = values[1]
- paths = []
- path = []
- for j in 1:length(values)
- if values[j] == 1.0
- push!(path, j)
- end
-
- if values[j] == 0.0 && last_value != 0.0
- push!(path, j)
- push!(paths, path)
- path = []
- end
-
- last_value = values[j]
- end
- if length(path) > 0
- push!(paths, path)
- end
- return paths
-end
-
-function plotRobot(solution::FMU2Solution, t::Real)
- x = solution.states(t)
- a1 = x[5]
- a2 = x[3]
-
- dt = 0.01
- i = 1+round(Integer, t/dt)
- v = solution.values.saveval[i]
-
- l1 = 0.2
- l2 = 0.1
-
- margin = 0.05
- scale = 1500
- fig = plot(; title="Time $(round(t; digits=1))s",
- size=(round(Integer, (2*margin+l1+l2)*scale), round(Integer, (l1+l2+2*margin)*scale)),
- xlims=(-margin, l1+l2+margin), ylims=(-l1-margin, l2+margin), legend=:bottomleft)
-
- p0 = [0.0, 0.0]
- p1 = p0 .+ [cos(a1)*l1, sin(a1)*l1]
- p2 = p1 .+ [cos(a1+a2)*l2, sin(a1+a2)*l2]
-
- f_norm = collect(v[3] for v in solution.values.saveval)
-
- paths = dividePath(f_norm)
- drawing = collect(v[1:2] for v in solution.values.saveval)
- for path in paths
- plot!(fig, collect(v[1] for v in drawing[path]), collect(v[2] for v in drawing[path]), label=:none, color=:black, style=:dot)
- end
-
- paths = dividePath(f_norm[1:i])
- drawing_is = collect(v[4:5] for v in solution.values.saveval)[1:i]
- for path in paths
- plot!(fig, collect(v[1] for v in drawing_is[path]), collect(v[2] for v in drawing_is[path]), label=:none, color=:green, width=2)
- end
-
- plot!(fig, [p0[1], p1[1]], [p0[2], p1[2]], label=:none, width=3, color=:blue)
- plot!(fig, [p1[1], p2[1]], [p1[2], p2[2]], label=:none, width=3, color=:blue)
-
- scatter!(fig, [p0[1]], [p0[2]], label="R1 | α1=$(round(a1; digits=3)) rad", color=:red)
- scatter!(fig, [p1[1]], [p1[2]], label="R2 | α2=$(round(a2; digits=3)) rad", color=:purple)
-
- scatter!(fig, [v[1]], [v[2]], label="TCP | F=$(v[3]) N", color=:orange)
-end
-
-HIDDEN_CODE_MESSAGE
-
-end # begin
-
-# ╔═╡ 92ad1a99-4ad9-4b69-b6f3-84aab49db54f
-@bind t_train_plot Slider(0.0:0.1:data_train.t[end], default=data_train.t[1])
-
-# ╔═╡ f111e772-a340-4217-9b63-e7715f773b2c
-md"""
-Let's have a look on the data! It's the written word *train*.
-You can use the slider to pick a specific point in time to plot the "robot" as recorded as part of the data.
-
-The current picked time is $(round(t_train_plot; digits=1))s.
-"""
-
-# ╔═╡ 909de9f1-2aca-4bf0-ba60-d3418964ba4a
-plotRobot(data_train.solution, t_train_plot)
-
-# ╔═╡ d8ca5f66-4f55-48ab-a6c9-a0be662811d9
-md"""
-👁️ Interesstingly, the first part of the word "trai" is not significantly affected by the slip-stick-effect, the actual TCP trajectory (green) lays quite good on the target position (black dashed). However, the "n" is very jerky. This can be explained by the increasing lever, the motor needs more torque to overcome the static friction the further away the TCP is from the robot base.
-
-Let's extract a start and stop time, as well as saving points for the later solving process:
-"""
-
-# ╔═╡ 41b1c7cb-5e3f-4074-a681-36dd2ef94454
-tSave = data_train.t # time points to save the solution at
-
-# ╔═╡ 8f45871f-f72a-423f-8101-9ce93e5a885b
-tStart = tSave[1] # start time for simulation of FMU and NeuralFMU
-
-# ╔═╡ 57c039f7-5b24-4d63-b864-d5f808110b91
-tStop = tSave[end] # stop time for simulation of FMU and NeuralFMU
-
-# ╔═╡ 4510022b-ad28-4fc2-836b-e4baf3c14d26
-md"""
-Finally, also the start state can be grabbed from *FMIZoo.jl*, as well as some default parameters for the simulation model we load in the next section. How to interpretate the six states is discussed in the next section where the model is loaded.
-"""
-
-# ╔═╡ 9589416a-f9b3-4b17-a381-a4f660a5ee4c
-x0 = FMIZoo.getState(data_train, tStart)
-
-# ╔═╡ 326ae469-43ab-4bd7-8dc4-64575f4a4d3e
-md"""
-The parameter array only contains the path to the training data file, the trajectory writing "train".
-"""
-
-# ╔═╡ 8f8f91cc-9a92-4182-8f18-098ae3e2c553
-parameters = FMIZoo.getParameter(data_train, tStart; friction=false)
-
-# ╔═╡ 8d93a1ed-28a9-4a77-9ac2-5564be3729a5
-md"""
-## Validation Data
-To check whether the hybrid model was not only able to *imitate*, but *understands* the training data, we need some unknown data for validation. In this case, the written word "validate".
-"""
-
-# ╔═╡ 4a8de267-1bf4-42c2-8dfe-5bfa21d74b7e
-# load validation data for the `RobotRR` from the FMIZoo
-data_validation = FMIZoo.RobotRR(:validate)
-
-# ╔═╡ dbde2da3-e3dc-4b78-8f69-554018533d35
-@bind t_validate_plot Slider(0.0:0.1:data_validation.t[end], default=data_validation.t[1])
-
-# ╔═╡ 6a8b98c9-e51a-4f1c-a3ea-cc452b9616b7
-md"""
-Let's have a look on the validation data!
-Again, you can use the slider to pick a specific point in time.
-
-The current time is $(round(t_validate_plot; digits=1))s.
-"""
-
-# ╔═╡ d42d0beb-802b-4d30-b5b8-683d76af7c10
-plotRobot(data_validation.solution, t_validate_plot)
-
-# ╔═╡ e50d7cc2-7155-42cf-9fef-93afeee6ffa4
-md"""
-👁️ It looks similar to the effect we know from training data, the first part "valida" is not significantly affected by the slip-stick-effect, but the "te" is very jerky. Again, think of the increasing lever ...
-"""
-
-# ╔═╡ 3756dd37-03e0-41e9-913e-4b4f183d8b81
-md"""
-## Simulation Model (FMU)
-The SCARA simulation model is called `RobotRR` for `Robot Rotational Rotational`, indicating that this robot consists of two rotational joints, connected by links. It is loaded with the following line of code:
-"""
-
-# ╔═╡ 2f83bc62-5a54-472a-87a2-4ddcefd902b6
-# load the FMU named `RobotRR` from the FMIZoo
-# the FMU was exported from Dymola (version 2023x)
-# load the FMU in mode `model-exchange` (ME)
-fmu = fmiLoad("RobotRR", "Dymola", "2023x"; type=:ME)
-
-# ╔═╡ c228eb10-d694-46aa-b952-01d824879287
-begin
-
-# We activate the single instance mode, so only one FMU instance gets allocated and is reused again an again.
-fmiSingleInstanceMode!(fmu, true)
-
-using FMI.FMIImport: fmi2StringToValueReference
-
-# declare some model identifiers (inside of the FMU)
-STATE_I1 = fmu.modelDescription.stateValueReferences[2]
-STATE_I2 = fmu.modelDescription.stateValueReferences[1]
-STATE_A1 = fmi2StringToValueReference(fmu, "rRPositionControl_Elasticity.rr1.rotational1.revolute1.phi")
-STATE_A2 = fmi2StringToValueReference(fmu,"rRPositionControl_Elasticity.rr1.rotational2.revolute1.phi")
-STATE_dA1 = fmi2StringToValueReference(fmu,"rRPositionControl_Elasticity.rr1.rotational1.revolute1.w")
-STATE_dA2 = fmi2StringToValueReference(fmu,"rRPositionControl_Elasticity.rr1.rotational2.revolute1.w")
-
-DER_ddA2 = fmu.modelDescription.derivativeValueReferences[4]
-DER_ddA1 = fmu.modelDescription.derivativeValueReferences[6]
-
-VAR_TCP_PX = fmi2StringToValueReference(fmu,"rRPositionControl_Elasticity.tCP.p_x")
-VAR_TCP_PY = fmi2StringToValueReference(fmu,"rRPositionControl_Elasticity.tCP.p_y")
-VAR_TCP_VX = fmi2StringToValueReference(fmu,"rRPositionControl_Elasticity.tCP.v_x")
-VAR_TCP_VY = fmi2StringToValueReference(fmu,"rRPositionControl_Elasticity.tCP.v_y")
-VAR_TCP_F = fmi2StringToValueReference(fmu, "combiTimeTable.y[3]")
-
-HIDDEN_CODE_MESSAGE
-
-end
-
-# ╔═╡ 16ffc610-3c21-40f7-afca-e9da806ea626
-md"""
-Let's check out some meta data of the FMU with `fmiInfo`:
-"""
-
-# ╔═╡ 052f2f19-767b-4ede-b268-fce0aee133ad
-fmiInfo(fmu)
-
-# ╔═╡ 746fbf6f-ed7c-43b8-8a6f-0377cd3cf85e
-md"""
-👁️ We can read the model name, tool information for the exporting tool, number of event indicators, states, inputs, outputs and whether the optionally implemented FMI features (like *directional derivatives*) are supported by this FMU.
-"""
-
-# ╔═╡ 08e1ff54-d115-4da9-8ea7-5e89289723b3
-md"""
-All six states are listed with all their alias identifiers, that might look a bit awkward the first time. The six states - human readable - are:
-
-| variable reference | description |
-| -------- | ------ |
-| 33554432 | motor #2 current |
-| 33554433 | motor #1 current |
-| 33554434 | joint #2 angle |
-| 33554435 | joint #2 angular velocity |
-| 33554436 | joint #1 angle |
-| 33554437 | joint #1 angular velocity |
-"""
-
-# ╔═╡ 70c6b605-54fa-40a3-8bce-a88daf6a2022
-md"""
-To simulate - or *solve* - the ME-FMU, we need an ODE solver. We use the *Tsit5* here.
-"""
-
-# ╔═╡ 634f923a-5e09-42c8-bac0-bf165ab3d12a
-solver = Tsit5()
-
-# ╔═╡ f59b5c84-2eae-4e3f-aaec-116c090d454d
-md"""
-Let's define an array of values we want to be recorded during the first simulation of our FMU. The variable identifiers (like `DER_ddA2`) were pre-defined in the hidden code section above.
-"""
-
-# ╔═╡ 0c9493c4-322e-41a0-9ec7-2e2c54ae1373
-recordValues = [DER_ddA2, DER_ddA1, # mechanical accelerations
- STATE_A2, STATE_A1, # mechanical angles
- VAR_TCP_PX, VAR_TCP_PY, # tool-center-point x and y
- VAR_TCP_VX, VAR_TCP_VY, # tool-center-point velocity x and y
- VAR_TCP_F] # normal force pen on paper
-
-# ╔═╡ 325c3032-4c78-4408-b86e-d9aa4cfc3187
-md"""
-Let's simulate the FMU using `fmiSimulate`. In the solution object, different information can be found, like the number of ODE, jacobian or gradient evaluations:
-"""
-
-# ╔═╡ 25e55d1c-388f-469d-99e6-2683c0508693
-sol_fmu_train = fmiSimulate(fmu, # our FMU
- (tStart, tStop); # sim. from tStart to tStop
- solver=solver, # use the Tsit5 solver
- parameters=parameters, # the word "train"
- saveat=tSave, # saving points for the sol.
- recordValues=recordValues) # values to record
-
-# ╔═╡ 74c519c9-0eef-4798-acff-b11044bb4bf1
-md"""
-Now that we know our model and data a little bit better, it's time to care about our hybrid model topology.
-
-# Experiments: $br Hybrid Model Topology
-
-Today is opposite day! Instead of deriving a topology step by step, the final NeuralFMU topology is presented in the picture below... however, three experiments are intended to make clear why it looks the way it looks.
-
-![](https://github.com/ThummeTo/FMIFlux.jl/blob/main/examples/src/HybridModelingUsingFMI/src/plan_complete.png?raw=true)
-
-The first experiment is on choosing a good interface between FMU and ANN. The second is on online data pre- and post-processing. And the third one on gates, that allow to control the influence of ANN and FMU on the resulting hybrid model dynamics. After you completed all three, you are equipped with the knowledge to cope the final challenge: Build your own NeuralFMU and train it!
-"""
-
-# ╔═╡ 786c4652-583d-43e9-a101-e28c0b6f64e4
-md"""
-## Choosing interface signals
-**between the physical and machine learning domain**
-
-When connecting an FMU with an ANN, technically different signals could be used: States, state derivatives, inputs, outputs, parameters, time itself or other observable variables. Depending on the use case, some signals are more clever to choose than others. In general, every additional signal costs a little bit of computational performance, as you will see. So picking the right subset is the key!
-
-![](https://github.com/ThummeTo/FMIFlux.jl/blob/main/examples/src/HybridModelingUsingFMI/src/plan_e1.png?raw=true)
-
-Choose additional FMU variables to put in together with the state derivatives:
-"""
-
-# ╔═╡ b42bf3d8-e70c-485c-89b3-158eb25d8b25
-@bind CHOOSE_y_refs MultiCheckBox([STATE_A1 => "Angle Joint 1", STATE_A2 => "Angle Joint 2", STATE_dA1 => "Angular velocity Joint 1", STATE_dA2 => "Angular velocity Joint 2", VAR_TCP_PX => "TCP position x", VAR_TCP_PY => "TCP position y", VAR_TCP_VX => "TCP velocity x", VAR_TCP_VY => "TCP velocity y", VAR_TCP_F => "TCP (normal) force z"])
-
-# ╔═╡ 5d688c3d-b5e3-4a3a-9d91-0896cc001000
-md"""
-We start building our deep model as a `Chain` of layers. For now, there is only a single layer in it: The FMU `fmu` itself. The layer input `x` is interpreted as system state and set in the fmu call via `x=x`. Further, we want all state derivatives as layer outputs `dx_refs=:all` and some additional outputs specified via `y_refs=CHOOSE_y_refs`. Which signals are used for `y_refs`, can be selected above.
-"""
-
-# ╔═╡ 2e08df84-a468-4e99-a277-e2813dfeae5c
-model = Chain(x -> fmu(; x=x, dx_refs=:all, y_refs=CHOOSE_y_refs))
-
-# ╔═╡ 33791947-342b-4bf4-9d0a-c3979c0ad88a
-begin
- using FMIFlux.FMISensitivity.ReverseDiff
- ben_grad = (_x,) -> ReverseDiff.gradient(x -> sum(model(x)), _x);
- ben_grad(x0)
- @time ben_grad(x0) # second run for "benchmarking"
-end
-
-# ╔═╡ 432ab3ff-5336-4413-9807-45d4bf756e1f
-begin
- using FMIFlux.FMISensitivity.ForwardDiff
- ben_fd_grad = (_x,) -> ForwardDiff.gradient(x -> sum(model(x)), _x);
- ben_fd_grad(x0)
- @time ben_fd_grad(x0) # second run for "benchmarking"
-end
-
-# ╔═╡ 0a7955e7-7c1a-4396-9613-f8583195c0a8
-md"""
-Depending on how many signals you select, the output of the FMU-layer is extended. The first six outputs are the state derivatives, the remaining are the additional outputs selected above.
-"""
-
-# ╔═╡ 4912d9c9-d68d-4afd-9961-5d8315884f75
-model(x0)
-
-# ╔═╡ 6a1a5092-6832-4ac7-9850-346e3fa28252
-md"""
-Finally, keep in mind that the amount of selected signals has influence on the computational performance of the model. The more signals you use, the slower is inference and gradient determination. The current timing and allocations for inference are:
-"""
-
-# ╔═╡ a1aca180-d561-42a3-8d12-88f5a3721aae
-begin
- ben_inf = (_x,) -> model(_x);
- ben_inf(x0);
- @time ben_inf(x0)
-end
-
-# ╔═╡ 13ede3cd-99b1-4e65-8a18-9043db544728
-md"""
-Gradient computation takes a little longer of course. We use reverse-mode Automatic Differentiation via `ReverseDiff.jl` here:
-"""
-
-# ╔═╡ 7622ed93-9c66-493b-9fba-c0d3755758a8
-md"""
-Further, forward-mode Automatic Differentiation is available too via `ForwardDiff.jl`, but a little bit slower than reverse-mode:
-"""
-
-# ╔═╡ eaf37128-0377-42b6-aa81-58f0a815276b
-md"""
-So keep in mind that the choice of interface might have a significant impact on your inference and training performance! However, some signals are simply required, because the effect we want to train for depends on them.
-"""
-
-# ╔═╡ c030d85e-af69-49c9-a7c8-e490d4831324
-md"""
-## Online Data Pre- and Postprocessing
-**is required for hybrid models**
-
-Now that we have defined the signals that come *from* the FMU and go *into* the ANN, we need to think about data pre- and post-processing. In ML, this is often done before the actual training starts. In hybrid modeling, we need to do this *online*, because the FMU constantly generates signals that might not be suitable for ANNs. On the other hand, the signals generated by ANNs might not suit the expected FMU input. This gets more clear if we have a look on the used activation functions, like e.g. the *tanh*.
-
-![](https://github.com/ThummeTo/FMIFlux.jl/blob/main/examples/src/HybridModelingUsingFMI/src/plan_e2.png?raw=true)
-
-We simplify the ANN to its nonlinear activation function. Let's see what's happening as soon as we put the derivative *angular velocity of joint 1* (dα1) from the FMU into a `tanh` function:
-"""
-
-# ╔═╡ 51c200c9-0de3-4e50-8884-49fe06158560
-begin
- fig_pre_post1 = plot(layout=grid(1,2,widths=(1/4, 3/4)), xlabel="t [s]", legend=:bottomright)
-
- plot!(fig_pre_post1[1], data_train.t, data_train.da1, label=:none, xlims=(0.0,0.1))
- plot!(fig_pre_post1[1], data_train.t, tanh.(data_train.da1), label=:none)
-
- plot!(fig_pre_post1[2], data_train.t, data_train.da1, label="dα1")
- plot!(fig_pre_post1[2], data_train.t, tanh.(data_train.da1), label="tanh(dα1)")
-
- fig_pre_post1
-end
-
-# ╔═╡ 0dadd112-3132-4491-9f02-f43cf00aa1f9
-md"""
-In general, it looks like the velocity isn't saturated too much by `tanh`. This is a good thing and not always the case! However, the very beginning of the trajectory is saturated too much (the peak value of $\approx -3$ is saturated to $\approx -1$). This is bad, because the hybrid model will move *slower* at this point in time and won't reach the same angle as the original FMU.
-
-We can add shift and scale operations before and after the ANN to bypass this issue. See how you can influence the output *after* the `tanh` (and the ANN repectively) to match the ranges. The goal is o choose pre- and post-processing parameters so that the signal ranges needed by the FMU are preserved by the hybrid model.
-"""
-
-# ╔═╡ bf6bf640-54bc-44ef-bd4d-b98e934d416e
-@bind PRE_POST_SHIFT Slider(-1:0.1:1.0, default=0.0)
-
-# ╔═╡ 5c2308d9-6d04-4b38-af3b-6241da3b6871
-md"""
-Change the `shift` value $(PRE_POST_SHIFT):
-"""
-
-# ╔═╡ 007d6d95-ad85-4804-9651-9ac3703d3b40
-@bind PRE_POST_SCALE Slider(0.1:0.1:2.0, default=1.0)
-
-# ╔═╡ 639889b3-b9f2-4a3c-999d-332851768fd7
-md"""
-Change the `scale` value $(PRE_POST_SCALE):
-"""
-
-# ╔═╡ ed1887df-5079-4367-ab04-9d02a1d6f366
-begin
- fun_pre = ShiftScale([PRE_POST_SHIFT], [PRE_POST_SCALE])
- fun_post = ScaleShift(fun_pre)
-
- fig_pre_post2 = plot(;layout=grid(1,2,widths=(1/4, 3/4)), xlabel="t [s]")
-
- plot!(fig_pre_post2[2], data_train.t, data_train.da1, label=:none, title="Shift: $(round(PRE_POST_SHIFT; digits=1)) | Scale: $(round(PRE_POST_SCALE; digits=1))", legend=:bottomright)
- plot!(fig_pre_post2[2], data_train.t, tanh.(data_train.da1), label=:none)
- plot!(fig_pre_post2[2], data_train.t, fun_post(tanh.(fun_pre(data_train.da1))), label=:none)
-
- plot!(fig_pre_post2[1], data_train.t, data_train.da1, label="dα1", xlims=(0.0, 0.1))
- plot!(fig_pre_post2[1], data_train.t, tanh.(data_train.da1), label="tanh(dα1)")
- plot!(fig_pre_post2[1], data_train.t, fun_post(tanh.(fun_pre(data_train.da1))), label="post(tanh(pre(dα1)))")
-
- fig_pre_post2
-end
-
-# ╔═╡ 0b0c4650-2ce1-4879-9acd-81c16d06700e
-md"""
-The left plot shows the negative spike at the very beginning in more detail. In *FMIFlux.jl*, there are ready to use layers for scaling and shifting, that can automatically select appropriate parameters. These parameters are trained together with the ANN parameters by default, so they can adapt to new signal ranges that might occur during training.
-"""
-
-# ╔═╡ 0fb90681-5d04-471a-a7a8-4d0f3ded7bcf
-md"""
-## Introducing Gates
-**to control how physical and machine learning model interact**
-
-![](https://github.com/ThummeTo/FMIFlux.jl/blob/main/examples/src/HybridModelingUsingFMI/src/plan_e3.png?raw=true)
-"""
-
-# ╔═╡ 95e14ea5-d82d-4044-8c68-090d74d95a61
-md"""
-There are basically two ways of connecting two blocks (the ANN and the FMU):
-- In **series**, so one block is getting signals from the other block and is able to *manipulate* or *correct* these signals. This way, e.g. modeling or parameterization errors can be corrected.
-- In **parallel**, so both are getting the same signals and calculate own outputs, these outputs must be merged afterwards. This way, additional system parts, like e.g. forces or momentum, can be learned and added to or augment the existing dynamics.
-
-The good news is, you don't have to decide this beforehand. This is something that the optimizer can decide, if we introduce a topology with parameters, that allow for both modes. This structure is referred to as *gates*.
-"""
-
-# ╔═╡ cbae6aa4-1338-428c-86aa-61d3304e33ed
-@bind GATE_INIT_FMU Slider(0.0:0.1:1.0, default=1.0)
-
-# ╔═╡ 2fa1821b-aaec-4de4-bfb4-89560790dc39
-md"""
-Change the opening of the **FMU gate** $(GATE_INIT_FMU) for dα1:
-"""
-
-# ╔═╡ 8c56acd6-94d3-4cbc-bc29-d249740268a0
-@bind GATE_INIT_ANN Slider(0.0:0.1:1.0, default=0.0)
-
-# ╔═╡ 9b52a65a-f20c-4387-aaca-5292a92fb639
-md"""
-Change the opening of the **ANN gate** $(GATE_INIT_ANN) for dα1:
-"""
-
-# ╔═╡ 845a95c4-9a35-44ae-854c-57432200da1a
-md"""
-The FMU gate value for dα1 is $(GATE_INIT_FMU) and the ANN gate value is $(GATE_INIT_ANN). This means the hybrid model dα1 is composed of $(GATE_INIT_FMU*100)% of dα1 from the FMU and of $(GATE_INIT_ANN*100)% of dα1 from the ANN.
-"""
-
-# ╔═╡ 5a399a9b-32d9-4f93-a41f-8f16a4b102dc
-begin
- function build_model_gates()
- Random.seed!(123)
-
- cache = CacheLayer() # allocate a cache layer
- cacheRetrieve = CacheRetrieveLayer(cache) # allocate a cache retrieve layer, link it to the cache layer
-
- # we have two signals (acceleration, consumption) and two sources (ANN, FMU), so four gates:
- # (1) acceleration from FMU (gate=1.0 | open)
- # (2) consumption from FMU (gate=1.0 | open)
- # (3) acceleration from ANN (gate=0.0 | closed)
- # (4) consumption from ANN (gate=0.0 | closed)
- # the acelerations [1,3] and consumptions [2,4] are paired
- gates = ScaleSum([GATE_INIT_FMU, GATE_INIT_ANN], [[1,2]]) # gates with sum
-
- # setup the NeuralFMU topology
- model_gates = Flux.f64(Chain(dx -> cache(dx), # cache `dx`
- Dense(1, 16, tanh),
- Dense(16, 1, tanh), # pre-process `dx`
- dx -> cacheRetrieve(1, dx), # dynamics FMU | dynamics ANN
- gates)) # stack toget
-
- model_input = collect([v] for v in data_train.da1)
- model_output = collect(model_gates(inp) for inp in model_input)
- ANN_output = collect(model_gates[2:3](inp) for inp in model_input)
-
- fig = plot(; ylims=(-3,1), legend=:bottomright)
- plot!(fig, data_train.t, collect(v[1] for v in model_input), label="dα1 of FMU")
- plot!(fig, data_train.t, collect(v[1] for v in ANN_output), label="dα1 of ANN")
- plot!(fig, data_train.t, collect(v[1] for v in model_output), label="dα1 of NeuralFMU")
-
- return fig
- end
- build_model_gates()
-end
-
-# ╔═╡ fd1cebf1-5ccc-4bc5-99d4-1eaa30e9762e
-md"""
-Some observations from the current gate openings are:
-
-This equals the serial topology: $((GATE_INIT_FMU==0 && GATE_INIT_ANN==1)) $br
-This equals the parallel topology: $((GATE_INIT_FMU==1 && GATE_INIT_ANN==1)) $br
-The NeuralFMU dynamics equal the FMU dynamics: $((GATE_INIT_FMU==1 && GATE_INIT_ANN==0))
-
-Time to take care of the big picture next.
-"""
-
-# ╔═╡ 2a5157c5-f5a2-4330-b2a3-0c1ec0b7adff
-md"""
-# Building the NeuralFMU
-**... putting everything together**
-
-![](https://github.com/ThummeTo/FMIFlux.jl/blob/main/examples/src/HybridModelingUsingFMI/src/plan_train.png?raw=true)
-"""
-
-# ╔═╡ 4454c8d2-68ed-44b4-adfa-432297cdc957
-md"""
-## FMU inputs
-In general, you can use arbitrary values as input for the FMU layer, like system inputs, states or parameters. In this example, we want to use only system states as inputs for the FMU layer - to keep it easy, named:
-- currents of both motors
-- angles of both joints
-- angular velocities of both joints
-
-To preserve the ODE topology (a mapping from state to state derivative), we use all system state derivatives as layer outputs. However, you can choose further outputs if you want to... and you definitely should.
-
-## ANN inputs
-As input to the ANN, we choose at least the angular accelerations of both joints - this is fixed:
-
-- angular acceleration Joint 1
-- angular acceleration Joint 2
-
-Pick additional ANN layer inputs:
-"""
-
-# ╔═╡ d240c95c-5aba-4b47-ab8d-2f9c0eb854cd
-@bind y_refs MultiCheckBox([STATE_A1 => "Angle Joint 1", STATE_A2 => "Angle Joint 2", STATE_dA1 => "Angular velocity Joint 1", STATE_dA2 => "Angular velocity Joint 2", VAR_TCP_PX => "TCP position x", VAR_TCP_PY => "TCP position y", VAR_TCP_VX => "TCP velocity x", VAR_TCP_VY => "TCP velocity y", VAR_TCP_F => "TCP (normal) force z"])
-
-# ╔═╡ 06937575-9ab1-41cd-960c-7eef3e8cae7f
-md"""
-It might be clever to pick additional inputs, because the effect being learned (slip-stick of the pen) might depend on this additional input. However, every additional signal has a little negative impact on the computational performance.
-"""
-
-# ╔═╡ 356b6029-de66-418f-8273-6db6464f9fbf
-md"""
-## ANN size
-"""
-
-# ╔═╡ 53e971d8-bf43-41cc-ac2b-20dceaa78667
-@bind GATES_INIT Slider(0.0:0.1:1.0, default=0.0)
-
-# ╔═╡ 5805a216-2536-44ac-a702-d92e86d435a4
-md"""
-The ANN shall have $(@bind NUM_LAYERS Select([2, 3, 4])) layers with a width of $(@bind LAYERS_WIDTH Select([8, 16, 32])) each.
-
-The gates shall be initialized with $(GATES_INIT), slide to change:
-"""
-
-# ╔═╡ e8b8c63b-2ca4-4e6a-a801-852d6149283e
-md"""
-All gates shall be initialized with $(GATES_INIT), meaning the ANN contributes $(GATES_INIT*100)% to the hybrid model derivatives, while the FMU contributes $(100-GATES_INIT*100)%. These parameters are adapted during training, these are only start values.
-"""
-
-# ╔═╡ c0ac7902-0716-4f18-9447-d18ce9081ba5
-md"""
-## Resulting NeuralFMU
-Even if this looks a little confusing at first glance, our final NeuralFMU topology looks like this:
-"""
-
-# ╔═╡ 84215a73-1ab0-416d-a9db-6b29cd4f5d2a
-begin
-
-function build_topology(gates_init, add_y_refs)
-
- ANN_input_Vars = [recordValues[1:2]..., add_y_refs...]
- ANN_input_Vals = fmiGetSolutionValue(sol_fmu_train, ANN_input_Vars)
- ANN_input_Idcs = [4, 6]
- for i in 1:length(add_y_refs)
- push!(ANN_input_Idcs, i+6)
- end
-
- # pre- and post-processing
- preProcess = ShiftScale(ANN_input_Vals) # we put in the derivatives recorded above, FMIFlux shift and scales so we have a data mean of 0 and a standard deivation of 1
- #preProcess.scale[:] *= 0.1 # add some additional "buffer"
- postProcess = ScaleShift(preProcess; indices=[1,2]) # initialize the postPrcess as inverse of the preProcess, but only take indices 2 and 3 (we don't need 1, the vehcile velocity)
-
- # cache
- cache = CacheLayer() # allocate a cache layer
- cacheRetrieve = CacheRetrieveLayer(cache) # allocate a cache retrieve layer, link it to the cache layer
-
- gates = ScaleSum([1.0-gates_init, 1.0-gates_init, gates_init, gates_init], [[1,3], [2,4]]) # gates with sum
-
- ANN_layers = []
- push!(ANN_layers, Dense(2+length(add_y_refs), LAYERS_WIDTH, tanh)) # first layer
- for i in 3:NUM_LAYERS
- push!(ANN_layers, Dense(LAYERS_WIDTH, LAYERS_WIDTH, tanh))
- end
- push!(ANN_layers, Dense(LAYERS_WIDTH, 2, tanh)) # last layer
-
- model = Flux.f64(Chain(x -> fmu(; x=x, dx_refs=:all, y_refs=add_y_refs),
- dxy -> cache(dxy), # cache `dx`
- dxy -> dxy[ANN_input_Idcs],
- preProcess,
- ANN_layers...,
- postProcess,
- dx -> cacheRetrieve(4, 6, dx), # dynamics FMU | dynamics ANN
- gates, # compute resulting dx from ANN + FMU
- dx -> cacheRetrieve(1:3, dx[1], 5, dx[2])))
-
- return model
-
-end
-
-final_model = build_topology(GATES_INIT, y_refs)
-
-end
-
-# ╔═╡ bc09bd09-2874-431a-bbbb-3d53c632be39
-md"""
-We can evaluate it, by putting in our start state `x0`. The model computes the resulting state derivative:
-"""
-
-# ╔═╡ f741b213-a20d-423a-a382-75cae1123f2c
-final_model(x0)
-
-# ╔═╡ f02b9118-3fb5-4846-8c08-7e9bbca9d208
-md"""
-On basis of this `Chain`, we can build a NeuralFMU very easy:
-"""
-
-# ╔═╡ 91473bef-bc23-43ed-9989-34e62166d455
-neuralFMU = ME_NeuralFMU(fmu, # the FMU used in the NeuralFMU
- final_model, # the model we specified above
- (tStart, tStop), # start and stop time for solving
- solver; # the solver (Tsit5)
- saveat=tSave) # time points to save the solution at
-
-# ╔═╡ d347d51b-743f-4fec-bed7-6cca2b17bacb
-md"""
-# Training
-
-After setting everything up, we can give it a try and train our created NeuralFMU. Deepending on the chosen optimization hyper parameters, this will be more or less successful. Feel free to play around a bit, but keep in mind that for real application design, you should do hyper parameter optimization instead of playing around by yourself.
-"""
-
-# ╔═╡ d60d2561-51a4-4f8a-9819-898d70596e0c
-md"""
-## Hyperparameters
-Besides the already introduced hyperparameters - the depth, width and initial gate opening off the hybrid model - further parameters might have significant impact on the training success.
-
-### Optimizer
-For this example, we use the well-known `Adam`-Optimizer with a step size `eta` of $(@bind ETA Select([1e-4 => "1e-4", 1e-3 => "1e-3", 1e-2 => "1e-2"])).
-
-### Batching
-Because data has a significant length, gradient computation over the entire simulation trajectory might not be effective. The most common approach is to *cut* data into slices and train on these subsets instead of the entire trajctory at once. In this example, data is cut in pieces with length of $(@bind BATCHDUR Select([0.05, 0.1, 0.15, 0.2])) seconds.
-"""
-
-# ╔═╡ c97f2dea-cb18-409d-9ae8-1d03647a6bb3
-md"""
-This results in a batch with $(round(Integer, data_train.t[end] / BATCHDUR)) elements.
-"""
-
-# ╔═╡ 366abd1a-bcb5-480d-b1fb-7c76930dc8fc
-md"""
-We use a simple `Random` scheduler here, that picks a random batch element for the next training step. Other schedulers are pre-implemented in *FMIFlux.jl*.
-"""
-
-# ╔═╡ 7e2ffd6f-19b0-435d-8e3c-df24a591bc55
-md"""
-### Loss Function
-Different loss functions are thinkable here. Two quantities that should be considered are the motor currents and the motor revolution speeds. For this workshop we use the *Mean Average Error* (MAE) over the motor currents. Other loss functions can easily be deployed.
-"""
-
-# ╔═╡ caa5e04a-2375-4c56-8072-52c140adcbbb
-function loss(solution::FMU2Solution, data::FMIZoo.RobotRR_Data)
-
- # determine the start/end indices `ts` and `te` (sampled with 100Hz)
- dt = 0.01
- ts = 1+round(Integer, solution.states.t[1] / dt)
- te = 1+round(Integer, solution.states.t[end] / dt)
-
- # retrieve the data from NeuralFMU ("where we are") and data from measurements ("where we want to be")
- i1_value = fmiGetSolutionState(solution, STATE_I1)
- i2_value = fmiGetSolutionState(solution, STATE_I2)
- i1_data = data.i1[ts:te]
- i2_data = data.i2[ts:te]
-
- Δvalue = 0.0
- Δvalue += FMIFlux.Losses.mae(i1_value, i1_data)
- Δvalue += FMIFlux.Losses.mae(i2_value, i2_data)
-
- return Δvalue
-end
-
-# ╔═╡ 69657be6-6315-4655-81e2-8edef7f21e49
-md"""
-For example, the loss function value of the plain FMU is $(round(loss(sol_fmu_train, data_train); digits=6)).
-"""
-
-# ╔═╡ 23ad65c8-5723-4858-9abe-750c3b65c28a
-md"""
-## Summary
-To summarize, your ANN has a **depth of $(NUM_LAYERS) layers** with a **width of $(LAYERS_WIDTH)** each. The **ANN gates are initialized with $(GATES_INIT*100)%**, so all FMU gates are initialized with $(100-GATES_INIT*100)%. You decided to batch your data with a **batch element length of $(BATCHDUR)** seconds. Besides the state derivatives, you **put $(length(y_refs)) additional variables** in the ANN. Adam optimizer will try to find a good minimum with **`eta` is $(ETA)**.
-
-Batching takes a few seconds and training a few minutes (depending on the number of training steps), so this is not triggered automatically. If you are ready to go, choose a number of training steps and check the checkbox `Enable Live Training`. This will start a training of $(@bind STEPS Select([0, 10, 100, 1000, 2500, 10000])) training steps.
-"""
-
-# ╔═╡ e8bae97d-9f90-47d2-9263-dc8fc065c3d0
-md"""
-⚠️ The roughly estimated training time is **$(round(Integer, STEPS*10*BATCHDUR + 0.6/BATCHDUR)) seconds** (Windows, i7 @ 3.6GHz). Training might be faster if the system is less stiff than expected. Once you clicked on `Enable Live Training`, training can't be terminated easily.
-
-⚠️ **Enable Live Training** $(@bind LIVE_TRAIN CheckBox())
-"""
-
-# ╔═╡ 2dce68a7-27ec-4ffc-afba-87af4f1cb630
-begin
-
-function train(eta, batchdur, steps)
-
- if steps == 0
- return "Number of training steps is `0`, no training."
- end
-
- train_t = data_train.t
- train_data = collect([data_train.i2[i], data_train.i1[i]] for i in 1:length(train_t))
-
- @info "Started batching ..."
- batch = batchDataSolution(neuralFMU, # our NeuralFMU model
- t -> FMIZoo.getState(data_train, t), # a function returning a start state for a given time point `t`, to determine start states for batch elements
- train_t, # data time points
- train_data; # data cumulative consumption
- batchDuration=batchdur, # duration of one batch element
- indicesModel=[1,2], # model indices to train on (1 and 2 equal the `electrical current` states)
- plot=false, # don't show intermediate plots (try this outside of Pluto)
- showProgress=false,
- parameters=parameters)
-
- @info "... batching finished!"
-
- # a random element scheduler
- scheduler = RandomScheduler(neuralFMU, batch; applyStep=1, plotStep=0)
-
- lossFct = (solution::FMU2Solution) -> loss(solution, data_train)
-
- maxiters = round(Int, 1e5*batchdur)
-
- _loss = p -> FMIFlux.Losses.loss(neuralFMU, # the NeuralFMU to simulate
- batch; # the batch to take an element from
- p=p, # the NeuralFMU training parameters (given as input)
- lossFct=lossFct, # our custom loss function
- batchIndex=scheduler.elementIndex, # the index of the batch element to take, determined by the choosen scheduler
- logLoss=true, # log losses after every evaluation
- showProgress=false,
- parameters=parameters,
- maxiters=maxiters)
-
- params = FMIFlux.params(neuralFMU)
-
- FMIFlux.initialize!(scheduler; p=params[1], showProgress=false, parameters=parameters)
-
- BETA1 = 0.9
- BETA2 = 0.999
- optim = Adam(eta, (BETA1, BETA2))
-
- @info "Started training ..."
-
- FMIFlux.train!(_loss, # the loss function for training
- neuralFMU, # the parameters to train
- Iterators.repeated((), steps), # an iterator repeating `steps` times
- optim; # the optimizer to train
- gradient=:ReverseDiff, # use ReverseDiff, because it's much faster!
- cb=() -> FMIFlux.update!(scheduler), # update the scheduler after every step
- proceed_on_assert=true) # go on if a training steps fails (e.g. because of instability)
-
- @info "... training finished!"
-end
-
-HIDDEN_CODE_MESSAGE
-
-end
-
-# ╔═╡ c3f5704b-8e98-4c46-be7a-18ab4f139458
-let
- if LIVE_TRAIN
- train(ETA, BATCHDUR, STEPS)
- else
- LIVE_TRAIN_MESSAGE
- end
-end
-
-# ╔═╡ ff106912-d18c-487f-bcdd-7b7af2112cab
-md"""
-# Results
-Now it's time to find out if it worked!
-
-
-
-⚠️ Live plotting results makes the notebbok slow, so it's deactivated by default. Activate it to plot results of your training and deactivate it, if you want to to further experiments.
-
-⚠️ **Enable Live Results** $(@bind LIVE_RESULTS CheckBox())
-
-## Training results
-Let's check out the *training* results of the freshly trained NeuralFMU.
-"""
-
-# ╔═╡ 27458e32-5891-4afc-af8e-7afdf7e81cc6
-begin
-
-function plotPaths!(fig, t, x, N; color=:black, label=:none, kwargs...)
- paths = []
- path = nothing
- lastN = N[1]
- for i in 1:length(N)
- if N[i] == 0.0
- if lastN == 1.0
- push!(path, (t[i], x[i]) )
- push!(paths, path)
- end
- end
-
- if N[i] == 1.0
- if lastN == 0.0
- path = []
- end
- push!(path, (t[i], x[i]) )
- end
-
- lastN = N[i]
- end
- if length(path) > 0
- push!(paths, path)
- end
-
- isfirst = true
- for path in paths
- plot!(fig, collect(v[1] for v in path), collect(v[2] for v in path);
- label=isfirst ? label : :none,
- color=color,
- kwargs...)
- isfirst = false
- end
-
- return fig
-end
-
-HIDDEN_CODE_MESSAGE
-
-end
-
-# ╔═╡ 5dd491a4-a8cd-4baf-96f7-7a0b850bb26c
-begin
- if LIVE_RESULTS
- fmu_train = fmiSimulate(fmu, (data_train.t[1], data_train.t[end]); x0=x0,
- parameters=Dict{String, Any}("fileName" => data_train.params["fileName"]),
- recordValues=["rRPositionControl_Elasticity.tCP.p_x",
- "rRPositionControl_Elasticity.tCP.p_y",
- "rRPositionControl_Elasticity.tCP.N"],
- showProgress=true, maxiters=1e7, saveat=data_train.t, solver=Tsit5());
- else
- LIVE_RESULTS_MESSAGE
- end
-end
-
-# ╔═╡ 1195a30c-3b48-4bd2-8a3a-f4f74f3cd864
-begin
- if LIVE_RESULTS
- result_train = neuralFMU(x0, (data_train.t[1], data_train.t[end]);
- parameters=Dict{String, Any}("fileName" => data_train.params["fileName"]),
- recordValues=["rRPositionControl_Elasticity.tCP.p_x",
- "rRPositionControl_Elasticity.tCP.p_y",
- "rRPositionControl_Elasticity.tCP.N"],
- showProgress=true, maxiters=1e7, saveat=data_train.t);
- else
- LIVE_RESULTS_MESSAGE
- end
-end
-
-# ╔═╡ b0ce7b92-93e0-4715-8324-3bf4ff42a0b3
-begin
- if LIVE_RESULTS
- md"""
-The loss function value of the FMU on training data is $(round(loss(fmu_train, data_train); digits=6)), of the NeuralFMU it is $(round(loss(result_train, data_train); digits=6)).
-"""
- else
- LIVE_RESULTS_MESSAGE
- end
-end
-
-# ╔═╡ 919419fe-35de-44bb-89e4-8f8688bee962
-let
- if LIVE_RESULTS
- fig = plot(; dpi=300, size=(200*3,60*3))
- plotPaths!(fig, data_train.tcp_px, data_train.tcp_py, data_train.tcp_norm_f, label="Data", color=:black, style=:dash)
- plotPaths!(fig, collect(v[1] for v in fmu_train.values.saveval), collect(v[2] for v in fmu_train.values.saveval), collect(v[3] for v in fmu_train.values.saveval), label="FMU", color=:orange)
- plotPaths!(fig, collect(v[1] for v in result_train.values.saveval), collect(v[2] for v in result_train.values.saveval), collect(v[3] for v in result_train.values.saveval), label="NeuralFMU", color=:blue)
- else
- LIVE_RESULTS_MESSAGE
- end
-end
-
-# ╔═╡ 2918daf2-6499-4019-a04b-8c3419ee1ab7
-let
- if LIVE_RESULTS
- fig = plot(; dpi=300, size=(40*10,40*10), xlims=(0.165, 0.205), ylims=(-0.035, 0.005))
- plotPaths!(fig, data_train.tcp_px, data_train.tcp_py, data_train.tcp_norm_f, label="Data", color=:black, style=:dash)
- plotPaths!(fig, collect(v[1] for v in fmu_train.values.saveval), collect(v[2] for v in fmu_train.values.saveval), collect(v[3] for v in fmu_train.values.saveval), label="FMU", color=:orange)
- plotPaths!(fig, collect(v[1] for v in result_train.values.saveval), collect(v[2] for v in result_train.values.saveval), collect(v[3] for v in result_train.values.saveval), label="NeuralFMU", color=:blue)
- else
- LIVE_RESULTS_MESSAGE
- end
-end
-
-# ╔═╡ 048e39c3-a3d9-4e6b-b050-1fd5a919e4ae
-let
- if LIVE_RESULTS
- fig = plot(; dpi=300, size=(50*10,40*10), xlims=(0.245, 0.295), ylims=(-0.04, 0.0))
- plotPaths!(fig, data_train.tcp_px, data_train.tcp_py, data_train.tcp_norm_f, label="Data", color=:black, style=:dash)
- plotPaths!(fig, collect(v[1] for v in fmu_train.values.saveval), collect(v[2] for v in fmu_train.values.saveval), collect(v[3] for v in fmu_train.values.saveval), label="FMU", color=:orange)
- plotPaths!(fig, collect(v[1] for v in result_train.values.saveval), collect(v[2] for v in result_train.values.saveval), collect(v[3] for v in result_train.values.saveval), label="NeuralFMU", color=:blue)
- else
- LIVE_RESULTS_MESSAGE
- end
-end
-
-# ╔═╡ b489f97d-ee90-48c0-af06-93b66a1f6d2e
-md"""
-## Validation results
-Let's check out the *validation* results of the freshly trained NeuralFMU.
-"""
-
-# ╔═╡ ea0ede8d-7c2c-4e72-9c96-3260dc8d817d
-begin
- if LIVE_RESULTS
- fmu_validation = fmiSimulate(fmu, (data_validation.t[1], data_validation.t[end]); x0=x0,
- parameters=Dict{String, Any}("fileName" => data_validation.params["fileName"]),
- recordValues=["rRPositionControl_Elasticity.tCP.p_x",
- "rRPositionControl_Elasticity.tCP.p_y",
- "rRPositionControl_Elasticity.tCP.N"],
- showProgress=true, maxiters=1e7, saveat=data_validation.t, solver=Tsit5());
- else
- LIVE_RESULTS_MESSAGE
- end
-end
-
-# ╔═╡ 51aed933-2067-4ea8-9c2f-9d070692ecfc
-begin
- if LIVE_RESULTS
- result_validation = neuralFMU(x0, (data_validation.t[1], data_validation.t[end]);
- parameters=Dict{String, Any}("fileName" => data_validation.params["fileName"]),
- recordValues=["rRPositionControl_Elasticity.tCP.p_x",
- "rRPositionControl_Elasticity.tCP.p_y",
- "rRPositionControl_Elasticity.tCP.N"],
- showProgress=true, maxiters=1e7, saveat=data_validation.t);
- else
- LIVE_RESULTS_MESSAGE
- end
-end
-
-# ╔═╡ 8d9dc86e-f38b-41b1-80c6-b2ab6f488a3a
-begin
- if LIVE_RESULTS
- md"""
-The loss function value of the FMU on validation data is $(round(loss(fmu_validation, data_validation); digits=6)), of the NeuralFMU it is $(round(loss(result_validation, data_validation); digits=6)).
-"""
- else
- LIVE_RESULTS_MESSAGE
- end
-end
-
-# ╔═╡ 74ef5a39-1dd7-404a-8baf-caa1021d3054
-let
- if LIVE_RESULTS
- fig = plot(; dpi=300, size=(200*3,40*3))
- plotPaths!(fig, data_validation.tcp_px, data_validation.tcp_py, data_validation.tcp_norm_f, label="Data", color=:black, style=:dash)
- plotPaths!(fig, collect(v[1] for v in fmu_validation.values.saveval), collect(v[2] for v in fmu_validation.values.saveval), collect(v[3] for v in fmu_validation.values.saveval), label="FMU", color=:orange)
- plotPaths!(fig, collect(v[1] for v in result_validation.values.saveval), collect(v[2] for v in result_validation.values.saveval), collect(v[3] for v in result_validation.values.saveval), label="NeuralFMU", color=:blue)
- else
- LIVE_RESULTS_MESSAGE
- end
-end
-
-# ╔═╡ 05281c4f-dba8-4070-bce3-dc2f1319902e
-let
- if LIVE_RESULTS
- fig = plot(; dpi=300, size=(35*10,50*10), xlims=(0.188, 0.223), ylims=(-0.025, 0.025))
- plotPaths!(fig, data_validation.tcp_px, data_validation.tcp_py, data_validation.tcp_norm_f, label="Data", color=:black, style=:dash)
- plotPaths!(fig, collect(v[1] for v in fmu_validation.values.saveval), collect(v[2] for v in fmu_validation.values.saveval), collect(v[3] for v in fmu_validation.values.saveval), label="FMU", color=:orange)
- plotPaths!(fig, collect(v[1] for v in result_validation.values.saveval), collect(v[2] for v in result_validation.values.saveval), collect(v[3] for v in result_validation.values.saveval), label="NeuralFMU", color=:blue)
- else
- LIVE_RESULTS_MESSAGE
- end
-end
-
-# ╔═╡ 67cfe7c5-8e62-4bf0-996b-19597d5ad5ef
-let
- if LIVE_RESULTS
- fig = plot(; dpi=300, size=(25*10,50*10), xlims=(0.245, 0.27), ylims=(-0.025, 0.025), legend=:topleft)
- plotPaths!(fig, data_validation.tcp_px, data_validation.tcp_py, data_validation.tcp_norm_f, label="Data", color=:black, style=:dash)
- plotPaths!(fig, collect(v[1] for v in fmu_validation.values.saveval), collect(v[2] for v in fmu_validation.values.saveval), collect(v[3] for v in fmu_validation.values.saveval), label="FMU", color=:orange)
- plotPaths!(fig, collect(v[1] for v in result_validation.values.saveval), collect(v[2] for v in result_validation.values.saveval), collect(v[3] for v in result_validation.values.saveval), label="NeuralFMU", color=:blue)
- else
- LIVE_RESULTS_MESSAGE
- end
-end
-
-# ╔═╡ 88884204-79e4-4412-b861-ebeb5f6f7396
-md"""
-# Conclusion
-Hopefully you got a good first insight in the topic hybrid modeling using FMI and collected your first sense of achievement. Did you find a nice optimum? In case you don't, some rough hyper parameters are given below.
-
-## Hint
-If your results are not *that* promising, here is a set of hyperparameters to check. It is *not* a optimal set of parameters, but a *good* set, so feel free to explore the *best*!
-
-| Parameter | Value |
-| ----- | ----- |
-| eta | 1e-3 |
-| layer count | 3 |
-| layer width | 32 |
-| initial gate opening | 0.2 |
-| batch element length | 0.05s |
-| training steps | 10 000 |
-| additional variables | Joint 1 Angle $br Joint 2 Angle $br TCP velocity x $br TCP velocity y $br TCP nominal force |
-
-## Citation
-If you find this workshop useful for your own work and/or research, please cite our related publication:
-
-Tobias Thummerer, Johannes Stoljar and Lars Mikelsons. 2022. **NeuralFMU: presenting a workflow for integrating hybrid neuralODEs into real-world applications.** Electronics 11, 19, 3202. DOI: 10.3390/electronics11193202
-
-## Acknowlegments
-- the FMU was created using the excellent Modelica library *Servomechanisms* $br (https://github.com/afrhu/Servomechanisms)
-- the linked YouTube video in the introduction is by *Alexandru Babaian* $br (https://www.youtube.com/watch?v=ryIwLLr6yRA)
-"""
-
-# ╔═╡ 00000000-0000-0000-0000-000000000001
-PLUTO_PROJECT_TOML_CONTENTS = """
-[deps]
-FMI = "14a09403-18e3-468f-ad8a-74f8dda2d9ac"
-FMIFlux = "fabad875-0d53-4e47-9446-963b74cae21f"
-FMIZoo = "724179cf-c260-40a9-bd27-cccc6fe2f195"
-PlotlyBase = "a03496cd-edff-5a9b-9e67-9cda94a718b5"
-PlotlyKaleido = "f2990250-8cf9-495f-b13a-cce12b45703c"
-Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80"
-PlutoUI = "7f904dfe-b85e-4ff6-b463-dae2292396a8"
-Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"
-
-[compat]
-FMI = "~0.13.2"
-FMIFlux = "~0.12.0"
-FMIZoo = "~0.3.1"
-PlotlyBase = "~0.8.19"
-PlotlyKaleido = "~2.2.2"
-Plots = "~1.40.0"
-PlutoUI = "~0.7.55"
-"""
-
-# ╔═╡ 00000000-0000-0000-0000-000000000002
-PLUTO_MANIFEST_TOML_CONTENTS = """
-# This file is machine-generated - editing it directly is not advised
-
-julia_version = "1.10.0"
-manifest_format = "2.0"
-project_hash = "6defdc1999c75bd64074163ca49889c34ef37db6"
-
-[[deps.ADTypes]]
-git-tree-sha1 = "41c37aa88889c171f1300ceac1313c06e891d245"
-uuid = "47edcb42-4c32-4615-8424-f2b9edc5f35b"
-version = "0.2.6"
-
-[[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 = "c278dfab760520b8bb7e9511b968bf4ba38b7acc"
-uuid = "6e696c72-6542-2067-7265-42206c756150"
-version = "1.2.3"
-
-[[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.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 = "62e51b39331de8911e4a7ff6f5aaf38a5f4cc0ae"
-uuid = "ec485272-7323-5ecc-a04f-4719b315124d"
-version = "0.2.0"
-
-[[deps.ArrayInterface]]
-deps = ["Adapt", "LinearAlgebra", "Requires", "SparseArrays", "SuiteSparse"]
-git-tree-sha1 = "bbec08a37f8722786d87bedf84eae19c020c4efa"
-uuid = "4fba245c-0d91-5ea0-9b3e-6abc04ee57a9"
-version = "7.7.0"
-
- [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 = "64d582bcb9c93ac741234789eeb4f16812413efb"
-uuid = "4c555306-a7a7-4459-81d9-ec55ddd5c99a"
-version = "1.6.0"
-weakdeps = ["SparseArrays"]
-
- [deps.ArrayLayouts.extensions]
- ArrayLayoutsSparseArraysExt = "SparseArrays"
-
-[[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 = "66771c8d21c8ff5e3a93379480a2307ac36863f7"
-uuid = "13072b0f-2c55-5437-9ae7-d433b7a33950"
-version = "1.0.1"
-
-[[deps.BandedMatrices]]
-deps = ["ArrayLayouts", "FillArrays", "LinearAlgebra", "PrecompileTools"]
-git-tree-sha1 = "3ac52471386dfcc0f6a3c8aeb37ed37c37701128"
-uuid = "aae01518-5342-5314-be14-df237901396f"
-version = "1.4.1"
-weakdeps = ["SparseArrays"]
-
- [deps.BandedMatrices.extensions]
- BandedMatricesSparseArraysExt = "SparseArrays"
-
-[[deps.BangBang]]
-deps = ["Compat", "ConstructionBase", "InitialValues", "LinearAlgebra", "Requires", "Setfield", "Tables"]
-git-tree-sha1 = "7aa7ad1682f3d5754e3491bb59b8103cae28e3a3"
-uuid = "198e06fe-97b7-11e9-32a5-e1d131e6ad66"
-version = "0.3.40"
-
- [deps.BangBang.extensions]
- BangBangChainRulesCoreExt = "ChainRulesCore"
- BangBangDataFramesExt = "DataFrames"
- BangBangStaticArraysExt = "StaticArrays"
- BangBangStructArraysExt = "StructArrays"
- 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"
- 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.BenchmarkTools]]
-deps = ["JSON", "Logging", "Printf", "Profile", "Statistics", "UUIDs"]
-git-tree-sha1 = "f1f03a9fa24271160ed7e73051fba3c1a759b53f"
-uuid = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf"
-version = "1.4.0"
-
-[[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 = "dd234c9a030350d5ff4c45761d6cad0cfb358cb9"
-uuid = "764a87c0-6b3e-53db-9096-fe964310641d"
-version = "5.6.0"
-
- [deps.BoundaryValueDiffEq.extensions]
- BoundaryValueDiffEqODEInterfaceExt = "ODEInterface"
- BoundaryValueDiffEqOrdinaryDiffEqExt = "OrdinaryDiffEq"
-
- [deps.BoundaryValueDiffEq.weakdeps]
- ODEInterface = "54ca160b-1b9f-5127-a996-1867f4bc2a2c"
- OrdinaryDiffEq = "1dea7af3-3e70-54e6-95c3-0bf5283fa5ed"
-
-[[deps.BufferedStreams]]
-git-tree-sha1 = "4ae47f9a4b1dc19897d3743ff13685925c5202ec"
-uuid = "e1450e63-4bb3-523b-b2a4-4ffa8c0fd77d"
-version = "1.2.1"
-
-[[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.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"
-
-[[deps.Calculus]]
-deps = ["LinearAlgebra"]
-git-tree-sha1 = "f641eb0a4f00c343bbc32346e1217b86f3ce9dad"
-uuid = "49dc2e85-a5d0-5ad3-a950-438e2897f1b9"
-version = "0.5.1"
-
-[[deps.Cassette]]
-git-tree-sha1 = "0970356c3bb9113309c74c27c87083cf9c73880a"
-uuid = "7057c7e9-c182-5462-911a-8362d720325c"
-version = "0.3.13"
-
-[[deps.ChainRules]]
-deps = ["Adapt", "ChainRulesCore", "Compat", "Distributed", "GPUArraysCore", "IrrationalConstants", "LinearAlgebra", "Random", "RealDot", "SparseArrays", "SparseInverseSubset", "Statistics", "StructArrays", "SuiteSparse"]
-git-tree-sha1 = "b308c249f38637cc5022c079fe5e19701a160395"
-uuid = "082447d4-558c-5d27-93f4-14fc19e9eca2"
-version = "1.60.0"
-
-[[deps.ChainRulesCore]]
-deps = ["Compat", "LinearAlgebra"]
-git-tree-sha1 = "e0af648f0692ec1691b5d094b8724ba1346281cf"
-uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4"
-version = "1.18.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.CodecBzip2]]
-deps = ["Bzip2_jll", "Libdl", "TranscodingStreams"]
-git-tree-sha1 = "9b1ca1aa6ce3f71b3d1840c538a8210a043625eb"
-uuid = "523fee87-0ab8-5b00-afb7-3ecf72e48cfd"
-version = "0.8.2"
-
-[[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 = "eb7f0f8307f71fac7c606984ea5fb2817275d6e4"
-uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f"
-version = "0.11.4"
-
-[[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.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 = "75bd5b6fc5089df449b5d35fa501c846c9b6549b"
-uuid = "34da2185-b29b-5c13-b0c7-acf172513d20"
-version = "4.12.0"
-weakdeps = ["Dates", "LinearAlgebra"]
-
- [deps.Compat.extensions]
- CompatLinearAlgebraExt = "LinearAlgebra"
-
-[[deps.CompilerSupportLibraries_jll]]
-deps = ["Artifacts", "Libdl"]
-uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae"
-version = "1.0.5+1"
-
-[[deps.CompositionsBase]]
-git-tree-sha1 = "802bb88cd69dfd1509f6670416bd4434015693ad"
-uuid = "a33af91c-f02d-484b-be07-31d278c5ca2b"
-version = "0.1.2"
-
- [deps.CompositionsBase.extensions]
- CompositionsBaseInverseFunctionsExt = "InverseFunctions"
-
- [deps.CompositionsBase.weakdeps]
- InverseFunctions = "3587e190-3f89-42d0-90ee-14403ec27112"
-
-[[deps.ConcreteStructs]]
-git-tree-sha1 = "f749037478283d372048690eb3b5f92a79432b34"
-uuid = "2569d6c7-a4a2-43d3-a901-331e8e4be471"
-version = "0.2.3"
-
-[[deps.ConcurrentUtilities]]
-deps = ["Serialization", "Sockets"]
-git-tree-sha1 = "8cfa272e8bdedfa88b6aefbbca7c19f1befac519"
-uuid = "f0e56b4a-5159-44fe-b623-3e5288b988bb"
-version = "2.3.0"
-
-[[deps.ConstructionBase]]
-deps = ["LinearAlgebra"]
-git-tree-sha1 = "c53fc348ca4d40d7b371e71fd52251839080cbc9"
-uuid = "187b0558-2788-49d3-abe0-74a17ed4e7c9"
-version = "1.5.4"
-
- [deps.ConstructionBase.extensions]
- ConstructionBaseIntervalSetsExt = "IntervalSets"
- ConstructionBaseStaticArraysExt = "StaticArrays"
-
- [deps.ConstructionBase.weakdeps]
- IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953"
- StaticArrays = "90137ffa-7385-5640-81b9-e52037218182"
-
-[[deps.ContextVariablesX]]
-deps = ["Compat", "Logging", "UUIDs"]
-git-tree-sha1 = "25cc3803f1030ab855e383129dcd3dc294e322cc"
-uuid = "6add18c4-b38d-439d-96f6-d6bc489c04c5"
-version = "0.1.3"
-
-[[deps.Contour]]
-git-tree-sha1 = "d05d9e7b7aedff4e5b51a029dced05cfb6125781"
-uuid = "d38c429a-6771-53c6-b99e-75d170b6e991"
-version = "0.6.2"
-
-[[deps.CpuId]]
-deps = ["Markdown"]
-git-tree-sha1 = "fcbb72b032692610bfbdb15018ac16a36cf2e406"
-uuid = "adafc99b-e345-5852-983c-f28acb93d879"
-version = "0.3.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 = "ac67408d9ddf207de5cfa9a97e114352430f01ed"
-uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8"
-version = "0.18.16"
-
-[[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.DefineSingletons]]
-git-tree-sha1 = "0fba8b706d0178b4dc7fd44a96a92382c9065c2c"
-uuid = "244e2a9f-e319-4986-a169-4d1fe445cd52"
-version = "0.1.2"
-
-[[deps.DelayDiffEq]]
-deps = ["ArrayInterface", "DataStructures", "DiffEqBase", "LinearAlgebra", "Logging", "OrdinaryDiffEq", "Printf", "RecursiveArrayTools", "Reexport", "SciMLBase", "SimpleNonlinearSolve", "SimpleUnPack"]
-git-tree-sha1 = "6725c56e3e3d563e37d8fd5e6c5eb66ac19321fd"
-uuid = "bcd4f6db-9728-5f36-b5f7-82caef46ccdb"
-version = "5.46.0"
-
-[[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 = "6af33c2eb7478db06bcf5c810e6f3dda53aac2ac"
-uuid = "2b5f629d-d688-5b77-993f-72d75c75574e"
-version = "6.146.0"
-
- [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 = "319377c927a4aa1f491228b2ac23f3554a3497c6"
-uuid = "77a26b50-5914-5dd7-bc55-306e6241c503"
-version = "5.20.0"
-weakdeps = ["ReverseDiff"]
-
- [deps.DiffEqNoiseProcess.extensions]
- DiffEqNoiseProcessReverseDiffExt = "ReverseDiff"
-
-[[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.DifferentiableEigen]]
-deps = ["ForwardDiffChainRules", "LinearAlgebra", "ReverseDiff"]
-git-tree-sha1 = "6370fca72115d68efc500b3f49ecd627b715fda8"
-uuid = "73a20539-4e65-4dcb-a56d-dc20f210a01b"
-version = "0.2.0"
-
-[[deps.DifferentiableFlatten]]
-deps = ["ChainRulesCore", "LinearAlgebra", "NamedTupleTools", "OrderedCollections", "Requires", "SparseArrays"]
-git-tree-sha1 = "f4dc2c1d994c7e2e602692a7dadd2ac79212c3a9"
-uuid = "c78775a3-ee38-4681-b694-0504db4f5dc7"
-version = "0.1.1"
-
-[[deps.DifferentialEquations]]
-deps = ["BoundaryValueDiffEq", "DelayDiffEq", "DiffEqBase", "DiffEqCallbacks", "DiffEqNoiseProcess", "JumpProcesses", "LinearAlgebra", "LinearSolve", "NonlinearSolve", "OrdinaryDiffEq", "Random", "RecursiveArrayTools", "Reexport", "SciMLBase", "SteadyStateDiffEq", "StochasticDiffEq", "Sundials"]
-git-tree-sha1 = "8864b6a953eeba7890d23258aca468d90ca73fd6"
-uuid = "0c46a032-eb83-5123-abaf-570d42b7fbaa"
-version = "7.12.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.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.EllipsisNotation]]
-deps = ["StaticArrayInterface"]
-git-tree-sha1 = "3507300d4343e8e4ad080ad24e335274c2e297a9"
-uuid = "da5c29d0-fa7d-589e-88eb-ea29b0a81949"
-version = "1.8.0"
-
-[[deps.EnumX]]
-git-tree-sha1 = "bdb1942cd4c45e3c678fd11569d5cccd80976237"
-uuid = "4e289a0a-7415-4d19-859d-a7e5c4648b56"
-version = "1.0.4"
-
-[[deps.Enzyme]]
-deps = ["CEnum", "EnzymeCore", "Enzyme_jll", "GPUCompiler", "LLVM", "Libdl", "LinearAlgebra", "ObjectFile", "Preferences", "Printf", "Random"]
-git-tree-sha1 = "05edd4201c72e06ec0102c7c47178150c0dca074"
-uuid = "7da242da-08ed-463a-9acd-ee780be4f1d9"
-version = "0.11.14"
-
-[[deps.EnzymeCore]]
-git-tree-sha1 = "59c44d8fbc651c0395d8a6eda64b05ce316f58b4"
-uuid = "f151be2c-9106-41f4-ab19-57ee4f262869"
-version = "0.6.5"
-weakdeps = ["Adapt"]
-
- [deps.EnzymeCore.extensions]
- AdaptExt = "Adapt"
-
-[[deps.Enzyme_jll]]
-deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl", "TOML"]
-git-tree-sha1 = "95b4c72f71010dcc05594d3424d1642ea74eca60"
-uuid = "7cc45869-7501-5eee-bdea-0790c847d4ef"
-version = "0.0.98+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 = "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.EzXML]]
-deps = ["Printf", "XML2_jll"]
-git-tree-sha1 = "380053d61bb9064d6aa4a9777413b40429c79901"
-uuid = "8f5d6c58-4d21-5cfd-889c-e3ad7ee6a615"
-version = "1.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.FLoops]]
-deps = ["BangBang", "Compat", "FLoopsBase", "InitialValues", "JuliaVariables", "MLStyle", "Serialization", "Setfield", "Transducers"]
-git-tree-sha1 = "ffb97765602e3cbe59a0589d237bf07f245a8576"
-uuid = "cc61a311-1640-44b5-9fba-1b764f453329"
-version = "0.2.1"
-
-[[deps.FLoopsBase]]
-deps = ["ContextVariablesX"]
-git-tree-sha1 = "656f7a6859be8673bf1f35da5670246b923964f7"
-uuid = "b9860ae5-e623-471e-878b-f6a53c775ea6"
-version = "0.1.1"
-
-[[deps.FMI]]
-deps = ["DifferentialEquations", "Downloads", "FMIExport", "FMIImport", "LinearAlgebra", "ProgressMeter", "Requires", "ThreadPools"]
-git-tree-sha1 = "3365c6e860e758d8bb9e183ded1e7d7ec73a242b"
-uuid = "14a09403-18e3-468f-ad8a-74f8dda2d9ac"
-version = "0.13.2"
-
-[[deps.FMICore]]
-deps = ["ChainRulesCore", "Dates", "Requires"]
-git-tree-sha1 = "7828b24aaae3475051be6365d4c80f4afc24ee29"
-uuid = "8af89139-c281-408e-bce2-3005eb87462f"
-version = "0.20.0"
-
-[[deps.FMIExport]]
-deps = ["Dates", "EzXML", "FMICore", "UUIDs"]
-git-tree-sha1 = "daf601e31aeb73fb0010fe7ff942367bc75d5088"
-uuid = "31b88311-cab6-44ed-ba9c-fe5a9abbd67a"
-version = "0.3.2"
-
-[[deps.FMIFlux]]
-deps = ["Colors", "DifferentiableEigen", "DifferentialEquations", "FMIImport", "FMISensitivity", "Flux", "Optim", "Printf", "ProgressMeter", "Requires", "Statistics", "ThreadPools"]
-git-tree-sha1 = "7cb8226af3635ac21ed1ecbd9986ace85ab36c3d"
-uuid = "fabad875-0d53-4e47-9446-963b74cae21f"
-version = "0.12.0"
-
-[[deps.FMIImport]]
-deps = ["Downloads", "EzXML", "FMICore", "Libdl", "RelocatableFolders", "ZipFile"]
-git-tree-sha1 = "b5b245bf7f1fc044ad16b016c7e2f08a2333a6f1"
-uuid = "9fcbc62e-52a0-44e9-a616-1359a0008194"
-version = "0.16.4"
-
-[[deps.FMISensitivity]]
-deps = ["FMICore", "ForwardDiffChainRules", "SciMLSensitivity"]
-git-tree-sha1 = "43b9b68262af5d3602c9f153e978aff00b849569"
-uuid = "3e748fe5-cd7f-4615-8419-3159287187d2"
-version = "0.1.4"
-
-[[deps.FMIZoo]]
-deps = ["Downloads", "EzXML", "FilePaths", "FilePathsBase", "Glob", "Interpolations", "MAT", "Optim", "Requires", "ZipFile"]
-git-tree-sha1 = "9cd2658d5b3ff9e6cedcf29a08e4a7225570cba3"
-uuid = "724179cf-c260-40a9-bd27-cccc6fe2f195"
-version = "0.3.1"
-
-[[deps.FastAlmostBandedMatrices]]
-deps = ["ArrayInterface", "ArrayLayouts", "BandedMatrices", "ConcreteStructs", "LazyArrays", "LinearAlgebra", "MatrixFactorizations", "PrecompileTools", "Reexport"]
-git-tree-sha1 = "178316d87f883f0702e79d9c83a8049484c9f619"
-uuid = "9d29842c-ecb8-4973-b1e9-a27b1157504e"
-version = "0.1.0"
-
-[[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 = "d576a29bf8bcabf4b1deb9abe88a3d7f78306ab5"
-uuid = "29a986be-02c6-4525-aec4-84b980013641"
-version = "2.0.1"
-
-[[deps.FilePaths]]
-deps = ["FilePathsBase", "MacroTools", "Reexport", "Requires"]
-git-tree-sha1 = "919d9412dbf53a2e6fe74af62a73ceed0bce0629"
-uuid = "8fc22ac5-c921-52a6-82fd-178b2807b824"
-version = "0.8.3"
-
-[[deps.FilePathsBase]]
-deps = ["Compat", "Dates", "Mmap", "Printf", "Test", "UUIDs"]
-git-tree-sha1 = "9f00e42f8d99fdde64d40c8ea5d14269a2e2c1aa"
-uuid = "48062228-2e41-5def-b9a4-89aafe57970f"
-version = "0.9.21"
-
-[[deps.FileWatching]]
-uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee"
-
-[[deps.FillArrays]]
-deps = ["LinearAlgebra", "Random"]
-git-tree-sha1 = "5b93957f6dcd33fc343044af3d48c215be2562f1"
-uuid = "1a297f60-69ca-5386-bcde-b61e274b549b"
-version = "1.9.3"
-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.Flux]]
-deps = ["Adapt", "ChainRulesCore", "Compat", "Functors", "LinearAlgebra", "MLUtils", "MacroTools", "NNlib", "OneHotArrays", "Optimisers", "Preferences", "ProgressLogging", "Random", "Reexport", "SparseArrays", "SpecialFunctions", "Statistics", "Zygote"]
-git-tree-sha1 = "39a9e46b4e92d5b56c0712adeb507555a2327240"
-uuid = "587475ba-b771-5e3f-ad9e-33799f191a9c"
-version = "0.14.11"
-
- [deps.Flux.extensions]
- FluxAMDGPUExt = "AMDGPU"
- FluxCUDAExt = "CUDA"
- FluxCUDAcuDNNExt = ["CUDA", "cuDNN"]
- FluxMetalExt = "Metal"
-
- [deps.Flux.weakdeps]
- AMDGPU = "21141c5a-9bdb-4563-92ae-f87d6854732e"
- CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba"
- Metal = "dde4c033-4e86-420c-a63e-0dd931031962"
- cuDNN = "02a925ec-e4fe-4b08-9a7e-0d78e3d38ccd"
-
-[[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.Formatting]]
-deps = ["Printf"]
-git-tree-sha1 = "8339d61043228fdd3eb658d86c926cb282ae72a8"
-uuid = "59287772-0a20-5a39-b81b-1366585eb4c0"
-version = "0.4.2"
-
-[[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.ForwardDiffChainRules]]
-deps = ["ChainRulesCore", "DifferentiableFlatten", "ForwardDiff", "MacroTools"]
-git-tree-sha1 = "088aae09132ee3a8b351bec6569e83985e5b961e"
-uuid = "c9556dd2-1aed-4cfe-8560-1557cf593001"
-version = "0.2.1"
-
-[[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.FunctionProperties]]
-deps = ["Cassette", "DiffRules"]
-git-tree-sha1 = "663f3171531d52f9a68c089aa89de282001b3d5b"
-uuid = "f62d2435-5019-4c03-9749-2d4c77af0cbc"
-version = "0.1.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 = "9a68d75d466ccc1218d0552a8e1631151c569545"
-uuid = "d9f16b24-f501-4c13-a1f2-28368ffc5196"
-version = "0.4.5"
-
-[[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.GPUArrays]]
-deps = ["Adapt", "GPUArraysCore", "LLVM", "LinearAlgebra", "Printf", "Random", "Reexport", "Serialization", "Statistics"]
-git-tree-sha1 = "85d7fb51afb3def5dcb85ad31c3707795c8bccc1"
-uuid = "0c68f7d7-f131-5f86-a1c3-88cf8149b2d7"
-version = "9.1.0"
-
-[[deps.GPUArraysCore]]
-deps = ["Adapt"]
-git-tree-sha1 = "2d6ca471a6c7b536127afccfa7564b5b39227fe0"
-uuid = "46192b85-c4d5-4398-a991-12ede77f4527"
-version = "0.1.5"
-
-[[deps.GPUCompiler]]
-deps = ["ExprTools", "InteractiveUtils", "LLVM", "Libdl", "Logging", "Scratch", "TimerOutputs", "UUIDs"]
-git-tree-sha1 = "a846f297ce9d09ccba02ead0cae70690e072a119"
-uuid = "61eb1bfa-7361-4325-ad38-22787b887f55"
-version = "0.25.0"
-
-[[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 = "3458564589be207fa6a77dbbf8b97674c9836aab"
-uuid = "28b8d3ca-fb5f-59d9-8090-bfdbd6d07a71"
-version = "0.73.2"
-
-[[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 = "77f81da2964cc9fa7c0127f941e8bce37f7f1d70"
-uuid = "d2c73de3-f751-5644-a686-071e5b155ba9"
-version = "0.73.2+0"
-
-[[deps.GenericSchur]]
-deps = ["LinearAlgebra", "Printf"]
-git-tree-sha1 = "fb69b2a645fa69ba5f474af09221b9308b160ce6"
-uuid = "c145ed77-6b09-5dd9-b285-bf645a82121e"
-version = "0.5.3"
-
-[[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 = "e94c92c7bf4819685eb80186d51c43e71d4afa17"
-uuid = "7746bdde-850d-59dc-9ae8-88ece973131d"
-version = "2.76.5+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 = "899050ace26649433ef1af25bc17a815b3db52b7"
-uuid = "86223c79-3864-5bf0-83f7-82e725a168b6"
-version = "1.9.0"
-
-[[deps.Grisu]]
-git-tree-sha1 = "53bb909d1151e57e2484c3d1b53e19552b887fb2"
-uuid = "42e2da0e-8278-4e71-bc24-59509adca0fe"
-version = "1.0.2"
-
-[[deps.HDF5]]
-deps = ["Compat", "HDF5_jll", "Libdl", "MPIPreferences", "Mmap", "Preferences", "Printf", "Random", "Requires", "UUIDs"]
-git-tree-sha1 = "26407bd1c60129062cec9da63dc7d08251544d53"
-uuid = "f67ccb44-e63f-5c2f-98bd-6dc0ccc4ba2f"
-version = "0.17.1"
-
- [deps.HDF5.extensions]
- MPIExt = "MPI"
-
- [deps.HDF5.weakdeps]
- MPI = "da04e1cc-30fd-572f-bb4f-1f8673147195"
-
-[[deps.HDF5_jll]]
-deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LLVMOpenMP_jll", "LazyArtifacts", "LibCURL_jll", "Libdl", "MPICH_jll", "MPIPreferences", "MPItrampoline_jll", "MicrosoftMPI_jll", "OpenMPI_jll", "OpenSSL_jll", "TOML", "Zlib_jll", "libaec_jll"]
-git-tree-sha1 = "38c8874692d48d5440d5752d6c74b0c6b0b60739"
-uuid = "0234f1f7-429e-5d53-9886-15a909be8d59"
-version = "1.14.2+1"
-
-[[deps.HTTP]]
-deps = ["Base64", "CodecZlib", "ConcurrentUtilities", "Dates", "ExceptionUnwrapping", "Logging", "LoggingExtras", "MbedTLS", "NetworkOptions", "OpenSSL", "Random", "SimpleBufferStream", "Sockets", "URIs", "UUIDs"]
-git-tree-sha1 = "abbbb9ec3afd783a7cbd82ef01dcd088ea051398"
-uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3"
-version = "1.10.1"
-
-[[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.Hwloc_jll]]
-deps = ["Artifacts", "JLLWrappers", "Libdl"]
-git-tree-sha1 = "ca0f6bf568b4bfc807e7537f081c81e35ceca114"
-uuid = "e33a78d0-f292-5ffc-b300-72abe9b543c8"
-version = "2.10.0+0"
-
-[[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.IRTools]]
-deps = ["InteractiveUtils", "MacroTools", "Test"]
-git-tree-sha1 = "5d8c5713f38f7bc029e26627b687710ba406d0dd"
-uuid = "7869d1d1-7146-5819-86e3-90919afe41df"
-version = "0.4.12"
-
-[[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.InitialValues]]
-git-tree-sha1 = "4da0f88e9a39111c2fa3add390ab15f3a44f3ca3"
-uuid = "22cec73e-a1b8-11e9-2c92-598750a2cf9c"
-version = "0.3.1"
-
-[[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.Interpolations]]
-deps = ["Adapt", "AxisAlgorithms", "ChainRulesCore", "LinearAlgebra", "OffsetArrays", "Random", "Ratios", "Requires", "SharedArrays", "SparseArrays", "StaticArrays", "WoodburyMatrices"]
-git-tree-sha1 = "721ec2cf720536ad005cb38f50dbba7b02419a15"
-uuid = "a98d9a8b-a2ab-59e6-89dd-64a1c18fca59"
-version = "0.14.7"
-
-[[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 = "60b1194df0a3298f460063de985eae7b01bc011a"
-uuid = "aacddb02-875f-59d6-b918-886e6ef4fbf8"
-version = "3.0.1+0"
-
-[[deps.JuliaVariables]]
-deps = ["MLStyle", "NameResolution"]
-git-tree-sha1 = "49fb3cb53362ddadb4415e9b73926d6b40709e70"
-uuid = "b14d175d-62b4-44ba-8fb7-3064adc8c3ec"
-version = "0.2.4"
-
-[[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.Kaleido_jll]]
-deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
-git-tree-sha1 = "43032da5832754f58d14a91ffbe86d5f176acda9"
-uuid = "f7e6163d-2fa5-5f23-b69c-1db539e41963"
-version = "0.2.1+0"
-
-[[deps.KernelAbstractions]]
-deps = ["Adapt", "Atomix", "InteractiveUtils", "LinearAlgebra", "MacroTools", "PrecompileTools", "Requires", "SparseArrays", "StaticArrays", "UUIDs", "UnsafeAtomics", "UnsafeAtomicsLLVM"]
-git-tree-sha1 = "4e0cb2f5aad44dcfdc91088e85dee4ecb22c791c"
-uuid = "63c18a36-062a-441e-b654-da1e3ab1ce7c"
-version = "0.9.16"
-weakdeps = ["EnzymeCore"]
-
- [deps.KernelAbstractions.extensions]
- EnzymeExt = "EnzymeCore"
-
-[[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.LLVM]]
-deps = ["CEnum", "LLVMExtra_jll", "Libdl", "Preferences", "Printf", "Requires", "Unicode"]
-git-tree-sha1 = "cb4619f7353fc62a1a22ffa3d7ed9791cfb47ad8"
-uuid = "929cbde3-209d-540e-8aea-75f648917ca0"
-version = "6.4.2"
-
- [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 = "98eaee04d96d973e79c25d49167668c5c8fb50e2"
-uuid = "dad2f222-ce93-54a1-a47d-0025e8a3acab"
-version = "0.0.27+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.Latexify]]
-deps = ["Formatting", "InteractiveUtils", "LaTeXStrings", "MacroTools", "Markdown", "OrderedCollections", "Printf", "Requires"]
-git-tree-sha1 = "f428ae552340899a935973270b8d98e5a31c49fe"
-uuid = "23fbe1c1-3f47-55db-b15f-69d7ec21a316"
-version = "0.16.1"
-
- [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 = "9cfca23ab83b0dfac93cb1a1ef3331ab9fe596a5"
-uuid = "5078a376-72f3-5289-bfd5-ec5146d43c02"
-version = "1.8.3"
-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.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", "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", "Pkg"]
-git-tree-sha1 = "9c30530bf0effd46e15e0fdcf2b8636e78cbbd73"
-uuid = "4b2f31a3-9ecc-558c-b454-b3730dcb73e9"
-version = "2.35.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", "Pkg"]
-git-tree-sha1 = "7f3efec06033682db852f8b3bc3c1d2b0a0ab066"
-uuid = "38a345b3-de98-5d2b-a5d3-14cd9215e700"
-version = "2.36.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 = "7d6dd4e9212aebaeed356de34ccf262a3cd415aa"
-uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688"
-version = "0.3.26"
-
- [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 = "0f5648fbae0d015e3abe5867bca2b362f67a5894"
-uuid = "bdcacae8-1622-11e9-2a5c-532679323890"
-version = "0.12.166"
-weakdeps = ["ChainRulesCore", "ForwardDiff", "SpecialFunctions"]
-
- [deps.LoopVectorization.extensions]
- ForwardDiffExt = ["ChainRulesCore", "ForwardDiff"]
- SpecialFunctionsExt = "SpecialFunctions"
-
-[[deps.MAT]]
-deps = ["BufferedStreams", "CodecZlib", "HDF5", "SparseArrays"]
-git-tree-sha1 = "ed1cf0a322d78cee07718bed5fd945e2218c35a1"
-uuid = "23992714-dd62-5051-b70f-ba57cb901cac"
-version = "0.10.6"
-
-[[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"]
-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.MLUtils]]
-deps = ["ChainRulesCore", "Compat", "DataAPI", "DelimitedFiles", "FLoops", "NNlib", "Random", "ShowCases", "SimpleTraits", "Statistics", "StatsBase", "Tables", "Transducers"]
-git-tree-sha1 = "b45738c2e3d0d402dffa32b2c1654759a2ac35a4"
-uuid = "f1d291b0-491e-4a28-83b9-f70985020b54"
-version = "0.4.4"
-
-[[deps.MPICH_jll]]
-deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "MPIPreferences", "TOML"]
-git-tree-sha1 = "2ee75365ca243c1a39d467e35ffd3d4d32eef11e"
-uuid = "7cb0a576-ebde-5e09-9194-50597f1243b4"
-version = "4.1.2+1"
-
-[[deps.MPIPreferences]]
-deps = ["Libdl", "Preferences"]
-git-tree-sha1 = "8f6af051b9e8ec597fa09d8885ed79fd582f33c9"
-uuid = "3da0fdf6-3ccc-4f1b-acd9-58baa6c99267"
-version = "0.1.10"
-
-[[deps.MPItrampoline_jll]]
-deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "MPIPreferences", "TOML"]
-git-tree-sha1 = "8eeb3c73bbc0ca203d0dc8dad4008350bbe5797b"
-uuid = "f1f71cc9-e9ae-5b93-9b94-4fe0e1ad3748"
-version = "5.3.1+1"
-
-[[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.MathOptInterface]]
-deps = ["BenchmarkTools", "CodecBzip2", "CodecZlib", "DataStructures", "ForwardDiff", "JSON", "LinearAlgebra", "MutableArithmetics", "NaNMath", "OrderedCollections", "PrecompileTools", "Printf", "SparseArrays", "SpecialFunctions", "Test", "Unicode"]
-git-tree-sha1 = "8b40681684df46785a0012d352982e22ac3be59e"
-uuid = "b8f27783-ece8-5eb3-8dc8-9495eed66fee"
-version = "1.25.2"
-
-[[deps.MatrixFactorizations]]
-deps = ["ArrayLayouts", "LinearAlgebra", "Printf", "Random"]
-git-tree-sha1 = "78f6e33434939b0ac9ba1df81e6d005ee85a7396"
-uuid = "a3b82374-2e81-5b9e-98ce-41277c0e4c87"
-version = "2.1.0"
-
-[[deps.MaybeInplace]]
-deps = ["ArrayInterface", "LinearAlgebra", "MacroTools", "SparseArrays"]
-git-tree-sha1 = "a85c6a98c9e5a2a7046bc1bb89f28a3241e1de4d"
-uuid = "bb5d69b7-63fc-4a16-80bd-7e42200c7bdb"
-version = "0.1.1"
-
-[[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 = ["BangBang", "InitialValues", "Setfield"]
-git-tree-sha1 = "629afd7d10dbc6935ec59b32daeb33bc4460a42e"
-uuid = "128add7d-3638-4c79-886c-908ea0c25c34"
-version = "0.1.4"
-
-[[deps.MicrosoftMPI_jll]]
-deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
-git-tree-sha1 = "b01beb91d20b0d1312a9471a36017b5b339d26de"
-uuid = "9237b28f-5490-5468-be7b-bb81f5f5e6cf"
-version = "10.1.4+1"
-
-[[deps.Missings]]
-deps = ["DataAPI"]
-git-tree-sha1 = "f66bdc5de519e8f8ae43bdc598782d35a25b1272"
-uuid = "e1d29d7a-bbdc-5cf2-9ac0-f12de2c33e28"
-version = "1.1.0"
-
-[[deps.Mmap]]
-uuid = "a63ad114-7e13-5084-954f-fe012c677804"
-
-[[deps.MozillaCACerts_jll]]
-uuid = "14a3606d-f60d-562e-9121-12d972cd8159"
-version = "2023.1.10"
-
-[[deps.MuladdMacro]]
-git-tree-sha1 = "cac9cc5499c25554cba55cd3c30543cff5ca4fab"
-uuid = "46d2c3a1-f734-5fdb-9937-b9b9aeba4221"
-version = "0.2.4"
-
-[[deps.MutableArithmetics]]
-deps = ["LinearAlgebra", "SparseArrays", "Test"]
-git-tree-sha1 = "806eea990fb41f9b36f1253e5697aa645bf6a9f8"
-uuid = "d8a4904e-b15c-11e9-3269-09a3773c0cb0"
-version = "1.4.0"
-
-[[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.NNlib]]
-deps = ["Adapt", "Atomix", "ChainRulesCore", "GPUArraysCore", "KernelAbstractions", "LinearAlgebra", "Pkg", "Random", "Requires", "Statistics"]
-git-tree-sha1 = "d2811b435d2f571bdfdfa644bb806a66b458e186"
-uuid = "872c559c-99b0-510c-b3b7-b6c96a88d5cd"
-version = "0.9.11"
-
- [deps.NNlib.extensions]
- NNlibAMDGPUExt = "AMDGPU"
- NNlibCUDACUDNNExt = ["CUDA", "cuDNN"]
- NNlibCUDAExt = "CUDA"
- NNlibEnzymeCoreExt = "EnzymeCore"
-
- [deps.NNlib.weakdeps]
- AMDGPU = "21141c5a-9bdb-4563-92ae-f87d6854732e"
- CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba"
- EnzymeCore = "f151be2c-9106-41f4-ab19-57ee4f262869"
- 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.NameResolution]]
-deps = ["PrettyPrint"]
-git-tree-sha1 = "1a0fa0e9613f46c9b8c11eee38ebb4f590013c5e"
-uuid = "71a1bf82-56d0-4bbc-8a3c-48b961074391"
-version = "0.1.5"
-
-[[deps.NamedTupleTools]]
-git-tree-sha1 = "90914795fc59df44120fe3fff6742bb0d7adb1d0"
-uuid = "d9ec5142-1e00-5aa0-9d6a-321866360f50"
-version = "0.14.3"
-
-[[deps.NetworkOptions]]
-uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908"
-version = "1.2.0"
-
-[[deps.NonlinearSolve]]
-deps = ["ADTypes", "ArrayInterface", "ConcreteStructs", "DiffEqBase", "FastBroadcast", "FastClosures", "FiniteDiff", "ForwardDiff", "LazyArrays", "LineSearches", "LinearAlgebra", "LinearSolve", "MaybeInplace", "PrecompileTools", "Preferences", "Printf", "RecursiveArrayTools", "Reexport", "SciMLBase", "SimpleNonlinearSolve", "SparseArrays", "SparseDiffTools", "StaticArraysCore", "TimerOutputs"]
-git-tree-sha1 = "323d2a61f4adc4dfe404bf332b59690253b4f4f2"
-uuid = "8913a72c-1f9b-4ce2-8d82-65094dcecaec"
-version = "3.5.3"
-
- [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.ObjectFile]]
-deps = ["Reexport", "StructIO"]
-git-tree-sha1 = "195e0a19842f678dd3473ceafbe9d82dfacc583c"
-uuid = "d8793406-e978-5875-9003-1fc021f44a92"
-version = "0.4.1"
-
-[[deps.OffsetArrays]]
-git-tree-sha1 = "6a731f2b5c03157418a20c12195eb4b74c8f8621"
-uuid = "6fe1bfb0-de20-5000-8ca7-80f57d26f881"
-version = "1.13.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.OneHotArrays]]
-deps = ["Adapt", "ChainRulesCore", "Compat", "GPUArraysCore", "LinearAlgebra", "NNlib"]
-git-tree-sha1 = "963a3f28a2e65bb87a68033ea4a616002406037d"
-uuid = "0b1bfda6-eb8a-41d2-88d8-f5af5cad476f"
-version = "0.2.5"
-
-[[deps.OpenBLAS_jll]]
-deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"]
-uuid = "4536629a-c528-5b80-bd46-f80d51c5b363"
-version = "0.3.23+2"
-
-[[deps.OpenLibm_jll]]
-deps = ["Artifacts", "Libdl"]
-uuid = "05823500-19ac-5b8b-9628-191a04bc5112"
-version = "0.8.1+2"
-
-[[deps.OpenMPI_jll]]
-deps = ["Artifacts", "CompilerSupportLibraries_jll", "Hwloc_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "MPIPreferences", "PMIx_jll", "TOML", "Zlib_jll", "libevent_jll", "prrte_jll"]
-git-tree-sha1 = "1d1421618bab0e820bdc7ae1a2b46ce576981273"
-uuid = "fe0851c0-eecd-5654-98d4-656369965a5c"
-version = "5.0.1+0"
-
-[[deps.OpenSSL]]
-deps = ["BitFlags", "Dates", "MozillaCACerts_jll", "OpenSSL_jll", "Sockets"]
-git-tree-sha1 = "51901a49222b09e3743c65b8847687ae5fc78eb2"
-uuid = "4d8831e6-92b7-49fb-bdf8-b643e874388c"
-version = "1.4.1"
-
-[[deps.OpenSSL_jll]]
-deps = ["Artifacts", "JLLWrappers", "Libdl"]
-git-tree-sha1 = "60e3045590bd104a16fefb12836c00c0ef8c7f8c"
-uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95"
-version = "3.0.13+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.Optim]]
-deps = ["Compat", "FillArrays", "ForwardDiff", "LineSearches", "LinearAlgebra", "MathOptInterface", "NLSolversBase", "NaNMath", "Parameters", "PositiveFactorizations", "Printf", "SparseArrays", "StatsBase"]
-git-tree-sha1 = "47fea72de134f75b105a5d4a1abe5c6aec89d390"
-uuid = "429524aa-4258-5aef-a3af-852621145aeb"
-version = "1.9.1"
-
-[[deps.Optimisers]]
-deps = ["ChainRulesCore", "Functors", "LinearAlgebra", "Random", "Statistics"]
-git-tree-sha1 = "34205b1204cc83c43cd9cfe53ffbd3b310f6e8c5"
-uuid = "3bd65402-5787-11e9-1adc-39752487f4e2"
-version = "0.3.1"
-
-[[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", "MacroTools", "MuladdMacro", "NonlinearSolve", "Polyester", "PreallocationTools", "PrecompileTools", "Preferences", "RecursiveArrayTools", "Reexport", "SciMLBase", "SciMLOperators", "SimpleNonlinearSolve", "SimpleUnPack", "SparseArrays", "SparseDiffTools", "StaticArrayInterface", "StaticArrays", "TruncatedStacktraces"]
-git-tree-sha1 = "c99ec5e4da0dabe068e5f6af1e157e70f233996b"
-uuid = "1dea7af3-3e70-54e6-95c3-0bf5283fa5ed"
-version = "6.70.1"
-
-[[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.PMIx_jll]]
-deps = ["Artifacts", "Hwloc_jll", "JLLWrappers", "Libdl", "Zlib_jll", "libevent_jll"]
-git-tree-sha1 = "8b3b19351fa24791f94d7ae85faf845ca1362541"
-uuid = "32165bc3-0280-59bc-8c0b-c33b6203efab"
-version = "4.2.7+0"
-
-[[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.10.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 = "862942baf5663da528f66d24996eb6da85218e76"
-uuid = "995b91a9-d308-5afd-9ec6-746e21dbc043"
-version = "1.4.0"
-
-[[deps.PlotlyBase]]
-deps = ["ColorSchemes", "Dates", "DelimitedFiles", "DocStringExtensions", "JSON", "LaTeXStrings", "Logging", "Parameters", "Pkg", "REPL", "Requires", "Statistics", "UUIDs"]
-git-tree-sha1 = "56baf69781fc5e61607c3e46227ab17f7040ffa2"
-uuid = "a03496cd-edff-5a9b-9e67-9cda94a718b5"
-version = "0.8.19"
-
-[[deps.PlotlyKaleido]]
-deps = ["Base64", "JSON", "Kaleido_jll"]
-git-tree-sha1 = "de542d5de05f9db307309d4ce73346decaa123bb"
-uuid = "f2990250-8cf9-495f-b13a-cce12b45703c"
-version = "2.2.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", "UUIDs", "UnicodeFun", "UnitfulLatexify", "Unzip"]
-git-tree-sha1 = "38a748946dca52a622e79eea6ed35c6737499109"
-uuid = "91a5bcdd-55d7-5caf-9e0b-520d859cae80"
-version = "1.40.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 = "68723afdb616445c6caaef6255067a8339f91325"
-uuid = "7f904dfe-b85e-4ff6-b463-dae2292396a8"
-version = "0.7.55"
-
-[[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 = "fca25670784a1ae44546bcb17288218310af2778"
-uuid = "f517fe37-dbe3-4b94-8317-1923a5111588"
-version = "0.7.9"
-
-[[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"]
-git-tree-sha1 = "64bb68f76f789f5fe5930a80af310f19cdafeaed"
-uuid = "d236fae5-4411-538c-8e31-a6e3d9e00b46"
-version = "0.4.17"
-weakdeps = ["ReverseDiff"]
-
- [deps.PreallocationTools.extensions]
- PreallocationToolsReverseDiffExt = "ReverseDiff"
-
-[[deps.PrecompileTools]]
-deps = ["Preferences"]
-git-tree-sha1 = "03b4c25b43cb84cee5c90aa9b5ea0a78fd848d2f"
-uuid = "aea7be01-6a6a-4083-8856-8a6e6704d82a"
-version = "1.2.0"
-
-[[deps.Preferences]]
-deps = ["TOML"]
-git-tree-sha1 = "00805cd429dcb4870060ff49ef443486c262e38e"
-uuid = "21216c6a-2e73-6563-6e65-726566657250"
-version = "1.4.1"
-
-[[deps.PrettyPrint]]
-git-tree-sha1 = "632eb4abab3449ab30c5e1afaa874f0b98b586e4"
-uuid = "8162dcfd-2161-5ef2-ae6c-7681170c5f98"
-version = "0.2.0"
-
-[[deps.Printf]]
-deps = ["Unicode"]
-uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7"
-
-[[deps.Profile]]
-deps = ["Printf"]
-uuid = "9abbd945-dff8-562f-b5e8-e1ebf5ef1b79"
-
-[[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 = "00099623ffee15972c16111bcf84c58a0051257c"
-uuid = "92933f4c-e287-5a05-a399-4b506db050ca"
-version = "1.9.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.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"]
-uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"
-
-[[deps.Random123]]
-deps = ["Random", "RandomNumbers"]
-git-tree-sha1 = "c860e84651f58ce240dd79e5d9e055d55234c35a"
-uuid = "74087812-796a-5b5d-8853-05524746bad3"
-version = "1.6.2"
-
-[[deps.RandomNumbers]]
-deps = ["Random", "Requires"]
-git-tree-sha1 = "043da614cc7e95c703498a491e2c21f58a2b8111"
-uuid = "e6cf234a-135c-5ec9-84dd-332b85af5143"
-version = "1.5.3"
-
-[[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", "SparseArrays", "StaticArraysCore", "Statistics", "SymbolicIndexingInterface", "Tables"]
-git-tree-sha1 = "2bd309f5171a628efdf5309361cd8a779b9e63a9"
-uuid = "731186ca-8d62-57ce-b412-fbd966d074cd"
-version = "3.8.0"
-
- [deps.RecursiveArrayTools.extensions]
- RecursiveArrayToolsFastBroadcastExt = "FastBroadcast"
- RecursiveArrayToolsForwardDiffExt = "ForwardDiff"
- RecursiveArrayToolsMeasurementsExt = "Measurements"
- RecursiveArrayToolsMonteCarloMeasurementsExt = "MonteCarloMeasurements"
- RecursiveArrayToolsReverseDiffExt = ["ReverseDiff", "Zygote"]
- 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"
- Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c"
- Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f"
-
-[[deps.RecursiveFactorization]]
-deps = ["LinearAlgebra", "LoopVectorization", "Polyester", "PrecompileTools", "StrideArraysCore", "TriangularSolve"]
-git-tree-sha1 = "8bc86c78c7d8e2a5fe559e3721c0f9c9e303b2ed"
-uuid = "f2c3362d-daeb-58d1-803e-2bc74f2840b4"
-version = "0.2.21"
-
-[[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.ReverseDiff]]
-deps = ["ChainRulesCore", "DiffResults", "DiffRules", "ForwardDiff", "FunctionWrappers", "LinearAlgebra", "LogExpFunctions", "MacroTools", "NaNMath", "Random", "SpecialFunctions", "StaticArrays", "Statistics"]
-git-tree-sha1 = "d1235bdd57a93bd7504225b792b867e9a7df38d5"
-uuid = "37e2e3b7-166d-5795-8a7a-e32c996b4267"
-version = "1.15.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.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 = "535bb76be2c1090a09767b18b160f5729ad12aff"
-uuid = "0bca4576-84f4-4d90-8ffe-ffa030f20462"
-version = "2.23.0"
-
- [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.SciMLSensitivity]]
-deps = ["ADTypes", "Adapt", "ArrayInterface", "ChainRulesCore", "DiffEqBase", "DiffEqCallbacks", "DiffEqNoiseProcess", "Distributions", "EllipsisNotation", "Enzyme", "FiniteDiff", "ForwardDiff", "FunctionProperties", "FunctionWrappersWrappers", "Functors", "GPUArraysCore", "LinearAlgebra", "LinearSolve", "Markdown", "OrdinaryDiffEq", "Parameters", "PreallocationTools", "QuadGK", "Random", "RandomNumbers", "RecursiveArrayTools", "Reexport", "ReverseDiff", "SciMLBase", "SciMLOperators", "SparseDiffTools", "StaticArrays", "StaticArraysCore", "Statistics", "StochasticDiffEq", "Tracker", "TruncatedStacktraces", "Zygote"]
-git-tree-sha1 = "3b0fde1944502bd736bcdc3d0df577dddb54d189"
-uuid = "1ed8b502-d754-442c-8d5d-10ac956f44a1"
-version = "7.51.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.ShowCases]]
-git-tree-sha1 = "7f534ad62ab2bd48591bdeac81994ea8c445e4a5"
-uuid = "605ecd9f-84a6-4c9e-81e2-4798472b76a3"
-version = "0.1.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 = "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 = "470c5f97af31fa35926b45eb01e53a46c8d7d35f"
-uuid = "727e6d20-b764-4bd8-a329-72de5adea6c7"
-version = "1.3.1"
-
- [deps.SimpleNonlinearSolve.extensions]
- SimpleNonlinearSolvePolyesterForwardDiffExt = "PolyesterForwardDiff"
- SimpleNonlinearSolveStaticArraysExt = "StaticArrays"
-
- [deps.SimpleNonlinearSolve.weakdeps]
- 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"
-version = "1.10.0"
-
-[[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 = "3b38ae7a1cbe9b8b1344359599753957644b03d4"
-uuid = "47a9eef4-7e08-11e9-0b38-333d64bd3804"
-version = "2.16.0"
-
- [deps.SparseDiffTools.extensions]
- SparseDiffToolsEnzymeExt = "Enzyme"
- SparseDiffToolsPolyesterForwardDiffExt = "PolyesterForwardDiff"
- SparseDiffToolsSymbolicsExt = "Symbolics"
- SparseDiffToolsZygoteExt = "Zygote"
-
- [deps.SparseDiffTools.weakdeps]
- Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9"
- PolyesterForwardDiff = "98d1487c-24ca-40b6-b7ab-df2af84e126b"
- Symbolics = "0c5d862f-8b57-4792-8d23-62f2024744c7"
- Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f"
-
-[[deps.SparseInverseSubset]]
-deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"]
-git-tree-sha1 = "52962839426b75b3021296f7df242e40ecfc0852"
-uuid = "dc90abb0-5640-4711-901d-7e5b23a2fada"
-version = "0.1.2"
-
-[[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.SplittablesBase]]
-deps = ["Setfield", "Test"]
-git-tree-sha1 = "e08a62abc517eb79667d0a29dc08a3b589516bb5"
-uuid = "171d559e-b47b-412a-8079-5efa626c420e"
-version = "0.1.15"
-
-[[deps.Static]]
-deps = ["IfElse"]
-git-tree-sha1 = "f295e0a1da4ca425659c57441bcb59abb035a4bc"
-uuid = "aedffcd0-7271-4cad-89d0-dc628f76c6d3"
-version = "0.8.8"
-
-[[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 = "7b0e9c14c624e435076d19aea1e5cbdec2b9ca37"
-uuid = "90137ffa-7385-5640-81b9-e52037218182"
-version = "1.9.2"
-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.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 = "1d77abd07f617c4868c33d4f5b9e1dbb2643c9cf"
-uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91"
-version = "0.34.2"
-
-[[deps.StatsFuns]]
-deps = ["HypergeometricFunctions", "IrrationalConstants", "LogExpFunctions", "Reexport", "Rmath", "SpecialFunctions"]
-git-tree-sha1 = "f625d686d5a88bcd2b15cd81f18f98186fdc0c9a"
-uuid = "4c63d2b9-4356-54db-8cca-17b64c39e42c"
-version = "1.3.0"
-
- [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 = "753219de57ac7aab0feb88871d3c51e0eb5e3b03"
-uuid = "789caeaf-c7a9-5a7d-9973-96adeb23e2a0"
-version = "6.64.0"
-
-[[deps.StrideArraysCore]]
-deps = ["ArrayInterface", "CloseOpenIntervals", "IfElse", "LayoutPointers", "ManualMemory", "SIMDTypes", "Static", "StaticArrayInterface", "ThreadingUtilities"]
-git-tree-sha1 = "d6415f66f3d89c615929af907fdc6a3e17af0d8c"
-uuid = "7792a7ef-975c-4747-a70f-980b88e8d1da"
-version = "0.5.2"
-
-[[deps.StructArrays]]
-deps = ["Adapt", "ConstructionBase", "DataAPI", "GPUArraysCore", "StaticArraysCore", "Tables"]
-git-tree-sha1 = "1b0b1205a56dc288b71b1961d48e351520702e24"
-uuid = "09ab397b-f2b6-538f-b94a-2f83cf4a842a"
-version = "0.6.17"
-
-[[deps.StructIO]]
-deps = ["Test"]
-git-tree-sha1 = "010dc73c7146869c042b49adcdb6bf528c12e859"
-uuid = "53d494c1-5632-5724-8f4c-31dff12d585f"
-version = "0.3.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.2.1+1"
-
-[[deps.Sundials]]
-deps = ["CEnum", "DataStructures", "DiffEqBase", "Libdl", "LinearAlgebra", "Logging", "PrecompileTools", "Reexport", "SciMLBase", "SparseArrays", "Sundials_jll"]
-git-tree-sha1 = "c25a1ea9a5699895a44a60bf01b341778bcccac5"
-uuid = "c3572dad-4567-51f8-b174-8c6c989267f4"
-version = "4.23.2"
-
-[[deps.Sundials_jll]]
-deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "SuiteSparse_jll", "libblastrampoline_jll"]
-git-tree-sha1 = "ba4d38faeb62de7ef47155ed321dce40a549c305"
-uuid = "fb77eaff-e24c-56d4-86b1-d163f2edb164"
-version = "5.2.2+0"
-
-[[deps.SymbolicIndexingInterface]]
-git-tree-sha1 = "b3103f4f50a3843e66297a2456921377c78f5e31"
-uuid = "2efcf032-c050-4f8e-a9bb-153293bab1f5"
-version = "0.3.5"
-
-[[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.ThreadPools]]
-deps = ["Printf", "RecipesBase", "Statistics"]
-git-tree-sha1 = "50cb5f85d5646bc1422aa0238aa5bfca99ca9ae7"
-uuid = "b189fb0b-2eb5-4ed4-bc0c-d34c51242431"
-version = "2.1.1"
-
-[[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.Tracker]]
-deps = ["Adapt", "DiffRules", "ForwardDiff", "Functors", "LinearAlgebra", "LogExpFunctions", "MacroTools", "NNlib", "NaNMath", "Optimisers", "Printf", "Random", "Requires", "SpecialFunctions", "Statistics"]
-git-tree-sha1 = "5c942be30a85ac75d14e9e527b55504031e1bbd3"
-uuid = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c"
-version = "0.2.31"
-weakdeps = ["PDMats"]
-
- [deps.Tracker.extensions]
- TrackerPDMatsExt = "PDMats"
-
-[[deps.TranscodingStreams]]
-git-tree-sha1 = "54194d92959d8ebaa8e26227dbe3cdefcdcd594f"
-uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa"
-version = "0.10.3"
-weakdeps = ["Random", "Test"]
-
- [deps.TranscodingStreams.extensions]
- TestExt = ["Test", "Random"]
-
-[[deps.Transducers]]
-deps = ["Adapt", "ArgCheck", "BangBang", "Baselet", "CompositionsBase", "ConstructionBase", "DefineSingletons", "Distributed", "InitialValues", "Logging", "Markdown", "MicroCollections", "Requires", "Setfield", "SplittablesBase", "Tables"]
-git-tree-sha1 = "3064e780dbb8a9296ebb3af8f440f787bb5332af"
-uuid = "28d57a85-8fef-5791-bfe6-a80928e7c999"
-version = "0.4.80"
-
- [deps.Transducers.extensions]
- TransducersBlockArraysExt = "BlockArrays"
- TransducersDataFramesExt = "DataFrames"
- TransducersLazyArraysExt = "LazyArrays"
- TransducersOnlineStatsBaseExt = "OnlineStatsBase"
- TransducersReferenceablesExt = "Referenceables"
-
- [deps.Transducers.weakdeps]
- 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.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.UnsafeAtomics]]
-git-tree-sha1 = "6331ac3440856ea1988316b46045303bef658278"
-uuid = "013be700-e6cd-48c3-b4a1-df204f14c38f"
-version = "0.2.1"
-
-[[deps.UnsafeAtomicsLLVM]]
-deps = ["LLVM", "UnsafeAtomics"]
-git-tree-sha1 = "323e3d0acf5e78a56dfae7bd8928c989b4f3083e"
-uuid = "d80eeb9a-aca5-4d75-85e5-170c8b632249"
-version = "0.1.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 = "7209df901e6ed7489fe9b7aa3e46fb788e15db85"
-uuid = "3d5dd08c-fd9d-11e8-17fa-ed2836048c2f"
-version = "0.21.65"
-
-[[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.WoodburyMatrices]]
-deps = ["LinearAlgebra", "SparseArrays"]
-git-tree-sha1 = "5f24e158cf4cee437052371455fe361f526da062"
-uuid = "efce3f68-66dc-5838-9240-27a6d6f5f9b6"
-version = "0.5.6"
-
-[[deps.XML2_jll]]
-deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Zlib_jll"]
-git-tree-sha1 = "801cbe47eae69adc50f36c3caec4758d2650741b"
-uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a"
-version = "2.12.2+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 = "522b8414d40c4cbbab8dee346ac3a09f9768f25d"
-uuid = "ffd25f8a-64ca-5728-b0f7-c24cf3aae800"
-version = "5.4.5+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.ZipFile]]
-deps = ["Libdl", "Printf", "Zlib_jll"]
-git-tree-sha1 = "f492b7fe1698e623024e873244f10d89c95c340a"
-uuid = "a5390f91-8eb1-5f08-bee0-b1d1ffed6cea"
-version = "0.10.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 = "49ce682769cd5de6c72dcf1b94ed7790cd08974c"
-uuid = "3161d3a3-bdf6-5164-811a-617609db77b4"
-version = "1.5.5+0"
-
-[[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 = "4ddb4470e47b0094c93055a3bcae799165cc68f1"
-uuid = "e88e6eb3-aa80-5325-afca-941959d7151f"
-version = "0.6.69"
-weakdeps = ["Colors", "Distances", "Tracker"]
-
- [deps.Zygote.extensions]
- ZygoteColorsExt = "Colors"
- ZygoteDistancesExt = "Distances"
- ZygoteTrackerExt = "Tracker"
-
-[[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 = "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.libaec_jll]]
-deps = ["Artifacts", "JLLWrappers", "Libdl"]
-git-tree-sha1 = "eddd19a8dea6b139ea97bdc8a0e2667d4b661720"
-uuid = "477f73a3-ac25-53e9-8cc3-50b2fa2566f0"
-version = "1.0.6+1"
-
-[[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.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.libevent_jll]]
-deps = ["Artifacts", "JLLWrappers", "Libdl", "OpenSSL_jll"]
-git-tree-sha1 = "f04ec6d9a186115fb38f858f05c0c4e1b7fc9dcb"
-uuid = "1080aeaf-3a6a-583e-a51c-c537b09f60ec"
-version = "2.1.13+1"
-
-[[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 = "93284c28274d9e75218a416c65ec49d0e0fcdf3d"
-uuid = "b53b4c65-9356-5827-b1ea-8c7a1a84506f"
-version = "1.6.40+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.p7zip_jll]]
-deps = ["Artifacts", "Libdl"]
-uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0"
-version = "17.4.0+2"
-
-[[deps.prrte_jll]]
-deps = ["Artifacts", "Hwloc_jll", "JLLWrappers", "Libdl", "PMIx_jll", "libevent_jll"]
-git-tree-sha1 = "5adb2d7a18a30280feb66cad6f1a1dfdca2dc7b0"
-uuid = "eb928a42-fffd-568d-ab9c-3f5d54fc65b9"
-version = "3.0.2+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"
+This workshop was refactored and moved to [Scientific Machine Learning using Functional Mock-up Units](https://github.com/ThummeTo/FMIFlux.jl/tree/main/examples/pluto-src/SciMLUsingFMUs/SciMLUsingFMUs.jl).
"""
# ╔═╡ Cell order:
# ╟─1470df0f-40e1-45d5-a4cc-519cc3b28fb8
-# ╟─7d694be0-cd3f-46ae-96a3-49d07d7cf65a
-# ╟─6fc16c34-c0c8-48ce-87b3-011a9a0f4e7c
-# ╟─8a82d8c7-b781-4600-8780-0a0a003b676c
-# ╟─a02f77d1-00d2-46a3-91ba-8a7f5b4bbdc9
-# ╠═a1ee798d-c57b-4cc3-9e19-fb607f3e1e43
-# ╟─02f0add7-9c4e-4358-8b5e-6863bae3ee75
-# ╠═72604eef-5951-4934-844d-d2eb7eb0292c
-# ╠═21104cd1-9fe8-45db-9c21-b733258ff155
-# ╠═9d9e5139-d27e-48c8-a62e-33b2ae5b0086
-# ╟─85308992-04c4-4d20-a840-6220cab54680
-# ╠═eaae989a-c9d2-48ca-9ef8-fd0dbff7bcca
-# ╠═98c608d9-c60e-4eb6-b611-69d2ae7054c9
-# ╟─5cb505f7-01bd-4824-8876-3e0f5a922fb7
-# ╠═45c4b9dd-0b04-43ae-a715-cd120c571424
-# ╟─1e9541b8-5394-418d-8c27-2831951c538d
-# ╠═bc077fdd-069b-41b0-b685-f9513d283346
-# ╟─44500f0a-1b89-44af-b135-39ce0fec5810
-# ╟─33223393-bfb9-4e9a-8ea6-a3ab6e2f22aa
-# ╟─c88b0627-2e04-40ab-baa2-b4c1edfda0c3
-# ╟─915e4601-12cc-4b7e-b2fe-574e116f3a92
-# ╟─f8e40baa-c1c5-424a-9780-718a42fd2b67
-# ╠═74289e0b-1292-41eb-b13b-a4a5763c72b0
-# ╟─f111e772-a340-4217-9b63-e7715f773b2c
-# ╟─92ad1a99-4ad9-4b69-b6f3-84aab49db54f
-# ╠═909de9f1-2aca-4bf0-ba60-d3418964ba4a
-# ╟─d8ca5f66-4f55-48ab-a6c9-a0be662811d9
-# ╠═41b1c7cb-5e3f-4074-a681-36dd2ef94454
-# ╠═8f45871f-f72a-423f-8101-9ce93e5a885b
-# ╠═57c039f7-5b24-4d63-b864-d5f808110b91
-# ╟─4510022b-ad28-4fc2-836b-e4baf3c14d26
-# ╠═9589416a-f9b3-4b17-a381-a4f660a5ee4c
-# ╟─326ae469-43ab-4bd7-8dc4-64575f4a4d3e
-# ╠═8f8f91cc-9a92-4182-8f18-098ae3e2c553
-# ╟─8d93a1ed-28a9-4a77-9ac2-5564be3729a5
-# ╠═4a8de267-1bf4-42c2-8dfe-5bfa21d74b7e
-# ╟─6a8b98c9-e51a-4f1c-a3ea-cc452b9616b7
-# ╟─dbde2da3-e3dc-4b78-8f69-554018533d35
-# ╠═d42d0beb-802b-4d30-b5b8-683d76af7c10
-# ╟─e50d7cc2-7155-42cf-9fef-93afeee6ffa4
-# ╟─3756dd37-03e0-41e9-913e-4b4f183d8b81
-# ╠═2f83bc62-5a54-472a-87a2-4ddcefd902b6
-# ╟─c228eb10-d694-46aa-b952-01d824879287
-# ╟─16ffc610-3c21-40f7-afca-e9da806ea626
-# ╠═052f2f19-767b-4ede-b268-fce0aee133ad
-# ╟─746fbf6f-ed7c-43b8-8a6f-0377cd3cf85e
-# ╟─08e1ff54-d115-4da9-8ea7-5e89289723b3
-# ╟─70c6b605-54fa-40a3-8bce-a88daf6a2022
-# ╠═634f923a-5e09-42c8-bac0-bf165ab3d12a
-# ╟─f59b5c84-2eae-4e3f-aaec-116c090d454d
-# ╠═0c9493c4-322e-41a0-9ec7-2e2c54ae1373
-# ╟─325c3032-4c78-4408-b86e-d9aa4cfc3187
-# ╠═25e55d1c-388f-469d-99e6-2683c0508693
-# ╟─74c519c9-0eef-4798-acff-b11044bb4bf1
-# ╟─786c4652-583d-43e9-a101-e28c0b6f64e4
-# ╟─b42bf3d8-e70c-485c-89b3-158eb25d8b25
-# ╟─5d688c3d-b5e3-4a3a-9d91-0896cc001000
-# ╠═2e08df84-a468-4e99-a277-e2813dfeae5c
-# ╟─0a7955e7-7c1a-4396-9613-f8583195c0a8
-# ╠═4912d9c9-d68d-4afd-9961-5d8315884f75
-# ╟─6a1a5092-6832-4ac7-9850-346e3fa28252
-# ╟─a1aca180-d561-42a3-8d12-88f5a3721aae
-# ╟─13ede3cd-99b1-4e65-8a18-9043db544728
-# ╟─33791947-342b-4bf4-9d0a-c3979c0ad88a
-# ╟─7622ed93-9c66-493b-9fba-c0d3755758a8
-# ╟─432ab3ff-5336-4413-9807-45d4bf756e1f
-# ╟─eaf37128-0377-42b6-aa81-58f0a815276b
-# ╟─c030d85e-af69-49c9-a7c8-e490d4831324
-# ╟─51c200c9-0de3-4e50-8884-49fe06158560
-# ╟─0dadd112-3132-4491-9f02-f43cf00aa1f9
-# ╟─5c2308d9-6d04-4b38-af3b-6241da3b6871
-# ╟─bf6bf640-54bc-44ef-bd4d-b98e934d416e
-# ╟─639889b3-b9f2-4a3c-999d-332851768fd7
-# ╟─007d6d95-ad85-4804-9651-9ac3703d3b40
-# ╟─ed1887df-5079-4367-ab04-9d02a1d6f366
-# ╟─0b0c4650-2ce1-4879-9acd-81c16d06700e
-# ╟─0fb90681-5d04-471a-a7a8-4d0f3ded7bcf
-# ╟─95e14ea5-d82d-4044-8c68-090d74d95a61
-# ╟─2fa1821b-aaec-4de4-bfb4-89560790dc39
-# ╟─cbae6aa4-1338-428c-86aa-61d3304e33ed
-# ╟─9b52a65a-f20c-4387-aaca-5292a92fb639
-# ╟─8c56acd6-94d3-4cbc-bc29-d249740268a0
-# ╟─845a95c4-9a35-44ae-854c-57432200da1a
-# ╟─5a399a9b-32d9-4f93-a41f-8f16a4b102dc
-# ╟─fd1cebf1-5ccc-4bc5-99d4-1eaa30e9762e
-# ╟─2a5157c5-f5a2-4330-b2a3-0c1ec0b7adff
-# ╟─4454c8d2-68ed-44b4-adfa-432297cdc957
-# ╟─d240c95c-5aba-4b47-ab8d-2f9c0eb854cd
-# ╟─06937575-9ab1-41cd-960c-7eef3e8cae7f
-# ╟─356b6029-de66-418f-8273-6db6464f9fbf
-# ╟─5805a216-2536-44ac-a702-d92e86d435a4
-# ╟─53e971d8-bf43-41cc-ac2b-20dceaa78667
-# ╟─e8b8c63b-2ca4-4e6a-a801-852d6149283e
-# ╟─c0ac7902-0716-4f18-9447-d18ce9081ba5
-# ╟─84215a73-1ab0-416d-a9db-6b29cd4f5d2a
-# ╟─bc09bd09-2874-431a-bbbb-3d53c632be39
-# ╠═f741b213-a20d-423a-a382-75cae1123f2c
-# ╟─f02b9118-3fb5-4846-8c08-7e9bbca9d208
-# ╠═91473bef-bc23-43ed-9989-34e62166d455
-# ╟─d347d51b-743f-4fec-bed7-6cca2b17bacb
-# ╟─d60d2561-51a4-4f8a-9819-898d70596e0c
-# ╟─c97f2dea-cb18-409d-9ae8-1d03647a6bb3
-# ╟─366abd1a-bcb5-480d-b1fb-7c76930dc8fc
-# ╟─7e2ffd6f-19b0-435d-8e3c-df24a591bc55
-# ╠═caa5e04a-2375-4c56-8072-52c140adcbbb
-# ╟─69657be6-6315-4655-81e2-8edef7f21e49
-# ╟─23ad65c8-5723-4858-9abe-750c3b65c28a
-# ╟─e8bae97d-9f90-47d2-9263-dc8fc065c3d0
-# ╟─2dce68a7-27ec-4ffc-afba-87af4f1cb630
-# ╟─c3f5704b-8e98-4c46-be7a-18ab4f139458
-# ╟─ff106912-d18c-487f-bcdd-7b7af2112cab
-# ╟─27458e32-5891-4afc-af8e-7afdf7e81cc6
-# ╟─5dd491a4-a8cd-4baf-96f7-7a0b850bb26c
-# ╟─1195a30c-3b48-4bd2-8a3a-f4f74f3cd864
-# ╟─b0ce7b92-93e0-4715-8324-3bf4ff42a0b3
-# ╟─919419fe-35de-44bb-89e4-8f8688bee962
-# ╟─2918daf2-6499-4019-a04b-8c3419ee1ab7
-# ╟─048e39c3-a3d9-4e6b-b050-1fd5a919e4ae
-# ╟─b489f97d-ee90-48c0-af06-93b66a1f6d2e
-# ╟─ea0ede8d-7c2c-4e72-9c96-3260dc8d817d
-# ╟─51aed933-2067-4ea8-9c2f-9d070692ecfc
-# ╟─8d9dc86e-f38b-41b1-80c6-b2ab6f488a3a
-# ╟─74ef5a39-1dd7-404a-8baf-caa1021d3054
-# ╟─05281c4f-dba8-4070-bce3-dc2f1319902e
-# ╟─67cfe7c5-8e62-4bf0-996b-19597d5ad5ef
-# ╟─88884204-79e4-4412-b861-ebeb5f6f7396
-# ╟─00000000-0000-0000-0000-000000000001
-# ╟─00000000-0000-0000-0000-000000000002
diff --git a/examples/pluto-src/SciMLUsingFMUs/SciMLUsingFMUs.jl b/examples/pluto-src/SciMLUsingFMUs/SciMLUsingFMUs.jl
new file mode 100644
index 00000000..2246dc7c
--- /dev/null
+++ b/examples/pluto-src/SciMLUsingFMUs/SciMLUsingFMUs.jl
@@ -0,0 +1,4518 @@
+### 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
+
+# ╔═╡ a1ee798d-c57b-4cc3-9e19-fb607f3e1e43
+using PlutoUI # Notebook UI
+
+# ╔═╡ 72604eef-5951-4934-844d-d2eb7eb0292c
+using FMI # load and simulate FMUs
+
+# ╔═╡ 21104cd1-9fe8-45db-9c21-b733258ff155
+using FMIFlux # machine learning with FMUs
+
+# ╔═╡ 9d9e5139-d27e-48c8-a62e-33b2ae5b0086
+using FMIZoo # a collection of demo FMUs
+
+# ╔═╡ eaae989a-c9d2-48ca-9ef8-fd0dbff7bcca
+using FMIFlux.Flux # default Julia Machine Learning library
+
+# ╔═╡ 98c608d9-c60e-4eb6-b611-69d2ae7054c9
+using FMIFlux.DifferentialEquations # the mighty (O)DE solver suite
+
+# ╔═╡ de7a4639-e3b8-4439-924d-7d801b4b3eeb
+using BenchmarkTools
+
+# ╔═╡ 45c4b9dd-0b04-43ae-a715-cd120c571424
+using Plots
+
+# ╔═╡ 1470df0f-40e1-45d5-a4cc-519cc3b28fb8
+md"""
+# Scientific Machine Learning $br using Functional Mock-Up Units
+(former *Hybrid Modeling using FMI*)
+
+Workshop $br
+@ JuliaCon 2024 (Eindhoven, Netherlands) $br
+@ MODPROD 2024 (Linköping University, Sweden)
+
+by Tobias Thummerer (University of Augsburg)
+
+*#hybridmodeling, #sciml, #neuralode, #neuralfmu, #penode*
+
+# Abstract
+If there is something YOU know about a physical system, AI shouldn’t need to learn it. How to integrate YOUR system knowledge into a ML development process is the core topic of this hands-on workshop. The entire workshop evolves around a challenging use case from robotics: Modeling a robot that is able to write arbitrary messages with a pen. After introducing the topic and the considered use case, participants can experiment with their very own hybrid model topology.
+
+# Introduction
+This workshop focuses on the integration of Functional Mock-Up Units (FMUs) into a machine learning topology. FMUs are simulation models that can be generated within a variety of modeling tools, see the [FMI homepage](https://fmi-standard.org/). Together with deep neural networks that complement and improve the FMU prediction, so called *NeuralFMUs* can be created.
+The workshop itself evolves around the hybrid modeling of a *Selective Compliance Assembly Robot Arm* (SCARA), that is able to write user defined words on a sheet of paper. A ready to use physical simulation model (FMU) for the SCARA is given and shortly highlighted in this workshop. However, this model – as any simulation model – shows some deviations if compared to measurements from the real system. These deviations results from unmodeled slip-stick-friction: The pen sticks to the paper until a force limit is reached, but then moves jerkily. A hard to model physical effect – but not for a NeuralFMU.
+
+More advanced code snippets are hidden by default and marked with a ghost `👻`. Computations, that are disabled for performance reasons, are marked with `ℹ️`. They offer a hint how to enable the idled computation by activating the corresponding checkbox marked with `🎬`.
+
+## Example Video
+If you haven't seen such a SCARA system yet, you can watch the following video. There are many more similar videos out there.
+"""
+
+# ╔═╡ 7d694be0-cd3f-46ae-96a3-49d07d7cf65a
+html"""
+
+"""
+
+# ╔═╡ 6fc16c34-c0c8-48ce-87b3-011a9a0f4e7c
+md"""
+This video is by *Alexandru Babaian* on YouTube.
+
+## Requirements
+To follow this workshop, you should ...
+- ... have a rough idea what the *Functional Mock-Up Interface* is and how the standard-conform models - the *Functional Mock-Up Units* - work. If not, a good source is the homepage of the standard, see the [FMI Homepage](https://fmi-standard.org/).
+- ... know the *Julia Programming Language* or at least have some programming skills in another high-level programming language like *Python* or *Matlab*. An introduction to Julia can be found on the [Julia Homepage](https://julialang.org/), but there are many more introductions in different formats available on the internet.
+- ... have an idea of how modeling (in terms of modeling ODE and DAE systems) and simulation (solving) of such models works.
+
+The technical requirements are:
+
+| | recommended | minimum | your |
+| ----- | ---- | ---- | ---- |
+| RAM | $\geq$ 16.0GB | 8.0GB | $(round(Sys.total_memory() / 2^30; digits=1))GB |
+| OS | Windows | Windows / Linux | $(Sys.islinux() ? "Linux" : (Sys.iswindows() ? "Windows" : "unsupported"))
+| Julia | 1.10 | 1.6 | $("" * string(Int(VERSION.major)) * "." * string(Int(VERSION.minor))) |
+
+This said, we can start "programming"! The entire notebook is pre-implemented, so you can use it without writing a single line of code. Users new to Julia can use interactive UI elements to interact, while more advance users can view and manipulate corresponding code. Let's go!
+"""
+
+# ╔═╡ 8a82d8c7-b781-4600-8780-0a0a003b676c
+md"""
+## Loading required Julia libraries
+Before starting with the actual coding, we load in the required Julia libraries.
+This Pluto-Notebook installs all required packages automatically.
+However, this will take some minutes when you start the notebook for the first time... it is recommended to not interact with the UI elements as long as the first compilation runs (orange status light in the bottom right corner).
+"""
+
+# ╔═╡ a02f77d1-00d2-46a3-91ba-8a7f5b4bbdc9
+md"""
+First, we load the Pluto UI elements:
+"""
+
+# ╔═╡ 02f0add7-9c4e-4358-8b5e-6863bae3ee75
+md"""
+Then, the three FMI-libraries we need for FMU loading, machine learning and the FMU itself:
+"""
+
+# ╔═╡ 85308992-04c4-4d20-a840-6220cab54680
+md"""
+Some additional libraries for machine learning and ODE solvers:
+"""
+
+# ╔═╡ 5cb505f7-01bd-4824-8876-3e0f5a922fb7
+md"""
+Load in the plotting libraries ...
+"""
+
+# ╔═╡ 33d648d3-e66e-488f-a18d-e538ebe9c000
+import PlotlyJS
+
+# ╔═╡ 1e9541b8-5394-418d-8c27-2831951c538d
+md"""
+... and use the beautiful `plotly` backend for interactive plots.
+"""
+
+# ╔═╡ e6e91a22-7724-46a3-88c1-315c40660290
+plotlyjs()
+
+# ╔═╡ 44500f0a-1b89-44af-b135-39ce0fec5810
+md"""
+Next, we define some helper functions, that are not important to follow the workshop - they are hidden by default. However they are here, if you want to explore what it takes to write fully working code. If you do this workshop for the first time, it is recommended to skip the hidden part and directly go on.
+"""
+
+# ╔═╡ 74d23661-751b-4371-bf6b-986149124e81
+md"""
+Display the table of contents:
+"""
+
+# ╔═╡ c88b0627-2e04-40ab-baa2-b4c1edfda0c3
+TableOfContents()
+
+# ╔═╡ 915e4601-12cc-4b7e-b2fe-574e116f3a92
+md"""
+# Loading Model (FMU) and Data
+We want to do hybrid modeling, so we need a simulation model and some data to work with. Fortunately, someone already prepared both for us. We start by loading some data from *FMIZoo.jl*, which is a collection of FMUs and corresponding data.
+"""
+
+# ╔═╡ f8e40baa-c1c5-424a-9780-718a42fd2b67
+md"""
+## Training Data
+First, we need some data to train our hybrid model on. We can load data for our SCARA (here called `RobotRR`) with the following line:
+"""
+
+# ╔═╡ 74289e0b-1292-41eb-b13b-a4a5763c72b0
+# load training data for the `RobotRR` from the FMIZoo
+data_train = FMIZoo.RobotRR(:train)
+
+# ╔═╡ 33223393-bfb9-4e9a-8ea6-a3ab6e2f22aa
+begin
+
+# define the prinintg messages used at different places in this notebook
+LIVE_RESULTS_MESSAGE = md"""ℹ️ Live plotting are disabled to safe performance. Checkbox `Plot Results`."""
+LIVE_TRAIN_MESSAGE = md"""ℹ️ Live training is disabled to safe performance. Checkbox `Start Training`."""
+BENCHMARK_MESSAGE = md"""ℹ️ Live benchmarks are disabled to safe performance. Checkbox `Start Benchmark`."""
+HIDDEN_CODE_MESSAGE = md"""👻 Hidden Code | You probably want to skip this code section on the first run."""
+
+import FMI.FMIImport.FMICore: hasCurrentComponent, getCurrentComponent, FMU2Solution
+import Random
+
+function fmiSingleInstanceMode!(fmu::FMU2,
+ mode::Bool,
+ params=FMIZoo.getParameter(data_train, 0.0; friction=false),
+ x0=FMIZoo.getState(data_train, 0.0))
+
+ fmu.executionConfig = deepcopy(FMU2_EXECUTION_CONFIGURATION_NO_RESET)
+
+ # for this model, state events are generated but don't need to be handled,
+ # we can skip that to gain performance
+ fmu.executionConfig.handleStateEvents = false
+
+ fmu.executionConfig.loggingOn = false
+ #fmu.executionConfig.externalCallbacks = true
+
+ if mode
+ # switch to a more efficient execution configuration, allocate only a single FMU instance, see:
+ # https://thummeto.github.io/FMI.jl/dev/features/#Execution-Configuration
+ fmu.executionConfig.terminate = true
+ fmu.executionConfig.instantiate = false
+ fmu.executionConfig.reset = true
+ fmu.executionConfig.setup = true
+ fmu.executionConfig.freeInstance = false
+ c, _ = FMIFlux.prepareSolveFMU(fmu, nothing, fmu.type, true, # instantiate
+ false, # free
+ true, # terminate
+ true, # reset
+ true, # setup
+ params; x0=x0)
+ else
+ if !hasCurrentComponent(fmu)
+ return nothing
+ end
+ c = getCurrentComponent(fmu)
+ # switch back to the default execution configuration, allocate a new FMU instance for every run, see:
+ # https://thummeto.github.io/FMI.jl/dev/features/#Execution-Configuration
+ fmu.executionConfig.terminate = true
+ fmu.executionConfig.instantiate = true
+ fmu.executionConfig.reset = true
+ fmu.executionConfig.setup = true
+ fmu.executionConfig.freeInstance = true
+ FMIFlux.finishSolveFMU(fmu, c, true, # free
+ true) # terminate
+ end
+ return nothing
+end
+
+function dividePath(values)
+ last_value = values[1]
+ paths = []
+ path = []
+ for j in 1:length(values)
+ if values[j] == 1.0
+ push!(path, j)
+ end
+
+ if values[j] == 0.0 && last_value != 0.0
+ push!(path, j)
+ push!(paths, path)
+ path = []
+ end
+
+ last_value = values[j]
+ end
+ if length(path) > 0
+ push!(paths, path)
+ end
+ return paths
+end
+
+function plotRobot(solution::FMU2Solution, t::Real)
+ x = solution.states(t)
+ a1 = x[5]
+ a2 = x[3]
+
+ dt = 0.01
+ i = 1+round(Integer, t/dt)
+ v = solution.values.saveval[i]
+
+ l1 = 0.2
+ l2 = 0.1
+
+ margin = 0.05
+ scale = 1500
+ fig = plot(; title="Time $(round(t; digits=1))s",
+ size=(round(Integer, (2*margin+l1+l2)*scale), round(Integer, (l1+l2+2*margin)*scale)),
+ xlims=(-margin, l1+l2+margin), ylims=(-l1-margin, l2+margin), legend=:bottomleft)
+
+ p0 = [0.0, 0.0]
+ p1 = p0 .+ [cos(a1)*l1, sin(a1)*l1]
+ p2 = p1 .+ [cos(a1+a2)*l2, sin(a1+a2)*l2]
+
+ f_norm = collect(v[3] for v in solution.values.saveval)
+
+ paths = dividePath(f_norm)
+ drawing = collect(v[1:2] for v in solution.values.saveval)
+ for path in paths
+ plot!(fig, collect(v[1] for v in drawing[path]), collect(v[2] for v in drawing[path]), label=:none, color=:black, style=:dot)
+ end
+
+ paths = dividePath(f_norm[1:i])
+ drawing_is = collect(v[4:5] for v in solution.values.saveval)[1:i]
+ for path in paths
+ plot!(fig, collect(v[1] for v in drawing_is[path]), collect(v[2] for v in drawing_is[path]), label=:none, color=:green, width=2)
+ end
+
+ plot!(fig, [p0[1], p1[1]], [p0[2], p1[2]], label=:none, width=3, color=:blue)
+ plot!(fig, [p1[1], p2[1]], [p1[2], p2[2]], label=:none, width=3, color=:blue)
+
+ scatter!(fig, [p0[1]], [p0[2]], label="R1 | α1=$(round(a1; digits=3)) rad", color=:red)
+ scatter!(fig, [p1[1]], [p1[2]], label="R2 | α2=$(round(a2; digits=3)) rad", color=:purple)
+
+ scatter!(fig, [v[1]], [v[2]], label="TCP | F=$(v[3]) N", color=:orange)
+end
+
+HIDDEN_CODE_MESSAGE
+
+end # begin
+
+# ╔═╡ 92ad1a99-4ad9-4b69-b6f3-84aab49db54f
+@bind t_train_plot Slider(0.0:0.1:data_train.t[end], default=data_train.t[1])
+
+# ╔═╡ f111e772-a340-4217-9b63-e7715f773b2c
+md"""
+Let's have a look on the data! It's the written word *train*.
+You can use the slider to pick a specific point in time to plot the "robot" as recorded as part of the data.
+
+The current picked time is $(round(t_train_plot; digits=1))s.
+"""
+
+# ╔═╡ 909de9f1-2aca-4bf0-ba60-d3418964ba4a
+plotRobot(data_train.solution, t_train_plot)
+
+# ╔═╡ d8ca5f66-4f55-48ab-a6c9-a0be662811d9
+md"""
+> 👁️ Interesstingly, the first part of the word "trai" is not significantly affected by the slip-stick-effect, the actual TCP trajectory (green) lays quite good on the target position (black dashed). However, the "n" is very jerky. This can be explained by the increasing lever, the motor needs more torque to overcome the static friction the further away the TCP (orange) is from the robot base (red).
+
+Let's extract a start and stop time, as well as saving points for the later solving process:
+"""
+
+# ╔═╡ 41b1c7cb-5e3f-4074-a681-36dd2ef94454
+tSave = data_train.t # time points to save the solution at
+
+# ╔═╡ 8f45871f-f72a-423f-8101-9ce93e5a885b
+tStart = tSave[1] # start time for simulation of FMU and NeuralFMU
+
+# ╔═╡ 57c039f7-5b24-4d63-b864-d5f808110b91
+tStop = tSave[end] # stop time for simulation of FMU and NeuralFMU
+
+# ╔═╡ 4510022b-ad28-4fc2-836b-e4baf3c14d26
+md"""
+Finally, also the start state can be grabbed from *FMIZoo.jl*, as well as some default parameters for the simulation model we load in the next section. How to interpretate the six states is discussed in the next section where the model is loaded.
+"""
+
+# ╔═╡ 9589416a-f9b3-4b17-a381-a4f660a5ee4c
+x0 = FMIZoo.getState(data_train, tStart)
+
+# ╔═╡ 326ae469-43ab-4bd7-8dc4-64575f4a4d3e
+md"""
+The parameter array only contains the path to the training data file, the trajectory writing "train".
+"""
+
+# ╔═╡ 8f8f91cc-9a92-4182-8f18-098ae3e2c553
+parameters = FMIZoo.getParameter(data_train, tStart; friction=false)
+
+# ╔═╡ 8d93a1ed-28a9-4a77-9ac2-5564be3729a5
+md"""
+## Validation Data
+To check whether the hybrid model was not only able to *imitate*, but *understands* the training data, we need some unknown data for validation. In this case, the written word "validate".
+"""
+
+# ╔═╡ 4a8de267-1bf4-42c2-8dfe-5bfa21d74b7e
+# load validation data for the `RobotRR` from the FMIZoo
+data_validation = FMIZoo.RobotRR(:validate)
+
+# ╔═╡ dbde2da3-e3dc-4b78-8f69-554018533d35
+@bind t_validate_plot Slider(0.0:0.1:data_validation.t[end], default=data_validation.t[1])
+
+# ╔═╡ 6a8b98c9-e51a-4f1c-a3ea-cc452b9616b7
+md"""
+Let's have a look on the validation data!
+Again, you can use the slider to pick a specific point in time.
+
+The current time is $(round(t_validate_plot; digits=1))s.
+"""
+
+# ╔═╡ d42d0beb-802b-4d30-b5b8-683d76af7c10
+plotRobot(data_validation.solution, t_validate_plot)
+
+# ╔═╡ e50d7cc2-7155-42cf-9fef-93afeee6ffa4
+md"""
+> 👁️ It looks similar to the effect we know from training data, the first part "valida" is not significantly affected by the slip-stick-effect, but the "te" is very jerky. Again, think of the increasing lever ...
+"""
+
+# ╔═╡ 3756dd37-03e0-41e9-913e-4b4f183d8b81
+md"""
+## Simulation Model (FMU)
+The SCARA simulation model is called `RobotRR` for `Robot Rotational Rotational`, indicating that this robot consists of two rotational joints, connected by links. It is loaded with the following line of code:
+"""
+
+# ╔═╡ 2f83bc62-5a54-472a-87a2-4ddcefd902b6
+# load the FMU named `RobotRR` from the FMIZoo
+# the FMU was exported from Dymola (version 2023x)
+# load the FMU in mode `model-exchange` (ME)
+fmu = fmiLoad("RobotRR", "Dymola", "2023x"; type=:ME)
+#fmu = fmiLoad("C:\\Users\\thummeto\\Documents\\FMIZoo.jl\\models\\bin\\Dymola\\2023x\\2.0\\RobotRR.fmu"; type=:ME) # TODO
+
+# ╔═╡ c228eb10-d694-46aa-b952-01d824879287
+begin
+
+# We activate the single instance mode, so only one FMU instance gets allocated and is reused again an again.
+fmiSingleInstanceMode!(fmu, true)
+
+using FMI.FMIImport: fmi2StringToValueReference
+
+# declare some model identifiers (inside of the FMU)
+STATE_I1 = fmu.modelDescription.stateValueReferences[2]
+STATE_I2 = fmu.modelDescription.stateValueReferences[1]
+STATE_A1 = fmi2StringToValueReference(fmu, "rRPositionControl_Elasticity.rr1.rotational1.revolute1.phi")
+STATE_A2 = fmi2StringToValueReference(fmu,"rRPositionControl_Elasticity.rr1.rotational2.revolute1.phi")
+STATE_dA1 = fmi2StringToValueReference(fmu,"rRPositionControl_Elasticity.rr1.rotational1.revolute1.w")
+STATE_dA2 = fmi2StringToValueReference(fmu,"rRPositionControl_Elasticity.rr1.rotational2.revolute1.w")
+
+DER_ddA2 = fmu.modelDescription.derivativeValueReferences[4]
+DER_ddA1 = fmu.modelDescription.derivativeValueReferences[6]
+
+VAR_TCP_PX = fmi2StringToValueReference(fmu,"rRPositionControl_Elasticity.tCP.p_x")
+VAR_TCP_PY = fmi2StringToValueReference(fmu,"rRPositionControl_Elasticity.tCP.p_y")
+VAR_TCP_VX = fmi2StringToValueReference(fmu,"rRPositionControl_Elasticity.tCP.v_x")
+VAR_TCP_VY = fmi2StringToValueReference(fmu,"rRPositionControl_Elasticity.tCP.v_y")
+VAR_TCP_F = fmi2StringToValueReference(fmu, "combiTimeTable.y[3]")
+
+HIDDEN_CODE_MESSAGE
+
+end
+
+# ╔═╡ 16ffc610-3c21-40f7-afca-e9da806ea626
+md"""
+Let's check out some meta data of the FMU with `fmiInfo`:
+"""
+
+# ╔═╡ 052f2f19-767b-4ede-b268-fce0aee133ad
+fmiInfo(fmu)
+
+# ╔═╡ 746fbf6f-ed7c-43b8-8a6f-0377cd3cf85e
+md"""
+> 👁️ We can read the model name, tool information for the exporting tool, number of event indicators, states, inputs, outputs and whether the optionally implemented FMI features (like *directional derivatives*) are supported by this FMU.
+"""
+
+# ╔═╡ 08e1ff54-d115-4da9-8ea7-5e89289723b3
+md"""
+All six states are listed with all their alias identifiers, that might look a bit awkward the first time. The six states - human readable - are:
+
+| variable reference | description |
+| -------- | ------ |
+| 33554432 | motor #2 current |
+| 33554433 | motor #1 current |
+| 33554434 | joint #2 angle |
+| 33554435 | joint #2 angular velocity |
+| 33554436 | joint #1 angle |
+| 33554437 | joint #1 angular velocity |
+"""
+
+# ╔═╡ 70c6b605-54fa-40a3-8bce-a88daf6a2022
+md"""
+To simulate - or *solve* - the ME-FMU, we need an ODE solver. We use the *Tsit5* (explicit Runge-Kutta) here.
+"""
+
+# ╔═╡ 634f923a-5e09-42c8-bac0-bf165ab3d12a
+solver = Tsit5()
+
+# ╔═╡ f59b5c84-2eae-4e3f-aaec-116c090d454d
+md"""
+Let's define an array of values we want to be recorded during the first simulation of our FMU. The variable identifiers (like `DER_ddA2`) were pre-defined in the hidden code section above.
+"""
+
+# ╔═╡ 0c9493c4-322e-41a0-9ec7-2e2c54ae1373
+recordValues = [DER_ddA2, DER_ddA1, # mechanical accelerations
+ STATE_A2, STATE_A1, # mechanical angles
+ VAR_TCP_PX, VAR_TCP_PY, # tool-center-point x and y
+ VAR_TCP_VX, VAR_TCP_VY, # tool-center-point velocity x and y
+ VAR_TCP_F] # normal force pen on paper
+
+# ╔═╡ 325c3032-4c78-4408-b86e-d9aa4cfc3187
+md"""
+Let's simulate the FMU using `fmiSimulate`. In the solution object, different information can be found, like the number of ODE, jacobian or gradient evaluations:
+"""
+
+# ╔═╡ 25e55d1c-388f-469d-99e6-2683c0508693
+sol_fmu_train = fmiSimulate(fmu, # our FMU
+ (tStart, tStop); # sim. from tStart to tStop
+ solver=solver, # use the Tsit5 solver
+ parameters=parameters, # the word "train"
+ saveat=tSave, # saving points for the sol.
+ recordValues=recordValues) # values to record
+
+# ╔═╡ 74c519c9-0eef-4798-acff-b11044bb4bf1
+md"""
+Now that we know our model and data a little bit better, it's time to care about our hybrid model topology.
+
+# Experiments: $br Hybrid Model Topology
+
+Today is opposite day! Instead of deriving a topology step by step, the final NeuralFMU topology is presented in the picture below... however, three experiments are intended to make clear why it looks the way it looks.
+
+![](https://github.com/ThummeTo/FMIFlux.jl/blob/main/examples/pluto-src/HybridModelingUsingFMI/src/plan_complete.png?raw=true)
+
+The first experiment is on choosing a good interface between FMU and ANN. The second is on online data pre- and post-processing. And the third one on gates, that allow to control the influence of ANN and FMU on the resulting hybrid model dynamics. After you completed all three, you are equipped with the knowledge to cope the final challenge: Build your own NeuralFMU and train it!
+"""
+
+# ╔═╡ 786c4652-583d-43e9-a101-e28c0b6f64e4
+md"""
+## Choosing interface signals
+**between the physical and machine learning domain**
+
+When connecting an FMU with an ANN, technically different signals could be used: States, state derivatives, inputs, outputs, parameters, time itself or other observable variables. Depending on the use case, some signals are more clever to choose than others. In general, every additional signal costs a little bit of computational performance, as you will see. So picking the right subset is the key!
+
+![](https://github.com/ThummeTo/FMIFlux.jl/blob/main/examples/pluto-src/HybridModelingUsingFMI/src/plan_e1.png?raw=true)
+
+Choose additional FMU variables to put in together with the state derivatives:
+"""
+
+# ╔═╡ 5d688c3d-b5e3-4a3a-9d91-0896cc001000
+md"""
+We start building our deep model as a `Chain` of layers. For now, there is only a single layer in it: The FMU `fmu` itself. The layer input `x` is interpreted as system state (compare to the figure above) and set in the fmu call via `x=x`. Further, we want all state derivatives as layer outputs `dx_refs=:all` and some additional outputs specified via `y_refs=CHOOSE_y_refs`.
+"""
+
+# ╔═╡ 68719de3-e11e-4909-99a3-5e05734cc8b1
+md"""
+Which signals are used for `y_refs`, can be selected:
+"""
+
+# ╔═╡ b42bf3d8-e70c-485c-89b3-158eb25d8b25
+@bind CHOOSE_y_refs MultiCheckBox([STATE_A1 => "Angle Joint 1", STATE_A2 => "Angle Joint 2", STATE_dA1 => "Angular velocity Joint 1", STATE_dA2 => "Angular velocity Joint 2", VAR_TCP_PX => "TCP position x", VAR_TCP_PY => "TCP position y", VAR_TCP_VX => "TCP velocity x", VAR_TCP_VY => "TCP velocity y", VAR_TCP_F => "TCP (normal) force z"])
+
+# ╔═╡ 2e08df84-a468-4e99-a277-e2813dfeae5c
+model = Chain(x -> fmu(; x=x, dx_refs=:all, y_refs=CHOOSE_y_refs))
+
+# ╔═╡ c446ed22-3b23-487d-801e-c23742f81047
+md"""
+Let's pick a state `x1` one second after simulation start to determine sensitivities for:
+"""
+
+# ╔═╡ fc3d7989-ac10-4a82-8777-eeecd354a7d0
+x1 = FMIZoo.getState(data_train, tStart+1.0)
+
+# ╔═╡ f4e66f76-76ff-4e21-b4b5-c1ecfd846329
+begin
+ using FMIFlux.FMISensitivity.ReverseDiff
+ FMIFlux.prepareSolveFMU(fmu, nothing, fmu.type)
+ jac_rwd = ReverseDiff.jacobian(x -> model(x), x1);
+ A_rwd = jac_rwd[1:length(x1), :]
+end
+
+# ╔═╡ ea655baa-b4d8-4fce-b699-6a732dc06051
+begin
+ using FMIFlux.FMISensitivity.ForwardDiff
+ FMIFlux.prepareSolveFMU(fmu, nothing, fmu.type)
+ jac_fwd = ForwardDiff.jacobian(x -> model(x), x1);
+ A_fwd = jac_fwd[1:length(x1), :]
+end
+
+# ╔═╡ 0a7955e7-7c1a-4396-9613-f8583195c0a8
+md"""
+Depending on how many signals you select, the output of the FMU-layer is extended. The first six outputs are the state derivatives, the remaining are the additional outputs selected above.
+"""
+
+# ╔═╡ 4912d9c9-d68d-4afd-9961-5d8315884f75
+begin
+ dx_y = model(x1)
+end
+
+# ╔═╡ 19942162-cd4e-487c-8073-ea6b262d299d
+md"""
+Derivatives:
+"""
+
+# ╔═╡ 73575386-673b-40cc-b3cb-0b8b4f66a604
+ẋ = dx_y[1:length(x1)]
+
+# ╔═╡ 24861a50-2319-4c63-a800-a0a03279efe2
+md"""
+Additional outputs:
+"""
+
+# ╔═╡ 93735dca-c9f3-4f1a-b1bd-dfe312a0644a
+y = dx_y[length(x1)+1:end]
+
+# ╔═╡ 13ede3cd-99b1-4e65-8a18-9043db544728
+md"""
+Gradient and Jaobian computation takes a little longer of course. We use reverse-mode automatic differentiation via `ReverseDiff.jl` here:
+"""
+
+# ╔═╡ f7c119dd-c123-4c43-812e-d0625817d77e
+md"""
+The determined Jacobian $A = \frac{\partial \dot{x}}{\partial x}$ states:
+"""
+
+# ╔═╡ cae2e094-b6a2-45e4-9afd-a6b78e912ab7
+md"""
+The Jacobian $C = \frac{\partial y}{\partial x}$ states:
+"""
+
+# ╔═╡ ac0afa6c-b6ec-4577-aeb6-10d1ec63fa41
+begin
+ C_rwd = jac_rwd[length(x1)+1:end, :]
+end
+
+# ╔═╡ 5b8084b1-a8be-4bf3-b86d-e2603ae36c5b
+begin
+ C_fwd = jac_fwd[length(x1)+1:end, :]
+end
+
+# ╔═╡ 5e9cb956-d5ea-4462-a649-b133a77929b0
+md"""
+TODO
+"""
+
+# ╔═╡ 9dc93971-85b6-463b-bd17-43068d57de94
+md"""
+### Benchmark
+Finally, keep in mind that the amount of selected signals has influence on the computational performance of the model. The more signals you use, the slower is inference and gradient determination.
+"""
+
+# ╔═╡ 476a1ed7-c865-4878-a948-da73d3c81070
+begin
+ CHOOSE_y_refs;
+
+ md"""
+ 🎬 **Start Benchmark** $(@bind BENCHMARK CheckBox())
+ (benchmarking takes around 10 seconds)
+ """
+end
+
+# ╔═╡ 0b6b4f6d-be09-42f3-bc2c-5f17a8a9ab0e
+md"""
+The current timing and allocations for inference are:
+"""
+
+# ╔═╡ a1aca180-d561-42a3-8d12-88f5a3721aae
+begin
+ if BENCHMARK
+ @btime model(x1)
+ else
+ BENCHMARK_MESSAGE
+ end
+end
+
+# ╔═╡ 3bc2b859-d7b1-4b79-88df-8fb517a6929d
+md"""
+Gradient and Jaobian computation takes a little longer of course. We use reverse-mode automatic differentiation via `ReverseDiff.jl` here:
+"""
+
+# ╔═╡ a501d998-6fd6-496f-9718-3340c42b08a6
+begin
+ if BENCHMARK
+ FMIFlux.prepareSolveFMU(fmu, nothing, fmu.type)
+ function ben_rwd(x)
+ return ReverseDiff.jacobian(model, x + rand(6)*1e-12);
+ end
+ @btime ben_rwd(x1)
+ #nothing
+ else
+ BENCHMARK_MESSAGE
+ end
+end
+
+# ╔═╡ 83a2122d-56da-4a80-8c10-615a8f76c4c1
+md"""
+Further, forward-mode automatic differentiation is available too via `ForwardDiff.jl`, but a little bit slower than reverse-mode:
+"""
+
+# ╔═╡ e342be7e-0806-4f72-9e32-6d74ed3ed3f2
+begin
+ if BENCHMARK
+ FMIFlux.prepareSolveFMU(fmu, nothing, fmu.type)
+ function ben_fwd(x)
+ return ForwardDiff.jacobian(model, x + rand(6)*1e-12);
+ end
+ @btime ben_fwd(x1) # second run for "benchmarking"
+ #nothing
+ else
+ BENCHMARK_MESSAGE
+ end
+end
+
+# ╔═╡ eaf37128-0377-42b6-aa81-58f0a815276b
+md"""
+> 💡 Keep in mind that the choice of interface might have a significant impact on your inference and training performance! However, some signals are simply required to be part of the interface, because the effect we want to train for depends on them.
+"""
+
+# ╔═╡ c030d85e-af69-49c9-a7c8-e490d4831324
+md"""
+## Online Data Pre- and Postprocessing
+**is required for hybrid models**
+
+Now that we have defined the signals that come *from* the FMU and go *into* the ANN, we need to think about data pre- and post-processing. In ML, this is often done before the actual training starts. In hybrid modeling, we need to do this *online*, because the FMU constantly generates signals that might not be suitable for ANNs. On the other hand, the signals generated by ANNs might not suit the expected FMU input. This gets more clear if we have a look on the used activation functions, like e.g. the *tanh*.
+
+![](https://github.com/ThummeTo/FMIFlux.jl/blob/main/examples/pluto-src/HybridModelingUsingFMI/src/plan_e2.png?raw=true)
+
+We simplify the ANN to a single nonlinear activation function. Let's see what's happening as soon as we put the derivative *angular velocity of joint 1* (dα1) from the FMU into a `tanh` function:
+"""
+
+# ╔═╡ 51c200c9-0de3-4e50-8884-49fe06158560
+begin
+ fig_pre_post1 = plot(layout=grid(1,2,widths=(1/4, 3/4)), xlabel="t [s]", legend=:bottomright)
+
+ plot!(fig_pre_post1[1], data_train.t, data_train.da1, label=:none, xlims=(0.0,0.1))
+ plot!(fig_pre_post1[1], data_train.t, tanh.(data_train.da1), label=:none)
+
+ plot!(fig_pre_post1[2], data_train.t, data_train.da1, label="dα1")
+ plot!(fig_pre_post1[2], data_train.t, tanh.(data_train.da1), label="tanh(dα1)")
+
+ fig_pre_post1
+end
+
+# ╔═╡ 0dadd112-3132-4491-9f02-f43cf00aa1f9
+md"""
+In general, it looks like the velocity isn't saturated too much by `tanh`. This is a good thing and not always the case! However, the very beginning of the trajectory is saturated too much (the peak value of $\approx -3$ is saturated to $\approx -1$). This is bad, because the hybrid model velocity is *slower* at this point in time and it won't reach the same angle over time as the original FMU.
+
+We can add shift (=addition) and scale (=multiplication) operations before and after the ANN to bypass this issue. See how you can influence the output *after* the `tanh` (and the ANN repectively) to match the ranges. The goal is to choose pre- and post-processing parameters so that the signal ranges needed by the FMU are preserved by the hybrid model.
+"""
+
+# ╔═╡ bf6bf640-54bc-44ef-bd4d-b98e934d416e
+@bind PRE_POST_SHIFT Slider(-1:0.1:1.0, default=0.0)
+
+# ╔═╡ 5c2308d9-6d04-4b38-af3b-6241da3b6871
+md"""
+Change the `shift` value $(PRE_POST_SHIFT):
+"""
+
+# ╔═╡ 007d6d95-ad85-4804-9651-9ac3703d3b40
+@bind PRE_POST_SCALE Slider(0.1:0.1:2.0, default=1.0)
+
+# ╔═╡ 639889b3-b9f2-4a3c-999d-332851768fd7
+md"""
+Change the `scale` value $(PRE_POST_SCALE):
+"""
+
+# ╔═╡ ed1887df-5079-4367-ab04-9d02a1d6f366
+begin
+ fun_pre = ShiftScale([PRE_POST_SHIFT], [PRE_POST_SCALE])
+ fun_post = ScaleShift(fun_pre)
+
+ fig_pre_post2 = plot(;layout=grid(1,2,widths=(1/4, 3/4)), xlabel="t [s]")
+
+ plot!(fig_pre_post2[2], data_train.t, data_train.da1, label=:none, title="Shift: $(round(PRE_POST_SHIFT; digits=1)) | Scale: $(round(PRE_POST_SCALE; digits=1))", legend=:bottomright)
+ plot!(fig_pre_post2[2], data_train.t, tanh.(data_train.da1), label=:none)
+ plot!(fig_pre_post2[2], data_train.t, fun_post(tanh.(fun_pre(data_train.da1))), label=:none)
+
+ plot!(fig_pre_post2[1], data_train.t, data_train.da1, label="dα1", xlims=(0.0, 0.1))
+ plot!(fig_pre_post2[1], data_train.t, tanh.(data_train.da1), label="tanh(dα1)")
+ plot!(fig_pre_post2[1], data_train.t, fun_post(tanh.(fun_pre(data_train.da1))), label="post(tanh(pre(dα1)))")
+
+ fig_pre_post2
+end
+
+# ╔═╡ 0b0c4650-2ce1-4879-9acd-81c16d06700e
+md"""
+The left plot shows the negative spike at the very beginning in more detail. In *FMIFlux.jl*, there are ready to use layers for scaling and shifting, that can automatically select appropriate parameters. These parameters are trained together with the ANN parameters by default, so they can adapt to new signal ranges that might occur during training.
+"""
+
+# ╔═╡ b864631b-a9f3-40d4-a6a8-0b57a37a476d
+md"""
+> 💡 In many machine larning applications, pre- and post-processing is done offline. If we combine machine learning and physical models, we need to pre- and post-process online at the interfaces. This does at least improve training performance and is a necessity if the nominal values become very large or very small.
+"""
+
+# ╔═╡ 0fb90681-5d04-471a-a7a8-4d0f3ded7bcf
+md"""
+## Introducing Gates
+**to control how physical and machine learning model interact**
+
+![](https://github.com/ThummeTo/FMIFlux.jl/blob/main/examples/pluto-src/HybridModelingUsingFMI/src/plan_e3.png?raw=true)
+"""
+
+# ╔═╡ 95e14ea5-d82d-4044-8c68-090d74d95a61
+md"""
+There are two obvious ways of connecting two blocks (the ANN and the FMU):
+- In **series**, so one block is getting signals from the other block and is able to *manipulate* or *correct* these signals. This way, e.g. modeling or parameterization errors can be corrected.
+- In **parallel**, so both are getting the same signals and calculate own outputs, these outputs must be merged afterwards. This way, additional system parts, like e.g. forces or momentum, can be learned and added to or augment the existing dynamics.
+
+The good news is, you don't have to decide this beforehand. This is something that the optimizer can decide, if we introduce a topology with parameters, that allow for both modes. This structure is referred to as *gates*.
+"""
+
+# ╔═╡ cbae6aa4-1338-428c-86aa-61d3304e33ed
+@bind GATE_INIT_FMU Slider(0.0:0.1:1.0, default=1.0)
+
+# ╔═╡ 2fa1821b-aaec-4de4-bfb4-89560790dc39
+md"""
+Change the opening of the **FMU gate** $(GATE_INIT_FMU) for dα1:
+"""
+
+# ╔═╡ 8c56acd6-94d3-4cbc-bc29-d249740268a0
+@bind GATE_INIT_ANN Slider(0.0:0.1:1.0, default=0.0)
+
+# ╔═╡ 9b52a65a-f20c-4387-aaca-5292a92fb639
+md"""
+Change the opening of the **ANN gate** $(GATE_INIT_ANN) for dα1:
+"""
+
+# ╔═╡ 845a95c4-9a35-44ae-854c-57432200da1a
+md"""
+The FMU gate value for dα1 is $(GATE_INIT_FMU) and the ANN gate value is $(GATE_INIT_ANN). This means the hybrid model dα1 is composed of $(GATE_INIT_FMU*100)% of dα1 from the FMU and of $(GATE_INIT_ANN*100)% of dα1 from the ANN.
+"""
+
+# ╔═╡ 5a399a9b-32d9-4f93-a41f-8f16a4b102dc
+begin
+ function build_model_gates()
+ Random.seed!(123)
+
+ cache = CacheLayer() # allocate a cache layer
+ cacheRetrieve = CacheRetrieveLayer(cache) # allocate a cache retrieve layer, link it to the cache layer
+
+ # we have two signals (acceleration, consumption) and two sources (ANN, FMU), so four gates:
+ # (1) acceleration from FMU (gate=1.0 | open)
+ # (2) consumption from FMU (gate=1.0 | open)
+ # (3) acceleration from ANN (gate=0.0 | closed)
+ # (4) consumption from ANN (gate=0.0 | closed)
+ # the acelerations [1,3] and consumptions [2,4] are paired
+ gates = ScaleSum([GATE_INIT_FMU, GATE_INIT_ANN], [[1,2]]) # gates with sum
+
+ # setup the NeuralFMU topology
+ model_gates = Flux.f64(Chain(dx -> cache(dx), # cache `dx`
+ Dense(1, 16, tanh),
+ Dense(16, 1, tanh), # pre-process `dx`
+ dx -> cacheRetrieve(1, dx), # dynamics FMU | dynamics ANN
+ gates)) # stack toget
+
+ model_input = collect([v] for v in data_train.da1)
+ model_output = collect(model_gates(inp) for inp in model_input)
+ ANN_output = collect(model_gates[2:3](inp) for inp in model_input)
+
+ fig = plot(; ylims=(-3,1), legend=:bottomright)
+ plot!(fig, data_train.t, collect(v[1] for v in model_input), label="dα1 of FMU")
+ plot!(fig, data_train.t, collect(v[1] for v in ANN_output), label="dα1 of ANN")
+ plot!(fig, data_train.t, collect(v[1] for v in model_output), label="dα1 of NeuralFMU")
+
+ return fig
+ end
+ build_model_gates()
+end
+
+# ╔═╡ fd1cebf1-5ccc-4bc5-99d4-1eaa30e9762e
+md"""
+Some observations from the current gate openings are:
+
+This equals the serial topology: $((GATE_INIT_FMU==0 && GATE_INIT_ANN==1) ? "✔️" : "❌") $br
+This equals the parallel topology: $((GATE_INIT_FMU==1 && GATE_INIT_ANN==1) ? "✔️" : "❌") $br
+The neural FMU dynamics equal the FMU dynamics: $((GATE_INIT_FMU==1 && GATE_INIT_ANN==0) ? "✔️" : "❌")
+"""
+
+# ╔═╡ 93771b35-4edd-49e3-bed1-a3ccdb7975e6
+md"""
+> 💭 **Further reading:** Optimizing the gates together with the ANN parameters seems a useful strategy if we don't know how FMU and ANN need to interact in the later application. Technically, we keep a part of the architecture *parameterizable* and therefore learnable. How far can we push this game?
+>
+> Actually to the point, that the combination of FMU and ANN is described by a single *connection* equation, that is able to express all possible combinations of both models with each other - so a connection between every pair of inputs and outputs. This is discussed in detail as part of our article [*Learnable & Interpretable Model Combination in Dynamic Systems Modeling*](https://doi.org/10.48550/arXiv.2406.08093).
+"""
+
+# ╔═╡ 1cd976fb-db40-4ebe-b40d-b996e16fc213
+md"""
+> 💡 ToDo
+"""
+
+# ╔═╡ e79badcd-0396-4a44-9318-8c6b0a94c5c8
+md"""
+Time to take care of the big picture next.
+"""
+
+# ╔═╡ 2a5157c5-f5a2-4330-b2a3-0c1ec0b7adff
+md"""
+# Building the neural FMU
+**... putting everything together**
+
+![](https://github.com/ThummeTo/FMIFlux.jl/blob/main/examples/pluto-src/HybridModelingUsingFMI/src/plan_train.png?raw=true)
+"""
+
+# ╔═╡ 4454c8d2-68ed-44b4-adfa-432297cdc957
+md"""
+## FMU inputs
+In general, you can use arbitrary values as input for the FMU layer, like system inputs, states or parameters. In this example, we want to use only system states as inputs for the FMU layer - to keep it easy, named:
+- currents of both motors
+- angles of both joints
+- angular velocities of both joints
+
+To preserve the ODE topology (a mapping from state to state derivative), we use all system state derivatives as layer outputs. However, you can choose further outputs if you want to... and you definitely should.
+
+## ANN inputs
+As input to the ANN, we choose at least the angular accelerations of both joints - this is fixed:
+
+- angular acceleration Joint 1
+- angular acceleration Joint 2
+
+Pick additional ANN layer inputs:
+"""
+
+# ╔═╡ d240c95c-5aba-4b47-ab8d-2f9c0eb854cd
+@bind y_refs MultiCheckBox([STATE_A1 => "Angle Joint 1", STATE_A2 => "Angle Joint 2", STATE_dA1 => "Angular velocity Joint 1", STATE_dA2 => "Angular velocity Joint 2", VAR_TCP_PX => "TCP position x", VAR_TCP_PY => "TCP position y", VAR_TCP_VX => "TCP velocity x", VAR_TCP_VY => "TCP velocity y", VAR_TCP_F => "TCP (normal) force z"])
+
+# ╔═╡ 06937575-9ab1-41cd-960c-7eef3e8cae7f
+md"""
+It might be clever to pick additional inputs, because the effect being learned (slip-stick of the pen) might depend on this additional input. However, every additional signal has a little negative impact on the computational performance.
+"""
+
+# ╔═╡ 356b6029-de66-418f-8273-6db6464f9fbf
+md"""
+## ANN size
+"""
+
+# ╔═╡ 5805a216-2536-44ac-a702-d92e86d435a4
+md"""
+The ANN shall have $(@bind NUM_LAYERS Select([2, 3, 4])) layers with a width of $(@bind LAYERS_WIDTH Select([8, 16, 32])) each.
+"""
+
+# ╔═╡ 53e971d8-bf43-41cc-ac2b-20dceaa78667
+@bind GATES_INIT Slider(0.0:0.1:1.0, default=0.0)
+
+# ╔═╡ 68d57a23-68c3-418c-9c6f-32bdf8cafceb
+md"""
+The ANN gates shall be initialized with $(GATES_INIT), slide to change:
+"""
+
+# ╔═╡ e8b8c63b-2ca4-4e6a-a801-852d6149283e
+md"""
+ANN gates shall be initialized with $(GATES_INIT), meaning the ANN contributes $(GATES_INIT*100)% to the hybrid model derivatives, while the FMU contributes $(100-GATES_INIT*100)%. These parameters are adapted during training, these are only start values.
+"""
+
+# ╔═╡ c0ac7902-0716-4f18-9447-d18ce9081ba5
+md"""
+## Resulting NeuralFMU
+Even if this looks a little confusing at first glance, our final NeuralFMU topology looks like this:
+"""
+
+# ╔═╡ 84215a73-1ab0-416d-a9db-6b29cd4f5d2a
+begin
+
+function build_topology(gates_init, add_y_refs)
+
+ ANN_input_Vars = [recordValues[1:2]..., add_y_refs...]
+ ANN_input_Vals = fmiGetSolutionValue(sol_fmu_train, ANN_input_Vars)
+ ANN_input_Idcs = [4, 6]
+ for i in 1:length(add_y_refs)
+ push!(ANN_input_Idcs, i+6)
+ end
+
+ # pre- and post-processing
+ preProcess = ShiftScale(ANN_input_Vals) # we put in the derivatives recorded above, FMIFlux shift and scales so we have a data mean of 0 and a standard deivation of 1
+ #preProcess.scale[:] *= 0.1 # add some additional "buffer"
+ postProcess = ScaleShift(preProcess; indices=[1,2]) # initialize the postPrcess as inverse of the preProcess, but only take indices 2 and 3 (we don't need 1, the vehcile velocity)
+
+ # cache
+ cache = CacheLayer() # allocate a cache layer
+ cacheRetrieve = CacheRetrieveLayer(cache) # allocate a cache retrieve layer, link it to the cache layer
+
+ gates = ScaleSum([1.0-gates_init, 1.0-gates_init, gates_init, gates_init], [[1,3], [2,4]]) # gates with sum
+
+ ANN_layers = []
+ push!(ANN_layers, Dense(2+length(add_y_refs), LAYERS_WIDTH, tanh)) # first layer
+ for i in 3:NUM_LAYERS
+ push!(ANN_layers, Dense(LAYERS_WIDTH, LAYERS_WIDTH, tanh))
+ end
+ push!(ANN_layers, Dense(LAYERS_WIDTH, 2, tanh)) # last layer
+
+ model = Flux.f64(Chain(x -> fmu(; x=x, dx_refs=:all, y_refs=add_y_refs),
+ dxy -> cache(dxy), # cache `dx`
+ dxy -> dxy[ANN_input_Idcs],
+ preProcess,
+ ANN_layers...,
+ postProcess,
+ dx -> cacheRetrieve(4, 6, dx), # dynamics FMU | dynamics ANN
+ gates, # compute resulting dx from ANN + FMU
+ dx -> cacheRetrieve(1:3, dx[1], 5, dx[2])))
+
+ return model
+
+end
+
+final_model = build_topology(GATES_INIT, y_refs)
+
+end
+
+# ╔═╡ bc09bd09-2874-431a-bbbb-3d53c632be39
+md"""
+We can evaluate it, by putting in our start state `x0`. The model computes the resulting state derivative:
+"""
+
+# ╔═╡ f741b213-a20d-423a-a382-75cae1123f2c
+final_model(x0)
+
+# ╔═╡ f02b9118-3fb5-4846-8c08-7e9bbca9d208
+md"""
+On basis of this `Chain`, we can build a NeuralFMU very easy:
+"""
+
+# ╔═╡ 91473bef-bc23-43ed-9989-34e62166d455
+neuralFMU = ME_NeuralFMU(fmu, # the FMU used in the NeuralFMU
+ final_model, # the model we specified above
+ (tStart, tStop), # start and stop time for solving
+ solver; # the solver (Tsit5)
+ saveat=tSave) # time points to save the solution at
+
+# ╔═╡ 55c22dae-fba8-4e79-8c25-462ed7519ad2
+md"""
+> 💡 ToDo
+"""
+
+# ╔═╡ d347d51b-743f-4fec-bed7-6cca2b17bacb
+md"""
+# Training
+
+After setting everything up, we can give it a try and train our created NeuralFMU. Deepending on the chosen optimization hyper parameters, this will be more or less successful. Feel free to play around a bit, but keep in mind that for real application design, you should do hyper parameter optimization instead of playing around by yourself.
+"""
+
+# ╔═╡ d60d2561-51a4-4f8a-9819-898d70596e0c
+md"""
+## Hyperparameters
+Besides the already introduced hyperparameters - the depth, width and initial gate opening off the hybrid model - further parameters might have significant impact on the training success.
+
+### Optimizer
+For this example, we use the well-known `Adam`-Optimizer with a step size `eta` of $(@bind ETA Select([1e-4 => "1e-4", 1e-3 => "1e-3", 1e-2 => "1e-2"])).
+
+### Batching
+Because data has a significant length, gradient computation over the entire simulation trajectory might not be effective. The most common approach is to *cut* data into slices and train on these subsets instead of the entire trajctory at once. In this example, data is cut in pieces with length of $(@bind BATCHDUR Select([0.05, 0.1, 0.15, 0.2])) seconds.
+"""
+
+# ╔═╡ c97f2dea-cb18-409d-9ae8-1d03647a6bb3
+md"""
+This results in a batch with $(round(Integer, data_train.t[end] / BATCHDUR)) elements.
+"""
+
+# ╔═╡ 366abd1a-bcb5-480d-b1fb-7c76930dc8fc
+md"""
+We use a simple `Random` scheduler here, that picks a random batch element for the next training step. Other schedulers are pre-implemented in *FMIFlux.jl*.
+"""
+
+# ╔═╡ 7e2ffd6f-19b0-435d-8e3c-df24a591bc55
+md"""
+### Loss Function
+Different loss functions are thinkable here. Two quantities that should be considered are the motor currents and the motor revolution speeds. For this workshop we use the *Mean Average Error* (MAE) over the motor currents. Other loss functions can easily be deployed.
+"""
+
+# ╔═╡ caa5e04a-2375-4c56-8072-52c140adcbbb
+# goal is to match the motor currents (they can be recorded easily in the real application)
+function loss(solution::FMU2Solution, data::FMIZoo.RobotRR_Data)
+
+ # determine the start/end indices `ts` and `te` (sampled with 100Hz)
+ dt = 0.01
+ ts = 1+round(Integer, solution.states.t[1] / dt)
+ te = 1+round(Integer, solution.states.t[end] / dt)
+
+ # retrieve simulation data from neural FMU ("where we are") and data from measurements ("where we want to be")
+ i1_value = fmiGetSolutionState(solution, STATE_I1)
+ i2_value = fmiGetSolutionState(solution, STATE_I2)
+ i1_data = data.i1[ts:te]
+ i2_data = data.i2[ts:te]
+
+ # accumulate our loss value
+ Δvalue = 0.0
+ Δvalue += FMIFlux.Losses.mae(i1_value, i1_data)
+ Δvalue += FMIFlux.Losses.mae(i2_value, i2_data)
+
+ return Δvalue
+end
+
+# ╔═╡ 69657be6-6315-4655-81e2-8edef7f21e49
+md"""
+For example, the loss function value of the plain FMU is $(round(loss(sol_fmu_train, data_train); digits=6)).
+"""
+
+# ╔═╡ 23ad65c8-5723-4858-9abe-750c3b65c28a
+md"""
+## Summary
+To summarize, your ANN has a **depth of $(NUM_LAYERS) layers** with a **width of $(LAYERS_WIDTH)** each. The **ANN gates are initialized with $(GATES_INIT*100)%**, so all FMU gates are initialized with $(100-GATES_INIT*100)%. You decided to batch your data with a **batch element length of $(BATCHDUR)** seconds. Besides the state derivatives, you **put $(length(y_refs)) additional variables** in the ANN. Adam optimizer will try to find a good minimum with **`eta` is $(ETA)**.
+
+Batching takes a few seconds and training a few minutes (depending on the number of training steps), so this is not triggered automatically. If you are ready to go, choose a number of training steps and check the checkbox `Start Training`. This will start a training of $(@bind STEPS Select([0, 10, 100, 1000, 2500, 5000, 10000])) training steps.
+"""
+
+# ╔═╡ e8bae97d-9f90-47d2-9263-dc8fc065c3d0
+begin
+ y_refs;
+ NUM_LAYERS;
+ LAYERS_WIDTH;
+ GATES_INIT;
+ ETA;
+ BATCHDUR;
+
+ md"""
+ ⚠️ The roughly estimated training time is **$(round(Integer, STEPS*10*BATCHDUR + 0.6/BATCHDUR)) seconds** (Windows, i7 @ 3.6GHz). Training might be faster if the system is less stiff than expected. Once you started training by clicking on `Start Training`, training can't be terminated easily.
+
+ 🎬 **Start Training** $(@bind LIVE_TRAIN CheckBox())
+ """
+end
+
+# ╔═╡ 2dce68a7-27ec-4ffc-afba-87af4f1cb630
+begin
+
+function train(eta, batchdur, steps)
+
+ if steps == 0
+ return md"""⚠️ Number of training steps is `0`, no training."""
+ end
+
+ FMIFlux.prepareSolveFMU(fmu, nothing, fmu.type)
+
+ train_t = data_train.t
+ train_data = collect([data_train.i2[i], data_train.i1[i]] for i in 1:length(train_t))
+
+ @info "Started batching ..."
+ batch = batchDataSolution(neuralFMU, # our NeuralFMU model
+ t -> FMIZoo.getState(data_train, t), # a function returning a start state for a given time point `t`, to determine start states for batch elements
+ train_t, # data time points
+ train_data; # data cumulative consumption
+ batchDuration=batchdur, # duration of one batch element
+ indicesModel=[1,2], # model indices to train on (1 and 2 equal the `electrical current` states)
+ plot=false, # don't show intermediate plots (try this outside of Pluto)
+ showProgress=false,
+ parameters=parameters)
+
+ @info "... batching finished!"
+
+ # a random element scheduler
+ scheduler = RandomScheduler(neuralFMU, batch; applyStep=1, plotStep=0)
+
+ lossFct = (solution::FMU2Solution) -> loss(solution, data_train)
+
+ maxiters = round(Int, 1e5*batchdur)
+
+ _loss = p -> FMIFlux.Losses.loss(neuralFMU, # the NeuralFMU to simulate
+ batch; # the batch to take an element from
+ p=p, # the NeuralFMU training parameters (given as input)
+ lossFct=lossFct, # our custom loss function
+ batchIndex=scheduler.elementIndex, # the index of the batch element to take, determined by the choosen scheduler
+ logLoss=true, # log losses after every evaluation
+ showProgress=false,
+ parameters=parameters,
+ maxiters=maxiters)
+
+ params = FMIFlux.params(neuralFMU)
+
+ FMIFlux.initialize!(scheduler; p=params[1], showProgress=false, parameters=parameters)
+
+ BETA1 = 0.9
+ BETA2 = 0.999
+ optim = Adam(eta, (BETA1, BETA2))
+
+ @info "Started training ..."
+
+ FMIFlux.train!(_loss, # the loss function for training
+ neuralFMU, # the parameters to train
+ Iterators.repeated((), steps), # an iterator repeating `steps` times
+ optim; # the optimizer to train
+ gradient=:ReverseDiff, # use ReverseDiff, because it's much faster!
+ cb=()->FMIFlux.update!(scheduler; print=false), # update the scheduler after every step
+ proceed_on_assert=true) # go on if a training steps fails (e.g. because of instability)
+
+ @info "... training finished!"
+end
+
+HIDDEN_CODE_MESSAGE
+
+end
+
+# ╔═╡ c3f5704b-8e98-4c46-be7a-18ab4f139458
+let
+ if LIVE_TRAIN
+ train(ETA, BATCHDUR, STEPS)
+ else
+ LIVE_TRAIN_MESSAGE
+ end
+end
+
+# ╔═╡ 2f917499-6234-4467-886d-689e4c5aa920
+md"""
+ToDo: Loss curve?!
+"""
+
+# ╔═╡ ff106912-d18c-487f-bcdd-7b7af2112cab
+md"""
+# Results
+Now it's time to find out if it worked!
+
+
+
+⚠️ Plotting results makes the notebook slow, so it's deactivated by default. Activate it to plot results of your training.
+
+## Training results
+Let's check out the *training* results of the freshly trained NeuralFMU.
+"""
+
+# ╔═╡ 51eeb67f-a984-486a-ab8a-a2541966fa72
+begin
+ LIVE_TRAIN;
+ md"""
+ 🎬 **Plot results** $(@bind LIVE_RESULTS CheckBox())
+ """
+end
+
+# ╔═╡ 27458e32-5891-4afc-af8e-7afdf7e81cc6
+begin
+
+function plotPaths!(fig, t, x, N; color=:black, label=:none, kwargs...)
+ paths = []
+ path = nothing
+ lastN = N[1]
+ for i in 1:length(N)
+ if N[i] == 0.0
+ if lastN == 1.0
+ push!(path, (t[i], x[i]) )
+ push!(paths, path)
+ end
+ end
+
+ if N[i] == 1.0
+ if lastN == 0.0
+ path = []
+ end
+ push!(path, (t[i], x[i]) )
+ end
+
+ lastN = N[i]
+ end
+ if length(path) > 0
+ push!(paths, path)
+ end
+
+ isfirst = true
+ for path in paths
+ plot!(fig, collect(v[1] for v in path), collect(v[2] for v in path);
+ label=isfirst ? label : :none,
+ color=color,
+ kwargs...)
+ isfirst = false
+ end
+
+ return fig
+end
+
+HIDDEN_CODE_MESSAGE
+
+end
+
+# ╔═╡ 4b68b48d-7c58-4bf1-920b-c60f787d2ede
+# ╠═╡ disabled = true
+#=╠═╡
+begin
+ using JLD2
+ fmiLoadParameters(neuralFMU, "C:\\Users\\thummeto\\Documents\\Dissertation\\Publikationen\\MODPROD 2024\\results\\20000.jld2")
+end
+ ╠═╡ =#
+
+# ╔═╡ 737e2c50-0858-4205-bef3-f541e33b85c3
+md"""
+### FMU
+Simulating the FMU (training data):
+"""
+
+# ╔═╡ 5dd491a4-a8cd-4baf-96f7-7a0b850bb26c
+begin
+ fmu_train = fmiSimulate(fmu, (data_train.t[1], data_train.t[end]); x0=x0,
+ parameters=Dict{String, Any}("fileName" => data_train.params["fileName"]),
+ recordValues=["rRPositionControl_Elasticity.tCP.p_x",
+ "rRPositionControl_Elasticity.tCP.p_y",
+ "rRPositionControl_Elasticity.tCP.N",
+ "rRPositionControl_Elasticity.tCP.a_x",
+ "rRPositionControl_Elasticity.tCP.a_y"],
+ showProgress=true, maxiters=1e7, saveat=data_train.t, solver=Tsit5());
+ nothing
+end
+
+# ╔═╡ 4f27b6c0-21da-4e26-aaad-ff453c8af3da
+md"""
+### Neural FMU
+Simulating the neural FMU (training data):
+"""
+
+# ╔═╡ 1195a30c-3b48-4bd2-8a3a-f4f74f3cd864
+begin
+ if LIVE_RESULTS
+ result_train = neuralFMU(x0, (data_train.t[1], data_train.t[end]);
+ parameters=Dict{String, Any}("fileName" => data_train.params["fileName"]),
+ recordValues=["rRPositionControl_Elasticity.tCP.p_x",
+ "rRPositionControl_Elasticity.tCP.p_y",
+ "rRPositionControl_Elasticity.tCP.N",
+ "rRPositionControl_Elasticity.tCP.v_x",
+ "rRPositionControl_Elasticity.tCP.v_y",
+ "rRPositionControl_Elasticity.tCP.a_x",
+ "rRPositionControl_Elasticity.tCP.a_y"],
+ showProgress=true, maxiters=1e7, saveat=data_train.t);
+ nothing
+ else
+ LIVE_RESULTS_MESSAGE
+ end
+end
+
+# ╔═╡ b0ce7b92-93e0-4715-8324-3bf4ff42a0b3
+begin
+ if LIVE_RESULTS
+ md"""
+The loss function value of the FMU on training data is $(round(loss(fmu_train, data_train); digits=6)), of the NeuralFMU it is $(round(loss(result_train, data_train); digits=6)).
+"""
+ else
+ LIVE_RESULTS_MESSAGE
+ end
+end
+
+# ╔═╡ 6353e78a-57d5-43cd-a1fa-ff88af32d173
+let
+ #fmu_ax = collect(v[4] for v in fmu_train.values.saveval)
+ #fmu_ay = collect(v[5] for v in fmu_train.values.saveval)
+
+ nfmu_vx = collect(v[4] for v in result_train.values.saveval)
+ nfmu_vy = collect(v[5] for v in result_train.values.saveval)
+
+ fmu_ax = collect(v[6] for v in result_train.values.saveval)
+ fmu_ay = collect(v[7] for v in result_train.values.saveval)
+
+ # do a finite differences approximation for TCP acceleration
+ nfmu_ax = [0.0]
+ nfmu_ay = [0.0]
+ ts = result_train.values.t
+ for i in 2:length(nfmu_vx)-1
+ dx = (nfmu_vx[i+1] - nfmu_vx[i-1]) / (ts[i+1] - ts[i-1])
+ dy = (nfmu_vy[i+1] - nfmu_vy[i-1]) / (ts[i+1] - ts[i-1])
+
+ push!(nfmu_ax, dx)
+ push!(nfmu_ay, dy)
+ end
+ push!(nfmu_ax, 0.0)
+ push!(nfmu_ay, 0.0)
+
+ startIndex = round(Integer, length(ts)*0.8)
+
+ plot(ts[startIndex:end], nfmu_ax[startIndex:end]) # .- fmu_ax, nfmu_vx)
+ plot!(ts[startIndex:end], fmu_ax[startIndex:end])
+ plot(ts[startIndex:end], nfmu_ax[startIndex:end] .- fmu_ax[startIndex:end])
+ #plot(nfmu_vx[startIndex:end], nfmu_ax[startIndex:end])
+ scatter(nfmu_vx[startIndex:end], nfmu_ax[startIndex:end] .- fmu_ax[startIndex:end])
+end
+
+# ╔═╡ 919419fe-35de-44bb-89e4-8f8688bee962
+let
+ if LIVE_RESULTS
+ fig = plot(; dpi=300, size=(200*3,60*3))
+ plotPaths!(fig, data_train.tcp_px, data_train.tcp_py, data_train.tcp_norm_f, label="Data", color=:black, style=:dash)
+ plotPaths!(fig, collect(v[1] for v in fmu_train.values.saveval), collect(v[2] for v in fmu_train.values.saveval), collect(v[3] for v in fmu_train.values.saveval), label="FMU", color=:orange)
+ plotPaths!(fig, collect(v[1] for v in result_train.values.saveval), collect(v[2] for v in result_train.values.saveval), collect(v[3] for v in result_train.values.saveval), label="NeuralFMU", color=:blue)
+ else
+ LIVE_RESULTS_MESSAGE
+ end
+end
+
+# ╔═╡ 2918daf2-6499-4019-a04b-8c3419ee1ab7
+let
+ if LIVE_RESULTS
+ fig = plot(; dpi=300, size=(40*10,40*10), xlims=(0.165, 0.205), ylims=(-0.035, 0.005))
+ plotPaths!(fig, data_train.tcp_px, data_train.tcp_py, data_train.tcp_norm_f, label="Data", color=:black, style=:dash)
+ plotPaths!(fig, collect(v[1] for v in fmu_train.values.saveval), collect(v[2] for v in fmu_train.values.saveval), collect(v[3] for v in fmu_train.values.saveval), label="FMU", color=:orange)
+ plotPaths!(fig, collect(v[1] for v in result_train.values.saveval), collect(v[2] for v in result_train.values.saveval), collect(v[3] for v in result_train.values.saveval), label="NeuralFMU", color=:blue)
+ else
+ LIVE_RESULTS_MESSAGE
+ end
+end
+
+# ╔═╡ 048e39c3-a3d9-4e6b-b050-1fd5a919e4ae
+let
+ if LIVE_RESULTS
+ fig = plot(; dpi=300, size=(50*10,40*10), xlims=(0.245, 0.295), ylims=(-0.04, 0.0))
+ plotPaths!(fig, data_train.tcp_px, data_train.tcp_py, data_train.tcp_norm_f, label="Data", color=:black, style=:dash)
+ plotPaths!(fig, collect(v[1] for v in fmu_train.values.saveval), collect(v[2] for v in fmu_train.values.saveval), collect(v[3] for v in fmu_train.values.saveval), label="FMU", color=:orange)
+ plotPaths!(fig, collect(v[1] for v in result_train.values.saveval), collect(v[2] for v in result_train.values.saveval), collect(v[3] for v in result_train.values.saveval), label="NeuralFMU", color=:blue)
+ else
+ LIVE_RESULTS_MESSAGE
+ end
+end
+
+# ╔═╡ b489f97d-ee90-48c0-af06-93b66a1f6d2e
+md"""
+## Validation results
+Let's check out the *validation* results of the freshly trained NeuralFMU.
+"""
+
+# ╔═╡ 4dad3e55-5bfd-4315-bb5a-2680e5cbd11c
+md"""
+### FMU
+Simulating the FMU (validation data):
+"""
+
+# ╔═╡ ea0ede8d-7c2c-4e72-9c96-3260dc8d817d
+begin
+ fmu_validation = fmiSimulate(fmu, (data_validation.t[1], data_validation.t[end]); x0=x0,
+ parameters=Dict{String, Any}("fileName" => data_validation.params["fileName"]),
+ recordValues=["rRPositionControl_Elasticity.tCP.p_x",
+ "rRPositionControl_Elasticity.tCP.p_y",
+ "rRPositionControl_Elasticity.tCP.N"],
+ showProgress=true, maxiters=1e7, saveat=data_validation.t, solver=Tsit5());
+ nothing
+end
+
+# ╔═╡ 35f52dbc-0c0b-495e-8fd4-6edbc6fa811e
+md"""
+### Neural FMU
+Simulating the neural FMU (validation data):
+"""
+
+# ╔═╡ 51aed933-2067-4ea8-9c2f-9d070692ecfc
+begin
+ if LIVE_RESULTS
+ result_validation = neuralFMU(x0, (data_validation.t[1], data_validation.t[end]);
+ parameters=Dict{String, Any}("fileName" => data_validation.params["fileName"]),
+ recordValues=["rRPositionControl_Elasticity.tCP.p_x",
+ "rRPositionControl_Elasticity.tCP.p_y",
+ "rRPositionControl_Elasticity.tCP.N"],
+ showProgress=true, maxiters=1e7, saveat=data_validation.t);
+ nothing
+ else
+ LIVE_RESULTS_MESSAGE
+ end
+end
+
+# ╔═╡ 8d9dc86e-f38b-41b1-80c6-b2ab6f488a3a
+begin
+ if LIVE_RESULTS
+ md"""
+The loss function value of the FMU on validation data is $(round(loss(fmu_validation, data_validation); digits=6)), of the NeuralFMU it is $(round(loss(result_validation, data_validation); digits=6)).
+"""
+ else
+ LIVE_RESULTS_MESSAGE
+ end
+end
+
+# ╔═╡ 74ef5a39-1dd7-404a-8baf-caa1021d3054
+let
+ if LIVE_RESULTS
+ fig = plot(; dpi=300, size=(200*3,40*3))
+ plotPaths!(fig, data_validation.tcp_px, data_validation.tcp_py, data_validation.tcp_norm_f, label="Data", color=:black, style=:dash)
+ plotPaths!(fig, collect(v[1] for v in fmu_validation.values.saveval), collect(v[2] for v in fmu_validation.values.saveval), collect(v[3] for v in fmu_validation.values.saveval), label="FMU", color=:orange)
+ plotPaths!(fig, collect(v[1] for v in result_validation.values.saveval), collect(v[2] for v in result_validation.values.saveval), collect(v[3] for v in result_validation.values.saveval), label="NeuralFMU", color=:blue)
+ else
+ LIVE_RESULTS_MESSAGE
+ end
+end
+
+# ╔═╡ 05281c4f-dba8-4070-bce3-dc2f1319902e
+let
+ if LIVE_RESULTS
+ fig = plot(; dpi=300, size=(35*10,50*10), xlims=(0.188, 0.223), ylims=(-0.025, 0.025))
+ plotPaths!(fig, data_validation.tcp_px, data_validation.tcp_py, data_validation.tcp_norm_f, label="Data", color=:black, style=:dash)
+ plotPaths!(fig, collect(v[1] for v in fmu_validation.values.saveval), collect(v[2] for v in fmu_validation.values.saveval), collect(v[3] for v in fmu_validation.values.saveval), label="FMU", color=:orange)
+ plotPaths!(fig, collect(v[1] for v in result_validation.values.saveval), collect(v[2] for v in result_validation.values.saveval), collect(v[3] for v in result_validation.values.saveval), label="NeuralFMU", color=:blue)
+ else
+ LIVE_RESULTS_MESSAGE
+ end
+end
+
+# ╔═╡ 67cfe7c5-8e62-4bf0-996b-19597d5ad5ef
+let
+ if LIVE_RESULTS
+ fig = plot(; dpi=300, size=(25*10,50*10), xlims=(0.245, 0.27), ylims=(-0.025, 0.025), legend=:topleft)
+ plotPaths!(fig, data_validation.tcp_px, data_validation.tcp_py, data_validation.tcp_norm_f, label="Data", color=:black, style=:dash)
+ plotPaths!(fig, collect(v[1] for v in fmu_validation.values.saveval), collect(v[2] for v in fmu_validation.values.saveval), collect(v[3] for v in fmu_validation.values.saveval), label="FMU", color=:orange)
+ plotPaths!(fig, collect(v[1] for v in result_validation.values.saveval), collect(v[2] for v in result_validation.values.saveval), collect(v[3] for v in result_validation.values.saveval), label="Neural FMU", color=:blue)
+ else
+ LIVE_RESULTS_MESSAGE
+ end
+end
+
+# ╔═╡ 88884204-79e4-4412-b861-ebeb5f6f7396
+md"""
+# Conclusion
+Hopefully you got a good first insight in the topic hybrid modeling using FMI and collected your first sense of achievement. Did you find a nice optimum? In case you don't, some rough hyper parameters are given below.
+
+## Hint
+If your results are not *that* promising, here is a set of hyperparameters to check. It is *not* a optimal set of parameters, but a *good* set, so feel free to explore the *best*!
+
+| Parameter | Value |
+| ----- | ----- |
+| eta | 1e-3 |
+| layer count | 3 |
+| layer width | 32 |
+| initial gate opening | 0.2 |
+| batch element length | 0.05s |
+| training steps | 10 000 |
+| additional variables | Joint 1 Angle $br Joint 2 Angle $br TCP velocity x $br TCP velocity y $br TCP nominal force |
+
+## Citation
+If you find this workshop useful for your own work and/or research, please cite our related publication:
+
+Tobias Thummerer, Johannes Stoljar and Lars Mikelsons. 2022. **NeuralFMU: presenting a workflow for integrating hybrid neuralODEs into real-world applications.** Electronics 11, 19, 3202. DOI: 10.3390/electronics11193202
+
+## Acknowlegments
+- the FMU was created using the excellent Modelica library *Servomechanisms* $br (https://github.com/afrhu/Servomechanisms)
+- the linked YouTube video in the introduction is by *Alexandru Babaian* $br (https://www.youtube.com/watch?v=ryIwLLr6yRA)
+"""
+
+# ╔═╡ 00000000-0000-0000-0000-000000000001
+PLUTO_PROJECT_TOML_CONTENTS = """
+[deps]
+BenchmarkTools = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf"
+FMI = "14a09403-18e3-468f-ad8a-74f8dda2d9ac"
+FMIFlux = "fabad875-0d53-4e47-9446-963b74cae21f"
+FMIZoo = "724179cf-c260-40a9-bd27-cccc6fe2f195"
+PlotlyJS = "f0f68f2c-4968-5e81-91da-67840de0976a"
+Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80"
+PlutoUI = "7f904dfe-b85e-4ff6-b463-dae2292396a8"
+Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"
+
+[compat]
+BenchmarkTools = "~1.5.0"
+FMI = "~0.13.3"
+FMIFlux = "~0.12.0"
+FMIZoo = "~0.3.2"
+PlotlyJS = "~0.18.13"
+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 = "4ed19e47b77a1373bcc02e04351e51f176e148c3"
+
+[[deps.ADTypes]]
+git-tree-sha1 = "016833eb52ba2d6bea9fcb50ca295980e728ee24"
+uuid = "47edcb42-4c32-4615-8424-f2b9edc5f35b"
+version = "0.2.7"
+
+[[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.Accessors]]
+deps = ["CompositionsBase", "ConstructionBase", "Dates", "InverseFunctions", "LinearAlgebra", "MacroTools", "Markdown", "Test"]
+git-tree-sha1 = "c0d491ef0b135fd7d63cbc6404286bc633329425"
+uuid = "7d9f7c33-5ae7-4f3b-8dc6-eff91059b697"
+version = "0.1.36"
+
+ [deps.Accessors.extensions]
+ AccessorsAxisKeysExt = "AxisKeys"
+ AccessorsIntervalSetsExt = "IntervalSets"
+ AccessorsStaticArraysExt = "StaticArrays"
+ AccessorsStructArraysExt = "StructArrays"
+ AccessorsUnitfulExt = "Unitful"
+
+ [deps.Accessors.weakdeps]
+ AxisKeys = "94b1ba4f-4ee9-5380-92f1-94cde586c3c5"
+ IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953"
+ Requires = "ae029012-a4dd-5104-9daa-d747884805df"
+ StaticArrays = "90137ffa-7385-5640-81b9-e52037218182"
+ StructArrays = "09ab397b-f2b6-538f-b94a-2f83cf4a842a"
+ Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d"
+
+[[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.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", "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.ArrayLayouts]]
+deps = ["FillArrays", "LinearAlgebra"]
+git-tree-sha1 = "600078184f7de14b3e60efe13fc0ba5c59f6dca5"
+uuid = "4c555306-a7a7-4459-81d9-ec55ddd5c99a"
+version = "1.10.0"
+weakdeps = ["SparseArrays"]
+
+ [deps.ArrayLayouts.extensions]
+ ArrayLayoutsSparseArraysExt = "SparseArrays"
+
+[[deps.Artifacts]]
+uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33"
+
+[[deps.AssetRegistry]]
+deps = ["Distributed", "JSON", "Pidfile", "SHA", "Test"]
+git-tree-sha1 = "b25e88db7944f98789130d7b503276bc34bc098e"
+uuid = "bf4720bc-e11a-5d0c-854e-bdca1663c893"
+version = "0.1.0"
+
+[[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.BandedMatrices]]
+deps = ["ArrayLayouts", "FillArrays", "LinearAlgebra", "PrecompileTools"]
+git-tree-sha1 = "71f605effb24081b09cae943ba39ef9ca90c04f4"
+uuid = "aae01518-5342-5314-be14-df237901396f"
+version = "1.7.2"
+weakdeps = ["SparseArrays"]
+
+ [deps.BandedMatrices.extensions]
+ BandedMatricesSparseArraysExt = "SparseArrays"
+
+[[deps.BangBang]]
+deps = ["Compat", "ConstructionBase", "InitialValues", "LinearAlgebra", "Requires", "Setfield", "Tables"]
+git-tree-sha1 = "7aa7ad1682f3d5754e3491bb59b8103cae28e3a3"
+uuid = "198e06fe-97b7-11e9-32a5-e1d131e6ad66"
+version = "0.3.40"
+
+ [deps.BangBang.extensions]
+ BangBangChainRulesCoreExt = "ChainRulesCore"
+ BangBangDataFramesExt = "DataFrames"
+ BangBangStaticArraysExt = "StaticArrays"
+ BangBangStructArraysExt = "StructArrays"
+ 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"
+ 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.BenchmarkTools]]
+deps = ["JSON", "Logging", "Printf", "Profile", "Statistics", "UUIDs"]
+git-tree-sha1 = "f1dff6729bc61f4d49e140da1af55dcd1ac97b2f"
+uuid = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf"
+version = "1.5.0"
+
+[[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.Blink]]
+deps = ["Base64", "Distributed", "HTTP", "JSExpr", "JSON", "Lazy", "Logging", "MacroTools", "Mustache", "Mux", "Pkg", "Reexport", "Sockets", "WebIO"]
+git-tree-sha1 = "bc93511973d1f949d45b0ea17878e6cb0ad484a1"
+uuid = "ad839575-38b3-5650-b840-f874b8c74a25"
+version = "0.12.9"
+
+[[deps.BoundaryValueDiffEq]]
+deps = ["ADTypes", "Adapt", "ArrayInterface", "BandedMatrices", "ConcreteStructs", "DiffEqBase", "FastAlmostBandedMatrices", "FastClosures", "ForwardDiff", "LinearAlgebra", "LinearSolve", "Logging", "NonlinearSolve", "OrdinaryDiffEq", "PreallocationTools", "PrecompileTools", "Preferences", "RecursiveArrayTools", "Reexport", "SciMLBase", "Setfield", "SparseArrays", "SparseDiffTools"]
+git-tree-sha1 = "005b55fa2eebaa4d7bf3cfb8097807f47116175f"
+uuid = "764a87c0-6b3e-53db-9096-fe964310641d"
+version = "5.7.1"
+
+ [deps.BoundaryValueDiffEq.extensions]
+ BoundaryValueDiffEqODEInterfaceExt = "ODEInterface"
+
+ [deps.BoundaryValueDiffEq.weakdeps]
+ ODEInterface = "54ca160b-1b9f-5127-a996-1867f4bc2a2c"
+
+[[deps.BufferedStreams]]
+git-tree-sha1 = "4ae47f9a4b1dc19897d3743ff13685925c5202ec"
+uuid = "e1450e63-4bb3-523b-b2a4-4ffa8c0fd77d"
+version = "1.2.1"
+
+[[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 = "5a97e67919535d6841172016c9530fd69494e5ec"
+uuid = "2a0fbf3d-bb9c-48f3-b0a9-814d99fd7ab9"
+version = "0.2.6"
+
+[[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.Calculus]]
+deps = ["LinearAlgebra"]
+git-tree-sha1 = "f641eb0a4f00c343bbc32346e1217b86f3ce9dad"
+uuid = "49dc2e85-a5d0-5ad3-a950-438e2897f1b9"
+version = "0.5.1"
+
+[[deps.Cassette]]
+git-tree-sha1 = "0970356c3bb9113309c74c27c87083cf9c73880a"
+uuid = "7057c7e9-c182-5462-911a-8362d720325c"
+version = "0.3.13"
+
+[[deps.ChainRules]]
+deps = ["Adapt", "ChainRulesCore", "Compat", "Distributed", "GPUArraysCore", "IrrationalConstants", "LinearAlgebra", "Random", "RealDot", "SparseArrays", "SparseInverseSubset", "Statistics", "StructArrays", "SuiteSparse"]
+git-tree-sha1 = "227985d885b4dbce5e18a96f9326ea1e836e5a03"
+uuid = "082447d4-558c-5d27-93f4-14fc19e9eca2"
+version = "1.69.0"
+
+[[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 = "05ba0d07cd4fd8b7a39541e31a7b0254704ea581"
+uuid = "fb6a15b2-703c-40df-9091-08a04967cfa9"
+version = "0.1.13"
+
+[[deps.CodecZlib]]
+deps = ["TranscodingStreams", "Zlib_jll"]
+git-tree-sha1 = "b8fe8546d52ca154ac556809e10c75e6e7430ac8"
+uuid = "944b1d66-785c-5afd-91f1-9de20f533193"
+version = "0.7.5"
+
+[[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 = "362a287c3aa50601b0bc359053d5c2468f0e7ce0"
+uuid = "5ae59095-9a9b-59fe-a467-6f913c188581"
+version = "0.12.11"
+
+[[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.1.1+0"
+
+[[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 = "ea32b83ca4fefa1768dc84e504cc0a94fb1ab8d1"
+uuid = "f0e56b4a-5159-44fe-b623-3e5288b988bb"
+version = "2.4.2"
+
+[[deps.ConstructionBase]]
+deps = ["LinearAlgebra"]
+git-tree-sha1 = "260fd2400ed2dab602a7c15cf10c1933c59930a2"
+uuid = "187b0558-2788-49d3-abe0-74a17ed4e7c9"
+version = "1.5.5"
+
+ [deps.ConstructionBase.extensions]
+ ConstructionBaseIntervalSetsExt = "IntervalSets"
+ ConstructionBaseStaticArraysExt = "StaticArrays"
+
+ [deps.ConstructionBase.weakdeps]
+ IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953"
+ StaticArrays = "90137ffa-7385-5640-81b9-e52037218182"
+
+[[deps.ContextVariablesX]]
+deps = ["Compat", "Logging", "UUIDs"]
+git-tree-sha1 = "25cc3803f1030ab855e383129dcd3dc294e322cc"
+uuid = "6add18c4-b38d-439d-96f6-d6bc489c04c5"
+version = "0.1.3"
+
+[[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.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.DefineSingletons]]
+git-tree-sha1 = "0fba8b706d0178b4dc7fd44a96a92382c9065c2c"
+uuid = "244e2a9f-e319-4986-a169-4d1fe445cd52"
+version = "0.1.2"
+
+[[deps.DelayDiffEq]]
+deps = ["ArrayInterface", "DataStructures", "DiffEqBase", "LinearAlgebra", "Logging", "OrdinaryDiffEq", "Printf", "RecursiveArrayTools", "Reexport", "SciMLBase", "SimpleNonlinearSolve", "SimpleUnPack"]
+git-tree-sha1 = "5959ae76ebd198f70e9af81153644543da0cfaf2"
+uuid = "bcd4f6db-9728-5f36-b5f7-82caef46ccdb"
+version = "5.47.3"
+
+[[deps.DelimitedFiles]]
+deps = ["Mmap"]
+git-tree-sha1 = "9e2f36d3c96a820c678f2f1f1782582fcf685bae"
+uuid = "8bb1440f-4735-579b-a4ab-409b98df4dab"
+version = "1.9.1"
+
+[[deps.DiffEqBase]]
+deps = ["ArrayInterface", "ConcreteStructs", "DataStructures", "DocStringExtensions", "EnumX", "EnzymeCore", "FastBroadcast", "FastClosures", "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 = "03b9555f4c3a7c2f530bb1ae13e85719c632f74e"
+uuid = "2b5f629d-d688-5b77-993f-72d75c75574e"
+version = "6.151.1"
+
+ [deps.DiffEqBase.extensions]
+ DiffEqBaseCUDAExt = "CUDA"
+ DiffEqBaseChainRulesCoreExt = "ChainRulesCore"
+ DiffEqBaseDistributionsExt = "Distributions"
+ DiffEqBaseEnzymeExt = ["ChainRulesCore", "Enzyme"]
+ DiffEqBaseGeneralizedGeneratedExt = "GeneralizedGenerated"
+ DiffEqBaseMPIExt = "MPI"
+ DiffEqBaseMeasurementsExt = "Measurements"
+ DiffEqBaseMonteCarloMeasurementsExt = "MonteCarloMeasurements"
+ DiffEqBaseReverseDiffExt = "ReverseDiff"
+ 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"
+ 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 = "ee954c8b9d348b7a8a6aec5f28288bf5adecd4ee"
+uuid = "459566f4-90b8-5000-8ac3-15dfb0a30def"
+version = "2.37.0"
+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"
+weakdeps = ["ReverseDiff"]
+
+ [deps.DiffEqNoiseProcess.extensions]
+ DiffEqNoiseProcessReverseDiffExt = "ReverseDiff"
+
+[[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.DifferentiableEigen]]
+deps = ["ForwardDiffChainRules", "LinearAlgebra", "ReverseDiff"]
+git-tree-sha1 = "6370fca72115d68efc500b3f49ecd627b715fda8"
+uuid = "73a20539-4e65-4dcb-a56d-dc20f210a01b"
+version = "0.2.0"
+
+[[deps.DifferentiableFlatten]]
+deps = ["ChainRulesCore", "LinearAlgebra", "NamedTupleTools", "OrderedCollections", "Requires", "SparseArrays"]
+git-tree-sha1 = "f4dc2c1d994c7e2e602692a7dadd2ac79212c3a9"
+uuid = "c78775a3-ee38-4681-b694-0504db4f5dc7"
+version = "0.1.1"
+
+[[deps.DifferentialEquations]]
+deps = ["BoundaryValueDiffEq", "DelayDiffEq", "DiffEqBase", "DiffEqCallbacks", "DiffEqNoiseProcess", "JumpProcesses", "LinearAlgebra", "LinearSolve", "NonlinearSolve", "OrdinaryDiffEq", "Random", "RecursiveArrayTools", "Reexport", "SciMLBase", "SteadyStateDiffEq", "StochasticDiffEq", "Sundials"]
+git-tree-sha1 = "8864b6a953eeba7890d23258aca468d90ca73fd6"
+uuid = "0c46a032-eb83-5123-abaf-570d42b7fbaa"
+version = "7.12.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 = "9c405847cc7ecda2dc921ccf18b47ca150d7317e"
+uuid = "31c24e10-a181-5473-b8eb-7969acd0382f"
+version = "0.25.109"
+
+ [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.DualNumbers]]
+deps = ["Calculus", "NaNMath", "SpecialFunctions"]
+git-tree-sha1 = "5837a837389fccf076445fce071c8ddaea35a566"
+uuid = "fa6b7ba4-c1ee-5f82-b5fc-ecf0adba8f74"
+version = "0.6.8"
+
+[[deps.EllipsisNotation]]
+deps = ["StaticArrayInterface"]
+git-tree-sha1 = "3507300d4343e8e4ad080ad24e335274c2e297a9"
+uuid = "da5c29d0-fa7d-589e-88eb-ea29b0a81949"
+version = "1.8.0"
+
+[[deps.EnumX]]
+git-tree-sha1 = "bdb1942cd4c45e3c678fd11569d5cccd80976237"
+uuid = "4e289a0a-7415-4d19-859d-a7e5c4648b56"
+version = "1.0.4"
+
+[[deps.Enzyme]]
+deps = ["CEnum", "EnzymeCore", "Enzyme_jll", "GPUCompiler", "LLVM", "Libdl", "LinearAlgebra", "ObjectFile", "Preferences", "Printf", "Random"]
+git-tree-sha1 = "3fb48f9c18de1993c477457265b85130756746ae"
+uuid = "7da242da-08ed-463a-9acd-ee780be4f1d9"
+version = "0.11.20"
+weakdeps = ["SpecialFunctions"]
+
+ [deps.Enzyme.extensions]
+ EnzymeSpecialFunctionsExt = "SpecialFunctions"
+
+[[deps.EnzymeCore]]
+git-tree-sha1 = "1bc328eec34ffd80357f84a84bb30e4374e9bd60"
+uuid = "f151be2c-9106-41f4-ab19-57ee4f262869"
+version = "0.6.6"
+weakdeps = ["Adapt"]
+
+ [deps.EnzymeCore.extensions]
+ AdaptExt = "Adapt"
+
+[[deps.Enzyme_jll]]
+deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl", "TOML"]
+git-tree-sha1 = "32d418c804279c60dd38ac7868126696f3205a4f"
+uuid = "7cc45869-7501-5eee-bdea-0790c847d4ef"
+version = "0.0.102+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.ExponentialUtilities]]
+deps = ["Adapt", "ArrayInterface", "GPUArraysCore", "GenericSchur", "LinearAlgebra", "PrecompileTools", "Printf", "SparseArrays", "libblastrampoline_jll"]
+git-tree-sha1 = "8e18940a5ba7f4ddb41fe2b79b6acaac50880a86"
+uuid = "d4d017d3-3776-5f7e-afef-a10c40355c18"
+version = "1.26.1"
+
+[[deps.ExprTools]]
+git-tree-sha1 = "27415f162e6028e81c72b82ef756bf321213b6ec"
+uuid = "e2ba6199-217a-4e67-a87a-7c52f15ade04"
+version = "0.1.10"
+
+[[deps.EzXML]]
+deps = ["Printf", "XML2_jll"]
+git-tree-sha1 = "380053d61bb9064d6aa4a9777413b40429c79901"
+uuid = "8f5d6c58-4d21-5cfd-889c-e3ad7ee6a615"
+version = "1.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.FLoops]]
+deps = ["BangBang", "Compat", "FLoopsBase", "InitialValues", "JuliaVariables", "MLStyle", "Serialization", "Setfield", "Transducers"]
+git-tree-sha1 = "ffb97765602e3cbe59a0589d237bf07f245a8576"
+uuid = "cc61a311-1640-44b5-9fba-1b764f453329"
+version = "0.2.1"
+
+[[deps.FLoopsBase]]
+deps = ["ContextVariablesX"]
+git-tree-sha1 = "656f7a6859be8673bf1f35da5670246b923964f7"
+uuid = "b9860ae5-e623-471e-878b-f6a53c775ea6"
+version = "0.1.1"
+
+[[deps.FMI]]
+deps = ["DifferentialEquations", "Downloads", "FMIExport", "FMIImport", "LinearAlgebra", "ProgressMeter", "Requires", "ThreadPools"]
+git-tree-sha1 = "476e0317e86ecb2702d2ad744eb3a02626674fb1"
+uuid = "14a09403-18e3-468f-ad8a-74f8dda2d9ac"
+version = "0.13.3"
+
+[[deps.FMICore]]
+deps = ["ChainRulesCore", "Dates", "Requires"]
+git-tree-sha1 = "ba0fb5ec972d3d2bb7f8c1ebd2f84a58268ab30b"
+uuid = "8af89139-c281-408e-bce2-3005eb87462f"
+version = "0.20.1"
+
+[[deps.FMIExport]]
+deps = ["Dates", "EzXML", "FMICore", "UUIDs"]
+git-tree-sha1 = "daf601e31aeb73fb0010fe7ff942367bc75d5088"
+uuid = "31b88311-cab6-44ed-ba9c-fe5a9abbd67a"
+version = "0.3.2"
+
+[[deps.FMIFlux]]
+deps = ["Colors", "DifferentiableEigen", "DifferentialEquations", "FMIImport", "FMISensitivity", "Flux", "Optim", "Printf", "ProgressMeter", "Requires", "Statistics", "ThreadPools"]
+git-tree-sha1 = "7cb8226af3635ac21ed1ecbd9986ace85ab36c3d"
+uuid = "fabad875-0d53-4e47-9446-963b74cae21f"
+version = "0.12.0"
+
+[[deps.FMIImport]]
+deps = ["Downloads", "EzXML", "FMICore", "Libdl", "RelocatableFolders", "ZipFile"]
+git-tree-sha1 = "b5b245bf7f1fc044ad16b016c7e2f08a2333a6f1"
+uuid = "9fcbc62e-52a0-44e9-a616-1359a0008194"
+version = "0.16.4"
+
+[[deps.FMISensitivity]]
+deps = ["FMICore", "ForwardDiffChainRules", "SciMLSensitivity"]
+git-tree-sha1 = "43b9b68262af5d3602c9f153e978aff00b849569"
+uuid = "3e748fe5-cd7f-4615-8419-3159287187d2"
+version = "0.1.4"
+
+[[deps.FMIZoo]]
+deps = ["Downloads", "EzXML", "FilePaths", "FilePathsBase", "Glob", "Interpolations", "MAT", "Optim", "Requires", "ZipFile"]
+git-tree-sha1 = "47f7e240ab988c1a24cc028f668eb70f73af5bd3"
+uuid = "724179cf-c260-40a9-bd27-cccc6fe2f195"
+version = "0.3.3"
+
+[[deps.FastAlmostBandedMatrices]]
+deps = ["ArrayInterface", "ArrayLayouts", "BandedMatrices", "ConcreteStructs", "LazyArrays", "LinearAlgebra", "MatrixFactorizations", "PrecompileTools", "Reexport"]
+git-tree-sha1 = "a92b5820ea38da3b50b626cc55eba2b074bb0366"
+uuid = "9d29842c-ecb8-4973-b1e9-a27b1157504e"
+version = "0.1.3"
+
+[[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 = "cbf5edddb61a43669710cbc2241bc08b36d9e660"
+uuid = "29a986be-02c6-4525-aec4-84b980013641"
+version = "2.0.4"
+
+[[deps.FilePaths]]
+deps = ["FilePathsBase", "MacroTools", "Reexport", "Requires"]
+git-tree-sha1 = "919d9412dbf53a2e6fe74af62a73ceed0bce0629"
+uuid = "8fc22ac5-c921-52a6-82fd-178b2807b824"
+version = "0.8.3"
+
+[[deps.FilePathsBase]]
+deps = ["Compat", "Dates", "Mmap", "Printf", "Test", "UUIDs"]
+git-tree-sha1 = "9f00e42f8d99fdde64d40c8ea5d14269a2e2c1aa"
+uuid = "48062228-2e41-5def-b9a4-89aafe57970f"
+version = "0.9.21"
+
+[[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 = "2de436b72c3422940cbe1367611d137008af7ec3"
+uuid = "6a86dc24-6348-571c-b903-95158fe2bd41"
+version = "2.23.1"
+
+ [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 = "05882d6995ae5c12bb5f36dd2ed3f61c98cbb172"
+uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93"
+version = "0.8.5"
+
+[[deps.Flux]]
+deps = ["Adapt", "ChainRulesCore", "Compat", "Functors", "LinearAlgebra", "MLUtils", "MacroTools", "NNlib", "OneHotArrays", "Optimisers", "Preferences", "ProgressLogging", "Random", "Reexport", "SparseArrays", "SpecialFunctions", "Statistics", "Zygote"]
+git-tree-sha1 = "edacf029ed6276301e455e34d7ceeba8cc34078a"
+uuid = "587475ba-b771-5e3f-ad9e-33799f191a9c"
+version = "0.14.16"
+
+ [deps.Flux.extensions]
+ FluxAMDGPUExt = "AMDGPU"
+ FluxCUDAExt = "CUDA"
+ FluxCUDAcuDNNExt = ["CUDA", "cuDNN"]
+ FluxMetalExt = "Metal"
+
+ [deps.Flux.weakdeps]
+ AMDGPU = "21141c5a-9bdb-4563-92ae-f87d6854732e"
+ CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba"
+ Metal = "dde4c033-4e86-420c-a63e-0dd931031962"
+ cuDNN = "02a925ec-e4fe-4b08-9a7e-0d78e3d38ccd"
+
+[[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.ForwardDiffChainRules]]
+deps = ["ChainRulesCore", "DifferentiableFlatten", "ForwardDiff", "MacroTools"]
+git-tree-sha1 = "088aae09132ee3a8b351bec6569e83985e5b961e"
+uuid = "c9556dd2-1aed-4cfe-8560-1557cf593001"
+version = "0.2.1"
+
+[[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.FunctionProperties]]
+deps = ["Cassette", "DiffRules"]
+git-tree-sha1 = "bf7c740307eb0ee80e05d8aafbd0c5a901578398"
+uuid = "f62d2435-5019-4c03-9749-2d4c77af0cbc"
+version = "0.1.2"
+
+[[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.FunctionalCollections]]
+deps = ["Test"]
+git-tree-sha1 = "04cb9cfaa6ba5311973994fe3496ddec19b6292a"
+uuid = "de31a74c-ac4f-5751-b3fd-e18cd04993ca"
+version = "0.5.0"
+
+[[deps.Functors]]
+deps = ["LinearAlgebra"]
+git-tree-sha1 = "8a66c07630d6428eaab3506a0eabfcf4a9edea05"
+uuid = "d9f16b24-f501-4c13-a1f2-28368ffc5196"
+version = "0.4.11"
+
+[[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", "xkbcommon_jll"]
+git-tree-sha1 = "3f74912a156096bd8fdbef211eff66ab446e7297"
+uuid = "0656b61e-2033-5cc2-a64a-77c0f6c09b89"
+version = "3.4.0+0"
+
+[[deps.GPUArrays]]
+deps = ["Adapt", "GPUArraysCore", "LLVM", "LinearAlgebra", "Printf", "Random", "Reexport", "Serialization", "Statistics"]
+git-tree-sha1 = "04661708f5301394a1f1be86a07a89e835900db6"
+uuid = "0c68f7d7-f131-5f86-a1c3-88cf8149b2d7"
+version = "10.2.3"
+
+[[deps.GPUArraysCore]]
+deps = ["Adapt"]
+git-tree-sha1 = "ec632f177c0d990e64d955ccc1b8c04c485a0950"
+uuid = "46192b85-c4d5-4398-a991-12ede77f4527"
+version = "0.1.6"
+
+[[deps.GPUCompiler]]
+deps = ["ExprTools", "InteractiveUtils", "LLVM", "Libdl", "Logging", "Scratch", "TimerOutputs", "UUIDs"]
+git-tree-sha1 = "a846f297ce9d09ccba02ead0cae70690e072a119"
+uuid = "61eb1bfa-7361-4325-ad38-22787b887f55"
+version = "0.25.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 = "3e527447a45901ea392fe12120783ad6ec222803"
+uuid = "28b8d3ca-fb5f-59d9-8090-bfdbd6d07a71"
+version = "0.73.6"
+
+[[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 = "182c478a179b267dd7a741b6f8f4c3e0803795d6"
+uuid = "d2c73de3-f751-5644-a686-071e5b155ba9"
+version = "0.73.6+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 = "7c82e6a6cd34e9d935e9aa4051b66c6ff3af59ba"
+uuid = "7746bdde-850d-59dc-9ae8-88ece973131d"
+version = "2.80.2+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 = "ebd18c326fa6cee1efb7da9a3b45cf69da2ed4d9"
+uuid = "86223c79-3864-5bf0-83f7-82e725a168b6"
+version = "1.11.2"
+
+[[deps.Grisu]]
+git-tree-sha1 = "53bb909d1151e57e2484c3d1b53e19552b887fb2"
+uuid = "42e2da0e-8278-4e71-bc24-59509adca0fe"
+version = "1.0.2"
+
+[[deps.HDF5]]
+deps = ["Compat", "HDF5_jll", "Libdl", "MPIPreferences", "Mmap", "Preferences", "Printf", "Random", "Requires", "UUIDs"]
+git-tree-sha1 = "e856eef26cf5bf2b0f95f8f4fc37553c72c8641c"
+uuid = "f67ccb44-e63f-5c2f-98bd-6dc0ccc4ba2f"
+version = "0.17.2"
+
+ [deps.HDF5.extensions]
+ MPIExt = "MPI"
+
+ [deps.HDF5.weakdeps]
+ MPI = "da04e1cc-30fd-572f-bb4f-1f8673147195"
+
+[[deps.HDF5_jll]]
+deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LLVMOpenMP_jll", "LazyArtifacts", "LibCURL_jll", "Libdl", "MPICH_jll", "MPIPreferences", "MPItrampoline_jll", "MicrosoftMPI_jll", "OpenMPI_jll", "OpenSSL_jll", "TOML", "Zlib_jll", "libaec_jll"]
+git-tree-sha1 = "38c8874692d48d5440d5752d6c74b0c6b0b60739"
+uuid = "0234f1f7-429e-5d53-9886-15a909be8d59"
+version = "1.14.2+1"
+
+[[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.Hiccup]]
+deps = ["MacroTools", "Test"]
+git-tree-sha1 = "6187bb2d5fcbb2007c39e7ac53308b0d371124bd"
+uuid = "9fb69e20-1954-56bb-a84f-559cc56a8ff7"
+version = "0.2.2"
+
+[[deps.HostCPUFeatures]]
+deps = ["BitTwiddlingConvenienceFunctions", "IfElse", "Libdl", "Static"]
+git-tree-sha1 = "8e070b599339d622e9a081d17230d74a5c473293"
+uuid = "3e5b6fbb-0976-4d2c-9146-d79de83f2fb0"
+version = "0.1.17"
+
+[[deps.Hwloc_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "1d334207121865ac8c1c97eb7f42d0339e4635bf"
+uuid = "e33a78d0-f292-5ffc-b300-72abe9b543c8"
+version = "2.11.0+0"
+
+[[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 = "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.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.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.InverseFunctions]]
+deps = ["Test"]
+git-tree-sha1 = "e7cbed5032c4c397a6ac23d1493f3289e01231c4"
+uuid = "3587e190-3f89-42d0-90ee-14403ec27112"
+version = "0.1.14"
+weakdeps = ["Dates"]
+
+ [deps.InverseFunctions.extensions]
+ DatesExt = "Dates"
+
+[[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.JSExpr]]
+deps = ["JSON", "MacroTools", "Observables", "WebIO"]
+git-tree-sha1 = "b413a73785b98474d8af24fd4c8a975e31df3658"
+uuid = "97c1335a-c9c5-57fe-bc5d-ec35cebe8660"
+version = "0.5.4"
+
+[[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.JuliaVariables]]
+deps = ["MLStyle", "NameResolution"]
+git-tree-sha1 = "49fb3cb53362ddadb4415e9b73926d6b40709e70"
+uuid = "b14d175d-62b4-44ba-8fb7-3064adc8c3ec"
+version = "0.2.4"
+
+[[deps.JumpProcesses]]
+deps = ["ArrayInterface", "DataStructures", "DiffEqBase", "DocStringExtensions", "FunctionWrappers", "Graphs", "LinearAlgebra", "Markdown", "PoissonRandom", "Random", "RandomNumbers", "RecursiveArrayTools", "Reexport", "SciMLBase", "StaticArrays", "SymbolicIndexingInterface", "UnPack"]
+git-tree-sha1 = "ed08d89318be7d625613f3c435d1f6678fba4850"
+uuid = "ccbc3e58-028d-4f4c-8cd5-9ae44345cda5"
+version = "9.11.1"
+weakdeps = ["FastBroadcast"]
+
+ [deps.JumpProcesses.extensions]
+ JumpProcessFastBroadcastExt = "FastBroadcast"
+
+[[deps.KLU]]
+deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse_jll"]
+git-tree-sha1 = "07649c499349dad9f08dde4243a4c597064663e9"
+uuid = "ef3ab10e-7fda-4108-b977-705223b18434"
+version = "0.6.0"
+
+[[deps.Kaleido_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
+git-tree-sha1 = "43032da5832754f58d14a91ffbe86d5f176acda9"
+uuid = "f7e6163d-2fa5-5f23-b69c-1db539e41963"
+version = "0.2.1+0"
+
+[[deps.KernelAbstractions]]
+deps = ["Adapt", "Atomix", "InteractiveUtils", "LinearAlgebra", "MacroTools", "PrecompileTools", "Requires", "SparseArrays", "StaticArrays", "UUIDs", "UnsafeAtomics", "UnsafeAtomicsLLVM"]
+git-tree-sha1 = "ed7167240f40e62d97c1f5f7735dea6de3cc5c49"
+uuid = "63c18a36-062a-441e-b654-da1e3ab1ce7c"
+version = "0.9.18"
+weakdeps = ["EnzymeCore"]
+
+ [deps.KernelAbstractions.extensions]
+ EnzymeExt = "EnzymeCore"
+
+[[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.LLVM]]
+deps = ["CEnum", "LLVMExtra_jll", "Libdl", "Preferences", "Printf", "Requires", "Unicode"]
+git-tree-sha1 = "839c82932db86740ae729779e610f07a1640be9a"
+uuid = "929cbde3-209d-540e-8aea-75f648917ca0"
+version = "6.6.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 = "88b916503aac4fb7f701bb625cd84ca5dd1677bc"
+uuid = "dad2f222-ce93-54a1-a47d-0025e8a3acab"
+version = "0.0.29+0"
+
+[[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 = "5b0d630f3020b82c0775a51d05895852f8506f50"
+uuid = "23fbe1c1-3f47-55db-b15f-69d7ec21a316"
+version = "0.16.4"
+
+ [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 = "a9eaadb366f5493a5654e843864c13d8b107548c"
+uuid = "10f19ff3-798f-405d-979b-55457f8fc047"
+version = "0.1.17"
+
+[[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.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.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", "ChainRulesCore", "ConcreteStructs", "DocStringExtensions", "EnumX", "FastLapackInterface", "GPUArraysCore", "InteractiveUtils", "KLU", "Krylov", "LazyArrays", "Libdl", "LinearAlgebra", "MKL_jll", "Markdown", "PrecompileTools", "Preferences", "RecursiveFactorization", "Reexport", "SciMLBase", "SciMLOperators", "Setfield", "SparseArrays", "Sparspak", "StaticArraysCore", "UnPack"]
+git-tree-sha1 = "b2e2dba60642e07c062eb3143770d7e234316772"
+uuid = "7ed4a6bd-45f5-4d41-b270-4a48e9bafcae"
+version = "2.30.2"
+
+ [deps.LinearSolve.extensions]
+ LinearSolveBandedMatricesExt = "BandedMatrices"
+ LinearSolveBlockDiagonalsExt = "BlockDiagonals"
+ LinearSolveCUDAExt = "CUDA"
+ LinearSolveCUDSSExt = "CUDSS"
+ 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"
+ CUDSS = "45b445bb-4962-46a0-9369-b4df9d0f772e"
+ 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 = "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 = "8084c25a250e00ae427a379a5b607e7aed96a2dd"
+uuid = "bdcacae8-1622-11e9-2a5c-532679323890"
+version = "0.12.171"
+weakdeps = ["ChainRulesCore", "ForwardDiff", "SpecialFunctions"]
+
+ [deps.LoopVectorization.extensions]
+ ForwardDiffExt = ["ChainRulesCore", "ForwardDiff"]
+ SpecialFunctionsExt = "SpecialFunctions"
+
+[[deps.MAT]]
+deps = ["BufferedStreams", "CodecZlib", "HDF5", "SparseArrays"]
+git-tree-sha1 = "1d2dd9b186742b0f317f2530ddcbf00eebb18e96"
+uuid = "23992714-dd62-5051-b70f-ba57cb901cac"
+version = "0.10.7"
+
+[[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.MLUtils]]
+deps = ["ChainRulesCore", "Compat", "DataAPI", "DelimitedFiles", "FLoops", "NNlib", "Random", "ShowCases", "SimpleTraits", "Statistics", "StatsBase", "Tables", "Transducers"]
+git-tree-sha1 = "b45738c2e3d0d402dffa32b2c1654759a2ac35a4"
+uuid = "f1d291b0-491e-4a28-83b9-f70985020b54"
+version = "0.4.4"
+
+[[deps.MPICH_jll]]
+deps = ["Artifacts", "CompilerSupportLibraries_jll", "Hwloc_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "MPIPreferences", "TOML"]
+git-tree-sha1 = "4099bb6809ac109bfc17d521dad33763bcf026b7"
+uuid = "7cb0a576-ebde-5e09-9194-50597f1243b4"
+version = "4.2.1+1"
+
+[[deps.MPIPreferences]]
+deps = ["Libdl", "Preferences"]
+git-tree-sha1 = "c105fe467859e7f6e9a852cb15cb4301126fac07"
+uuid = "3da0fdf6-3ccc-4f1b-acd9-58baa6c99267"
+version = "0.1.11"
+
+[[deps.MPItrampoline_jll]]
+deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "MPIPreferences", "TOML"]
+git-tree-sha1 = "8c35d5420193841b2f367e658540e8d9e0601ed0"
+uuid = "f1f71cc9-e9ae-5b93-9b94-4fe0e1ad3748"
+version = "5.4.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.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 = "1b9e613f2ca3b6cdcbfe36381e17ca2b66d4b3a1"
+uuid = "bb5d69b7-63fc-4a16-80bd-7e42200c7bdb"
+version = "0.1.3"
+
+[[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 = ["BangBang", "InitialValues", "Setfield"]
+git-tree-sha1 = "629afd7d10dbc6935ec59b32daeb33bc4460a42e"
+uuid = "128add7d-3638-4c79-886c-908ea0c25c34"
+version = "0.1.4"
+
+[[deps.MicrosoftMPI_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
+git-tree-sha1 = "f12a29c4400ba812841c6ace3f4efbb6dbb3ba01"
+uuid = "9237b28f-5490-5468-be7b-bb81f5f5e6cf"
+version = "10.1.4+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.MuladdMacro]]
+git-tree-sha1 = "cac9cc5499c25554cba55cd3c30543cff5ca4fab"
+uuid = "46d2c3a1-f734-5fdb-9937-b9b9aeba4221"
+version = "0.2.4"
+
+[[deps.Mustache]]
+deps = ["Printf", "Tables"]
+git-tree-sha1 = "a7cefa21a2ff993bff0456bf7521f46fc077ddf1"
+uuid = "ffc61752-8dc7-55ee-8c37-f3e9cdd09e70"
+version = "1.0.19"
+
+[[deps.Mux]]
+deps = ["AssetRegistry", "Base64", "HTTP", "Hiccup", "MbedTLS", "Pkg", "Sockets"]
+git-tree-sha1 = "7295d849103ac4fcbe3b2e439f229c5cc77b9b69"
+uuid = "a975b10e-0019-58db-a62f-e48ff68538c9"
+version = "1.0.2"
+
+[[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.NNlib]]
+deps = ["Adapt", "Atomix", "ChainRulesCore", "GPUArraysCore", "KernelAbstractions", "LinearAlgebra", "Pkg", "Random", "Requires", "Statistics"]
+git-tree-sha1 = "1288e6db94d98f7d194454452176b82edb25b32c"
+uuid = "872c559c-99b0-510c-b3b7-b6c96a88d5cd"
+version = "0.9.19"
+
+ [deps.NNlib.extensions]
+ NNlibAMDGPUExt = "AMDGPU"
+ NNlibCUDACUDNNExt = ["CUDA", "cuDNN"]
+ NNlibCUDAExt = "CUDA"
+ NNlibEnzymeCoreExt = "EnzymeCore"
+ NNlibFFTWExt = "FFTW"
+
+ [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"
+ 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.NameResolution]]
+deps = ["PrettyPrint"]
+git-tree-sha1 = "1a0fa0e9613f46c9b8c11eee38ebb4f590013c5e"
+uuid = "71a1bf82-56d0-4bbc-8a3c-48b961074391"
+version = "0.1.5"
+
+[[deps.NamedTupleTools]]
+git-tree-sha1 = "90914795fc59df44120fe3fff6742bb0d7adb1d0"
+uuid = "d9ec5142-1e00-5aa0-9d6a-321866360f50"
+version = "0.14.3"
+
+[[deps.NetworkOptions]]
+uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908"
+version = "1.2.0"
+
+[[deps.NonlinearSolve]]
+deps = ["ADTypes", "ArrayInterface", "ConcreteStructs", "DiffEqBase", "FastBroadcast", "FastClosures", "FiniteDiff", "ForwardDiff", "LazyArrays", "LineSearches", "LinearAlgebra", "LinearSolve", "MaybeInplace", "PrecompileTools", "Preferences", "Printf", "RecursiveArrayTools", "Reexport", "SciMLBase", "SimpleNonlinearSolve", "SparseArrays", "SparseDiffTools", "StaticArraysCore", "SymbolicIndexingInterface", "TimerOutputs"]
+git-tree-sha1 = "dc0d78eeed89323526203b8a11a4fa6cdbe25cd6"
+uuid = "8913a72c-1f9b-4ce2-8d82-65094dcecaec"
+version = "3.11.0"
+
+ [deps.NonlinearSolve.extensions]
+ NonlinearSolveBandedMatricesExt = "BandedMatrices"
+ NonlinearSolveFastLevenbergMarquardtExt = "FastLevenbergMarquardt"
+ NonlinearSolveFixedPointAccelerationExt = "FixedPointAcceleration"
+ NonlinearSolveLeastSquaresOptimExt = "LeastSquaresOptim"
+ NonlinearSolveMINPACKExt = "MINPACK"
+ NonlinearSolveNLSolversExt = "NLSolvers"
+ 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"
+ NLSolvers = "337daf1e-9722-11e9-073e-8b9effe078ba"
+ 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.ObjectFile]]
+deps = ["Reexport", "StructIO"]
+git-tree-sha1 = "195e0a19842f678dd3473ceafbe9d82dfacc583c"
+uuid = "d8793406-e978-5875-9003-1fc021f44a92"
+version = "0.4.1"
+
+[[deps.Observables]]
+git-tree-sha1 = "7438a59546cf62428fc9d1bc94729146d37a7225"
+uuid = "510215fc-4207-5dde-b226-833fc4488ee2"
+version = "0.5.5"
+
+[[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.OneHotArrays]]
+deps = ["Adapt", "ChainRulesCore", "Compat", "GPUArraysCore", "LinearAlgebra", "NNlib"]
+git-tree-sha1 = "963a3f28a2e65bb87a68033ea4a616002406037d"
+uuid = "0b1bfda6-eb8a-41d2-88d8-f5af5cad476f"
+version = "0.2.5"
+
+[[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.OpenMPI_jll]]
+deps = ["Artifacts", "CompilerSupportLibraries_jll", "Hwloc_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "MPIPreferences", "TOML", "Zlib_jll"]
+git-tree-sha1 = "a9de2f1fc98b92f8856c640bf4aec1ac9b2a0d86"
+uuid = "fe0851c0-eecd-5654-98d4-656369965a5c"
+version = "5.0.3+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 = "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.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.Optimisers]]
+deps = ["ChainRulesCore", "Functors", "LinearAlgebra", "Random", "Statistics"]
+git-tree-sha1 = "6572fe0c5b74431aaeb0b18a4aa5ef03c84678be"
+uuid = "3bd65402-5787-11e9-1adc-39752487f4e2"
+version = "0.3.3"
+
+[[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", "EnumX", "ExponentialUtilities", "FastBroadcast", "FastClosures", "FillArrays", "FiniteDiff", "ForwardDiff", "FunctionWrappersWrappers", "IfElse", "InteractiveUtils", "LineSearches", "LinearAlgebra", "LinearSolve", "Logging", "MacroTools", "MuladdMacro", "NonlinearSolve", "Polyester", "PreallocationTools", "PrecompileTools", "Preferences", "RecursiveArrayTools", "Reexport", "SciMLBase", "SciMLOperators", "SciMLStructures", "SimpleNonlinearSolve", "SimpleUnPack", "SparseArrays", "SparseDiffTools", "StaticArrayInterface", "StaticArrays", "TruncatedStacktraces"]
+git-tree-sha1 = "75b0d2bf28d0df92931919004a5be5304c38cca2"
+uuid = "1dea7af3-3e70-54e6-95c3-0bf5283fa5ed"
+version = "6.80.1"
+
+[[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.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.Pidfile]]
+deps = ["FileWatching", "Test"]
+git-tree-sha1 = "2d8aaf8ee10df53d0dfb9b8ee44ae7c04ced2b03"
+uuid = "fa939f87-e72e-5be4-a000-7fc836dbe307"
+version = "1.3.0"
+
+[[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", "Statistics"]
+git-tree-sha1 = "7b1a9df27f072ac4c9c7cbe5efb198489258d1f5"
+uuid = "995b91a9-d308-5afd-9ec6-746e21dbc043"
+version = "1.4.1"
+
+[[deps.PlotlyBase]]
+deps = ["ColorSchemes", "Dates", "DelimitedFiles", "DocStringExtensions", "JSON", "LaTeXStrings", "Logging", "Parameters", "Pkg", "REPL", "Requires", "Statistics", "UUIDs"]
+git-tree-sha1 = "56baf69781fc5e61607c3e46227ab17f7040ffa2"
+uuid = "a03496cd-edff-5a9b-9e67-9cda94a718b5"
+version = "0.8.19"
+
+[[deps.PlotlyJS]]
+deps = ["Base64", "Blink", "DelimitedFiles", "JSExpr", "JSON", "Kaleido_jll", "Markdown", "Pkg", "PlotlyBase", "PlotlyKaleido", "REPL", "Reexport", "Requires", "WebIO"]
+git-tree-sha1 = "e62d886d33b81c371c9d4e2f70663c0637f19459"
+uuid = "f0f68f2c-4968-5e81-91da-67840de0976a"
+version = "0.18.13"
+
+ [deps.PlotlyJS.extensions]
+ CSVExt = "CSV"
+ DataFramesExt = ["DataFrames", "CSV"]
+ IJuliaExt = "IJulia"
+ JSON3Ext = "JSON3"
+
+ [deps.PlotlyJS.weakdeps]
+ CSV = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b"
+ DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0"
+ IJulia = "7073ff75-c697-5162-941a-fcdaad2a7d2a"
+ JSON3 = "0f8b85d8-7281-11e9-16c2-39a750bddbf1"
+
+[[deps.PlotlyKaleido]]
+deps = ["Base64", "JSON", "Kaleido_jll"]
+git-tree-sha1 = "2650cd8fb83f73394996d507b3411a7316f6f184"
+uuid = "f2990250-8cf9-495f-b13a-cce12b45703c"
+version = "2.2.4"
+
+[[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.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 = "9ff799e8fb8ed6717710feee3be3bc20645daa97"
+uuid = "f517fe37-dbe3-4b94-8317-1923a5111588"
+version = "0.7.15"
+
+[[deps.PolyesterWeave]]
+deps = ["BitTwiddlingConvenienceFunctions", "CPUSummary", "IfElse", "Static", "ThreadingUtilities"]
+git-tree-sha1 = "645bed98cd47f72f67316fd42fc47dee771aefcd"
+uuid = "1d0040c9-8b98-4ee7-8388-3f51789ca0ad"
+version = "0.2.2"
+
+[[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 = "406c29a7f46706d379a3bce45671b4e3a39ddfbc"
+uuid = "d236fae5-4411-538c-8e31-a6e3d9e00b46"
+version = "0.4.22"
+weakdeps = ["ReverseDiff"]
+
+ [deps.PreallocationTools.extensions]
+ PreallocationToolsReverseDiffExt = "ReverseDiff"
+
+[[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.PrettyPrint]]
+git-tree-sha1 = "632eb4abab3449ab30c5e1afaa874f0b98b586e4"
+uuid = "8162dcfd-2161-5ef2-ae6c-7681170c5f98"
+version = "0.2.0"
+
+[[deps.Printf]]
+deps = ["Unicode"]
+uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7"
+
+[[deps.Profile]]
+deps = ["Printf"]
+uuid = "9abbd945-dff8-562f-b5e8-e1ebf5ef1b79"
+
+[[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 = "00099623ffee15972c16111bcf84c58a0051257c"
+uuid = "92933f4c-e287-5a05-a399-4b506db050ca"
+version = "1.9.0"
+
+[[deps.PtrArrays]]
+git-tree-sha1 = "f011fbb92c4d401059b2212c05c0601b70f8b759"
+uuid = "43287f4e-b6f4-7ad1-bb20-aadabca52c3d"
+version = "1.2.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 = "492601870742dcd38f233b23c3ec629628c1d724"
+uuid = "c0090381-4147-56d7-9ebc-da0b1113ec56"
+version = "6.7.1+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"]
+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", "Requires"]
+git-tree-sha1 = "043da614cc7e95c703498a491e2c21f58a2b8111"
+uuid = "e6cf234a-135c-5ec9-84dd-332b85af5143"
+version = "1.5.3"
+
+[[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", "SparseArrays", "StaticArraysCore", "Statistics", "SymbolicIndexingInterface", "Tables"]
+git-tree-sha1 = "3400ce27995422fb88ffcd3af9945565aad947f0"
+uuid = "731186ca-8d62-57ce-b412-fbd966d074cd"
+version = "3.23.1"
+
+ [deps.RecursiveArrayTools.extensions]
+ RecursiveArrayToolsFastBroadcastExt = "FastBroadcast"
+ RecursiveArrayToolsForwardDiffExt = "ForwardDiff"
+ RecursiveArrayToolsMeasurementsExt = "Measurements"
+ RecursiveArrayToolsMonteCarloMeasurementsExt = "MonteCarloMeasurements"
+ RecursiveArrayToolsReverseDiffExt = ["ReverseDiff", "Zygote"]
+ 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"
+ Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c"
+ Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f"
+
+[[deps.RecursiveFactorization]]
+deps = ["LinearAlgebra", "LoopVectorization", "Polyester", "PrecompileTools", "StrideArraysCore", "TriangularSolve"]
+git-tree-sha1 = "6db1a75507051bc18bfa131fbc7c3f169cc4b2f6"
+uuid = "f2c3362d-daeb-58d1-803e-2bc74f2840b4"
+version = "0.2.23"
+
+[[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.ReverseDiff]]
+deps = ["ChainRulesCore", "DiffResults", "DiffRules", "ForwardDiff", "FunctionWrappers", "LinearAlgebra", "LogExpFunctions", "MacroTools", "NaNMath", "Random", "SpecialFunctions", "StaticArrays", "Statistics"]
+git-tree-sha1 = "cc6cd622481ea366bb9067859446a8b01d92b468"
+uuid = "37e2e3b7-166d-5795-8a7a-e32c996b4267"
+version = "1.15.3"
+
+[[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"]
+git-tree-sha1 = "d483cd324ce5cf5d61b77930f0bbd6cb61927d21"
+uuid = "f50d1b31-88e8-58de-be2c-1cc44531875f"
+version = "0.4.2+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.SIMDTypes]]
+git-tree-sha1 = "330289636fb8107c5f32088d2741e9fd7a061a5c"
+uuid = "94e857df-77ce-4151-89e5-788b33177be4"
+version = "0.1.0"
+
+[[deps.SLEEFPirates]]
+deps = ["IfElse", "Static", "VectorizationBase"]
+git-tree-sha1 = "456f610ca2fbd1c14f5fcf31c6bfadc55e7d66e0"
+uuid = "476501e8-09a2-5ece-8869-fb82de89a1fa"
+version = "0.6.43"
+
+[[deps.SciMLBase]]
+deps = ["ADTypes", "Accessors", "ArrayInterface", "CommonSolve", "ConstructionBase", "Distributed", "DocStringExtensions", "EnumX", "FunctionWrappersWrappers", "IteratorInterfaceExtensions", "LinearAlgebra", "Logging", "Markdown", "PrecompileTools", "Preferences", "Printf", "RecipesBase", "RecursiveArrayTools", "Reexport", "RuntimeGeneratedFunctions", "SciMLOperators", "SciMLStructures", "StaticArraysCore", "Statistics", "SymbolicIndexingInterface", "Tables"]
+git-tree-sha1 = "281e82f2ae2b73262fed9e7a518711eb7feb7e59"
+uuid = "0bca4576-84f4-4d90-8ffe-ffa030f20462"
+version = "2.42.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 = ["ArrayInterface", "DocStringExtensions", "LinearAlgebra", "MacroTools", "Setfield", "SparseArrays", "StaticArraysCore"]
+git-tree-sha1 = "10499f619ef6e890f3f4a38914481cc868689cd5"
+uuid = "c0aeaf25-5076-4817-a8d5-81caf7dfa961"
+version = "0.3.8"
+
+[[deps.SciMLSensitivity]]
+deps = ["ADTypes", "Adapt", "ArrayInterface", "ChainRulesCore", "DiffEqBase", "DiffEqCallbacks", "DiffEqNoiseProcess", "Distributions", "EllipsisNotation", "Enzyme", "FiniteDiff", "ForwardDiff", "FunctionProperties", "FunctionWrappersWrappers", "Functors", "GPUArraysCore", "LinearAlgebra", "LinearSolve", "Markdown", "OrdinaryDiffEq", "Parameters", "PreallocationTools", "QuadGK", "Random", "RandomNumbers", "RecursiveArrayTools", "Reexport", "ReverseDiff", "SciMLBase", "SciMLOperators", "SparseDiffTools", "StaticArrays", "StaticArraysCore", "Statistics", "StochasticDiffEq", "Tracker", "TruncatedStacktraces", "Zygote"]
+git-tree-sha1 = "3b0fde1944502bd736bcdc3d0df577dddb54d189"
+uuid = "1ed8b502-d754-442c-8d5d-10ac956f44a1"
+version = "7.51.0"
+
+[[deps.SciMLStructures]]
+deps = ["ArrayInterface"]
+git-tree-sha1 = "cfdd1200d150df1d3c055cc72ee6850742e982d7"
+uuid = "53ae85a6-f571-4167-b2af-e1d143709226"
+version = "1.4.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.SharedArrays]]
+deps = ["Distributed", "Mmap", "Random", "Serialization"]
+uuid = "1a1011a3-84de-559e-8e89-a11a2f7dc383"
+
+[[deps.ShowCases]]
+git-tree-sha1 = "7f534ad62ab2bd48591bdeac81994ea8c445e4a5"
+uuid = "605ecd9f-84a6-4c9e-81e2-4798472b76a3"
+version = "0.1.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 = "874e8867b33a00e784c8a7e4b60afe9e037b74e1"
+uuid = "777ac1f9-54b0-4bf8-805c-2214025038e7"
+version = "1.1.0"
+
+[[deps.SimpleNonlinearSolve]]
+deps = ["ADTypes", "ArrayInterface", "ConcreteStructs", "DiffEqBase", "DiffResults", "FastClosures", "FiniteDiff", "ForwardDiff", "LinearAlgebra", "MaybeInplace", "PrecompileTools", "Reexport", "SciMLBase", "StaticArraysCore"]
+git-tree-sha1 = "c020028bb22a2f23cbd88cb92cf47cbb8c98513f"
+uuid = "727e6d20-b764-4bd8-a329-72de5adea6c7"
+version = "1.8.0"
+
+ [deps.SimpleNonlinearSolve.extensions]
+ SimpleNonlinearSolveChainRulesCoreExt = "ChainRulesCore"
+ SimpleNonlinearSolvePolyesterForwardDiffExt = "PolyesterForwardDiff"
+ SimpleNonlinearSolveReverseDiffExt = "ReverseDiff"
+ SimpleNonlinearSolveStaticArraysExt = "StaticArrays"
+ SimpleNonlinearSolveTrackerExt = "Tracker"
+ SimpleNonlinearSolveZygoteExt = "Zygote"
+
+ [deps.SimpleNonlinearSolve.weakdeps]
+ ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4"
+ PolyesterForwardDiff = "98d1487c-24ca-40b6-b7ab-df2af84e126b"
+ ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267"
+ StaticArrays = "90137ffa-7385-5640-81b9-e52037218182"
+ Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c"
+ Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f"
+
+[[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"
+version = "1.10.0"
+
+[[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.SparseInverseSubset]]
+deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"]
+git-tree-sha1 = "52962839426b75b3021296f7df242e40ecfc0852"
+uuid = "dc90abb0-5640-4711-901d-7e5b23a2fada"
+version = "0.1.2"
+
+[[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.SplittablesBase]]
+deps = ["Setfield", "Test"]
+git-tree-sha1 = "e08a62abc517eb79667d0a29dc08a3b589516bb5"
+uuid = "171d559e-b47b-412a-8079-5efa626c420e"
+version = "0.1.15"
+
+[[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 = "8963e5a083c837531298fc41599182a759a87a6d"
+uuid = "0d7ed370-da01-4f52-bd93-41d350b8b718"
+version = "1.5.1"
+weakdeps = ["OffsetArrays", "StaticArrays"]
+
+ [deps.StaticArrayInterface.extensions]
+ StaticArrayInterfaceOffsetArraysExt = "OffsetArrays"
+ StaticArrayInterfaceStaticArraysExt = "StaticArrays"
+
+[[deps.StaticArrays]]
+deps = ["LinearAlgebra", "PrecompileTools", "Random", "StaticArraysCore"]
+git-tree-sha1 = "eeafab08ae20c62c44c8399ccb9354a04b80db50"
+uuid = "90137ffa-7385-5640-81b9-e52037218182"
+version = "1.9.7"
+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.StatsFuns]]
+deps = ["HypergeometricFunctions", "IrrationalConstants", "LogExpFunctions", "Reexport", "Rmath", "SpecialFunctions"]
+git-tree-sha1 = "cef0472124fab0695b58ca35a77c6fb942fdab8a"
+uuid = "4c63d2b9-4356-54db-8cca-17b64c39e42c"
+version = "1.3.1"
+weakdeps = ["ChainRulesCore", "InverseFunctions"]
+
+ [deps.StatsFuns.extensions]
+ StatsFunsChainRulesCoreExt = "ChainRulesCore"
+ StatsFunsInverseFunctionsExt = "InverseFunctions"
+
+[[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 = "f35f6ab602df8413a50c4a25ca14de821e8605fb"
+uuid = "7792a7ef-975c-4747-a70f-980b88e8d1da"
+version = "0.5.7"
+
+[[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.StructIO]]
+deps = ["Test"]
+git-tree-sha1 = "010dc73c7146869c042b49adcdb6bf528c12e859"
+uuid = "53d494c1-5632-5724-8f4c-31dff12d585f"
+version = "0.3.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.2.1+1"
+
+[[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", "SuiteSparse_jll", "libblastrampoline_jll"]
+git-tree-sha1 = "ba4d38faeb62de7ef47155ed321dce40a549c305"
+uuid = "fb77eaff-e24c-56d4-86b1-d163f2edb164"
+version = "5.2.2+0"
+
+[[deps.SymbolicIndexingInterface]]
+deps = ["Accessors", "ArrayInterface", "RuntimeGeneratedFunctions", "StaticArraysCore"]
+git-tree-sha1 = "ebb8a46ffcef0f0cf17bf33ab61f33d9770f50d2"
+uuid = "2efcf032-c050-4f8e-a9bb-153293bab1f5"
+version = "0.3.25"
+
+[[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.ThreadPools]]
+deps = ["Printf", "RecipesBase", "Statistics"]
+git-tree-sha1 = "50cb5f85d5646bc1422aa0238aa5bfca99ca9ae7"
+uuid = "b189fb0b-2eb5-4ed4-bc0c-d34c51242431"
+version = "2.1.1"
+
+[[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 = "5a13ae8a41237cff5ecf34f73eb1b8f42fff6531"
+uuid = "a759f4b9-e2f1-59dc-863e-4aeb61b1ea8f"
+version = "0.5.24"
+
+[[deps.Tracker]]
+deps = ["Adapt", "ChainRulesCore", "DiffRules", "ForwardDiff", "Functors", "LinearAlgebra", "LogExpFunctions", "MacroTools", "NNlib", "NaNMath", "Optimisers", "Printf", "Random", "Requires", "SpecialFunctions", "Statistics"]
+git-tree-sha1 = "5158100ed55411867674576788e710a815a0af02"
+uuid = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c"
+version = "0.2.34"
+weakdeps = ["PDMats"]
+
+ [deps.Tracker.extensions]
+ TrackerPDMatsExt = "PDMats"
+
+[[deps.TranscodingStreams]]
+git-tree-sha1 = "d73336d81cafdc277ff45558bb7eaa2b04a8e472"
+uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa"
+version = "0.10.10"
+weakdeps = ["Random", "Test"]
+
+ [deps.TranscodingStreams.extensions]
+ TestExt = ["Test", "Random"]
+
+[[deps.Transducers]]
+deps = ["Adapt", "ArgCheck", "BangBang", "Baselet", "CompositionsBase", "ConstructionBase", "DefineSingletons", "Distributed", "InitialValues", "Logging", "Markdown", "MicroCollections", "Requires", "Setfield", "SplittablesBase", "Tables"]
+git-tree-sha1 = "3064e780dbb8a9296ebb3af8f440f787bb5332af"
+uuid = "28d57a85-8fef-5791-bfe6-a80928e7c999"
+version = "0.4.80"
+
+ [deps.Transducers.extensions]
+ TransducersBlockArraysExt = "BlockArrays"
+ TransducersDataFramesExt = "DataFrames"
+ TransducersLazyArraysExt = "LazyArrays"
+ TransducersOnlineStatsBaseExt = "OnlineStatsBase"
+ TransducersReferenceablesExt = "Referenceables"
+
+ [deps.Transducers.weakdeps]
+ 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.TriangularSolve]]
+deps = ["CloseOpenIntervals", "IfElse", "LayoutPointers", "LinearAlgebra", "LoopVectorization", "Polyester", "Static", "VectorizationBase"]
+git-tree-sha1 = "be986ad9dac14888ba338c2554dcfec6939e1393"
+uuid = "d5829a12-d9aa-46ab-831f-fb7c9ab06edf"
+version = "0.2.1"
+
+[[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 = "dd260903fdabea27d9b6021689b3cd5401a57748"
+uuid = "1986cc42-f94f-5a68-af5c-568840ba703d"
+version = "1.20.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.UnsafeAtomics]]
+git-tree-sha1 = "6331ac3440856ea1988316b46045303bef658278"
+uuid = "013be700-e6cd-48c3-b4a1-df204f14c38f"
+version = "0.2.1"
+
+[[deps.UnsafeAtomicsLLVM]]
+deps = ["LLVM", "UnsafeAtomics"]
+git-tree-sha1 = "bf2c553f25e954a9b38c9c0593a59bb13113f9e5"
+uuid = "d80eeb9a-aca5-4d75-85e5-170c8b632249"
+version = "0.1.5"
+
+[[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 = "e7f5b81c65eb858bed630fe006837b935518aca5"
+uuid = "3d5dd08c-fd9d-11e8-17fa-ed2836048c2f"
+version = "0.21.70"
+
+[[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.WebIO]]
+deps = ["AssetRegistry", "Base64", "Distributed", "FunctionalCollections", "JSON", "Logging", "Observables", "Pkg", "Random", "Requires", "Sockets", "UUIDs", "WebSockets", "Widgets"]
+git-tree-sha1 = "0eef0765186f7452e52236fa42ca8c9b3c11c6e3"
+uuid = "0f1e0344-ec1d-5b48-a673-e5cf874b6c29"
+version = "0.8.21"
+
+[[deps.WebSockets]]
+deps = ["Base64", "Dates", "HTTP", "Logging", "Sockets"]
+git-tree-sha1 = "4162e95e05e79922e44b9952ccbc262832e4ad07"
+uuid = "104b5d7c-a370-577a-8038-80a2059c5097"
+version = "1.6.0"
+
+[[deps.Widgets]]
+deps = ["Colors", "Dates", "Observables", "OrderedCollections"]
+git-tree-sha1 = "fcdae142c1cfc7d89de2d11e08721d0f2f86c98a"
+uuid = "cc8bc4a8-27d6-5769-a93b-9d913e69aa62"
+version = "0.6.6"
+
+[[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 = "d9717ce3518dc68a99e6b96300813760d887a01d"
+uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a"
+version = "2.13.1+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.ZipFile]]
+deps = ["Libdl", "Printf", "Zlib_jll"]
+git-tree-sha1 = "f492b7fe1698e623024e873244f10d89c95c340a"
+uuid = "a5390f91-8eb1-5f08-bee0-b1d1ffed6cea"
+version = "0.10.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 = "e678132f07ddb5bfa46857f0d7620fb9be675d3b"
+uuid = "3161d3a3-bdf6-5164-811a-617609db77b4"
+version = "1.5.6+0"
+
+[[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 = "19c586905e78a26f7e4e97f81716057bd6b1bc54"
+uuid = "e88e6eb3-aa80-5325-afca-941959d7151f"
+version = "0.6.70"
+weakdeps = ["Colors", "Distances", "Tracker"]
+
+ [deps.Zygote.extensions]
+ ZygoteColorsExt = "Colors"
+ ZygoteDistancesExt = "Distances"
+ ZygoteTrackerExt = "Tracker"
+
+[[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 = "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.libaec_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "46bf7be2917b59b761247be3f317ddf75e50e997"
+uuid = "477f73a3-ac25-53e9-8cc3-50b2fa2566f0"
+version = "1.1.2+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.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:
+# ╟─1470df0f-40e1-45d5-a4cc-519cc3b28fb8
+# ╟─7d694be0-cd3f-46ae-96a3-49d07d7cf65a
+# ╟─6fc16c34-c0c8-48ce-87b3-011a9a0f4e7c
+# ╟─8a82d8c7-b781-4600-8780-0a0a003b676c
+# ╟─a02f77d1-00d2-46a3-91ba-8a7f5b4bbdc9
+# ╠═a1ee798d-c57b-4cc3-9e19-fb607f3e1e43
+# ╟─02f0add7-9c4e-4358-8b5e-6863bae3ee75
+# ╠═72604eef-5951-4934-844d-d2eb7eb0292c
+# ╠═21104cd1-9fe8-45db-9c21-b733258ff155
+# ╠═9d9e5139-d27e-48c8-a62e-33b2ae5b0086
+# ╟─85308992-04c4-4d20-a840-6220cab54680
+# ╠═eaae989a-c9d2-48ca-9ef8-fd0dbff7bcca
+# ╠═98c608d9-c60e-4eb6-b611-69d2ae7054c9
+# ╠═de7a4639-e3b8-4439-924d-7d801b4b3eeb
+# ╟─5cb505f7-01bd-4824-8876-3e0f5a922fb7
+# ╠═45c4b9dd-0b04-43ae-a715-cd120c571424
+# ╠═33d648d3-e66e-488f-a18d-e538ebe9c000
+# ╟─1e9541b8-5394-418d-8c27-2831951c538d
+# ╠═e6e91a22-7724-46a3-88c1-315c40660290
+# ╟─44500f0a-1b89-44af-b135-39ce0fec5810
+# ╟─33223393-bfb9-4e9a-8ea6-a3ab6e2f22aa
+# ╟─74d23661-751b-4371-bf6b-986149124e81
+# ╠═c88b0627-2e04-40ab-baa2-b4c1edfda0c3
+# ╟─915e4601-12cc-4b7e-b2fe-574e116f3a92
+# ╟─f8e40baa-c1c5-424a-9780-718a42fd2b67
+# ╠═74289e0b-1292-41eb-b13b-a4a5763c72b0
+# ╟─f111e772-a340-4217-9b63-e7715f773b2c
+# ╟─92ad1a99-4ad9-4b69-b6f3-84aab49db54f
+# ╟─909de9f1-2aca-4bf0-ba60-d3418964ba4a
+# ╟─d8ca5f66-4f55-48ab-a6c9-a0be662811d9
+# ╠═41b1c7cb-5e3f-4074-a681-36dd2ef94454
+# ╠═8f45871f-f72a-423f-8101-9ce93e5a885b
+# ╠═57c039f7-5b24-4d63-b864-d5f808110b91
+# ╟─4510022b-ad28-4fc2-836b-e4baf3c14d26
+# ╠═9589416a-f9b3-4b17-a381-a4f660a5ee4c
+# ╟─326ae469-43ab-4bd7-8dc4-64575f4a4d3e
+# ╠═8f8f91cc-9a92-4182-8f18-098ae3e2c553
+# ╟─8d93a1ed-28a9-4a77-9ac2-5564be3729a5
+# ╠═4a8de267-1bf4-42c2-8dfe-5bfa21d74b7e
+# ╟─6a8b98c9-e51a-4f1c-a3ea-cc452b9616b7
+# ╟─dbde2da3-e3dc-4b78-8f69-554018533d35
+# ╠═d42d0beb-802b-4d30-b5b8-683d76af7c10
+# ╟─e50d7cc2-7155-42cf-9fef-93afeee6ffa4
+# ╟─3756dd37-03e0-41e9-913e-4b4f183d8b81
+# ╠═2f83bc62-5a54-472a-87a2-4ddcefd902b6
+# ╟─c228eb10-d694-46aa-b952-01d824879287
+# ╟─16ffc610-3c21-40f7-afca-e9da806ea626
+# ╠═052f2f19-767b-4ede-b268-fce0aee133ad
+# ╟─746fbf6f-ed7c-43b8-8a6f-0377cd3cf85e
+# ╟─08e1ff54-d115-4da9-8ea7-5e89289723b3
+# ╟─70c6b605-54fa-40a3-8bce-a88daf6a2022
+# ╠═634f923a-5e09-42c8-bac0-bf165ab3d12a
+# ╟─f59b5c84-2eae-4e3f-aaec-116c090d454d
+# ╠═0c9493c4-322e-41a0-9ec7-2e2c54ae1373
+# ╟─325c3032-4c78-4408-b86e-d9aa4cfc3187
+# ╠═25e55d1c-388f-469d-99e6-2683c0508693
+# ╟─74c519c9-0eef-4798-acff-b11044bb4bf1
+# ╟─786c4652-583d-43e9-a101-e28c0b6f64e4
+# ╟─5d688c3d-b5e3-4a3a-9d91-0896cc001000
+# ╠═2e08df84-a468-4e99-a277-e2813dfeae5c
+# ╟─68719de3-e11e-4909-99a3-5e05734cc8b1
+# ╟─b42bf3d8-e70c-485c-89b3-158eb25d8b25
+# ╟─c446ed22-3b23-487d-801e-c23742f81047
+# ╠═fc3d7989-ac10-4a82-8777-eeecd354a7d0
+# ╟─0a7955e7-7c1a-4396-9613-f8583195c0a8
+# ╟─4912d9c9-d68d-4afd-9961-5d8315884f75
+# ╟─19942162-cd4e-487c-8073-ea6b262d299d
+# ╟─73575386-673b-40cc-b3cb-0b8b4f66a604
+# ╟─24861a50-2319-4c63-a800-a0a03279efe2
+# ╟─93735dca-c9f3-4f1a-b1bd-dfe312a0644a
+# ╟─13ede3cd-99b1-4e65-8a18-9043db544728
+# ╟─f7c119dd-c123-4c43-812e-d0625817d77e
+# ╟─f4e66f76-76ff-4e21-b4b5-c1ecfd846329
+# ╟─ea655baa-b4d8-4fce-b699-6a732dc06051
+# ╟─cae2e094-b6a2-45e4-9afd-a6b78e912ab7
+# ╟─ac0afa6c-b6ec-4577-aeb6-10d1ec63fa41
+# ╟─5b8084b1-a8be-4bf3-b86d-e2603ae36c5b
+# ╟─5e9cb956-d5ea-4462-a649-b133a77929b0
+# ╟─9dc93971-85b6-463b-bd17-43068d57de94
+# ╟─476a1ed7-c865-4878-a948-da73d3c81070
+# ╟─0b6b4f6d-be09-42f3-bc2c-5f17a8a9ab0e
+# ╟─a1aca180-d561-42a3-8d12-88f5a3721aae
+# ╟─3bc2b859-d7b1-4b79-88df-8fb517a6929d
+# ╟─a501d998-6fd6-496f-9718-3340c42b08a6
+# ╟─83a2122d-56da-4a80-8c10-615a8f76c4c1
+# ╟─e342be7e-0806-4f72-9e32-6d74ed3ed3f2
+# ╟─eaf37128-0377-42b6-aa81-58f0a815276b
+# ╟─c030d85e-af69-49c9-a7c8-e490d4831324
+# ╟─51c200c9-0de3-4e50-8884-49fe06158560
+# ╟─0dadd112-3132-4491-9f02-f43cf00aa1f9
+# ╟─5c2308d9-6d04-4b38-af3b-6241da3b6871
+# ╟─bf6bf640-54bc-44ef-bd4d-b98e934d416e
+# ╟─639889b3-b9f2-4a3c-999d-332851768fd7
+# ╟─007d6d95-ad85-4804-9651-9ac3703d3b40
+# ╟─ed1887df-5079-4367-ab04-9d02a1d6f366
+# ╟─0b0c4650-2ce1-4879-9acd-81c16d06700e
+# ╟─b864631b-a9f3-40d4-a6a8-0b57a37a476d
+# ╟─0fb90681-5d04-471a-a7a8-4d0f3ded7bcf
+# ╟─95e14ea5-d82d-4044-8c68-090d74d95a61
+# ╟─2fa1821b-aaec-4de4-bfb4-89560790dc39
+# ╟─cbae6aa4-1338-428c-86aa-61d3304e33ed
+# ╟─9b52a65a-f20c-4387-aaca-5292a92fb639
+# ╟─8c56acd6-94d3-4cbc-bc29-d249740268a0
+# ╟─845a95c4-9a35-44ae-854c-57432200da1a
+# ╟─5a399a9b-32d9-4f93-a41f-8f16a4b102dc
+# ╟─fd1cebf1-5ccc-4bc5-99d4-1eaa30e9762e
+# ╟─93771b35-4edd-49e3-bed1-a3ccdb7975e6
+# ╟─1cd976fb-db40-4ebe-b40d-b996e16fc213
+# ╟─e79badcd-0396-4a44-9318-8c6b0a94c5c8
+# ╟─2a5157c5-f5a2-4330-b2a3-0c1ec0b7adff
+# ╟─4454c8d2-68ed-44b4-adfa-432297cdc957
+# ╟─d240c95c-5aba-4b47-ab8d-2f9c0eb854cd
+# ╟─06937575-9ab1-41cd-960c-7eef3e8cae7f
+# ╟─356b6029-de66-418f-8273-6db6464f9fbf
+# ╟─5805a216-2536-44ac-a702-d92e86d435a4
+# ╟─68d57a23-68c3-418c-9c6f-32bdf8cafceb
+# ╟─53e971d8-bf43-41cc-ac2b-20dceaa78667
+# ╟─e8b8c63b-2ca4-4e6a-a801-852d6149283e
+# ╟─c0ac7902-0716-4f18-9447-d18ce9081ba5
+# ╟─84215a73-1ab0-416d-a9db-6b29cd4f5d2a
+# ╟─bc09bd09-2874-431a-bbbb-3d53c632be39
+# ╠═f741b213-a20d-423a-a382-75cae1123f2c
+# ╟─f02b9118-3fb5-4846-8c08-7e9bbca9d208
+# ╠═91473bef-bc23-43ed-9989-34e62166d455
+# ╟─55c22dae-fba8-4e79-8c25-462ed7519ad2
+# ╟─d347d51b-743f-4fec-bed7-6cca2b17bacb
+# ╟─d60d2561-51a4-4f8a-9819-898d70596e0c
+# ╟─c97f2dea-cb18-409d-9ae8-1d03647a6bb3
+# ╟─366abd1a-bcb5-480d-b1fb-7c76930dc8fc
+# ╟─7e2ffd6f-19b0-435d-8e3c-df24a591bc55
+# ╠═caa5e04a-2375-4c56-8072-52c140adcbbb
+# ╟─69657be6-6315-4655-81e2-8edef7f21e49
+# ╟─23ad65c8-5723-4858-9abe-750c3b65c28a
+# ╟─e8bae97d-9f90-47d2-9263-dc8fc065c3d0
+# ╟─2dce68a7-27ec-4ffc-afba-87af4f1cb630
+# ╟─c3f5704b-8e98-4c46-be7a-18ab4f139458
+# ╟─2f917499-6234-4467-886d-689e4c5aa920
+# ╟─ff106912-d18c-487f-bcdd-7b7af2112cab
+# ╟─51eeb67f-a984-486a-ab8a-a2541966fa72
+# ╟─27458e32-5891-4afc-af8e-7afdf7e81cc6
+# ╠═4b68b48d-7c58-4bf1-920b-c60f787d2ede
+# ╟─737e2c50-0858-4205-bef3-f541e33b85c3
+# ╟─5dd491a4-a8cd-4baf-96f7-7a0b850bb26c
+# ╟─4f27b6c0-21da-4e26-aaad-ff453c8af3da
+# ╠═1195a30c-3b48-4bd2-8a3a-f4f74f3cd864
+# ╟─b0ce7b92-93e0-4715-8324-3bf4ff42a0b3
+# ╟─6353e78a-57d5-43cd-a1fa-ff88af32d173
+# ╟─919419fe-35de-44bb-89e4-8f8688bee962
+# ╟─2918daf2-6499-4019-a04b-8c3419ee1ab7
+# ╟─048e39c3-a3d9-4e6b-b050-1fd5a919e4ae
+# ╟─b489f97d-ee90-48c0-af06-93b66a1f6d2e
+# ╟─4dad3e55-5bfd-4315-bb5a-2680e5cbd11c
+# ╟─ea0ede8d-7c2c-4e72-9c96-3260dc8d817d
+# ╟─35f52dbc-0c0b-495e-8fd4-6edbc6fa811e
+# ╟─51aed933-2067-4ea8-9c2f-9d070692ecfc
+# ╟─8d9dc86e-f38b-41b1-80c6-b2ab6f488a3a
+# ╟─74ef5a39-1dd7-404a-8baf-caa1021d3054
+# ╟─05281c4f-dba8-4070-bce3-dc2f1319902e
+# ╟─67cfe7c5-8e62-4bf0-996b-19597d5ad5ef
+# ╟─88884204-79e4-4412-b861-ebeb5f6f7396
+# ╟─00000000-0000-0000-0000-000000000001
+# ╟─00000000-0000-0000-0000-000000000002
diff --git a/examples/pluto-src/HybridModelingUsingFMI/src/plan_complete.png b/examples/pluto-src/SciMLUsingFMUs/src/plan_complete.png
similarity index 100%
rename from examples/pluto-src/HybridModelingUsingFMI/src/plan_complete.png
rename to examples/pluto-src/SciMLUsingFMUs/src/plan_complete.png
diff --git a/examples/pluto-src/HybridModelingUsingFMI/src/plan_e1.png b/examples/pluto-src/SciMLUsingFMUs/src/plan_e1.png
similarity index 100%
rename from examples/pluto-src/HybridModelingUsingFMI/src/plan_e1.png
rename to examples/pluto-src/SciMLUsingFMUs/src/plan_e1.png
diff --git a/examples/pluto-src/HybridModelingUsingFMI/src/plan_e2.png b/examples/pluto-src/SciMLUsingFMUs/src/plan_e2.png
similarity index 100%
rename from examples/pluto-src/HybridModelingUsingFMI/src/plan_e2.png
rename to examples/pluto-src/SciMLUsingFMUs/src/plan_e2.png
diff --git a/examples/pluto-src/HybridModelingUsingFMI/src/plan_e3.png b/examples/pluto-src/SciMLUsingFMUs/src/plan_e3.png
similarity index 100%
rename from examples/pluto-src/HybridModelingUsingFMI/src/plan_e3.png
rename to examples/pluto-src/SciMLUsingFMUs/src/plan_e3.png
diff --git a/examples/pluto-src/HybridModelingUsingFMI/src/plan_train.png b/examples/pluto-src/SciMLUsingFMUs/src/plan_train.png
similarity index 100%
rename from examples/pluto-src/HybridModelingUsingFMI/src/plan_train.png
rename to examples/pluto-src/SciMLUsingFMUs/src/plan_train.png
diff --git a/src/scheduler.jl b/src/scheduler.jl
index 4c64f081..4ae8c67e 100644
--- a/src/scheduler.jl
+++ b/src/scheduler.jl
@@ -206,7 +206,7 @@ mutable struct SequentialScheduler <: BatchScheduler
end
end
-function initialize!(scheduler::BatchScheduler; runkwargs...)
+function initialize!(scheduler::BatchScheduler; print::Bool=true, runkwargs...)
lastIndex = 0
scheduler.step = 0
@@ -216,7 +216,7 @@ function initialize!(scheduler::BatchScheduler; runkwargs...)
scheduler.runkwargs = runkwargs
end
- scheduler.elementIndex = apply!(scheduler)
+ scheduler.elementIndex = apply!(scheduler; print=print)
if scheduler.plotStep > 0
plot(scheduler, lastIndex)
@@ -230,7 +230,7 @@ function update!(scheduler::BatchScheduler; print::Bool=true)
scheduler.step += 1
if scheduler.applyStep > 0 && scheduler.step % scheduler.applyStep == 0
- scheduler.elementIndex = apply!(scheduler)
+ scheduler.elementIndex = apply!(scheduler; print=print)
end
# max/avg error
@@ -491,4 +491,4 @@ function apply!(scheduler::SequentialScheduler; print::Bool=true)
end
return next
-end
\ No newline at end of file
+end
diff --git a/test/Project.toml b/test/Project.toml
index b66bca63..7c352f1a 100644
--- a/test/Project.toml
+++ b/test/Project.toml
@@ -8,3 +8,6 @@ Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80"
Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"
Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2"
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
+
+[compat]
+FMIZoo = "0.3.0"
diff --git a/test/hybrid_ME_dis.jl b/test/hybrid_ME_dis.jl
index 622a94e3..223b35ce 100644
--- a/test/hybrid_ME_dis.jl
+++ b/test/hybrid_ME_dis.jl
@@ -146,8 +146,8 @@ for solver in solvers
net = nets[i]
problem = ME_NeuralFMU(fmu, net, (t_start, t_stop), solver)
- if i ∈ (3, 4, 6)
- @warn "Currently skipping nets ∈ (3, 4, 6)"
+ if i ∈ (1, 2, 3, 4, 6)
+ @warn "Currently skipping nets ∈ (1, 2, 3, 4, 6)"
continue
end