diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..496ee2c --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.DS_Store \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..7de558d --- /dev/null +++ b/README.md @@ -0,0 +1,82 @@ +# Julia: Solving Real-World Problems with Computation, Fall 2023 (under construction) + +## Logistics + +**MIT's numbering scheme gone nuts:** (1.C25/6.C25/12.C25/16.C25/18.C25/22.C25) +This course is part of the [Common Ground](https://computing.mit.edu/cross-cutting/common-ground-for-computing-education/common-ground-subjects/). + +**Lectures:** Tuesdays & Thursdays 1-2:30 PM in room 2-142 + +**Prerequisites:** 6.100A, 18.03, 18.06 or equivalents (meaning some programming, dif eqs, and lin alg) + +**Instructors:** A. Edelman, R. Ferrari, Y. Marzouk, P. Persson (UCB), S. Silvestri, J. Urschel, J. Williams +**Teaching Assistants:** +**Office Hours:** TBD + +**Grading:** Homeworks that may be spaced one or two weeks, to be submitted on canvas. No exams. +**Lecture Recordings:** Available on Canvas under the Panopto Video tab. Should be published the evening after each lecture. +**Links:** Worth bookmarking. + +| [Piazza](https://piazza.com/class/lm7pcjq3cbq2fm) | [Canvas](https://canvas.mit.edu/courses/21713) | [Julia](https://julialang.org/) | [JuliaHub](https://juliahub.com/ui/Home) | +| ----------------------------------------------- | ---------------------------------------------- | ------------------------------- | ---------------------------------------- | +| Discussion | HW submission | Language | GPUs | + +## Description + +Focuses on algorithms and techniques for writing and using modern technical software in a job, lab, or research group environment that may consist of interdisciplinary teams, where performance may be critical, and where the software needs to be flexible and adaptable. Topics include automatic differentiation, matrix calculus, scientific machine learning, parallel and GPU computing, and performance optimization with introductory applications to climate science, economics, agent-based modeling, and other areas. Labs and projects focus on performant, readable, composable algorithms and software. Programming will be in Julia. Expects students have some familiarity with Python, Matlab, or R. No Julia experience necessary. + +Counts as an elective for CEE students, an advanced subject (18.100 and higher) for Math students, an advanced elective for EECS students, and a computation restricted elective for NSE students. AeroAstro students can petition department to count this class as a professional subject in the computing area. +(Professors may be open to petitioning for counting for other programs.) + +Class is appropriate for those who enjoy math and wish to see math being used in modern contexts. + +While not exactly the same as our past [Computational Thinking Class](https://computationalthinking.mit.edu/Spring21/)... not entirely different either. + +## Homeworks at a glance + +| Homework | Assigned | Due | Topic | +| ------------------------------------------------------------------------------------------------------ | -------- | ------ | ------------------------------------------------- | +| [HW0](https://mit-c25-fall23.netlify.app/homeworks/hw0) | Sep 7 | Sep 14 | Getting Started | + +Each student gets to turn in one homework late without justification. +Further late turn ins must be justified. +Remember: just because the automated tests succeed doesn't mean your code is 100% correct. +It is a necessary, but not sufficient condition. + +Homework solutions will be put online after each deadline. + +## Lectures at a glance (based on the 2022 class, will be modified based on students' interest this year) + +| # | Day | Date | Lecturer | Topic | Slides / Notes | Notebooks | +| ------ | --- | ----- | ------------------------------- | ---------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| 0 | | | TAs | Julia tutorial | [Cheat Sheets](https://computationalthinking.mit.edu/Fall23/cheatsheets/) | | +| 1 | R | 9/7| Edelman | Intro to Julia | | [Intro to Julia](https://gdalle.github.io/IntroJulia/), [Tutorial](https://mit-c25-fall23.netlify.app/notebooks/0_julia_tutorial), [Hyperbolic Corgi](https://mit-c25-fall23.netlify.app/notebooks/1_hyperbolic_corgi), [Images](https://mit-c25-fall23.netlify.app/notebooks/1_images), [Abstraction](https://mit-c25-fall23.netlify.app/notebooks/1_abstraction), | +| 2 | T | 9/12 | Edelman | Matrix Calculus | [Matrix Calc 1](https://docs.google.com/presentation/d/1TGZ5I3ZP907-itZrslKF4miReNzV1dAOXNU4QMCHkd8/edit#slide=id.p) | [Matrix Jacobians](), [Finite Differences]() | +| 3 | R | 9/14 | Edelman | Matrix Calculus | [Matrix Calc 2](https://docs.google.com/presentation/d/1IuwijmdWCes1Quh1gJxbHoMbA50Tk0xxXnaPvu3tQjQ/edit#slide=id.g15504621cdd_0_0) | [Linear Transformations](https://mit-c25-fall22.netlify.app/notebooks/3_linear_transformations), [Symmetric Eigenproblems](https://mit-c25-fall22.netlify.app/notebooks/3_symmetric_eigenvalue_derivatives) | +| 4 | T | 9/19 | Edelman | Automatic Differentiation | [Scribed notes](https://hackmd.io/L2asbUw4RMCtGbknFOmTWw) | +| 5 | R | 9/21 | Edelman | Automatic Differentiation | [Handwritten Notes (to be improved)](https://github.com/mitmath/JuliaComputation/blob/main/slides/ad_handwritten.pdf) | [Reverse Mode AutoDiff Demo](https://simeonschaub.github.io/ReverseModePluto/notebook.html) | +| 6 | T | 9/26 | Persson | Mesh Generation | [Mesh generation](slides/mesh_generation.pdf) | [Computational Geometry](https://mit-c25-fall22.netlify.app/notebooks/4_computational_geometry) | +| 7 | R | 9/28 | Persson | Mesh Generation | | +| 8 | T | 10/3 | Ferrari | Greenhouse Effect | | [Greenhouse effect](https://mit-c25-fall22.netlify.app/notebooks/8_greenhouse_effect) | +| 9 | R | 10/5 | Ferrari | Equilibrium and transient climate sensitivity | | [Climate sensitivity](https://mit-c25-fall22.netlify.app/notebooks/9_climate_sensitivity.html) | +| | T | 10/10 | *Student Holiday* | | +| 10 | R | 10/12 | Silvestri | Climate Science | | [Solving the climate system](https://mit-c25-fall22.netlify.app/notebooks/10_climate_science) | +| 11 | T | 10/17 | Silvestri | Climate Science | | | +| 12 | R | 10/19 | Edelman | Economic Model of Climate | | [Economic Model](https://computationalthinking.mit.edu/Spring21/inverse_climate_model/), [Optimization with JUMP](https://computationalthinking.mit.edu/Spring21/optimization_with_JuMP/) | +| 13 | T | 10/24 | Edelman | HPC and GPUs | [HPC and GPU Slides](https://docs.google.com/presentation/d/1i6w4p26r_9lu_reHYZDIVnzh-4SdERVAoSI5i42lBU8/edit?usp=sharing) | [N-body with FLoops](https://mit-c25-fall22.netlify.app/notebooks/floop_nbody), [JuliaHub demo](https://mit-c25-fall22.netlify.app/notebooks/juliahub_in_class_110122) | +| 14 | R | 10/26 | Edelman | HPC and GPUs | +| 15 | T | 10/31 | Edelman | Imaging and Convolutions | +| 16 | R | 11/2 | Edelman | Convolutions and PDEs | +| 17 | T | 11/7 | | Handling Satellite Climate Data | [Lesson plan](https://docs.google.com/document/d/1G_FKAgjBiHD4XdCW6kH5-x_3rz2JiCIkil5xIxT0eEg/edit), [Problem set](https://docs.google.com/document/d/1AAsKg9ZclFNPI_vDZP-9FVif8qBwBLvonIS-DBu4c7k/edit?usp=sharing) | +| 18 | R | 11/9 | | Apache Arrow in Julia for massive datastores | [Lesson plan](https://docs.google.com/document/d/15DKYzkX00B8ottqq-Qv51oo30iU3VJezu0U82R-1EJk/edit) | +| 19 | T | 11/14 | Dalle | Good programming practices + challenge | | [Good practices](https://mit-c25-fall22.netlify.app/notebooks/gdalle/good_practices), [Challenge](https://mit-c25-fall22.netlify.app/notebooks/gdalle/challenge) | +| 20 | R | 11/16 | Dalle | Performance recap + graph representations | | [Performance](https://mit-c25-fall22.netlify.app/notebooks/gdalle/performance), [Graphs](https://mit-c25-fall22.netlify.app/notebooks/gdalle/graphs) | +| 21 | T | 11/21| Dalle | Formulating and solving linear programs | | [Linear programming](https://mit-c25-fall22.netlify.app/notebooks/gdalle/linear_programming) | +| | R | 11/23| *Thanksgiving* | | +| 22 | T | 11/28 | Dalle | Implicit differentiation | [Paper](https://arxiv.org/abs/2105.15183), [Talk](https://youtu.be/TkVDcujVNJ4) | [Package](https://github.com/gdalle/ImplicitDifferentiation.jl) | | +| 23 | R | 11/30 | Urschel | Computational sports mathematics | +| 24 | T | 12/5 | Urschel | Computational sports mathematics | +| 25 | R | 12/7 | Edelman | Discrete and Continuous, are they so very different? | | +| 26 | T | 12/12 | Class Party | | + + diff --git a/homeworks/hw0.html b/homeworks/hw0.html new file mode 100644 index 0000000..153c3b4 --- /dev/null +++ b/homeworks/hw0.html @@ -0,0 +1,16 @@ + + + + + + +
\ No newline at end of file diff --git a/homeworks/hw0.jl b/homeworks/hw0.jl new file mode 100644 index 0000000..3069a89 --- /dev/null +++ b/homeworks/hw0.jl @@ -0,0 +1,723 @@ +### A Pluto.jl notebook ### +# v0.19.27 + +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 + +# ╔═║ d6ee91ea-e750-11ea-1260-31ebf3ec6a9b +using Compose + +# ╔═║ 5acd58e0-e856-11ea-2d3d-8329889fe16f +using PlutoUI + +# ╔═║ fafae38e-e852-11ea-1208-732b4744e4c2 +md"_Homework 0, version 5 -- Fall 2023_" + +# ╔═║ 7308bc54-e6cd-11ea-0eab-83f7535edf25 +# edit the code below to set your name and kerberos ID (i.e. email without @mit.edu) + +student = (name = "Jazzy Doe", kerberos_id = "jazz") + +# press the β–Ά button in the bottom right of this cell to run your edits +# or use Shift+Enter + +# you might need to wait until all other cells in this notebook have completed running. +# scroll down the page to see what's up + +# ╔═║ cdff6730-e785-11ea-2546-4969521b33a7 +md""" + +Submission by: **_$(student.name)_** ($(student.kerberos_id)@mit.edu) +""" + +# ╔═║ a2181260-e6cd-11ea-2a69-8d9d31d1ef0e +md""" +# Homework 0: Getting up and running + +HW0 release date: Thursday, Sep 7, 2023. + +**HW0 due date: Thursday, Sep 14, 2023, 11:59pm EST**, _but best completed before Thursday's lecture if possible_. + +First of all, **_welcome to the course!_** We are excited to teach you about real world applications of scientific computing, using the same tools that we work with ourselves. + +We'd like everyone to **submit this zeroth homework assignment**. It will not affect your grade, but it will help us get everything running smoothly when the course starts. If you're stuck or don't have much time, just fill in your name and ID and submit πŸ™‚ + +Without submitting anything we'd also like you to login and try out JuliaHub, which we will use later especially when we use GPUs. You might also try vscode on your own computer. +""" + +# ╔═║ 31a8fbf8-e6ce-11ea-2c66-4b4d02b41995 +md"""## Homework Logistics +Homeworks are in the form of [Pluto notebooks](https://github.com/fonsp/Pluto.jl). Your must complete them and submit them on [Canvas](https://canvas.mit.edu/courses/21713) (if you are an MIT student.). + +Homeworks will be released on Thursdays and due on Thursdays 11:59pm Eastern time. + +HW0 is for you to get your system set up correctly and to test our grading software. You must submit it but it will not count towards your grade. +""" + +# ╔═║ f9d7250a-706f-11eb-104d-3f07c59f7174 +md"## Requirements of this HW0 + +- Install Julia and set up Pluto +- Do the required Exercise 0. + +That’s it, but if you like you can do the _OPTIONAL_ exercises that follow." + +# ╔═║ 430a260e-6cbb-11eb-34af-31366543c9dc +md"""# Installation +Before being able to run this notebook successfully locally, you will need to [set up Julia and Pluto.](https://computationalthinking.mit.edu/Fall23/installation/) + +One you have Julia and Pluto installed, you can click the button at the top right of this page and follow the instructions to edit this notebook locally and submit. +""" + +# ╔═║ a05d2bc8-7024-11eb-08cb-196543bbb8fd +md"## (Required) Exercise 0 - _Making a basic function_ + +Computing the square of a number is easy -- you just multiply it with itself. + +##### Algorithm: + +Given: $x$ + +Output: $x^2$ + +1. Multiply `x` by `x`" + +# ╔═║ e02f7ea6-7024-11eb-3672-fd59a6cff79b +function basic_square(x) + return 1 # this is wrong, write your code here! +end + +# ╔═║ 6acef56c-7025-11eb-2524-819c30a75d39 +let + result = basic_square(5) + if !(result isa Number) + md""" +!!! warning "Not a number" + `basic_square` did not return a number. Did you forget to write `return`? + """ + elseif abs(result - 5*5) < 0.01 + md""" +!!! correct + Well done! + """ + else + md""" +!!! warning "Incorrect" + Keep working on it! + """ + end +end + +# ╔═║ 348cea34-7025-11eb-3def-41bbc16c7512 +md"That's all that's required for this week. Please submit the notebook. We just wanted to make sure that you're up and running. + +If you want to explore further, we have included a few optional exercises below." + +# ╔═║ b3c7a050-e855-11ea-3a22-3f514da746a4 +if student.kerberos_id === "jazz" + md""" +!!! danger "Oops!" + **Before you submit**, remember to fill in your name and kerberos ID at the top of this notebook! + """ +end + +# ╔═║ 339c2d5c-e6ce-11ea-32f9-714b3628909c +md"## (Optional) Exercise 1 - _Square root by Newton's method_ + +Computing the square of a number is easy -- you already did it. + +But how does one compute the square root of a number? + +##### Algorithm: + +Given: $x$ + +Output: $\sqrt{x}$ + +1. Take a guess `a` +1. Divide `x` by `a` +1. Set a = the average of `x/a` and `a`. (The square root must be between these two numbers. Why?) +1. Repeat until `x/a` is roughly equal to `a`. Return `a` as the square root. + +In general, you will never get to the point where `x/a` is _exactly_ equal to `a`. So if our algorithm keeps going until `x/a == a`, then it will get stuck. + +So instead, the algorithm takes a parameter `error_margin`, which is used to decide when `x/a` and `a` are close enough to halt. +" + +# ╔═║ 56866718-e6ce-11ea-0804-d108af4e5653 +md"### Exercise 1.1 + +Step 3 in the algorithm sets the new guess to be the average of `x/a` and the old guess `a`. + +This is because the square root must be between the numbers `x/a` and `a`. Why? +" + +# ╔═║ bccf0e88-e754-11ea-3ab8-0170c2d44628 +ex_1_1 = md""" +your answer here as to why the square root must be between x/a and a. +""" + +# you might need to wait until all other cells in this notebook have completed running. +# scroll down the page to see what's up + +# ╔═║ e7abd366-e7a6-11ea-30d7-1b6194614d0a +if !(@isdefined ex_1_1) + md"""Do not change the name of the variable - write you answer as `ex_1_1 = "..."`""" +end + +# ╔═║ d62f223c-e754-11ea-2470-e72a605a9d7e +md"### Exercise 1.2 + +Write a function newton_sqrt(x) which implements the above algorithm." + +# ╔═║ 4896bf0c-e754-11ea-19dc-1380bb356ab6 +function newton_sqrt(x, error_margin=0.01, a=x / 2) # a=x/2 is the default value of `a` + return x # this is wrong, write your code here! +end + +# ╔═║ 7a01a508-e78a-11ea-11da-999d38785348 +newton_sqrt(2) + +# ╔═║ 682db9f8-e7b1-11ea-3949-6b683ca8b47b +let + result = newton_sqrt(2, 0.01) + if !(result isa Number) + md""" +!!! warning "Not a number" + `newton_sqrt` did not return a number. Did you forget to write `return`? + """ + elseif abs(result - sqrt(2)) < 0.01 + md""" +!!! correct + Well done! + """ + else + md""" +!!! warning "Incorrect" + Keep working on it! + """ + end +end + +# ╔═║ 088cc652-e7a8-11ea-0ca7-f744f6f3afdd +md""" +!!! hint + `abs(r - s)` is the distance between `r` and `s` +""" + +# ╔═║ c18dce7a-e7a7-11ea-0a1a-f944d46754e5 +md""" +!!! hint + If you're stuck, feel free to cheat, this is homework 0 after all πŸ™ƒ + + Julia has a function called `sqrt` +""" + +# ╔═║ 5e24d95c-e6ce-11ea-24be-bb19e1e14657 +md"## (Optional) Exercise 2 - _Sierpinksi's triangle_ + +Sierpinski's triangle is defined _recursively_: + +- Sierpinski's triangle of complexity N is a figure in the form of a triangle which is made of 3 triangular figures which are themselves Sierpinski's triangles of complexity N-1. + +- A Sierpinski's triangle of complexity 0 is a simple solid equilateral triangle +" + +# ╔═║ 6b8883f6-e7b3-11ea-155e-6f62117e123b +md"To draw Sierpinski's triangle, we are going to use an external package, [_Compose.jl_](https://giovineitalia.github.io/Compose.jl/latest/tutorial). Let's import it! + +A package contains a coherent set of functionality that you can often use a black box according to its specification. There are [lots of Julia packages](https://juliahub.com/ui/Home). +" + +# ╔═║ dbc4da6a-e7b4-11ea-3b70-6f2abfcab992 +md"Just like the definition above, our `sierpinksi` function is _recursive_: it calls itself." + +# ╔═║ 02b9c9d6-e752-11ea-0f32-91b7b6481684 +complexity = 3 + +# ╔═║ 1eb79812-e7b5-11ea-1c10-63b24803dd8a +if complexity == 3 + md""" +Try changing the value of **`complexity` to `5`** in the cell above. + +Hit `Shift+Enter` to affect the change. + """ +else + md""" +**Great!** As you can see, all the cells in this notebook are linked together by the variables they define and use. Just like a spreadsheet! + """ +end + +# ╔═║ d7e8202c-e7b5-11ea-30d3-adcd6867d5f5 +md"### Exercise 2.1 + +As you can see, the total area covered by triangles is lower when the complexity is higher." + +# ╔═║ f22222b4-e7b5-11ea-0ea0-8fa368d2a014 +md""" +Can you write a function that computes the _area of `sierpinski(n)`_, as a fraction of the area of `sierpinski(0)`? + +So: +``` +area_sierpinski(0) = 1.0 +area_sierpinski(1) = 0.?? +... +``` +""" + +# ╔═║ ca8d2f72-e7b6-11ea-1893-f1e6d0a20dc7 +function area_sierpinski(n) + return 1.0 +end + +# ╔═║ 71c78614-e7bc-11ea-0959-c7a91a10d481 +if area_sierpinski(0) == 1.0 && area_sierpinski(1) == 3 / 4 + md""" +!!! correct + Well done! + """ +else + md""" +!!! warning "Incorrect" + Keep working on it! + """ +end + +# ╔═║ c21096c0-e856-11ea-3dc5-a5b0cbf29335 +md"**Let's try it out below:**" + +# ╔═║ 52533e00-e856-11ea-08a7-25e556fb1127 +md"Complexity = $(@bind n Slider(0:6, show_value=true))" + +# ╔═║ c1ecad86-e7bc-11ea-1201-23ee380181a1 +md""" +!!! hint + Can you write `area_sierpinksi(n)` as a function of `area_sierpinski(n-1)`? +""" + +# ╔═║ a60a492a-e7bc-11ea-0f0b-75d81ce46a01 +md"That's it for now, see you next week!" + +# ╔═║ dfdeab34-e751-11ea-0f90-2fa9bbdccb1e +triangle() = compose(context(), polygon([(1, 1), (0, 1), (1 / 2, 0)])) + +# ╔═║ b923d394-e750-11ea-1971-595e09ab35b5 +# It does not matter which order you define the building blocks (functions) of the +# program in. The best way to organize code is the one that promotes understanding. + +function place_in_3_corners(t) + # Uses the Compose library to place 3 copies of t + # in the 3 corners of a triangle. + # treat this function as a black box, + # or learn how it works from the Compose documentation here https://giovineitalia.github.io/Compose.jl/latest/tutorial/#Compose-is-declarative-1 + compose(context(), + (context(1 / 4, 0, 1 / 2, 1 / 2), t), + (context(0, 1 / 2, 1 / 2, 1 / 2), t), + (context(1 / 2, 1 / 2, 1 / 2, 1 / 2), t)) +end + +# ╔═║ e2848b9a-e703-11ea-24f9-b9131434a84b +function sierpinski(n) + if n == 0 + triangle() + else + t = sierpinski(n - 1) # recursively construct a smaller sierpinski's triangle + place_in_3_corners(t) # place it in the 3 corners of a triangle + end +end + +# ╔═║ 9664ac52-e750-11ea-171c-e7d57741a68c +sierpinski(complexity) + +# ╔═║ df0a4068-e7b2-11ea-2475-81b237d492b3 +sierpinski.(0:6) + +# ╔═║ 147ed7b0-e856-11ea-0d0e-7ff0d527e352 +md""" + +Sierpinski's triangle of complexity $(n) + + $(sierpinski(n)) + +has area **$(area_sierpinski(n))** + +""" + +# ╔═║ 00000000-0000-0000-0000-000000000001 +PLUTO_PROJECT_TOML_CONTENTS = """ +[deps] +Compose = "a81c6b42-2e10-5240-aca2-a61377ecd94b" +PlutoUI = "7f904dfe-b85e-4ff6-b463-dae2292396a8" + +[compat] +Compose = "~0.9.5" +PlutoUI = "~0.7.52" +""" + +# ╔═║ 00000000-0000-0000-0000-000000000002 +PLUTO_MANIFEST_TOML_CONTENTS = """ +# This file is machine-generated - editing it directly is not advised + +julia_version = "1.9.3" +manifest_format = "2.0" +project_hash = "a72bbb806111a3f200e5d05992f215a41b2c9834" + +[[deps.AbstractPlutoDingetjes]] +deps = ["Pkg"] +git-tree-sha1 = "91bd53c39b9cbfb5ef4b015e8b582d344532bd0a" +uuid = "6e696c72-6542-2067-7265-42206c756150" +version = "1.2.0" + +[[deps.ArgTools]] +uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" +version = "1.1.1" + +[[deps.Artifacts]] +uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" + +[[deps.Base64]] +uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" + +[[deps.ColorTypes]] +deps = ["FixedPointNumbers", "Random"] +git-tree-sha1 = "eb7f0f8307f71fac7c606984ea5fb2817275d6e4" +uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f" +version = "0.11.4" + +[[deps.Colors]] +deps = ["ColorTypes", "FixedPointNumbers", "Reexport"] +git-tree-sha1 = "fc08e5930ee9a4e03f84bfb5211cb54e7769758a" +uuid = "5ae59095-9a9b-59fe-a467-6f913c188581" +version = "0.12.10" + +[[deps.Compat]] +deps = ["UUIDs"] +git-tree-sha1 = "e460f044ca8b99be31d35fe54fc33a5c33dd8ed7" +uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" +version = "4.9.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+0" + +[[deps.Compose]] +deps = ["Base64", "Colors", "DataStructures", "Dates", "IterTools", "JSON", "LinearAlgebra", "Measures", "Printf", "Random", "Requires", "Statistics", "UUIDs"] +git-tree-sha1 = "bf6570a34c850f99407b494757f5d7ad233a7257" +uuid = "a81c6b42-2e10-5240-aca2-a61377ecd94b" +version = "0.9.5" + +[[deps.DataStructures]] +deps = ["Compat", "InteractiveUtils", "OrderedCollections"] +git-tree-sha1 = "3dbd312d370723b6bb43ba9d02fc36abade4518d" +uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" +version = "0.18.15" + +[[deps.Dates]] +deps = ["Printf"] +uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" + +[[deps.Downloads]] +deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] +uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" +version = "1.6.0" + +[[deps.FileWatching]] +uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" + +[[deps.FixedPointNumbers]] +deps = ["Statistics"] +git-tree-sha1 = "335bfdceacc84c5cdf16aadc768aa5ddfc5383cc" +uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" +version = "0.8.4" + +[[deps.Hyperscript]] +deps = ["Test"] +git-tree-sha1 = "8d511d5b81240fc8e6802386302675bdf47737b9" +uuid = "47d2ed2b-36de-50cf-bf87-49c2cf4b8b91" +version = "0.0.4" + +[[deps.HypertextLiteral]] +deps = ["Tricks"] +git-tree-sha1 = "c47c5fa4c5308f27ccaac35504858d8914e102f9" +uuid = "ac1192a8-f4b3-4bfe-ba22-af5b92cd3ab2" +version = "0.9.4" + +[[deps.IOCapture]] +deps = ["Logging", "Random"] +git-tree-sha1 = "d75853a0bdbfb1ac815478bacd89cd27b550ace6" +uuid = "b5f81e59-6552-4d32-b1f0-c071b021bf89" +version = "0.2.3" + +[[deps.InteractiveUtils]] +deps = ["Markdown"] +uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" + +[[deps.IterTools]] +git-tree-sha1 = "4ced6667f9974fc5c5943fa5e2ef1ca43ea9e450" +uuid = "c8e1da08-722c-5040-9ed9-7db0dc04731e" +version = "1.8.0" + +[[deps.JSON]] +deps = ["Dates", "Mmap", "Parsers", "Unicode"] +git-tree-sha1 = "31e996f0a15c7b280ba9f76636b3ff9e2ae58c9a" +uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" +version = "0.21.4" + +[[deps.LibCURL]] +deps = ["LibCURL_jll", "MozillaCACerts_jll"] +uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" +version = "0.6.3" + +[[deps.LibCURL_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] +uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" +version = "7.84.0+0" + +[[deps.LibGit2]] +deps = ["Base64", "NetworkOptions", "Printf", "SHA"] +uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" + +[[deps.LibSSH2_jll]] +deps = ["Artifacts", "Libdl", "MbedTLS_jll"] +uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" +version = "1.10.2+0" + +[[deps.Libdl]] +uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" + +[[deps.LinearAlgebra]] +deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"] +uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + +[[deps.Logging]] +uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" + +[[deps.MIMEs]] +git-tree-sha1 = "65f28ad4b594aebe22157d6fac869786a255b7eb" +uuid = "6c6e2e6c-3030-632d-7369-2d6c69616d65" +version = "0.1.4" + +[[deps.Markdown]] +deps = ["Base64"] +uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" + +[[deps.MbedTLS_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" +version = "2.28.2+0" + +[[deps.Measures]] +git-tree-sha1 = "c13304c81eec1ed3af7fc20e75fb6b26092a1102" +uuid = "442fdcdd-2543-5da2-b0f3-8c86c306513e" +version = "0.3.2" + +[[deps.Mmap]] +uuid = "a63ad114-7e13-5084-954f-fe012c677804" + +[[deps.MozillaCACerts_jll]] +uuid = "14a3606d-f60d-562e-9121-12d972cd8159" +version = "2022.10.11" + +[[deps.NetworkOptions]] +uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" +version = "1.2.0" + +[[deps.OpenBLAS_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] +uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" +version = "0.3.21+4" + +[[deps.OrderedCollections]] +git-tree-sha1 = "2e73fe17cac3c62ad1aebe70d44c963c3cfdc3e3" +uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" +version = "1.6.2" + +[[deps.Parsers]] +deps = ["Dates", "PrecompileTools", "UUIDs"] +git-tree-sha1 = "716e24b21538abc91f6205fd1d8363f39b442851" +uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" +version = "2.7.2" + +[[deps.Pkg]] +deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] +uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" +version = "1.9.2" + +[[deps.PlutoUI]] +deps = ["AbstractPlutoDingetjes", "Base64", "ColorTypes", "Dates", "FixedPointNumbers", "Hyperscript", "HypertextLiteral", "IOCapture", "InteractiveUtils", "JSON", "Logging", "MIMEs", "Markdown", "Random", "Reexport", "URIs", "UUIDs"] +git-tree-sha1 = "e47cd150dbe0443c3a3651bc5b9cbd5576ab75b7" +uuid = "7f904dfe-b85e-4ff6-b463-dae2292396a8" +version = "0.7.52" + +[[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 = "7eb1686b4f04b82f96ed7a4ea5890a4f0c7a09f1" +uuid = "21216c6a-2e73-6563-6e65-726566657250" +version = "1.4.0" + +[[deps.Printf]] +deps = ["Unicode"] +uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" + +[[deps.REPL]] +deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] +uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" + +[[deps.Random]] +deps = ["SHA", "Serialization"] +uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" + +[[deps.Reexport]] +git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" +uuid = "189a3867-3050-52da-a836-e630ba90ab69" +version = "1.2.2" + +[[deps.Requires]] +deps = ["UUIDs"] +git-tree-sha1 = "838a3a4188e2ded87a4f9f184b4b0d78a1e91cb7" +uuid = "ae029012-a4dd-5104-9daa-d747884805df" +version = "1.3.0" + +[[deps.SHA]] +uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" +version = "0.7.0" + +[[deps.Serialization]] +uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" + +[[deps.Sockets]] +uuid = "6462fe0b-24de-5631-8697-dd941f90decc" + +[[deps.SparseArrays]] +deps = ["Libdl", "LinearAlgebra", "Random", "Serialization", "SuiteSparse_jll"] +uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + +[[deps.Statistics]] +deps = ["LinearAlgebra", "SparseArrays"] +uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" +version = "1.9.0" + +[[deps.SuiteSparse_jll]] +deps = ["Artifacts", "Libdl", "Pkg", "libblastrampoline_jll"] +uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c" +version = "5.10.1+6" + +[[deps.TOML]] +deps = ["Dates"] +uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" +version = "1.0.3" + +[[deps.Tar]] +deps = ["ArgTools", "SHA"] +uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" +version = "1.10.0" + +[[deps.Test]] +deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] +uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[[deps.Tricks]] +git-tree-sha1 = "aadb748be58b492045b4f56166b5188aa63ce549" +uuid = "410a4b4d-49e4-4fbc-ab6d-cb71b17b3775" +version = "0.1.7" + +[[deps.URIs]] +git-tree-sha1 = "b7a5e99f24892b6824a954199a45e9ffcc1c70f0" +uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" +version = "1.5.0" + +[[deps.UUIDs]] +deps = ["Random", "SHA"] +uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" + +[[deps.Unicode]] +uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" + +[[deps.Zlib_jll]] +deps = ["Libdl"] +uuid = "83775a58-1f1d-513f-b197-d71354ab007a" +version = "1.2.13+0" + +[[deps.libblastrampoline_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" +version = "5.8.0+0" + +[[deps.nghttp2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" +version = "1.48.0+0" + +[[deps.p7zip_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" +version = "17.4.0+0" +""" + +# ╔═║ Cell order: +# β•Ÿβ”€fafae38e-e852-11ea-1208-732b4744e4c2 +# β•Ÿβ”€cdff6730-e785-11ea-2546-4969521b33a7 +# ╠═7308bc54-e6cd-11ea-0eab-83f7535edf25 +# β•Ÿβ”€a2181260-e6cd-11ea-2a69-8d9d31d1ef0e +# β•Ÿβ”€31a8fbf8-e6ce-11ea-2c66-4b4d02b41995 +# β•Ÿβ”€f9d7250a-706f-11eb-104d-3f07c59f7174 +# β•Ÿβ”€430a260e-6cbb-11eb-34af-31366543c9dc +# β•Ÿβ”€a05d2bc8-7024-11eb-08cb-196543bbb8fd +# ╠═e02f7ea6-7024-11eb-3672-fd59a6cff79b +# β•Ÿβ”€6acef56c-7025-11eb-2524-819c30a75d39 +# β•Ÿβ”€348cea34-7025-11eb-3def-41bbc16c7512 +# β•Ÿβ”€b3c7a050-e855-11ea-3a22-3f514da746a4 +# β•Ÿβ”€339c2d5c-e6ce-11ea-32f9-714b3628909c +# β•Ÿβ”€56866718-e6ce-11ea-0804-d108af4e5653 +# ╠═bccf0e88-e754-11ea-3ab8-0170c2d44628 +# β•Ÿβ”€e7abd366-e7a6-11ea-30d7-1b6194614d0a +# β•Ÿβ”€d62f223c-e754-11ea-2470-e72a605a9d7e +# ╠═4896bf0c-e754-11ea-19dc-1380bb356ab6 +# ╠═7a01a508-e78a-11ea-11da-999d38785348 +# β•Ÿβ”€682db9f8-e7b1-11ea-3949-6b683ca8b47b +# β•Ÿβ”€088cc652-e7a8-11ea-0ca7-f744f6f3afdd +# β•Ÿβ”€c18dce7a-e7a7-11ea-0a1a-f944d46754e5 +# β•Ÿβ”€5e24d95c-e6ce-11ea-24be-bb19e1e14657 +# β•Ÿβ”€6b8883f6-e7b3-11ea-155e-6f62117e123b +# ╠═d6ee91ea-e750-11ea-1260-31ebf3ec6a9b +# ╠═5acd58e0-e856-11ea-2d3d-8329889fe16f +# β•Ÿβ”€dbc4da6a-e7b4-11ea-3b70-6f2abfcab992 +# ╠═e2848b9a-e703-11ea-24f9-b9131434a84b +# ╠═9664ac52-e750-11ea-171c-e7d57741a68c +# ╠═02b9c9d6-e752-11ea-0f32-91b7b6481684 +# β•Ÿβ”€1eb79812-e7b5-11ea-1c10-63b24803dd8a +# β•Ÿβ”€d7e8202c-e7b5-11ea-30d3-adcd6867d5f5 +# ╠═df0a4068-e7b2-11ea-2475-81b237d492b3 +# β•Ÿβ”€f22222b4-e7b5-11ea-0ea0-8fa368d2a014 +# ╠═ca8d2f72-e7b6-11ea-1893-f1e6d0a20dc7 +# β•Ÿβ”€71c78614-e7bc-11ea-0959-c7a91a10d481 +# β•Ÿβ”€c21096c0-e856-11ea-3dc5-a5b0cbf29335 +# β•Ÿβ”€52533e00-e856-11ea-08a7-25e556fb1127 +# β•Ÿβ”€147ed7b0-e856-11ea-0d0e-7ff0d527e352 +# β•Ÿβ”€c1ecad86-e7bc-11ea-1201-23ee380181a1 +# β•Ÿβ”€a60a492a-e7bc-11ea-0f0b-75d81ce46a01 +# β•Ÿβ”€dfdeab34-e751-11ea-0f90-2fa9bbdccb1e +# β•Ÿβ”€b923d394-e750-11ea-1971-595e09ab35b5 +# β•Ÿβ”€00000000-0000-0000-0000-000000000001 +# β•Ÿβ”€00000000-0000-0000-0000-000000000002 diff --git a/homeworks/hw0.plutostate b/homeworks/hw0.plutostate new file mode 100644 index 0000000..d9855fc Binary files /dev/null and b/homeworks/hw0.plutostate differ diff --git a/homeworks_old/hw1a.jl b/homeworks_old/hw1a.jl new file mode 100644 index 0000000..26913c8 --- /dev/null +++ b/homeworks_old/hw1a.jl @@ -0,0 +1,2291 @@ +### A Pluto.jl notebook ### +# v0.19.11 + +#> [frontmatter] +#> title = "HW1a - PokΓ©mon" +#> date = "2022-09-15" + +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 + +# ╔═║ fcafb864-249b-11ed-3b73-774e1742704a +begin + using Colors + using FileIO + using ImageIO + using ImageShow + using Plots + using PlutoUI + using PlutoTeachingTools +end + +# ╔═║ d20423a3-a6d8-4b7a-83c7-f1539fcc4d72 +md""" +Homework 1a of the MIT Course [_Julia: solving real-world problems with computation_](https://github.com/mitmath/JuliaComputation) + +Release date: Thursday, Sep 15, 2022 (version 1) + +**Due date: Thursday, Sep 22, 2022 (11:59pm EST)** + +Submission by: Jazzy Doe (jazz@mit.edu) +""" + +# ╔═║ 00992802-9ead-466b-8b01-bcaf0614b0c6 +student = (name = "Jazzy Doe", kerberos_id = "jazz") + +# ╔═║ 1896271c-e5bf-428c-bc3e-7780e71a065f +md""" +# PokΓ©mon - _gotta dispatch 'em all_ +""" + +# ╔═║ eee70c65-94b8-4f3d-a187-bbafb04b8eff +md""" +Show TOC $(@bind show_toc CheckBox(default=true)) +""" + +# ╔═║ 9f1c224c-561e-4071-a909-0c951b9e3542 +md""" +# A. Implementing PokΓ©mon behavior +""" + +# ╔═║ 6ae05ccb-c386-4139-817c-85959a20a4de +md""" +The goal of this part is to build a simple model of PokΓ©mon behavior. +We will do this by exploiting two key assets of Julia: types and dispatch. + +In terms of Julia syntax, we tried to make the following exercises self-contained. +Still, it may be a good idea to check out the language documentation on [types](https://docs.julialang.org/en/v1/manual/types/) and [methods](https://docs.julialang.org/en/v1/manual/methods/) in case you are stuck. +""" + +# ╔═║ d0634f27-ba12-4c53-be66-6d2f7bf74808 +md""" +## PokΓ©mon families +""" + +# ╔═║ a5d63fcc-9d84-4912-b6fe-3ddc937b3022 +md""" +A major feature of PokΓ©mon games is the type system, which is described [here](https://pokemondb.net/type). +In the following section, we draw inspiration from this [blog post](https://www.moll.dev/projects/effective-multi-dispatch/) to implement PokΓ©mon types using Julia types. +To avoid confusion, we refer to PokΓ©mon types as "families" from now on. +""" + +# ╔═║ 1b8b2a32-21fd-47e0-9c12-7a71e66fab4c +md""" +The first thing we want is an abstract type that encompasses every PokΓ©mon we will create. +""" + +# ╔═║ 321c6dc8-9d87-47da-88b3-a41b55b179ff +abstract type Pokemon end + +# ╔═║ d931270d-1ceb-474f-b04e-0185595a4b5a +md""" +To make things simpler, we only consider the first few PokΓ©mon families, which we define as abstract subtypes of `PokΓ©mon`. +""" + +# ╔═║ 7dbd7cfd-5c52-4591-b6ba-eba7f3076a45 +begin + abstract type Normal <: Pokemon end + abstract type Fire <: Pokemon end + abstract type Water <: Pokemon end + abstract type Grass <: Pokemon end + abstract type Electric <: Pokemon end +end + +# ╔═║ 72ac44a7-7c18-4d0e-85e4-9ca9cb5173a8 +md""" +Finally, we create one iconic PokΓ©mon from each of these types. +This empty `struct` definition means that the structures we define have no attributes. +""" + +# ╔═║ 74a44465-7332-45b0-91c4-2ae5ed658160 +begin + struct Snorlax <: Normal end + struct Charmander <: Fire end + struct Squirtle <: Water end + struct Bulbasaur <: Grass end + struct Pikachu <: Electric end +end + +# ╔═║ ed8a218f-287c-425b-a6b6-793be7ad1a7b +md""" +Eevee is a very special PokΓ©mon, because it can evolve into members of nearly every family. +""" + +# ╔═║ 037d04d4-f5f2-4b77-80ed-b799c1ea9b77 +md""" +> Task: Define new structures for Eevee (from the `Normal` family) and its evolutions Flareon, Vaporeon, Leafeon and Jolteon (respectively from the `Fire`, `Water`, `Grass` and `Electric` families). +""" + +# ╔═║ 87081f51-7c44-4365-b412-7b34ed2b3191 + + +# ╔═║ d4619cdf-f902-4a8e-8e60-b8606aee40d2 +md""" +Here are some examples of structure creation and use. +""" + +# ╔═║ 2e9ddef4-688c-4623-8b58-578e7931204b +snorlax = Snorlax() + +# ╔═║ 3a99de95-3312-47f7-b46e-545aa75b82bf +pikachu = Pikachu() + +# ╔═║ 9b143e5c-04b6-4306-87c6-fc818747c20d +vaporeon = Vaporeon() + +# ╔═║ cb4ee69a-c992-45ae-b7a2-0cbc318a090e +snorlax isa Pokemon + +# ╔═║ 9b6b6596-7680-4864-9395-10fbf69ec0ae +pikachu isa Water + +# ╔═║ c137d356-f552-4e3e-92b7-a9ffc0df0266 +vaporeon isa Water + +# ╔═║ 9e2898c5-5c90-4fca-8c60-1fc31db81ead +md""" +And here are some automatic checks for your answers. +Note that, depending on the task, they might not catch every possible mistake. +""" + +# ╔═║ 1dbbf479-1707-4dd0-90c8-394690fbac91 +md""" +## Interlude: multiple dispatch +""" + +# ╔═║ c4063845-c70a-47ef-a4f7-ef2b3ea0f0d8 +md""" +Before going further, we explain and illustrate a key feature of Julia: _multiple dispatch_. +In Julia, a _function_ is just a name, like `+` or `exp`. +Each function may possess several implementations called _methods_. +These methods are where the real magic happens, because adding two integers is very different from adding two floating point numbers or even matrices. +The right method is _dispatched_ "just in time" based on the types of all function arguments (not just the first one). +""" + +# ╔═║ 3d748f13-ef9c-4899-99d3-16743f0e2f5a +md""" +Here is an example inspired by the notebook on [abstraction](https://mit-c25-fall23.netlify.app/notebooks/1_abstraction) that you saw in the first class. +Let's ask Julia which method is chosen for addition, depending on what we try to add. +""" + +# ╔═║ 730ae9dc-34bf-4472-ae32-36fe10c54175 +@which true + true # add booleans + +# ╔═║ d0d2c56e-297d-4d35-afb7-bfd366815a95 +@which 1 + 1 # add integers + +# ╔═║ 0eabf795-a9c5-4aa1-8282-e5e22b631c4d +@which 1//1 + 1//1 # add rationals + +# ╔═║ 57e16f0a-c0bc-4727-9315-701328989762 +@which 1.0 + 1.0 # add floating point numbers + +# ╔═║ ab71225e-3d0e-4a11-a5de-6b1eea4048eb +@which [1 0; 0 1] + [1 0; 0 1] # add matrices + +# ╔═║ ecebb7eb-000f-418d-bfb8-acb66b06c171 +@which 1 + 1.0 # add elements of different types by promoting them to a common type + +# ╔═║ 7b2dbb37-9523-4150-bf23-4803ef0f31f1 +md""" +Since each case has its own custom implementation, which is essential for performance reasons, the number of methods for addition is actually mind-blowing! +""" + +# ╔═║ ad26c7d9-f457-4dc0-8a70-8bac4b3c3a10 +length(methods(+)) + +# ╔═║ b6ebf9ce-0a8f-4f67-b324-3aa4da967d46 +md""" +Whenever several methods are compatible with the argument types, the most specific method wins. +We can use this to our advantage by specifying default behavior for abstract types, and then being more specific when we need to be. +""" + +# ╔═║ d241fcec-3266-4175-abd5-7d26128dc923 +md""" +## Attack mechanism +""" + +# ╔═║ 3eb3545e-d48a-41d7-ac31-b9b6d1b22af9 +md""" +Here, we assume that the effectiveness of a PokΓ©mon attack is determined only by the respective families of the attacker and defender. +True PokΓ©mon fans will notice that this is an oversimplification. +Good for them. +""" + +# ╔═║ 58aed749-468e-477d-98c7-3a7a0c9ea7a0 +begin + const NOT_VERY_EFFECTIVE = 0.5 + const NORMAL_EFFECTIVE = 1.0 + const SUPER_EFFECTIVE = 2.0 +end; + +# ╔═║ 80c63240-d4e8-4a4b-b34c-a14b064a75a5 +md""" +Our goal here is to compute the effectiveness values by defining methods for the `attack` function. +And luckily, we can save some work by identifying patterns: +- in most cases, an attack is normally effective +- in most cases, an attack within the same family is not very effective +So let us start there. +""" + +# ╔═║ 9370b300-25a9-4342-803d-c2f1ba0d2b90 +attack(att::Pokemon, def::Pokemon) = NORMAL_EFFECTIVE; + +# ╔═║ 595e20f1-150a-4224-aee5-607882486887 +md""" +There is a special syntax we can use when both arguments of a function must have the same (super-)type. +""" + +# ╔═║ 136dbf04-77a0-4c14-868d-73a92a9028b5 +attack(att::P, def::P) where {P<:Pokemon} = NOT_VERY_EFFECTIVE; + +# ╔═║ 390c7fe7-a27c-4f21-a8dc-c8cf19372857 +md""" +Now we add special cases that deviate from these patterns. +""" + +# ╔═║ 5963a5b6-7939-49f5-9f5e-d1984afd8d79 +begin + attack(att::Normal, def::Normal) = NORMAL_EFFECTIVE + + attack(att::Fire, def::Water) = NOT_VERY_EFFECTIVE + attack(att::Fire, def::Grass) = SUPER_EFFECTIVE + + attack(att::Water, def::Fire) = SUPER_EFFECTIVE + attack(att::Water, def::Grass) = NOT_VERY_EFFECTIVE + + attack(att::Electric, def::Water) = SUPER_EFFECTIVE + attack(att::Electric, def::Grass) = NOT_VERY_EFFECTIVE + + attack(att::Grass, def::Fire) = NOT_VERY_EFFECTIVE + attack(att::Grass, def::Water) = SUPER_EFFECTIVE +end; + +# ╔═║ 520f5b7e-d5dd-4954-93a3-39e63d5d2a1b +md""" +This is a bit tedious, but thanks to the patterns we identified, we only need to handle a few exceptions instead of the full $25$ cases. +""" + +# ╔═║ 581e4013-692a-4a66-b210-b4db92112187 +md""" +Now let's see how attacks work. +""" + +# ╔═║ eb29c4ee-2cd2-4c51-a1c3-954b5745b9a9 +attack(pikachu, pikachu) # Electric on Electric: not very effective + +# ╔═║ 5f605953-9216-41fc-b935-bb6c2ca5414e +attack(pikachu, vaporeon) # Electric on Water: super effective + +# ╔═║ 35fe8041-58ba-419e-a9d2-f9fc97d13cce +attack(vaporeon, pikachu) # Water on Electric: normally effective + +# ╔═║ 7b003215-ce5d-4063-9eb0-c05affd1d15e +md""" +# B. Extending PokΓ©mon behavior +""" + +# ╔═║ ffee9abf-d6ed-411e-bef7-15d52c084d3e +md""" +Until now, nothing extraordinary has happened. +You might even think it is simpler to just store the effectiveness values into a matrix and be done with it. +The reason why we use types and dispatch fits in one word: _composability_. + +Imagine there is a package called `Pokemon.jl` that contains all of the stuff above. +Let's say that you wish to add your own family of PokΓ©mon, or experiment with a new fight mechanism. +You probably want to extend the existing package, instead of recoding everything from scratch. +This is made very easy by multiple dispatch, because you can do the following: +- Define new types _in your code_ that work well with existing methods _from a package_ +- Define new methods _in your code_ that apply to existing types _from a package_ +As underlined by Stefan Karpinski in his [JuliaCon 2019 talk](https://youtu.be/kc9HwsxE1OY), there are very few languages where both of these tasks are easy to achieve. +Julia is one of them. +""" + +# ╔═║ 2016d37b-ab63-4956-8fe7-de7eaadfb29f +md""" +## Adding a PokΓ©mon family +""" + +# ╔═║ cf769229-9766-40d5-a8e0-1b7cb0b8b16e +md""" +Professor Edelman wants to play PokΓ©mon using Julia. +But to do that, he wants _you_ to implement the new `Corgi` family, full of legendary creatures with untold abilities. +""" + +# ╔═║ 3903ec25-8077-49e2-a711-2500defec7b5 +md""" +> Task: Define an abstract subtype of `Pokemon` named `Corgi`. +""" + +# ╔═║ a4c0fff3-b4fe-4c48-8680-c12bbf4f68f3 + + +# ╔═║ 3d31d6ab-d466-4581-9ade-a8a541a03319 +md""" +Note that, since this type is abstract, you cannot instantiate it directly. +It only serves as a layer in the type hierarchy. +""" + +# ╔═║ 88c8da1c-8cd8-4dad-961e-edf035790286 +md""" +Pokemon of type `Corgi` have super effective attacks against every other family except `Normal` +""" + +# ╔═║ fb577ace-d7d1-4ac9-ad47-57d28528c243 +md""" +> Task: Extend the fight mechanism by defining appropriate methods for attackers of type `Corgi`. +""" + +# ╔═║ a2fe0244-361f-4154-af76-a56bd7928880 + + +# ╔═║ ccc1dd94-a1db-4504-8d27-5fbf577cee30 +md""" +Among the `Corgi` family, the one called `Philip` is by far the most powerful entity. +Unlike the other PokΓ©mon we have encountered, `Philip` has a reserve of life points, which makes him more resilient against attacks. +""" + +# ╔═║ e2f9f8d1-0d83-415e-b459-4c6e36cc9ddf +md""" +> Task: Define a new structure for `Philip` with a single attribute named `life`, of type `Int`. Add an inner constructor which takes `life` as an argument, and another one which sets `life` to be a random number between $1$ and $5$. +""" + +# ╔═║ f899ed08-4315-4c17-8792-84ad0cae631b + + +# ╔═║ 28737ee7-6939-4830-95e3-fc08b6dcf1a4 +hint(md"Take a look at the documentation on [composite types](https://docs.julialang.org/en/v1/manual/types/#Composite-Types) and [inner constructor methods](https://docs.julialang.org/en/v1/manual/constructors/#man-inner-constructor-methods)") + +# ╔═║ 24e23eb0-9341-4249-afe1-c6d94c57478e +md""" +Let's see what happens when we create a `Philip`... or two! +Remember, the constructor with no argument is random, so the following cells may return a different result if you run them repeatedly. +""" + +# ╔═║ f0705b81-3df4-4145-9de5-8a4d738f6398 +philip = Philip() + +# ╔═║ f5604cbe-0348-475c-8e0f-43b7bb213b36 +other_philip = Philip(4) + +# ╔═║ a4eedc3b-0808-42ec-88b0-d710497fcd68 +philip.life, other_philip.life + +# ╔═║ eaea15b2-5918-4fc0-b44a-3cb0c085fa67 +md""" +When an attack is launched against `Philip`, a random number is drawn between $1$ and `life`. If this number is equal to `life`, the attack is super effective, otherwise it is normally effective. +""" + +# ╔═║ 8fc13f81-3e49-4b98-8592-fb9f24eda900 +md""" +> Task: Extend the fight mechanism by defining appropriate methods for defenders of type `Philip`. +""" + +# ╔═║ cf737824-4aa3-409b-a914-be606c9668a0 + + +# ╔═║ 79b384b1-8393-4c8c-84e4-6c1c729c53eb +md""" +Now let's test just how strong `Philip` is. +Again, keep in mind that the following cells are non-deterministic. +""" + +# ╔═║ afdf5d1e-d19d-486e-ab4d-167d74975e5e +attack(philip, snorlax) + +# ╔═║ 996f35f9-8510-4cee-b923-1c11ef7244af +attack(philip, pikachu) + +# ╔═║ 3d800a03-06fc-46e4-b0d6-d123200fc26f +attack(vaporeon, philip) + +# ╔═║ d11432fc-cdee-4364-8159-49ce25d6c7e5 +attack(vaporeon, other_philip) + +# ╔═║ d73978e5-ec24-4d71-82ca-184c76f00b74 +attack(philip, other_philip) + +# ╔═║ 023a75a3-a7a6-4e2d-911b-8a5c54d86e80 +md""" +## Adding a friendship mechanism +""" + +# ╔═║ 87cdb6d3-cfa6-4564-8ea4-e2f202d89eca +md""" +Professor Edelman won't stop at the introduction of the `Corgi` family. +Indeed, he has seen the true violence of the PokΓ©mon universe, and he has said: "no more". +Why would PokΓ©mon need to fight all the time, when they can be friends? +While attack effectiveness is defined at the level of families, friendship is naturally defined at the level of individual PokΓ©mon. +""" + +# ╔═║ d5ba5a13-9242-480c-94d7-e681e0ecdf72 +md""" +By default, two arbitrary PokΓ©mon are not friends. +""" + +# ╔═║ 117ff067-08ae-4134-8d23-ef28d31a7b8f +friends(pok1::Pokemon, pok2::Pokemon) = false; + +# ╔═║ e65bfd90-83c6-4c93-9f7f-aa8d41c01531 +md""" +But `Charmander`, `Squirtle` and `Bulbasaur` are friends because they all came of age together. +""" + +# ╔═║ 172d0f37-5214-4e73-8635-8bfe85011f4a +begin + friends(pok1::Charmander, pok2::Squirtle) = true + friends(pok1::Squirtle, pok2::Charmander) = true + + friends(pok1::Charmander, pok2::Bulbasaur) = true + friends(pok1::Bulbasaur, pok2::Charmander) = true + + friends(pok1::Bulbasaur, pok2::Squirtle) = true + friends(pok1::Squirtle, pok2::Bulbasaur) = true +end; + +# ╔═║ 86d0af15-ccf4-4254-a686-a6ace39a7a74 +md""" +As a side note, this way of doing things might seem strange to people unfamiliar with Julia. +After all, we could simply use an `if / else` statement. +""" + +# ╔═║ 22633b0a-33c5-4b7d-98b0-42663adc1631 +function friends_naive(pok1::Pokemon, pok2::Pokemon) + if pok1 isa Charmander && pok2 isa Squirtle + return true + elseif pok1 isa Squirtle && pok2 isa Charmander + return true + elseif pok1 isa Charmander && pok2 isa Bulbasaur + return true + elseif pok1 isa Bulbasaur && pok2 isa Charmander + return true + elseif pok1 isa Bulbasaur && pok2 isa Squirtle + return true + elseif pok1 isa Squirtle && pok2 isa Bulbasaur + return true + else + return false + end +end; + +# ╔═║ 4885f35e-1875-4dca-8bad-f8ae94cb98b3 +md""" +First, `friends_naive` is more tedious to write and read, because everything has to be in the same place. +Second, it is not easy to extend _a posteriori_. +And third, this paradigm often leads to less efficient functions. +Indeed, since multiple dispatch selects the appropriate method based on argument types, it can generate shorter machine code than the full `if / else` statement. +This doesn't seem to hold here however, probably because the compiler is smart enough to optimize away the difference. +""" + +# ╔═║ c64086a9-b749-4a5d-8665-0085ae4fb64e +md""" +> Task: Extend the friendship mechanism to account for the fact that `Philip` is friends with everyone. +""" + +# ╔═║ 6daea6c1-6eb4-4117-8e11-63e9913792e3 + + +# ╔═║ c491ca01-5a0b-4f91-825c-67f597aa788a +hint(md"You might get an error due to an ambiguous method. This means multiple dispatch has failed because there is no single most specific implementation. How do you fix this?") + +# ╔═║ d96068be-4ac9-4ff9-ae3e-4807df555a42 +md""" +Let us check that everything works as expected. +""" + +# ╔═║ 2eb828db-1008-4551-819d-60ec0aa8eb7a +friends(snorlax, snorlax) + +# ╔═║ a637f11c-bd0a-4a87-a1b9-52fd43eb9fcc +friends(pikachu, philip) + +# ╔═║ c619533d-6e4c-4aae-b3a7-099f578f7b7d +friends(philip, vaporeon) + +# ╔═║ 076c200b-d1cf-4c17-91d3-84d447271560 +friends(philip, philip) + +# ╔═║ 916540e4-d354-436e-8c79-a8e2aff4f591 +md""" +# C. Grid world simulation +""" + +# ╔═║ 9c41f013-38f4-41b4-a2c9-90a2f6f08356 +md""" +Inspired by this [tweet](https://twitter.com/olafurw/status/1522273899441967104), we now simulate fights between PokΓ©mon, in order to see which family ends up on top. +""" + +# ╔═║ e5bf5d32-2597-42d1-b9a6-eba666fe48d5 +md""" +To visualize the simulation results, we assign a color to each PokΓ©mon family. +""" + +# ╔═║ f911d885-cc82-4eff-bac2-310e49923c63 +begin + get_color(::Normal) = colorant"gray" + get_color(::Fire) = colorant"red" + get_color(::Water) = colorant"blue" + get_color(::Grass) = colorant"green" + get_color(::Electric) = colorant"yellow" + if @isdefined(Corgi) + get_color(::Corgi) = colorant"purple" + end +end; + +# ╔═║ f7b8330e-5897-4b71-a9aa-64838cf2a9bd +md""" +## Initialization and evolution rules +""" + +# ╔═║ f2ea1753-e3d8-42e0-a495-5fd22abeb944 +md""" +> Task: Define a function `new_grid(pokemon_set; n, m)` that creates a matrix of PokΓ©mon of size `n Γ— m` and fills it with random picks from the set `pokemon_set`. +""" + +# ╔═║ b66b0c70-fdd1-4d43-8adf-807f59055f8c + + +# ╔═║ e227d7f2-ddb7-415e-9b9e-e0efd8945ca0 +begin + g1 = new_grid([Pikachu(), Charmander(), Squirtle()]; n=5, m=8) + get_color.(g1) +end + +# ╔═║ d8058473-2ffa-4ae4-8699-435bdf7d6f08 +md""" +The rules of the fight are simple. +At each time step, the following events occur in order: +1. A random PokΓ©mon is chosen from the grid to be the attacker. +2. A random neighbor (among 8) is selected to be the defender. +3. If the attack is super effective, the defender is replaced in the grid by a copy of the attacker. +""" + +# ╔═║ ebddaba7-792a-4546-9739-df271df2a880 +md""" +> Task: Define a function `step!(grid)` which applies one step of fight simulation to a matrix of PokΓ©mon, modifying this matrix in the process. +""" + +# ╔═║ 52121c38-fe60-4c52-8c43-40970fc8d69c + + +# ╔═║ 04de7b1e-ea7c-438d-b16a-8e758bb40a70 +T_test = 10 + +# ╔═║ 4ea66307-dbfc-45d2-894c-fbd89f1957ce +begin + g2 = copy(g1) + for _ in 1:T_test + step!(g2) + end + get_color.(g1), get_color.(g2) +end + +# ╔═║ 8d558109-3d41-4ed1-b855-2d7ce7f29369 +md""" +> Task: Implement a new function called `step_consider_friends!` where the attack doesn't happen if the attacker is friends with the defender. +> What do you observe? +""" + +# ╔═║ 7f97374d-04d9-4241-b166-aa5a6e052c66 + + +# ╔═║ 2b34aa16-107c-4e17-88bb-6dfc6e2b4881 +begin + g3 = copy(g1) + for _ in 1:T_test + step_consider_friends!(g3) + end + get_color.(g1), get_color.(g3) +end + +# ╔═║ 51103ee4-b68b-48cf-addc-8905dda40747 +md""" +Here is a function that runs a full simulation on $T$ steps and displays the result as a GIF. +""" + +# ╔═║ 012dd868-8815-4c3e-9adb-1ce854081bac +function simulation(pokemon_set; n, m, T, consider_friends=false, dT=1000) + g = new_grid(pokemon_set; n=n, m=m) + anim = @animate for t in 1:(T Γ· dT) + for k in 1:dT + if consider_friends + step_consider_friends!(g) + else + step!(g) + end + end + plot(get_color.(g), title="Time = $(t*dT)") + end + return gif(anim) +end + +# ╔═║ dd38f9f9-0da9-4039-b1bd-ed914d434c7f +md""" +## Experiments +""" + +# ╔═║ de109133-313f-4235-a885-eb8ca55cde67 +basic_pokemon = [Snorlax(), Charmander(), Squirtle(), Bulbasaur(), Pikachu()] + +# ╔═║ 176c6971-483f-408c-abc2-994546a5f57f +simulation( + basic_pokemon; + n=100, m=100, T=100_000 +) + +# ╔═║ 876837a1-06b7-4b86-829d-4edeae166dc3 +eevees = [Eevee(), Flareon(), Vaporeon(), Leafeon(), Jolteon()] + +# ╔═║ fb8696b8-4d1b-49cf-8e25-703287d2b3f1 +all_pokemon = vcat(basic_pokemon, eevees, Philip(5)) + +# ╔═║ 97541230-5515-4b78-b211-2a01a2d9ed83 +simulation( + all_pokemon; + n=100, m=100, T=100_000 +) + +# ╔═║ e3478b55-7100-49c8-809f-4a8bf15071f3 +simulation( + all_pokemon; + consider_friends=true, n=100, m=100, T=100_000 +) + +# ╔═║ d4324265-e4af-4f00-ab00-d65976d8d583 +md""" +> Task: Play around with the previous simulations. +> Increase the duration, change the grid size, the set of PokΓ©mon, the life of the `Philip` you include. +> Comment on what you observe. +""" + +# ╔═║ 8e96478a-4dd4-4eab-bda3-e19e60adf332 + + +# ╔═║ bd90221c-c590-4d36-bba4-6b0b2e4f2453 +md""" +# D. Appendix +""" + +# ╔═║ 1910d57c-853a-4f31-b3e6-0921d775ff8a +if show_toc; TableOfContents(); end + +# ╔═║ d900e981-36d8-4a3c-a1bd-5809ee6e7c64 +chart_path = download("https://img.pokemondb.net/images/typechart.png") + +# ╔═║ 6893ced3-012f-4dc2-8e1c-2a292bfe067e +load(chart_path)[170:392, 52:305] + +# ╔═║ 7c362af1-cc1a-47fc-b3a1-252a891849e5 +begin + snorlax_path = download("https://assets.pokemon.com/assets/cms2/img/pokedex/full/143.png") + charmander_path = download("https://assets.pokemon.com/assets/cms2/img/pokedex/full/004.png") + squirtle_path = download("https://assets.pokemon.com/assets/cms2/img/pokedex/full/007.png") + bulbasaur_path = download("https://assets.pokemon.com/assets/cms2/img/pokedex/full/001.png") + pikachu_path = download("https://assets.pokemon.com/assets/cms2/img/pokedex/full/025.png") + + eevee_path = download("https://assets.pokemon.com/assets/cms2/img/pokedex/full/133.png") + flareon_path = download("https://assets.pokemon.com/assets/cms2/img/pokedex/full/136.png") + vaporeon_path = download("https://assets.pokemon.com/assets/cms2/img/pokedex/full/134.png") + leafeon_path = download("https://assets.pokemon.com/assets/cms2/img/pokedex/full/470.png") + jolteon_path = download("https://assets.pokemon.com/assets/cms2/img/pokedex/full/135.png") +end; + +# ╔═║ d20b68c4-3091-4e49-8873-199672ed2695 +begin + ( + load(snorlax_path), + load(charmander_path), + load(squirtle_path), + load(bulbasaur_path), + load(pikachu_path) + ) +end + +# ╔═║ fc1c3e85-b1af-4cbb-a8fe-597174bea4d4 +begin + ( + load(eevee_path), + load(flareon_path), + load(vaporeon_path), + load(leafeon_path), + load(jolteon_path) + ) +end + +# ╔═║ 66e2042d-aedc-41cb-91c0-b364e014f7f0 +check_eevee = if ( + (@isdefined Eevee) && + Eevee <: Normal && + isconcretetype(Eevee) && + isempty(fieldnames(Eevee)) +) + correct(md"`Eevee` is correctly defined") +else + almost(md"You need to define `Eevee` correctly") +end; + +# ╔═║ f43cde45-9c12-430d-b75b-70a2c476db5b +check_eevee + +# ╔═║ 8b5e86e7-0f98-48b5-969d-e48daddf10cb +check_flareon = if ( + (@isdefined Flareon) && + Flareon <: Fire && + isconcretetype(Flareon) && + isempty(fieldnames(Flareon)) +) + correct(md"`Flareon` is correctly defined") +else + almost(md"You need to define `Flareon` correctly") +end; + +# ╔═║ 04c69dcc-534a-4c52-a8a3-5a65fb5f0191 +check_vaporeon = if ( + (@isdefined Vaporeon) && + Vaporeon <: Water && + isconcretetype(Vaporeon) && + isempty(fieldnames(Vaporeon)) +) + correct(md"`Vaporeon` is correctly defined") +else + almost(md"You need to define `Vaporeon` correctly") +end; + +# ╔═║ ed80972f-648a-4975-b414-2e644565dccb +TwoColumn(check_flareon, check_vaporeon) + +# ╔═║ 0e502851-fa10-4d2c-aaf3-e47ca4bf4bcf +check_leafeon = if ( + (@isdefined Leafeon) && + Leafeon <: Grass && + isconcretetype(Leafeon) && + isempty(fieldnames(Leafeon)) +) + correct(md"`Leafeon` is correctly defined") +else + almost(md"You need to define `Leafeon` correctly") +end; + +# ╔═║ 42631084-34ec-4482-9e10-84ff85067b93 +check_jolteon = if ( + (@isdefined Jolteon) && + Jolteon <: Electric && + isconcretetype(Jolteon) && + isempty(fieldnames(Jolteon)) +) + correct(md"`Jolteon` is correctly defined") +else + almost(md"You need to define `Jolteon` correctly") +end; + +# ╔═║ a33536e5-f9de-41d1-bd17-0a8dd8d577dc +TwoColumn(check_leafeon, check_jolteon) + +# ╔═║ 82751f0f-87fd-4110-9e86-0d0b1ad5cd36 +check_corgi = if ( + (@isdefined Corgi) && + Corgi <: Pokemon && + !isconcretetype(Corgi) +) + correct(md"`Corgi` is correctly defined") +else + almost(md"You need to define `Corgi` correctly") +end; + +# ╔═║ c3a05713-b023-4f8f-9eb2-98dc818de3ca +check_corgi + +# ╔═║ a3e88d8f-72dd-495a-b61b-a969cac7e55a +check_attack_corgi = if (@isdefined Corgi) + struct DummyCorgi <: Corgi end + if ( + attack(DummyCorgi(), Snorlax()) == NORMAL_EFFECTIVE && + attack(DummyCorgi(), Charmander()) == SUPER_EFFECTIVE && + attack(DummyCorgi(), Squirtle()) == SUPER_EFFECTIVE && + attack(DummyCorgi(), Bulbasaur()) == SUPER_EFFECTIVE && + attack(DummyCorgi(), Pikachu()) == SUPER_EFFECTIVE + ) + correct(md"`attack` is correctly defined for `Corgi` attackers") + else + almost(md"You need to define `attack` correctly for `Corgi` attackers") + end +else + almost(md"You need to define `attack` correctly for `Corgi` attackers") +end; + +# ╔═║ 2d0b80cb-01b4-429c-beed-c2c0d6f8626e +check_attack_corgi + +# ╔═║ a25c0f95-7c94-449f-a6c2-8acc649d3307 +check_philip = if ( + (@isdefined Corgi) && + (@isdefined Philip) && + Philip <: Corgi && + isconcretetype(Philip) && + fieldnames(Philip) == (:life,) && + fieldtypes(Philip) == (Int,) && + all(in(1:5), [Philip().life for k in 1:100]) +) + correct(md"`Philip` is correctly defined") +else + almost(md"You need to define `Philip` correctly") +end; + +# ╔═║ 7df61a7e-b8d0-4024-8dce-239cf0d0edd8 +check_philip + +# ╔═║ 3117a299-06af-47d4-8fb3-3ce394b71050 +check_defense_philip = if ( + (@isdefined Philip) && + Set(attack(Snorlax(), Philip()) for _ in 1:1000) == Set([NORMAL_EFFECTIVE, SUPER_EFFECTIVE]) +) + correct(md"`attack` is correctly defined for `Philip` defenders") +else + almost(md"You need to define `attack` correctly for `Philip` defenders") +end; + +# ╔═║ 4abde394-998e-4ff2-ad27-0f86a169d841 +check_defense_philip + +# ╔═║ 90c54b0f-0813-4813-8b8c-913a904817dd +check_friends_philip = if ( + (@isdefined Philip) && + friends(Philip(), Philip()) == true && + friends(Philip(), Charmander()) == true && + friends(Philip(), Squirtle()) == true && + friends(Philip(), Bulbasaur()) == true && + friends(Philip(), Pikachu()) == true +) + correct(md"`friends` is correctly defined for `Philip` arguments") +else + almost(md"You need to define `friends` correctly for `Philip` arguments") +end; + +# ╔═║ 5da5d4f3-a96c-4025-adf2-47978f441519 +check_friends_philip + +# ╔═║ 2b8f9fce-639a-432c-986e-956297743f14 +check_new_grid = begin + if @isdefined new_grid + my_pokemon_set = [Snorlax()] + my_grid = new_grid(my_pokemon_set; n=20, m=50) + if my_grid isa Matrix{<:Pokemon} + if size(my_grid) == (20, 50) + contents = Set(my_grid) + if Set(my_grid) == Set(my_pokemon_set) + correct(md"`new_grid` is correctly defined.") + else + almost(md"Make sure that `new_grid` chooses random elements from the input `pokemon_set`.") + end + else + almost(md"Make sure that `new_grid` returns a matrix of size `n Γ— m`.") + end + else + almost(md"Make sure that `new_grid` returns a `Matrix{<:Pokemon}`, i.e. a 2-dimensional array.") + end + else + almost(md"Make sure that `new_grid` is defined") + end +end; + +# ╔═║ 72f838ef-ecbd-412e-9ea6-88fc48fe8da6 +check_new_grid + +# ╔═║ 00000000-0000-0000-0000-000000000001 +PLUTO_PROJECT_TOML_CONTENTS = """ +[deps] +Colors = "5ae59095-9a9b-59fe-a467-6f913c188581" +FileIO = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" +ImageIO = "82e4d734-157c-48bb-816b-45c225c6df19" +ImageShow = "4e3cecfd-b093-5904-9786-8bbb286a6a31" +Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" +PlutoTeachingTools = "661c6b06-c737-4d37-b85c-46df65de6f69" +PlutoUI = "7f904dfe-b85e-4ff6-b463-dae2292396a8" + +[compat] +Colors = "~0.12.8" +FileIO = "~1.15.0" +ImageIO = "~0.6.6" +ImageShow = "~0.3.6" +Plots = "~1.32.1" +PlutoTeachingTools = "~0.1.7" +PlutoUI = "~0.7.39" +""" + +# ╔═║ 00000000-0000-0000-0000-000000000002 +PLUTO_MANIFEST_TOML_CONTENTS = """ +# This file is machine-generated - editing it directly is not advised + +julia_version = "1.8.1" +manifest_format = "2.0" +project_hash = "8a8171ae13d8c5a889e267b5e0b17f763675975a" + +[[deps.AbstractFFTs]] +deps = ["ChainRulesCore", "LinearAlgebra"] +git-tree-sha1 = "69f7020bd72f069c219b5e8c236c1fa90d2cb409" +uuid = "621f4979-c628-5d54-868e-fcf4e3e8185c" +version = "1.2.1" + +[[deps.AbstractPlutoDingetjes]] +deps = ["Pkg"] +git-tree-sha1 = "8eaf9f1b4921132a4cff3f36a1d9ba923b14a481" +uuid = "6e696c72-6542-2067-7265-42206c756150" +version = "1.1.4" + +[[deps.Adapt]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "195c5505521008abea5aee4f96930717958eac6f" +uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" +version = "3.4.0" + +[[deps.ArgTools]] +uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" +version = "1.1.1" + +[[deps.Artifacts]] +uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" + +[[deps.Base64]] +uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" + +[[deps.Bzip2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "19a35467a82e236ff51bc17a3a44b69ef35185a2" +uuid = "6e34b625-4abd-537c-b88f-471c36dfa7a0" +version = "1.0.8+0" + +[[deps.CEnum]] +git-tree-sha1 = "eb4cb44a499229b3b8426dcfb5dd85333951ff90" +uuid = "fa961155-64e5-5f13-b03f-caf6b980ea82" +version = "0.4.2" + +[[deps.Cairo_jll]] +deps = ["Artifacts", "Bzip2_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.ChainRulesCore]] +deps = ["Compat", "LinearAlgebra", "SparseArrays"] +git-tree-sha1 = "80ca332f6dcb2508adba68f22f551adb2d00a624" +uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" +version = "1.15.3" + +[[deps.ChangesOfVariables]] +deps = ["ChainRulesCore", "LinearAlgebra", "Test"] +git-tree-sha1 = "38f7a08f19d8810338d4f5085211c7dfa5d5bdd8" +uuid = "9e997f8a-9a97-42d5-a9f1-ce6bfc15e2c0" +version = "0.1.4" + +[[deps.CodeTracking]] +deps = ["InteractiveUtils", "UUIDs"] +git-tree-sha1 = "1833bda4a027f4b2a1c984baddcf755d77266818" +uuid = "da1fd8a2-8d9e-5ec2-8556-3022fb5608a2" +version = "1.1.0" + +[[deps.CodecZlib]] +deps = ["TranscodingStreams", "Zlib_jll"] +git-tree-sha1 = "ded953804d019afa9a3f98981d99b33e3db7b6da" +uuid = "944b1d66-785c-5afd-91f1-9de20f533193" +version = "0.7.0" + +[[deps.ColorSchemes]] +deps = ["ColorTypes", "ColorVectorSpace", "Colors", "FixedPointNumbers", "Random"] +git-tree-sha1 = "1fd869cc3875b57347f7027521f561cf46d1fcd8" +uuid = "35d6a980-a343-548e-a6ea-1d62b119f2f4" +version = "3.19.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", "SpecialFunctions", "Statistics", "TensorCore"] +git-tree-sha1 = "d08c20eef1f2cbc6e60fd3612ac4340b89fea322" +uuid = "c3611d14-8923-5661-9e6a-0046d554d3a4" +version = "0.9.9" + +[[deps.Colors]] +deps = ["ColorTypes", "FixedPointNumbers", "Reexport"] +git-tree-sha1 = "417b0ed7b8b838aa6ca0a87aadf1bb9eb111ce40" +uuid = "5ae59095-9a9b-59fe-a467-6f913c188581" +version = "0.12.8" + +[[deps.Compat]] +deps = ["Dates", "LinearAlgebra", "UUIDs"] +git-tree-sha1 = "5856d3031cdb1f3b2b6340dfdc66b6d9a149a374" +uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" +version = "4.2.0" + +[[deps.CompilerSupportLibraries_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" +version = "0.5.2+0" + +[[deps.Contour]] +git-tree-sha1 = "d05d9e7b7aedff4e5b51a029dced05cfb6125781" +uuid = "d38c429a-6771-53c6-b99e-75d170b6e991" +version = "0.6.2" + +[[deps.DataAPI]] +git-tree-sha1 = "fb5f5316dd3fd4c5e7c30a24d50643b73e37cd40" +uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a" +version = "1.10.0" + +[[deps.DataStructures]] +deps = ["Compat", "InteractiveUtils", "OrderedCollections"] +git-tree-sha1 = "d1fff3a548102f48987a52a2e0d114fa97d730f0" +uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" +version = "0.18.13" + +[[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.DelimitedFiles]] +deps = ["Mmap"] +uuid = "8bb1440f-4735-579b-a4ab-409b98df4dab" + +[[deps.Distributed]] +deps = ["Random", "Serialization", "Sockets"] +uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" + +[[deps.DocStringExtensions]] +deps = ["LibGit2"] +git-tree-sha1 = "5158c2b41018c5f7eb1470d558127ac274eca0c9" +uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" +version = "0.9.1" + +[[deps.Downloads]] +deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] +uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" +version = "1.6.0" + +[[deps.EarCut_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "3f3a2501fa7236e9b911e0f7a588c657e822bb6d" +uuid = "5ae413db-bbd1-5e63-b57d-d24a61df00f5" +version = "2.2.3+0" + +[[deps.Expat_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "bad72f730e9e91c08d9427d5e8db95478a3c323d" +uuid = "2e619515-83b5-522b-bb60-26c02a35a201" +version = "2.4.8+0" + +[[deps.Extents]] +git-tree-sha1 = "5e1e4c53fa39afe63a7d356e30452249365fba99" +uuid = "411431e0-e8b7-467b-b5e0-f676ba4f2910" +version = "0.1.1" + +[[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", "Pkg", "Zlib_jll", "libaom_jll", "libass_jll", "libfdk_aac_jll", "libvorbis_jll", "x264_jll", "x265_jll"] +git-tree-sha1 = "ccd479984c7838684b3ac204b716c89955c76623" +uuid = "b22a6f82-2f65-5046-a5b2-351ab43fb4e5" +version = "4.4.2+0" + +[[deps.FileIO]] +deps = ["Pkg", "Requires", "UUIDs"] +git-tree-sha1 = "94f5101b96d2d968ace56f7f2db19d0a5f592e28" +uuid = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" +version = "1.15.0" + +[[deps.FileWatching]] +uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" + +[[deps.FixedPointNumbers]] +deps = ["Statistics"] +git-tree-sha1 = "335bfdceacc84c5cdf16aadc768aa5ddfc5383cc" +uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" +version = "0.8.4" + +[[deps.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.FreeType2_jll]] +deps = ["Artifacts", "Bzip2_jll", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] +git-tree-sha1 = "87eb71354d8ec1a96d4a7636bd57a7347dde3ef9" +uuid = "d7e528f0-a631-5988-bf34-fe36492bcfd7" +version = "2.10.4+0" + +[[deps.FriBidi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "aa31987c2ba8704e23c6c8ba8a4f769d5d7e4f91" +uuid = "559328eb-81f9-559d-9380-de523a88c83c" +version = "1.0.10+0" + +[[deps.GLFW_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libglvnd_jll", "Pkg", "Xorg_libXcursor_jll", "Xorg_libXi_jll", "Xorg_libXinerama_jll", "Xorg_libXrandr_jll"] +git-tree-sha1 = "d972031d28c8c8d9d7b41a536ad7bb0c2579caca" +uuid = "0656b61e-2033-5cc2-a64a-77c0f6c09b89" +version = "3.3.8+0" + +[[deps.GR]] +deps = ["Base64", "DelimitedFiles", "GR_jll", "HTTP", "JSON", "Libdl", "LinearAlgebra", "Pkg", "Printf", "Random", "RelocatableFolders", "Serialization", "Sockets", "Test", "UUIDs"] +git-tree-sha1 = "cf0a9940f250dc3cb6cc6c6821b4bf8a4286cf9c" +uuid = "28b8d3ca-fb5f-59d9-8090-bfdbd6d07a71" +version = "0.66.2" + +[[deps.GR_jll]] +deps = ["Artifacts", "Bzip2_jll", "Cairo_jll", "FFMPEG_jll", "Fontconfig_jll", "GLFW_jll", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Libtiff_jll", "Pixman_jll", "Pkg", "Qt5Base_jll", "Zlib_jll", "libpng_jll"] +git-tree-sha1 = "2d908286d120c584abbe7621756c341707096ba4" +uuid = "d2c73de3-f751-5644-a686-071e5b155ba9" +version = "0.66.2+0" + +[[deps.GeoInterface]] +deps = ["Extents"] +git-tree-sha1 = "fb28b5dc239d0174d7297310ef7b84a11804dfab" +uuid = "cf35fbd7-0cd7-5166-be24-54bfbe79505f" +version = "1.0.1" + +[[deps.GeometryBasics]] +deps = ["EarCut_jll", "GeoInterface", "IterTools", "LinearAlgebra", "StaticArrays", "StructArrays", "Tables"] +git-tree-sha1 = "a7a97895780dab1085a97769316aa348830dc991" +uuid = "5c1252a2-5f33-56bf-86c9-59e7332b4326" +version = "0.4.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", "PCRE_jll", "Pkg", "Zlib_jll"] +git-tree-sha1 = "a32d672ac2c967f3deb8a81d828afc739c838a06" +uuid = "7746bdde-850d-59dc-9ae8-88ece973131d" +version = "2.68.3+2" + +[[deps.Graphics]] +deps = ["Colors", "LinearAlgebra", "NaNMath"] +git-tree-sha1 = "d61890399bc535850c4bf08e4e0d3a7ad0f21cbd" +uuid = "a2bd30eb-e257-5431-a919-1863eab51364" +version = "1.1.2" + +[[deps.Graphite2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "344bf40dcab1073aca04aa0df4fb092f920e4011" +uuid = "3b182d85-2403-5c21-9c21-1e1f0cc25472" +version = "1.3.14+0" + +[[deps.Grisu]] +git-tree-sha1 = "53bb909d1151e57e2484c3d1b53e19552b887fb2" +uuid = "42e2da0e-8278-4e71-bc24-59509adca0fe" +version = "1.0.2" + +[[deps.HTTP]] +deps = ["Base64", "CodecZlib", "Dates", "IniFile", "Logging", "LoggingExtras", "MbedTLS", "NetworkOptions", "Random", "SimpleBufferStream", "Sockets", "URIs", "UUIDs"] +git-tree-sha1 = "59ba44e0aa49b87a8c7a8920ec76f8afe87ed502" +uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3" +version = "1.3.3" + +[[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.Hyperscript]] +deps = ["Test"] +git-tree-sha1 = "8d511d5b81240fc8e6802386302675bdf47737b9" +uuid = "47d2ed2b-36de-50cf-bf87-49c2cf4b8b91" +version = "0.0.4" + +[[deps.HypertextLiteral]] +deps = ["Tricks"] +git-tree-sha1 = "c47c5fa4c5308f27ccaac35504858d8914e102f9" +uuid = "ac1192a8-f4b3-4bfe-ba22-af5b92cd3ab2" +version = "0.9.4" + +[[deps.IOCapture]] +deps = ["Logging", "Random"] +git-tree-sha1 = "f7be53659ab06ddc986428d3a9dcc95f6fa6705a" +uuid = "b5f81e59-6552-4d32-b1f0-c071b021bf89" +version = "0.2.2" + +[[deps.ImageBase]] +deps = ["ImageCore", "Reexport"] +git-tree-sha1 = "b51bb8cae22c66d0f6357e3bcb6363145ef20835" +uuid = "c817782e-172a-44cc-b673-b171935fbb9e" +version = "0.1.5" + +[[deps.ImageCore]] +deps = ["AbstractFFTs", "ColorVectorSpace", "Colors", "FixedPointNumbers", "Graphics", "MappedArrays", "MosaicViews", "OffsetArrays", "PaddedViews", "Reexport"] +git-tree-sha1 = "acf614720ef026d38400b3817614c45882d75500" +uuid = "a09fc81d-aa75-5fe9-8630-4744c3626534" +version = "0.9.4" + +[[deps.ImageIO]] +deps = ["FileIO", "IndirectArrays", "JpegTurbo", "LazyModules", "Netpbm", "OpenEXR", "PNGFiles", "QOI", "Sixel", "TiffImages", "UUIDs"] +git-tree-sha1 = "342f789fd041a55166764c351da1710db97ce0e0" +uuid = "82e4d734-157c-48bb-816b-45c225c6df19" +version = "0.6.6" + +[[deps.ImageShow]] +deps = ["Base64", "FileIO", "ImageBase", "ImageCore", "OffsetArrays", "StackViews"] +git-tree-sha1 = "b563cf9ae75a635592fc73d3eb78b86220e55bd8" +uuid = "4e3cecfd-b093-5904-9786-8bbb286a6a31" +version = "0.3.6" + +[[deps.Imath_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "87f7662e03a649cffa2e05bf19c303e168732d3e" +uuid = "905a6f67-0a94-5f89-b386-d35d92009cd1" +version = "3.1.2+0" + +[[deps.IndirectArrays]] +git-tree-sha1 = "012e604e1c7458645cb8b436f8fba789a51b257f" +uuid = "9b13fd28-a010-5f03-acff-a1bbcff69959" +version = "1.0.0" + +[[deps.Inflate]] +git-tree-sha1 = "5cd07aab533df5170988219191dfad0519391428" +uuid = "d25df0c9-e2be-5dd7-82c8-3ad0b3e990b9" +version = "0.1.3" + +[[deps.IniFile]] +git-tree-sha1 = "f550e6e32074c939295eb5ea6de31849ac2c9625" +uuid = "83e8ac13-25f8-5344-8a64-a9f2b223428f" +version = "0.5.1" + +[[deps.InteractiveUtils]] +deps = ["Markdown"] +uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" + +[[deps.InverseFunctions]] +deps = ["Test"] +git-tree-sha1 = "b3364212fb5d870f724876ffcd34dd8ec6d98918" +uuid = "3587e190-3f89-42d0-90ee-14403ec27112" +version = "0.1.7" + +[[deps.IrrationalConstants]] +git-tree-sha1 = "7fd44fd4ff43fc60815f8e764c0f352b83c49151" +uuid = "92d709cd-6900-40b7-9082-c6be49f344b6" +version = "0.1.1" + +[[deps.IterTools]] +git-tree-sha1 = "fa6287a4469f5e048d763df38279ee729fbd44e5" +uuid = "c8e1da08-722c-5040-9ed9-7db0dc04731e" +version = "1.4.0" + +[[deps.IteratorInterfaceExtensions]] +git-tree-sha1 = "a3f24677c21f5bbe9d2a714f95dcd58337fb2856" +uuid = "82899510-4779-5014-852e-03e436cf321d" +version = "1.0.0" + +[[deps.JLLWrappers]] +deps = ["Preferences"] +git-tree-sha1 = "abc9885a7ca2052a736a600f7fa66209f96506e1" +uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" +version = "1.4.1" + +[[deps.JSON]] +deps = ["Dates", "Mmap", "Parsers", "Unicode"] +git-tree-sha1 = "3c837543ddb02250ef42f4738347454f95079d4e" +uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" +version = "0.21.3" + +[[deps.JpegTurbo]] +deps = ["CEnum", "FileIO", "ImageCore", "JpegTurbo_jll", "TOML"] +git-tree-sha1 = "a77b273f1ddec645d1b7c4fd5fb98c8f90ad10a5" +uuid = "b835a17e-a41a-41e7-81f0-2f016b05efe0" +version = "0.1.1" + +[[deps.JpegTurbo_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "b53380851c6e6664204efb2e62cd24fa5c47e4ba" +uuid = "aacddb02-875f-59d6-b918-886e6ef4fbf8" +version = "2.1.2+0" + +[[deps.JuliaInterpreter]] +deps = ["CodeTracking", "InteractiveUtils", "Random", "UUIDs"] +git-tree-sha1 = "0f960b1404abb0b244c1ece579a0ec78d056a5d1" +uuid = "aa1ae85d-cabe-5617-a682-6adf51b2e16a" +version = "0.9.15" + +[[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.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 = "f2355693d6778a178ade15952b7ac47a4ff97996" +uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" +version = "1.3.0" + +[[deps.Latexify]] +deps = ["Formatting", "InteractiveUtils", "LaTeXStrings", "MacroTools", "Markdown", "Printf", "Requires"] +git-tree-sha1 = "1a43be956d433b5d0321197150c2f94e16c0aaa0" +uuid = "23fbe1c1-3f47-55db-b15f-69d7ec21a316" +version = "0.15.16" + +[[deps.LazyModules]] +git-tree-sha1 = "a560dd966b386ac9ae60bdd3a3d3a326062d3c3e" +uuid = "8cdb02fc-e678-4876-92c5-9defec4f444e" +version = "0.3.1" + +[[deps.LibCURL]] +deps = ["LibCURL_jll", "MozillaCACerts_jll"] +uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" +version = "0.6.3" + +[[deps.LibCURL_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] +uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" +version = "7.84.0+0" + +[[deps.LibGit2]] +deps = ["Base64", "NetworkOptions", "Printf", "SHA"] +uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" + +[[deps.LibSSH2_jll]] +deps = ["Artifacts", "Libdl", "MbedTLS_jll"] +uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" +version = "1.10.2+0" + +[[deps.Libdl]] +uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" + +[[deps.Libffi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "0b4a5d71f3e5200a7dff793393e09dfc2d874290" +uuid = "e9f186c6-92d2-5b65-8a66-fee21dc1b490" +version = "3.2.2+1" + +[[deps.Libgcrypt_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgpg_error_jll", "Pkg"] +git-tree-sha1 = "64613c82a59c120435c067c2b809fc61cf5166ae" +uuid = "d4300ac3-e22c-5743-9152-c294e39db1e4" +version = "1.8.7+0" + +[[deps.Libglvnd_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll", "Xorg_libXext_jll"] +git-tree-sha1 = "7739f837d6447403596a75d19ed01fd08d6f56bf" +uuid = "7e76a0d4-f3c7-5321-8279-8d96eeed0f29" +version = "1.3.0+3" + +[[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", "Pkg"] +git-tree-sha1 = "42b62845d70a619f063a7da093d995ec8e15e778" +uuid = "94ce4f54-9a6c-5748-9c1c-f9c7231a4531" +version = "1.16.1+1" + +[[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", "Pkg", "Zlib_jll", "Zstd_jll"] +git-tree-sha1 = "3eb79b0ca5764d4799c06699573fd8f533259713" +uuid = "89763e89-9b03-5906-acba-b20f662cd828" +version = "4.4.0+0" + +[[deps.Libuuid_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "7f3efec06033682db852f8b3bc3c1d2b0a0ab066" +uuid = "38a345b3-de98-5d2b-a5d3-14cd9215e700" +version = "2.36.0+0" + +[[deps.LinearAlgebra]] +deps = ["Libdl", "libblastrampoline_jll"] +uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + +[[deps.LogExpFunctions]] +deps = ["ChainRulesCore", "ChangesOfVariables", "DocStringExtensions", "InverseFunctions", "IrrationalConstants", "LinearAlgebra"] +git-tree-sha1 = "94d9c52ca447e23eac0c0f074effbcd38830deb5" +uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688" +version = "0.3.18" + +[[deps.Logging]] +uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" + +[[deps.LoggingExtras]] +deps = ["Dates", "Logging"] +git-tree-sha1 = "5d4d2d9904227b8bd66386c1138cf4d5ffa826bf" +uuid = "e6f89c97-d47a-5376-807f-9c37f3926c36" +version = "0.4.9" + +[[deps.LoweredCodeUtils]] +deps = ["JuliaInterpreter"] +git-tree-sha1 = "dedbebe234e06e1ddad435f5c6f4b85cd8ce55f7" +uuid = "6f1432cf-f94c-5a45-995e-cdbf5db27b0b" +version = "2.2.2" + +[[deps.MacroTools]] +deps = ["Markdown", "Random"] +git-tree-sha1 = "3d3e902b31198a27340d0bf00d6ac452866021cf" +uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" +version = "0.5.9" + +[[deps.MappedArrays]] +git-tree-sha1 = "e8b359ef06ec72e8c030463fe02efe5527ee5142" +uuid = "dbb5928d-eab1-5f90-85c2-b9b0edb7c900" +version = "0.4.1" + +[[deps.Markdown]] +deps = ["Base64"] +uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" + +[[deps.MbedTLS]] +deps = ["Dates", "MbedTLS_jll", "MozillaCACerts_jll", "Random", "Sockets"] +git-tree-sha1 = "ae6676d5f576ccd21b6789c2cbe2ba24fcc8075d" +uuid = "739be429-bea8-5141-9913-cc70e7f3736d" +version = "1.1.5" + +[[deps.MbedTLS_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" +version = "2.28.0+0" + +[[deps.Measures]] +git-tree-sha1 = "e498ddeee6f9fdb4551ce855a46f54dbd900245f" +uuid = "442fdcdd-2543-5da2-b0f3-8c86c306513e" +version = "0.3.1" + +[[deps.Missings]] +deps = ["DataAPI"] +git-tree-sha1 = "bf210ce90b6c9eed32d25dbcae1ebc565df2687f" +uuid = "e1d29d7a-bbdc-5cf2-9ac0-f12de2c33e28" +version = "1.0.2" + +[[deps.Mmap]] +uuid = "a63ad114-7e13-5084-954f-fe012c677804" + +[[deps.MosaicViews]] +deps = ["MappedArrays", "OffsetArrays", "PaddedViews", "StackViews"] +git-tree-sha1 = "b34e3bc3ca7c94914418637cb10cc4d1d80d877d" +uuid = "e94cdb99-869f-56ef-bcf0-1ae2bcbe0389" +version = "0.3.3" + +[[deps.MozillaCACerts_jll]] +uuid = "14a3606d-f60d-562e-9121-12d972cd8159" +version = "2022.2.1" + +[[deps.NaNMath]] +deps = ["OpenLibm_jll"] +git-tree-sha1 = "a7c3d1da1189a1c2fe843a3bfa04d18d20eb3211" +uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" +version = "1.0.1" + +[[deps.Netpbm]] +deps = ["FileIO", "ImageCore"] +git-tree-sha1 = "18efc06f6ec36a8b801b23f076e3c6ac7c3bf153" +uuid = "f09324ee-3d7c-5217-9330-fc30815ba969" +version = "1.0.2" + +[[deps.NetworkOptions]] +uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" +version = "1.2.0" + +[[deps.OffsetArrays]] +deps = ["Adapt"] +git-tree-sha1 = "1ea784113a6aa054c5ebd95945fa5e52c2f378e7" +uuid = "6fe1bfb0-de20-5000-8ca7-80f57d26f881" +version = "1.12.7" + +[[deps.Ogg_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "887579a3eb005446d514ab7aeac5d1d027658b8f" +uuid = "e7412a2a-1a6e-54c0-be00-318e2571c051" +version = "1.3.5+1" + +[[deps.OpenBLAS_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] +uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" +version = "0.3.20+0" + +[[deps.OpenEXR]] +deps = ["Colors", "FileIO", "OpenEXR_jll"] +git-tree-sha1 = "327f53360fdb54df7ecd01e96ef1983536d1e633" +uuid = "52e1d378-f018-4a11-a4be-720524705ac7" +version = "0.3.2" + +[[deps.OpenEXR_jll]] +deps = ["Artifacts", "Imath_jll", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] +git-tree-sha1 = "923319661e9a22712f24596ce81c54fc0366f304" +uuid = "18a262bb-aa17-5467-a713-aee519bc75cb" +version = "3.1.1+0" + +[[deps.OpenLibm_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "05823500-19ac-5b8b-9628-191a04bc5112" +version = "0.8.1+0" + +[[deps.OpenSSL_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "e60321e3f2616584ff98f0a4f18d98ae6f89bbb3" +uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95" +version = "1.1.17+0" + +[[deps.OpenSpecFun_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "13652491f6856acfd2db29360e1bbcd4565d04f1" +uuid = "efe28fd5-8261-553b-a9e1-b2916fc3738e" +version = "0.5.5+0" + +[[deps.Opus_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "51a08fb14ec28da2ec7a927c4337e4332c2a4720" +uuid = "91d4177d-7536-5919-b921-800302f37372" +version = "1.3.2+0" + +[[deps.OrderedCollections]] +git-tree-sha1 = "85f8e6578bf1f9ee0d11e7bb1b1456435479d47c" +uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" +version = "1.4.1" + +[[deps.PCRE_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "b2a7af664e098055a7529ad1a900ded962bca488" +uuid = "2f80f16e-611a-54ab-bc61-aa92de5b98fc" +version = "8.44.0+0" + +[[deps.PNGFiles]] +deps = ["Base64", "CEnum", "ImageCore", "IndirectArrays", "OffsetArrays", "libpng_jll"] +git-tree-sha1 = "e925a64b8585aa9f4e3047b8d2cdc3f0e79fd4e4" +uuid = "f57f5aa1-a3ce-4bc8-8ab9-96f992907883" +version = "0.3.16" + +[[deps.PaddedViews]] +deps = ["OffsetArrays"] +git-tree-sha1 = "03a7a85b76381a3d04c7a1656039197e70eda03d" +uuid = "5432bcbf-9aad-5242-b902-cca2824c8663" +version = "0.5.11" + +[[deps.Parsers]] +deps = ["Dates"] +git-tree-sha1 = "0044b23da09b5608b4ecacb4e5e6c6332f833a7e" +uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" +version = "2.3.2" + +[[deps.Pixman_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "b4f5d02549a10e20780a24fce72bea96b6329e29" +uuid = "30392449-352a-5448-841d-b1acce4e97dc" +version = "0.40.1+0" + +[[deps.Pkg]] +deps = ["Artifacts", "Dates", "Downloads", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] +uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" +version = "1.8.0" + +[[deps.PkgVersion]] +deps = ["Pkg"] +git-tree-sha1 = "f6cf8e7944e50901594838951729a1861e668cb8" +uuid = "eebad327-c553-4316-9ea0-9fa01ccd7688" +version = "0.3.2" + +[[deps.PlotThemes]] +deps = ["PlotUtils", "Statistics"] +git-tree-sha1 = "8162b2f8547bc23876edd0c5181b27702ae58dce" +uuid = "ccf2f8ad-2431-5c83-bf29-c5338b663b6a" +version = "3.0.0" + +[[deps.PlotUtils]] +deps = ["ColorSchemes", "Colors", "Dates", "Printf", "Random", "Reexport", "SnoopPrecompile", "Statistics"] +git-tree-sha1 = "21303256d239f6b484977314674aef4bb1fe4420" +uuid = "995b91a9-d308-5afd-9ec6-746e21dbc043" +version = "1.3.1" + +[[deps.Plots]] +deps = ["Base64", "Contour", "Dates", "Downloads", "FFMPEG", "FixedPointNumbers", "GR", "GeometryBasics", "JSON", "LaTeXStrings", "Latexify", "LinearAlgebra", "Measures", "NaNMath", "Pkg", "PlotThemes", "PlotUtils", "Printf", "REPL", "Random", "RecipesBase", "RecipesPipeline", "Reexport", "RelocatableFolders", "Requires", "Scratch", "Showoff", "SparseArrays", "Statistics", "StatsBase", "UUIDs", "UnicodeFun", "Unzip"] +git-tree-sha1 = "e9cab2c5e3b7be152ad6241d2011718838a99a27" +uuid = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" +version = "1.32.1" + +[[deps.PlutoHooks]] +deps = ["InteractiveUtils", "Markdown", "UUIDs"] +git-tree-sha1 = "072cdf20c9b0507fdd977d7d246d90030609674b" +uuid = "0ff47ea0-7a50-410d-8455-4348d5de0774" +version = "0.0.5" + +[[deps.PlutoLinks]] +deps = ["FileWatching", "InteractiveUtils", "Markdown", "PlutoHooks", "Revise", "UUIDs"] +git-tree-sha1 = "0e8bcc235ec8367a8e9648d48325ff00e4b0a545" +uuid = "0ff47ea0-7a50-410d-8455-4348d5de0420" +version = "0.1.5" + +[[deps.PlutoTeachingTools]] +deps = ["Downloads", "HypertextLiteral", "LaTeXStrings", "Latexify", "Markdown", "PlutoLinks", "PlutoUI", "Random"] +git-tree-sha1 = "67c917d383c783aeadd25babad6625b834294b30" +uuid = "661c6b06-c737-4d37-b85c-46df65de6f69" +version = "0.1.7" + +[[deps.PlutoUI]] +deps = ["AbstractPlutoDingetjes", "Base64", "ColorTypes", "Dates", "Hyperscript", "HypertextLiteral", "IOCapture", "InteractiveUtils", "JSON", "Logging", "Markdown", "Random", "Reexport", "UUIDs"] +git-tree-sha1 = "8d1f54886b9037091edf146b517989fc4a09efec" +uuid = "7f904dfe-b85e-4ff6-b463-dae2292396a8" +version = "0.7.39" + +[[deps.Preferences]] +deps = ["TOML"] +git-tree-sha1 = "47e5f437cc0e7ef2ce8406ce1e7e24d44915f88d" +uuid = "21216c6a-2e73-6563-6e65-726566657250" +version = "1.3.0" + +[[deps.Printf]] +deps = ["Unicode"] +uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" + +[[deps.ProgressMeter]] +deps = ["Distributed", "Printf"] +git-tree-sha1 = "d7a7aef8f8f2d537104f170139553b14dfe39fe9" +uuid = "92933f4c-e287-5a05-a399-4b506db050ca" +version = "1.7.2" + +[[deps.QOI]] +deps = ["ColorTypes", "FileIO", "FixedPointNumbers"] +git-tree-sha1 = "18e8f4d1426e965c7b532ddd260599e1510d26ce" +uuid = "4b34888f-f399-49d4-9bb3-47ed5cae4e65" +version = "1.0.0" + +[[deps.Qt5Base_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Fontconfig_jll", "Glib_jll", "JLLWrappers", "Libdl", "Libglvnd_jll", "OpenSSL_jll", "Pkg", "Xorg_libXext_jll", "Xorg_libxcb_jll", "Xorg_xcb_util_image_jll", "Xorg_xcb_util_keysyms_jll", "Xorg_xcb_util_renderutil_jll", "Xorg_xcb_util_wm_jll", "Zlib_jll", "xkbcommon_jll"] +git-tree-sha1 = "c6c0f690d0cc7caddb74cef7aa847b824a16b256" +uuid = "ea2cea3b-5b76-57ae-a6ef-0a8af62496e1" +version = "5.15.3+1" + +[[deps.REPL]] +deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] +uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" + +[[deps.Random]] +deps = ["SHA", "Serialization"] +uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" + +[[deps.RecipesBase]] +git-tree-sha1 = "6bf3f380ff52ce0832ddd3a2a7b9538ed1bcca7d" +uuid = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" +version = "1.2.1" + +[[deps.RecipesPipeline]] +deps = ["Dates", "NaNMath", "PlotUtils", "RecipesBase"] +git-tree-sha1 = "e7eac76a958f8664f2718508435d058168c7953d" +uuid = "01d81517-befc-4cb6-b9ec-a95719d0359c" +version = "0.6.3" + +[[deps.Reexport]] +git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" +uuid = "189a3867-3050-52da-a836-e630ba90ab69" +version = "1.2.2" + +[[deps.RelocatableFolders]] +deps = ["SHA", "Scratch"] +git-tree-sha1 = "22c5201127d7b243b9ee1de3b43c408879dff60f" +uuid = "05181044-ff0b-4ac5-8273-598c1e38db00" +version = "0.3.0" + +[[deps.Requires]] +deps = ["UUIDs"] +git-tree-sha1 = "838a3a4188e2ded87a4f9f184b4b0d78a1e91cb7" +uuid = "ae029012-a4dd-5104-9daa-d747884805df" +version = "1.3.0" + +[[deps.Revise]] +deps = ["CodeTracking", "Distributed", "FileWatching", "JuliaInterpreter", "LibGit2", "LoweredCodeUtils", "OrderedCollections", "Pkg", "REPL", "Requires", "UUIDs", "Unicode"] +git-tree-sha1 = "dad726963ecea2d8a81e26286f625aee09a91b7c" +uuid = "295af30f-e4ad-537b-8983-00126c2a3abe" +version = "3.4.0" + +[[deps.SHA]] +uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" +version = "0.7.0" + +[[deps.Scratch]] +deps = ["Dates"] +git-tree-sha1 = "f94f779c94e58bf9ea243e77a37e16d9de9126bd" +uuid = "6c6a2e73-6563-6170-7368-637461726353" +version = "1.1.1" + +[[deps.Serialization]] +uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" + +[[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.Sixel]] +deps = ["Dates", "FileIO", "ImageCore", "IndirectArrays", "OffsetArrays", "REPL", "libsixel_jll"] +git-tree-sha1 = "8fb59825be681d451c246a795117f317ecbcaa28" +uuid = "45858cf5-a6b0-47a3-bbea-62219f50df47" +version = "0.1.2" + +[[deps.SnoopPrecompile]] +git-tree-sha1 = "f604441450a3c0569830946e5b33b78c928e1a85" +uuid = "66db9d55-30c0-4569-8b51-7e840670fc0c" +version = "1.0.1" + +[[deps.Sockets]] +uuid = "6462fe0b-24de-5631-8697-dd941f90decc" + +[[deps.SortingAlgorithms]] +deps = ["DataStructures"] +git-tree-sha1 = "b3363d7460f7d098ca0912c69b082f75625d7508" +uuid = "a2af1166-a08f-5f64-846c-94a0d3cef48c" +version = "1.0.1" + +[[deps.SparseArrays]] +deps = ["LinearAlgebra", "Random"] +uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + +[[deps.SpecialFunctions]] +deps = ["ChainRulesCore", "IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"] +git-tree-sha1 = "d75bda01f8c31ebb72df80a46c88b25d1c79c56d" +uuid = "276daf66-3868-5448-9aa4-cd146d93841b" +version = "2.1.7" + +[[deps.StackViews]] +deps = ["OffsetArrays"] +git-tree-sha1 = "46e589465204cd0c08b4bd97385e4fa79a0c770c" +uuid = "cae243ae-269e-4f55-b966-ac2d0dc13c15" +version = "0.1.1" + +[[deps.StaticArrays]] +deps = ["LinearAlgebra", "Random", "StaticArraysCore", "Statistics"] +git-tree-sha1 = "dfec37b90740e3b9aa5dc2613892a3fc155c3b42" +uuid = "90137ffa-7385-5640-81b9-e52037218182" +version = "1.5.6" + +[[deps.StaticArraysCore]] +git-tree-sha1 = "ec2bd695e905a3c755b33026954b119ea17f2d22" +uuid = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" +version = "1.3.0" + +[[deps.Statistics]] +deps = ["LinearAlgebra", "SparseArrays"] +uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" + +[[deps.StatsAPI]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "f9af7f195fb13589dd2e2d57fdb401717d2eb1f6" +uuid = "82ae8749-77ed-4fe6-ae5f-f523153014b0" +version = "1.5.0" + +[[deps.StatsBase]] +deps = ["DataAPI", "DataStructures", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"] +git-tree-sha1 = "d1bf48bfcc554a3761a133fe3a9bb01488e06916" +uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" +version = "0.33.21" + +[[deps.StructArrays]] +deps = ["Adapt", "DataAPI", "StaticArraysCore", "Tables"] +git-tree-sha1 = "8c6ac65ec9ab781af05b08ff305ddc727c25f680" +uuid = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" +version = "0.6.12" + +[[deps.TOML]] +deps = ["Dates"] +uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" +version = "1.0.0" + +[[deps.TableTraits]] +deps = ["IteratorInterfaceExtensions"] +git-tree-sha1 = "c06b2f539df1c6efa794486abfb6ed2022561a39" +uuid = "3783bdb8-4a98-5b6b-af9a-565f29a5fe9c" +version = "1.0.1" + +[[deps.Tables]] +deps = ["DataAPI", "DataValueInterfaces", "IteratorInterfaceExtensions", "LinearAlgebra", "OrderedCollections", "TableTraits", "Test"] +git-tree-sha1 = "5ce79ce186cc678bbb5c5681ca3379d1ddae11a1" +uuid = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" +version = "1.7.0" + +[[deps.Tar]] +deps = ["ArgTools", "SHA"] +uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" +version = "1.10.0" + +[[deps.TensorCore]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "1feb45f88d133a655e001435632f019a9a1bcdb6" +uuid = "62fd8b95-f654-4bbd-a8a5-9c27f68ccd50" +version = "0.1.1" + +[[deps.Test]] +deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] +uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[[deps.TiffImages]] +deps = ["ColorTypes", "DataStructures", "DocStringExtensions", "FileIO", "FixedPointNumbers", "IndirectArrays", "Inflate", "Mmap", "OffsetArrays", "PkgVersion", "ProgressMeter", "UUIDs"] +git-tree-sha1 = "70e6d2da9210371c927176cb7a56d41ef1260db7" +uuid = "731e570b-9d59-4bfa-96dc-6df516fadf69" +version = "0.6.1" + +[[deps.TranscodingStreams]] +deps = ["Random", "Test"] +git-tree-sha1 = "ed5d390c7addb70e90fd1eb783dcb9897922cbfa" +uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa" +version = "0.9.8" + +[[deps.Tricks]] +git-tree-sha1 = "6bac775f2d42a611cdfcd1fb217ee719630c4175" +uuid = "410a4b4d-49e4-4fbc-ab6d-cb71b17b3775" +version = "0.1.6" + +[[deps.URIs]] +git-tree-sha1 = "e59ecc5a41b000fa94423a578d29290c7266fc10" +uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" +version = "1.4.0" + +[[deps.UUIDs]] +deps = ["Random", "SHA"] +uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" + +[[deps.Unicode]] +uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" + +[[deps.UnicodeFun]] +deps = ["REPL"] +git-tree-sha1 = "53915e50200959667e78a92a418594b428dffddf" +uuid = "1cfade01-22cf-5700-b092-accc4b62d6e1" +version = "0.4.1" + +[[deps.Unzip]] +git-tree-sha1 = "ca0969166a028236229f63514992fc073799bb78" +uuid = "41fe7b60-77ed-43a1-b4f0-825fd5a5650d" +version = "0.2.0" + +[[deps.Wayland_jll]] +deps = ["Artifacts", "Expat_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Pkg", "XML2_jll"] +git-tree-sha1 = "3e61f0b86f90dacb0bc0e73a0c5a83f6a8636e23" +uuid = "a2964d1f-97da-50d4-b82a-358c7fce9d89" +version = "1.19.0+0" + +[[deps.Wayland_protocols_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "4528479aa01ee1b3b4cd0e6faef0e04cf16466da" +uuid = "2381bf8a-dfd0-557d-9999-79630e7b1b91" +version = "1.25.0+0" + +[[deps.XML2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Pkg", "Zlib_jll"] +git-tree-sha1 = "58443b63fb7e465a8a7210828c91c08b92132dff" +uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a" +version = "2.9.14+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.Xorg_libX11_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libxcb_jll", "Xorg_xtrans_jll"] +git-tree-sha1 = "5be649d550f3f4b95308bf0183b82e2582876527" +uuid = "4f6342f7-b3d2-589e-9d20-edeb45f2b2bc" +version = "1.6.9+4" + +[[deps.Xorg_libXau_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "4e490d5c960c314f33885790ed410ff3a94ce67e" +uuid = "0c0b7dd1-d40b-584c-a123-a41640f87eec" +version = "1.0.9+4" + +[[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", "Pkg"] +git-tree-sha1 = "4fe47bd2247248125c428978740e18a681372dd4" +uuid = "a3789734-cfe1-5b06-b2d0-1dd0d9d62d05" +version = "1.1.3+4" + +[[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", "Pkg"] +git-tree-sha1 = "6783737e45d3c59a4a4c4091f5f88cdcf0908cbb" +uuid = "14d82f49-176c-5ed1-bb49-ad3f5cbd8c74" +version = "0.1.0+3" + +[[deps.Xorg_libxcb_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "XSLT_jll", "Xorg_libXau_jll", "Xorg_libXdmcp_jll", "Xorg_libpthread_stubs_jll"] +git-tree-sha1 = "daf17f441228e7a3833846cd048892861cff16d6" +uuid = "c7cfdc94-dc32-55de-ac96-5a1b8d977c5b" +version = "1.13.0+3" + +[[deps.Xorg_libxkbfile_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll"] +git-tree-sha1 = "926af861744212db0eb001d9e40b5d16292080b2" +uuid = "cc61e674-0454-545c-8b26-ed2c68acab7a" +version = "1.1.0+4" + +[[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", "Pkg", "Xorg_libxkbfile_jll"] +git-tree-sha1 = "4bcbf660f6c2e714f87e960a171b119d06ee163b" +uuid = "35661453-b289-5fab-8a00-3d9160c6a3a4" +version = "1.4.2+4" + +[[deps.Xorg_xkeyboard_config_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xkbcomp_jll"] +git-tree-sha1 = "5c8424f8a67c3f2209646d4425f3d415fee5931d" +uuid = "33bec58e-1273-512f-9401-5d533626f822" +version = "2.27.0+4" + +[[deps.Xorg_xtrans_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "79c31e7844f6ecf779705fbc12146eb190b7d845" +uuid = "c5fb5394-a638-5e4d-96e5-b29de1b5cf10" +version = "1.4.0+3" + +[[deps.Zlib_jll]] +deps = ["Libdl"] +uuid = "83775a58-1f1d-513f-b197-d71354ab007a" +version = "1.2.12+3" + +[[deps.Zstd_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "e45044cd873ded54b6a5bac0eb5c971392cf1927" +uuid = "3161d3a3-bdf6-5164-811a-617609db77b4" +version = "1.5.2+0" + +[[deps.libaom_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "3a2ea60308f0996d26f1e5354e10c24e9ef905d4" +uuid = "a4ae2306-e953-59d6-aa16-d00cac43593b" +version = "3.4.0+0" + +[[deps.libass_jll]] +deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] +git-tree-sha1 = "5982a94fcba20f02f42ace44b9894ee2b140fe47" +uuid = "0ac62f75-1d6f-5e53-bd7c-93b484bb37c0" +version = "0.15.1+0" + +[[deps.libblastrampoline_jll]] +deps = ["Artifacts", "Libdl", "OpenBLAS_jll"] +uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" +version = "5.1.1+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.libpng_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] +git-tree-sha1 = "94d180a6d2b5e55e447e2d27a29ed04fe79eb30c" +uuid = "b53b4c65-9356-5827-b1ea-8c7a1a84506f" +version = "1.6.38+0" + +[[deps.libsixel_jll]] +deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Pkg", "libpng_jll"] +git-tree-sha1 = "d4f63314c8aa1e48cd22aa0c17ed76cd1ae48c3c" +uuid = "075b6546-f08a-558a-be8f-8157d0f608a5" +version = "1.10.3+0" + +[[deps.libvorbis_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Ogg_jll", "Pkg"] +git-tree-sha1 = "b910cb81ef3fe6e78bf6acee440bda86fd6ae00c" +uuid = "f27f6e37-5d2b-51aa-960f-b287f2bc3b7a" +version = "1.3.7+1" + +[[deps.nghttp2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" +version = "1.48.0+0" + +[[deps.p7zip_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" +version = "17.4.0+0" + +[[deps.x264_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "4fea590b89e6ec504593146bf8b988b2c00922b2" +uuid = "1270edf5-f2f9-52d2-97e9-ab00b5d0237a" +version = "2021.5.5+0" + +[[deps.x265_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "ee567a171cce03570d77ad3a43e90218e38937a9" +uuid = "dfaa095f-4041-5dcd-9319-2fabd8486b76" +version = "3.5.0+0" + +[[deps.xkbcommon_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Wayland_jll", "Wayland_protocols_jll", "Xorg_libxcb_jll", "Xorg_xkeyboard_config_jll"] +git-tree-sha1 = "9ebfc140cc56e8c2156a15ceac2f0302e327ac0a" +uuid = "d8fb68d0-12a3-5cfd-a85a-d49703b185fd" +version = "1.4.1+0" +""" + +# ╔═║ Cell order: +# β•Ÿβ”€d20423a3-a6d8-4b7a-83c7-f1539fcc4d72 +# ╠═00992802-9ead-466b-8b01-bcaf0614b0c6 +# β•Ÿβ”€1896271c-e5bf-428c-bc3e-7780e71a065f +# ╠═fcafb864-249b-11ed-3b73-774e1742704a +# β•Ÿβ”€eee70c65-94b8-4f3d-a187-bbafb04b8eff +# β•Ÿβ”€9f1c224c-561e-4071-a909-0c951b9e3542 +# β•Ÿβ”€6ae05ccb-c386-4139-817c-85959a20a4de +# β•Ÿβ”€d0634f27-ba12-4c53-be66-6d2f7bf74808 +# β•Ÿβ”€a5d63fcc-9d84-4912-b6fe-3ddc937b3022 +# β•Ÿβ”€1b8b2a32-21fd-47e0-9c12-7a71e66fab4c +# ╠═321c6dc8-9d87-47da-88b3-a41b55b179ff +# β•Ÿβ”€d931270d-1ceb-474f-b04e-0185595a4b5a +# ╠═7dbd7cfd-5c52-4591-b6ba-eba7f3076a45 +# β•Ÿβ”€72ac44a7-7c18-4d0e-85e4-9ca9cb5173a8 +# β•Ÿβ”€d20b68c4-3091-4e49-8873-199672ed2695 +# ╠═74a44465-7332-45b0-91c4-2ae5ed658160 +# β•Ÿβ”€ed8a218f-287c-425b-a6b6-793be7ad1a7b +# β•Ÿβ”€fc1c3e85-b1af-4cbb-a8fe-597174bea4d4 +# β•Ÿβ”€037d04d4-f5f2-4b77-80ed-b799c1ea9b77 +# ╠═87081f51-7c44-4365-b412-7b34ed2b3191 +# β•Ÿβ”€d4619cdf-f902-4a8e-8e60-b8606aee40d2 +# ╠═2e9ddef4-688c-4623-8b58-578e7931204b +# ╠═3a99de95-3312-47f7-b46e-545aa75b82bf +# ╠═9b143e5c-04b6-4306-87c6-fc818747c20d +# ╠═cb4ee69a-c992-45ae-b7a2-0cbc318a090e +# ╠═9b6b6596-7680-4864-9395-10fbf69ec0ae +# ╠═c137d356-f552-4e3e-92b7-a9ffc0df0266 +# β•Ÿβ”€9e2898c5-5c90-4fca-8c60-1fc31db81ead +# ╠═f43cde45-9c12-430d-b75b-70a2c476db5b +# ╠═ed80972f-648a-4975-b414-2e644565dccb +# ╠═a33536e5-f9de-41d1-bd17-0a8dd8d577dc +# β•Ÿβ”€1dbbf479-1707-4dd0-90c8-394690fbac91 +# β•Ÿβ”€c4063845-c70a-47ef-a4f7-ef2b3ea0f0d8 +# β•Ÿβ”€3d748f13-ef9c-4899-99d3-16743f0e2f5a +# ╠═730ae9dc-34bf-4472-ae32-36fe10c54175 +# ╠═d0d2c56e-297d-4d35-afb7-bfd366815a95 +# ╠═0eabf795-a9c5-4aa1-8282-e5e22b631c4d +# ╠═57e16f0a-c0bc-4727-9315-701328989762 +# ╠═ab71225e-3d0e-4a11-a5de-6b1eea4048eb +# ╠═ecebb7eb-000f-418d-bfb8-acb66b06c171 +# β•Ÿβ”€7b2dbb37-9523-4150-bf23-4803ef0f31f1 +# ╠═ad26c7d9-f457-4dc0-8a70-8bac4b3c3a10 +# β•Ÿβ”€b6ebf9ce-0a8f-4f67-b324-3aa4da967d46 +# β•Ÿβ”€d241fcec-3266-4175-abd5-7d26128dc923 +# β•Ÿβ”€3eb3545e-d48a-41d7-ac31-b9b6d1b22af9 +# ╠═58aed749-468e-477d-98c7-3a7a0c9ea7a0 +# β•Ÿβ”€6893ced3-012f-4dc2-8e1c-2a292bfe067e +# β•Ÿβ”€80c63240-d4e8-4a4b-b34c-a14b064a75a5 +# ╠═9370b300-25a9-4342-803d-c2f1ba0d2b90 +# β•Ÿβ”€595e20f1-150a-4224-aee5-607882486887 +# ╠═136dbf04-77a0-4c14-868d-73a92a9028b5 +# β•Ÿβ”€390c7fe7-a27c-4f21-a8dc-c8cf19372857 +# ╠═5963a5b6-7939-49f5-9f5e-d1984afd8d79 +# β•Ÿβ”€520f5b7e-d5dd-4954-93a3-39e63d5d2a1b +# β•Ÿβ”€581e4013-692a-4a66-b210-b4db92112187 +# ╠═eb29c4ee-2cd2-4c51-a1c3-954b5745b9a9 +# ╠═5f605953-9216-41fc-b935-bb6c2ca5414e +# ╠═35fe8041-58ba-419e-a9d2-f9fc97d13cce +# β•Ÿβ”€7b003215-ce5d-4063-9eb0-c05affd1d15e +# β•Ÿβ”€ffee9abf-d6ed-411e-bef7-15d52c084d3e +# β•Ÿβ”€2016d37b-ab63-4956-8fe7-de7eaadfb29f +# β•Ÿβ”€cf769229-9766-40d5-a8e0-1b7cb0b8b16e +# β•Ÿβ”€3903ec25-8077-49e2-a711-2500defec7b5 +# ╠═a4c0fff3-b4fe-4c48-8680-c12bbf4f68f3 +# β•Ÿβ”€3d31d6ab-d466-4581-9ade-a8a541a03319 +# ╠═c3a05713-b023-4f8f-9eb2-98dc818de3ca +# β•Ÿβ”€88c8da1c-8cd8-4dad-961e-edf035790286 +# β•Ÿβ”€fb577ace-d7d1-4ac9-ad47-57d28528c243 +# ╠═a2fe0244-361f-4154-af76-a56bd7928880 +# ╠═2d0b80cb-01b4-429c-beed-c2c0d6f8626e +# β•Ÿβ”€ccc1dd94-a1db-4504-8d27-5fbf577cee30 +# β•Ÿβ”€e2f9f8d1-0d83-415e-b459-4c6e36cc9ddf +# ╠═f899ed08-4315-4c17-8792-84ad0cae631b +# β•Ÿβ”€28737ee7-6939-4830-95e3-fc08b6dcf1a4 +# β•Ÿβ”€24e23eb0-9341-4249-afe1-c6d94c57478e +# ╠═f0705b81-3df4-4145-9de5-8a4d738f6398 +# ╠═f5604cbe-0348-475c-8e0f-43b7bb213b36 +# ╠═a4eedc3b-0808-42ec-88b0-d710497fcd68 +# ╠═7df61a7e-b8d0-4024-8dce-239cf0d0edd8 +# β•Ÿβ”€eaea15b2-5918-4fc0-b44a-3cb0c085fa67 +# β•Ÿβ”€8fc13f81-3e49-4b98-8592-fb9f24eda900 +# ╠═cf737824-4aa3-409b-a914-be606c9668a0 +# β•Ÿβ”€79b384b1-8393-4c8c-84e4-6c1c729c53eb +# ╠═afdf5d1e-d19d-486e-ab4d-167d74975e5e +# ╠═996f35f9-8510-4cee-b923-1c11ef7244af +# ╠═3d800a03-06fc-46e4-b0d6-d123200fc26f +# ╠═d11432fc-cdee-4364-8159-49ce25d6c7e5 +# ╠═d73978e5-ec24-4d71-82ca-184c76f00b74 +# ╠═4abde394-998e-4ff2-ad27-0f86a169d841 +# β•Ÿβ”€023a75a3-a7a6-4e2d-911b-8a5c54d86e80 +# β•Ÿβ”€87cdb6d3-cfa6-4564-8ea4-e2f202d89eca +# β•Ÿβ”€d5ba5a13-9242-480c-94d7-e681e0ecdf72 +# ╠═117ff067-08ae-4134-8d23-ef28d31a7b8f +# β•Ÿβ”€e65bfd90-83c6-4c93-9f7f-aa8d41c01531 +# ╠═172d0f37-5214-4e73-8635-8bfe85011f4a +# β•Ÿβ”€86d0af15-ccf4-4254-a686-a6ace39a7a74 +# ╠═22633b0a-33c5-4b7d-98b0-42663adc1631 +# β•Ÿβ”€4885f35e-1875-4dca-8bad-f8ae94cb98b3 +# β•Ÿβ”€c64086a9-b749-4a5d-8665-0085ae4fb64e +# ╠═6daea6c1-6eb4-4117-8e11-63e9913792e3 +# β•Ÿβ”€c491ca01-5a0b-4f91-825c-67f597aa788a +# β•Ÿβ”€d96068be-4ac9-4ff9-ae3e-4807df555a42 +# ╠═2eb828db-1008-4551-819d-60ec0aa8eb7a +# ╠═a637f11c-bd0a-4a87-a1b9-52fd43eb9fcc +# ╠═c619533d-6e4c-4aae-b3a7-099f578f7b7d +# ╠═076c200b-d1cf-4c17-91d3-84d447271560 +# ╠═5da5d4f3-a96c-4025-adf2-47978f441519 +# β•Ÿβ”€916540e4-d354-436e-8c79-a8e2aff4f591 +# β•Ÿβ”€9c41f013-38f4-41b4-a2c9-90a2f6f08356 +# β•Ÿβ”€e5bf5d32-2597-42d1-b9a6-eba666fe48d5 +# ╠═f911d885-cc82-4eff-bac2-310e49923c63 +# β•Ÿβ”€f7b8330e-5897-4b71-a9aa-64838cf2a9bd +# β•Ÿβ”€f2ea1753-e3d8-42e0-a495-5fd22abeb944 +# ╠═b66b0c70-fdd1-4d43-8adf-807f59055f8c +# ╠═e227d7f2-ddb7-415e-9b9e-e0efd8945ca0 +# ╠═72f838ef-ecbd-412e-9ea6-88fc48fe8da6 +# β•Ÿβ”€d8058473-2ffa-4ae4-8699-435bdf7d6f08 +# β•Ÿβ”€ebddaba7-792a-4546-9739-df271df2a880 +# ╠═52121c38-fe60-4c52-8c43-40970fc8d69c +# ╠═04de7b1e-ea7c-438d-b16a-8e758bb40a70 +# ╠═4ea66307-dbfc-45d2-894c-fbd89f1957ce +# β•Ÿβ”€8d558109-3d41-4ed1-b855-2d7ce7f29369 +# ╠═7f97374d-04d9-4241-b166-aa5a6e052c66 +# ╠═2b34aa16-107c-4e17-88bb-6dfc6e2b4881 +# β•Ÿβ”€51103ee4-b68b-48cf-addc-8905dda40747 +# ╠═012dd868-8815-4c3e-9adb-1ce854081bac +# β•Ÿβ”€dd38f9f9-0da9-4039-b1bd-ed914d434c7f +# ╠═de109133-313f-4235-a885-eb8ca55cde67 +# ╠═176c6971-483f-408c-abc2-994546a5f57f +# ╠═876837a1-06b7-4b86-829d-4edeae166dc3 +# ╠═fb8696b8-4d1b-49cf-8e25-703287d2b3f1 +# ╠═97541230-5515-4b78-b211-2a01a2d9ed83 +# ╠═e3478b55-7100-49c8-809f-4a8bf15071f3 +# β•Ÿβ”€d4324265-e4af-4f00-ab00-d65976d8d583 +# ╠═8e96478a-4dd4-4eab-bda3-e19e60adf332 +# β•Ÿβ”€bd90221c-c590-4d36-bba4-6b0b2e4f2453 +# ╠═1910d57c-853a-4f31-b3e6-0921d775ff8a +# ╠═d900e981-36d8-4a3c-a1bd-5809ee6e7c64 +# ╠═7c362af1-cc1a-47fc-b3a1-252a891849e5 +# ╠═66e2042d-aedc-41cb-91c0-b364e014f7f0 +# ╠═8b5e86e7-0f98-48b5-969d-e48daddf10cb +# ╠═04c69dcc-534a-4c52-a8a3-5a65fb5f0191 +# ╠═0e502851-fa10-4d2c-aaf3-e47ca4bf4bcf +# ╠═42631084-34ec-4482-9e10-84ff85067b93 +# ╠═82751f0f-87fd-4110-9e86-0d0b1ad5cd36 +# ╠═a3e88d8f-72dd-495a-b61b-a969cac7e55a +# ╠═a25c0f95-7c94-449f-a6c2-8acc649d3307 +# ╠═3117a299-06af-47d4-8fb3-3ce394b71050 +# ╠═90c54b0f-0813-4813-8b8c-913a904817dd +# ╠═2b8f9fce-639a-432c-986e-956297743f14 +# β•Ÿβ”€00000000-0000-0000-0000-000000000001 +# β•Ÿβ”€00000000-0000-0000-0000-000000000002 diff --git a/homeworks_old/hw1b.jl b/homeworks_old/hw1b.jl new file mode 100644 index 0000000..41b3de1 --- /dev/null +++ b/homeworks_old/hw1b.jl @@ -0,0 +1,155 @@ +### A Pluto.jl notebook ### +# v0.19.11 + +#> [frontmatter] +#> title = "HW1b - Matrix calculus" +#> date = "2022-09-16" + +using Markdown +using InteractiveUtils + +# ╔═║ f6cdf6d4-35cd-11ed-1c5c-db3e4aec3adb +md""" +Homework 1b of the MIT Course [_Julia: solving real-world problems with computation_](https://github.com/mitmath/JuliaComputation) + +Release date: Friday, Sep 16, 2022 (version 1) + +**Due date: Thursday, Sep 22, 2022 (11:59pm EST)** + +Submission by: Jazzy Doe (jazz@mit.edu) +""" + +# ╔═║ 6cc8e719-fb27-478c-a362-a51e65c152a9 +student = (name = "Jazzy Doe", kerberos_id = "jazz") + +# ╔═║ d411f114-76e5-45b3-b257-8936227c45bc +md""" +# Matrix calculus +""" + +# ╔═║ 14ac9e7e-206e-4472-af05-b3d1ccf0010f +md""" +For each function $f(x)$, work out the linear transformation $f'(x)$ such that $df = f'(x) dx$. +Check your answers numerically using Julia by computing $f(x+e)-f(x)$ for some random $x$ and (small) $e$, and comparing with $f'(x)e$. +We use lowercase $x$ for vectors and uppercase $X$ for matrices. +""" + +# ╔═║ 5aed70bc-d518-4c0a-b650-cd6ff60f2db0 +md""" +!!! warning "Instructions" + Please write the mathematical part of each answer inside a Markdown cell, and the experimental part inside one or several code cells. +""" + +# ╔═║ 12e51959-e16d-424d-a663-e316adb78e0e +md""" +!!! info "Tips" + To write math in a Markdown cell, just surround it with dollars and use basic LaTeX syntax, like this: + + $\sum_{n=1}^{\infty} \frac{1}{n^2} = \frac{\pi^2}{6}$ +""" + +# ╔═║ 245f4f38-9aed-4d7b-b1e1-4294ac6c477f +md""" +## Question 1 + + $f \colon x \in \mathbb{R}^n \longmapsto (x^\top x)^2$. Hint: use the chain rule $df(g)=f'(g)dg$ +""" + +# ╔═║ f07be691-99c3-47ce-b963-c7452338f0fa +md""" +Your answer (with justification) goes here +""" + +# ╔═║ cd1d0fbe-5760-4100-ad49-7b94e368df3d +# Your code goes here + +# ╔═║ a36c286b-d6d6-4f9f-ad86-b4046a77663d +md""" +## Question 2 + + $f \colon x \in \mathbb{R}^n \longmapsto \log.(x)$, meaning the elementwise application of the $\log$ function to each entry of the vector $x$, whose result is another vector of $\mathbb{R}^n$. +""" + +# ╔═║ 86a96dbb-c018-45b2-b6dd-35bd47051f7f +md""" +Your answer (with justification) goes here +""" + +# ╔═║ ed3beb6f-42ac-4787-b4f1-78169e53678b +# Your code goes here + +# ╔═║ 4fcc5b25-0df2-4125-9e5a-9357e56f8e13 +# and here + +# ╔═║ 9be9d847-36ce-4461-aa85-5da3e82cc1ec +# and maybe here too + +# ╔═║ 87c518d1-632d-4b27-9b4d-69bc2300b569 +md""" +## Question 3 + + $f \colon X \in \mathbb{R}^{n \times m} \longmapsto \theta^\top X$, where $\theta \in R^n$ is a vector +""" + +# ╔═║ a2e57067-52c6-4a5c-95fd-ae655418fa48 +md""" +Your answer (with justification) goes here +""" + +# ╔═║ 1ef4387c-59f0-443d-8d8c-26aa8d1c1e0f +# Your code goes here + +# ╔═║ 39d7205b-4de0-4e60-9def-39c3cdc09f52 +md""" +## Question 4 + + $f \colon X \in \mathbb{R}^{n \times n} \longmapsto X^{-2}$, where $X$ is non-singular. Hint: use the chain rule and remember $d(X^{-1}) = -X^{-1} (dX) X^{-1}$ and $d(X^2)=X (dX) + (dX) X.$ +""" + +# ╔═║ fa193ad5-e527-4d48-8c39-e428252c1ccd +md""" +Your answer (with justification) goes here +""" + +# ╔═║ 3e80bec0-b8dc-406e-bc6b-b1a7d1df5f60 +# Your code goes here + +# ╔═║ 00000000-0000-0000-0000-000000000001 +PLUTO_PROJECT_TOML_CONTENTS = """ +[deps] +""" + +# ╔═║ 00000000-0000-0000-0000-000000000002 +PLUTO_MANIFEST_TOML_CONTENTS = """ +# This file is machine-generated - editing it directly is not advised + +julia_version = "1.8.1" +manifest_format = "2.0" +project_hash = "da39a3ee5e6b4b0d3255bfef95601890afd80709" + +[deps] +""" + +# ╔═║ Cell order: +# β•Ÿβ”€f6cdf6d4-35cd-11ed-1c5c-db3e4aec3adb +# ╠═6cc8e719-fb27-478c-a362-a51e65c152a9 +# β•Ÿβ”€d411f114-76e5-45b3-b257-8936227c45bc +# β•Ÿβ”€14ac9e7e-206e-4472-af05-b3d1ccf0010f +# β•Ÿβ”€5aed70bc-d518-4c0a-b650-cd6ff60f2db0 +# ╠═12e51959-e16d-424d-a663-e316adb78e0e +# β•Ÿβ”€245f4f38-9aed-4d7b-b1e1-4294ac6c477f +# ╠═f07be691-99c3-47ce-b963-c7452338f0fa +# ╠═cd1d0fbe-5760-4100-ad49-7b94e368df3d +# β•Ÿβ”€a36c286b-d6d6-4f9f-ad86-b4046a77663d +# ╠═86a96dbb-c018-45b2-b6dd-35bd47051f7f +# ╠═ed3beb6f-42ac-4787-b4f1-78169e53678b +# ╠═4fcc5b25-0df2-4125-9e5a-9357e56f8e13 +# ╠═9be9d847-36ce-4461-aa85-5da3e82cc1ec +# β•Ÿβ”€87c518d1-632d-4b27-9b4d-69bc2300b569 +# ╠═a2e57067-52c6-4a5c-95fd-ae655418fa48 +# ╠═1ef4387c-59f0-443d-8d8c-26aa8d1c1e0f +# β•Ÿβ”€39d7205b-4de0-4e60-9def-39c3cdc09f52 +# ╠═fa193ad5-e527-4d48-8c39-e428252c1ccd +# ╠═3e80bec0-b8dc-406e-bc6b-b1a7d1df5f60 +# β•Ÿβ”€00000000-0000-0000-0000-000000000001 +# β•Ÿβ”€00000000-0000-0000-0000-000000000002 diff --git a/homeworks_old/hw2.jl b/homeworks_old/hw2.jl new file mode 100644 index 0000000..0e9a58a --- /dev/null +++ b/homeworks_old/hw2.jl @@ -0,0 +1,2315 @@ +### A Pluto.jl notebook ### +# v0.19.12 + +#> [frontmatter] +#> title = "HW2 - Automatic differentiation" +#> date = "2022-09-23" + +using Markdown +using InteractiveUtils + +# ╔═║ ddbf8ae6-39b6-11ed-226e-0d38991ed784 +begin + using BenchmarkTools + using ChainRulesCore + using ForwardDiff + using LinearAlgebra + using Plots # may take a long time to load + using PlutoTeachingTools + using PlutoUI + using ProgressLogging + using Zygote # may take a long time to load +end + +# ╔═║ ddbba011-f413-4804-b29b-fdc4efe2b3b3 +md""" +Homework 2 of the MIT Course [_Julia: solving real-world problems with computation_](https://github.com/mitmath/JuliaComputation) + +Release date: Friday, Sep 24, 2022 (version 2) + +**Due date: Friday, Oct 1, 2022 at 11:59pm EST** + +Submission by: Jazzy Doe (jazz@mit.edu) +""" + +# ╔═║ 9a1453a3-bfad-4212-ac19-a4b6c7df5b16 +student = (name = "Jazzy Doe", kerberos_id = "jazz") + +# ╔═║ 9f6254b5-bc06-469c-a0ef-5ee31ac75233 +md""" +The following cell is quite slow, so go grab a coffee while it runs! +Package loading times are one of the main pain points of Julia, and people are actively working to make them shorter. +""" + +# ╔═║ f447c167-2bcb-4bf3-86cd-0f40f4e54c97 +TableOfContents() + +# ╔═║ a405d214-4348-4692-999e-0e890bd91e5d +md""" +# HW2 - Automatic differentiation +""" + +# ╔═║ d19834fc-edd1-433b-8bfc-6022fd7e3239 +md""" +Throughout this homework, whenever a new function (or macro) is introduced, it is a good idea to check out its documentation using Pluto. +Just create a new cell and type in `?` followed by the function name, then the "Live docs" tab will open automatically. +Once the "Live docs" tab is open, clicking on a function name also displays its documentation. + +We also try to include the link to the GitHub repository of every external package we use. +Once you're on the repository, look for a badge like [![docs-stable](https://img.shields.io/badge/docs-stable-blue.svg)](https://youtu.be/dQw4w9WgXcQ) or [![docs-dev](https://img.shields.io/badge/docs-dev-blue.svg)](https://youtu.be/dQw4w9WgXcQ), it will take you to the appropriate documentation page. +""" + +# ╔═║ 7493915c-53b4-4284-bb7f-33cac680f759 +md""" +# 0. Calculus refresher +""" + +# ╔═║ 1cfba628-aa7b-4851-89f1-84b1a45802b3 +md""" +## Scalar functions +""" + +# ╔═║ 3829f016-a7cd-4ce6-b2d4-1c84da8fdb97 +md""" +Let $f : \mathbb{R} \longrightarrow \mathbb{R}$ be a function with scalar input and output. +When we say that $f$ is differentiable at $x \in \mathbb{R}$, we mean that there is a _number_ $f'(x) \in \mathbb{R}$ such that for any perturbation $h \in \mathbb{R}$, + +$$f(x+h) = f(x) + f'(x)h + o(h)$$ + +In other words, $f$ can be approximated with a straight tangent line around $x$. +Furthermore, the error is negligible compared with the distance $\lvert h \rvert$ to $x$, at least for small enough values of $\lvert h \rvert$ (that is what the $o(h)$ means). + +The number $f'(x)$ is called the _derivative_ of $f$ at $x$, and it gives the slope of the tangent. +""" + +# ╔═║ 755ff203-43d8-488f-a075-14a858b0a096 +md""" +To generalize derivatives in higher dimensions, we will need to shift our focus from lines to functions. +Indeed, a straight line with slope $f'(x)$ is nothing but a linear function $h \longmapsto f'(x)h$. +So computing a derivative boils down to the following question: + +_What is the best linear approximation of my function around a given point?_ +""" + +# ╔═║ fd6dd009-2a52-46d1-b1a8-5f094e8c1d98 +md""" +## Vector functions +""" + +# ╔═║ 4d9d2f52-c406-4a7c-8b0e-ba5af7ebc3d8 +md""" +Let $f: \mathcal{A} \longrightarrow \mathcal{B}$ be a function between two normed vector spaces. +When we say that $f$ is differentiable at $x \in \mathcal{A}$, we mean that there is a _linear function_ $f'(x): \mathcal{A} \longrightarrow \mathcal{B}$ such that for any perturbation $h \in \mathcal{A}$, + +$$f(x + h) = f(x) + f'(x)(h) + o(\lVert h \rVert)$$ + +The linear function $f'(x)$ is called the _derivative_ of $f$ at $x$. +""" + +# ╔═║ de4df88a-2a55-4a02-aeaf-f02242b6c52f +md""" +When $\mathcal{A} = \mathbb{R}^n$ and $\mathcal{B} = \mathbb{R}^m$ are both Euclidean spaces, we can always find a matrix $J_f(x) \in \mathbb{R}^{m \times n}$ that satisfies + +$$f'(x)(h) = J_f(x) h$$ + +In the previous equation, the left hand side is the application of the function $f'(x)$ to the vector $h$, while the right hand side is a product between the matrix $J_f(x)$ and the same vector $h$. +The matrix $J_f(x)$ is called the _Jacobian_ of $f$ at $x$. +""" + +# ╔═║ e22cec4a-03d3-4821-945b-9283e16207a8 +md""" +It can be expressed with partial derivatives: if $x = (x_1, ..., x_n)$ and $f(x) = (f_1(x), ..., f_m(x))$, then + +$$J_f(x) = \begin{pmatrix} +\frac{\partial f_1(x)}{\partial x_1} & \frac{\partial f_1(x)}{\partial x_2} & \cdots & \frac{\partial f_1(x)}{\partial x_n} \\ +\frac{\partial f_2(x)}{\partial x_1} & \frac{\partial f_2(x)}{\partial x_2} & \cdots & \frac{\partial f_2(x)}{\partial x_n} \\ +\vdots & \vdots & \ddots & \vdots \\ +\frac{\partial f_m(x)}{\partial x_1} & \frac{\partial f_m(x)}{\partial x_2} & \cdots & \frac{\partial f_m(x)}{\partial x_n} \\ +\end{pmatrix}$$ + +However, it is good practice to learn how to manipulate Jacobians in matrix form, without needing to compute individual coefficients. +""" + +# ╔═║ 19fd4ce6-fc2e-4047-b265-7b54e9bbdad4 +md""" +# 1. Memory & performance +""" + +# ╔═║ 38a6618a-00e9-4565-aaef-4893afcb3181 +md""" +Many people use Julia for high performance scientific computations. +But it takes some knowledge and practice to get to that level. +So buckle up, because your journey to lightning fast code starts... now! + +In this section, we discuss two topics: +- How to measure code performance +- How to improve it with a clever use of memory + +There are other tricks you can learn, mostly related to types and dispatch, but we will get to them later in the class. +""" + +# ╔═║ 9ba8d153-e2c9-4387-a487-fb5a25f5808b +md""" +## Benchmarking +""" + +# ╔═║ 25d27d5a-dcaa-464c-ba44-9aea9ea8be38 +md""" +To start with, let us note that Julia already has a useful built-in macro called `@time`. +When you put it before a function call, it measures the CPU time, memory use and number of allocations required. +""" + +# ╔═║ d0263b55-0f11-4a37-9837-bb4f9e322aa8 +@time rand(1000, 1000); + +# ╔═║ d1079990-5d9a-495c-9dbf-d9ea07c5c8f7 +md""" +But `@time` has a few drawbacks: +- it only runs the function one time, which means estimates are noisy +- it includes compilation time if the function has never been run before +- it can be biased by [global variables](https://docs.julialang.org/en/v1/manual/performance-tips/#Avoid-untyped-global-variables) + +Here are some examples. +""" + +# ╔═║ 751234f4-6957-4273-84e9-9d048c756fa7 +@time cos.(rand(1000, 1000)); + +# ╔═║ 2e4ac856-fe22-426d-b58b-f3adbacdee8a +md""" +The first time you run the previous cell, most of the time will actually be spent compiling the function. +If you run it a second time, the benchmarking result will be completely different. +""" + +# ╔═║ e75e2ea0-bf1a-4519-87a2-efb61736ab44 +let + x = rand(1000, 1000) + sum(abs2, x) # run once to compile + @time sum(abs2, x) +end; + +# ╔═║ 6ebe2c16-400b-40a0-bec6-e52d2858e83a +md""" +In the previous cell, there is no reason for the sum to allocate anything: this is just an artefact due to the global variable `x`. +""" + +# ╔═║ 9aa600b1-9c39-430a-88d4-169c5d84e145 +md""" +For all of these reasons, [`BenchmarkTools.jl`](https://github.com/JuliaCI/BenchmarkTools.jl) is a much better option. +Its `@btime` macro does basically the same job as `@time`, but runs the function several times and circumvents global variables, as long as they are "interpolated" with a `$` sign. +""" + +# ╔═║ 43cfe774-4ed1-4f4f-985a-c261c4d569bf +@btime rand(1000, 1000); + +# ╔═║ 88103471-6f2c-4604-83cc-0d76645776d7 +md""" +This benchmark is pretty comparable to the one given by `@time`. +""" + +# ╔═║ 5d9c5359-d0a9-4a0a-853e-3fd0028f23df +@btime sin.(rand(1000, 1000)); + +# ╔═║ 6bacff8b-ac8c-46b0-adeb-7d8b1aab85f2 +md""" +This benchmark does not include compilation time, because the first run of the function is just one of many. +""" + +# ╔═║ 86399001-e7c4-4733-b476-503650c11e0c +let; x = randn(1000, 1000); @btime sum(abs2, $x); end; + +# ╔═║ 0817247f-f9ae-48cc-9966-dd451c136d43 +md""" +This benchmark shows zero allocation, which is what we actually expect. +""" + +# ╔═║ 1d1d83b0-8669-452c-90ca-26c1396c822a +md""" +!!! danger "Task" + Write a function that compares matrix addition and multiplication based on the time per operation. +""" + +# ╔═║ 2ded206d-e563-4752-a0b1-19402e1e4f52 +hint(md" +Unlike `@btime`, which prints a bunch of information but returns the result of the function, `@belapsed` actually returns the elapsed CPU time. +Don't forget to interpolate the arguments. + +Remember that for a given size $n$, addition requires $n^2$ operations while multiplication requires $2n^3$ operations. +You should divide the output of `@belapsed` by these factors. +") + +# ╔═║ 5b47082b-d080-4243-90a2-5d98b82451d4 +function compare_add_mul(n) + # write your code here +end + +# ╔═║ 89b1f353-523a-4a4c-aee4-9b6e36b944fb +compare_add_mul(10) + +# ╔═║ 4b1a6ce2-b57d-466a-97cd-35036689fe43 +compare_add_mul(100) + +# ╔═║ fe1f4c0e-becb-4058-a069-be213622aa92 +md""" +!!! danger "Task" + Plot the normalized time per operation for matrix addition and multiplication, using sizes $n \in \{3, 10, 30, 100, 300\}$. Comment on what you observe. +""" + +# ╔═║ eb0d58fc-3348-47f9-966c-e7f9f316ddb7 +hint(md" +The loop over $n$ may take a little time, don't be scared. +You can put the `@progress` macro from [`ProgressLogging`](https://github.com/JuliaLogging/ProgressLogging.jl) in front of the `for` keyword if you want to track its progress. + +Use the [`Plots.jl`](https://github.com/JuliaPlots/Plots.jl) package for visualization. +The function `plot` will let you create an empty plot with the properties you need (like `xscale=:log10` or `xlabel=\"size\"`). +The function `scatter!` will allow you to modify it by adding series of dots. +") + +# ╔═║ 11f3c0d4-0609-4446-aa84-4db3d93e93b0 +# write your code here + +# ╔═║ c22a890c-a308-4d1b-be4b-d78f93693a9c +md""" +## Memory management +""" + +# ╔═║ 48511240-20d1-41b6-bc7b-a8ecfc3aa06d +md""" +Since Julia is a high-level language, you don't need to care about memory to write correct code. +New objects are allocated transparently, and once you no longer need them, the Garbage Collector (GC) automatically frees their memory slots. + +However, in many cases, memory management is a performance bottleneck. +If you want to write fast code, you might need to work "in place" (mutating existing arrays), as opposed to "out of place" (creating many temporary arrays). +This is emphasized [several](https://docs.julialang.org/en/v1/manual/performance-tips/#Measure-performance-with-[@time](@ref)-and-pay-attention-to-memory-allocation) [times](https://docs.julialang.org/en/v1/manual/performance-tips/#Pre-allocating-outputs) in the Julia performance tips. +""" + +# ╔═║ ffb8851d-c7e8-47ae-ac9d-96baf0774ca3 +md""" +A common pattern is broadcasted operations, which can look like `x .+ y` (the `.` goes in front for short operators) or `exp.(x)` (the `.` goes behind for functions). +They allow you to work directly with array components, instead of allocating new arrays. +This leads to performance gains, as explained [here](https://docs.julialang.org/en/v1/manual/performance-tips/#More-dots:-Fuse-vectorized-operations). +""" + +# ╔═║ a6eb6028-acca-447a-9e55-e60ecd3c6f84 +md""" +!!! danger "Task" + Try to explain the difference in speed and memory use between the following code snippets. +""" + +# ╔═║ f2bedf2b-2dfe-4392-ba2a-add10882af07 +let + x = rand(100, 100) + y = rand(100, 100) + @btime $x += 2 * $y +end; + +# ╔═║ f504954b-ac63-4843-8891-b1ca0e5ae58b +let + x = rand(100, 100) + y = rand(100, 100) + @btime $x .+= 2 .* $y +end; + +# ╔═║ 1da14b09-5d62-42cc-b9b4-a5a6ddc34181 +hint(md"`x += y` is syntactically equivalent to `x = x + y`.") + +# ╔═║ a9472534-e32b-4323-8dfc-e00b9f31f8e0 +md""" +> Write your answer here +""" + +# ╔═║ ecfe4d79-b1c6-4a6d-a9d7-a563a26e32cd +md""" +Whenever possible, you may also want to use or write mutating versions of critical functions. +By convention, such functions get a `!` suffix to warn about their side effects. +""" + +# ╔═║ 83423082-2d3a-42a1-b1db-ed267399cb31 +md""" +!!! danger "Task" + Write a function that compares mutating and non-mutating matrix multiplication. +""" + +# ╔═║ fb416cfd-f9ee-4d7d-9e83-056e81c422e0 +hint(md" +Take a look at the documentation for the three-argument function `mul!(C, A, B)`, and compare it with `A * B`. +Don't forget to interpolate the arguments +") + +# ╔═║ d0020df6-62a1-4000-b8cf-ceacb8014a0b +# write your code here + +# ╔═║ d8301150-7b08-45b6-a986-d21574eee91b +md""" +# 2. Autodiff works... almost always +""" + +# ╔═║ 1f40437c-0419-4fc0-96ae-a8130efaa36a +md""" +## Differentiable programming +""" + +# ╔═║ 8419603a-3c5c-45a0-9a70-4a74347a7ad7 +md""" +In scientific computing, differentiation plays a central role. +Gradients, Jacobians and Hessians are used everywhere, from optimization algorithms to differential equations or sensitivity analysis. +Unfortunately, the functions involved may be very complicated, sometimes without an explicit formula. + +That is where _differentiable programming_ comes into play: the idea that you can use computer programs to represent complex functions, and then differentiate through these programs with automatic differentiation. +""" + +# ╔═║ 4f9d3c2e-1ec8-4337-b49b-e0dc1d63bc62 +md""" +The Julia ecosystem is very interesting in this regard, because its autodiff packages are compatible with a large fraction of the language itself. +Conversely, major Python autodiff packages like `PyTorch` or `TensorFlow` expect the user to only manipulate custom tensors, which restricts their generality. + +An extensive list of packages is available on the JuliaDiff [web page](https://juliadiff.org/). +Right now, the most widely used are probably: +- [`ForwardDiff.jl`](https://github.com/JuliaDiff/ForwardDiff.jl) for forward mode autodiff +- [`Zygote.jl`](https://github.com/FluxML/Zygote.jl) for reverse mode autodiff + +Here is an example showing how to use them for Jacobian computation. +""" + +# ╔═║ 7476a638-5eca-47cc-9a01-41f30b9dbf9d +function powersum(x; p=5) + return sum(x .^ i for i in 0:p) +end + +# ╔═║ d0d580d4-8e92-4d46-8177-67f52fbb3934 +powersum(1:3) + +# ╔═║ c5784ec1-17cf-4897-8cd3-ff81998b9d9c +let + x = rand(3) + J1 = ForwardDiff.jacobian(powersum, x) + J2 = Zygote.jacobian(powersum, x)[1] + J1, J2 +end + +# ╔═║ 387d145f-e77c-4e13-89b7-fc8733215694 +md""" +## The limitations of autodiff packages +""" + +# ╔═║ 3790f106-9895-4425-a16f-5c5e0857e99e +md""" +Alas, every autodiff package comes with its own limitations. +Here are the main ones you should be aware of: +- `ForwardDiff.jl` requires functions that work with generic number types, not just `Float64` for example. The reason is that forward mode relies on numbers of type `Dual` (which store both a quantity and its derivative) +- `Zygote.jl` requires functions that avoid mutating arrays. The reason is that array mutation gives rise to several nodes in the computational graph for a single variable in the code, which is complicated to handle from an implementation perspective. +""" + +# ╔═║ 945a16d3-805c-40c9-9166-5120743bd3d7 +md""" +!!! danger "Task" + Write a function that does the same computation as `powersum`, but for which `ForwardDiff.jl` will throw an error. +""" + +# ╔═║ 728c8956-9911-47d5-a021-df224e3f5b90 +hint(md" +Modify the type annotation of `x` to avoid accepting generic numbers. +") + +# ╔═║ 3716d3cc-8706-41bf-873d-193543cb0514 +function powersum_breakforwarddiff(x; p=5) + # write your code here +end + +# ╔═║ 87c72b22-8c81-4062-8a9c-40902f83a623 +powersum(1:3), powersum_breakforwarddiff(1:3) + +# ╔═║ 1362cd95-6a87-44e3-980d-014496afce85 +let + x = rand(3) + # this should throw "No method matching powersum_breakforwarddiff(Vector{Dual})" + ForwardDiff.jacobian(powersum_breakforwarddiff, x) +end + +# ╔═║ 46075912-60b7-46d2-88c9-a13a8b015e0b +md""" +!!! danger "Task" + Write a function that does the same computation as `powersum`, but for which `Zygote.jl` will throw an error. +""" + +# ╔═║ f8ba8857-ece1-4cec-b7f2-2a8bc8bfb1d9 +hint(md" +Set up an answer vector `y` initialized to `ones(eltype(x), length(x))`, and write a loop that updates it with successive powers of `x`. +") + +# ╔═║ cf13543a-9dd4-40ef-9523-5953e9db2c78 +function powersum_breakzygote(x; p=5) + # write your code here +end + +# ╔═║ 0736648c-a181-4352-8b4e-bacf745fda64 +powersum(1:3), powersum_breakzygote(1:3) + +# ╔═║ 95dd7822-ef43-4629-bb42-ddb15bd1f965 +let + x = rand(3) + # this should throw "Mutating arrays is not supported..." + Zygote.jacobian(powersum_breakzygote, x)[1] +end + +# ╔═║ 786b7ea2-7827-4cab-abbb-786abe935cc3 +md""" +Usually, it is quite easy to write type-generic code that works with `ForwardDiff.jl`. +On the other hand, sometimes mutation is inevitable for performance reasons, which means `Zygote.jl` will be mad at us. +So how do we get the best of both worlds, _performance AND differentiability_? +The answer is: by teaching `Zygote.jl` a custom differentiation rule. +""" + +# ╔═║ 4440f39c-51e5-4ffd-8031-96d4a760270c +md""" +## The role of custom differentiation rules +""" + +# ╔═║ bfb3280e-638f-4e8f-8e37-d5f8fd75541d +md""" +Autodiff packages have two main ingredients: + +- a set of differentiation rules for built-in functions (`+`, `-`, `*`, `/`, `exp`, ...) +- a way to compose these basic functions and their derivatives (using the chain rule) +""" + +# ╔═║ 7f6e72fd-aacc-47a8-a496-25794c60343c +md""" +The [`ChainRules.jl`](https://github.com/JuliaDiff/ChainRules.jl) package is an attempt to provide unified differentiation rules for Julia's whole autodiff ecosystem. +It contains rules for most of the functions in the Julia standard library, but also allows users to define custom rules. + +Since `Zygote.jl` cannot handle mutation out of the box, we must define a custom reverse rule for any function involving mutation. +This will allow `Zygote.jl` to differentiate it "blindly", without looking inside. +""" + +# ╔═║ 55160454-2738-4911-be15-29f484f610db +md""" +Without further ado, we show the definition of a custom reverse rule for the following function. +It probably similar to the one that you used to break `Zygote.jl` earlier, so of course it will behave in the same way until we give it a differentiation rule. +""" + +# ╔═║ e90098ec-a9c3-4204-95f7-88adeb74ee50 +function powersum_okayzygote(x; p=5) + y = zeros(eltype(x), length(x)) + for i in 0:p + y .+= x .^ i + end + return y +end + +# ╔═║ 7b92051d-4015-4e22-b6b9-41462e2cc54f +powersum(1:3), powersum_okayzygote(1:3) + +# ╔═║ 4eef090f-29b1-44e1-929a-98162719ae93 +md""" +If we want to teach a derivative to `Zygote.jl`, we have to know how to compute it. +""" + +# ╔═║ 32f6a219-f69b-4085-ba4b-5c7dc3ca2155 +function powersum_okayzygote_jacobian(x; p=5) + J = zeros(eltype(x), length(x), length(x)) + for i in 1:p + J .+= Diagonal(i .* (x .^ (i-1))) + end + return J +end + +# ╔═║ ffffadbb-5fcd-443d-97fb-b6d372029814 +md""" +Custom reverse rules are created by writing a new method for the `ChainRulesCore.rrule` function. +For technical reasons, the reverse rule does not work with the Jacobian directly, but instead computes _vector-Jacobian products_ (VJPs) of the form $v^\top J_f(x)$ (see section 4). +""" + +# ╔═║ 19198826-15a0-432d-abe2-ae5ead6869f5 +function ChainRulesCore.rrule(fun::typeof(powersum_okayzygote), x; p=5) + y = powersum_okayzygote(x; p=p) + J = powersum_okayzygote_jacobian(x; p=p) + function vector_jacobian_product(v) + return (NoTangent(), J' * v) + end + return y, vector_jacobian_product +end + +# ╔═║ 0d762ed4-dfb9-433f-8ded-1ae653ad87c2 +begin + rrule_syntax = md""" + The arguments given to `rrule` are all the arguments of the function we want to differentiate (in this case `powersum_okayzygote`), plus an additional first argument `fun` which is a function. + We define our method to only accept the type of `powersum_okayzygote` itself, so that autodiff packages can recognize it and dispatch on the appropriate rule for each function. + So we actually do not need `fun` in the body of the `rrule`, and we could also have used an empty argument: + ``` + function ChainRulesCore.rrule(::typeof(powersum_okayzygote), x; p=5) + ... + end + ``` + + The output of `rrule` is a couple that contains 1) the return value of the function `powersum_okayzygote` and 2) a nested function called `vector_jacobian_product`, which is used during reverse mode autodiff. + + This nested function computes a VJP for each positional argument of `rrule`, in this case `fun` and `x`. + By convention, we do not compute VJPs for keyword arguments, since one does not usually differentiate with respect to those. + Most of the time, the VJP with respect to `fun` is `NoTangent()`, since the function `fun` rarely has internal parameters. + On the other hand, the VJP with respect to `x` is the interesting part. + It is given as `J' * v` instead of `v' * J` because we want a column vector instead of a row vector. + We precompute the Jacobian matrix `J` outside of the `vector_jacobian_product` because it can be reused with several vectors `v`. + """ + Foldable("Unfold to understand the syntax of the reverse rule", rrule_syntax) +end + +# ╔═║ ef28a71e-74f4-40dd-a72d-1a51628fd01b +md""" +Thanks to this new rule, `Zygote.jl` is now able to differentiate through our mutating power sum. +""" + +# ╔═║ f9ca3e33-243c-45c8-b646-587aa7d2d902 +md""" +By now, you may have a question on your mind. +What is the point of autodiff if I need to work out derivatives by hand anyway? +Indeed, when `Zygote.jl` is unable to handle your function, you may need to provide derivatives manually. + +But then, you can insert your function within a larger computational graph (like a neural network), and the rest of the derivatives will be computed without your help. +In other words, your efforts are only required for a few performance-critical functions, and the rest is taken care of automatically. +""" + +# ╔═║ c7a0dbbe-89e6-4759-a57f-b367fbeba62e +md""" +Let us see what that looks like by composing several functions. +""" + +# ╔═║ 9a8f7f42-2677-43ff-a280-3b75df6258e1 +function big_composition(x) + y = vcat(x, -x) + z = powersum_okayzygote(x) + return sum(abs, z) +end + +# ╔═║ 7b3551c2-22f7-47dd-82dc-b817d7e0f1fb +md""" +Isn't that wonderful? +""" + +# ╔═║ f6330892-3379-4e0d-a007-c451a465bd06 +md""" +# 3. Application to linear regression +""" + +# ╔═║ 6d848043-e5bc-4beb-a18a-004d4cac5c23 +md""" +Linear regression is perhaps the most basic form of machine learning. +Given a matrix of features $M \in \mathbb{R}^{m \times n}$ and a vector of targets $y \in \mathbb{R}^m$, we approximate $y$ by $M x$, where $x \in \mathbb{R}^n$ is a vector of parameters (feature weights). +""" + +# ╔═║ fc84dce4-779c-4377-af2a-cda7e453f382 +md""" +## Computing the squared errors +""" + +# ╔═║ d76d5ddc-fe59-47f4-8b56-6f704b486ebc +md""" + +One way to measure the quality of the approximation for a given $x$ is to compute the squared error on all components of $y$. +Let us denote by $\odot$ the componentwise product between vectors (which is the same as `.*` in Julia). +We define the function + +$$f: x \in \mathbb{R}^n \longmapsto (Mx - y) \odot (Mx - y) = \begin{pmatrix} (Mx - y)_1^2 \\ \vdots \\ (Mx - y)_m^2 \end{pmatrix} \in \mathbb{R}^m$$ +""" + +# ╔═║ 9ef1e014-5a7d-4b17-98de-0cf51d788bfa +md""" +!!! danger "Task" + Implement the function $f$ in a way that does not mutate arrays. +""" + +# ╔═║ f8cd5dce-6a4c-4c6c-b2d5-7ec56132e95e +function f(x; M, y) + # write your code here +end + +# ╔═║ c7ee9795-2c7a-480a-9269-440a9227c591 +let + n, m = 3, 5 + M = rand(m, n) + y = rand(m) + x = rand(n) + f(x; M=M, y=y) +end + +# ╔═║ 28f31ef9-27ea-4e94-8f03-89b0f6cfa0d1 +md""" +!!! danger "Task" + Implement the function $f$ in the most efficient way you can, by pre-allocating and mutating the output vector `e`. + Compare the performance of both implementations. +""" + +# ╔═║ 1676ec54-bd96-4892-aa08-3ae831b537bb +hint(md"Modify `e` step-by-step: start with $Mx$, then $Mx-y$, and finally $(Mx-y) \odot (Mx-y)$.") + +# ╔═║ ea16d4c6-d6e4-46fa-a721-fa5a0f2ff021 +function f!(e, x; M, y) + # write your code here +end + +# ╔═║ bd37c58d-8544-40b1-a0b5-ea03ec5692a8 +let + n, m = 3, 5 + M = rand(m, n) + y = rand(m) + x = rand(n) + e = rand(m) + f(x; M=M, y=y), f!(e, x; M=M, y=y) +end + +# ╔═║ 5bbd690b-6a98-4dbf-a8c4-581ac77a4da5 +let + n, m = 3, 5 + M = rand(m, n) + y = rand(m) + x = rand(n) + e = rand(m) + @btime f($x; M=$M, y=$y) + @btime f!($e, $x; M=$M, y=$y) +end; + +# ╔═║ cc224a30-81bf-4a2c-b636-40ff5c941bb6 +md""" +## Differentiating the squared errors +""" + +# ╔═║ 3d20c24c-469b-4f0d-9936-705e42033ded +md""" +If we want to find the best possible $x$, we can do it by minimizing the sum of the components of $f(x)$ (_e.g._ with gradient descent). +We may also wish to use the function $f$ within a neural network. +In both cases, it is essential to differentiate $f$ with respect to its input $x$ (assuming $M$ and $y$ are fixed). +""" + +# ╔═║ bf6c5fc8-8283-46d4-aa67-416d53f7d315 +md""" +!!! danger "Task" + Try to compute the Jacobian of `f` and `f!` with `Zygote.jl`. +""" + +# ╔═║ d00bf3fd-9bd8-4b11-b755-a85f0f8644cb +let + n, m = 3, 5 + M = rand(m, n) + y = rand(m) + x = rand(n) + Zygote.jacobian(x -> f(x; M=M, y=y), x)[1] +end + +# ╔═║ a80b3a0f-53d1-473e-9bea-2494a85ac511 +let + n, m = 3, 5 + M = rand(m, n) + y = rand(m) + x = rand(n) + e = rand(m) + # this should throw "Mutating arrays is not supported..." + Zygote.jacobian(x -> f!(e, x; M=M, y=y), x)[1] +end + +# ╔═║ ab398337-adb5-48fa-ae1b-4c9499438097 +md""" +Once you are done with this section, you will be able to do this without encountering an error. Yay! +""" + +# ╔═║ ae7b2114-de91-4f1b-8765-af5e02cc1b63 +md""" +!!! danger "Task" + Work out the derivative of the function $f$ at a point $x$. +""" + +# ╔═║ e4aedbd4-a609-4eaf-812b-d2f3d6f4df3d +hint(md" +Write $f(x+h)$ as a componentwise product, and then expand it as you would do with a regular product. +You are allowed to do that since the componentwise product is bilinear. +Then identify three parts in the resulting expression: $f(x)$, a linear function of $h$, and a term that is of order $\lVert h \rVert^2$ (in other words, negligible). +") + +# ╔═║ b8974b20-d8dc-4109-a64e-585c7afdb484 +md""" +> Write your answer here +""" + +# ╔═║ bd10d753-eea6-4798-939c-8e5551d40c5c +md""" +!!! danger "Task" + Deduce the Jacobian matrix of the function $f$ at a point $x$. Check that its size is coherent. +""" + +# ╔═║ 2f95afd6-1418-44bb-9868-970dbe888500 +hint(md" +A componentwise product between two vectors $a \odot b$ can also be interpreted as the multiplication by a diagonal matrix $D(a) b$. +Using this with $a = 2(Mx - y)$ and $b = Mh$ should help you recognize the Jacobian matrix. +For checking, remember that $M$ has size $m \times n$. +") + +# ╔═║ 06e91432-935f-4d7c-899f-d7968a10a78e +md""" +> Write your answer here +""" + +# ╔═║ c7efc656-ae9b-4eef-b0cd-3afe3852d396 +md""" +!!! danger "Task" + Implement a function computing the Jacobian matrix $J_f(x)$ at a point $x$. + Check your result using finite differences. +""" + +# ╔═║ ca4b41dd-353e-498d-a461-648c582cb999 +hint(md"You may want to use the `Diagonal` constructor from [`LinearAlgebra`](https://docs.julialang.org/en/v1/stdlib/LinearAlgebra/).") + +# ╔═║ c5fc8f3a-ed90-41ec-b4b9-1172a41e3adc +function Jf(x; M, y) + # write your code here +end + +# ╔═║ 40e13883-dd9a-43b9-9ef7-1069ef036846 +let + n, m = 3, 5 + M = rand(m, n) + y = rand(m) + x = rand(n) + h = 0.001 .* rand(n) + diff1 = f(x + h; M=M, y=y) .- f(x; M=M, y=y) + diff2 = Jf(x; M=M, y=y) * h + diff1, diff2 +end + +# ╔═║ 7c7bdbd9-edd5-4142-a765-4c498761f7e7 +md""" +## Custom rule, from slow to fast +""" + +# ╔═║ 8569cd7b-890f-4b04-a6d5-c92a70a226ab +md""" +!!! danger "Task" + Define a custom reverse rule for `f2!` (because of a Pluto bug we couldn't use `f!` directly). Check that `Zygote.jl` is now able to compute its Jacobian. +""" + +# ╔═║ cf250e37-ed37-47cd-b689-8e2596f9fdc5 +f2!(e, x; M, y) = f!(e, x; M, y) + +# ╔═║ 8f46db4a-cc94-4497-aad8-0fc4b0cfa1e3 +hint(md"Beware: you will need to give a VJP with respect to `rrule` arguments `fun`, `e` and `x`. Use `NoTangent()` for `fun` and `ZeroTangent()` for `e`.") + +# ╔═║ dccf9f6d-82a6-423c-bbe5-22c5a8c2f5e4 +function ChainRulesCore.rrule(::typeof(f2!), e, x; M, y) + # write some code here + function vector_jacobian_product(v) + # and some code there + end + return e, vector_jacobian_product +end + +# ╔═║ ffd6df27-c0e5-44be-aee9-2c7a9d4fb5c0 +let + x = rand(3) + ChainRulesCore.rrule(powersum_okayzygote, x) # trick Pluto's dependency handler + J = powersum_okayzygote_jacobian(x) + J_zygote = Zygote.jacobian(powersum_okayzygote, x)[1] + J, J_zygote +end + +# ╔═║ 0cee5c93-266c-4be3-9997-20728cf11921 +let + x = rand(3) + ChainRulesCore.rrule(powersum_okayzygote, x) # trick Pluto's dependency handler + Zygote.gradient(big_composition, x)[1] +end + +# ╔═║ bbe25d4e-952b-4ed5-b20e-24b3dcd30495 +md""" +!!! danger "Task" + Uncomment and run the following cell once the `rrule` above is complete. +""" + +# ╔═║ 77eac64f-eac5-4d12-8acf-5b5070e60858 +# let +# n, m = 3, 5 +# M = rand(m, n) +# y = rand(m) +# x = rand(n) +# e = rand(m) +# ChainRulesCore.rrule(f2!, e, x; M=M, y=y) # trick Pluto's dependency handler +# J1 = Zygote.jacobian(x -> f(x; M=M, y=y), x)[1] +# J2 = Zygote.jacobian(x -> f2!(e, x; M=M, y=y), x)[1] +# J1, J2 +# end + +# ╔═║ aa4194d6-2f8c-4367-850e-22ebcf1b72e4 +md""" +Although we managed to get reverse mode autodiff working, the end result is still not very satisfactory. +On the one hand, the function `f2!` is fast and requires zero allocation. +On the other hand, the custom reverse rule still involves computing and storing a full Jacobian matrix, which is pretty expensive. +Luckily, we can do better. +""" + +# ╔═║ f66a0ea7-70fd-4340-8b02-6fbaab847dfc +md""" +!!! danger "Task" + Explain why a VJP can be computed for the function $f$ without ever storing the full Jacobian. +""" + +# ╔═║ 8cca11ed-a61c-4cc8-af4b-350137073756 +hint(md"Try to think in terms of computer program instead of mathematics. Describe the sequence of intermediate operations that you would perform for each of these computations.") + +# ╔═║ 7144c6c8-79dd-437d-a201-bac143f6a261 +md""" +> Write your answer here +""" + +# ╔═║ 45765f4a-536d-4e9d-be9d-144b7ccd4dcf +md""" +!!! danger "Task" + Implement a VJP function for $f$, following the efficient method you just suggested. +""" + +# ╔═║ df89f509-cfd7-46b3-9dd1-cdcfcea68053 +hint(md" +Now you should revert to `.*` for componentwise products instead of using diagonal matrices. +Remember that you must return a column vector, so technically $J_f(x)^\top v$ instead of $v^\top J_f(x)$. +") + +# ╔═║ 0b51e23e-a015-4e86-ba48-6475a9ee9779 +function f_vjp(v, x; M, y) + # write your code here +end + +# ╔═║ 14dcad57-23ae-4905-aac4-d29066f2a085 +md""" +!!! danger "Task" + Check the correctness of your VJP function against the naive version provided below. +""" + +# ╔═║ 06a59777-b6ec-4808-9105-7a2542a629ea +function f_vjp_naive(v, x; M, y) + J = Jf(x; M=M, y=y) + return v' * J +end + +# ╔═║ 9222d644-5d20-474a-83db-4b2e3bed45e2 +# write your code here + +# ╔═║ c511e1c4-0306-46c7-800f-8257266c0091 +md""" +!!! danger "Task" + Compare the performance of both VJP implementations. +""" + +# ╔═║ c79e7017-4acc-4562-817a-50245ce654dc +# write your code here + +# ╔═║ ac115404-0115-4c94-9b51-9a8674ac4b05 +md""" +Now, if you wanted to, you could implement an `rrule` for `f2!` that uses `f_vjp`, and observe that Jacobian computations are accelerated. +And as it turns out, you could even go one step further. +""" + +# ╔═║ dd01d4b4-b05a-43a3-9b76-65e13076535f +md""" +!!! danger "Task" + Explain how yet another speed up can be achieved within the `rrule` by mutualizing computations between $f$ and its VJP. +""" + +# ╔═║ 766e1909-5063-4ce2-821d-1f93be4db789 +hint(md"Try to identify a quantity that appears in both. Do we really need to compute it twice?") + +# ╔═║ 2b83cccd-bdaf-4481-a7f5-391434220bd5 +md""" +> Write your answer here +""" + +# ╔═║ 69a9ec45-d2ff-4362-9c3c-5c004e46ceb3 +md""" +# 4. Going further +""" + +# ╔═║ cc167cfd-b776-4280-a308-d5908ceaec4b +md""" +## Why VJPs? +""" + +# ╔═║ 8923a5ad-ddba-4ae2-886e-84526a3521ba +md""" +In concrete applications, the dimensions $n$ and $m$ often make it impossible to store a full Jacobian (of size $m \times n$) in memory. +As a result, autodiff systems only manipulate Jacobians "lazily" by computing their products with vectors. + +In machine learning, we are mostly interested in loss functions with many inputs ($n \gg 1$) and a single scalar output ($m = 1$). +This means the Jacobian matrix only has one row, and it can be seen as the transpose of the gradient: $J_f(x) = \nabla f(x)^\top$. +Thus we only need one VJP (with $v = 1$) to retrieve the gradient. +""" + +# ╔═║ e1b9f114-58e7-4546-a3c0-5e07fb1665e7 +md""" +!!! danger "Task" + How many VJPs would it take to compute the full Jacobian for a function $f : \mathbb{R}^n \longrightarrow \mathbb{R}^m$, and which vectors $v$ should you choose? +""" + +# ╔═║ ba07ccda-ae66-4fce-837e-00b2b039b404 +md""" +> Write your answer here +""" + +# ╔═║ d0ae8c14-b341-4220-8a1c-79fed9758f64 +md""" +## Why reverse mode? +""" + +# ╔═║ f843b77d-8160-4d87-8641-eeb04549af8f +md""" +Let us now consider a composite function $f = f_3 \circ f_2 \circ f_1$ with $3$ layers. +The _chain rule_ yields the following derivative: + +$$f'(x) = f_3'((f_2 \circ f_1)(x)) \circ f_2'(f_1(x)) \circ f_1'(x)$$ + +In the Euclidean case, we can re-interpret this function composition as a matrix product: + +$$\underbrace{J_f(x)}_J = \underbrace{J_{f_3}((f^2 \circ f^1) (x))}_{J_3} ~ \underbrace{J_{f_2}(f^1(x))}_{J_2} ~ \underbrace{J_{f_1}(x)}_{J_1}$$ +""" + +# ╔═║ 9b34a8f9-6afa-4712-bde8-a94f4d5e7a33 +md""" +But again, storing and multiplying full Jacobian matrices is expensive in high dimension. +Assuming we know how to manipulate the $J_k$ lazily, can we do the same for $J$? +In other words, can we deduce a VJP for $f$ based on a VJP for the $f_k$? + +The answer is yes, but only if we do it in the right direction. +Indeed, we can accumulate the product from last to first layer: + +$$v^\top J = v^\top J^3 J^2 J^1 \quad \implies \quad \begin{cases} v^3 = v^\top J^3 \\ v^2 = (v^3)^\top J^2 \\ v^1 = (v^2)^\top J^1 \end{cases}$$ + +This is why reverse mode autodiff uses VJPs, as shown in the `ChainRulesCore.rrule` syntax. +They allow efficient propagation of derivative information from the last layer to the first, which is particularly appropriate to compute gradients of high-dimensional loss functions. + +Congrats, you now know how neural networks are trained! +""" + +# ╔═║ 00000000-0000-0000-0000-000000000001 +PLUTO_PROJECT_TOML_CONTENTS = """ +[deps] +BenchmarkTools = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf" +ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" +ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" +LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" +Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" +PlutoTeachingTools = "661c6b06-c737-4d37-b85c-46df65de6f69" +PlutoUI = "7f904dfe-b85e-4ff6-b463-dae2292396a8" +ProgressLogging = "33c8b6b6-d38a-422a-b730-caa89a2f386c" +Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f" + +[compat] +BenchmarkTools = "~1.3.1" +ChainRulesCore = "~1.15.5" +ForwardDiff = "~0.10.32" +Plots = "~1.33.0" +PlutoTeachingTools = "~0.2.3" +PlutoUI = "~0.7.40" +ProgressLogging = "~0.1.4" +Zygote = "~0.6.48" +""" + +# ╔═║ 00000000-0000-0000-0000-000000000002 +PLUTO_MANIFEST_TOML_CONTENTS = """ +# This file is machine-generated - editing it directly is not advised + +julia_version = "1.8.2" +manifest_format = "2.0" +project_hash = "0358675a58c2ec698bf356c09ed6e927f5069cd9" + +[[deps.AbstractFFTs]] +deps = ["ChainRulesCore", "LinearAlgebra"] +git-tree-sha1 = "69f7020bd72f069c219b5e8c236c1fa90d2cb409" +uuid = "621f4979-c628-5d54-868e-fcf4e3e8185c" +version = "1.2.1" + +[[deps.AbstractPlutoDingetjes]] +deps = ["Pkg"] +git-tree-sha1 = "8eaf9f1b4921132a4cff3f36a1d9ba923b14a481" +uuid = "6e696c72-6542-2067-7265-42206c756150" +version = "1.1.4" + +[[deps.Adapt]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "195c5505521008abea5aee4f96930717958eac6f" +uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" +version = "3.4.0" + +[[deps.ArgTools]] +uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" +version = "1.1.1" + +[[deps.Artifacts]] +uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" + +[[deps.Base64]] +uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" + +[[deps.BenchmarkTools]] +deps = ["JSON", "Logging", "Printf", "Profile", "Statistics", "UUIDs"] +git-tree-sha1 = "4c10eee4af024676200bc7752e536f858c6b8f93" +uuid = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf" +version = "1.3.1" + +[[deps.BitFlags]] +git-tree-sha1 = "84259bb6172806304b9101094a7cc4bc6f56dbc6" +uuid = "d1d4a3ce-64b1-5f1a-9ba4-7e7e69966f35" +version = "0.1.5" + +[[deps.Bzip2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "19a35467a82e236ff51bc17a3a44b69ef35185a2" +uuid = "6e34b625-4abd-537c-b88f-471c36dfa7a0" +version = "1.0.8+0" + +[[deps.CEnum]] +git-tree-sha1 = "eb4cb44a499229b3b8426dcfb5dd85333951ff90" +uuid = "fa961155-64e5-5f13-b03f-caf6b980ea82" +version = "0.4.2" + +[[deps.Cairo_jll]] +deps = ["Artifacts", "Bzip2_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.ChainRules]] +deps = ["Adapt", "ChainRulesCore", "Compat", "Distributed", "GPUArraysCore", "IrrationalConstants", "LinearAlgebra", "Random", "RealDot", "SparseArrays", "Statistics", "StructArrays"] +git-tree-sha1 = "a5fd229d3569a6600ae47abe8cd48cbeb972e173" +uuid = "082447d4-558c-5d27-93f4-14fc19e9eca2" +version = "1.44.6" + +[[deps.ChainRulesCore]] +deps = ["Compat", "LinearAlgebra", "SparseArrays"] +git-tree-sha1 = "dc4405cee4b2fe9e1108caec2d760b7ea758eca2" +uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" +version = "1.15.5" + +[[deps.ChangesOfVariables]] +deps = ["ChainRulesCore", "LinearAlgebra", "Test"] +git-tree-sha1 = "38f7a08f19d8810338d4f5085211c7dfa5d5bdd8" +uuid = "9e997f8a-9a97-42d5-a9f1-ce6bfc15e2c0" +version = "0.1.4" + +[[deps.CodeTracking]] +deps = ["InteractiveUtils", "UUIDs"] +git-tree-sha1 = "1833bda4a027f4b2a1c984baddcf755d77266818" +uuid = "da1fd8a2-8d9e-5ec2-8556-3022fb5608a2" +version = "1.1.0" + +[[deps.CodecZlib]] +deps = ["TranscodingStreams", "Zlib_jll"] +git-tree-sha1 = "ded953804d019afa9a3f98981d99b33e3db7b6da" +uuid = "944b1d66-785c-5afd-91f1-9de20f533193" +version = "0.7.0" + +[[deps.ColorSchemes]] +deps = ["ColorTypes", "ColorVectorSpace", "Colors", "FixedPointNumbers", "Random"] +git-tree-sha1 = "1fd869cc3875b57347f7027521f561cf46d1fcd8" +uuid = "35d6a980-a343-548e-a6ea-1d62b119f2f4" +version = "3.19.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", "SpecialFunctions", "Statistics", "TensorCore"] +git-tree-sha1 = "d08c20eef1f2cbc6e60fd3612ac4340b89fea322" +uuid = "c3611d14-8923-5661-9e6a-0046d554d3a4" +version = "0.9.9" + +[[deps.Colors]] +deps = ["ColorTypes", "FixedPointNumbers", "Reexport"] +git-tree-sha1 = "417b0ed7b8b838aa6ca0a87aadf1bb9eb111ce40" +uuid = "5ae59095-9a9b-59fe-a467-6f913c188581" +version = "0.12.8" + +[[deps.CommonSubexpressions]] +deps = ["MacroTools", "Test"] +git-tree-sha1 = "7b8a93dba8af7e3b42fecabf646260105ac373f7" +uuid = "bbf7d656-a473-5ed7-a52c-81e309532950" +version = "0.3.0" + +[[deps.Compat]] +deps = ["Dates", "LinearAlgebra", "UUIDs"] +git-tree-sha1 = "5856d3031cdb1f3b2b6340dfdc66b6d9a149a374" +uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" +version = "4.2.0" + +[[deps.CompilerSupportLibraries_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" +version = "0.5.2+0" + +[[deps.Contour]] +git-tree-sha1 = "d05d9e7b7aedff4e5b51a029dced05cfb6125781" +uuid = "d38c429a-6771-53c6-b99e-75d170b6e991" +version = "0.6.2" + +[[deps.DataAPI]] +git-tree-sha1 = "1106fa7e1256b402a86a8e7b15c00c85036fef49" +uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a" +version = "1.11.0" + +[[deps.DataStructures]] +deps = ["Compat", "InteractiveUtils", "OrderedCollections"] +git-tree-sha1 = "d1fff3a548102f48987a52a2e0d114fa97d730f0" +uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" +version = "0.18.13" + +[[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.DelimitedFiles]] +deps = ["Mmap"] +uuid = "8bb1440f-4735-579b-a4ab-409b98df4dab" + +[[deps.DiffResults]] +deps = ["StaticArrays"] +git-tree-sha1 = "c18e98cba888c6c25d1c3b048e4b3380ca956805" +uuid = "163ba53b-c6d8-5494-b064-1a9d43ac40c5" +version = "1.0.3" + +[[deps.DiffRules]] +deps = ["IrrationalConstants", "LogExpFunctions", "NaNMath", "Random", "SpecialFunctions"] +git-tree-sha1 = "992a23afdb109d0d2f8802a30cf5ae4b1fe7ea68" +uuid = "b552c78f-8df3-52c6-915a-8e097449b14b" +version = "1.11.1" + +[[deps.Distributed]] +deps = ["Random", "Serialization", "Sockets"] +uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" + +[[deps.DocStringExtensions]] +deps = ["LibGit2"] +git-tree-sha1 = "5158c2b41018c5f7eb1470d558127ac274eca0c9" +uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" +version = "0.9.1" + +[[deps.Downloads]] +deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] +uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" +version = "1.6.0" + +[[deps.Expat_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "bad72f730e9e91c08d9427d5e8db95478a3c323d" +uuid = "2e619515-83b5-522b-bb60-26c02a35a201" +version = "2.4.8+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", "Pkg", "Zlib_jll", "libaom_jll", "libass_jll", "libfdk_aac_jll", "libvorbis_jll", "x264_jll", "x265_jll"] +git-tree-sha1 = "74faea50c1d007c85837327f6775bea60b5492dd" +uuid = "b22a6f82-2f65-5046-a5b2-351ab43fb4e5" +version = "4.4.2+2" + +[[deps.FileWatching]] +uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" + +[[deps.FillArrays]] +deps = ["LinearAlgebra", "Random", "SparseArrays", "Statistics"] +git-tree-sha1 = "87519eb762f85534445f5cda35be12e32759ee14" +uuid = "1a297f60-69ca-5386-bcde-b61e274b549b" +version = "0.13.4" + +[[deps.FixedPointNumbers]] +deps = ["Statistics"] +git-tree-sha1 = "335bfdceacc84c5cdf16aadc768aa5ddfc5383cc" +uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" +version = "0.8.4" + +[[deps.Fontconfig_jll]] +deps = ["Artifacts", "Bzip2_jll", "Expat_jll", "FreeType2_jll", "JLLWrappers", "Libdl", "Libuuid_jll", "Pkg", "Zlib_jll"] +git-tree-sha1 = "21efd19106a55620a188615da6d3d06cd7f6ee03" +uuid = "a3f928ae-7b40-5064-980b-68af3947d34b" +version = "2.13.93+0" + +[[deps.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", "StaticArrays"] +git-tree-sha1 = "187198a4ed8ccd7b5d99c41b69c679269ea2b2d4" +uuid = "f6369f11-7733-5829-9624-2563aa707210" +version = "0.10.32" + +[[deps.FreeType2_jll]] +deps = ["Artifacts", "Bzip2_jll", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] +git-tree-sha1 = "87eb71354d8ec1a96d4a7636bd57a7347dde3ef9" +uuid = "d7e528f0-a631-5988-bf34-fe36492bcfd7" +version = "2.10.4+0" + +[[deps.FriBidi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "aa31987c2ba8704e23c6c8ba8a4f769d5d7e4f91" +uuid = "559328eb-81f9-559d-9380-de523a88c83c" +version = "1.0.10+0" + +[[deps.GLFW_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libglvnd_jll", "Pkg", "Xorg_libXcursor_jll", "Xorg_libXi_jll", "Xorg_libXinerama_jll", "Xorg_libXrandr_jll"] +git-tree-sha1 = "d972031d28c8c8d9d7b41a536ad7bb0c2579caca" +uuid = "0656b61e-2033-5cc2-a64a-77c0f6c09b89" +version = "3.3.8+0" + +[[deps.GPUArrays]] +deps = ["Adapt", "GPUArraysCore", "LLVM", "LinearAlgebra", "Printf", "Random", "Reexport", "Serialization", "Statistics"] +git-tree-sha1 = "45d7deaf05cbb44116ba785d147c518ab46352d7" +uuid = "0c68f7d7-f131-5f86-a1c3-88cf8149b2d7" +version = "8.5.0" + +[[deps.GPUArraysCore]] +deps = ["Adapt"] +git-tree-sha1 = "6872f5ec8fd1a38880f027a26739d42dcda6691f" +uuid = "46192b85-c4d5-4398-a991-12ede77f4527" +version = "0.1.2" + +[[deps.GR]] +deps = ["Base64", "DelimitedFiles", "GR_jll", "HTTP", "JSON", "Libdl", "LinearAlgebra", "Pkg", "Printf", "Random", "RelocatableFolders", "Serialization", "Sockets", "Test", "UUIDs"] +git-tree-sha1 = "cf0a9940f250dc3cb6cc6c6821b4bf8a4286cf9c" +uuid = "28b8d3ca-fb5f-59d9-8090-bfdbd6d07a71" +version = "0.66.2" + +[[deps.GR_jll]] +deps = ["Artifacts", "Bzip2_jll", "Cairo_jll", "FFMPEG_jll", "Fontconfig_jll", "GLFW_jll", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Libtiff_jll", "Pixman_jll", "Pkg", "Qt5Base_jll", "Zlib_jll", "libpng_jll"] +git-tree-sha1 = "0eb5ef6f270fb70c2d83ee3593f56d02ed6fc7ff" +uuid = "d2c73de3-f751-5644-a686-071e5b155ba9" +version = "0.68.0+0" + +[[deps.Gettext_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Libiconv_jll", "Pkg", "XML2_jll"] +git-tree-sha1 = "9b02998aba7bf074d14de89f9d37ca24a1a0b046" +uuid = "78b55507-aeef-58d4-861c-77aaff3498b1" +version = "0.21.0+0" + +[[deps.Glib_jll]] +deps = ["Artifacts", "Gettext_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Libiconv_jll", "Libmount_jll", "PCRE_jll", "Pkg", "Zlib_jll"] +git-tree-sha1 = "a32d672ac2c967f3deb8a81d828afc739c838a06" +uuid = "7746bdde-850d-59dc-9ae8-88ece973131d" +version = "2.68.3+2" + +[[deps.Graphite2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "344bf40dcab1073aca04aa0df4fb092f920e4011" +uuid = "3b182d85-2403-5c21-9c21-1e1f0cc25472" +version = "1.3.14+0" + +[[deps.Grisu]] +git-tree-sha1 = "53bb909d1151e57e2484c3d1b53e19552b887fb2" +uuid = "42e2da0e-8278-4e71-bc24-59509adca0fe" +version = "1.0.2" + +[[deps.HTTP]] +deps = ["Base64", "CodecZlib", "Dates", "IniFile", "Logging", "LoggingExtras", "MbedTLS", "NetworkOptions", "OpenSSL", "Random", "SimpleBufferStream", "Sockets", "URIs", "UUIDs"] +git-tree-sha1 = "4abede886fcba15cd5fd041fef776b230d004cee" +uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3" +version = "1.4.0" + +[[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.Hyperscript]] +deps = ["Test"] +git-tree-sha1 = "8d511d5b81240fc8e6802386302675bdf47737b9" +uuid = "47d2ed2b-36de-50cf-bf87-49c2cf4b8b91" +version = "0.0.4" + +[[deps.HypertextLiteral]] +deps = ["Tricks"] +git-tree-sha1 = "c47c5fa4c5308f27ccaac35504858d8914e102f9" +uuid = "ac1192a8-f4b3-4bfe-ba22-af5b92cd3ab2" +version = "0.9.4" + +[[deps.IOCapture]] +deps = ["Logging", "Random"] +git-tree-sha1 = "f7be53659ab06ddc986428d3a9dcc95f6fa6705a" +uuid = "b5f81e59-6552-4d32-b1f0-c071b021bf89" +version = "0.2.2" + +[[deps.IRTools]] +deps = ["InteractiveUtils", "MacroTools", "Test"] +git-tree-sha1 = "af14a478780ca78d5eb9908b263023096c2b9d64" +uuid = "7869d1d1-7146-5819-86e3-90919afe41df" +version = "0.4.6" + +[[deps.IniFile]] +git-tree-sha1 = "f550e6e32074c939295eb5ea6de31849ac2c9625" +uuid = "83e8ac13-25f8-5344-8a64-a9f2b223428f" +version = "0.5.1" + +[[deps.InteractiveUtils]] +deps = ["Markdown"] +uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" + +[[deps.InverseFunctions]] +deps = ["Test"] +git-tree-sha1 = "b3364212fb5d870f724876ffcd34dd8ec6d98918" +uuid = "3587e190-3f89-42d0-90ee-14403ec27112" +version = "0.1.7" + +[[deps.IrrationalConstants]] +git-tree-sha1 = "7fd44fd4ff43fc60815f8e764c0f352b83c49151" +uuid = "92d709cd-6900-40b7-9082-c6be49f344b6" +version = "0.1.1" + +[[deps.IteratorInterfaceExtensions]] +git-tree-sha1 = "a3f24677c21f5bbe9d2a714f95dcd58337fb2856" +uuid = "82899510-4779-5014-852e-03e436cf321d" +version = "1.0.0" + +[[deps.JLLWrappers]] +deps = ["Preferences"] +git-tree-sha1 = "abc9885a7ca2052a736a600f7fa66209f96506e1" +uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" +version = "1.4.1" + +[[deps.JSON]] +deps = ["Dates", "Mmap", "Parsers", "Unicode"] +git-tree-sha1 = "3c837543ddb02250ef42f4738347454f95079d4e" +uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" +version = "0.21.3" + +[[deps.JpegTurbo_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "b53380851c6e6664204efb2e62cd24fa5c47e4ba" +uuid = "aacddb02-875f-59d6-b918-886e6ef4fbf8" +version = "2.1.2+0" + +[[deps.JuliaInterpreter]] +deps = ["CodeTracking", "InteractiveUtils", "Random", "UUIDs"] +git-tree-sha1 = "0f960b1404abb0b244c1ece579a0ec78d056a5d1" +uuid = "aa1ae85d-cabe-5617-a682-6adf51b2e16a" +version = "0.9.15" + +[[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", "Printf", "Unicode"] +git-tree-sha1 = "e7e9184b0bf0158ac4e4aa9daf00041b5909bf1a" +uuid = "929cbde3-209d-540e-8aea-75f648917ca0" +version = "4.14.0" + +[[deps.LLVMExtra_jll]] +deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl", "Pkg", "TOML"] +git-tree-sha1 = "771bfe376249626d3ca12bcd58ba243d3f961576" +uuid = "dad2f222-ce93-54a1-a47d-0025e8a3acab" +version = "0.0.16+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 = "f2355693d6778a178ade15952b7ac47a4ff97996" +uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" +version = "1.3.0" + +[[deps.Latexify]] +deps = ["Formatting", "InteractiveUtils", "LaTeXStrings", "MacroTools", "Markdown", "OrderedCollections", "Printf", "Requires"] +git-tree-sha1 = "ab9aa169d2160129beb241cb2750ca499b4e90e9" +uuid = "23fbe1c1-3f47-55db-b15f-69d7ec21a316" +version = "0.15.17" + +[[deps.LazyArtifacts]] +deps = ["Artifacts", "Pkg"] +uuid = "4af54fe1-eca0-43a8-85a7-787d91b784e3" + +[[deps.LibCURL]] +deps = ["LibCURL_jll", "MozillaCACerts_jll"] +uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" +version = "0.6.3" + +[[deps.LibCURL_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] +uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" +version = "7.84.0+0" + +[[deps.LibGit2]] +deps = ["Base64", "NetworkOptions", "Printf", "SHA"] +uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" + +[[deps.LibSSH2_jll]] +deps = ["Artifacts", "Libdl", "MbedTLS_jll"] +uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" +version = "1.10.2+0" + +[[deps.Libdl]] +uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" + +[[deps.Libffi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "0b4a5d71f3e5200a7dff793393e09dfc2d874290" +uuid = "e9f186c6-92d2-5b65-8a66-fee21dc1b490" +version = "3.2.2+1" + +[[deps.Libgcrypt_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgpg_error_jll", "Pkg"] +git-tree-sha1 = "64613c82a59c120435c067c2b809fc61cf5166ae" +uuid = "d4300ac3-e22c-5743-9152-c294e39db1e4" +version = "1.8.7+0" + +[[deps.Libglvnd_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll", "Xorg_libXext_jll"] +git-tree-sha1 = "7739f837d6447403596a75d19ed01fd08d6f56bf" +uuid = "7e76a0d4-f3c7-5321-8279-8d96eeed0f29" +version = "1.3.0+3" + +[[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", "Pkg"] +git-tree-sha1 = "42b62845d70a619f063a7da093d995ec8e15e778" +uuid = "94ce4f54-9a6c-5748-9c1c-f9c7231a4531" +version = "1.16.1+1" + +[[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", "Pkg", "Zlib_jll", "Zstd_jll"] +git-tree-sha1 = "3eb79b0ca5764d4799c06699573fd8f533259713" +uuid = "89763e89-9b03-5906-acba-b20f662cd828" +version = "4.4.0+0" + +[[deps.Libuuid_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "7f3efec06033682db852f8b3bc3c1d2b0a0ab066" +uuid = "38a345b3-de98-5d2b-a5d3-14cd9215e700" +version = "2.36.0+0" + +[[deps.LinearAlgebra]] +deps = ["Libdl", "libblastrampoline_jll"] +uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + +[[deps.LogExpFunctions]] +deps = ["ChainRulesCore", "ChangesOfVariables", "DocStringExtensions", "InverseFunctions", "IrrationalConstants", "LinearAlgebra"] +git-tree-sha1 = "94d9c52ca447e23eac0c0f074effbcd38830deb5" +uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688" +version = "0.3.18" + +[[deps.Logging]] +uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" + +[[deps.LoggingExtras]] +deps = ["Dates", "Logging"] +git-tree-sha1 = "5d4d2d9904227b8bd66386c1138cf4d5ffa826bf" +uuid = "e6f89c97-d47a-5376-807f-9c37f3926c36" +version = "0.4.9" + +[[deps.LoweredCodeUtils]] +deps = ["JuliaInterpreter"] +git-tree-sha1 = "dedbebe234e06e1ddad435f5c6f4b85cd8ce55f7" +uuid = "6f1432cf-f94c-5a45-995e-cdbf5db27b0b" +version = "2.2.2" + +[[deps.MacroTools]] +deps = ["Markdown", "Random"] +git-tree-sha1 = "3d3e902b31198a27340d0bf00d6ac452866021cf" +uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" +version = "0.5.9" + +[[deps.Markdown]] +deps = ["Base64"] +uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" + +[[deps.MbedTLS]] +deps = ["Dates", "MbedTLS_jll", "MozillaCACerts_jll", "Random", "Sockets"] +git-tree-sha1 = "6872f9594ff273da6d13c7c1a1545d5a8c7d0c1c" +uuid = "739be429-bea8-5141-9913-cc70e7f3736d" +version = "1.1.6" + +[[deps.MbedTLS_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" +version = "2.28.0+0" + +[[deps.Measures]] +git-tree-sha1 = "e498ddeee6f9fdb4551ce855a46f54dbd900245f" +uuid = "442fdcdd-2543-5da2-b0f3-8c86c306513e" +version = "0.3.1" + +[[deps.Missings]] +deps = ["DataAPI"] +git-tree-sha1 = "bf210ce90b6c9eed32d25dbcae1ebc565df2687f" +uuid = "e1d29d7a-bbdc-5cf2-9ac0-f12de2c33e28" +version = "1.0.2" + +[[deps.Mmap]] +uuid = "a63ad114-7e13-5084-954f-fe012c677804" + +[[deps.MozillaCACerts_jll]] +uuid = "14a3606d-f60d-562e-9121-12d972cd8159" +version = "2022.2.1" + +[[deps.NaNMath]] +deps = ["OpenLibm_jll"] +git-tree-sha1 = "a7c3d1da1189a1c2fe843a3bfa04d18d20eb3211" +uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" +version = "1.0.1" + +[[deps.NetworkOptions]] +uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" +version = "1.2.0" + +[[deps.Ogg_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "887579a3eb005446d514ab7aeac5d1d027658b8f" +uuid = "e7412a2a-1a6e-54c0-be00-318e2571c051" +version = "1.3.5+1" + +[[deps.OpenBLAS_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] +uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" +version = "0.3.20+0" + +[[deps.OpenLibm_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "05823500-19ac-5b8b-9628-191a04bc5112" +version = "0.8.1+0" + +[[deps.OpenSSL]] +deps = ["BitFlags", "Dates", "MozillaCACerts_jll", "OpenSSL_jll", "Sockets"] +git-tree-sha1 = "fa44e6aa7dfb963746999ca8129c1ef2cf1c816b" +uuid = "4d8831e6-92b7-49fb-bdf8-b643e874388c" +version = "1.1.1" + +[[deps.OpenSSL_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "e60321e3f2616584ff98f0a4f18d98ae6f89bbb3" +uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95" +version = "1.1.17+0" + +[[deps.OpenSpecFun_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "13652491f6856acfd2db29360e1bbcd4565d04f1" +uuid = "efe28fd5-8261-553b-a9e1-b2916fc3738e" +version = "0.5.5+0" + +[[deps.Opus_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "51a08fb14ec28da2ec7a927c4337e4332c2a4720" +uuid = "91d4177d-7536-5919-b921-800302f37372" +version = "1.3.2+0" + +[[deps.OrderedCollections]] +git-tree-sha1 = "85f8e6578bf1f9ee0d11e7bb1b1456435479d47c" +uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" +version = "1.4.1" + +[[deps.PCRE2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "efcefdf7-47ab-520b-bdef-62a2eaa19f15" +version = "10.40.0+0" + +[[deps.PCRE_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "b2a7af664e098055a7529ad1a900ded962bca488" +uuid = "2f80f16e-611a-54ab-bc61-aa92de5b98fc" +version = "8.44.0+0" + +[[deps.Parsers]] +deps = ["Dates"] +git-tree-sha1 = "3d5bf43e3e8b412656404ed9466f1dcbf7c50269" +uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" +version = "2.4.0" + +[[deps.Pixman_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "b4f5d02549a10e20780a24fce72bea96b6329e29" +uuid = "30392449-352a-5448-841d-b1acce4e97dc" +version = "0.40.1+0" + +[[deps.Pkg]] +deps = ["Artifacts", "Dates", "Downloads", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] +uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" +version = "1.8.0" + +[[deps.PlotThemes]] +deps = ["PlotUtils", "Statistics"] +git-tree-sha1 = "8162b2f8547bc23876edd0c5181b27702ae58dce" +uuid = "ccf2f8ad-2431-5c83-bf29-c5338b663b6a" +version = "3.0.0" + +[[deps.PlotUtils]] +deps = ["ColorSchemes", "Colors", "Dates", "Printf", "Random", "Reexport", "SnoopPrecompile", "Statistics"] +git-tree-sha1 = "21303256d239f6b484977314674aef4bb1fe4420" +uuid = "995b91a9-d308-5afd-9ec6-746e21dbc043" +version = "1.3.1" + +[[deps.Plots]] +deps = ["Base64", "Contour", "Dates", "Downloads", "FFMPEG", "FixedPointNumbers", "GR", "JSON", "LaTeXStrings", "Latexify", "LinearAlgebra", "Measures", "NaNMath", "Pkg", "PlotThemes", "PlotUtils", "Printf", "REPL", "Random", "RecipesBase", "RecipesPipeline", "Reexport", "RelocatableFolders", "Requires", "Scratch", "Showoff", "SparseArrays", "Statistics", "StatsBase", "UUIDs", "UnicodeFun", "Unzip"] +git-tree-sha1 = "6062b3b25ad3c58e817df0747fc51518b9110e5f" +uuid = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" +version = "1.33.0" + +[[deps.PlutoHooks]] +deps = ["InteractiveUtils", "Markdown", "UUIDs"] +git-tree-sha1 = "072cdf20c9b0507fdd977d7d246d90030609674b" +uuid = "0ff47ea0-7a50-410d-8455-4348d5de0774" +version = "0.0.5" + +[[deps.PlutoLinks]] +deps = ["FileWatching", "InteractiveUtils", "Markdown", "PlutoHooks", "Revise", "UUIDs"] +git-tree-sha1 = "0e8bcc235ec8367a8e9648d48325ff00e4b0a545" +uuid = "0ff47ea0-7a50-410d-8455-4348d5de0420" +version = "0.1.5" + +[[deps.PlutoTeachingTools]] +deps = ["Downloads", "HypertextLiteral", "LaTeXStrings", "Latexify", "Markdown", "PlutoLinks", "PlutoUI", "Random"] +git-tree-sha1 = "d8be3432505c2febcea02f44e5f4396fae017503" +uuid = "661c6b06-c737-4d37-b85c-46df65de6f69" +version = "0.2.3" + +[[deps.PlutoUI]] +deps = ["AbstractPlutoDingetjes", "Base64", "ColorTypes", "Dates", "Hyperscript", "HypertextLiteral", "IOCapture", "InteractiveUtils", "JSON", "Logging", "Markdown", "Random", "Reexport", "UUIDs"] +git-tree-sha1 = "a602d7b0babfca89005da04d89223b867b55319f" +uuid = "7f904dfe-b85e-4ff6-b463-dae2292396a8" +version = "0.7.40" + +[[deps.Preferences]] +deps = ["TOML"] +git-tree-sha1 = "47e5f437cc0e7ef2ce8406ce1e7e24d44915f88d" +uuid = "21216c6a-2e73-6563-6e65-726566657250" +version = "1.3.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.Qt5Base_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Fontconfig_jll", "Glib_jll", "JLLWrappers", "Libdl", "Libglvnd_jll", "OpenSSL_jll", "Pkg", "Xorg_libXext_jll", "Xorg_libxcb_jll", "Xorg_xcb_util_image_jll", "Xorg_xcb_util_keysyms_jll", "Xorg_xcb_util_renderutil_jll", "Xorg_xcb_util_wm_jll", "Zlib_jll", "xkbcommon_jll"] +git-tree-sha1 = "c6c0f690d0cc7caddb74cef7aa847b824a16b256" +uuid = "ea2cea3b-5b76-57ae-a6ef-0a8af62496e1" +version = "5.15.3+1" + +[[deps.REPL]] +deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] +uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" + +[[deps.Random]] +deps = ["SHA", "Serialization"] +uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" + +[[deps.RealDot]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "9f0a1b71baaf7650f4fa8a1d168c7fb6ee41f0c9" +uuid = "c1ae055f-0cd5-4b69-90a6-9a35b1a98df9" +version = "0.1.0" + +[[deps.RecipesBase]] +git-tree-sha1 = "6bf3f380ff52ce0832ddd3a2a7b9538ed1bcca7d" +uuid = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" +version = "1.2.1" + +[[deps.RecipesPipeline]] +deps = ["Dates", "NaNMath", "PlotUtils", "RecipesBase"] +git-tree-sha1 = "e7eac76a958f8664f2718508435d058168c7953d" +uuid = "01d81517-befc-4cb6-b9ec-a95719d0359c" +version = "0.6.3" + +[[deps.Reexport]] +git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" +uuid = "189a3867-3050-52da-a836-e630ba90ab69" +version = "1.2.2" + +[[deps.RelocatableFolders]] +deps = ["SHA", "Scratch"] +git-tree-sha1 = "22c5201127d7b243b9ee1de3b43c408879dff60f" +uuid = "05181044-ff0b-4ac5-8273-598c1e38db00" +version = "0.3.0" + +[[deps.Requires]] +deps = ["UUIDs"] +git-tree-sha1 = "838a3a4188e2ded87a4f9f184b4b0d78a1e91cb7" +uuid = "ae029012-a4dd-5104-9daa-d747884805df" +version = "1.3.0" + +[[deps.Revise]] +deps = ["CodeTracking", "Distributed", "FileWatching", "JuliaInterpreter", "LibGit2", "LoweredCodeUtils", "OrderedCollections", "Pkg", "REPL", "Requires", "UUIDs", "Unicode"] +git-tree-sha1 = "dad726963ecea2d8a81e26286f625aee09a91b7c" +uuid = "295af30f-e4ad-537b-8983-00126c2a3abe" +version = "3.4.0" + +[[deps.SHA]] +uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" +version = "0.7.0" + +[[deps.Scratch]] +deps = ["Dates"] +git-tree-sha1 = "f94f779c94e58bf9ea243e77a37e16d9de9126bd" +uuid = "6c6a2e73-6563-6170-7368-637461726353" +version = "1.1.1" + +[[deps.Serialization]] +uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" + +[[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.SnoopPrecompile]] +git-tree-sha1 = "f604441450a3c0569830946e5b33b78c928e1a85" +uuid = "66db9d55-30c0-4569-8b51-7e840670fc0c" +version = "1.0.1" + +[[deps.Sockets]] +uuid = "6462fe0b-24de-5631-8697-dd941f90decc" + +[[deps.SortingAlgorithms]] +deps = ["DataStructures"] +git-tree-sha1 = "b3363d7460f7d098ca0912c69b082f75625d7508" +uuid = "a2af1166-a08f-5f64-846c-94a0d3cef48c" +version = "1.0.1" + +[[deps.SparseArrays]] +deps = ["LinearAlgebra", "Random"] +uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + +[[deps.SpecialFunctions]] +deps = ["ChainRulesCore", "IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"] +git-tree-sha1 = "d75bda01f8c31ebb72df80a46c88b25d1c79c56d" +uuid = "276daf66-3868-5448-9aa4-cd146d93841b" +version = "2.1.7" + +[[deps.StaticArrays]] +deps = ["LinearAlgebra", "Random", "StaticArraysCore", "Statistics"] +git-tree-sha1 = "efa8acd030667776248eabb054b1836ac81d92f0" +uuid = "90137ffa-7385-5640-81b9-e52037218182" +version = "1.5.7" + +[[deps.StaticArraysCore]] +git-tree-sha1 = "ec2bd695e905a3c755b33026954b119ea17f2d22" +uuid = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" +version = "1.3.0" + +[[deps.Statistics]] +deps = ["LinearAlgebra", "SparseArrays"] +uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" + +[[deps.StatsAPI]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "f9af7f195fb13589dd2e2d57fdb401717d2eb1f6" +uuid = "82ae8749-77ed-4fe6-ae5f-f523153014b0" +version = "1.5.0" + +[[deps.StatsBase]] +deps = ["DataAPI", "DataStructures", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"] +git-tree-sha1 = "d1bf48bfcc554a3761a133fe3a9bb01488e06916" +uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" +version = "0.33.21" + +[[deps.StructArrays]] +deps = ["Adapt", "DataAPI", "StaticArraysCore", "Tables"] +git-tree-sha1 = "8c6ac65ec9ab781af05b08ff305ddc727c25f680" +uuid = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" +version = "0.6.12" + +[[deps.TOML]] +deps = ["Dates"] +uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" +version = "1.0.0" + +[[deps.TableTraits]] +deps = ["IteratorInterfaceExtensions"] +git-tree-sha1 = "c06b2f539df1c6efa794486abfb6ed2022561a39" +uuid = "3783bdb8-4a98-5b6b-af9a-565f29a5fe9c" +version = "1.0.1" + +[[deps.Tables]] +deps = ["DataAPI", "DataValueInterfaces", "IteratorInterfaceExtensions", "LinearAlgebra", "OrderedCollections", "TableTraits", "Test"] +git-tree-sha1 = "7149a60b01bf58787a1b83dad93f90d4b9afbe5d" +uuid = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" +version = "1.8.1" + +[[deps.Tar]] +deps = ["ArgTools", "SHA"] +uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" +version = "1.10.1" + +[[deps.TensorCore]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "1feb45f88d133a655e001435632f019a9a1bcdb6" +uuid = "62fd8b95-f654-4bbd-a8a5-9c27f68ccd50" +version = "0.1.1" + +[[deps.Test]] +deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] +uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[[deps.TranscodingStreams]] +deps = ["Random", "Test"] +git-tree-sha1 = "8a75929dcd3c38611db2f8d08546decb514fcadf" +uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa" +version = "0.9.9" + +[[deps.Tricks]] +git-tree-sha1 = "6bac775f2d42a611cdfcd1fb217ee719630c4175" +uuid = "410a4b4d-49e4-4fbc-ab6d-cb71b17b3775" +version = "0.1.6" + +[[deps.URIs]] +git-tree-sha1 = "e59ecc5a41b000fa94423a578d29290c7266fc10" +uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" +version = "1.4.0" + +[[deps.UUIDs]] +deps = ["Random", "SHA"] +uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" + +[[deps.Unicode]] +uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" + +[[deps.UnicodeFun]] +deps = ["REPL"] +git-tree-sha1 = "53915e50200959667e78a92a418594b428dffddf" +uuid = "1cfade01-22cf-5700-b092-accc4b62d6e1" +version = "0.4.1" + +[[deps.Unzip]] +git-tree-sha1 = "ca0969166a028236229f63514992fc073799bb78" +uuid = "41fe7b60-77ed-43a1-b4f0-825fd5a5650d" +version = "0.2.0" + +[[deps.Wayland_jll]] +deps = ["Artifacts", "Expat_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Pkg", "XML2_jll"] +git-tree-sha1 = "3e61f0b86f90dacb0bc0e73a0c5a83f6a8636e23" +uuid = "a2964d1f-97da-50d4-b82a-358c7fce9d89" +version = "1.19.0+0" + +[[deps.Wayland_protocols_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "4528479aa01ee1b3b4cd0e6faef0e04cf16466da" +uuid = "2381bf8a-dfd0-557d-9999-79630e7b1b91" +version = "1.25.0+0" + +[[deps.XML2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Pkg", "Zlib_jll"] +git-tree-sha1 = "58443b63fb7e465a8a7210828c91c08b92132dff" +uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a" +version = "2.9.14+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.Xorg_libX11_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libxcb_jll", "Xorg_xtrans_jll"] +git-tree-sha1 = "5be649d550f3f4b95308bf0183b82e2582876527" +uuid = "4f6342f7-b3d2-589e-9d20-edeb45f2b2bc" +version = "1.6.9+4" + +[[deps.Xorg_libXau_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "4e490d5c960c314f33885790ed410ff3a94ce67e" +uuid = "0c0b7dd1-d40b-584c-a123-a41640f87eec" +version = "1.0.9+4" + +[[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", "Pkg"] +git-tree-sha1 = "4fe47bd2247248125c428978740e18a681372dd4" +uuid = "a3789734-cfe1-5b06-b2d0-1dd0d9d62d05" +version = "1.1.3+4" + +[[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", "Pkg"] +git-tree-sha1 = "6783737e45d3c59a4a4c4091f5f88cdcf0908cbb" +uuid = "14d82f49-176c-5ed1-bb49-ad3f5cbd8c74" +version = "0.1.0+3" + +[[deps.Xorg_libxcb_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "XSLT_jll", "Xorg_libXau_jll", "Xorg_libXdmcp_jll", "Xorg_libpthread_stubs_jll"] +git-tree-sha1 = "daf17f441228e7a3833846cd048892861cff16d6" +uuid = "c7cfdc94-dc32-55de-ac96-5a1b8d977c5b" +version = "1.13.0+3" + +[[deps.Xorg_libxkbfile_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll"] +git-tree-sha1 = "926af861744212db0eb001d9e40b5d16292080b2" +uuid = "cc61e674-0454-545c-8b26-ed2c68acab7a" +version = "1.1.0+4" + +[[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", "Pkg", "Xorg_libxkbfile_jll"] +git-tree-sha1 = "4bcbf660f6c2e714f87e960a171b119d06ee163b" +uuid = "35661453-b289-5fab-8a00-3d9160c6a3a4" +version = "1.4.2+4" + +[[deps.Xorg_xkeyboard_config_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xkbcomp_jll"] +git-tree-sha1 = "5c8424f8a67c3f2209646d4425f3d415fee5931d" +uuid = "33bec58e-1273-512f-9401-5d533626f822" +version = "2.27.0+4" + +[[deps.Xorg_xtrans_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "79c31e7844f6ecf779705fbc12146eb190b7d845" +uuid = "c5fb5394-a638-5e4d-96e5-b29de1b5cf10" +version = "1.4.0+3" + +[[deps.Zlib_jll]] +deps = ["Libdl"] +uuid = "83775a58-1f1d-513f-b197-d71354ab007a" +version = "1.2.12+3" + +[[deps.Zstd_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "e45044cd873ded54b6a5bac0eb5c971392cf1927" +uuid = "3161d3a3-bdf6-5164-811a-617609db77b4" +version = "1.5.2+0" + +[[deps.Zygote]] +deps = ["AbstractFFTs", "ChainRules", "ChainRulesCore", "DiffRules", "Distributed", "FillArrays", "ForwardDiff", "GPUArrays", "GPUArraysCore", "IRTools", "InteractiveUtils", "LinearAlgebra", "LogExpFunctions", "MacroTools", "NaNMath", "Random", "Requires", "SparseArrays", "SpecialFunctions", "Statistics", "ZygoteRules"] +git-tree-sha1 = "a789623d84d72551b791bbd9daae37cc1fc0f7ad" +uuid = "e88e6eb3-aa80-5325-afca-941959d7151f" +version = "0.6.48" + +[[deps.ZygoteRules]] +deps = ["MacroTools"] +git-tree-sha1 = "8c1a8e4dfacb1fd631745552c8db35d0deb09ea0" +uuid = "700de1a5-db45-46bc-99cf-38207098b444" +version = "0.2.2" + +[[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", "OpenBLAS_jll"] +uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" +version = "5.1.1+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.libpng_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] +git-tree-sha1 = "94d180a6d2b5e55e447e2d27a29ed04fe79eb30c" +uuid = "b53b4c65-9356-5827-b1ea-8c7a1a84506f" +version = "1.6.38+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.nghttp2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" +version = "1.48.0+0" + +[[deps.p7zip_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" +version = "17.4.0+0" + +[[deps.x264_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "4fea590b89e6ec504593146bf8b988b2c00922b2" +uuid = "1270edf5-f2f9-52d2-97e9-ab00b5d0237a" +version = "2021.5.5+0" + +[[deps.x265_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "ee567a171cce03570d77ad3a43e90218e38937a9" +uuid = "dfaa095f-4041-5dcd-9319-2fabd8486b76" +version = "3.5.0+0" + +[[deps.xkbcommon_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Wayland_jll", "Wayland_protocols_jll", "Xorg_libxcb_jll", "Xorg_xkeyboard_config_jll"] +git-tree-sha1 = "9ebfc140cc56e8c2156a15ceac2f0302e327ac0a" +uuid = "d8fb68d0-12a3-5cfd-a85a-d49703b185fd" +version = "1.4.1+0" +""" + +# ╔═║ Cell order: +# ╠═ddbba011-f413-4804-b29b-fdc4efe2b3b3 +# ╠═9a1453a3-bfad-4212-ac19-a4b6c7df5b16 +# β•Ÿβ”€9f6254b5-bc06-469c-a0ef-5ee31ac75233 +# ╠═ddbf8ae6-39b6-11ed-226e-0d38991ed784 +# ╠═f447c167-2bcb-4bf3-86cd-0f40f4e54c97 +# β•Ÿβ”€a405d214-4348-4692-999e-0e890bd91e5d +# β•Ÿβ”€d19834fc-edd1-433b-8bfc-6022fd7e3239 +# β•Ÿβ”€7493915c-53b4-4284-bb7f-33cac680f759 +# β•Ÿβ”€1cfba628-aa7b-4851-89f1-84b1a45802b3 +# β•Ÿβ”€3829f016-a7cd-4ce6-b2d4-1c84da8fdb97 +# β•Ÿβ”€755ff203-43d8-488f-a075-14a858b0a096 +# β•Ÿβ”€fd6dd009-2a52-46d1-b1a8-5f094e8c1d98 +# β•Ÿβ”€4d9d2f52-c406-4a7c-8b0e-ba5af7ebc3d8 +# β•Ÿβ”€de4df88a-2a55-4a02-aeaf-f02242b6c52f +# β•Ÿβ”€e22cec4a-03d3-4821-945b-9283e16207a8 +# β•Ÿβ”€19fd4ce6-fc2e-4047-b265-7b54e9bbdad4 +# β•Ÿβ”€38a6618a-00e9-4565-aaef-4893afcb3181 +# β•Ÿβ”€9ba8d153-e2c9-4387-a487-fb5a25f5808b +# β•Ÿβ”€25d27d5a-dcaa-464c-ba44-9aea9ea8be38 +# ╠═d0263b55-0f11-4a37-9837-bb4f9e322aa8 +# β•Ÿβ”€d1079990-5d9a-495c-9dbf-d9ea07c5c8f7 +# ╠═751234f4-6957-4273-84e9-9d048c756fa7 +# β•Ÿβ”€2e4ac856-fe22-426d-b58b-f3adbacdee8a +# ╠═e75e2ea0-bf1a-4519-87a2-efb61736ab44 +# β•Ÿβ”€6ebe2c16-400b-40a0-bec6-e52d2858e83a +# β•Ÿβ”€9aa600b1-9c39-430a-88d4-169c5d84e145 +# ╠═43cfe774-4ed1-4f4f-985a-c261c4d569bf +# β•Ÿβ”€88103471-6f2c-4604-83cc-0d76645776d7 +# ╠═5d9c5359-d0a9-4a0a-853e-3fd0028f23df +# β•Ÿβ”€6bacff8b-ac8c-46b0-adeb-7d8b1aab85f2 +# ╠═86399001-e7c4-4733-b476-503650c11e0c +# β•Ÿβ”€0817247f-f9ae-48cc-9966-dd451c136d43 +# β•Ÿβ”€1d1d83b0-8669-452c-90ca-26c1396c822a +# β•Ÿβ”€2ded206d-e563-4752-a0b1-19402e1e4f52 +# ╠═5b47082b-d080-4243-90a2-5d98b82451d4 +# ╠═89b1f353-523a-4a4c-aee4-9b6e36b944fb +# ╠═4b1a6ce2-b57d-466a-97cd-35036689fe43 +# β•Ÿβ”€fe1f4c0e-becb-4058-a069-be213622aa92 +# β•Ÿβ”€eb0d58fc-3348-47f9-966c-e7f9f316ddb7 +# ╠═11f3c0d4-0609-4446-aa84-4db3d93e93b0 +# β•Ÿβ”€c22a890c-a308-4d1b-be4b-d78f93693a9c +# β•Ÿβ”€48511240-20d1-41b6-bc7b-a8ecfc3aa06d +# β•Ÿβ”€ffb8851d-c7e8-47ae-ac9d-96baf0774ca3 +# β•Ÿβ”€a6eb6028-acca-447a-9e55-e60ecd3c6f84 +# ╠═f2bedf2b-2dfe-4392-ba2a-add10882af07 +# ╠═f504954b-ac63-4843-8891-b1ca0e5ae58b +# β•Ÿβ”€1da14b09-5d62-42cc-b9b4-a5a6ddc34181 +# ╠═a9472534-e32b-4323-8dfc-e00b9f31f8e0 +# β•Ÿβ”€ecfe4d79-b1c6-4a6d-a9d7-a563a26e32cd +# β•Ÿβ”€83423082-2d3a-42a1-b1db-ed267399cb31 +# β•Ÿβ”€fb416cfd-f9ee-4d7d-9e83-056e81c422e0 +# ╠═d0020df6-62a1-4000-b8cf-ceacb8014a0b +# β•Ÿβ”€d8301150-7b08-45b6-a986-d21574eee91b +# β•Ÿβ”€1f40437c-0419-4fc0-96ae-a8130efaa36a +# β•Ÿβ”€8419603a-3c5c-45a0-9a70-4a74347a7ad7 +# β•Ÿβ”€4f9d3c2e-1ec8-4337-b49b-e0dc1d63bc62 +# ╠═7476a638-5eca-47cc-9a01-41f30b9dbf9d +# ╠═d0d580d4-8e92-4d46-8177-67f52fbb3934 +# ╠═c5784ec1-17cf-4897-8cd3-ff81998b9d9c +# β•Ÿβ”€387d145f-e77c-4e13-89b7-fc8733215694 +# β•Ÿβ”€3790f106-9895-4425-a16f-5c5e0857e99e +# β•Ÿβ”€945a16d3-805c-40c9-9166-5120743bd3d7 +# β•Ÿβ”€728c8956-9911-47d5-a021-df224e3f5b90 +# ╠═3716d3cc-8706-41bf-873d-193543cb0514 +# ╠═87c72b22-8c81-4062-8a9c-40902f83a623 +# ╠═1362cd95-6a87-44e3-980d-014496afce85 +# β•Ÿβ”€46075912-60b7-46d2-88c9-a13a8b015e0b +# β•Ÿβ”€f8ba8857-ece1-4cec-b7f2-2a8bc8bfb1d9 +# ╠═cf13543a-9dd4-40ef-9523-5953e9db2c78 +# ╠═0736648c-a181-4352-8b4e-bacf745fda64 +# ╠═95dd7822-ef43-4629-bb42-ddb15bd1f965 +# β•Ÿβ”€786b7ea2-7827-4cab-abbb-786abe935cc3 +# β•Ÿβ”€4440f39c-51e5-4ffd-8031-96d4a760270c +# β•Ÿβ”€bfb3280e-638f-4e8f-8e37-d5f8fd75541d +# β•Ÿβ”€7f6e72fd-aacc-47a8-a496-25794c60343c +# β•Ÿβ”€55160454-2738-4911-be15-29f484f610db +# ╠═e90098ec-a9c3-4204-95f7-88adeb74ee50 +# ╠═7b92051d-4015-4e22-b6b9-41462e2cc54f +# β•Ÿβ”€4eef090f-29b1-44e1-929a-98162719ae93 +# ╠═32f6a219-f69b-4085-ba4b-5c7dc3ca2155 +# β•Ÿβ”€ffffadbb-5fcd-443d-97fb-b6d372029814 +# ╠═19198826-15a0-432d-abe2-ae5ead6869f5 +# β•Ÿβ”€0d762ed4-dfb9-433f-8ded-1ae653ad87c2 +# β•Ÿβ”€ef28a71e-74f4-40dd-a72d-1a51628fd01b +# ╠═ffd6df27-c0e5-44be-aee9-2c7a9d4fb5c0 +# β•Ÿβ”€f9ca3e33-243c-45c8-b646-587aa7d2d902 +# β•Ÿβ”€c7a0dbbe-89e6-4759-a57f-b367fbeba62e +# ╠═9a8f7f42-2677-43ff-a280-3b75df6258e1 +# ╠═0cee5c93-266c-4be3-9997-20728cf11921 +# β•Ÿβ”€7b3551c2-22f7-47dd-82dc-b817d7e0f1fb +# β•Ÿβ”€f6330892-3379-4e0d-a007-c451a465bd06 +# β•Ÿβ”€6d848043-e5bc-4beb-a18a-004d4cac5c23 +# β•Ÿβ”€fc84dce4-779c-4377-af2a-cda7e453f382 +# β•Ÿβ”€d76d5ddc-fe59-47f4-8b56-6f704b486ebc +# β•Ÿβ”€9ef1e014-5a7d-4b17-98de-0cf51d788bfa +# ╠═f8cd5dce-6a4c-4c6c-b2d5-7ec56132e95e +# ╠═c7ee9795-2c7a-480a-9269-440a9227c591 +# β•Ÿβ”€28f31ef9-27ea-4e94-8f03-89b0f6cfa0d1 +# β•Ÿβ”€1676ec54-bd96-4892-aa08-3ae831b537bb +# ╠═ea16d4c6-d6e4-46fa-a721-fa5a0f2ff021 +# ╠═bd37c58d-8544-40b1-a0b5-ea03ec5692a8 +# ╠═5bbd690b-6a98-4dbf-a8c4-581ac77a4da5 +# β•Ÿβ”€cc224a30-81bf-4a2c-b636-40ff5c941bb6 +# β•Ÿβ”€3d20c24c-469b-4f0d-9936-705e42033ded +# β•Ÿβ”€bf6c5fc8-8283-46d4-aa67-416d53f7d315 +# ╠═d00bf3fd-9bd8-4b11-b755-a85f0f8644cb +# ╠═a80b3a0f-53d1-473e-9bea-2494a85ac511 +# β•Ÿβ”€ab398337-adb5-48fa-ae1b-4c9499438097 +# β•Ÿβ”€ae7b2114-de91-4f1b-8765-af5e02cc1b63 +# β•Ÿβ”€e4aedbd4-a609-4eaf-812b-d2f3d6f4df3d +# ╠═b8974b20-d8dc-4109-a64e-585c7afdb484 +# β•Ÿβ”€bd10d753-eea6-4798-939c-8e5551d40c5c +# β•Ÿβ”€2f95afd6-1418-44bb-9868-970dbe888500 +# ╠═06e91432-935f-4d7c-899f-d7968a10a78e +# β•Ÿβ”€c7efc656-ae9b-4eef-b0cd-3afe3852d396 +# β•Ÿβ”€ca4b41dd-353e-498d-a461-648c582cb999 +# ╠═c5fc8f3a-ed90-41ec-b4b9-1172a41e3adc +# ╠═40e13883-dd9a-43b9-9ef7-1069ef036846 +# β•Ÿβ”€7c7bdbd9-edd5-4142-a765-4c498761f7e7 +# β•Ÿβ”€8569cd7b-890f-4b04-a6d5-c92a70a226ab +# ╠═cf250e37-ed37-47cd-b689-8e2596f9fdc5 +# β•Ÿβ”€8f46db4a-cc94-4497-aad8-0fc4b0cfa1e3 +# ╠═dccf9f6d-82a6-423c-bbe5-22c5a8c2f5e4 +# β•Ÿβ”€bbe25d4e-952b-4ed5-b20e-24b3dcd30495 +# ╠═77eac64f-eac5-4d12-8acf-5b5070e60858 +# β•Ÿβ”€aa4194d6-2f8c-4367-850e-22ebcf1b72e4 +# β•Ÿβ”€f66a0ea7-70fd-4340-8b02-6fbaab847dfc +# β•Ÿβ”€8cca11ed-a61c-4cc8-af4b-350137073756 +# ╠═7144c6c8-79dd-437d-a201-bac143f6a261 +# β•Ÿβ”€45765f4a-536d-4e9d-be9d-144b7ccd4dcf +# β•Ÿβ”€df89f509-cfd7-46b3-9dd1-cdcfcea68053 +# ╠═0b51e23e-a015-4e86-ba48-6475a9ee9779 +# β•Ÿβ”€14dcad57-23ae-4905-aac4-d29066f2a085 +# ╠═06a59777-b6ec-4808-9105-7a2542a629ea +# ╠═9222d644-5d20-474a-83db-4b2e3bed45e2 +# β•Ÿβ”€c511e1c4-0306-46c7-800f-8257266c0091 +# ╠═c79e7017-4acc-4562-817a-50245ce654dc +# β•Ÿβ”€ac115404-0115-4c94-9b51-9a8674ac4b05 +# β•Ÿβ”€dd01d4b4-b05a-43a3-9b76-65e13076535f +# β•Ÿβ”€766e1909-5063-4ce2-821d-1f93be4db789 +# ╠═2b83cccd-bdaf-4481-a7f5-391434220bd5 +# β•Ÿβ”€69a9ec45-d2ff-4362-9c3c-5c004e46ceb3 +# β•Ÿβ”€cc167cfd-b776-4280-a308-d5908ceaec4b +# β•Ÿβ”€8923a5ad-ddba-4ae2-886e-84526a3521ba +# β•Ÿβ”€e1b9f114-58e7-4546-a3c0-5e07fb1665e7 +# ╠═ba07ccda-ae66-4fce-837e-00b2b039b404 +# β•Ÿβ”€d0ae8c14-b341-4220-8a1c-79fed9758f64 +# β•Ÿβ”€f843b77d-8160-4d87-8641-eeb04549af8f +# β•Ÿβ”€9b34a8f9-6afa-4712-bde8-a94f4d5e7a33 +# β•Ÿβ”€00000000-0000-0000-0000-000000000001 +# β•Ÿβ”€00000000-0000-0000-0000-000000000002 diff --git a/homeworks_old/hw3.jl b/homeworks_old/hw3.jl new file mode 100644 index 0000000..4328fdc --- /dev/null +++ b/homeworks_old/hw3.jl @@ -0,0 +1,1395 @@ +### A Pluto.jl notebook ### +# v0.19.12 + +using Markdown +using InteractiveUtils + +# ╔═║ b9a2c424-8471-4d29-a2e8-3fcb0ff531eb +begin + using Plots + using PlutoTeachingTools + using PlutoUI + using Triangulate +end + +# ╔═║ 67e509c6-cbfe-40e3-96e3-4954d0aa344f +md""" +Homework 3 of the MIT Course [_Julia: solving real-world problems with computation_](https://github.com/mitmath/JuliaComputation) + +Release date: Thursday, Sep 29, 2022 (version 2) + +**Due date: Friday, Oct 7, 2022 at 11:59pm EST** + +Submission by: Jazzy Doe (jazz@mit.edu) +""" + +# ╔═║ 59a9011b-1391-44ab-98bf-ccb88cd319ce +student = (name = "Jazzy Doe", kerberos_id = "jazz") + +# ╔═║ 5cf9c957-3fde-42c2-a85c-0f12380f3a07 +TableOfContents() + +# ╔═║ 9c10d887-d3e3-40c1-82cd-0c8f66706b41 +md""" +## HW3 - Triangular mesh generator +""" + +# ╔═║ 2ff2d514-5133-4f97-917f-b694bfdf83bb +md""" +First we define utility functions from the lecture notes: +""" + +# ╔═║ 692b826a-891d-4d35-b817-4c97f3dd3157 +function tplot(nodes, triangles) + allpv = Vector{Float64}[] + for tri in triangles + pv = nodes[tri] + append!(allpv, pv, [pv[1], [NaN, NaN]]) + end + h = plot( + first.(allpv), last.(allpv), + seriestype=:shape, aspect_ratio=:equal, + leg=false, fillcolor=RGB(0.8, 1, 0.8) + ) +end + +# ╔═║ 0311fa83-fd2f-417d-8720-22281e26cb9e +function delaunay(nodes) + triin = Triangulate.TriangulateIO() + triin.pointlist = hcat(nodes...) + (triout, vorout) = triangulate("Q", triin) + triangles = [collect(tri) for tri in eachcol(triout.trianglelist)] + return triangles +end + +# ╔═║ 4c16b233-aefb-4107-b738-d0286b580785 +md""" +## Description +""" + +# ╔═║ edd25cc0-be79-49b4-ab82-41beaed7c4be +md""" +In this project you will write an unstructured triangular mesh generator based on the Delaunay refinement algorithm. The steps will be described in detail, and for testing we will use the following simple polygon: +""" + +# ╔═║ 287c7f0e-7dea-4871-83c3-dc61d209c84a +pv = [[0, 0], [1, 0], [0.5, 0.5], [1, 1], [0, 1], [0, 0]] + +# ╔═║ c147e761-edeb-48b2-828c-aeecaa430dbd +md""" +which we can plot by simply drawing straight lines between the corner points: +""" + +# ╔═║ 16986c48-4b75-4ea7-9199-a694568641be +plot(first.(pv), last.(pv), aspect_ratio=:equal, linewidth=2) + +# ╔═║ 32f40b13-6b91-42af-af78-097e941e6f83 +md""" +## Problem 1 - Triangle properties +""" + +# ╔═║ b8af47fe-ff27-4fdf-86a3-bb3c654524b7 +md""" +Next we need functions for computing some basic quantities from triangles. Here, a triangle `tri` is represented as an array of 3 points, e.g. +""" + +# ╔═║ 6a89cedb-64d3-4b67-a83b-ac578c19f7ea +tri = [[1, 0.5], [2, 1], [0, 3]] + +# ╔═║ a44ea06a-1dba-4b2a-83ea-68fad90f60de +md""" +## Problem 1(a) - Triangle area +""" + +# ╔═║ b18ede94-fdd4-4668-a42f-e6317f518389 +md""" +Write a function `tri_area(tri)` which returns the area of `tri`. +""" + +# ╔═║ 33b9ea90-d280-4d9a-a7f5-34b3e88b7a0a +# your code here + +# ╔═║ c530210e-3b23-4bca-9545-f5103dc12ac1 +let + if @isdefined tri_area + tri = [[0, 0], [2, 0], [1, 2]] + area_true = 2.0 + try + area_test = tri_area(tri) + if area_test β‰ˆ area_true + correct() + else + almost(md"`tri_area` has incorrect behavior: it returns $(string(area_test)) instead of $(string(area_true)) for triangle $(string(tri))") + end + catch e + almost(md"`tri_area` throws a $(typeof(e)) for triangle $(string(tri))") + end + else + danger(md"You need to define `tri_area`") + end +end + +# ╔═║ 23118279-848b-4c41-ad8c-b6c9ec02aa24 +md""" +## Problem 1(b) - Triangle centroid +""" + +# ╔═║ 60891f19-7d8f-45f6-8ccc-eec6e3b3ab99 +md""" +Write a function `tri_centroid(tri)` which returns the centroid of `tri` (). +""" + +# ╔═║ ba70581b-586f-40c2-b4b6-c363e11b6f0b +# your code here + +# ╔═║ 873ab900-4f1d-4c17-800f-f4fe5992d22c +let + if @isdefined tri_centroid + tri = [[0, 0], [2, 0], [1, 2]] + centroid_true = [1.0, 2/3] + try + centroid_test = tri_centroid(tri) + if centroid_test β‰ˆ centroid_true + correct() + else + almost(md"`tri_centroid` has incorrect behavior: it returns $(string(centroid_test)) instead of $(string(centroid_true)) for triangle $(string(tri))") + end + catch e + almost(md"`tri_centroid` throws a $(typeof(e)) for triangle $(string(tri))") + end + else + danger(md"You need to define `tri_centroid`") + end +end + +# ╔═║ 1480f942-7f7b-4941-915b-1b2e181ebd0e +md""" +## Problem 1(c) - Triangle circumcenter +""" + +# ╔═║ b246b85b-c5c8-4520-9791-fe59cb7a6680 +md""" +Write a function `tri_circumcenter(tri)` which returns the circumcenter of `tri` (). +""" + +# ╔═║ f26dea84-143a-4a7d-84f0-256c501f3868 +# your code here + +# ╔═║ 7f869e49-fc9f-4735-8e56-2ec2a0a13239 +let + if @isdefined tri_circumcenter + tri = [[0, 0], [2, 0], [1, 2]] + circumcenter_true = [1.0, 3/4] + try + circumcenter_test = tri_circumcenter(tri) + if circumcenter_test β‰ˆ circumcenter_true + correct() + else + almost(md"`tri_circumcenter` has incorrect behavior: it returns $(string(circumcenter_test)) instead of $(string(circumcenter_true)) for triangle $(string(tri))") + end + catch e + almost(md"`tri_circumcenter` throws a $(typeof(e)) for triangle $(string(tri))") + end + else + danger(md"You need to define `tri_circumcenter`") + end +end + +# ╔═║ 58d8b6e2-8727-497a-af0e-f91cc36d7058 +md""" +## Problem 2 - Point in polygon +""" + +# ╔═║ 7f60f785-c245-42c3-b116-182ce5726d5d +md""" +Write a function `inpolygon(p, pv)` which determines if a point `p` is inside the closed polygon `pv`. For example, in the test polygon above, the point $(0.6,0.3)$ is inside but $(0.8,0.3)$ is outside. For the algorithm, use the "Crossing number method" as described here: . +""" + +# ╔═║ bdab2827-8f1b-46b8-b096-116e856ba5af +# your code here + +# ╔═║ a52445b4-8bdc-4eea-889e-764c6acb927e +let + if @isdefined inpolygon + pv = [[0, 0], [1, 0], [0.5, 0.5], [1, 1], [0, 1], [0, 0]] + x = (-0.15):0.2:1.15 + p = [[xx, 0.275 + 0.5 * xx] for xx in x] + inside_true = [false, true, true, true, false, false, false] + try + inside_test = inpolygon.(p, [pv]) + if inside_test β‰ˆ inside_true + correct() + else + almost(md"`inpolygon` has incorrect behavior: it returns $(string(inside_test)) instead of $(string(inside_true)) for points $(string(p)) and polygon $(string(pv))") + end + catch e + almost(md"`inpolygon` throws a $(typeof(e)) for points $(string(p)) and polygon $(string(pv))") + end + else + danger(md"You need to define `inpolygon`") + end +end + +# ╔═║ 69b3a61a-678c-40e6-9e5a-7dae0e09e9d0 +md""" +## Problem 3 - Mesh generator +""" + +# ╔═║ 2ab881b1-696c-496c-87eb-5a1acab3e7e1 +md""" +Write a function with the syntax `p,t = pmesh(pv, hmax)` which generates a mesh `p,t` of the polygon `pv`, with triangle side lengths approximately `hmax`. Follow the algorithm as described below. + +(a) The input `pv` is an array of points which defines the polygon. Note that the last point is equal to the first (a closed polygon). + +(b) First, create node points `p` along each polygon segment, separated by a distance approximately equal to `hmax`. Make sure not to duplicate any nodes. + +(c) Triangulate the domain using the `delaunay` function. + +(d) Remove the triangles outside the polygon, by computing all the triangle centroids (using `tri_centroid`) and determining if they are inside (using `inpolygon`). + +(e) Find the triangle with largest area $A$ (using `tri_area`). If $A \geq h_\mathrm{max}^2/2$, add the circumcenter of the triangle to the list of node points `p`. + +(f) Repeat steps (c)-(d), that is, re-triangulate and remove outside triangles. + +(g) Repeat steps (e)-(f) until no triangle area $A \geq h_\mathrm{max}^2/2$. +""" + +# ╔═║ cf1e71b6-4eae-4e3f-bcf3-0c5208880f58 +md""" +![mesh_generator.png](https://raw.githubusercontent.com/popersson/math124files/main/projects/mesh_generator.png) +""" + +# ╔═║ ba582e51-4eee-4288-9fdd-bce50050fffa +hint(md"Split the algorithm into several independent subfunctions that are easier to check manually.") + +# ╔═║ 5598693b-26e3-4e72-98f1-ef370b92687f +# your code here + +# ╔═║ ec12a793-679a-4cdd-a0d2-e12e18299200 +# and here + +# ╔═║ 450b30be-4e86-4445-a634-6d55572d0e70 +# and maybe here + +# ╔═║ a458b940-e608-4dda-b965-0bd9dfc5eb7e +let + total_area(p,t) = sum((tri_area(p[tt]) for tt in t)) + if @isdefined pmesh + pv3 = [[0, 0], [1, 0], [1, 1], [0, 1], [0, 0]] + try + p31, t31 = pmesh(pv3, 1.5) + p32, t32 = pmesh(pv3, 1.0) + check3 = [ + length(t31) == 2, + length(t32) == 4, + total_area(p31, t31) β‰ˆ 1.0, + total_area(p32, t32) β‰ˆ 1.0, + ] + if all(check3) + correct() + else + almost(md"`mesh` has incorrect behavior") + end + catch e + almost(md"`pmesh` throws a $(typeof(e)) for polygon $(string(pv3)) and max side length $(1.5) or $(1.0)") + end + else + danger(md"You need to define `pmesh`") + end +end + +# ╔═║ d5362c93-fdbc-4955-849b-ddb0aa070162 +md""" +## Test cases +""" + +# ╔═║ 5642bc7f-c0a4-4863-890b-14b535219b6a +md""" +Run the cases below to test your mesh generator. +""" + +# ╔═║ 015dd5a3-620f-4bc6-9cd4-f363eb9910a4 +let + # The polygon in the examples + pv1 = [[0, 0], [1, 0], [0.5, 0.5], [1, 1], [0, 1], [0, 0]] + p1, t1 = pmesh(pv1, 0.2) + tplot(p1,t1) +end + +# ╔═║ fa7047ef-4144-40d2-9b54-ea85f0d5aef9 +let + # A more complex shape + pv2 = [[i/10,0.1*(-1)^i] for i = 0:10] + append!(pv2, [[.5,.6], [0,.1]]) + p2,t2 = pmesh(pv2, 0.1) + tplot(p2,t2) +end + +# ╔═║ 00000000-0000-0000-0000-000000000001 +PLUTO_PROJECT_TOML_CONTENTS = """ +[deps] +Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" +PlutoTeachingTools = "661c6b06-c737-4d37-b85c-46df65de6f69" +PlutoUI = "7f904dfe-b85e-4ff6-b463-dae2292396a8" +Triangulate = "f7e6ffb2-c36d-4f8f-a77e-16e897189344" + +[compat] +Plots = "~1.33.0" +PlutoTeachingTools = "~0.2.3" +PlutoUI = "~0.7.43" +Triangulate = "~2.1.3" +""" + +# ╔═║ 00000000-0000-0000-0000-000000000002 +PLUTO_MANIFEST_TOML_CONTENTS = """ +# This file is machine-generated - editing it directly is not advised + +julia_version = "1.8.2" +manifest_format = "2.0" +project_hash = "6c3c95e67ea9cfc3fa7585d66974aecf7ba644b9" + +[[deps.AbstractPlutoDingetjes]] +deps = ["Pkg"] +git-tree-sha1 = "8eaf9f1b4921132a4cff3f36a1d9ba923b14a481" +uuid = "6e696c72-6542-2067-7265-42206c756150" +version = "1.1.4" + +[[deps.ArgTools]] +uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" +version = "1.1.1" + +[[deps.Artifacts]] +uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" + +[[deps.Base64]] +uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" + +[[deps.BitFlags]] +git-tree-sha1 = "84259bb6172806304b9101094a7cc4bc6f56dbc6" +uuid = "d1d4a3ce-64b1-5f1a-9ba4-7e7e69966f35" +version = "0.1.5" + +[[deps.Bzip2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "19a35467a82e236ff51bc17a3a44b69ef35185a2" +uuid = "6e34b625-4abd-537c-b88f-471c36dfa7a0" +version = "1.0.8+0" + +[[deps.Cairo_jll]] +deps = ["Artifacts", "Bzip2_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.ChainRulesCore]] +deps = ["Compat", "LinearAlgebra", "SparseArrays"] +git-tree-sha1 = "dc4405cee4b2fe9e1108caec2d760b7ea758eca2" +uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" +version = "1.15.5" + +[[deps.ChangesOfVariables]] +deps = ["ChainRulesCore", "LinearAlgebra", "Test"] +git-tree-sha1 = "38f7a08f19d8810338d4f5085211c7dfa5d5bdd8" +uuid = "9e997f8a-9a97-42d5-a9f1-ce6bfc15e2c0" +version = "0.1.4" + +[[deps.CodeTracking]] +deps = ["InteractiveUtils", "UUIDs"] +git-tree-sha1 = "1833bda4a027f4b2a1c984baddcf755d77266818" +uuid = "da1fd8a2-8d9e-5ec2-8556-3022fb5608a2" +version = "1.1.0" + +[[deps.CodecZlib]] +deps = ["TranscodingStreams", "Zlib_jll"] +git-tree-sha1 = "ded953804d019afa9a3f98981d99b33e3db7b6da" +uuid = "944b1d66-785c-5afd-91f1-9de20f533193" +version = "0.7.0" + +[[deps.ColorSchemes]] +deps = ["ColorTypes", "ColorVectorSpace", "Colors", "FixedPointNumbers", "Random"] +git-tree-sha1 = "1fd869cc3875b57347f7027521f561cf46d1fcd8" +uuid = "35d6a980-a343-548e-a6ea-1d62b119f2f4" +version = "3.19.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", "SpecialFunctions", "Statistics", "TensorCore"] +git-tree-sha1 = "d08c20eef1f2cbc6e60fd3612ac4340b89fea322" +uuid = "c3611d14-8923-5661-9e6a-0046d554d3a4" +version = "0.9.9" + +[[deps.Colors]] +deps = ["ColorTypes", "FixedPointNumbers", "Reexport"] +git-tree-sha1 = "417b0ed7b8b838aa6ca0a87aadf1bb9eb111ce40" +uuid = "5ae59095-9a9b-59fe-a467-6f913c188581" +version = "0.12.8" + +[[deps.Compat]] +deps = ["Dates", "LinearAlgebra", "UUIDs"] +git-tree-sha1 = "5856d3031cdb1f3b2b6340dfdc66b6d9a149a374" +uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" +version = "4.2.0" + +[[deps.CompilerSupportLibraries_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" +version = "0.5.2+0" + +[[deps.Contour]] +git-tree-sha1 = "d05d9e7b7aedff4e5b51a029dced05cfb6125781" +uuid = "d38c429a-6771-53c6-b99e-75d170b6e991" +version = "0.6.2" + +[[deps.DataAPI]] +git-tree-sha1 = "1106fa7e1256b402a86a8e7b15c00c85036fef49" +uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a" +version = "1.11.0" + +[[deps.DataStructures]] +deps = ["Compat", "InteractiveUtils", "OrderedCollections"] +git-tree-sha1 = "d1fff3a548102f48987a52a2e0d114fa97d730f0" +uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" +version = "0.18.13" + +[[deps.Dates]] +deps = ["Printf"] +uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" + +[[deps.DelimitedFiles]] +deps = ["Mmap"] +uuid = "8bb1440f-4735-579b-a4ab-409b98df4dab" + +[[deps.Distributed]] +deps = ["Random", "Serialization", "Sockets"] +uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" + +[[deps.DocStringExtensions]] +deps = ["LibGit2"] +git-tree-sha1 = "b19534d1895d702889b219c382a6e18010797f0b" +uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" +version = "0.8.6" + +[[deps.Downloads]] +deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] +uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" +version = "1.6.0" + +[[deps.Expat_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "bad72f730e9e91c08d9427d5e8db95478a3c323d" +uuid = "2e619515-83b5-522b-bb60-26c02a35a201" +version = "2.4.8+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", "Pkg", "Zlib_jll", "libaom_jll", "libass_jll", "libfdk_aac_jll", "libvorbis_jll", "x264_jll", "x265_jll"] +git-tree-sha1 = "74faea50c1d007c85837327f6775bea60b5492dd" +uuid = "b22a6f82-2f65-5046-a5b2-351ab43fb4e5" +version = "4.4.2+2" + +[[deps.FileWatching]] +uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" + +[[deps.FixedPointNumbers]] +deps = ["Statistics"] +git-tree-sha1 = "335bfdceacc84c5cdf16aadc768aa5ddfc5383cc" +uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" +version = "0.8.4" + +[[deps.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.FreeType2_jll]] +deps = ["Artifacts", "Bzip2_jll", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] +git-tree-sha1 = "87eb71354d8ec1a96d4a7636bd57a7347dde3ef9" +uuid = "d7e528f0-a631-5988-bf34-fe36492bcfd7" +version = "2.10.4+0" + +[[deps.FriBidi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "aa31987c2ba8704e23c6c8ba8a4f769d5d7e4f91" +uuid = "559328eb-81f9-559d-9380-de523a88c83c" +version = "1.0.10+0" + +[[deps.GLFW_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libglvnd_jll", "Pkg", "Xorg_libXcursor_jll", "Xorg_libXi_jll", "Xorg_libXinerama_jll", "Xorg_libXrandr_jll"] +git-tree-sha1 = "d972031d28c8c8d9d7b41a536ad7bb0c2579caca" +uuid = "0656b61e-2033-5cc2-a64a-77c0f6c09b89" +version = "3.3.8+0" + +[[deps.GR]] +deps = ["Base64", "DelimitedFiles", "GR_jll", "HTTP", "JSON", "Libdl", "LinearAlgebra", "Pkg", "Printf", "Random", "RelocatableFolders", "Serialization", "Sockets", "Test", "UUIDs"] +git-tree-sha1 = "cf0a9940f250dc3cb6cc6c6821b4bf8a4286cf9c" +uuid = "28b8d3ca-fb5f-59d9-8090-bfdbd6d07a71" +version = "0.66.2" + +[[deps.GR_jll]] +deps = ["Artifacts", "Bzip2_jll", "Cairo_jll", "FFMPEG_jll", "Fontconfig_jll", "GLFW_jll", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Libtiff_jll", "Pixman_jll", "Pkg", "Qt5Base_jll", "Zlib_jll", "libpng_jll"] +git-tree-sha1 = "0eb5ef6f270fb70c2d83ee3593f56d02ed6fc7ff" +uuid = "d2c73de3-f751-5644-a686-071e5b155ba9" +version = "0.68.0+0" + +[[deps.Gettext_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Libiconv_jll", "Pkg", "XML2_jll"] +git-tree-sha1 = "9b02998aba7bf074d14de89f9d37ca24a1a0b046" +uuid = "78b55507-aeef-58d4-861c-77aaff3498b1" +version = "0.21.0+0" + +[[deps.Glib_jll]] +deps = ["Artifacts", "Gettext_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Libiconv_jll", "Libmount_jll", "PCRE_jll", "Pkg", "Zlib_jll"] +git-tree-sha1 = "a32d672ac2c967f3deb8a81d828afc739c838a06" +uuid = "7746bdde-850d-59dc-9ae8-88ece973131d" +version = "2.68.3+2" + +[[deps.Graphite2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "344bf40dcab1073aca04aa0df4fb092f920e4011" +uuid = "3b182d85-2403-5c21-9c21-1e1f0cc25472" +version = "1.3.14+0" + +[[deps.Grisu]] +git-tree-sha1 = "53bb909d1151e57e2484c3d1b53e19552b887fb2" +uuid = "42e2da0e-8278-4e71-bc24-59509adca0fe" +version = "1.0.2" + +[[deps.HTTP]] +deps = ["Base64", "CodecZlib", "Dates", "IniFile", "Logging", "LoggingExtras", "MbedTLS", "NetworkOptions", "OpenSSL", "Random", "SimpleBufferStream", "Sockets", "URIs", "UUIDs"] +git-tree-sha1 = "4abede886fcba15cd5fd041fef776b230d004cee" +uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3" +version = "1.4.0" + +[[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.Hyperscript]] +deps = ["Test"] +git-tree-sha1 = "8d511d5b81240fc8e6802386302675bdf47737b9" +uuid = "47d2ed2b-36de-50cf-bf87-49c2cf4b8b91" +version = "0.0.4" + +[[deps.HypertextLiteral]] +deps = ["Tricks"] +git-tree-sha1 = "c47c5fa4c5308f27ccaac35504858d8914e102f9" +uuid = "ac1192a8-f4b3-4bfe-ba22-af5b92cd3ab2" +version = "0.9.4" + +[[deps.IOCapture]] +deps = ["Logging", "Random"] +git-tree-sha1 = "f7be53659ab06ddc986428d3a9dcc95f6fa6705a" +uuid = "b5f81e59-6552-4d32-b1f0-c071b021bf89" +version = "0.2.2" + +[[deps.IniFile]] +git-tree-sha1 = "f550e6e32074c939295eb5ea6de31849ac2c9625" +uuid = "83e8ac13-25f8-5344-8a64-a9f2b223428f" +version = "0.5.1" + +[[deps.InteractiveUtils]] +deps = ["Markdown"] +uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" + +[[deps.InverseFunctions]] +deps = ["Test"] +git-tree-sha1 = "b3364212fb5d870f724876ffcd34dd8ec6d98918" +uuid = "3587e190-3f89-42d0-90ee-14403ec27112" +version = "0.1.7" + +[[deps.IrrationalConstants]] +git-tree-sha1 = "7fd44fd4ff43fc60815f8e764c0f352b83c49151" +uuid = "92d709cd-6900-40b7-9082-c6be49f344b6" +version = "0.1.1" + +[[deps.JLLWrappers]] +deps = ["Preferences"] +git-tree-sha1 = "abc9885a7ca2052a736a600f7fa66209f96506e1" +uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" +version = "1.4.1" + +[[deps.JSON]] +deps = ["Dates", "Mmap", "Parsers", "Unicode"] +git-tree-sha1 = "3c837543ddb02250ef42f4738347454f95079d4e" +uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" +version = "0.21.3" + +[[deps.JpegTurbo_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "b53380851c6e6664204efb2e62cd24fa5c47e4ba" +uuid = "aacddb02-875f-59d6-b918-886e6ef4fbf8" +version = "2.1.2+0" + +[[deps.JuliaInterpreter]] +deps = ["CodeTracking", "InteractiveUtils", "Random", "UUIDs"] +git-tree-sha1 = "0f960b1404abb0b244c1ece579a0ec78d056a5d1" +uuid = "aa1ae85d-cabe-5617-a682-6adf51b2e16a" +version = "0.9.15" + +[[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.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 = "f2355693d6778a178ade15952b7ac47a4ff97996" +uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" +version = "1.3.0" + +[[deps.Latexify]] +deps = ["Formatting", "InteractiveUtils", "LaTeXStrings", "MacroTools", "Markdown", "OrderedCollections", "Printf", "Requires"] +git-tree-sha1 = "ab9aa169d2160129beb241cb2750ca499b4e90e9" +uuid = "23fbe1c1-3f47-55db-b15f-69d7ec21a316" +version = "0.15.17" + +[[deps.LibCURL]] +deps = ["LibCURL_jll", "MozillaCACerts_jll"] +uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" +version = "0.6.3" + +[[deps.LibCURL_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] +uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" +version = "7.84.0+0" + +[[deps.LibGit2]] +deps = ["Base64", "NetworkOptions", "Printf", "SHA"] +uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" + +[[deps.LibSSH2_jll]] +deps = ["Artifacts", "Libdl", "MbedTLS_jll"] +uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" +version = "1.10.2+0" + +[[deps.Libdl]] +uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" + +[[deps.Libffi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "0b4a5d71f3e5200a7dff793393e09dfc2d874290" +uuid = "e9f186c6-92d2-5b65-8a66-fee21dc1b490" +version = "3.2.2+1" + +[[deps.Libgcrypt_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgpg_error_jll", "Pkg"] +git-tree-sha1 = "64613c82a59c120435c067c2b809fc61cf5166ae" +uuid = "d4300ac3-e22c-5743-9152-c294e39db1e4" +version = "1.8.7+0" + +[[deps.Libglvnd_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll", "Xorg_libXext_jll"] +git-tree-sha1 = "7739f837d6447403596a75d19ed01fd08d6f56bf" +uuid = "7e76a0d4-f3c7-5321-8279-8d96eeed0f29" +version = "1.3.0+3" + +[[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", "Pkg"] +git-tree-sha1 = "42b62845d70a619f063a7da093d995ec8e15e778" +uuid = "94ce4f54-9a6c-5748-9c1c-f9c7231a4531" +version = "1.16.1+1" + +[[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", "Pkg", "Zlib_jll", "Zstd_jll"] +git-tree-sha1 = "3eb79b0ca5764d4799c06699573fd8f533259713" +uuid = "89763e89-9b03-5906-acba-b20f662cd828" +version = "4.4.0+0" + +[[deps.Libuuid_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "7f3efec06033682db852f8b3bc3c1d2b0a0ab066" +uuid = "38a345b3-de98-5d2b-a5d3-14cd9215e700" +version = "2.36.0+0" + +[[deps.LinearAlgebra]] +deps = ["Libdl", "libblastrampoline_jll"] +uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + +[[deps.LogExpFunctions]] +deps = ["ChainRulesCore", "ChangesOfVariables", "DocStringExtensions", "InverseFunctions", "IrrationalConstants", "LinearAlgebra"] +git-tree-sha1 = "94d9c52ca447e23eac0c0f074effbcd38830deb5" +uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688" +version = "0.3.18" + +[[deps.Logging]] +uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" + +[[deps.LoggingExtras]] +deps = ["Dates", "Logging"] +git-tree-sha1 = "5d4d2d9904227b8bd66386c1138cf4d5ffa826bf" +uuid = "e6f89c97-d47a-5376-807f-9c37f3926c36" +version = "0.4.9" + +[[deps.LoweredCodeUtils]] +deps = ["JuliaInterpreter"] +git-tree-sha1 = "dedbebe234e06e1ddad435f5c6f4b85cd8ce55f7" +uuid = "6f1432cf-f94c-5a45-995e-cdbf5db27b0b" +version = "2.2.2" + +[[deps.MacroTools]] +deps = ["Markdown", "Random"] +git-tree-sha1 = "3d3e902b31198a27340d0bf00d6ac452866021cf" +uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" +version = "0.5.9" + +[[deps.Markdown]] +deps = ["Base64"] +uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" + +[[deps.MbedTLS]] +deps = ["Dates", "MbedTLS_jll", "MozillaCACerts_jll", "Random", "Sockets"] +git-tree-sha1 = "6872f9594ff273da6d13c7c1a1545d5a8c7d0c1c" +uuid = "739be429-bea8-5141-9913-cc70e7f3736d" +version = "1.1.6" + +[[deps.MbedTLS_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" +version = "2.28.0+0" + +[[deps.Measures]] +git-tree-sha1 = "e498ddeee6f9fdb4551ce855a46f54dbd900245f" +uuid = "442fdcdd-2543-5da2-b0f3-8c86c306513e" +version = "0.3.1" + +[[deps.Missings]] +deps = ["DataAPI"] +git-tree-sha1 = "bf210ce90b6c9eed32d25dbcae1ebc565df2687f" +uuid = "e1d29d7a-bbdc-5cf2-9ac0-f12de2c33e28" +version = "1.0.2" + +[[deps.Mmap]] +uuid = "a63ad114-7e13-5084-954f-fe012c677804" + +[[deps.MozillaCACerts_jll]] +uuid = "14a3606d-f60d-562e-9121-12d972cd8159" +version = "2022.2.1" + +[[deps.NaNMath]] +deps = ["OpenLibm_jll"] +git-tree-sha1 = "a7c3d1da1189a1c2fe843a3bfa04d18d20eb3211" +uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" +version = "1.0.1" + +[[deps.NetworkOptions]] +uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" +version = "1.2.0" + +[[deps.Ogg_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "887579a3eb005446d514ab7aeac5d1d027658b8f" +uuid = "e7412a2a-1a6e-54c0-be00-318e2571c051" +version = "1.3.5+1" + +[[deps.OpenBLAS_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] +uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" +version = "0.3.20+0" + +[[deps.OpenLibm_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "05823500-19ac-5b8b-9628-191a04bc5112" +version = "0.8.1+0" + +[[deps.OpenSSL]] +deps = ["BitFlags", "Dates", "MozillaCACerts_jll", "OpenSSL_jll", "Sockets"] +git-tree-sha1 = "fa44e6aa7dfb963746999ca8129c1ef2cf1c816b" +uuid = "4d8831e6-92b7-49fb-bdf8-b643e874388c" +version = "1.1.1" + +[[deps.OpenSSL_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "e60321e3f2616584ff98f0a4f18d98ae6f89bbb3" +uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95" +version = "1.1.17+0" + +[[deps.OpenSpecFun_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "13652491f6856acfd2db29360e1bbcd4565d04f1" +uuid = "efe28fd5-8261-553b-a9e1-b2916fc3738e" +version = "0.5.5+0" + +[[deps.Opus_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "51a08fb14ec28da2ec7a927c4337e4332c2a4720" +uuid = "91d4177d-7536-5919-b921-800302f37372" +version = "1.3.2+0" + +[[deps.OrderedCollections]] +git-tree-sha1 = "85f8e6578bf1f9ee0d11e7bb1b1456435479d47c" +uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" +version = "1.4.1" + +[[deps.PCRE2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "efcefdf7-47ab-520b-bdef-62a2eaa19f15" +version = "10.40.0+0" + +[[deps.PCRE_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "b2a7af664e098055a7529ad1a900ded962bca488" +uuid = "2f80f16e-611a-54ab-bc61-aa92de5b98fc" +version = "8.44.0+0" + +[[deps.Parsers]] +deps = ["Dates"] +git-tree-sha1 = "3d5bf43e3e8b412656404ed9466f1dcbf7c50269" +uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" +version = "2.4.0" + +[[deps.Pixman_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "b4f5d02549a10e20780a24fce72bea96b6329e29" +uuid = "30392449-352a-5448-841d-b1acce4e97dc" +version = "0.40.1+0" + +[[deps.Pkg]] +deps = ["Artifacts", "Dates", "Downloads", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] +uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" +version = "1.8.0" + +[[deps.PlotThemes]] +deps = ["PlotUtils", "Statistics"] +git-tree-sha1 = "8162b2f8547bc23876edd0c5181b27702ae58dce" +uuid = "ccf2f8ad-2431-5c83-bf29-c5338b663b6a" +version = "3.0.0" + +[[deps.PlotUtils]] +deps = ["ColorSchemes", "Colors", "Dates", "Printf", "Random", "Reexport", "SnoopPrecompile", "Statistics"] +git-tree-sha1 = "21303256d239f6b484977314674aef4bb1fe4420" +uuid = "995b91a9-d308-5afd-9ec6-746e21dbc043" +version = "1.3.1" + +[[deps.Plots]] +deps = ["Base64", "Contour", "Dates", "Downloads", "FFMPEG", "FixedPointNumbers", "GR", "JSON", "LaTeXStrings", "Latexify", "LinearAlgebra", "Measures", "NaNMath", "Pkg", "PlotThemes", "PlotUtils", "Printf", "REPL", "Random", "RecipesBase", "RecipesPipeline", "Reexport", "RelocatableFolders", "Requires", "Scratch", "Showoff", "SparseArrays", "Statistics", "StatsBase", "UUIDs", "UnicodeFun", "Unzip"] +git-tree-sha1 = "6062b3b25ad3c58e817df0747fc51518b9110e5f" +uuid = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" +version = "1.33.0" + +[[deps.PlutoHooks]] +deps = ["InteractiveUtils", "Markdown", "UUIDs"] +git-tree-sha1 = "072cdf20c9b0507fdd977d7d246d90030609674b" +uuid = "0ff47ea0-7a50-410d-8455-4348d5de0774" +version = "0.0.5" + +[[deps.PlutoLinks]] +deps = ["FileWatching", "InteractiveUtils", "Markdown", "PlutoHooks", "Revise", "UUIDs"] +git-tree-sha1 = "0e8bcc235ec8367a8e9648d48325ff00e4b0a545" +uuid = "0ff47ea0-7a50-410d-8455-4348d5de0420" +version = "0.1.5" + +[[deps.PlutoTeachingTools]] +deps = ["Downloads", "HypertextLiteral", "LaTeXStrings", "Latexify", "Markdown", "PlutoLinks", "PlutoUI", "Random"] +git-tree-sha1 = "d8be3432505c2febcea02f44e5f4396fae017503" +uuid = "661c6b06-c737-4d37-b85c-46df65de6f69" +version = "0.2.3" + +[[deps.PlutoUI]] +deps = ["AbstractPlutoDingetjes", "Base64", "ColorTypes", "Dates", "Hyperscript", "HypertextLiteral", "IOCapture", "InteractiveUtils", "JSON", "Logging", "Markdown", "Random", "Reexport", "UUIDs"] +git-tree-sha1 = "2777a5c2c91b3145f5aa75b61bb4c2eb38797136" +uuid = "7f904dfe-b85e-4ff6-b463-dae2292396a8" +version = "0.7.43" + +[[deps.Preferences]] +deps = ["TOML"] +git-tree-sha1 = "47e5f437cc0e7ef2ce8406ce1e7e24d44915f88d" +uuid = "21216c6a-2e73-6563-6e65-726566657250" +version = "1.3.0" + +[[deps.Printf]] +deps = ["Unicode"] +uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" + +[[deps.Qt5Base_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Fontconfig_jll", "Glib_jll", "JLLWrappers", "Libdl", "Libglvnd_jll", "OpenSSL_jll", "Pkg", "Xorg_libXext_jll", "Xorg_libxcb_jll", "Xorg_xcb_util_image_jll", "Xorg_xcb_util_keysyms_jll", "Xorg_xcb_util_renderutil_jll", "Xorg_xcb_util_wm_jll", "Zlib_jll", "xkbcommon_jll"] +git-tree-sha1 = "c6c0f690d0cc7caddb74cef7aa847b824a16b256" +uuid = "ea2cea3b-5b76-57ae-a6ef-0a8af62496e1" +version = "5.15.3+1" + +[[deps.REPL]] +deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] +uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" + +[[deps.Random]] +deps = ["SHA", "Serialization"] +uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" + +[[deps.RecipesBase]] +git-tree-sha1 = "6bf3f380ff52ce0832ddd3a2a7b9538ed1bcca7d" +uuid = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" +version = "1.2.1" + +[[deps.RecipesPipeline]] +deps = ["Dates", "NaNMath", "PlotUtils", "RecipesBase"] +git-tree-sha1 = "e7eac76a958f8664f2718508435d058168c7953d" +uuid = "01d81517-befc-4cb6-b9ec-a95719d0359c" +version = "0.6.3" + +[[deps.Reexport]] +git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" +uuid = "189a3867-3050-52da-a836-e630ba90ab69" +version = "1.2.2" + +[[deps.RelocatableFolders]] +deps = ["SHA", "Scratch"] +git-tree-sha1 = "22c5201127d7b243b9ee1de3b43c408879dff60f" +uuid = "05181044-ff0b-4ac5-8273-598c1e38db00" +version = "0.3.0" + +[[deps.Requires]] +deps = ["UUIDs"] +git-tree-sha1 = "838a3a4188e2ded87a4f9f184b4b0d78a1e91cb7" +uuid = "ae029012-a4dd-5104-9daa-d747884805df" +version = "1.3.0" + +[[deps.Revise]] +deps = ["CodeTracking", "Distributed", "FileWatching", "JuliaInterpreter", "LibGit2", "LoweredCodeUtils", "OrderedCollections", "Pkg", "REPL", "Requires", "UUIDs", "Unicode"] +git-tree-sha1 = "dad726963ecea2d8a81e26286f625aee09a91b7c" +uuid = "295af30f-e4ad-537b-8983-00126c2a3abe" +version = "3.4.0" + +[[deps.SHA]] +uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" +version = "0.7.0" + +[[deps.Scratch]] +deps = ["Dates"] +git-tree-sha1 = "f94f779c94e58bf9ea243e77a37e16d9de9126bd" +uuid = "6c6a2e73-6563-6170-7368-637461726353" +version = "1.1.1" + +[[deps.Serialization]] +uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" + +[[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.SnoopPrecompile]] +git-tree-sha1 = "f604441450a3c0569830946e5b33b78c928e1a85" +uuid = "66db9d55-30c0-4569-8b51-7e840670fc0c" +version = "1.0.1" + +[[deps.Sockets]] +uuid = "6462fe0b-24de-5631-8697-dd941f90decc" + +[[deps.SortingAlgorithms]] +deps = ["DataStructures"] +git-tree-sha1 = "b3363d7460f7d098ca0912c69b082f75625d7508" +uuid = "a2af1166-a08f-5f64-846c-94a0d3cef48c" +version = "1.0.1" + +[[deps.SparseArrays]] +deps = ["LinearAlgebra", "Random"] +uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + +[[deps.SpecialFunctions]] +deps = ["ChainRulesCore", "IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"] +git-tree-sha1 = "d75bda01f8c31ebb72df80a46c88b25d1c79c56d" +uuid = "276daf66-3868-5448-9aa4-cd146d93841b" +version = "2.1.7" + +[[deps.Statistics]] +deps = ["LinearAlgebra", "SparseArrays"] +uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" + +[[deps.StatsAPI]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "f9af7f195fb13589dd2e2d57fdb401717d2eb1f6" +uuid = "82ae8749-77ed-4fe6-ae5f-f523153014b0" +version = "1.5.0" + +[[deps.StatsBase]] +deps = ["DataAPI", "DataStructures", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"] +git-tree-sha1 = "d1bf48bfcc554a3761a133fe3a9bb01488e06916" +uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" +version = "0.33.21" + +[[deps.TOML]] +deps = ["Dates"] +uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" +version = "1.0.0" + +[[deps.Tar]] +deps = ["ArgTools", "SHA"] +uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" +version = "1.10.1" + +[[deps.TensorCore]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "1feb45f88d133a655e001435632f019a9a1bcdb6" +uuid = "62fd8b95-f654-4bbd-a8a5-9c27f68ccd50" +version = "0.1.1" + +[[deps.Test]] +deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] +uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[[deps.TranscodingStreams]] +deps = ["Random", "Test"] +git-tree-sha1 = "8a75929dcd3c38611db2f8d08546decb514fcadf" +uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa" +version = "0.9.9" + +[[deps.Triangle_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "bfdd9ef1004eb9d407af935a6f36a4e0af711369" +uuid = "5639c1d2-226c-5e70-8d55-b3095415a16a" +version = "1.6.1+0" + +[[deps.Triangulate]] +deps = ["DocStringExtensions", "Libdl", "Printf", "Test", "Triangle_jll"] +git-tree-sha1 = "796a9c0b02a3414af6065098bb7cf0e88dfa450e" +uuid = "f7e6ffb2-c36d-4f8f-a77e-16e897189344" +version = "2.1.3" + +[[deps.Tricks]] +git-tree-sha1 = "6bac775f2d42a611cdfcd1fb217ee719630c4175" +uuid = "410a4b4d-49e4-4fbc-ab6d-cb71b17b3775" +version = "0.1.6" + +[[deps.URIs]] +git-tree-sha1 = "e59ecc5a41b000fa94423a578d29290c7266fc10" +uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" +version = "1.4.0" + +[[deps.UUIDs]] +deps = ["Random", "SHA"] +uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" + +[[deps.Unicode]] +uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" + +[[deps.UnicodeFun]] +deps = ["REPL"] +git-tree-sha1 = "53915e50200959667e78a92a418594b428dffddf" +uuid = "1cfade01-22cf-5700-b092-accc4b62d6e1" +version = "0.4.1" + +[[deps.Unzip]] +git-tree-sha1 = "ca0969166a028236229f63514992fc073799bb78" +uuid = "41fe7b60-77ed-43a1-b4f0-825fd5a5650d" +version = "0.2.0" + +[[deps.Wayland_jll]] +deps = ["Artifacts", "Expat_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Pkg", "XML2_jll"] +git-tree-sha1 = "3e61f0b86f90dacb0bc0e73a0c5a83f6a8636e23" +uuid = "a2964d1f-97da-50d4-b82a-358c7fce9d89" +version = "1.19.0+0" + +[[deps.Wayland_protocols_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "4528479aa01ee1b3b4cd0e6faef0e04cf16466da" +uuid = "2381bf8a-dfd0-557d-9999-79630e7b1b91" +version = "1.25.0+0" + +[[deps.XML2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Pkg", "Zlib_jll"] +git-tree-sha1 = "58443b63fb7e465a8a7210828c91c08b92132dff" +uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a" +version = "2.9.14+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.Xorg_libX11_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libxcb_jll", "Xorg_xtrans_jll"] +git-tree-sha1 = "5be649d550f3f4b95308bf0183b82e2582876527" +uuid = "4f6342f7-b3d2-589e-9d20-edeb45f2b2bc" +version = "1.6.9+4" + +[[deps.Xorg_libXau_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "4e490d5c960c314f33885790ed410ff3a94ce67e" +uuid = "0c0b7dd1-d40b-584c-a123-a41640f87eec" +version = "1.0.9+4" + +[[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", "Pkg"] +git-tree-sha1 = "4fe47bd2247248125c428978740e18a681372dd4" +uuid = "a3789734-cfe1-5b06-b2d0-1dd0d9d62d05" +version = "1.1.3+4" + +[[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", "Pkg"] +git-tree-sha1 = "6783737e45d3c59a4a4c4091f5f88cdcf0908cbb" +uuid = "14d82f49-176c-5ed1-bb49-ad3f5cbd8c74" +version = "0.1.0+3" + +[[deps.Xorg_libxcb_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "XSLT_jll", "Xorg_libXau_jll", "Xorg_libXdmcp_jll", "Xorg_libpthread_stubs_jll"] +git-tree-sha1 = "daf17f441228e7a3833846cd048892861cff16d6" +uuid = "c7cfdc94-dc32-55de-ac96-5a1b8d977c5b" +version = "1.13.0+3" + +[[deps.Xorg_libxkbfile_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll"] +git-tree-sha1 = "926af861744212db0eb001d9e40b5d16292080b2" +uuid = "cc61e674-0454-545c-8b26-ed2c68acab7a" +version = "1.1.0+4" + +[[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", "Pkg", "Xorg_libxkbfile_jll"] +git-tree-sha1 = "4bcbf660f6c2e714f87e960a171b119d06ee163b" +uuid = "35661453-b289-5fab-8a00-3d9160c6a3a4" +version = "1.4.2+4" + +[[deps.Xorg_xkeyboard_config_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xkbcomp_jll"] +git-tree-sha1 = "5c8424f8a67c3f2209646d4425f3d415fee5931d" +uuid = "33bec58e-1273-512f-9401-5d533626f822" +version = "2.27.0+4" + +[[deps.Xorg_xtrans_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "79c31e7844f6ecf779705fbc12146eb190b7d845" +uuid = "c5fb5394-a638-5e4d-96e5-b29de1b5cf10" +version = "1.4.0+3" + +[[deps.Zlib_jll]] +deps = ["Libdl"] +uuid = "83775a58-1f1d-513f-b197-d71354ab007a" +version = "1.2.12+3" + +[[deps.Zstd_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "e45044cd873ded54b6a5bac0eb5c971392cf1927" +uuid = "3161d3a3-bdf6-5164-811a-617609db77b4" +version = "1.5.2+0" + +[[deps.libaom_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "3a2ea60308f0996d26f1e5354e10c24e9ef905d4" +uuid = "a4ae2306-e953-59d6-aa16-d00cac43593b" +version = "3.4.0+0" + +[[deps.libass_jll]] +deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] +git-tree-sha1 = "5982a94fcba20f02f42ace44b9894ee2b140fe47" +uuid = "0ac62f75-1d6f-5e53-bd7c-93b484bb37c0" +version = "0.15.1+0" + +[[deps.libblastrampoline_jll]] +deps = ["Artifacts", "Libdl", "OpenBLAS_jll"] +uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" +version = "5.1.1+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.libpng_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] +git-tree-sha1 = "94d180a6d2b5e55e447e2d27a29ed04fe79eb30c" +uuid = "b53b4c65-9356-5827-b1ea-8c7a1a84506f" +version = "1.6.38+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.nghttp2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" +version = "1.48.0+0" + +[[deps.p7zip_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" +version = "17.4.0+0" + +[[deps.x264_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "4fea590b89e6ec504593146bf8b988b2c00922b2" +uuid = "1270edf5-f2f9-52d2-97e9-ab00b5d0237a" +version = "2021.5.5+0" + +[[deps.x265_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "ee567a171cce03570d77ad3a43e90218e38937a9" +uuid = "dfaa095f-4041-5dcd-9319-2fabd8486b76" +version = "3.5.0+0" + +[[deps.xkbcommon_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Wayland_jll", "Wayland_protocols_jll", "Xorg_libxcb_jll", "Xorg_xkeyboard_config_jll"] +git-tree-sha1 = "9ebfc140cc56e8c2156a15ceac2f0302e327ac0a" +uuid = "d8fb68d0-12a3-5cfd-a85a-d49703b185fd" +version = "1.4.1+0" +""" + +# ╔═║ Cell order: +# ╠═67e509c6-cbfe-40e3-96e3-4954d0aa344f +# ╠═59a9011b-1391-44ab-98bf-ccb88cd319ce +# ╠═b9a2c424-8471-4d29-a2e8-3fcb0ff531eb +# ╠═5cf9c957-3fde-42c2-a85c-0f12380f3a07 +# β•Ÿβ”€9c10d887-d3e3-40c1-82cd-0c8f66706b41 +# β•Ÿβ”€2ff2d514-5133-4f97-917f-b694bfdf83bb +# ╠═692b826a-891d-4d35-b817-4c97f3dd3157 +# ╠═0311fa83-fd2f-417d-8720-22281e26cb9e +# β•Ÿβ”€4c16b233-aefb-4107-b738-d0286b580785 +# β•Ÿβ”€edd25cc0-be79-49b4-ab82-41beaed7c4be +# ╠═287c7f0e-7dea-4871-83c3-dc61d209c84a +# β•Ÿβ”€c147e761-edeb-48b2-828c-aeecaa430dbd +# ╠═16986c48-4b75-4ea7-9199-a694568641be +# β•Ÿβ”€32f40b13-6b91-42af-af78-097e941e6f83 +# β•Ÿβ”€b8af47fe-ff27-4fdf-86a3-bb3c654524b7 +# ╠═6a89cedb-64d3-4b67-a83b-ac578c19f7ea +# β•Ÿβ”€a44ea06a-1dba-4b2a-83ea-68fad90f60de +# β•Ÿβ”€b18ede94-fdd4-4668-a42f-e6317f518389 +# ╠═33b9ea90-d280-4d9a-a7f5-34b3e88b7a0a +# β•Ÿβ”€c530210e-3b23-4bca-9545-f5103dc12ac1 +# β•Ÿβ”€23118279-848b-4c41-ad8c-b6c9ec02aa24 +# β•Ÿβ”€60891f19-7d8f-45f6-8ccc-eec6e3b3ab99 +# ╠═ba70581b-586f-40c2-b4b6-c363e11b6f0b +# β•Ÿβ”€873ab900-4f1d-4c17-800f-f4fe5992d22c +# β•Ÿβ”€1480f942-7f7b-4941-915b-1b2e181ebd0e +# β•Ÿβ”€b246b85b-c5c8-4520-9791-fe59cb7a6680 +# ╠═f26dea84-143a-4a7d-84f0-256c501f3868 +# β•Ÿβ”€7f869e49-fc9f-4735-8e56-2ec2a0a13239 +# β•Ÿβ”€58d8b6e2-8727-497a-af0e-f91cc36d7058 +# β•Ÿβ”€7f60f785-c245-42c3-b116-182ce5726d5d +# ╠═bdab2827-8f1b-46b8-b096-116e856ba5af +# β•Ÿβ”€a52445b4-8bdc-4eea-889e-764c6acb927e +# β•Ÿβ”€69b3a61a-678c-40e6-9e5a-7dae0e09e9d0 +# β•Ÿβ”€2ab881b1-696c-496c-87eb-5a1acab3e7e1 +# β•Ÿβ”€cf1e71b6-4eae-4e3f-bcf3-0c5208880f58 +# β•Ÿβ”€ba582e51-4eee-4288-9fdd-bce50050fffa +# ╠═5598693b-26e3-4e72-98f1-ef370b92687f +# ╠═ec12a793-679a-4cdd-a0d2-e12e18299200 +# ╠═450b30be-4e86-4445-a634-6d55572d0e70 +# β•Ÿβ”€a458b940-e608-4dda-b965-0bd9dfc5eb7e +# β•Ÿβ”€d5362c93-fdbc-4955-849b-ddb0aa070162 +# β•Ÿβ”€5642bc7f-c0a4-4863-890b-14b535219b6a +# ╠═015dd5a3-620f-4bc6-9cd4-f363eb9910a4 +# ╠═fa7047ef-4144-40d2-9b54-ea85f0d5aef9 +# β•Ÿβ”€00000000-0000-0000-0000-000000000001 +# β•Ÿβ”€00000000-0000-0000-0000-000000000002 diff --git a/homeworks_old/hw4.jl b/homeworks_old/hw4.jl new file mode 100644 index 0000000..0eb07e0 --- /dev/null +++ b/homeworks_old/hw4.jl @@ -0,0 +1,3368 @@ +### A Pluto.jl notebook ### +# v0.19.13 + +#> [frontmatter] +#> title = "HW4 - Callable structs & ODEs" +#> date = "2022-10-15" + +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 + +# ╔═║ b3b707d2-4a5b-11ed-1266-97264478041b +begin + using AbstractTrees + using BenchmarkTools + using CSV + using DataFrames + using Dates + using DifferentialEquations + using ForwardDiff + using Interpolations + using Plots + using PlutoTeachingTools + using PlutoUI +end + +# ╔═║ c6bd612e-21c4-4e2d-91ac-42fe4f611364 +md""" +Homework 4 of the MIT Course [_Julia: solving real-world problems with computation_](https://github.com/mitmath/JuliaComputation) + +Release date: Saturday, Oct 15, 2022 (version 1) + +**Due date: Saturday, Oct 22, 2022 at 11:59pm EST** + +Submission by: Jazzy Doe (jazz@mit.edu) +""" + +# ╔═║ 98f2eed8-89ad-4b5c-9fbd-790e8c322940 +student = (name = "Jazzy Doe", kerberos_id = "jazz") + +# ╔═║ 3b74812e-b8d0-482e-bedf-f49c54a1b92f +md""" +The following cell can take some time to run, so don't freak out and grab a cup of tea. +""" + +# ╔═║ c41ae1ce-2e04-4936-98f0-48c95468743a +PlutoUI.TableOfContents() + +# ╔═║ 866fddf0-7894-4688-9e58-34442fa96b23 +md""" +# HW4: Callable structs and climate modeling +""" + +# ╔═║ 6f764336-6459-4df6-ae4c-839aa8dccac8 +md""" +Section 3 of this homework lets you implement differential equations that are used to predict climate change. +For such temporal evolution problems, we often face a dilemma: the numerical solution we obtain is sampled at discrete instants, and yet it corresponds to a continuous function of time. + +Section 2 shows you how to turn one representation into the other, by exploiting a very elegant feature of Julia: callable structs. + +Section 1 uses callable structs as an excuse to teach you more about types in general, and to give you some important performance tricks. +""" + +# ╔═║ 8d740a6f-f809-4171-b4fd-615cd0faaa99 +md""" +# 1. More on types & performance +""" + +# ╔═║ 401d487a-b297-41fd-9719-2b76cc9d1385 +md""" +Consider this section as a warm up with lots of useful Julia-related tips. +It does not have a direct connection to climate modeling, but at the end, you will be able to write your first neural network from scratch and apply automatic differentiation on it. +How about that! +""" + +# ╔═║ fd240f6c-fee4-4300-89ae-6372e671da43 +md""" +## 1.0 Abstract and concrete types +""" + +# ╔═║ 949c2c07-8ee0-4294-8839-7353d4db213b +md""" +Remember from HW1 that Julia has a type hierarchy with two ingredients: abstract types and concrete types. +Concrete types (like `Float64` or `Int`) are the ones that you can actually instantiate, while abstract types (like `Real` or `Number`) serve to define generic methods for several concrete types at once. +""" + +# ╔═║ 41141c4e-c331-41a6-8165-3547da5e8d07 +md""" +Why does the difference matter? +Because with a concrete type, the memory layout of the object is well specified. +If the compiler knows it will work on `Float64` numbers, it can generate very efficient code that is taylored to this representation. +But if the compiler only knows it will work on `Real` numbers, then it must generate a very clunky code that works for all possible subtypes of real numbers: integers, rationals, floating point, etc. +""" + +# ╔═║ 90c072fe-8013-48f8-9a7e-4c81e2708fe3 +md""" +It is very simple to check whether you are dealing with an abstract or concrete type. +""" + +# ╔═║ 7cb286ce-da0c-4058-90ee-144f85b68315 +isconcretetype(Float64), isconcretetype(Real) + +# ╔═║ 4c6877be-4fcd-4e15-b1f5-4569209a3f39 +md""" +Since multiple subtyping / inheritance does not exist in Julia, the type hierarchy can be represented as a tree, with `Any` (the most generic type) as its root. +Abstract types correspond to internal nodes of the tree, while concrete types are the leaves (they have no children). +""" + +# ╔═║ 8a04b937-c501-428c-9a08-f9b59c2066e2 +AbstractTrees.children(x::Type) = subtypes(x) + +# ╔═║ d8b330af-1991-4fb9-a8db-e833c326d173 +print_tree(Real) + +# ╔═║ 04ef7d70-a4a9-4d9f-add0-7b22aeb28b79 +md""" +You can explore the relations between types with the functions `supertypes` and `subtypes`. +""" + +# ╔═║ c7677c6d-44fd-4bcc-91ef-911a8a513bb6 +subtypes(Real) # gives all the children of a type + +# ╔═║ dd22a20e-5db4-4a97-9572-ccc157c9d592 +supertypes(Float64) # gives the chain of ancestors of a type + +# ╔═║ 23a229b1-dcf2-4803-9bd6-8df2e60ba8f5 +md""" +!!! danger "Task 1.0.1" + Implement a function `count_descendants(T)` which outputs the number of descendants (the node itself + all of its children, grandchildren, etc.) of a type `T` in the type tree. + How many descendants does `Real` have? + Does this number depend on the packages we have imported? +""" + +# ╔═║ 29550224-6f26-4e87-bfe2-e621802cc8d0 + + +# ╔═║ 61c97fd4-c964-4347-90ca-a7e952b02ad6 +let + if @isdefined count_descendants + try + check = count_descendants(Integer) == 17 + if check + correct() + else + almost(md"`count_descendants(Integer)` should be equal to 17") + end + catch e + almost(md"`count_descendants(Integer)` throws an error") + end + else + almost(md"You need to define `count_descendants`") + end +end + +# ╔═║ 29c9d2bc-3e90-4558-8e81-7b979be68d2b +md""" +## 1.1 Callable structs +""" + +# ╔═║ e831ff8c-93fc-437b-a5da-338fb37a8ac8 +md""" +By now, you know how to define functions in Julia, using the syntax below. +""" + +# ╔═║ f90e05ad-2c19-40dd-952e-bb9ca485aeef +function my_identity(x) + return x +end + +# ╔═║ d74a5724-def9-4c87-9fee-23544dc7b745 +md""" +!!! danger "Task 1.1.1" + What is the type of `my_identity`? What are its supertypes? +""" + +# ╔═║ c03c8cc6-36d8-4102-a737-885e1a838ca2 + + +# ╔═║ cb502def-3d5c-46cb-b921-549a44d4dc9c +md""" +Functions are just a particular kind of callable object (or "functor"). +But as it turns out, every type can be made callable using a very simple trick: just define a function whose "name" is an instance of the type. +This is very useful when you want to perform operations with some internal parameters (like weights in a neural network, see below). +""" + +# ╔═║ 02656905-39a5-45ca-ab90-4450147be7e2 +md""" +Here's a simple example, in which we define a `Multiplier` struct with a single attribute `a`. +When we call an instance `mult` of this type on a value `x`, we want to obtain the product `mult.a * x`. +""" + +# ╔═║ 74be726b-51a1-4ea3-8124-8cd3dcf3519d +begin + struct Multiplier + a + end + + function (mult::Multiplier)(x) + return mult.a * x + end +end + +# ╔═║ b9194069-682c-4f66-94d3-64d3c85a89cf +md""" +Note that we put both definitions in the same cell because of Pluto quirks. +Now let's check that everything works as intended. +""" + +# ╔═║ 8bc9e29d-873c-4866-b8ac-814bcef8da16 +let + scalar_mult = Multiplier(2.0) + ( + scalar_mult(3), + scalar_mult(4 + 5im), + scalar_mult(6 * ones(2, 2)) + ) +end + +# ╔═║ 8e49c403-73e2-4011-ae06-1c20a3aa9157 +let + matrix_mult = Multiplier([1 2; 3 4]) + ( + matrix_mult(3), + matrix_mult(4 + 5im), + matrix_mult(6 * ones(2, 2)) + ) +end + +# ╔═║ 0f2b0835-264d-412a-b53b-2d0d8bd987e1 +md""" +We will encounter callable structs again in Sections 2 and 3, when we discuss time series and solutions to differential equations. +""" + +# ╔═║ 65c11552-7eee-4216-9f39-fe2a63478835 +md""" +!!! danger "Task 1.1.2" + Implement a callable struct `FunctionWrapper` with a single field `f`. + Whenever it is called, it should simply apply the function `f` to the input arguments. +""" + +# ╔═║ 30bad66b-0021-4bed-af8e-bbffebe2f84d +hint(md"If you want a function to accept any number of positional and keyword arguments, the syntax is `f(args...; kwargs...)`") + +# ╔═║ b53f9a8a-8253-4326-ae8d-41c9c9f349c6 + + +# ╔═║ d4b252e6-5be7-4b93-b678-9a60ee27e67e +let + if @isdefined FunctionWrapper + fw = FunctionWrapper(sin) + fw(1), sin(1) + end +end + +# ╔═║ f093e439-0671-435c-bf08-4622901fc0d8 +let + if @isdefined FunctionWrapper + try + fw = FunctionWrapper(sin) + try + check = fw(1) == sin(1) + if check + correct() + else + almost(md"`FunctionWrapper(sin)(1)` should be equal to`sin(1)`") + end + catch e + almost(md"`FunctionWrapper(sin)(1)` throws an error") + end + catch e + almost(md"`FunctionWrapper(sin)` throws an error") + end + else + almost(md"You need to define `FunctionWrapper`") + end +end + +# ╔═║ 103e3f01-14e0-440e-abde-0f464cb69055 +md""" +## 1.2 Type-stability +""" + +# ╔═║ bf2706b0-7c2e-4829-9667-13d037a258ca +md""" +Remember HW2, when I told you that there were more secrets to writing high-perfomance Julia code? +Well, today is your lucky day, because I'm going to teach you about type stability. +Yay! + +Type inference is the process by which Julia tries to deduce the type of every variable in your code before actually running it. +A code that enables successful type inference is called type-stable. + +For each function you write, can you deduce the type of every intermediate and output quantity based only on the _types_ (not the _values_) of the inputs? +If the answer is yes, then your code is type-stable. +""" + +# ╔═║ 3d5590db-de13-4b83-8925-3ea1f813a9ec +md""" +!!! danger "Task 1.2.1" + Try to explain why the following function is type-unstable. +""" + +# ╔═║ c4447d2d-cbe8-4146-a886-b8a531445d85 +function choice(x) + if x < 0 + return "negative number" + else + return x + end +end + +# ╔═║ 5b4e99ea-2d3d-4841-b792-7c08dea43110 + + +# ╔═║ 41780c0a-2fb3-4329-a24d-86e5714600b7 +md""" +The `Multiplier` defined above works, but it is far from perfect. +Its biggest fault is that it doesn't "know" the type of the field `a`. +As a result, it generates type-unstable calls because Julia cannot predict the type of the output `a * x`. + +Such problems can often be diagnosed with the `@code_warntype` macro, which is used before a function call. +As a rule of thumb, blue is good and red is bad, while yellow is "meh". +""" + +# ╔═║ c32c2e53-1689-4b9f-9e5e-4f2d7d62f43f +let + a = 2.0 + x = 1.0 + @code_warntype a * x +end + +# ╔═║ b4b96d78-7f6f-4e3a-a711-51782c3a6cda +md""" +This is not easy to read, but what is important is the type of every intermediate quantity is correctly inferred as `Float64`. +""" + +# ╔═║ 86af8c5c-3bc8-4802-a934-22b487f74d2e +let + a = 2.0 + mult = Multiplier(a) + x = 1.0 + @code_warntype mult(x) +end + +# ╔═║ 49b09ba2-a276-430d-8cc1-74efc1a44f6f +md""" +On the other hand, since the type of `mult.a` is forgotten by the `Multiplier`, all we can infer is that it will be of type `Any`, which is a supertype of everything else (see `%1`). +As a consequence, the type of `Body` (which is the output of the function) is also inferred as `Any` (see `%2`). +""" + +# ╔═║ 75e3d3ca-4705-464d-ac26-5dab7116e7cf +md""" +But why is it bad to have type-instability? +Because Julia has to prepare for every possible type, which generates very lengthy and inefficient machine code. +This can be confirmed with the `@code_llvm` macro. +""" + +# ╔═║ e2427de0-bb05-4e97-be61-7ff5eb7bf425 +let + a = 2.0 + x = 1.0 + @code_llvm a * x +end + +# ╔═║ 83b3f372-e366-411f-9b27-58e1d400a57d +md""" +This low-level code is only a few lines long. +""" + +# ╔═║ cb290544-fa39-4766-b332-5c4f99165d29 +let + a = 2.0 + mult = Multiplier(a) + x = 1.0 + @code_llvm mult(x) +end + +# ╔═║ 164737a4-60eb-425a-b608-515067760fcb +md""" +Whereas this one is the stuff of nightmares. +""" + +# ╔═║ efaa6ba6-0ed6-4a9b-8654-77e305297885 +md""" +!!! danger "Task 1.2.2" + Test the type-stability of your `FunctionWrapper`. +""" + +# ╔═║ f1e8f11b-18e6-4d4e-9fa1-1e8dcdc16444 +hint(md"Don't worry if it is not type-stable: that's okay for now.") + +# ╔═║ ebbe26b6-66b4-4c75-8c11-d69aabda0064 + + +# ╔═║ 1dc083e8-be0a-4b71-b898-b0b4f6788d7d +md""" +## 1.3 Parametric types +""" + +# ╔═║ f8f06daa-74aa-4195-8085-23262aa822b8 +md""" +So how do we solve the type-instability issue? +Well, the general idea is to [avoid fields with abstract types](https://docs.julialang.org/en/v1/manual/performance-tips/#Avoid-fields-with-abstract-type) in user-defined structs. +The sames principle applies to [arrays and other containers](https://docs.julialang.org/en/v1/manual/performance-tips/#man-performance-abstract-container). +If the type of each field (or element) is concrete, then type inference suceeds, which leads to better performance. +""" + +# ╔═║ b86fbfea-d1ca-4226-8f01-3c903df66e6f +md""" +Let's see if this criterion is satisfied by our `Multiplier` (spoiler alert: no it isn't). +""" + +# ╔═║ dfd0c11e-f5bb-4cfa-ba09-71dadc7a54e7 +let + scalar_mult = Multiplier(2.0) + fieldnames(typeof(scalar_mult)), fieldtypes(typeof(scalar_mult)) +end + +# ╔═║ 1822a76e-994d-482e-8b60-f07183781f8f +md""" +Of course, the easy way out would be to add a concrete type annotation for the field `a`. +""" + +# ╔═║ d738fc0f-bb2f-437b-9040-4f5ea4867918 +begin + struct SpecificMultiplier + a::Float64 + end + + function (mult::SpecificMultiplier)(x) + return mult.a * x + end +end + +# ╔═║ 608f973b-a502-4e8c-baa8-ce175c3d4688 +let + scalar_mult = SpecificMultiplier(2.0) + ( + scalar_mult(3), + scalar_mult(4 + 5im), + scalar_mult(6 * ones(2, 2)) + ) +end + +# ╔═║ fcc54748-62f9-44f3-9e73-c3da9efe0dc5 +md""" +This time, we can check that our struct has a concrete field type. +""" + +# ╔═║ ab4a8076-21ae-4521-b18e-6cd5f05671da +let + scalar_mult = SpecificMultiplier(2.0) + fieldnames(typeof(scalar_mult)), fieldtypes(typeof(scalar_mult)) +end + +# ╔═║ de549344-4979-425a-bc28-3572a4d9deb1 +md""" +But if we go down that road, we will need a different struct for every possible type of `a`. +That seems a bit tedious, especially since the multiplication code does not change. +What we really need is a single struct that somehow "adapts" to the type of the field `a`. + +You've already seen that kind of construct before, when we introduced arrays. +Vectors and matrices have a "type parameter", which refers to the elements they contain. +""" + +# ╔═║ e13edf4e-0c88-4fb6-8955-1f4099c36761 +typeof([1, 2]), typeof([1.0, 2.0]), typeof([[1, 2]]) + +# ╔═║ 3b4634a0-bcdf-4dff-8d3c-4fe7da7b11d4 +md""" +As a result, `Vector`, `Matrix` and `Array` are called [parametric types](https://docs.julialang.org/en/v1/manual/types/#Parametric-Types). +We can define our own parametric type with the following syntax. +""" + +# ╔═║ 7c28b7f1-0fe6-4022-939c-f478a93b7dac +begin + struct GenericMultiplier{T} + a::T + end + + function (mult::GenericMultiplier)(x) + return mult.a * x + end +end + +# ╔═║ 51cc15b4-c9ec-458f-81d5-b4648b0dd660 +md""" +Every time we create a `GenericMultiplier`, it will automatically choose the right type parameter based on the type of `a`. +""" + +# ╔═║ 41cbc589-ab18-4bba-a374-efdc46e04b3b +typeof(GenericMultiplier(2.0)) + +# ╔═║ 5cbe0f25-baa1-4f78-996d-fa57818448fc +typeof(GenericMultiplier([1 2; 3 4])) + +# ╔═║ e151decd-531a-4b91-9ad1-803fe825d024 +md""" +We can also be picky and specify the parameter ourselves at construction. +""" + +# ╔═║ 9f725037-e90f-4c7d-b4c1-7a3f8cb51f8d +typeof(GenericMultiplier{Matrix{Float64}}([1 2; 3 4])) + +# ╔═║ d433526c-e6fd-4f84-a391-bba29883d893 +md""" +This new struct works as expected, no matter what we throw at it. +""" + +# ╔═║ bbf06920-80bd-4a5d-b937-10d22abc4526 +let + scalar_mult = GenericMultiplier(2.0) + ( + scalar_mult(3), + scalar_mult(4 + 5im), + scalar_mult(6 * ones(2, 2)) + ) +end + +# ╔═║ 32fb7990-93f3-4101-b056-1725a615b495 +let + matrix_mult = GenericMultiplier([1 2; 3 4]) + ( + matrix_mult(3), + matrix_mult(4 + 5im), + matrix_mult(6 * ones(2, 2)) + ) +end + +# ╔═║ 48aee5a5-bad9-4462-a238-9666698ece3f +md""" +Importantly, this generic approach does not prevent type inference. +""" + +# ╔═║ f866ed9e-1a6d-4c9c-a3f6-91c8675aec21 +all(isconcretetype, fieldtypes(GenericMultiplier{Float64})) + +# ╔═║ d84713bf-08b5-4083-98d3-dda9ecc97b00 +let + a = 2.0 + mult = GenericMultiplier(a) + x = 1.0 + @code_warntype mult(x) +end + +# ╔═║ f1c42709-576e-4180-bb8b-a66c31f6c440 +md""" +As a result, the generated machine code is about as efficient as can be. +""" + +# ╔═║ 091ab1b7-ee29-440e-80de-e87eb50739b2 +let + a = 2.0 + mult = GenericMultiplier(a) + x = 1.0 + @code_llvm mult(x) +end + +# ╔═║ ee6e7754-6a8f-4e73-966b-2e09dba67ca3 +md""" +But don't take my word for it, check it yourself! +""" + +# ╔═║ cf61e96a-8e3f-4655-a9aa-85c39da060a3 +md""" +!!! danger "Task 1.3.1" + Compare the performance of `Multiplier`, `SpecificMultiplier` and `GenericMultiplier{T}` with `BenchmarkTools.jl`. +""" + +# ╔═║ aca07c02-db3a-44e4-bb33-73047f726f9d +hint(md" +You already know the `@btime` and `@belapsed` macros, why not try `@benchmark` this time? +And don't forget the dollar signs! +") + +# ╔═║ 5ab1bea3-049e-4765-8323-f9ece4424230 + + +# ╔═║ 64e4786c-1f13-4cf6-a6e6-016b9d595d26 +md""" +In other words, `GenericMultiplier` combines the generic capabilities of `Multiplier` with the type-specific performance of `SpecificMultiplier`. +That is called having your cake and eating it too, which is a Julia specialty. +""" + +# ╔═║ edefd92d-4e63-4f4e-be96-ea9d6c74ab00 +md""" +## 1.4 Type constraints +""" + +# ╔═║ 0c60b420-63d5-4a33-86c2-5dd460b55caa +md""" +In some cases, we want to enforce constraints on the type parameters. +This is done with the `<:` operator, which indicates subtyping. +""" + +# ╔═║ 0b1a6b6a-a376-4a1b-a078-11d879541902 +Float64 <: AbstractFloat <: Real <: Number <: Any + +# ╔═║ 1b9b4c90-ec5d-4342-8451-3d19101ae942 +Int <: Signed <: Integer <: Real <: Number <: Any + +# ╔═║ 6a5b2f84-81eb-48fa-a61e-1f289d5a3535 +md""" +In more complex situations, the subtyping behavior can seem a bit counterintuitive, as described in the documentation for [parametric types](https://docs.julialang.org/en/v1/manual/types/#man-parametric-composite-types). +Even if `T1 <: T2`, we don't have `ParametricType{T1} <: ParametricType{T2}`. +See for yourself. +""" + +# ╔═║ e2bcfb79-a4d5-4c3b-b77d-d2a8f3e42d71 +Vector{Float64} <: Vector{Real} + +# ╔═║ 7404efda-a9ba-40e6-b3c8-f7733d42ad1d +md""" +Here is a way to overcome this difficulty. +""" + +# ╔═║ de0c1b6a-adda-45c2-b1cc-43de3abeda63 +Vector{Float64} <: Vector{<:Real} # note the <: before Real + +# ╔═║ f6f766a7-d859-420f-8c51-0ccb96df75f0 +md""" +And here is another equivalent one, with a keyword you already encountered in HW1. +""" + +# ╔═║ db19c2e4-7f13-4fec-9971-82a6e0268bc3 +Vector{Float64} <: Vector{T} where {T<:Real} + +# ╔═║ 35ce934e-0b06-4d73-a4b1-4a7ad82f1574 +md""" +Now say we want to define a `Multiplier` that only works when `a` is a matrix containing any subtype of real numbers. +Here are several ways to do it. +""" + +# ╔═║ 018a1a45-7ec8-4994-b2dc-c2e3d22074cc +struct MatrixMultiplier1 + a::Matrix{Real} +end + +# ╔═║ b14f9d57-ce80-4920-b680-7034dcd047b8 +struct MatrixMultiplier2 + a::Matrix{<:Real} +end + +# ╔═║ 54348524-df5b-4375-b7ec-fdb3d0126a10 +struct MatrixMultiplier3{T<:Real} + a::Matrix{T} +end + +# ╔═║ 780a8a88-6fce-431d-bcb4-08b3a4ea9985 +struct MatrixMultiplier4{M<:Matrix{Real}} + a::M +end + +# ╔═║ cf10a39a-9187-4923-95ce-a9bf63833a7e +struct MatrixMultiplier5{M<:Matrix{<:Real}} + a::M +end + +# ╔═║ 1429926d-6f98-458d-aafe-7e40a17f17f4 +struct MatrixMultiplier6{T<:Real,M<:Matrix{T}} + a::M +end + +# ╔═║ 9a074f51-00b7-4d31-a885-911a17e7d4d6 +md""" +!!! danger "Task 1.4.1" + Based on our discussion sofar, experiment with these various `MatrixMultiplier` structs and decide which ones a) have the correct behavior with respect to our specification, and b) are type-stable. + + Sum up your answers in the table below. + If you think a given `MatrixMultiplier` is incorrect, provide a code example where it throws an error. + If you think a given `MatrixMultiplier` is type-unstable, provide a code example where `@code_warntype` contains red flags. +""" + +# ╔═║ 6695c9f5-d171-4079-b9c3-284d82623dbd +md""" +| Struct | Correct | Performance | +| --- | --- | --- | +| `MatrixMultiplier1` | yes/no | bad/good | +| `MatrixMultiplier2` | yes/no | bad/good | +| `MatrixMultiplier3` | yes/no | bad/good | +| `MatrixMultiplier4` | yes/no | bad/good | +| `MatrixMultiplier5` | yes/no | bad/good | +| `MatrixMultiplier6` | yes/no | bad/good | +""" + +# ╔═║ 261d51ea-322e-4573-a11c-5b215759fef5 +md""" +## 1.5 Your first neural network +""" + +# ╔═║ ed355794-73f4-4882-8a3c-21f65c7c1114 +md""" +Callable structs come up a lot in deep learning, whenever we construct layers of a [neural network](https://en.wikipedia.org/wiki/Artificial_neural_network). +A neural network layer is a function of the form $x \in \mathbb{R}^n \longmapsto \sigma.(W x + b) \in \mathbb{R}^m$, where +- the matrix $W \in \mathbb{R}^{m \times n}$ contains connection weights +- the vector $b \in \mathbb{R}^m$ contains biases +- the function $\sigma: \mathbb{R} \longrightarrow \mathbb{R}$ is a nonlinear activation applied elementwise +""" + +# ╔═║ 39423543-2d79-4f18-b905-fb20a9a9dee1 +md""" +!!! danger "Task 1.5.1" + Implement a callable struct `Layer` with three fields `W`, `b` and `Οƒ`, such that: + + - `W` must be a matrix containing any subtype of `Real` numbers + - `b` must be a vector containing any subtype of `Real` numbers + - `Οƒ` can be anything. + + Whenever it is called, it should perform the operation described above. +""" + +# ╔═║ 85e63ff9-9a91-40a8-97f1-f7f9eeca3abf + + +# ╔═║ fee314d5-75da-4aa5-8ea9-c6b03f0783c2 +let + if @isdefined Layer + n, m = 3, 4 + W = rand(m, n) + b = rand(m) + Οƒ = tanh + x = rand(n) + layer = Layer(W, b, Οƒ) + layer(x) + end +end + +# ╔═║ d1672de6-d58e-44d3-9d12-2a59f49481a3 +md""" +!!! danger "Task 1.5.2" + Test the type-stability of your `Layer`. +""" + +# ╔═║ 846597f0-6840-4312-84a7-d877aada2589 + + +# ╔═║ 3fff69fd-25f4-4abf-938f-f06d02cfd83e +let + n, m = 3, 4 + W = rand(m, n) + b = rand(m) + Οƒ = tanh + + if @isdefined Layer + try + layer = Layer(W, b, Οƒ) + if all(isconcretetype, fieldtypes(typeof(layer))) + correct() + else + almost(md"The `Layer` struct has abstract field types") + end + catch e + almost(md"The `Layer` constructor throws an error") + end + else + almost(md"You need to define `Layer`") + end +end + +# ╔═║ 0e86e043-c7b0-4015-8cb0-b9d6e1103778 +md""" +A feedforward neural network is just a sequence of layers applied one after the other. +""" + +# ╔═║ d0c9d740-253e-4a5f-9519-a4a476b22319 +md""" +!!! danger "Task 1.5.3" + Implement a callable struct `Network` with a single field `layers`, which is a vector whose elements are all `Layer`s + Whenever it is called, it should apply each layer sequentially. +""" + +# ╔═║ c4ee99b6-dd9e-48b0-8652-8ac52f3082d3 + + +# ╔═║ 24a208e9-e967-4523-97e5-6202e398cdd6 +let + if @isdefined Network + n, m1, m2 = 3, 4, 5 + W1 = rand(m1, n) + b1 = rand(m1) + W2 = rand(m2, m1) + b2 = rand(m2) + Οƒ = tanh + x = rand(n) + + layer1 = Layer(W1, b1, Οƒ) + layer2 = Layer(W2, b2, Οƒ) + network = Network([layer1, layer2]) + network(x) + end +end + +# ╔═║ a77d1576-cd43-4de5-ad5d-e1b3698dcbc8 +let + n, m1, m2 = 3, 4, 5 + W1 = rand(m1, n) + b1 = rand(m1) + W2 = rand(m2, m1) + b2 = rand(m2) + Οƒ = tanh + x = rand(n) + + if (@isdefined Layer) && (@isdefined Network) + try + layer1 = Layer(W1, b1, Οƒ) + layer2 = Layer(W2, b2, Οƒ) + try + network = Network([layer1, layer2]) + try + y = network(x) + check = y β‰ˆ Οƒ.(W2 * Οƒ.(W1 * x + b1) + b2) + if check + correct() + else + almost(md"Calling the `Network` returns an incorrect result") + end + catch e + almost(md"Calling the `Network` throws an error") + end + catch e + almost(md"The `Network` constructor throws an error") + end + catch e + almost(md"The `Layer` constructor throws an error") + end + else + almost(md"You need to define `Layer` and `Network`") + end +end + +# ╔═║ c0a970a3-fd0a-4180-bfba-7537c41e4c78 +md""" +!!! danger "Task 1.5.4" + Test the type-stability of your `Network`. +""" + +# ╔═║ 0767d676-efd0-479c-a551-10463e36b61c + + +# ╔═║ dfe05823-f0ef-4df6-9fa3-0301f4069f56 +let + n, m1, m2 = 3, 4, 5 + W1 = rand(m1, n) + b1 = rand(m1) + W2 = rand(m2, m1) + b2 = rand(m2) + Οƒ = tanh + + if (@isdefined Layer) && (@isdefined Network) + try + layer1 = Layer(W1, b1, Οƒ) + layer2 = Layer(W2, b2, Οƒ) + network = Network([layer1, layer2]) + network.layers + if ( + all(isconcretetype, fieldtypes(typeof(network))) && + all(isconcretetype, fieldtypes(eltype(network.layers))) + ) + correct() + else + almost(md"The `Network` struct has abstract field types") + end + catch e + almost(md"The `Layer` or `Network` constructor throws an error") + end + else + almost(md"You need to define `Layer` and `Network`") + end +end + +# ╔═║ 9fbf0b87-6af8-40ce-952f-05f4d9f89b8c +md""" +Why is it so important to use parametric types? +For one thing, if you remember HW2, it is essential for forward-mode automatic differentiation. +And if you coded your `Layer` properly, the following snippet will work just fine. +""" + +# ╔═║ 48809f4a-1ced-48e9-90cb-b1f27ff83a58 +function loss(W, x) + b = zeros(size(W, 1)) + Οƒ = tanh + layer = Layer(W, b, Οƒ) + y = layer(x) + β„“ = sum(abs2, y) + return β„“ +end + +# ╔═║ 78af5e63-0c95-49b5-9997-da5536a79897 +let + if @isdefined Layer + n, m = 3, 4 + W = rand(m, n) + x = rand(n) + ForwardDiff.gradient(W_ -> loss(W_, x), W) + end +end + +# ╔═║ 49ffc7b2-ffbf-4a8d-a12b-37ab558b7f1c +md""" +# 2. Temperature interpolation +""" + +# ╔═║ f66872a9-5280-44d5-9ef9-1529135e0984 +md""" +We start by downloading a time series of global land and ocean temperature values from . +""" + +# ╔═║ b5470cd4-d8cc-47e5-8167-c03f0f974100 +temp_path = download("https://www.ncei.noaa.gov/cag/global/time-series/globe/land_ocean/12/12/1880-2022/data.csv") + +# ╔═║ 83cc679d-514a-41de-97ce-f9181fd67c70 +md""" +We store this data into two vectors: `temp_years`, which contains the measurement years, and `temp_values`, which contain the temperature anomalies (in Β°C) compared to the 1901-2000 base period. +""" + +# ╔═║ 320fe764-45ce-4f09-bea1-f77cccc11a9b +begin + temp_df = CSV.read(temp_path, DataFrame, header=5, skipto=6) + temp_years = temp_df[!, :Year] # select a column from the dataframe + temp_values = temp_df[!, :Value] +end; + +# ╔═║ 702c37fc-4607-4a72-9ca3-af99d59de028 +md""" +We first give a simple data visualization, and then we use callable structs to make the plot nicer. +""" + +# ╔═║ 07fa38bf-a00d-49cd-bd56-891936cda37a +md""" +## 2.1 Data visualization +""" + +# ╔═║ 5d4b8e42-7e9d-4069-b3f6-28a4c060f117 +md""" +!!! danger "Task 2.1.1" + Try to reproduce the plot from as best you can. + In particular, your plot should be a bar chart, and have the following features: a title, axis labels, different colors for positive and negative anomalies, as well as a legend in the top left corner. +""" + +# ╔═║ 5308dcf7-aa8b-4b23-adec-33564d33c325 +hint(md"Check out the `Plots.jl` [tutorial](https://docs.juliaplots.org/latest/tutorial/)") + +# ╔═║ e5a95033-c389-4023-a02c-d448f1f2bc16 +hint(md"If you want to select a part of an array `x` for plotting, for instance the subset of positive elements, you can create a boolean array with `x .> 0` and then use it for indexing: `x[x .> 0]`") + +# ╔═║ 0d7426e1-620c-4096-906b-a9d1b9088740 + + +# ╔═║ 8e26636f-728b-43f4-9859-82a7734c95a6 +md""" +In the following subsections, the plots should appear automatically as soon as your struct definition is correct. +""" + +# ╔═║ 6f33f798-c0d3-46cd-9dd2-71b8a31bf617 +md""" +## 2.2 Piecewise constant interpolation +""" + +# ╔═║ e25e329e-4481-4b39-b895-93c82f9ea2c3 +md""" +!!! danger "Task 2.2.1" + Implement a callable struct `TemperatureSeriesConstant` with two fields `years` (for a vector of years) and `values` (for a vector of temperature values). + + Whenever it is called on an input `t`, it should find the first year larger than `t` in `years`, and return the corresponding element from `values` +""" + +# ╔═║ 5f8ee73f-d729-4be2-ba20-00f8b453cdd4 +hint(md"You may want to look up the documentation for the function `searchsortedfirst`") + +# ╔═║ 31b05bd7-34e3-4612-9734-916d5a708bc0 + + +# ╔═║ 085a5767-dee5-47e2-9d7c-101c188e92cf +md""" +!!! danger "Task 2.2.2" + Check the type-stability of your `TemperatureSeriesConstant`. +""" + +# ╔═║ b69b8ce2-ff6d-4405-b9db-f9169f5f44ae + + +# ╔═║ f0f3bfe2-dcec-40f6-87c1-a5538c354dd0 +md""" +## 2.3 Linear interpolation +""" + +# ╔═║ 85e93187-d7d5-4023-a243-d9b986f2e0a6 +md""" +!!! danger "Task 2.3.1" + Implement a callable struct `TemperatureSeriesLinear` with the same fields as `TemperatureSeriesConstant`. + + Whenever it is called on an input `t`, it should find the years below and above `t` in `years`, and linearly interpolate the corresponding elements from `values`. +""" + +# ╔═║ 45329aaf-8bff-4381-bf60-ec68515f5e42 +hint(md"Don't worry about boundary conditions, we will make sure not to call this function outside of the safe interval of years") + +# ╔═║ f08ae9c1-8b1b-4f49-ace3-b40b5d4f47bc + + +# ╔═║ 2f2b457e-8f81-4886-8684-b80474676386 +md""" +!!! danger "Task 2.3.2" + Check the type-stability of your `TemperatureSeriesLinear`. +""" + +# ╔═║ eb0eadbe-8b13-4bd8-b65e-4966e4a85f3d + + +# ╔═║ 5aa70c8a-60fe-4bfa-aa1a-68a9204be4eb +md""" +## 2.4 Spline interpolation +""" + +# ╔═║ 539f779e-0d6f-45e0-8e98-a3a1f5a3b50a +md""" +Just for fun, here is what we could obtain if we went beyond a linear interpolation to higher-order (local) polynomials. +""" + +# ╔═║ 92cd9bc2-4757-4495-8c56-2ec5e30e9f06 +md""" +# 3. Differential equations +""" + +# ╔═║ 1e48645c-ffab-4120-baf8-b4dd556330aa +md""" +We now get to the heart of the matter: differential equations for temperature evolution. +""" + +# ╔═║ 21b3a806-696d-45a6-a3dd-8e17f202355e +md""" +## 3.1 The model +""" + +# ╔═║ e9403765-d42a-40aa-8c13-5cc3fc3754b8 +md""" +A simplified model for land and ocean temperature is the following: +```math +C \frac{\mathrm{d} T}{\mathrm{d} t} = B(T_0 - T) + G(t) \quad \text{where} \quad \begin{cases} \text{$C$ is the heat capacity} \\ \text{$B$ is the feedback} \\ \text{$G(t)$ is the effect of greenhouse gases} \end{cases} +``` +""" + +# ╔═║ b9f9f8ca-feeb-4b23-b5ee-f07204cb8daa +md""" +Let's consider a period of $170$ years, starting after the industrial revolution at $t_0 = 1850$, and going all the way to $t_f = 2020$. +""" + +# ╔═║ 8dc428d8-8dab-4143-94b3-56c7d29e95e6 +t0, tf = 1850, 2020 + +# ╔═║ 26694aa3-415a-4ae6-87a3-82a16481f15a +md""" +Here is the climate situation we start with. +""" + +# ╔═║ 4ec83bfa-6d40-4b3f-92d4-79916e9c07ed +begin + COβ‚‚_preindustrial = 280.0 # [ppm] + T_preindustrial = 14.0 # [Β°C] + T_equilibrium = T_preindustrial +end; + +# ╔═║ 5d51ab5a-5cd1-4157-b210-95ad9b96412c +md""" +We give the following default values for the parameters, feel free to play with them! +""" + +# ╔═║ 4a7ce64e-fbad-497c-a7bf-42464815bfd6 +md""" +Heat capacity [Wyr/mΒ²/Β°C]: $(@bind heat_capacity Slider(10:200; default=51, show_value=true)) +""" + +# ╔═║ 3e1ccc36-29bc-4c06-bf38-8197259fe68f +md""" +Feedback [W/mΒ²/Β°C]: $(@bind feedback Slider(0.0:0.1:4.0; default=1.3, show_value=true)) +""" + +# ╔═║ 2f9fad1c-c233-4d41-85f5-dbe76676a073 +md""" +Forcing [W/mΒ²]: $(@bind forcing Slider(0.0:0.1:20.0; default=5.0, show_value=true)) +""" + +# ╔═║ da91aa4a-8516-4f17-9026-21fb323338eb +md""" +We consider the following models for $\text{CO}_2$ emissions and greenhouse effect. +""" + +# ╔═║ d5ca36a4-3467-43e2-b8d2-f367b9d23f45 +COβ‚‚(t) = COβ‚‚_preindustrial * (1 + ((t - t0) / 220)^3) + +# ╔═║ 5a0b53b1-0fc9-4fae-bc65-09dc256f4efa +greenhouse_effect(t) = forcing * log(COβ‚‚(t) / COβ‚‚_preindustrial) + +# ╔═║ 88ba3961-bc7d-4257-a1a4-7d6686e1a583 +md""" +## 3.2 The solver +""" + +# ╔═║ 171aecd0-76e3-4118-bb3b-ac29945ef1b7 +md""" +Even though Julia is a young programming language, its package ecosystem for solving differential equations (and [scientific machine learning](https://sciml.ai/) in general) is easily one of the best. + +Here, we are going to use [`DifferentialEquations.jl`](https://github.com/SciML/DifferentialEquations.jl), which expects a very precise formulation for our model. +We must provide it as +```math +\frac{\mathrm{d} u}{\mathrm{d} t} = f(u, p, t) +``` +where $u$ is the function of interest (in our case the temperature $T$) and $p$ is a set of parameters influencing the dynamics. +""" + +# ╔═║ 7b1e1d6e-8aeb-4503-a619-f69cbbde7025 +md""" +We start by giving an example without greenhouse effect. +""" + +# ╔═║ 6079c292-c38b-4cb9-8e09-e6fed033c42f +function dynamics1(T, p, t) + return inv(heat_capacity) * feedback * (T_equilibrium - T) +end + +# ╔═║ 4dce1ab4-fcf4-4e91-a9f9-f15c784b2501 +md""" +To completely describe the problem, we also need the initial condition and the time interval on which to solve it. +""" + +# ╔═║ 67e283d3-9dd9-468f-97cd-16c0706aca00 +problem1 = ODEProblem(dynamics1, T_preindustrial, (t0, tf)) + +# ╔═║ e232b56e-d4bd-491f-baa0-15c63a7e7c0f +md""" +Once we have a problem, solving it could not be simpler. +""" + +# ╔═║ 711f732d-d6eb-4128-9765-b1580e1238b4 +solution1 = solve(problem1) + +# ╔═║ 2426f0f6-c663-4718-8126-e76a2afce236 +md""" +Now of course that is rather boring, because in this model the starting temperature is also the equilibrium temperature. +""" + +# ╔═║ 097613af-c9da-4285-99f4-56ff325acbbc +md""" +!!! danger "Task 3.2.1" + Implement a new function `dynamics2` which takes the greenhouse effect into account. + Create a `problem2` accordingly, and store the solution in `solution2`. +""" + +# ╔═║ 3b0e364e-e3ea-4c73-8b3a-9b4e4528d8d3 + + +# ╔═║ 26cf28b4-6fe9-4560-be5b-cb8fd2bba414 + + +# ╔═║ a2e7dc49-151d-43fd-a2cf-17d7d83900a6 + + +# ╔═║ 926b3d7c-aea8-4c50-8eb5-0afc2f516af7 +md""" +OK, so now things are happening! +Granted, these are bad things, but at least we're no longer bored. +""" + +# ╔═║ 14fd83e4-3ebb-4445-848d-3c864b0549fe +md""" +## 3.3 Dissecting a solution object +""" + +# ╔═║ e50e6d8d-9bfe-4702-ac72-89d45e6eeb84 +md""" +Time to investigate what this solution object contains. +The first thing to notice is that it has a very complicated type with lots of parameters (thanks Chris!). +""" + +# ╔═║ ab033e74-b244-445a-a9c6-fbcbd441d499 +typeof(solution1) + +# ╔═║ 7d0c71c3-bd47-4e43-abee-ad34db5c5f9e +md""" +So let's try to see what the interesting fields are. +""" + +# ╔═║ 85c86abd-03bc-42c3-a6b4-22e9d5269caa +fieldnames(typeof(solution1)) + +# ╔═║ e10b46dd-bbe1-45fb-9077-f82219e82af0 +md""" +I don't know about you, but I'm mostly interested in checking out `solution.u` (the function values) and `solution.t` (the instants at which these values are computed). +""" + +# ╔═║ 52191ad7-195d-449d-96be-8a25cc674d87 +md""" +!!! danger "Task 3.3.1" + Using the fields mentioned above, create a plot that compares `solution2` with the measurements you studied in Section 2. + Don't forget the title, legend, etc. +""" + +# ╔═║ d49a7c24-887d-4d5d-81a8-ff0d08937189 +hint(md"Section 2 dealt with temperature _anomalies_ wrt to the 20th century. +If you want both time series to be comparable, you need to subtract the 20th century temperature average from `solution2`. +To do that, use the function `mean` on a subvector of `solution2.u`.") + +# ╔═║ f8ad6892-f1f1-4231-82ed-14f4fe3878e7 + + +# ╔═║ 1e398d0c-4b25-4a05-abbc-2d0d6916bd77 +md""" +!!! danger "Task 3.3.2" + In your opinion, why are the temporal instants `solution2.t` not evenly spaced? +""" + +# ╔═║ e018dd21-07e6-4c1d-ad04-9b45d2f991b5 + + +# ╔═║ e080aa6d-2ac8-472f-b3b2-84d454cdb6c4 +md""" +!!! danger "Task 3.3.3" + What happens when you do `plot(solution2)` directly? + Why is it not a scatter plot? + Based on what we have seen sofar in the homework, how can you explain it? +""" + +# ╔═║ 1b66d8d2-f534-4f78-9640-9800eddc0e20 + + +# ╔═║ 9cf65bc1-872c-40c3-9448-255ebaa2b3a3 +md""" +!!! danger "Task 3.3.4" + By playing with the sliders in Section 3.1, figure out the role of the heat capacity, the feedback and the forcing. +""" + +# ╔═║ 1600e9c7-0aa7-4079-94ec-7a2a8b896d1b +hint(md"You can drag the slider cells next to the plots for quicker experiments") + +# ╔═║ 270be245-30c8-4404-ba1c-52646e98742e + + +# ╔═║ 1c98ff24-681f-4c76-ba8a-b89e82eb41e3 +md""" +# Utilities +""" + +# ╔═║ b5726056-d2a8-46f3-bf0f-a5959da92c6d +begin + struct MyFunctionWrapper{F} + f::F + end + + (mfw::MyFunctionWrapper)(args...; kwargs...) = mfw.f(args...; kwargs...) +end + +# ╔═║ fe81dc2e-1f2f-49db-97d9-0faf5c8db8fd +let + n, m = 3, 4 + x = rand(n) + W = rand(m, n) + b = rand(m) + Οƒ = tanh + W_tricky = BigFloat.(W) + b_tricky = BigFloat.(b) + Οƒ_tricky = MyFunctionWrapper(Οƒ) + + if @isdefined Layer + try + layer = Layer(W, b, Οƒ) + Layer(W_tricky, b, Οƒ) + Layer(W, b_tricky, Οƒ) + Layer(W, b, Οƒ_tricky) + try + Layer(b, W, Οƒ) + almost(md"The `Layer` constructor should only accept a matrix for `W` and a vector for `b`") + catch e + try + Layer(Complex.(W), b, Οƒ) + almost(md"The `Layer` constructor should only accept real elements for the matrix `W` and the vector `b`") + catch e + try + output = layer(x) + check = output β‰ˆ Οƒ.(W * x + b) + if check + correct() + else + almost(md"Calling the `Layer` returns an incorrect result") + end + catch e + almost(md"Calling the `Layer` throws an error") + end + end + end + catch e + almost(md"The `Layer` constructor should accept generic element types for `W` and `b`, as well as a generic callable for `Οƒ` (not just a function)") + end + else + almost(md"You need to define `Layer`") + end +end + +# ╔═║ a21dcf25-9321-439c-9e3d-6fcc6fc6909b +begin + struct TemperatureSeriesSpline{Y<:Number,V<:Number,I} + years::Vector{Y} + values::Vector{V} + interp::I + end + + function TemperatureSeriesSpline(years, values) + interp = cubic_spline_interpolation(first(years):last(years), values) + return TemperatureSeriesSpline(years, values, interp) + end + + function (temp::TemperatureSeriesSpline)(t::Number) + return temp.interp(t) + end +end + +# ╔═║ d5f81c9e-930e-4272-8e95-48e2de5f255a +function plot_temperature_series(temp; step=0.1) + times = 1881+step:step:2021-step + values = temp.(times) + colors = ["blue", "red"] + pl = plot( + xlabel="Year", + ylabel="Temperature anomaly [Β°C]", + title="Global warming is real", + legend=:topleft + ) + plot!( + pl, + times, + values, + color=colors[Int.(values .> 0) .+ 1], + label=nothing + ) + return pl +end + +# ╔═║ f6f46184-904c-41f6-8664-2e132ea63287 +let + if @isdefined TemperatureSeriesConstant + temp_constant = TemperatureSeriesConstant(temp_years, temp_values) + plot_temperature_series(temp_constant) + end +end + +# ╔═║ e42ebdbe-e374-4aad-ba0f-46d3a20c3e5f +let + if @isdefined TemperatureSeriesLinear + temp_linear = TemperatureSeriesLinear(temp_years, temp_values) + plot_temperature_series(temp_linear) + end +end + +# ╔═║ 0162de19-4c4c-4aba-9d56-cd7d67e58ef6 +let + temp_spline = TemperatureSeriesSpline(temp_years, temp_values) + plot_temperature_series(temp_spline) +end + +# ╔═║ 00000000-0000-0000-0000-000000000001 +PLUTO_PROJECT_TOML_CONTENTS = """ +[deps] +AbstractTrees = "1520ce14-60c1-5f80-bbc7-55ef81b5835c" +BenchmarkTools = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf" +CSV = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b" +DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" +Dates = "ade2ca70-3891-5945-98fb-dc099432e06a" +DifferentialEquations = "0c46a032-eb83-5123-abaf-570d42b7fbaa" +ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" +Interpolations = "a98d9a8b-a2ab-59e6-89dd-64a1c18fca59" +Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" +PlutoTeachingTools = "661c6b06-c737-4d37-b85c-46df65de6f69" +PlutoUI = "7f904dfe-b85e-4ff6-b463-dae2292396a8" + +[compat] +AbstractTrees = "~0.4.2" +BenchmarkTools = "~1.3.1" +CSV = "~0.10.4" +DataFrames = "~1.4.1" +DifferentialEquations = "~7.5.0" +ForwardDiff = "~0.10.32" +Interpolations = "~0.14.6" +Plots = "~1.35.3" +PlutoTeachingTools = "~0.2.3" +PlutoUI = "~0.7.44" +""" + +# ╔═║ 00000000-0000-0000-0000-000000000002 +PLUTO_MANIFEST_TOML_CONTENTS = """ +# This file is machine-generated - editing it directly is not advised + +julia_version = "1.8.2" +manifest_format = "2.0" +project_hash = "cc1277bb8fd1db37f7efde6a37cfe1490bc7caf5" + +[[deps.AbstractPlutoDingetjes]] +deps = ["Pkg"] +git-tree-sha1 = "8eaf9f1b4921132a4cff3f36a1d9ba923b14a481" +uuid = "6e696c72-6542-2067-7265-42206c756150" +version = "1.1.4" + +[[deps.AbstractTrees]] +git-tree-sha1 = "5c0b629df8a5566a06f5fef5100b53ea56e465a0" +uuid = "1520ce14-60c1-5f80-bbc7-55ef81b5835c" +version = "0.4.2" + +[[deps.Adapt]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "195c5505521008abea5aee4f96930717958eac6f" +uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" +version = "3.4.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 = ["ArrayInterfaceCore", "Compat", "IfElse", "LinearAlgebra", "Static"] +git-tree-sha1 = "d6173480145eb632d6571c148d94b9d3d773820e" +uuid = "4fba245c-0d91-5ea0-9b3e-6abc04ee57a9" +version = "6.0.23" + +[[deps.ArrayInterfaceCore]] +deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"] +git-tree-sha1 = "e9f7992287edfc27b3cbe0046c544bace004ca5b" +uuid = "30b0a656-2188-435a-8636-2ec0e6a096e2" +version = "0.1.22" + +[[deps.ArrayInterfaceGPUArrays]] +deps = ["Adapt", "ArrayInterfaceCore", "GPUArraysCore", "LinearAlgebra"] +git-tree-sha1 = "fc114f550b93d4c79632c2ada2924635aabfa5ed" +uuid = "6ba088a2-8465-4c0a-af30-387133b534db" +version = "0.2.2" + +[[deps.ArrayInterfaceOffsetArrays]] +deps = ["ArrayInterface", "OffsetArrays", "Static"] +git-tree-sha1 = "c49f6bad95a30defff7c637731f00934c7289c50" +uuid = "015c0d05-e682-4f19-8f0a-679ce4c54826" +version = "0.1.6" + +[[deps.ArrayInterfaceStaticArrays]] +deps = ["Adapt", "ArrayInterface", "ArrayInterfaceStaticArraysCore", "LinearAlgebra", "Static", "StaticArrays"] +git-tree-sha1 = "efb000a9f643f018d5154e56814e338b5746c560" +uuid = "b0d46f97-bff5-4637-a19a-dd75974142cd" +version = "0.1.4" + +[[deps.ArrayInterfaceStaticArraysCore]] +deps = ["Adapt", "ArrayInterfaceCore", "LinearAlgebra", "StaticArraysCore"] +git-tree-sha1 = "93c8ba53d8d26e124a5a8d4ec914c3a16e6a0970" +uuid = "dd5226c6-a4d4-4bc7-8575-46859f9c95b9" +version = "0.1.3" + +[[deps.ArrayLayouts]] +deps = ["FillArrays", "LinearAlgebra", "SparseArrays"] +git-tree-sha1 = "9a8017694c92ca097b23b3b43806be560af4c2ce" +uuid = "4c555306-a7a7-4459-81d9-ec55ddd5c99a" +version = "0.8.12" + +[[deps.Artifacts]] +uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" + +[[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", "Random", "SparseArrays"] +git-tree-sha1 = "d37d493a1fc680257f424e656da06f4704c4444b" +uuid = "aae01518-5342-5314-be14-df237901396f" +version = "0.17.7" + +[[deps.Base64]] +uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" + +[[deps.BenchmarkTools]] +deps = ["JSON", "Logging", "Printf", "Profile", "Statistics", "UUIDs"] +git-tree-sha1 = "4c10eee4af024676200bc7752e536f858c6b8f93" +uuid = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf" +version = "1.3.1" + +[[deps.BitFlags]] +git-tree-sha1 = "84259bb6172806304b9101094a7cc4bc6f56dbc6" +uuid = "d1d4a3ce-64b1-5f1a-9ba4-7e7e69966f35" +version = "0.1.5" + +[[deps.BitTwiddlingConvenienceFunctions]] +deps = ["Static"] +git-tree-sha1 = "eaee37f76339077f86679787a71990c4e465477f" +uuid = "62783981-4cbd-42fc-bca8-16325de8dc4b" +version = "0.1.4" + +[[deps.BoundaryValueDiffEq]] +deps = ["BandedMatrices", "DiffEqBase", "FiniteDiff", "ForwardDiff", "LinearAlgebra", "NLsolve", "Reexport", "SciMLBase", "SparseArrays"] +git-tree-sha1 = "2f80b70bd3ddd9aa3ec2d77604c1121bd115650e" +uuid = "764a87c0-6b3e-53db-9096-fe964310641d" +version = "2.9.0" + +[[deps.Bzip2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "19a35467a82e236ff51bc17a3a44b69ef35185a2" +uuid = "6e34b625-4abd-537c-b88f-471c36dfa7a0" +version = "1.0.8+0" + +[[deps.CEnum]] +git-tree-sha1 = "eb4cb44a499229b3b8426dcfb5dd85333951ff90" +uuid = "fa961155-64e5-5f13-b03f-caf6b980ea82" +version = "0.4.2" + +[[deps.CPUSummary]] +deps = ["CpuId", "IfElse", "Static"] +git-tree-sha1 = "9bdd5aceea9fa109073ace6b430a24839d79315e" +uuid = "2a0fbf3d-bb9c-48f3-b0a9-814d99fd7ab9" +version = "0.1.27" + +[[deps.CSV]] +deps = ["CodecZlib", "Dates", "FilePathsBase", "InlineStrings", "Mmap", "Parsers", "PooledArrays", "SentinelArrays", "Tables", "Unicode", "WeakRefStrings"] +git-tree-sha1 = "873fb188a4b9d76549b81465b1f75c82aaf59238" +uuid = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b" +version = "0.10.4" + +[[deps.Cairo_jll]] +deps = ["Artifacts", "Bzip2_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.ChainRulesCore]] +deps = ["Compat", "LinearAlgebra", "SparseArrays"] +git-tree-sha1 = "e7ff6cadf743c098e08fca25c91103ee4303c9bb" +uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" +version = "1.15.6" + +[[deps.ChangesOfVariables]] +deps = ["ChainRulesCore", "LinearAlgebra", "Test"] +git-tree-sha1 = "38f7a08f19d8810338d4f5085211c7dfa5d5bdd8" +uuid = "9e997f8a-9a97-42d5-a9f1-ce6bfc15e2c0" +version = "0.1.4" + +[[deps.CloseOpenIntervals]] +deps = ["ArrayInterface", "Static"] +git-tree-sha1 = "5522c338564580adf5d58d91e43a55db0fa5fb39" +uuid = "fb6a15b2-703c-40df-9091-08a04967cfa9" +version = "0.1.10" + +[[deps.CodeTracking]] +deps = ["InteractiveUtils", "UUIDs"] +git-tree-sha1 = "1833bda4a027f4b2a1c984baddcf755d77266818" +uuid = "da1fd8a2-8d9e-5ec2-8556-3022fb5608a2" +version = "1.1.0" + +[[deps.CodecZlib]] +deps = ["TranscodingStreams", "Zlib_jll"] +git-tree-sha1 = "ded953804d019afa9a3f98981d99b33e3db7b6da" +uuid = "944b1d66-785c-5afd-91f1-9de20f533193" +version = "0.7.0" + +[[deps.ColorSchemes]] +deps = ["ColorTypes", "ColorVectorSpace", "Colors", "FixedPointNumbers", "Random"] +git-tree-sha1 = "1fd869cc3875b57347f7027521f561cf46d1fcd8" +uuid = "35d6a980-a343-548e-a6ea-1d62b119f2f4" +version = "3.19.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", "SpecialFunctions", "Statistics", "TensorCore"] +git-tree-sha1 = "d08c20eef1f2cbc6e60fd3612ac4340b89fea322" +uuid = "c3611d14-8923-5661-9e6a-0046d554d3a4" +version = "0.9.9" + +[[deps.Colors]] +deps = ["ColorTypes", "FixedPointNumbers", "Reexport"] +git-tree-sha1 = "417b0ed7b8b838aa6ca0a87aadf1bb9eb111ce40" +uuid = "5ae59095-9a9b-59fe-a467-6f913c188581" +version = "0.12.8" + +[[deps.CommonSolve]] +git-tree-sha1 = "332a332c97c7071600984b3c31d9067e1a4e6e25" +uuid = "38540f10-b2f7-11e9-35d8-d573e4eb0ff2" +version = "0.2.1" + +[[deps.CommonSubexpressions]] +deps = ["MacroTools", "Test"] +git-tree-sha1 = "7b8a93dba8af7e3b42fecabf646260105ac373f7" +uuid = "bbf7d656-a473-5ed7-a52c-81e309532950" +version = "0.3.0" + +[[deps.Compat]] +deps = ["Dates", "LinearAlgebra", "UUIDs"] +git-tree-sha1 = "3ca828fe1b75fa84b021a7860bd039eaea84d2f2" +uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" +version = "4.3.0" + +[[deps.CompilerSupportLibraries_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" +version = "0.5.2+0" + +[[deps.ConstructionBase]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "fb21ddd70a051d882a1686a5a550990bbe371a95" +uuid = "187b0558-2788-49d3-abe0-74a17ed4e7c9" +version = "1.4.1" + +[[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.Crayons]] +git-tree-sha1 = "249fe38abf76d48563e2f4556bebd215aa317e15" +uuid = "a8cc5b0e-0ffa-5ad4-8c14-923d3ee1735f" +version = "4.1.1" + +[[deps.DataAPI]] +git-tree-sha1 = "46d2680e618f8abd007bce0c3026cb0c4a8f2032" +uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a" +version = "1.12.0" + +[[deps.DataFrames]] +deps = ["Compat", "DataAPI", "Future", "InvertedIndices", "IteratorInterfaceExtensions", "LinearAlgebra", "Markdown", "Missings", "PooledArrays", "PrettyTables", "Printf", "REPL", "Random", "Reexport", "SnoopPrecompile", "SortingAlgorithms", "Statistics", "TableTraits", "Tables", "Unicode"] +git-tree-sha1 = "558078b0b78278683a7445c626ee78c86b9bb000" +uuid = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" +version = "1.4.1" + +[[deps.DataStructures]] +deps = ["Compat", "InteractiveUtils", "OrderedCollections"] +git-tree-sha1 = "d1fff3a548102f48987a52a2e0d114fa97d730f0" +uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" +version = "0.18.13" + +[[deps.DataValueInterfaces]] +git-tree-sha1 = "bfc1187b79289637fa0ef6d4436ebdfe6905cbd6" +uuid = "e2d170a0-9d28-54be-80f0-106bbe20a464" +version = "1.0.0" + +[[deps.Dates]] +deps = ["Printf"] +uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" + +[[deps.DelayDiffEq]] +deps = ["ArrayInterface", "DataStructures", "DiffEqBase", "LinearAlgebra", "Logging", "NonlinearSolve", "OrdinaryDiffEq", "Printf", "RecursiveArrayTools", "Reexport", "SciMLBase", "UnPack"] +git-tree-sha1 = "02685529c5b22478e50c981d679f12d5e03808c6" +uuid = "bcd4f6db-9728-5f36-b5f7-82caef46ccdb" +version = "5.38.2" + +[[deps.DelimitedFiles]] +deps = ["Mmap"] +uuid = "8bb1440f-4735-579b-a4ab-409b98df4dab" + +[[deps.DensityInterface]] +deps = ["InverseFunctions", "Test"] +git-tree-sha1 = "80c3e8639e3353e5d2912fb3a1916b8455e2494b" +uuid = "b429d917-457f-4dbc-8f4c-0cc954292b1d" +version = "0.4.0" + +[[deps.DiffEqBase]] +deps = ["ArrayInterfaceCore", "ChainRulesCore", "DataStructures", "Distributions", "DocStringExtensions", "FastBroadcast", "ForwardDiff", "FunctionWrappers", "FunctionWrappersWrappers", "LinearAlgebra", "Logging", "MuladdMacro", "NonlinearSolve", "Parameters", "Printf", "RecursiveArrayTools", "Reexport", "Requires", "SciMLBase", "Setfield", "SparseArrays", "Static", "StaticArrays", "Statistics", "Tricks", "ZygoteRules"] +git-tree-sha1 = "c272e6fb3c3558d807886d5247ed2a0b9c6f3823" +uuid = "2b5f629d-d688-5b77-993f-72d75c75574e" +version = "6.105.1" + +[[deps.DiffEqCallbacks]] +deps = ["DataStructures", "DiffEqBase", "ForwardDiff", "LinearAlgebra", "Markdown", "NLsolve", "Parameters", "RecipesBase", "RecursiveArrayTools", "SciMLBase", "StaticArrays"] +git-tree-sha1 = "16cecaff5228c6cb22cda8e81aa96442395cdfc5" +uuid = "459566f4-90b8-5000-8ac3-15dfb0a30def" +version = "2.24.2" + +[[deps.DiffEqNoiseProcess]] +deps = ["DiffEqBase", "Distributions", "GPUArraysCore", "LinearAlgebra", "Markdown", "Optim", "PoissonRandom", "QuadGK", "Random", "Random123", "RandomNumbers", "RecipesBase", "RecursiveArrayTools", "ResettableStacks", "SciMLBase", "StaticArrays", "Statistics"] +git-tree-sha1 = "d0762f43a0c75a0b168547f7e4cc47abf6ea6a30" +uuid = "77a26b50-5914-5dd7-bc55-306e6241c503" +version = "5.13.1" + +[[deps.DiffResults]] +deps = ["StaticArraysCore"] +git-tree-sha1 = "782dd5f4561f5d267313f23853baaaa4c52ea621" +uuid = "163ba53b-c6d8-5494-b064-1a9d43ac40c5" +version = "1.1.0" + +[[deps.DiffRules]] +deps = ["IrrationalConstants", "LogExpFunctions", "NaNMath", "Random", "SpecialFunctions"] +git-tree-sha1 = "992a23afdb109d0d2f8802a30cf5ae4b1fe7ea68" +uuid = "b552c78f-8df3-52c6-915a-8e097449b14b" +version = "1.11.1" + +[[deps.DifferentialEquations]] +deps = ["BoundaryValueDiffEq", "DelayDiffEq", "DiffEqBase", "DiffEqCallbacks", "DiffEqNoiseProcess", "JumpProcesses", "LinearAlgebra", "LinearSolve", "OrdinaryDiffEq", "Random", "RecursiveArrayTools", "Reexport", "SciMLBase", "SteadyStateDiffEq", "StochasticDiffEq", "Sundials"] +git-tree-sha1 = "f6b75cc940e8791b5cef04d29eb88731955e759c" +uuid = "0c46a032-eb83-5123-abaf-570d42b7fbaa" +version = "7.5.0" + +[[deps.Distances]] +deps = ["LinearAlgebra", "SparseArrays", "Statistics", "StatsAPI"] +git-tree-sha1 = "3258d0659f812acde79e8a74b11f17ac06d0ca04" +uuid = "b4f34e82-e78d-54a5-968a-f98e89d6e8f7" +version = "0.10.7" + +[[deps.Distributed]] +deps = ["Random", "Serialization", "Sockets"] +uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" + +[[deps.Distributions]] +deps = ["ChainRulesCore", "DensityInterface", "FillArrays", "LinearAlgebra", "PDMats", "Printf", "QuadGK", "Random", "SparseArrays", "SpecialFunctions", "Statistics", "StatsBase", "StatsFuns", "Test"] +git-tree-sha1 = "04db820ebcfc1e053bd8cbb8d8bccf0ff3ead3f7" +uuid = "31c24e10-a181-5473-b8eb-7969acd0382f" +version = "0.25.76" + +[[deps.DocStringExtensions]] +deps = ["LibGit2"] +git-tree-sha1 = "5158c2b41018c5f7eb1470d558127ac274eca0c9" +uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" +version = "0.9.1" + +[[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.Expat_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "bad72f730e9e91c08d9427d5e8db95478a3c323d" +uuid = "2e619515-83b5-522b-bb60-26c02a35a201" +version = "2.4.8+0" + +[[deps.ExponentialUtilities]] +deps = ["ArrayInterfaceCore", "GPUArraysCore", "GenericSchur", "LinearAlgebra", "Printf", "SparseArrays", "libblastrampoline_jll"] +git-tree-sha1 = "b19c3f5001b11b71d0f970f354677d604f3a1a97" +uuid = "d4d017d3-3776-5f7e-afef-a10c40355c18" +version = "1.19.0" + +[[deps.ExprTools]] +git-tree-sha1 = "56559bbef6ca5ea0c0818fa5c90320398a6fbf8d" +uuid = "e2ba6199-217a-4e67-a87a-7c52f15ade04" +version = "0.1.8" + +[[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", "Pkg", "Zlib_jll", "libaom_jll", "libass_jll", "libfdk_aac_jll", "libvorbis_jll", "x264_jll", "x265_jll"] +git-tree-sha1 = "74faea50c1d007c85837327f6775bea60b5492dd" +uuid = "b22a6f82-2f65-5046-a5b2-351ab43fb4e5" +version = "4.4.2+2" + +[[deps.FastBroadcast]] +deps = ["ArrayInterface", "ArrayInterfaceCore", "LinearAlgebra", "Polyester", "Static", "StrideArraysCore"] +git-tree-sha1 = "21cdeff41e5a1822c2acd7fc7934c5f450588e00" +uuid = "7034ab61-46d4-4ed7-9d0f-46aef9175898" +version = "0.2.1" + +[[deps.FastClosures]] +git-tree-sha1 = "acebe244d53ee1b461970f8910c235b259e772ef" +uuid = "9aa1b823-49e4-5ca5-8b0f-3971ec8bab6a" +version = "0.3.2" + +[[deps.FastLapackInterface]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "14a6f7a21125f715d935fe8f83560ee833f7d79d" +uuid = "29a986be-02c6-4525-aec4-84b980013641" +version = "1.2.7" + +[[deps.FilePathsBase]] +deps = ["Compat", "Dates", "Mmap", "Printf", "Test", "UUIDs"] +git-tree-sha1 = "e27c4ebe80e8699540f2d6c805cc12203b614f12" +uuid = "48062228-2e41-5def-b9a4-89aafe57970f" +version = "0.9.20" + +[[deps.FileWatching]] +uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" + +[[deps.FillArrays]] +deps = ["LinearAlgebra", "Random", "SparseArrays", "Statistics"] +git-tree-sha1 = "87519eb762f85534445f5cda35be12e32759ee14" +uuid = "1a297f60-69ca-5386-bcde-b61e274b549b" +version = "0.13.4" + +[[deps.FiniteDiff]] +deps = ["ArrayInterfaceCore", "LinearAlgebra", "Requires", "Setfield", "SparseArrays", "StaticArrays"] +git-tree-sha1 = "5a2cff9b6b77b33b89f3d97a4d367747adce647e" +uuid = "6a86dc24-6348-571c-b903-95158fe2bd41" +version = "2.15.0" + +[[deps.FixedPointNumbers]] +deps = ["Statistics"] +git-tree-sha1 = "335bfdceacc84c5cdf16aadc768aa5ddfc5383cc" +uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" +version = "0.8.4" + +[[deps.Fontconfig_jll]] +deps = ["Artifacts", "Bzip2_jll", "Expat_jll", "FreeType2_jll", "JLLWrappers", "Libdl", "Libuuid_jll", "Pkg", "Zlib_jll"] +git-tree-sha1 = "21efd19106a55620a188615da6d3d06cd7f6ee03" +uuid = "a3f928ae-7b40-5064-980b-68af3947d34b" +version = "2.13.93+0" + +[[deps.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", "StaticArrays"] +git-tree-sha1 = "187198a4ed8ccd7b5d99c41b69c679269ea2b2d4" +uuid = "f6369f11-7733-5829-9624-2563aa707210" +version = "0.10.32" + +[[deps.FreeType2_jll]] +deps = ["Artifacts", "Bzip2_jll", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] +git-tree-sha1 = "87eb71354d8ec1a96d4a7636bd57a7347dde3ef9" +uuid = "d7e528f0-a631-5988-bf34-fe36492bcfd7" +version = "2.10.4+0" + +[[deps.FriBidi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "aa31987c2ba8704e23c6c8ba8a4f769d5d7e4f91" +uuid = "559328eb-81f9-559d-9380-de523a88c83c" +version = "1.0.10+0" + +[[deps.FunctionWrappers]] +git-tree-sha1 = "d62485945ce5ae9c0c48f124a84998d755bae00e" +uuid = "069b7b12-0de2-55c6-9aab-29f3d0a68a2e" +version = "1.1.3" + +[[deps.FunctionWrappersWrappers]] +deps = ["FunctionWrappers"] +git-tree-sha1 = "a5e6e7f12607e90d71b09e6ce2c965e41b337968" +uuid = "77dc65aa-8811-40c2-897b-53d922fa7daf" +version = "0.1.1" + +[[deps.Future]] +deps = ["Random"] +uuid = "9fa8497b-333b-5362-9e8d-4d0656e87820" + +[[deps.GLFW_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libglvnd_jll", "Pkg", "Xorg_libXcursor_jll", "Xorg_libXi_jll", "Xorg_libXinerama_jll", "Xorg_libXrandr_jll"] +git-tree-sha1 = "d972031d28c8c8d9d7b41a536ad7bb0c2579caca" +uuid = "0656b61e-2033-5cc2-a64a-77c0f6c09b89" +version = "3.3.8+0" + +[[deps.GPUArraysCore]] +deps = ["Adapt"] +git-tree-sha1 = "6872f5ec8fd1a38880f027a26739d42dcda6691f" +uuid = "46192b85-c4d5-4398-a991-12ede77f4527" +version = "0.1.2" + +[[deps.GR]] +deps = ["Base64", "DelimitedFiles", "GR_jll", "HTTP", "JSON", "Libdl", "LinearAlgebra", "Pkg", "Preferences", "Printf", "Random", "Serialization", "Sockets", "Test", "UUIDs"] +git-tree-sha1 = "00a9d4abadc05b9476e937a5557fcce476b9e547" +uuid = "28b8d3ca-fb5f-59d9-8090-bfdbd6d07a71" +version = "0.69.5" + +[[deps.GR_jll]] +deps = ["Artifacts", "Bzip2_jll", "Cairo_jll", "FFMPEG_jll", "Fontconfig_jll", "GLFW_jll", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Libtiff_jll", "Pixman_jll", "Pkg", "Qt5Base_jll", "Zlib_jll", "libpng_jll"] +git-tree-sha1 = "bc9f7725571ddb4ab2c4bc74fa397c1c5ad08943" +uuid = "d2c73de3-f751-5644-a686-071e5b155ba9" +version = "0.69.1+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", "Pkg", "Zlib_jll"] +git-tree-sha1 = "fb83fbe02fe57f2c068013aa94bcdf6760d3a7a7" +uuid = "7746bdde-850d-59dc-9ae8-88ece973131d" +version = "2.74.0+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 = "ba2d094a88b6b287bd25cfa86f301e7693ffae2f" +uuid = "86223c79-3864-5bf0-83f7-82e725a168b6" +version = "1.7.4" + +[[deps.Grisu]] +git-tree-sha1 = "53bb909d1151e57e2484c3d1b53e19552b887fb2" +uuid = "42e2da0e-8278-4e71-bc24-59509adca0fe" +version = "1.0.2" + +[[deps.HTTP]] +deps = ["Base64", "CodecZlib", "Dates", "IniFile", "Logging", "LoggingExtras", "MbedTLS", "NetworkOptions", "OpenSSL", "Random", "SimpleBufferStream", "Sockets", "URIs", "UUIDs"] +git-tree-sha1 = "e8c58d5f03b9d9eb9ed7067a2f34c7c371ab130b" +uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3" +version = "1.4.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 = "b7b88a4716ac33fe31d6556c02fc60017594343c" +uuid = "3e5b6fbb-0976-4d2c-9146-d79de83f2fb0" +version = "0.1.8" + +[[deps.HypergeometricFunctions]] +deps = ["DualNumbers", "LinearAlgebra", "OpenLibm_jll", "SpecialFunctions", "Test"] +git-tree-sha1 = "709d864e3ed6e3545230601f94e11ebc65994641" +uuid = "34004b35-14d8-5ef3-9330-4cdb6864b03a" +version = "0.3.11" + +[[deps.Hyperscript]] +deps = ["Test"] +git-tree-sha1 = "8d511d5b81240fc8e6802386302675bdf47737b9" +uuid = "47d2ed2b-36de-50cf-bf87-49c2cf4b8b91" +version = "0.0.4" + +[[deps.HypertextLiteral]] +deps = ["Tricks"] +git-tree-sha1 = "c47c5fa4c5308f27ccaac35504858d8914e102f9" +uuid = "ac1192a8-f4b3-4bfe-ba22-af5b92cd3ab2" +version = "0.9.4" + +[[deps.IOCapture]] +deps = ["Logging", "Random"] +git-tree-sha1 = "f7be53659ab06ddc986428d3a9dcc95f6fa6705a" +uuid = "b5f81e59-6552-4d32-b1f0-c071b021bf89" +version = "0.2.2" + +[[deps.IfElse]] +git-tree-sha1 = "debdd00ffef04665ccbb3e150747a77560e8fad1" +uuid = "615f187c-cbe4-4ef1-ba3b-2fcf58d6d173" +version = "0.1.1" + +[[deps.Inflate]] +git-tree-sha1 = "5cd07aab533df5170988219191dfad0519391428" +uuid = "d25df0c9-e2be-5dd7-82c8-3ad0b3e990b9" +version = "0.1.3" + +[[deps.IniFile]] +git-tree-sha1 = "f550e6e32074c939295eb5ea6de31849ac2c9625" +uuid = "83e8ac13-25f8-5344-8a64-a9f2b223428f" +version = "0.5.1" + +[[deps.InlineStrings]] +deps = ["Parsers"] +git-tree-sha1 = "db619c421554e1e7e07491b85a8f4b96b3f04ca0" +uuid = "842dd82b-1e85-43dc-bf29-5d0ee9dffc48" +version = "1.2.2" + +[[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 = "842dd89a6cb75e02e85fdd75c760cdc43f5d6863" +uuid = "a98d9a8b-a2ab-59e6-89dd-64a1c18fca59" +version = "0.14.6" + +[[deps.InverseFunctions]] +deps = ["Test"] +git-tree-sha1 = "49510dfcb407e572524ba94aeae2fced1f3feb0f" +uuid = "3587e190-3f89-42d0-90ee-14403ec27112" +version = "0.1.8" + +[[deps.InvertedIndices]] +git-tree-sha1 = "bee5f1ef5bf65df56bdd2e40447590b272a5471f" +uuid = "41ab1584-1d38-5bbf-9106-f11c6c58b48f" +version = "1.1.0" + +[[deps.IrrationalConstants]] +git-tree-sha1 = "7fd44fd4ff43fc60815f8e764c0f352b83c49151" +uuid = "92d709cd-6900-40b7-9082-c6be49f344b6" +version = "0.1.1" + +[[deps.IterativeSolvers]] +deps = ["LinearAlgebra", "Printf", "Random", "RecipesBase", "SparseArrays"] +git-tree-sha1 = "1169632f425f79429f245113b775a0e3d121457c" +uuid = "42fd0dbc-a981-5370-80f2-aaf504508153" +version = "0.9.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 = "f377670cda23b6b7c1c0b3893e37451c5c1a2185" +uuid = "1019f520-868f-41f5-a6de-eb00f4b6a39c" +version = "0.1.5" + +[[deps.JLLWrappers]] +deps = ["Preferences"] +git-tree-sha1 = "abc9885a7ca2052a736a600f7fa66209f96506e1" +uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" +version = "1.4.1" + +[[deps.JSON]] +deps = ["Dates", "Mmap", "Parsers", "Unicode"] +git-tree-sha1 = "3c837543ddb02250ef42f4738347454f95079d4e" +uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" +version = "0.21.3" + +[[deps.JpegTurbo_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "b53380851c6e6664204efb2e62cd24fa5c47e4ba" +uuid = "aacddb02-875f-59d6-b918-886e6ef4fbf8" +version = "2.1.2+0" + +[[deps.JuliaInterpreter]] +deps = ["CodeTracking", "InteractiveUtils", "Random", "UUIDs"] +git-tree-sha1 = "0f960b1404abb0b244c1ece579a0ec78d056a5d1" +uuid = "aa1ae85d-cabe-5617-a682-6adf51b2e16a" +version = "0.9.15" + +[[deps.JumpProcesses]] +deps = ["ArrayInterfaceCore", "DataStructures", "DiffEqBase", "DocStringExtensions", "FunctionWrappers", "Graphs", "LinearAlgebra", "Markdown", "PoissonRandom", "Random", "RandomNumbers", "RecursiveArrayTools", "Reexport", "SciMLBase", "StaticArrays", "TreeViews", "UnPack"] +git-tree-sha1 = "5a6e6c522e8a7b39b24be8eebcc13cc7885c6f2c" +uuid = "ccbc3e58-028d-4f4c-8cd5-9ae44345cda5" +version = "9.2.0" + +[[deps.KLU]] +deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse_jll"] +git-tree-sha1 = "cae5e3dfd89b209e01bcd65b3a25e74462c67ee0" +uuid = "ef3ab10e-7fda-4108-b977-705223b18434" +version = "0.3.0" + +[[deps.Krylov]] +deps = ["LinearAlgebra", "Printf", "SparseArrays"] +git-tree-sha1 = "92256444f81fb094ff5aa742ed10835a621aef75" +uuid = "ba0b0d4f-ebba-5204-a429-3ac8c609bfb7" +version = "0.8.4" + +[[deps.KrylovKit]] +deps = ["LinearAlgebra", "Printf"] +git-tree-sha1 = "49b0c1dd5c292870577b8f58c51072bd558febb9" +uuid = "0b1a1467-8014-51b9-945f-bf0ae24f4b77" +version = "0.5.4" + +[[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.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 = "f2355693d6778a178ade15952b7ac47a4ff97996" +uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" +version = "1.3.0" + +[[deps.Latexify]] +deps = ["Formatting", "InteractiveUtils", "LaTeXStrings", "MacroTools", "Markdown", "OrderedCollections", "Printf", "Requires"] +git-tree-sha1 = "ab9aa169d2160129beb241cb2750ca499b4e90e9" +uuid = "23fbe1c1-3f47-55db-b15f-69d7ec21a316" +version = "0.15.17" + +[[deps.LayoutPointers]] +deps = ["ArrayInterface", "ArrayInterfaceOffsetArrays", "ArrayInterfaceStaticArrays", "LinearAlgebra", "ManualMemory", "SIMDTypes", "Static"] +git-tree-sha1 = "b67e749fb35530979839e7b4b606a97105fe4f1c" +uuid = "10f19ff3-798f-405d-979b-55457f8fc047" +version = "0.1.10" + +[[deps.LevyArea]] +deps = ["LinearAlgebra", "Random", "SpecialFunctions"] +git-tree-sha1 = "56513a09b8e0ae6485f34401ea9e2f31357958ec" +uuid = "2d8b4e74-eb68-11e8-0fb9-d5eb67b50637" +version = "1.0.0" + +[[deps.LibCURL]] +deps = ["LibCURL_jll", "MozillaCACerts_jll"] +uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" +version = "0.6.3" + +[[deps.LibCURL_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] +uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" +version = "7.84.0+0" + +[[deps.LibGit2]] +deps = ["Base64", "NetworkOptions", "Printf", "SHA"] +uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" + +[[deps.LibSSH2_jll]] +deps = ["Artifacts", "Libdl", "MbedTLS_jll"] +uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" +version = "1.10.2+0" + +[[deps.Libdl]] +uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" + +[[deps.Libffi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "0b4a5d71f3e5200a7dff793393e09dfc2d874290" +uuid = "e9f186c6-92d2-5b65-8a66-fee21dc1b490" +version = "3.2.2+1" + +[[deps.Libgcrypt_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgpg_error_jll", "Pkg"] +git-tree-sha1 = "64613c82a59c120435c067c2b809fc61cf5166ae" +uuid = "d4300ac3-e22c-5743-9152-c294e39db1e4" +version = "1.8.7+0" + +[[deps.Libglvnd_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll", "Xorg_libXext_jll"] +git-tree-sha1 = "7739f837d6447403596a75d19ed01fd08d6f56bf" +uuid = "7e76a0d4-f3c7-5321-8279-8d96eeed0f29" +version = "1.3.0+3" + +[[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", "Pkg"] +git-tree-sha1 = "42b62845d70a619f063a7da093d995ec8e15e778" +uuid = "94ce4f54-9a6c-5748-9c1c-f9c7231a4531" +version = "1.16.1+1" + +[[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", "Pkg", "Zlib_jll", "Zstd_jll"] +git-tree-sha1 = "3eb79b0ca5764d4799c06699573fd8f533259713" +uuid = "89763e89-9b03-5906-acba-b20f662cd828" +version = "4.4.0+0" + +[[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", "libblastrampoline_jll"] +uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + +[[deps.LinearSolve]] +deps = ["ArrayInterfaceCore", "DocStringExtensions", "FastLapackInterface", "GPUArraysCore", "IterativeSolvers", "KLU", "Krylov", "KrylovKit", "LinearAlgebra", "RecursiveFactorization", "Reexport", "SciMLBase", "Setfield", "SnoopPrecompile", "SparseArrays", "SuiteSparse", "UnPack"] +git-tree-sha1 = "d1a5a61fa3728fcf63c5798458bce6ec57129065" +uuid = "7ed4a6bd-45f5-4d41-b270-4a48e9bafcae" +version = "1.26.1" + +[[deps.LogExpFunctions]] +deps = ["ChainRulesCore", "ChangesOfVariables", "DocStringExtensions", "InverseFunctions", "IrrationalConstants", "LinearAlgebra"] +git-tree-sha1 = "94d9c52ca447e23eac0c0f074effbcd38830deb5" +uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688" +version = "0.3.18" + +[[deps.Logging]] +uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" + +[[deps.LoggingExtras]] +deps = ["Dates", "Logging"] +git-tree-sha1 = "5d4d2d9904227b8bd66386c1138cf4d5ffa826bf" +uuid = "e6f89c97-d47a-5376-807f-9c37f3926c36" +version = "0.4.9" + +[[deps.LoopVectorization]] +deps = ["ArrayInterface", "ArrayInterfaceCore", "ArrayInterfaceOffsetArrays", "ArrayInterfaceStaticArrays", "CPUSummary", "ChainRulesCore", "CloseOpenIntervals", "DocStringExtensions", "ForwardDiff", "HostCPUFeatures", "IfElse", "LayoutPointers", "LinearAlgebra", "OffsetArrays", "PolyesterWeave", "SIMDDualNumbers", "SIMDTypes", "SLEEFPirates", "SnoopPrecompile", "SpecialFunctions", "Static", "ThreadingUtilities", "UnPack", "VectorizationBase"] +git-tree-sha1 = "39af6a1e398a29f568dc9fe469f459ad3aacb03b" +uuid = "bdcacae8-1622-11e9-2a5c-532679323890" +version = "0.12.133" + +[[deps.LoweredCodeUtils]] +deps = ["JuliaInterpreter"] +git-tree-sha1 = "dedbebe234e06e1ddad435f5c6f4b85cd8ce55f7" +uuid = "6f1432cf-f94c-5a45-995e-cdbf5db27b0b" +version = "2.2.2" + +[[deps.MacroTools]] +deps = ["Markdown", "Random"] +git-tree-sha1 = "42324d08725e200c23d4dfb549e0d5d89dede2d2" +uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" +version = "0.5.10" + +[[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.MbedTLS]] +deps = ["Dates", "MbedTLS_jll", "MozillaCACerts_jll", "Random", "Sockets"] +git-tree-sha1 = "6872f9594ff273da6d13c7c1a1545d5a8c7d0c1c" +uuid = "739be429-bea8-5141-9913-cc70e7f3736d" +version = "1.1.6" + +[[deps.MbedTLS_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" +version = "2.28.0+0" + +[[deps.Measures]] +git-tree-sha1 = "e498ddeee6f9fdb4551ce855a46f54dbd900245f" +uuid = "442fdcdd-2543-5da2-b0f3-8c86c306513e" +version = "0.3.1" + +[[deps.Missings]] +deps = ["DataAPI"] +git-tree-sha1 = "bf210ce90b6c9eed32d25dbcae1ebc565df2687f" +uuid = "e1d29d7a-bbdc-5cf2-9ac0-f12de2c33e28" +version = "1.0.2" + +[[deps.Mmap]] +uuid = "a63ad114-7e13-5084-954f-fe012c677804" + +[[deps.MozillaCACerts_jll]] +uuid = "14a3606d-f60d-562e-9121-12d972cd8159" +version = "2022.2.1" + +[[deps.MuladdMacro]] +git-tree-sha1 = "c6190f9a7fc5d9d5915ab29f2134421b12d24a68" +uuid = "46d2c3a1-f734-5fdb-9937-b9b9aeba4221" +version = "0.2.2" + +[[deps.NLSolversBase]] +deps = ["DiffResults", "Distributed", "FiniteDiff", "ForwardDiff"] +git-tree-sha1 = "50310f934e55e5ca3912fb941dec199b49ca9b68" +uuid = "d41bc354-129a-5804-8e4c-c37616107c6c" +version = "7.8.2" + +[[deps.NLsolve]] +deps = ["Distances", "LineSearches", "LinearAlgebra", "NLSolversBase", "Printf", "Reexport"] +git-tree-sha1 = "019f12e9a1a7880459d0173c182e6a99365d7ac1" +uuid = "2774e3e8-f4cf-5e23-947b-6d7e65073b56" +version = "4.5.1" + +[[deps.NaNMath]] +deps = ["OpenLibm_jll"] +git-tree-sha1 = "a7c3d1da1189a1c2fe843a3bfa04d18d20eb3211" +uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" +version = "1.0.1" + +[[deps.NetworkOptions]] +uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" +version = "1.2.0" + +[[deps.NonlinearSolve]] +deps = ["ArrayInterfaceCore", "FiniteDiff", "ForwardDiff", "IterativeSolvers", "LinearAlgebra", "RecursiveArrayTools", "RecursiveFactorization", "Reexport", "SciMLBase", "Setfield", "StaticArrays", "UnPack"] +git-tree-sha1 = "a754a21521c0ab48d37f44bbac1eefd1387bdcfc" +uuid = "8913a72c-1f9b-4ce2-8d82-65094dcecaec" +version = "0.3.22" + +[[deps.OffsetArrays]] +deps = ["Adapt"] +git-tree-sha1 = "f71d8950b724e9ff6110fc948dff5a329f901d64" +uuid = "6fe1bfb0-de20-5000-8ca7-80f57d26f881" +version = "1.12.8" + +[[deps.Ogg_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "887579a3eb005446d514ab7aeac5d1d027658b8f" +uuid = "e7412a2a-1a6e-54c0-be00-318e2571c051" +version = "1.3.5+1" + +[[deps.OpenBLAS_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] +uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" +version = "0.3.20+0" + +[[deps.OpenLibm_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "05823500-19ac-5b8b-9628-191a04bc5112" +version = "0.8.1+0" + +[[deps.OpenSSL]] +deps = ["BitFlags", "Dates", "MozillaCACerts_jll", "OpenSSL_jll", "Sockets"] +git-tree-sha1 = "ebe81469e9d7b471d7ddb611d9e147ea16de0add" +uuid = "4d8831e6-92b7-49fb-bdf8-b643e874388c" +version = "1.2.1" + +[[deps.OpenSSL_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "e60321e3f2616584ff98f0a4f18d98ae6f89bbb3" +uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95" +version = "1.1.17+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 = "b9fe76d1a39807fdcf790b991981a922de0c3050" +uuid = "429524aa-4258-5aef-a3af-852621145aeb" +version = "1.7.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 = "85f8e6578bf1f9ee0d11e7bb1b1456435479d47c" +uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" +version = "1.4.1" + +[[deps.OrdinaryDiffEq]] +deps = ["Adapt", "ArrayInterface", "ArrayInterfaceCore", "ArrayInterfaceGPUArrays", "ArrayInterfaceStaticArrays", "ArrayInterfaceStaticArraysCore", "DataStructures", "DiffEqBase", "DocStringExtensions", "ExponentialUtilities", "FastBroadcast", "FastClosures", "FiniteDiff", "ForwardDiff", "FunctionWrappersWrappers", "LinearAlgebra", "LinearSolve", "Logging", "LoopVectorization", "MacroTools", "MuladdMacro", "NLsolve", "NonlinearSolve", "Polyester", "PreallocationTools", "Preferences", "RecursiveArrayTools", "Reexport", "SciMLBase", "SnoopPrecompile", "SparseArrays", "SparseDiffTools", "StaticArrays", "UnPack"] +git-tree-sha1 = "787caae52aed673c126237264fda1b5d9086b87d" +uuid = "1dea7af3-3e70-54e6-95c3-0bf5283fa5ed" +version = "6.29.0" + +[[deps.PCRE2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "efcefdf7-47ab-520b-bdef-62a2eaa19f15" +version = "10.40.0+0" + +[[deps.PDMats]] +deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"] +git-tree-sha1 = "cf494dca75a69712a72b80bc48f59dcf3dea63ec" +uuid = "90014a1f-27ba-587c-ab20-58faa44d9150" +version = "0.11.16" + +[[deps.Parameters]] +deps = ["OrderedCollections", "UnPack"] +git-tree-sha1 = "34c0e9ad262e5f7fc75b10a9952ca7692cfc5fbe" +uuid = "d96e819e-fc66-5662-9728-84c9c7592b0a" +version = "0.12.3" + +[[deps.Parsers]] +deps = ["Dates"] +git-tree-sha1 = "6c01a9b494f6d2a9fc180a08b182fcb06f0958a0" +uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" +version = "2.4.2" + +[[deps.Pipe]] +git-tree-sha1 = "6842804e7867b115ca9de748a0cf6b364523c16d" +uuid = "b98c9c47-44ae-5843-9183-064241ee97a0" +version = "1.3.0" + +[[deps.Pixman_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "b4f5d02549a10e20780a24fce72bea96b6329e29" +uuid = "30392449-352a-5448-841d-b1acce4e97dc" +version = "0.40.1+0" + +[[deps.Pkg]] +deps = ["Artifacts", "Dates", "Downloads", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] +uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" +version = "1.8.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", "Printf", "Random", "Reexport", "SnoopPrecompile", "Statistics"] +git-tree-sha1 = "21303256d239f6b484977314674aef4bb1fe4420" +uuid = "995b91a9-d308-5afd-9ec6-746e21dbc043" +version = "1.3.1" + +[[deps.Plots]] +deps = ["Base64", "Contour", "Dates", "Downloads", "FFMPEG", "FixedPointNumbers", "GR", "JLFzf", "JSON", "LaTeXStrings", "Latexify", "LinearAlgebra", "Measures", "NaNMath", "Pkg", "PlotThemes", "PlotUtils", "Printf", "REPL", "Random", "RecipesBase", "RecipesPipeline", "Reexport", "RelocatableFolders", "Requires", "Scratch", "Showoff", "SnoopPrecompile", "SparseArrays", "Statistics", "StatsBase", "UUIDs", "UnicodeFun", "Unzip"] +git-tree-sha1 = "524d9ff1b2f4473fef59678c06f9f77160a204b1" +uuid = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" +version = "1.35.3" + +[[deps.PlutoHooks]] +deps = ["InteractiveUtils", "Markdown", "UUIDs"] +git-tree-sha1 = "072cdf20c9b0507fdd977d7d246d90030609674b" +uuid = "0ff47ea0-7a50-410d-8455-4348d5de0774" +version = "0.0.5" + +[[deps.PlutoLinks]] +deps = ["FileWatching", "InteractiveUtils", "Markdown", "PlutoHooks", "Revise", "UUIDs"] +git-tree-sha1 = "0e8bcc235ec8367a8e9648d48325ff00e4b0a545" +uuid = "0ff47ea0-7a50-410d-8455-4348d5de0420" +version = "0.1.5" + +[[deps.PlutoTeachingTools]] +deps = ["Downloads", "HypertextLiteral", "LaTeXStrings", "Latexify", "Markdown", "PlutoLinks", "PlutoUI", "Random"] +git-tree-sha1 = "d8be3432505c2febcea02f44e5f4396fae017503" +uuid = "661c6b06-c737-4d37-b85c-46df65de6f69" +version = "0.2.3" + +[[deps.PlutoUI]] +deps = ["AbstractPlutoDingetjes", "Base64", "ColorTypes", "Dates", "Hyperscript", "HypertextLiteral", "IOCapture", "InteractiveUtils", "JSON", "Logging", "Markdown", "Random", "Reexport", "UUIDs"] +git-tree-sha1 = "6e33d318cf8843dade925e35162992145b4eb12f" +uuid = "7f904dfe-b85e-4ff6-b463-dae2292396a8" +version = "0.7.44" + +[[deps.PoissonRandom]] +deps = ["Random"] +git-tree-sha1 = "9ac1bb7c15c39620685a3a7babc0651f5c64c35b" +uuid = "e409e4f3-bfea-5376-8464-e040bb5c01ab" +version = "0.4.1" + +[[deps.Polyester]] +deps = ["ArrayInterface", "BitTwiddlingConvenienceFunctions", "CPUSummary", "IfElse", "ManualMemory", "PolyesterWeave", "Requires", "Static", "StrideArraysCore", "ThreadingUtilities"] +git-tree-sha1 = "cb2ede4b9cc432c1cba4d4452a62ae1d2a4141bb" +uuid = "f517fe37-dbe3-4b94-8317-1923a5111588" +version = "0.6.16" + +[[deps.PolyesterWeave]] +deps = ["BitTwiddlingConvenienceFunctions", "CPUSummary", "IfElse", "Static", "ThreadingUtilities"] +git-tree-sha1 = "b42fb2292fbbaed36f25d33a15c8cc0b4f287fcf" +uuid = "1d0040c9-8b98-4ee7-8388-3f51789ca0ad" +version = "0.1.10" + +[[deps.PooledArrays]] +deps = ["DataAPI", "Future"] +git-tree-sha1 = "a6062fe4063cdafe78f4a0a81cfffb89721b30e7" +uuid = "2dfb63ee-cc39-5dd5-95bd-886bf059d720" +version = "1.4.2" + +[[deps.PositiveFactorizations]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "17275485f373e6673f7e7f97051f703ed5b15b20" +uuid = "85a6dd25-e78a-55b7-8502-1745935b8125" +version = "0.2.4" + +[[deps.PreallocationTools]] +deps = ["Adapt", "ArrayInterfaceCore", "ForwardDiff"] +git-tree-sha1 = "3953d18698157e1d27a51678c89c88d53e071a42" +uuid = "d236fae5-4411-538c-8e31-a6e3d9e00b46" +version = "0.4.4" + +[[deps.Preferences]] +deps = ["TOML"] +git-tree-sha1 = "47e5f437cc0e7ef2ce8406ce1e7e24d44915f88d" +uuid = "21216c6a-2e73-6563-6e65-726566657250" +version = "1.3.0" + +[[deps.PrettyTables]] +deps = ["Crayons", "Formatting", "Markdown", "Reexport", "StringManipulation", "Tables"] +git-tree-sha1 = "460d9e154365e058c4d886f6f7d6df5ffa1ea80e" +uuid = "08abe8d2-0d0c-5749-adfa-8a2ac140af0d" +version = "2.1.2" + +[[deps.Printf]] +deps = ["Unicode"] +uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" + +[[deps.Profile]] +deps = ["Printf"] +uuid = "9abbd945-dff8-562f-b5e8-e1ebf5ef1b79" + +[[deps.Qt5Base_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Fontconfig_jll", "Glib_jll", "JLLWrappers", "Libdl", "Libglvnd_jll", "OpenSSL_jll", "Pkg", "Xorg_libXext_jll", "Xorg_libxcb_jll", "Xorg_xcb_util_image_jll", "Xorg_xcb_util_keysyms_jll", "Xorg_xcb_util_renderutil_jll", "Xorg_xcb_util_wm_jll", "Zlib_jll", "xkbcommon_jll"] +git-tree-sha1 = "c6c0f690d0cc7caddb74cef7aa847b824a16b256" +uuid = "ea2cea3b-5b76-57ae-a6ef-0a8af62496e1" +version = "5.15.3+1" + +[[deps.QuadGK]] +deps = ["DataStructures", "LinearAlgebra"] +git-tree-sha1 = "3c009334f45dfd546a16a57960a821a1a023d241" +uuid = "1fd47b50-473d-5c70-9696-f719f8f3bcdc" +version = "2.5.0" + +[[deps.REPL]] +deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] +uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" + +[[deps.Random]] +deps = ["SHA", "Serialization"] +uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" + +[[deps.Random123]] +deps = ["Random", "RandomNumbers"] +git-tree-sha1 = "7a1a306b72cfa60634f03a911405f4e64d1b718b" +uuid = "74087812-796a-5b5d-8853-05524746bad3" +version = "1.6.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 = "dc84268fe0e3335a62e315a3a7cf2afa7178a734" +uuid = "c84ed2f1-dad5-54f0-aa8e-dbefe2724439" +version = "0.4.3" + +[[deps.RecipesBase]] +deps = ["SnoopPrecompile"] +git-tree-sha1 = "612a4d76ad98e9722c8ba387614539155a59e30c" +uuid = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" +version = "1.3.0" + +[[deps.RecipesPipeline]] +deps = ["Dates", "NaNMath", "PlotUtils", "RecipesBase", "SnoopPrecompile"] +git-tree-sha1 = "9b1c0c8e9188950e66fc28f40bfe0f8aac311fe0" +uuid = "01d81517-befc-4cb6-b9ec-a95719d0359c" +version = "0.6.7" + +[[deps.RecursiveArrayTools]] +deps = ["Adapt", "ArrayInterfaceCore", "ArrayInterfaceStaticArraysCore", "ChainRulesCore", "DocStringExtensions", "FillArrays", "GPUArraysCore", "IteratorInterfaceExtensions", "LinearAlgebra", "RecipesBase", "StaticArraysCore", "Statistics", "Tables", "ZygoteRules"] +git-tree-sha1 = "3004608dc42101a944e44c1c68b599fa7c669080" +uuid = "731186ca-8d62-57ce-b412-fbd966d074cd" +version = "2.32.0" + +[[deps.RecursiveFactorization]] +deps = ["LinearAlgebra", "LoopVectorization", "Polyester", "SnoopPrecompile", "StrideArraysCore", "TriangularSolve"] +git-tree-sha1 = "0a2dfb3358fcde3676beb75405e782faa8c9aded" +uuid = "f2c3362d-daeb-58d1-803e-2bc74f2840b4" +version = "0.2.12" + +[[deps.Reexport]] +git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" +uuid = "189a3867-3050-52da-a836-e630ba90ab69" +version = "1.2.2" + +[[deps.RelocatableFolders]] +deps = ["SHA", "Scratch"] +git-tree-sha1 = "90bc7a7c96410424509e4263e277e43250c05691" +uuid = "05181044-ff0b-4ac5-8273-598c1e38db00" +version = "1.0.0" + +[[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.Revise]] +deps = ["CodeTracking", "Distributed", "FileWatching", "JuliaInterpreter", "LibGit2", "LoweredCodeUtils", "OrderedCollections", "Pkg", "REPL", "Requires", "UUIDs", "Unicode"] +git-tree-sha1 = "dad726963ecea2d8a81e26286f625aee09a91b7c" +uuid = "295af30f-e4ad-537b-8983-00126c2a3abe" +version = "3.4.0" + +[[deps.Rmath]] +deps = ["Random", "Rmath_jll"] +git-tree-sha1 = "bf3188feca147ce108c76ad82c2792c57abe7b1f" +uuid = "79098fc4-a85e-5d69-aa6a-4863f24498fa" +version = "0.7.0" + +[[deps.Rmath_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "68db32dff12bb6127bac73c209881191bf0efbb7" +uuid = "f50d1b31-88e8-58de-be2c-1cc44531875f" +version = "0.3.0+0" + +[[deps.RuntimeGeneratedFunctions]] +deps = ["ExprTools", "SHA", "Serialization"] +git-tree-sha1 = "cdc1e4278e91a6ad530770ebb327f9ed83cf10c4" +uuid = "7e49a35a-f44a-4d26-94aa-eba1b4ca6b47" +version = "0.5.3" + +[[deps.SHA]] +uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" +version = "0.7.0" + +[[deps.SIMDDualNumbers]] +deps = ["ForwardDiff", "IfElse", "SLEEFPirates", "VectorizationBase"] +git-tree-sha1 = "dd4195d308df24f33fb10dde7c22103ba88887fa" +uuid = "3cdde19b-5bb0-4aaf-8931-af3e248e098b" +version = "0.1.1" + +[[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 = "938c9ecffb28338a6b8b970bda0f3806a65e7906" +uuid = "476501e8-09a2-5ece-8869-fb82de89a1fa" +version = "0.6.36" + +[[deps.SciMLBase]] +deps = ["ArrayInterfaceCore", "CommonSolve", "ConstructionBase", "Distributed", "DocStringExtensions", "FunctionWrappersWrappers", "IteratorInterfaceExtensions", "LinearAlgebra", "Logging", "Markdown", "Preferences", "RecipesBase", "RecursiveArrayTools", "RuntimeGeneratedFunctions", "StaticArraysCore", "Statistics", "Tables"] +git-tree-sha1 = "e078c600cb15f9ad1a21cd58fc1c01a29aecb908" +uuid = "0bca4576-84f4-4d90-8ffe-ffa030f20462" +version = "1.62.0" + +[[deps.Scratch]] +deps = ["Dates"] +git-tree-sha1 = "f94f779c94e58bf9ea243e77a37e16d9de9126bd" +uuid = "6c6a2e73-6563-6170-7368-637461726353" +version = "1.1.1" + +[[deps.SentinelArrays]] +deps = ["Dates", "Random"] +git-tree-sha1 = "efd23b378ea5f2db53a55ae53d3133de4e080aa9" +uuid = "91c51154-3ec4-41a3-a24f-3f23e20d615c" +version = "1.3.16" + +[[deps.Serialization]] +uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" + +[[deps.Setfield]] +deps = ["ConstructionBase", "Future", "MacroTools", "StaticArraysCore"] +git-tree-sha1 = "e2cc6d8c88613c05e1defb55170bf5ff211fbeac" +uuid = "efcf1570-3423-57d1-acb7-fd33fddbac46" +version = "1.1.1" + +[[deps.SharedArrays]] +deps = ["Distributed", "Mmap", "Random", "Serialization"] +uuid = "1a1011a3-84de-559e-8e89-a11a2f7dc383" + +[[deps.Showoff]] +deps = ["Dates", "Grisu"] +git-tree-sha1 = "91eddf657aca81df9ae6ceb20b959ae5653ad1de" +uuid = "992d4aef-0814-514b-bc4d-f2e9a6c4116f" +version = "1.0.3" + +[[deps.SimpleBufferStream]] +git-tree-sha1 = "874e8867b33a00e784c8a7e4b60afe9e037b74e1" +uuid = "777ac1f9-54b0-4bf8-805c-2214025038e7" +version = "1.1.0" + +[[deps.SimpleTraits]] +deps = ["InteractiveUtils", "MacroTools"] +git-tree-sha1 = "5d7e3f4e11935503d3ecaf7186eac40602e7d231" +uuid = "699a6c99-e7fa-54fc-8d76-47d257e15c1d" +version = "0.9.4" + +[[deps.SnoopPrecompile]] +git-tree-sha1 = "f604441450a3c0569830946e5b33b78c928e1a85" +uuid = "66db9d55-30c0-4569-8b51-7e840670fc0c" +version = "1.0.1" + +[[deps.Sockets]] +uuid = "6462fe0b-24de-5631-8697-dd941f90decc" + +[[deps.SortingAlgorithms]] +deps = ["DataStructures"] +git-tree-sha1 = "b3363d7460f7d098ca0912c69b082f75625d7508" +uuid = "a2af1166-a08f-5f64-846c-94a0d3cef48c" +version = "1.0.1" + +[[deps.SparseArrays]] +deps = ["LinearAlgebra", "Random"] +uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + +[[deps.SparseDiffTools]] +deps = ["Adapt", "ArrayInterfaceCore", "ArrayInterfaceStaticArrays", "Compat", "DataStructures", "FiniteDiff", "ForwardDiff", "Graphs", "LinearAlgebra", "Requires", "SparseArrays", "StaticArrays", "VertexSafeGraphs"] +git-tree-sha1 = "a434a4a3a5757440cb3b6500eb9690ff5a516cf6" +uuid = "47a9eef4-7e08-11e9-0b38-333d64bd3804" +version = "1.27.0" + +[[deps.SpecialFunctions]] +deps = ["ChainRulesCore", "IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"] +git-tree-sha1 = "d75bda01f8c31ebb72df80a46c88b25d1c79c56d" +uuid = "276daf66-3868-5448-9aa4-cd146d93841b" +version = "2.1.7" + +[[deps.Static]] +deps = ["IfElse"] +git-tree-sha1 = "de4f0a4f049a4c87e4948c04acff37baf1be01a6" +uuid = "aedffcd0-7271-4cad-89d0-dc628f76c6d3" +version = "0.7.7" + +[[deps.StaticArrays]] +deps = ["LinearAlgebra", "Random", "StaticArraysCore", "Statistics"] +git-tree-sha1 = "f86b3a049e5d05227b10e15dbb315c5b90f14988" +uuid = "90137ffa-7385-5640-81b9-e52037218182" +version = "1.5.9" + +[[deps.StaticArraysCore]] +git-tree-sha1 = "6b7ba252635a5eff6a0b0664a41ee140a1c9e72a" +uuid = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" +version = "1.4.0" + +[[deps.Statistics]] +deps = ["LinearAlgebra", "SparseArrays"] +uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" + +[[deps.StatsAPI]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "f9af7f195fb13589dd2e2d57fdb401717d2eb1f6" +uuid = "82ae8749-77ed-4fe6-ae5f-f523153014b0" +version = "1.5.0" + +[[deps.StatsBase]] +deps = ["DataAPI", "DataStructures", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"] +git-tree-sha1 = "d1bf48bfcc554a3761a133fe3a9bb01488e06916" +uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" +version = "0.33.21" + +[[deps.StatsFuns]] +deps = ["ChainRulesCore", "HypergeometricFunctions", "InverseFunctions", "IrrationalConstants", "LogExpFunctions", "Reexport", "Rmath", "SpecialFunctions"] +git-tree-sha1 = "5783b877201a82fc0014cbf381e7e6eb130473a4" +uuid = "4c63d2b9-4356-54db-8cca-17b64c39e42c" +version = "1.0.1" + +[[deps.SteadyStateDiffEq]] +deps = ["DiffEqBase", "DiffEqCallbacks", "LinearAlgebra", "NLsolve", "Reexport", "SciMLBase"] +git-tree-sha1 = "f4492f790434f405139eb3a291fdbb45997857c6" +uuid = "9672c7b4-1e72-59bd-8a11-6ac3964bc41f" +version = "1.9.0" + +[[deps.StochasticDiffEq]] +deps = ["Adapt", "ArrayInterface", "DataStructures", "DiffEqBase", "DiffEqNoiseProcess", "DocStringExtensions", "FillArrays", "FiniteDiff", "ForwardDiff", "JumpProcesses", "LevyArea", "LinearAlgebra", "Logging", "MuladdMacro", "NLsolve", "OrdinaryDiffEq", "Random", "RandomNumbers", "RecursiveArrayTools", "Reexport", "SciMLBase", "SparseArrays", "SparseDiffTools", "StaticArrays", "UnPack"] +git-tree-sha1 = "8062351f645bb23725c494be74619ef802a2ffa8" +uuid = "789caeaf-c7a9-5a7d-9973-96adeb23e2a0" +version = "6.54.0" + +[[deps.StrideArraysCore]] +deps = ["ArrayInterface", "CloseOpenIntervals", "IfElse", "LayoutPointers", "ManualMemory", "SIMDTypes", "Static", "ThreadingUtilities"] +git-tree-sha1 = "ac730bd978bf35f9fe45daa0bd1f51e493e97eb4" +uuid = "7792a7ef-975c-4747-a70f-980b88e8d1da" +version = "0.3.15" + +[[deps.StringManipulation]] +git-tree-sha1 = "46da2434b41f41ac3594ee9816ce5541c6096123" +uuid = "892a3eda-7b42-436c-8928-eab12a02cf0e" +version = "0.3.0" + +[[deps.SuiteSparse]] +deps = ["Libdl", "LinearAlgebra", "Serialization", "SparseArrays"] +uuid = "4607b0f0-06f3-5cda-b6b1-a6196a1729e9" + +[[deps.SuiteSparse_jll]] +deps = ["Artifacts", "Libdl", "Pkg", "libblastrampoline_jll"] +uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c" +version = "5.10.1+0" + +[[deps.Sundials]] +deps = ["CEnum", "DataStructures", "DiffEqBase", "Libdl", "LinearAlgebra", "Logging", "Reexport", "SnoopPrecompile", "SparseArrays", "Sundials_jll"] +git-tree-sha1 = "5717b2c13ddc167d7db931bfdd1a94133ee1d4f0" +uuid = "c3572dad-4567-51f8-b174-8c6c989267f4" +version = "4.10.1" + +[[deps.Sundials_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "OpenBLAS_jll", "Pkg", "SuiteSparse_jll"] +git-tree-sha1 = "04777432d74ec5bc91ca047c9e0e0fd7f81acdb6" +uuid = "fb77eaff-e24c-56d4-86b1-d163f2edb164" +version = "5.2.1+0" + +[[deps.TOML]] +deps = ["Dates"] +uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" +version = "1.0.0" + +[[deps.TableTraits]] +deps = ["IteratorInterfaceExtensions"] +git-tree-sha1 = "c06b2f539df1c6efa794486abfb6ed2022561a39" +uuid = "3783bdb8-4a98-5b6b-af9a-565f29a5fe9c" +version = "1.0.1" + +[[deps.Tables]] +deps = ["DataAPI", "DataValueInterfaces", "IteratorInterfaceExtensions", "LinearAlgebra", "OrderedCollections", "TableTraits", "Test"] +git-tree-sha1 = "c79322d36826aa2f4fd8ecfa96ddb47b174ac78d" +uuid = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" +version = "1.10.0" + +[[deps.Tar]] +deps = ["ArgTools", "SHA"] +uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" +version = "1.10.1" + +[[deps.TensorCore]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "1feb45f88d133a655e001435632f019a9a1bcdb6" +uuid = "62fd8b95-f654-4bbd-a8a5-9c27f68ccd50" +version = "0.1.1" + +[[deps.Test]] +deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] +uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[[deps.ThreadingUtilities]] +deps = ["ManualMemory"] +git-tree-sha1 = "f8629df51cab659d70d2e5618a430b4d3f37f2c3" +uuid = "8290d209-cae3-49c0-8002-c8c24d57dab5" +version = "0.5.0" + +[[deps.TranscodingStreams]] +deps = ["Random", "Test"] +git-tree-sha1 = "8a75929dcd3c38611db2f8d08546decb514fcadf" +uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa" +version = "0.9.9" + +[[deps.TreeViews]] +deps = ["Test"] +git-tree-sha1 = "8d0d7a3fe2f30d6a7f833a5f19f7c7a5b396eae6" +uuid = "a2a6695c-b41b-5b7d-aed9-dbfdeacea5d7" +version = "0.3.0" + +[[deps.TriangularSolve]] +deps = ["CloseOpenIntervals", "IfElse", "LayoutPointers", "LinearAlgebra", "LoopVectorization", "Polyester", "SnoopPrecompile", "Static", "VectorizationBase"] +git-tree-sha1 = "fdddcf6b2c7751cd97de69c18157aacc18fbc660" +uuid = "d5829a12-d9aa-46ab-831f-fb7c9ab06edf" +version = "0.1.14" + +[[deps.Tricks]] +git-tree-sha1 = "6bac775f2d42a611cdfcd1fb217ee719630c4175" +uuid = "410a4b4d-49e4-4fbc-ab6d-cb71b17b3775" +version = "0.1.6" + +[[deps.URIs]] +git-tree-sha1 = "e59ecc5a41b000fa94423a578d29290c7266fc10" +uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" +version = "1.4.0" + +[[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.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"] +git-tree-sha1 = "3bc5ea8fbf25f233c4c49c0a75f14b276d2f9a69" +uuid = "3d5dd08c-fd9d-11e8-17fa-ed2836048c2f" +version = "0.21.51" + +[[deps.VertexSafeGraphs]] +deps = ["Graphs"] +git-tree-sha1 = "8351f8d73d7e880bfc042a8b6922684ebeafb35c" +uuid = "19fa3120-7c27-5ec5-8db8-b0b0aa330d6f" +version = "0.2.0" + +[[deps.Wayland_jll]] +deps = ["Artifacts", "Expat_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Pkg", "XML2_jll"] +git-tree-sha1 = "3e61f0b86f90dacb0bc0e73a0c5a83f6a8636e23" +uuid = "a2964d1f-97da-50d4-b82a-358c7fce9d89" +version = "1.19.0+0" + +[[deps.Wayland_protocols_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "4528479aa01ee1b3b4cd0e6faef0e04cf16466da" +uuid = "2381bf8a-dfd0-557d-9999-79630e7b1b91" +version = "1.25.0+0" + +[[deps.WeakRefStrings]] +deps = ["DataAPI", "InlineStrings", "Parsers"] +git-tree-sha1 = "b1be2855ed9ed8eac54e5caff2afcdb442d52c23" +uuid = "ea10d353-3f73-51f8-a26c-33c1cb351aa5" +version = "1.4.2" + +[[deps.WoodburyMatrices]] +deps = ["LinearAlgebra", "SparseArrays"] +git-tree-sha1 = "de67fa59e33ad156a590055375a30b23c40299d3" +uuid = "efce3f68-66dc-5838-9240-27a6d6f5f9b6" +version = "0.5.5" + +[[deps.XML2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Pkg", "Zlib_jll"] +git-tree-sha1 = "58443b63fb7e465a8a7210828c91c08b92132dff" +uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a" +version = "2.9.14+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.Xorg_libX11_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libxcb_jll", "Xorg_xtrans_jll"] +git-tree-sha1 = "5be649d550f3f4b95308bf0183b82e2582876527" +uuid = "4f6342f7-b3d2-589e-9d20-edeb45f2b2bc" +version = "1.6.9+4" + +[[deps.Xorg_libXau_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "4e490d5c960c314f33885790ed410ff3a94ce67e" +uuid = "0c0b7dd1-d40b-584c-a123-a41640f87eec" +version = "1.0.9+4" + +[[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", "Pkg"] +git-tree-sha1 = "4fe47bd2247248125c428978740e18a681372dd4" +uuid = "a3789734-cfe1-5b06-b2d0-1dd0d9d62d05" +version = "1.1.3+4" + +[[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", "Pkg"] +git-tree-sha1 = "6783737e45d3c59a4a4c4091f5f88cdcf0908cbb" +uuid = "14d82f49-176c-5ed1-bb49-ad3f5cbd8c74" +version = "0.1.0+3" + +[[deps.Xorg_libxcb_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "XSLT_jll", "Xorg_libXau_jll", "Xorg_libXdmcp_jll", "Xorg_libpthread_stubs_jll"] +git-tree-sha1 = "daf17f441228e7a3833846cd048892861cff16d6" +uuid = "c7cfdc94-dc32-55de-ac96-5a1b8d977c5b" +version = "1.13.0+3" + +[[deps.Xorg_libxkbfile_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll"] +git-tree-sha1 = "926af861744212db0eb001d9e40b5d16292080b2" +uuid = "cc61e674-0454-545c-8b26-ed2c68acab7a" +version = "1.1.0+4" + +[[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", "Pkg", "Xorg_libxkbfile_jll"] +git-tree-sha1 = "4bcbf660f6c2e714f87e960a171b119d06ee163b" +uuid = "35661453-b289-5fab-8a00-3d9160c6a3a4" +version = "1.4.2+4" + +[[deps.Xorg_xkeyboard_config_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xkbcomp_jll"] +git-tree-sha1 = "5c8424f8a67c3f2209646d4425f3d415fee5931d" +uuid = "33bec58e-1273-512f-9401-5d533626f822" +version = "2.27.0+4" + +[[deps.Xorg_xtrans_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "79c31e7844f6ecf779705fbc12146eb190b7d845" +uuid = "c5fb5394-a638-5e4d-96e5-b29de1b5cf10" +version = "1.4.0+3" + +[[deps.Zlib_jll]] +deps = ["Libdl"] +uuid = "83775a58-1f1d-513f-b197-d71354ab007a" +version = "1.2.12+3" + +[[deps.Zstd_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "e45044cd873ded54b6a5bac0eb5c971392cf1927" +uuid = "3161d3a3-bdf6-5164-811a-617609db77b4" +version = "1.5.2+0" + +[[deps.ZygoteRules]] +deps = ["MacroTools"] +git-tree-sha1 = "8c1a8e4dfacb1fd631745552c8db35d0deb09ea0" +uuid = "700de1a5-db45-46bc-99cf-38207098b444" +version = "0.2.2" + +[[deps.fzf_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "868e669ccb12ba16eaf50cb2957ee2ff61261c56" +uuid = "214eeab7-80f7-51ab-84ad-2988db7cef09" +version = "0.29.0+0" + +[[deps.libaom_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "3a2ea60308f0996d26f1e5354e10c24e9ef905d4" +uuid = "a4ae2306-e953-59d6-aa16-d00cac43593b" +version = "3.4.0+0" + +[[deps.libass_jll]] +deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] +git-tree-sha1 = "5982a94fcba20f02f42ace44b9894ee2b140fe47" +uuid = "0ac62f75-1d6f-5e53-bd7c-93b484bb37c0" +version = "0.15.1+0" + +[[deps.libblastrampoline_jll]] +deps = ["Artifacts", "Libdl", "OpenBLAS_jll"] +uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" +version = "5.1.1+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.libpng_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] +git-tree-sha1 = "94d180a6d2b5e55e447e2d27a29ed04fe79eb30c" +uuid = "b53b4c65-9356-5827-b1ea-8c7a1a84506f" +version = "1.6.38+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.nghttp2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" +version = "1.48.0+0" + +[[deps.p7zip_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" +version = "17.4.0+0" + +[[deps.x264_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "4fea590b89e6ec504593146bf8b988b2c00922b2" +uuid = "1270edf5-f2f9-52d2-97e9-ab00b5d0237a" +version = "2021.5.5+0" + +[[deps.x265_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "ee567a171cce03570d77ad3a43e90218e38937a9" +uuid = "dfaa095f-4041-5dcd-9319-2fabd8486b76" +version = "3.5.0+0" + +[[deps.xkbcommon_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Wayland_jll", "Wayland_protocols_jll", "Xorg_libxcb_jll", "Xorg_xkeyboard_config_jll"] +git-tree-sha1 = "9ebfc140cc56e8c2156a15ceac2f0302e327ac0a" +uuid = "d8fb68d0-12a3-5cfd-a85a-d49703b185fd" +version = "1.4.1+0" +""" + +# ╔═║ Cell order: +# ╠═c6bd612e-21c4-4e2d-91ac-42fe4f611364 +# ╠═98f2eed8-89ad-4b5c-9fbd-790e8c322940 +# β•Ÿβ”€3b74812e-b8d0-482e-bedf-f49c54a1b92f +# ╠═b3b707d2-4a5b-11ed-1266-97264478041b +# ╠═c41ae1ce-2e04-4936-98f0-48c95468743a +# β•Ÿβ”€866fddf0-7894-4688-9e58-34442fa96b23 +# β•Ÿβ”€6f764336-6459-4df6-ae4c-839aa8dccac8 +# β•Ÿβ”€8d740a6f-f809-4171-b4fd-615cd0faaa99 +# β•Ÿβ”€401d487a-b297-41fd-9719-2b76cc9d1385 +# β•Ÿβ”€fd240f6c-fee4-4300-89ae-6372e671da43 +# β•Ÿβ”€949c2c07-8ee0-4294-8839-7353d4db213b +# β•Ÿβ”€41141c4e-c331-41a6-8165-3547da5e8d07 +# β•Ÿβ”€90c072fe-8013-48f8-9a7e-4c81e2708fe3 +# ╠═7cb286ce-da0c-4058-90ee-144f85b68315 +# β•Ÿβ”€4c6877be-4fcd-4e15-b1f5-4569209a3f39 +# ╠═8a04b937-c501-428c-9a08-f9b59c2066e2 +# ╠═d8b330af-1991-4fb9-a8db-e833c326d173 +# β•Ÿβ”€04ef7d70-a4a9-4d9f-add0-7b22aeb28b79 +# ╠═c7677c6d-44fd-4bcc-91ef-911a8a513bb6 +# ╠═dd22a20e-5db4-4a97-9572-ccc157c9d592 +# β•Ÿβ”€23a229b1-dcf2-4803-9bd6-8df2e60ba8f5 +# ╠═29550224-6f26-4e87-bfe2-e621802cc8d0 +# β•Ÿβ”€61c97fd4-c964-4347-90ca-a7e952b02ad6 +# β•Ÿβ”€29c9d2bc-3e90-4558-8e81-7b979be68d2b +# β•Ÿβ”€e831ff8c-93fc-437b-a5da-338fb37a8ac8 +# ╠═f90e05ad-2c19-40dd-952e-bb9ca485aeef +# β•Ÿβ”€d74a5724-def9-4c87-9fee-23544dc7b745 +# ╠═c03c8cc6-36d8-4102-a737-885e1a838ca2 +# β•Ÿβ”€cb502def-3d5c-46cb-b921-549a44d4dc9c +# β•Ÿβ”€02656905-39a5-45ca-ab90-4450147be7e2 +# ╠═74be726b-51a1-4ea3-8124-8cd3dcf3519d +# β•Ÿβ”€b9194069-682c-4f66-94d3-64d3c85a89cf +# ╠═8bc9e29d-873c-4866-b8ac-814bcef8da16 +# ╠═8e49c403-73e2-4011-ae06-1c20a3aa9157 +# β•Ÿβ”€0f2b0835-264d-412a-b53b-2d0d8bd987e1 +# β•Ÿβ”€65c11552-7eee-4216-9f39-fe2a63478835 +# β•Ÿβ”€30bad66b-0021-4bed-af8e-bbffebe2f84d +# ╠═b53f9a8a-8253-4326-ae8d-41c9c9f349c6 +# ╠═d4b252e6-5be7-4b93-b678-9a60ee27e67e +# β•Ÿβ”€f093e439-0671-435c-bf08-4622901fc0d8 +# β•Ÿβ”€103e3f01-14e0-440e-abde-0f464cb69055 +# β•Ÿβ”€bf2706b0-7c2e-4829-9667-13d037a258ca +# β•Ÿβ”€3d5590db-de13-4b83-8925-3ea1f813a9ec +# ╠═c4447d2d-cbe8-4146-a886-b8a531445d85 +# ╠═5b4e99ea-2d3d-4841-b792-7c08dea43110 +# β•Ÿβ”€41780c0a-2fb3-4329-a24d-86e5714600b7 +# ╠═c32c2e53-1689-4b9f-9e5e-4f2d7d62f43f +# β•Ÿβ”€b4b96d78-7f6f-4e3a-a711-51782c3a6cda +# ╠═86af8c5c-3bc8-4802-a934-22b487f74d2e +# β•Ÿβ”€49b09ba2-a276-430d-8cc1-74efc1a44f6f +# β•Ÿβ”€75e3d3ca-4705-464d-ac26-5dab7116e7cf +# ╠═e2427de0-bb05-4e97-be61-7ff5eb7bf425 +# β•Ÿβ”€83b3f372-e366-411f-9b27-58e1d400a57d +# ╠═cb290544-fa39-4766-b332-5c4f99165d29 +# β•Ÿβ”€164737a4-60eb-425a-b608-515067760fcb +# β•Ÿβ”€efaa6ba6-0ed6-4a9b-8654-77e305297885 +# β•Ÿβ”€f1e8f11b-18e6-4d4e-9fa1-1e8dcdc16444 +# ╠═ebbe26b6-66b4-4c75-8c11-d69aabda0064 +# β•Ÿβ”€1dc083e8-be0a-4b71-b898-b0b4f6788d7d +# β•Ÿβ”€f8f06daa-74aa-4195-8085-23262aa822b8 +# β•Ÿβ”€b86fbfea-d1ca-4226-8f01-3c903df66e6f +# ╠═dfd0c11e-f5bb-4cfa-ba09-71dadc7a54e7 +# β•Ÿβ”€1822a76e-994d-482e-8b60-f07183781f8f +# ╠═d738fc0f-bb2f-437b-9040-4f5ea4867918 +# ╠═608f973b-a502-4e8c-baa8-ce175c3d4688 +# β•Ÿβ”€fcc54748-62f9-44f3-9e73-c3da9efe0dc5 +# ╠═ab4a8076-21ae-4521-b18e-6cd5f05671da +# β•Ÿβ”€de549344-4979-425a-bc28-3572a4d9deb1 +# ╠═e13edf4e-0c88-4fb6-8955-1f4099c36761 +# β•Ÿβ”€3b4634a0-bcdf-4dff-8d3c-4fe7da7b11d4 +# ╠═7c28b7f1-0fe6-4022-939c-f478a93b7dac +# β•Ÿβ”€51cc15b4-c9ec-458f-81d5-b4648b0dd660 +# ╠═41cbc589-ab18-4bba-a374-efdc46e04b3b +# ╠═5cbe0f25-baa1-4f78-996d-fa57818448fc +# β•Ÿβ”€e151decd-531a-4b91-9ad1-803fe825d024 +# ╠═9f725037-e90f-4c7d-b4c1-7a3f8cb51f8d +# β•Ÿβ”€d433526c-e6fd-4f84-a391-bba29883d893 +# ╠═bbf06920-80bd-4a5d-b937-10d22abc4526 +# ╠═32fb7990-93f3-4101-b056-1725a615b495 +# β•Ÿβ”€48aee5a5-bad9-4462-a238-9666698ece3f +# ╠═f866ed9e-1a6d-4c9c-a3f6-91c8675aec21 +# ╠═d84713bf-08b5-4083-98d3-dda9ecc97b00 +# β•Ÿβ”€f1c42709-576e-4180-bb8b-a66c31f6c440 +# β•Ÿβ”€091ab1b7-ee29-440e-80de-e87eb50739b2 +# β•Ÿβ”€ee6e7754-6a8f-4e73-966b-2e09dba67ca3 +# β•Ÿβ”€cf61e96a-8e3f-4655-a9aa-85c39da060a3 +# β•Ÿβ”€aca07c02-db3a-44e4-bb33-73047f726f9d +# ╠═5ab1bea3-049e-4765-8323-f9ece4424230 +# β•Ÿβ”€64e4786c-1f13-4cf6-a6e6-016b9d595d26 +# β•Ÿβ”€edefd92d-4e63-4f4e-be96-ea9d6c74ab00 +# β•Ÿβ”€0c60b420-63d5-4a33-86c2-5dd460b55caa +# ╠═0b1a6b6a-a376-4a1b-a078-11d879541902 +# ╠═1b9b4c90-ec5d-4342-8451-3d19101ae942 +# β•Ÿβ”€6a5b2f84-81eb-48fa-a61e-1f289d5a3535 +# ╠═e2bcfb79-a4d5-4c3b-b77d-d2a8f3e42d71 +# β•Ÿβ”€7404efda-a9ba-40e6-b3c8-f7733d42ad1d +# ╠═de0c1b6a-adda-45c2-b1cc-43de3abeda63 +# β•Ÿβ”€f6f766a7-d859-420f-8c51-0ccb96df75f0 +# ╠═db19c2e4-7f13-4fec-9971-82a6e0268bc3 +# β•Ÿβ”€35ce934e-0b06-4d73-a4b1-4a7ad82f1574 +# ╠═018a1a45-7ec8-4994-b2dc-c2e3d22074cc +# ╠═b14f9d57-ce80-4920-b680-7034dcd047b8 +# ╠═54348524-df5b-4375-b7ec-fdb3d0126a10 +# ╠═780a8a88-6fce-431d-bcb4-08b3a4ea9985 +# ╠═cf10a39a-9187-4923-95ce-a9bf63833a7e +# ╠═1429926d-6f98-458d-aafe-7e40a17f17f4 +# β•Ÿβ”€9a074f51-00b7-4d31-a885-911a17e7d4d6 +# ╠═6695c9f5-d171-4079-b9c3-284d82623dbd +# β•Ÿβ”€261d51ea-322e-4573-a11c-5b215759fef5 +# β•Ÿβ”€ed355794-73f4-4882-8a3c-21f65c7c1114 +# β•Ÿβ”€39423543-2d79-4f18-b905-fb20a9a9dee1 +# ╠═85e63ff9-9a91-40a8-97f1-f7f9eeca3abf +# ╠═fee314d5-75da-4aa5-8ea9-c6b03f0783c2 +# β•Ÿβ”€fe81dc2e-1f2f-49db-97d9-0faf5c8db8fd +# β•Ÿβ”€d1672de6-d58e-44d3-9d12-2a59f49481a3 +# ╠═846597f0-6840-4312-84a7-d877aada2589 +# β•Ÿβ”€3fff69fd-25f4-4abf-938f-f06d02cfd83e +# β•Ÿβ”€0e86e043-c7b0-4015-8cb0-b9d6e1103778 +# β•Ÿβ”€d0c9d740-253e-4a5f-9519-a4a476b22319 +# ╠═c4ee99b6-dd9e-48b0-8652-8ac52f3082d3 +# ╠═24a208e9-e967-4523-97e5-6202e398cdd6 +# β•Ÿβ”€a77d1576-cd43-4de5-ad5d-e1b3698dcbc8 +# β•Ÿβ”€c0a970a3-fd0a-4180-bfba-7537c41e4c78 +# ╠═0767d676-efd0-479c-a551-10463e36b61c +# β•Ÿβ”€dfe05823-f0ef-4df6-9fa3-0301f4069f56 +# β•Ÿβ”€9fbf0b87-6af8-40ce-952f-05f4d9f89b8c +# ╠═48809f4a-1ced-48e9-90cb-b1f27ff83a58 +# ╠═78af5e63-0c95-49b5-9997-da5536a79897 +# β•Ÿβ”€49ffc7b2-ffbf-4a8d-a12b-37ab558b7f1c +# β•Ÿβ”€f66872a9-5280-44d5-9ef9-1529135e0984 +# ╠═b5470cd4-d8cc-47e5-8167-c03f0f974100 +# β•Ÿβ”€83cc679d-514a-41de-97ce-f9181fd67c70 +# ╠═320fe764-45ce-4f09-bea1-f77cccc11a9b +# β•Ÿβ”€702c37fc-4607-4a72-9ca3-af99d59de028 +# β•Ÿβ”€07fa38bf-a00d-49cd-bd56-891936cda37a +# β•Ÿβ”€5d4b8e42-7e9d-4069-b3f6-28a4c060f117 +# β•Ÿβ”€5308dcf7-aa8b-4b23-adec-33564d33c325 +# β•Ÿβ”€e5a95033-c389-4023-a02c-d448f1f2bc16 +# ╠═0d7426e1-620c-4096-906b-a9d1b9088740 +# β•Ÿβ”€8e26636f-728b-43f4-9859-82a7734c95a6 +# β•Ÿβ”€6f33f798-c0d3-46cd-9dd2-71b8a31bf617 +# β•Ÿβ”€e25e329e-4481-4b39-b895-93c82f9ea2c3 +# β•Ÿβ”€5f8ee73f-d729-4be2-ba20-00f8b453cdd4 +# ╠═31b05bd7-34e3-4612-9734-916d5a708bc0 +# ╠═f6f46184-904c-41f6-8664-2e132ea63287 +# β•Ÿβ”€085a5767-dee5-47e2-9d7c-101c188e92cf +# ╠═b69b8ce2-ff6d-4405-b9db-f9169f5f44ae +# β•Ÿβ”€f0f3bfe2-dcec-40f6-87c1-a5538c354dd0 +# β•Ÿβ”€85e93187-d7d5-4023-a243-d9b986f2e0a6 +# β•Ÿβ”€45329aaf-8bff-4381-bf60-ec68515f5e42 +# ╠═f08ae9c1-8b1b-4f49-ace3-b40b5d4f47bc +# ╠═e42ebdbe-e374-4aad-ba0f-46d3a20c3e5f +# β•Ÿβ”€2f2b457e-8f81-4886-8684-b80474676386 +# ╠═eb0eadbe-8b13-4bd8-b65e-4966e4a85f3d +# β•Ÿβ”€5aa70c8a-60fe-4bfa-aa1a-68a9204be4eb +# β•Ÿβ”€539f779e-0d6f-45e0-8e98-a3a1f5a3b50a +# ╠═0162de19-4c4c-4aba-9d56-cd7d67e58ef6 +# β•Ÿβ”€92cd9bc2-4757-4495-8c56-2ec5e30e9f06 +# β•Ÿβ”€1e48645c-ffab-4120-baf8-b4dd556330aa +# β•Ÿβ”€21b3a806-696d-45a6-a3dd-8e17f202355e +# β•Ÿβ”€e9403765-d42a-40aa-8c13-5cc3fc3754b8 +# β•Ÿβ”€b9f9f8ca-feeb-4b23-b5ee-f07204cb8daa +# ╠═8dc428d8-8dab-4143-94b3-56c7d29e95e6 +# β•Ÿβ”€26694aa3-415a-4ae6-87a3-82a16481f15a +# ╠═4ec83bfa-6d40-4b3f-92d4-79916e9c07ed +# β•Ÿβ”€5d51ab5a-5cd1-4157-b210-95ad9b96412c +# β•Ÿβ”€4a7ce64e-fbad-497c-a7bf-42464815bfd6 +# β•Ÿβ”€3e1ccc36-29bc-4c06-bf38-8197259fe68f +# β•Ÿβ”€2f9fad1c-c233-4d41-85f5-dbe76676a073 +# β•Ÿβ”€da91aa4a-8516-4f17-9026-21fb323338eb +# ╠═d5ca36a4-3467-43e2-b8d2-f367b9d23f45 +# ╠═5a0b53b1-0fc9-4fae-bc65-09dc256f4efa +# β•Ÿβ”€88ba3961-bc7d-4257-a1a4-7d6686e1a583 +# β•Ÿβ”€171aecd0-76e3-4118-bb3b-ac29945ef1b7 +# β•Ÿβ”€7b1e1d6e-8aeb-4503-a619-f69cbbde7025 +# ╠═6079c292-c38b-4cb9-8e09-e6fed033c42f +# β•Ÿβ”€4dce1ab4-fcf4-4e91-a9f9-f15c784b2501 +# ╠═67e283d3-9dd9-468f-97cd-16c0706aca00 +# β•Ÿβ”€e232b56e-d4bd-491f-baa0-15c63a7e7c0f +# ╠═711f732d-d6eb-4128-9765-b1580e1238b4 +# β•Ÿβ”€2426f0f6-c663-4718-8126-e76a2afce236 +# β•Ÿβ”€097613af-c9da-4285-99f4-56ff325acbbc +# ╠═3b0e364e-e3ea-4c73-8b3a-9b4e4528d8d3 +# ╠═26cf28b4-6fe9-4560-be5b-cb8fd2bba414 +# ╠═a2e7dc49-151d-43fd-a2cf-17d7d83900a6 +# β•Ÿβ”€926b3d7c-aea8-4c50-8eb5-0afc2f516af7 +# β•Ÿβ”€14fd83e4-3ebb-4445-848d-3c864b0549fe +# β•Ÿβ”€e50e6d8d-9bfe-4702-ac72-89d45e6eeb84 +# ╠═ab033e74-b244-445a-a9c6-fbcbd441d499 +# β•Ÿβ”€7d0c71c3-bd47-4e43-abee-ad34db5c5f9e +# ╠═85c86abd-03bc-42c3-a6b4-22e9d5269caa +# β•Ÿβ”€e10b46dd-bbe1-45fb-9077-f82219e82af0 +# β•Ÿβ”€52191ad7-195d-449d-96be-8a25cc674d87 +# β•Ÿβ”€d49a7c24-887d-4d5d-81a8-ff0d08937189 +# ╠═f8ad6892-f1f1-4231-82ed-14f4fe3878e7 +# β•Ÿβ”€1e398d0c-4b25-4a05-abbc-2d0d6916bd77 +# ╠═e018dd21-07e6-4c1d-ad04-9b45d2f991b5 +# β•Ÿβ”€e080aa6d-2ac8-472f-b3b2-84d454cdb6c4 +# ╠═1b66d8d2-f534-4f78-9640-9800eddc0e20 +# β•Ÿβ”€9cf65bc1-872c-40c3-9448-255ebaa2b3a3 +# β•Ÿβ”€1600e9c7-0aa7-4079-94ec-7a2a8b896d1b +# ╠═270be245-30c8-4404-ba1c-52646e98742e +# β•Ÿβ”€1c98ff24-681f-4c76-ba8a-b89e82eb41e3 +# β•Ÿβ”€b5726056-d2a8-46f3-bf0f-a5959da92c6d +# β•Ÿβ”€a21dcf25-9321-439c-9e3d-6fcc6fc6909b +# β•Ÿβ”€d5f81c9e-930e-4272-8e95-48e2de5f255a +# β•Ÿβ”€00000000-0000-0000-0000-000000000001 +# β•Ÿβ”€00000000-0000-0000-0000-000000000002 diff --git a/homeworks_old/hw5-gpu.jl b/homeworks_old/hw5-gpu.jl new file mode 100644 index 0000000..5359409 --- /dev/null +++ b/homeworks_old/hw5-gpu.jl @@ -0,0 +1,437 @@ +### A Pluto.jl notebook ### +# v0.19.8 + +using Markdown +using InteractiveUtils + +# ╔═║ 956634aa-547b-11ed-2e14-1ff1f6d562d8 +begin + using BenchmarkTools + using Statistics + + BenchmarkTools.DEFAULT_PARAMETERS.seconds = 15.0 +end; + +# ╔═║ 5950d5f0-e1f2-472b-ac4c-361c208bb9a7 +using CUDA + +# ╔═║ d89ee739-b144-48a3-9e53-423d8351f75f +md""" +# GPU Demo Notebook +In this short demo we are going to look at a simple example of running Julia code on the GPU and seeing what kind of performance boost we can get versus running on a CPU. The example will be the most fundamental GPU task: matrix multiplication. + +The point of this demo is to make sure you are able to run GPU code successfully as well as to show you a first compelling example of why GPUs are important for HPC (high performance computing). +""" + +# ╔═║ 801929aa-64be-4053-b3fa-8b00b9e4aa95 +N = 3000 + +# ╔═║ 96fe138c-3e80-4cb5-b1d3-62dba08f2257 +A = rand(N, N) + +# ╔═║ d1828384-d821-4a2a-b19c-5e2bb7a88c43 +@benchmark $A * $A + +# ╔═║ b1c5ce5a-d682-42d5-9bb5-cf07fb8313be +md""" +## CUDA.jl +CUDA.jl is the Julia package that lets you write Julia code that can run on CUDA-compatible (i.e. Nvidia) GPUs. To move your data `A` from CPU memory to GPU memory, all you have to do is run `A_gpu = CuArray(A)`. Then you can proceed as usual but computations involving only `A_gpu` will be run on the GPU instead of the CPU. +""" + +# ╔═║ 31ea1880-46c4-4a44-b3f8-d595d4040654 +A_gpu = CuArray(A) # the first time you run this cell will take a minute to run + # while CUDA.jl compiles + +# ╔═║ 924713fa-068f-4112-8e50-9f5c78b0644d +# We need to use CUDA.@sync to account for the GPU time in the benchmark. +@benchmark CUDA.@sync $A_gpu * $A_gpu + +# ╔═║ ec53920a-625b-446c-ae95-f2f5a78c81dc +md""" +## Accuracy +Recall that computers generally store non-integer numbers in a [floating-point representation](https://en.wikipedia.org/wiki/Floating-point_arithmetic). You might be familiar with the fact that unlike addition over the reals, addition over floating point numbers is _not_ [associative](https://en.wikipedia.org/wiki/Associative_property). Consider the following example. +""" + +# ╔═║ c7afca91-ee61-4a66-9baf-4a11916a70e3 +let + # using @show because if we just return `a` from the cell + # Pluto would truncate to make it look nice + @show a = (0.1 + 0.2) + 0.3 + @show b = 0.1 + (0.2 + 0.3) + @show a - b # with real numbers this would be 0, but not with floats +end + +# ╔═║ b8cfabde-d51d-45ee-8a56-3282cfbfdfbd +md""" +Running matrix multiplication on the GPU will calculate many things in parallel and then add them up (this is why it is so much faster than the CPU). This different order of floating point operations means that the results could be slightly different due to the lack of associativity. Let's see what the difference is. +""" + +# ╔═║ ce9136e4-06c0-4caf-8e46-09653f40c7e4 +# the gpu_result.value is on the GPU, so we use Array(_) to move it back to the CPU +# since you can't mix GPU memory and CPU memory in your calculation +mean(abs.(A * A - Array(A_gpu * A_gpu))) + +# ╔═║ 00000000-0000-0000-0000-000000000001 +PLUTO_PROJECT_TOML_CONTENTS = """ +[deps] +BenchmarkTools = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf" +CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" +Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" + +[compat] +BenchmarkTools = "~1.3.1" +CUDA = "~3.12.0" +""" + +# ╔═║ 00000000-0000-0000-0000-000000000002 +PLUTO_MANIFEST_TOML_CONTENTS = """ +# This file is machine-generated - editing it directly is not advised + +julia_version = "1.7.2" +manifest_format = "2.0" + +[[deps.AbstractFFTs]] +deps = ["ChainRulesCore", "LinearAlgebra"] +git-tree-sha1 = "69f7020bd72f069c219b5e8c236c1fa90d2cb409" +uuid = "621f4979-c628-5d54-868e-fcf4e3e8185c" +version = "1.2.1" + +[[deps.Adapt]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "195c5505521008abea5aee4f96930717958eac6f" +uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" +version = "3.4.0" + +[[deps.ArgTools]] +uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" + +[[deps.Artifacts]] +uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" + +[[deps.BFloat16s]] +deps = ["LinearAlgebra", "Printf", "Random", "Test"] +git-tree-sha1 = "a598ecb0d717092b5539dbbe890c98bac842b072" +uuid = "ab4f0b2a-ad5b-11e8-123f-65d77653426b" +version = "0.2.0" + +[[deps.Base64]] +uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" + +[[deps.BenchmarkTools]] +deps = ["JSON", "Logging", "Printf", "Profile", "Statistics", "UUIDs"] +git-tree-sha1 = "4c10eee4af024676200bc7752e536f858c6b8f93" +uuid = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf" +version = "1.3.1" + +[[deps.CEnum]] +git-tree-sha1 = "eb4cb44a499229b3b8426dcfb5dd85333951ff90" +uuid = "fa961155-64e5-5f13-b03f-caf6b980ea82" +version = "0.4.2" + +[[deps.CUDA]] +deps = ["AbstractFFTs", "Adapt", "BFloat16s", "CEnum", "CompilerSupportLibraries_jll", "ExprTools", "GPUArrays", "GPUCompiler", "LLVM", "LazyArtifacts", "Libdl", "LinearAlgebra", "Logging", "Printf", "Random", "Random123", "RandomNumbers", "Reexport", "Requires", "SparseArrays", "SpecialFunctions", "TimerOutputs"] +git-tree-sha1 = "49549e2c28ffb9cc77b3689dc10e46e6271e9452" +uuid = "052768ef-5323-5732-b1bb-66c8b64840ba" +version = "3.12.0" + +[[deps.ChainRulesCore]] +deps = ["Compat", "LinearAlgebra", "SparseArrays"] +git-tree-sha1 = "8a494fe0c4ae21047f28eb48ac968f0b8a6fcaa7" +uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" +version = "1.15.4" + +[[deps.ChangesOfVariables]] +deps = ["ChainRulesCore", "LinearAlgebra", "Test"] +git-tree-sha1 = "38f7a08f19d8810338d4f5085211c7dfa5d5bdd8" +uuid = "9e997f8a-9a97-42d5-a9f1-ce6bfc15e2c0" +version = "0.1.4" + +[[deps.Compat]] +deps = ["Dates", "LinearAlgebra", "UUIDs"] +git-tree-sha1 = "5856d3031cdb1f3b2b6340dfdc66b6d9a149a374" +uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" +version = "4.2.0" + +[[deps.CompilerSupportLibraries_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" + +[[deps.Dates]] +deps = ["Printf"] +uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" + +[[deps.DocStringExtensions]] +deps = ["LibGit2"] +git-tree-sha1 = "5158c2b41018c5f7eb1470d558127ac274eca0c9" +uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" +version = "0.9.1" + +[[deps.Downloads]] +deps = ["ArgTools", "LibCURL", "NetworkOptions"] +uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" + +[[deps.ExprTools]] +git-tree-sha1 = "56559bbef6ca5ea0c0818fa5c90320398a6fbf8d" +uuid = "e2ba6199-217a-4e67-a87a-7c52f15ade04" +version = "0.1.8" + +[[deps.GPUArrays]] +deps = ["Adapt", "GPUArraysCore", "LLVM", "LinearAlgebra", "Printf", "Random", "Reexport", "Serialization", "Statistics"] +git-tree-sha1 = "45d7deaf05cbb44116ba785d147c518ab46352d7" +uuid = "0c68f7d7-f131-5f86-a1c3-88cf8149b2d7" +version = "8.5.0" + +[[deps.GPUArraysCore]] +deps = ["Adapt"] +git-tree-sha1 = "6872f5ec8fd1a38880f027a26739d42dcda6691f" +uuid = "46192b85-c4d5-4398-a991-12ede77f4527" +version = "0.1.2" + +[[deps.GPUCompiler]] +deps = ["ExprTools", "InteractiveUtils", "LLVM", "Libdl", "Logging", "TimerOutputs", "UUIDs"] +git-tree-sha1 = "122d7bcc92abf94cf1a86281ad7a4d0e838ab9e0" +uuid = "61eb1bfa-7361-4325-ad38-22787b887f55" +version = "0.16.3" + +[[deps.InteractiveUtils]] +deps = ["Markdown"] +uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" + +[[deps.InverseFunctions]] +deps = ["Test"] +git-tree-sha1 = "b3364212fb5d870f724876ffcd34dd8ec6d98918" +uuid = "3587e190-3f89-42d0-90ee-14403ec27112" +version = "0.1.7" + +[[deps.IrrationalConstants]] +git-tree-sha1 = "7fd44fd4ff43fc60815f8e764c0f352b83c49151" +uuid = "92d709cd-6900-40b7-9082-c6be49f344b6" +version = "0.1.1" + +[[deps.JLLWrappers]] +deps = ["Preferences"] +git-tree-sha1 = "abc9885a7ca2052a736a600f7fa66209f96506e1" +uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" +version = "1.4.1" + +[[deps.JSON]] +deps = ["Dates", "Mmap", "Parsers", "Unicode"] +git-tree-sha1 = "3c837543ddb02250ef42f4738347454f95079d4e" +uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" +version = "0.21.3" + +[[deps.LLVM]] +deps = ["CEnum", "LLVMExtra_jll", "Libdl", "Printf", "Unicode"] +git-tree-sha1 = "e7e9184b0bf0158ac4e4aa9daf00041b5909bf1a" +uuid = "929cbde3-209d-540e-8aea-75f648917ca0" +version = "4.14.0" + +[[deps.LLVMExtra_jll]] +deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl", "Pkg", "TOML"] +git-tree-sha1 = "771bfe376249626d3ca12bcd58ba243d3f961576" +uuid = "dad2f222-ce93-54a1-a47d-0025e8a3acab" +version = "0.0.16+0" + +[[deps.LazyArtifacts]] +deps = ["Artifacts", "Pkg"] +uuid = "4af54fe1-eca0-43a8-85a7-787d91b784e3" + +[[deps.LibCURL]] +deps = ["LibCURL_jll", "MozillaCACerts_jll"] +uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" + +[[deps.LibCURL_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] +uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" + +[[deps.LibGit2]] +deps = ["Base64", "NetworkOptions", "Printf", "SHA"] +uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" + +[[deps.LibSSH2_jll]] +deps = ["Artifacts", "Libdl", "MbedTLS_jll"] +uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" + +[[deps.Libdl]] +uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" + +[[deps.LinearAlgebra]] +deps = ["Libdl", "libblastrampoline_jll"] +uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + +[[deps.LogExpFunctions]] +deps = ["ChainRulesCore", "ChangesOfVariables", "DocStringExtensions", "InverseFunctions", "IrrationalConstants", "LinearAlgebra"] +git-tree-sha1 = "94d9c52ca447e23eac0c0f074effbcd38830deb5" +uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688" +version = "0.3.18" + +[[deps.Logging]] +uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" + +[[deps.Markdown]] +deps = ["Base64"] +uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" + +[[deps.MbedTLS_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" + +[[deps.Mmap]] +uuid = "a63ad114-7e13-5084-954f-fe012c677804" + +[[deps.MozillaCACerts_jll]] +uuid = "14a3606d-f60d-562e-9121-12d972cd8159" + +[[deps.NetworkOptions]] +uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" + +[[deps.OpenBLAS_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] +uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" + +[[deps.OpenLibm_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "05823500-19ac-5b8b-9628-191a04bc5112" + +[[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.Parsers]] +deps = ["Dates"] +git-tree-sha1 = "3d5bf43e3e8b412656404ed9466f1dcbf7c50269" +uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" +version = "2.4.0" + +[[deps.Pkg]] +deps = ["Artifacts", "Dates", "Downloads", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] +uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" + +[[deps.Preferences]] +deps = ["TOML"] +git-tree-sha1 = "47e5f437cc0e7ef2ce8406ce1e7e24d44915f88d" +uuid = "21216c6a-2e73-6563-6e65-726566657250" +version = "1.3.0" + +[[deps.Printf]] +deps = ["Unicode"] +uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" + +[[deps.Profile]] +deps = ["Printf"] +uuid = "9abbd945-dff8-562f-b5e8-e1ebf5ef1b79" + +[[deps.REPL]] +deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] +uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" + +[[deps.Random]] +deps = ["SHA", "Serialization"] +uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" + +[[deps.Random123]] +deps = ["Random", "RandomNumbers"] +git-tree-sha1 = "7a1a306b72cfa60634f03a911405f4e64d1b718b" +uuid = "74087812-796a-5b5d-8853-05524746bad3" +version = "1.6.0" + +[[deps.RandomNumbers]] +deps = ["Random", "Requires"] +git-tree-sha1 = "043da614cc7e95c703498a491e2c21f58a2b8111" +uuid = "e6cf234a-135c-5ec9-84dd-332b85af5143" +version = "1.5.3" + +[[deps.Reexport]] +git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" +uuid = "189a3867-3050-52da-a836-e630ba90ab69" +version = "1.2.2" + +[[deps.Requires]] +deps = ["UUIDs"] +git-tree-sha1 = "838a3a4188e2ded87a4f9f184b4b0d78a1e91cb7" +uuid = "ae029012-a4dd-5104-9daa-d747884805df" +version = "1.3.0" + +[[deps.SHA]] +uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" + +[[deps.Serialization]] +uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" + +[[deps.Sockets]] +uuid = "6462fe0b-24de-5631-8697-dd941f90decc" + +[[deps.SparseArrays]] +deps = ["LinearAlgebra", "Random"] +uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + +[[deps.SpecialFunctions]] +deps = ["ChainRulesCore", "IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"] +git-tree-sha1 = "d75bda01f8c31ebb72df80a46c88b25d1c79c56d" +uuid = "276daf66-3868-5448-9aa4-cd146d93841b" +version = "2.1.7" + +[[deps.Statistics]] +deps = ["LinearAlgebra", "SparseArrays"] +uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" + +[[deps.TOML]] +deps = ["Dates"] +uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" + +[[deps.Tar]] +deps = ["ArgTools", "SHA"] +uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" + +[[deps.Test]] +deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] +uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[[deps.TimerOutputs]] +deps = ["ExprTools", "Printf"] +git-tree-sha1 = "9dfcb767e17b0849d6aaf85997c98a5aea292513" +uuid = "a759f4b9-e2f1-59dc-863e-4aeb61b1ea8f" +version = "0.5.21" + +[[deps.UUIDs]] +deps = ["Random", "SHA"] +uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" + +[[deps.Unicode]] +uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" + +[[deps.Zlib_jll]] +deps = ["Libdl"] +uuid = "83775a58-1f1d-513f-b197-d71354ab007a" + +[[deps.libblastrampoline_jll]] +deps = ["Artifacts", "Libdl", "OpenBLAS_jll"] +uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" + +[[deps.nghttp2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" + +[[deps.p7zip_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" +""" + +# ╔═║ Cell order: +# ╠═956634aa-547b-11ed-2e14-1ff1f6d562d8 +# β•Ÿβ”€d89ee739-b144-48a3-9e53-423d8351f75f +# ╠═801929aa-64be-4053-b3fa-8b00b9e4aa95 +# ╠═96fe138c-3e80-4cb5-b1d3-62dba08f2257 +# ╠═d1828384-d821-4a2a-b19c-5e2bb7a88c43 +# β•Ÿβ”€b1c5ce5a-d682-42d5-9bb5-cf07fb8313be +# ╠═5950d5f0-e1f2-472b-ac4c-361c208bb9a7 +# ╠═31ea1880-46c4-4a44-b3f8-d595d4040654 +# ╠═924713fa-068f-4112-8e50-9f5c78b0644d +# β•Ÿβ”€ec53920a-625b-446c-ae95-f2f5a78c81dc +# ╠═c7afca91-ee61-4a66-9baf-4a11916a70e3 +# β•Ÿβ”€b8cfabde-d51d-45ee-8a56-3282cfbfdfbd +# ╠═ce9136e4-06c0-4caf-8e46-09653f40c7e4 +# β•Ÿβ”€00000000-0000-0000-0000-000000000001 +# β•Ÿβ”€00000000-0000-0000-0000-000000000002 diff --git a/homeworks_old/hw5.jl b/homeworks_old/hw5.jl new file mode 100644 index 0000000..0379498 --- /dev/null +++ b/homeworks_old/hw5.jl @@ -0,0 +1,1942 @@ +### A Pluto.jl notebook ### +# v0.19.14 + +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 + +# ╔═║ 0d4205ec-fec1-4ef4-af48-7dae51ab31ee +begin + using BenchmarkTools + using FileIO + using ImageIO + using ImageShow + using KrylovKit + using LinearAlgebra + using PlutoUI + using PlutoTeachingTools +end + +# ╔═║ d5cd95f9-6728-47e2-bba4-00298c78d50c +student = (name = "Jazzy Doe", kerberos_id = "jazz") + +# ╔═║ 1b452080-14eb-41f7-969b-e2727af54fa3 +PlutoUI.TableOfContents() + +# ╔═║ 355479cd-7598-48e9-8283-da36d0e84393 +PlutoUI.Resource("https://raw.githubusercontent.com/mitmath/JuliaComputation/main/homeworks/images/lineland.png") + +# ╔═║ f205fe06-9849-435f-963c-d7596592c979 +# Your code here + +# ╔═║ fab7a339-a43c-4209-b15a-fe64e670636f +if @isdefined meeting_matrix + let + p = collect(1:5) ./ 5 + M = meeting_matrix(p) + end +end + +# ╔═║ fe962381-6010-4c9c-8893-c51ce0ce17e4 +function meeting_matrix5(p::Vector{R}) where {R} + @assert length(p) == 5 + pΜ„ = one(R) .- p + M = [ + zero(R) p[1]*p[2] p[1]*pΜ„[2]*p[3] p[1]*pΜ„[2]*pΜ„[3]*p[4] p[1]*pΜ„[2]*pΜ„[3]*pΜ„[4]*p[5] + p[2]*p[1] zero(R) p[2]*p[3] p[2]*pΜ„[3]*p[4] p[2]*pΜ„[3]*pΜ„[4]*p[5] + p[3]*pΜ„[2]*p[1] p[3]*p[2] zero(R) p[3]*p[4] p[3]*pΜ„[4]*p[5] + p[4]*pΜ„[3]*pΜ„[2]*p[1] p[4]*pΜ„[3]*p[2] p[4]*p[3] zero(R) p[4]*p[5] + p[5]*pΜ„[4]*pΜ„[3]*pΜ„[2]*p[1] p[5]*pΜ„[4]*pΜ„[3]*p[2] p[5]*pΜ„[4]*p[3] p[5]*p[4] zero(R) + ] + return M +end + +# ╔═║ f90861ce-0854-44aa-b064-d59b1d113528 +# Your code here + +# ╔═║ 2bf674a4-d039-48af-8642-1160873b2f70 +# Your code here + +# ╔═║ 02f7ec49-1ab9-4ae0-a3ee-baee0dd25ea6 +# Your code here + +# ╔═║ 2d3f2591-3d7b-41b6-9129-777168379510 +# Your code here + +# ╔═║ 8686e348-f608-4b2f-aec5-c524444d6ce5 +if @isdefined MeetingMatrix + let + p = collect(1:5) ./ 5 + M = MeetingMatrix(p) + end +end + +# ╔═║ efa37d3b-b556-419e-a8ab-5e627975cca4 +# Your code here + +# ╔═║ e029e040-b0f9-41ed-9474-7f31bd21bf06 +if @isdefined MeetingMatrix + let + p = collect(1:4) ./ 5 + M = MeetingMatrix(p) + det(M), tr(M) + end +end + +# ╔═║ d3f9486e-1ad5-4062-845a-76e6cfeb715c +# Your code here + +# ╔═║ 1821f496-c065-468e-a206-c0fd2e75e539 +function multiply_neighbors_matrix(p::Vector, x) + return [multiply_row_neighbors_matrix(p, i, x) for i in 1:length(p)] +end + +# ╔═║ 8b896d3d-7796-468d-ae6e-553ed4eb84e4 +function neighbors_matrix5(p::Vector{R}) where {R} + pΜ„ = one(R) .- p + N = [ + zero(R) one(R) pΜ„[2] pΜ„[2]*pΜ„[3] pΜ„[2]*pΜ„[3]*pΜ„[4] + one(R) zero(R) one(R) pΜ„[3] pΜ„[3]*pΜ„[4] + pΜ„[2] one(R) zero(R) one(R) pΜ„[4] + pΜ„[3]*pΜ„[2] pΜ„[3] one(R) zero(R) one(R) + pΜ„[4]*pΜ„[3]*pΜ„[2] pΜ„[4]*pΜ„[3] pΜ„[4] one(R) zero(R) + ] + return N +end + +# ╔═║ af29b6cc-ed69-466d-98eb-62fa41806cae +function one_hot(n, i) + x = zeros(n) + x[i] = 1.0 + return x +end + +# ╔═║ 28d69223-f7a3-4b9f-8eb9-8dc1239ba04a +# Your code here + +# ╔═║ def18cb7-29db-4de6-b896-69923c038f74 +if (@isdefined meeting_matrix) && (@isdefined multiply_meeting_matrix) + let + p = collect(1:5) ./ 5 + x = rand(5) + meeting_matrix(p) * x, multiply_meeting_matrix(p, x) + end +end + +# ╔═║ 51bdc11d-8bcb-4a31-b455-af176e4adf1a +let + A = rand(4, 4) + b = rand(4) + x = A \ b + A * x - b +end + +# ╔═║ 047d66ac-64fa-47e9-a566-89d840b8ea07 +let + A = rand(4, 4) + b = rand(4) + x1 = @btime $A \ $b + x2 = @btime inv($A) * $b + @assert A * x1 β‰ˆ b + @assert A * x2 β‰ˆ b + x1, x2 +end + +# ╔═║ a94d571f-a983-474e-b4e2-f9044dd87be0 +let + A = rand(4, 8) + b = rand(4) + x1 = A \ b + x2 = pinv(A) * b + @assert A * x1 β‰ˆ b + @assert A * x2 β‰ˆ b + x1, x2 +end + +# ╔═║ 2af6a3a0-6ccc-40d6-9af1-9046551a85d1 +let + A = rand(8, 4) + b = rand(8) + x1 = A \ b + x2 = pinv(A) * b + @assert !(A * x1 β‰ˆ b) + @assert !(A * x2 β‰ˆ b) + x1, x2 +end + +# ╔═║ a876ca5b-1b10-420e-b070-bfc5126e9065 +let + A = rand(4, 4) + b = rand(4) + @which A \ b +end + +# ╔═║ bb3e3399-a7bc-49a2-8e10-88e6e7f82751 +let + A = Symmetric(rand(4, 4)) + b = rand(4) + @which A \ b +end + +# ╔═║ 87300b00-cb9b-4584-8d17-fe9e8a9359de +let + A = Diagonal(rand(4, 4)) + b = rand(4) + @which A \ b +end + +# ╔═║ 8151780e-6e83-473f-ae88-fb991ce35ec7 +let + A = rand(4, 4) # matrix + A_fun = (x -> A * x) # function + b = rand(4) + x1 = A \ b + x2, _ = linsolve(A_fun, b) + x1, x2 +end + +# ╔═║ 480252e0-0815-45b0-b1c4-51bdbd02561c +struct LazyMatrixSum{ + R,M1<:AbstractMatrix{R},M2<:AbstractMatrix{R} +} <: AbstractMatrix{R} + m1::M1 + m2::M2 + function LazyMatrixSum(m1, m2) + @assert eltype(m1) == eltype(m2) + @assert size(m1) == size(m2) + return new{eltype(m1),typeof(m1),typeof(m2)}(m1, m2) + end +end + +# ╔═║ a201234a-65e0-42d9-8b4a-619243542cb7 +Base.size(ls::LazyMatrixSum) = size(ls.m1) + +# ╔═║ e4c988de-2d03-43c8-ae5d-c708e76dc463 +Base.getindex(ls::LazyMatrixSum, i, j) = ls.m1[i, j] + ls.m2[i, j] + +# ╔═║ d4f96362-7945-4a18-99dd-52a94f6cc65b +md""" +Homework 5 of the MIT Course [_Julia: solving real-world problems with computation_](https://github.com/mitmath/JuliaComputation) + +Release date: Thursday, Oct 27, 2022 (version 2) + +**Due date: Thursday, Nov 3, 2022 at 11:59pm EST** + +Submission by: Jazzy Doe (jazz@mit.edu) +""" + +# ╔═║ c0f57380-f746-4d22-8403-8d9d4606012f +md""" +# 1. Social gatherings on a street +""" + +# ╔═║ fedf534f-24b2-43ea-96dd-86f678987ec9 +md""" +## 1.1 Problem description +""" + +# ╔═║ 36976d68-1684-4123-a663-8b0407ee31ee +md""" +Welcome to Julia Street, the beating heart of Julia Town! +In this charming neighborhood, the residents are numbered from $1$ to $n$, as they should be. +They like to visit each other for a cup of tea, but due to their random moods, things rarely go as planned... + +Every day, each resident $i \in [n]$ chooses their mood following a coin flip: good with probability $p_i$, and bad with probability $1-p_i$. +For residents $i$ and $j$ to meet, the following conditions must be satisfied (we assume $i < j$): +- both $i$ and $j$ must be in a good mood +- all the other $k \in \{i+1,...,j-1\}$ must be in a bad mood +Indeed, if even one resident $k$ between them is also in a good mood, $i$ will stop at $k$'s house on the way to $j$'s, and so the meeting between $i$ and $j$ will never happen. + +""" + +# ╔═║ 33845853-3597-4998-b04b-c6886d64adea +md""" +In other words, the probability that $i$ and $j$ meet on a given day is +```math + M_{ij}(p) = p_i \left(\prod_{k=\min(i,j)+1}^{\max(i,j)-1} (1-p_k)\right) p_j +``` +We also define $M_{ii}(p) = 0$. +As an example, for $n = 5$, we have +```math +M(p) = \begin{pmatrix} +0 & p_1 p_2 & p_1 \bar{p}_2 p_3 & p_1 \bar{p}_2 \bar{p}_3 p_4 & p_1 \bar{p}_2 \bar{p}_3 \bar{p}_4 p_5 \\ +p_2 p_1 & 0 & p_2 p_3 & p_2 \bar{p}_3 p_4 & p_2 \bar{p}_3 \bar{p}_4 p_5 \\ +p_3 \bar{p}_2 p_1 & p_3 p_2 & 0 & p_3 p_4 & p_3 \bar{p}_4 p_5 \\ +p_4 \bar{p}_3 \bar{p}_2 p_1 & p_4 \bar{p}_3 p_2 & p_4 p_3 & 0 & p_4 p_5 \\ +p_5 \bar{p}_4 \bar{p}_3 \bar{p}_2 p_1 & p_5 \bar{p}_4 \bar{p}_3 p_2 & p_5 \bar{p}_4 p_3 & p_5 p_4 & 0 +\end{pmatrix} +``` +where we wrote $\bar{p}_i = 1-p_i$ for convenience. +""" + +# ╔═║ 36ba0cd6-61e7-46ea-92af-bec8758b2f0a +md""" +## 1.2 Matrix representations +""" + +# ╔═║ df267206-71ee-47b1-b732-5adbad023cea +md""" +The goal of this section is to present several ways to manipulate a matrix. +""" + +# ╔═║ e1d3d726-0f2b-437f-831c-521e9c105176 +md""" +!!! danger "Task 1.2.1" + Define a function `meeting_matrix(p)` which takes a vector $p$ of mood probabilities and returns the matrix $M(p)$ of meeting probabilities. + The output matrix should have the same element type as the input vector. +""" + +# ╔═║ 363b3a59-4e7c-4532-a52d-aa1ece8a2237 +hint(md""" +Use the `prod` function to compute a product. +You will probably get a `MethodError`, which can be solved by supplying an `init` keyword argument (what is the neutral element for multiplication?) +""") + +# ╔═║ 625b8ace-cbbc-4dfe-aa71-0d60ad9786b6 +if @isdefined meeting_matrix + let + p = collect(1:5) ./ 5 + M_true = meeting_matrix5(p) + try + M = meeting_matrix(p) + if M β‰ˆ M_true + correct() + else + almost(md"`meeting_matrix` returns an incorrect result") + end + catch e + almost(md"`meeting_matrix` throws an error") + end + end +else + almost(md"You need to define `meeting_matrix`") +end + +# ╔═║ dc47f817-b451-4055-bb8e-3bd6687f0e3c +md""" +!!! danger "Task 1.2.2" + Does $M(p)$ have any interesting structural property? + How can we express it in Julia code? +""" + +# ╔═║ c6cf31d9-dfe1-4b9a-acb3-0ad199b7f03a +hint(md"Take a look at the documentation on [special matrices](https://docs.julialang.org/en/v1/stdlib/LinearAlgebra/#Special-matrices)") + +# ╔═║ 59381db6-4f7c-4255-9e4a-6b116d6542fa +md""" +> Your answer here +""" + +# ╔═║ 641c4d16-445e-41e6-b978-b7acb2a31981 +md""" +This special format is interesting because +- it enforces equality between the upper and lower triangular parts of a matrix +- it can influence the efficiency of numerical linear algebra (more on this below) +""" + +# ╔═║ 1fecaaac-7c37-4032-af5e-f784b9977765 +md""" +Unfortunately, even a symmetric matrix still needs to store $\frac{n(n+1)}{2}$ coefficients. +For our specific use case, this is a bit overkill, because $M(p)$ is entirely defined by $n$ coefficients. +This means we can save memory thanks to a custom struct which "behaves like a matrix". +The way to do that is by extending the [`AbstractArray` interface](https://docs.julialang.org/en/v1/manual/interfaces/#man-interface-array). +""" + +# ╔═║ 36fc7d25-77b9-4088-b46c-6e718528ffa0 +md""" +!!! danger "Task 1.2.3" + Define a parametric struct `MeetingMatrix{R}` whose only field `p` is a vector with elements of type `R`. + Make this struct a subtype of `AbstractMatrix{R}`. +""" + +# ╔═║ 5e68a931-0306-4581-b256-a193658439a5 +md""" +!!! danger "Task 1.2.4" + Implement the methods `Base.size(M)` and `Base.getindex(M, i, j)` for the type `MeetingMatrix`. +""" + +# ╔═║ eb5404f6-8f4d-449e-959f-fc81debbef7f +if @isdefined MeetingMatrix + let + p = collect(1:5) ./ 5 + M_true = meeting_matrix5(p) + try + M = MeetingMatrix(p) + if Matrix(M) β‰ˆ M_true + correct() + else + almost(md"`MeetingMatrix` returns an incorrect result") + end + catch e + almost(md"`MeetingMatrix` throws an error") + end + end +else + almost(md"You need to define `MeetingMatrix`") +end + +# ╔═║ ddf2584f-63e0-4fe7-a895-a850ed97a0b8 +md""" +Note that the Pluto (and REPL) display will compute a few coefficients of the `MeetingMatrix`, but these coefficients are not actually stored within the struct. +""" + +# ╔═║ 55d51ebf-8172-414f-b868-b7b24cbb787d +md""" +!!! danger "Task 1.2.5" + Compare the memory footprint of `M1 = meeting_matrix(p)` and `M2 = MeetingMatrix(p)`. + What did we sacrifice for this gain? +""" + +# ╔═║ 3403402f-7a4c-4d00-873e-17a44ca8f7aa +hint(md"Use the function `Base.summarysize`") + +# ╔═║ aef77331-eaea-4b34-a944-537f1c0b53a0 +md""" +> Your answer here +""" + +# ╔═║ 7d39ac63-708b-4374-902f-cedf3d9df384 +md""" +Now that our struct "behaves like a matrix", the whole universe of linear algebra becomes accessible without further effort! +""" + +# ╔═║ f6b41ff9-d362-469d-a714-2b85acba2b03 +md""" +In some situations, it might be more efficient to consider matrices as linear operators, i.e. functions that apply to vectors. +We have seen an example in HW2 with vector-Jacobian products, and now we give another one. +""" + +# ╔═║ 9177bb33-0240-41a7-8732-85b0471d5548 +md""" +!!! danger "Task 1.2.6" + Look at the formula for $M(p)$ with $n = 5$. + What do you notice about the first term in the products on a given row? And the last term in the products on a given column? +""" + +# ╔═║ 5e8c1a90-7461-4116-a6aa-fff4d8f2def6 +md""" +> Your answer here +""" + +# ╔═║ f2a9da31-8c31-4a72-9f2b-9541ee3931fc +md""" +!!! danger "Task 1.2.7" + Give another expression for $M(p)$ of the form $D(p) N(p) D(p)$, where + - the term $D(p)$ is a diagonal matrix whose coefficients only involve $p$ + - the term $N(p)$ is the neighbors matrix whose coefficients only involve $\bar{p}$ +""" + +# ╔═║ 3f6001f1-3bf3-4a89-92ca-07a8ee0bab75 +md""" +> Your answer here +""" + +# ╔═║ 2befedaf-5fd2-471c-8e8b-574f741277ef +md""" +!!! danger "Task 1.2.8" + Define a function `multiply_row_neighbors_matrix(p, i, x)` which returns the dot product between the $i$-th row of $N(p)$ and a vector $x$. + Your function must be efficient: avoid recomputing products of the $\bar{p}_j$ whenever possible. +""" + +# ╔═║ 80030ad9-956d-464a-87d3-e5b6083e8113 +hint(md"Use two loops: one for indices $j \in \{i+1, ..., n\}$ and one for indices $j \in \{i-1, ..., 1\}$. In each one, accumulate the product of the $\bar{p}_j$ in a temporary variable.") + +# ╔═║ 7a2d0d30-4dc1-4701-bb7f-04ef9e46974a +if @isdefined multiply_row_neighbors_matrix + let + p = collect(1:5) ./ 5 + N_true = neighbors_matrix5(p) + try + N = hcat( + (multiply_neighbors_matrix(p, one_hot(5, i)) for i in 1:5)... + ) + if N β‰ˆ N_true + correct() + else + almost(md"`multiply_row_neighbors_matrix` returns an incorrect result") + end + catch e + almost(md"`multiply_row_neighbors_matrix` throws an error") + end + end +else + almost(md"You need to define `multiply_row_neighbors_matrix`") +end + +# ╔═║ 4ea6b4f9-3f7c-4d23-b911-f7f2a4e23135 +md""" +!!! danger "Task 1.2.9" + Define a function `multiply_meeting_matrix(p, x)` which computes the product $M(p)x$. +""" + +# ╔═║ ffdca609-1047-46fa-a2d2-8ca0db26371f +hint(md"Use the function `multiply_neighbors_matrix` as a subroutine") + +# ╔═║ d44754fe-6c16-4561-9b4e-c64cad147b8d +if ( + (@isdefined multiply_row_neighbors_matrix) && + (@isdefined multiply_meeting_matrix) +) + let + p = collect(1:5) ./ 5 + M_true = meeting_matrix5(p) + try + M = hcat( + (multiply_meeting_matrix(p, one_hot(5, i)) for i in 1:5)... + ) + if M β‰ˆ M_true + correct() + else + almost(md"`multiply_row_neighbors_matrix` or `multiply_meeting_matrix` returns an incorrect result") + end + catch e + almost(md"`multiply_row_neighbors_matrix` or `multiply_meeting_matrix` throws an error") + end + end +else + almost(md"You need to define `multiply_row_neighbors_matrix` and `multiply_meeting_matrix`") +end + +# ╔═║ 4988e048-4846-498a-86b5-da54a61b247c +md""" +## 1.3 Linear systems of equations +""" + +# ╔═║ 3407e79e-96bd-4425-8655-a6bbff21173b +md""" +Linear systems are the backbone of many numerical routines, from differential equations to implicit differentiation. +The Julia ecosystem offers a plethora of possibilities for solving them. +""" + +# ╔═║ 26e252b6-956d-428f-9228-f705095ac946 +md""" +The [binary `\` operator](https://docs.julialang.org/en/v1/stdlib/LinearAlgebra/#Base.:\\-Tuple{AbstractMatrix,%20AbstractVecOrMat}) is a very versatile way to solve a linear system $Ax = b$. +Let us see it in action. +""" + +# ╔═║ 20979a07-b6c9-4b7b-987f-266e900c8543 +md""" +When $A$ is square and nonsingular, it returns the same solution one would get with the matrix inverse `inv(A)`, but much faster. +""" + +# ╔═║ f0bec76f-d70b-41b0-859c-645a40b3733c +md""" +When $A$ is rectangular and fat (many variables, few equations), then the solution may not be unique. +In this case, `\` returns the solution $x$ with smallest Euclidean norm. +This solution can also be obtained with the [Moore-Penrose pseudoinverse](https://en.wikipedia.org/wiki/Moore–Penrose_inverse) `pinv(A)`. +""" + +# ╔═║ 2b4b2084-1c38-490d-b3f8-215963b87d82 +md""" +Finally, when $A$ is rectangular and thin (many equations, few variables), then the solution may not exist. +In this case, `\` returns a vector minimizing the squared Euclidean error between $Ax$ and $b$, breaking ties by the Euclidean norm of $x$. +Again, this solution can be obtained with the Moore-Penrose pseudoinverse `pinv(A)`. +""" + +# ╔═║ f942b9c0-b40a-4d9f-aedb-73b1848d9709 +md""" +!!! danger "Task 1.3.1" + Explain the behavior of the following code cells using the concept of multiple dispatch. +""" + +# ╔═║ 2063fdfc-120b-4603-983f-f1abb2790ad2 +hint(md"The macro `@which` shows you which method was called by a given function") + +# ╔═║ d306cee2-6261-4125-8c5f-52d8e46f8a54 +md""" +> Your answer here +""" + +# ╔═║ f3a64b98-e901-4f06-bdfc-0f2b99014049 +md""" +In fact, `\` is compatible with any matrix satisfying the `AbstractMatrix` interface. +This includes the `MeetingMatrix` you defined earlier! +""" + +# ╔═║ fbcba267-24ed-461c-bd3e-4a3a8182c32c +md""" +!!! danger "Task 1.3.2" + Can multiple dispatch choose a linear solve algorithm based on the size of the matrix $A$? +""" + +# ╔═║ 0a0afd07-6ab4-418e-80e0-d0cc4eccce54 +md""" +> Your answer here +""" + +# ╔═║ 02d10c6b-a987-4f8f-ba00-45a38df9abe1 +md""" +For high-dimensional applications, factorization-based methods no longer work, and solvers often rely on iterative methods, also called Krylov subspace methods. +You may have encountered some of them before, like "conjugate gradient" or "GMRES". +Their main strength is that they do not require a full matrix, only a linear operator. + +The most modern package in this area is [LinearSolve.jl](https://github.com/SciML/LinearSolve.jl), but here we present [KrylovKit.jl](https://github.com/Jutho/KrylovKit.jl) which we deem more accessible. +""" + +# ╔═║ 16061b47-c086-4f38-a6d8-685872504f72 +md""" +Of course, the previous example is rather contrived. +But remember your `multiply_meeting_matrix` function: Krylov methods are a typical scenario where it could come in handy. +And guess what? +It actually will come in handy... in the next section! +""" + +# ╔═║ de4508fc-7549-4ced-91cd-9f7166ebffc1 +md""" +## 1.4 Utilities +""" + +# ╔═║ 8f0da298-9bb4-491e-8be7-e8def8ded6e5 +md""" +You can safely skip to the beginning of section 2, there is no task to be found here. +""" + +# ╔═║ 466cb64c-0570-4951-9c1e-31afec1aef49 +let + m1 = rand(4, 4) + m2 = rand(4, 4) + ls = @btime LazyMatrixSum($m1, $m2) + @assert ls β‰ˆ m1 .+ m2 +end + +# ╔═║ bfad99bc-3805-4037-8f3b-600e978c3976 +fahrenheit(T) = (T - 273.15) * (9/5) + 32 + +# ╔═║ fa0c41c6-ad85-48e8-a9e0-d88539199355 +md""" +# 2. Layered atmospheric model +""" + +# ╔═║ 4ec40d1a-66d6-4d3c-9e45-a7432082083f +md""" +## 2.1 Problem description +""" + +# ╔═║ b7ea1640-01e3-4f9b-9232-51764024dcb0 +md""" +In our study of the role of the atmosphere on Earth’s energy budget, we only considered the lower layer of the atmosphere, the troposphere. +It contains most of the atmospheric mass and dominates the absorption/emission of thermal/longwave radiation. + +In this problem, we will also consider the role played by the stratosphere, the atmospheric layer above the troposphere. +Observations suggest that the stratosphere has been cooling over the last century, a trend opposite to what has been well documented in the troposphere. +The stratosphere is rich in ozone, a gas that absorbs shortwave radiation. +Thus, unlike the troposphere, whose main source of radiative forcing is longwave radiation from the surface, the stratosphere is also heated by absorbed shortwave radiation. +This leads to a different stratospheric response to an increase in $\text{CO}_2$ concentrations. + +To see different effects at play in the atmosphere we have to switch to a _layered_ model, in which shortwave and longwave radiations are modeled separately +""" + +# ╔═║ 6e8b5dbe-4f1a-11ed-1d6d-898b90885e3d +md""" +$(PlutoUI.Resource("https://raw.githubusercontent.com/mitmath/JuliaComputation/main/homeworks/images/atmosphere.png")) +**Figure:** Schematic showing the pathways of longwave (blue) and shortwave (red) radiation in a 4-layer climate model (1 surface layer + 3 atmosphere layers). +""" + +# ╔═║ 047f32ac-c8bf-4f36-9f9c-3a4ab2998371 +md""" +Longwave radiation is emitted by each atmospheric layer $i$ with energy $\sigma \varepsilon_i T_i^4$, where $T_i$ is the temperature of the layer. +When passing through layer $i$, a fraction $\varepsilon_i$ of the radiation is absorbed and the remaining fraction $1-\varepsilon_i$ is transmitted. +Each layer $i \geq 1$ emits in both directions, so the total energy emitted amounts to $2\sigma \varepsilon_i T_i^4$. +The surface layer $i = 1$ emits only upwards and we consider it to be a perfect blackbody with $\varepsilon_1=1$. + +Shortwave radiation comes from the sun and hits the upper atmosphere with energy $S_0 / 4$. +When passing through layer $i$, a fraction $\beta_i$ of the radiation is absorbed and the remaining fraction $1-\beta_i$ is transmitted. +When hitting the surface, this remaining fraction $1-\beta_1$ is reflected upwards instead. +""" + +# ╔═║ f1faf89a-58ef-445e-b7f3-cc15391a127e +md""" +## 2.2 Numerical values +""" + +# ╔═║ 7de00277-3dc9-4c87-8b4b-fcbeeed8656d +md""" +Here are the physical parameters we will work with. +""" + +# ╔═║ 1eebce33-d71d-4a8d-be22-843e2ee283ea +Οƒ_val = 5.67e-8 + +# ╔═║ 9b8f0c49-aff6-4705-be09-134784bee7ad +Sβ‚€_val = 1356.2 + +# ╔═║ 83af51e5-b8d7-4487-9664-2052a7ef21c5 +Ξ΅_val = [1.0, 0.66, 0.50, 0.31, 0.22] + +# ╔═║ 149140f0-8849-4011-adf9-b50b24052e16 +Ξ²_val = [0.7, 0.015, 0.018, 0.021, 0.043] + +# ╔═║ 7a3b31ea-dee5-4d90-96e5-83fcb4f98f53 +md""" +## 2.3 Energy balance +""" + +# ╔═║ 7ec215a8-3f60-4752-833d-85dafc71ad3d +md""" +Here are the energy balance equations for a 4-layer atmosphere. +They are obtained by applying the following principle to each layer: +```math +0 = \text{absorbed longwave} - \text{emitted longwave} + \text{absorbed shortwave} +``` +To save space, we write $\bar{\varepsilon}_i = 1 - \varepsilon_i$ and $\bar{\beta}_i = 1 - \beta_i$. +We also define $\bar{B} = \prod_{k=1}^{n} \bar{\beta}_k$ +""" + +# ╔═║ 017d0901-9045-4622-bc73-13a74ecf38ad +md""" +```math +\begin{array}{llllllll} +0 = +& - \varepsilon_1 T_1^4 +& + \varepsilon_2 T_2^4 \varepsilon_1 +& + \varepsilon_3 T_3^4 \bar{\varepsilon}_2 \varepsilon_1 +& + \varepsilon_4 T_4^4 \bar{\varepsilon}_3 \bar{\varepsilon}_2 \varepsilon_1 +& + \frac{S_0}{4\sigma} \bar{\beta}_4 \bar{\beta}_3 \bar{\beta}_2 \beta_1 +& + 0 +\\ +0 = +& + \varepsilon_1 T_1^4 \varepsilon_2 +& - 2\varepsilon_2 T_2^4 +& + \varepsilon_3 T_3^4 \varepsilon_2 +& + \varepsilon_4 T_4^4 \bar{\varepsilon}_3 \varepsilon_2 +& + \frac{S_0}{4\sigma} \bar{\beta}_4 \bar{\beta}_3 \beta_2 +& + \frac{S_0}{4\sigma} \bar{\beta}_4 \bar{\beta}_3 \bar{\beta}_2 \bar{\beta}_1 \beta_2 +\\ +0 = +& + \varepsilon_1 T_1^4 \bar{\varepsilon}_2 \varepsilon_3 +& + \varepsilon_2 T_2^4 \varepsilon_3 +& - 2\varepsilon_3 T_3^4 +& + \varepsilon_4 T_4^4 \varepsilon_3 +& + \frac{S_0}{4\sigma} \bar{\beta}_4 \beta_3 +& + \frac{S_0}{4\sigma} \bar{\beta}_4 \bar{\beta}_3 \bar{\beta}_2 \bar{\beta}_1 \bar{\beta}_2 \beta_3 +\\ +0 = +& + \varepsilon_1 T_1^4 \bar{\varepsilon}_2 \bar{\varepsilon}_3 \varepsilon_4 +& + \varepsilon_2 T_2^4 \bar{\varepsilon}_3 \varepsilon_4 +& + \varepsilon_3 T_3^4 \varepsilon_4 +& - 2\varepsilon_4 T_4^4 +& + \frac{S_0}{4\sigma} \beta_4 +& + \frac{S_0}{4\sigma} \bar{\beta}_4 \bar{\beta}_3 \bar{\beta}_2 \bar{\beta}_1 \bar{\beta}_2 \bar{\beta}_3 \beta_4 +\end{array} +``` +""" + +# ╔═║ 6dce25d0-907c-45ec-a73d-6ed0948dd112 +md""" +We can rephrase this as a nonlinear system of equations $A T^4 = b$, where +""" + +# ╔═║ a4d6fe4b-cbac-4165-9467-606035bbf70f +md""" +```math +A = \begin{pmatrix} +& - \varepsilon_1 +& \varepsilon_2 \varepsilon_1 +& \varepsilon_3 \bar{\varepsilon}_2 \varepsilon_1 +& \varepsilon_4 \bar{\varepsilon}_3 \bar{\varepsilon}_2 \varepsilon_1 +\\ +& \varepsilon_1 \varepsilon_2 +& - 2\varepsilon_2 +& \varepsilon_3 \varepsilon_2 +& \varepsilon_4 \bar{\varepsilon}_3 \varepsilon_2 +\\ +& \varepsilon_1 \bar{\varepsilon}_2 \varepsilon_3 +& \varepsilon_2 \varepsilon_3 +& - 2\varepsilon_3 +& \varepsilon_4 \varepsilon_3 +\\ +& \varepsilon_1 \bar{\varepsilon}_2 \bar{\varepsilon}_3 \varepsilon_4 +& \varepsilon_2 \bar{\varepsilon}_3 \varepsilon_4 +& \varepsilon_3 \varepsilon_4 +& -2\varepsilon_4 +\end{pmatrix} +``` +""" + +# ╔═║ 8eb52f83-ff89-4dc0-a90f-99d1bfb59b20 +md""" +```math +b = \frac{-S_0}{4\sigma} \begin{pmatrix} + \bar{\beta}_4 \bar{\beta}_3 \bar{\beta}_2 \beta_1 +& + & 0 +\\ +\bar{\beta}_4 \bar{\beta}_3 \beta_2 +& + & \bar{B} \beta_2 +\\ +\bar{\beta}_4 \beta_3 +& + & \bar{B} \bar{\beta}_2 \beta_3 +\\ +\beta_4 +& + & \bar{B} \bar{\beta}_2 \bar{\beta}_3 \beta_4 +\end{pmatrix} +\qquad \text{and} \qquad +T = \begin{pmatrix} +T_1 \\ +T_2 \\ +T_3 \\ +T_4 +\end{pmatrix} +``` +""" + +# ╔═║ a0a6bacc-26d9-4c65-b218-9616db10f856 +md""" +Solving the nonlinear system $AT^4 = b$ will give us the equilibrium temperatures $T^*$. +Of course, in practice, we solve the linear system $Ax = b$, and then retrieve $T^* = (x^*)^{1/4}$. +""" + +# ╔═║ c53630b5-0b7e-4fcb-ac96-affb16e1b9f0 +md""" +From now on, we call $A$ the "longwave radiation matrix" and $b$ the "shortwave radiation vector". +""" + +# ╔═║ 5098783f-75fd-4373-9ad9-dd39b5a86aa8 +md""" +!!! danger "Task 2.3.1" + Give a formula for $A$ based on the meeting matrix $M$ defined earlier. +""" + +# ╔═║ 0205887c-69ed-4e1e-84df-0d1b4b935ddc +md""" +> Your answer here +""" + +# ╔═║ 3caa1420-97f9-40c7-bc0e-0243c845ee59 +md""" +Because I'm a nice person, here is an implementation of the shortwave radiation vector. +You're welcome. +""" + +# ╔═║ e49db03e-ca45-4c7f-a93c-bc679c1fd01a +function shortwave_vector(Ξ²::Vector{R}, Sβ‚€, Οƒ) where {R} + n = length(Ξ²) + Ξ²Μ„ = one(R) .- Ξ² + BΜ„ = prod(Ξ²Μ„) + b = Vector{R}(undef, n) + b[1] = @views prod(Ξ²Μ„[2:n]; init=Ξ²[1]) + for i in 2:n + b[i] = @views prod(Ξ²Μ„[(i+1):n]; init=Ξ²[i]) + BΜ„ * prod(Ξ²Μ„[2:(i-1)]; init=Ξ²[i]) + end + return (-Sβ‚€ / (4Οƒ)) .* b +end + +# ╔═║ a7096c5e-d409-490c-8caf-d064427a5265 +shortwave_vector(Ξ²_val, Sβ‚€_val, Οƒ_val) + +# ╔═║ 563bc60a-019f-42be-a311-84547a851b81 +md""" +## 2.4 Matrix representations +""" + +# ╔═║ 7a0dc9b7-d4cc-415c-83a6-7d50f17d89f6 +md""" +We now put your knowledge of matrix representations to good use on the case of the longwave radiation matrix. +""" + +# ╔═║ b5cdbbb4-b186-4124-be6a-be18bbc754ff +md""" +!!! danger "Task 2.4.1" + Define a function `longwave_matrix(Ξ΅)` which computes $A$ and stores it as a symmetric matrix. +""" + +# ╔═║ 8f710f8a-afe2-454a-9f2c-15cfffb1c50e +hint(md"Use `meeting_matrix`") + +# ╔═║ 27c38ade-61d3-409f-ad7a-16a2361397ce +# Your code here + +# ╔═║ d0a4f988-271c-41e0-a0c7-fd013eb8aabe +if @isdefined longwave_matrix + longwave_matrix(Ξ΅_val) +end + +# ╔═║ d2e80eee-db09-4711-b542-205b38248b57 +function longwave_matrix5() + return [ + -1.0 0.66 0.17 0.0527 0.025806 + 0.66 -1.32 0.33 0.1023 0.050094 + 0.17 0.33 -1.0 0.155 0.0759 + 0.0527 0.1023 0.155 -0.62 0.0682 + 0.025806 0.050094 0.0759 0.0682 -0.44 + ] +end + +# ╔═║ f47a9a12-65ef-44f4-bc77-1b852f61986e +if @isdefined longwave_matrix + let + L_true = longwave_matrix5() + try + L = longwave_matrix(Ξ΅_val) + if isapprox(L, L_true; atol=1e-2) + correct() + else + almost(md"`longwave_matrix` returns an incorrect result") + end + catch e + almost(md"`longwave_matrix` throws an error") + end + end +else + almost(md"You need to define `longwave_matrix`") +end + +# ╔═║ 6e0c6e9f-ef00-44bb-956b-923af174000c +md""" +!!! danger "Task 2.4.2" + Define a function `LongwaveMatrix(Ξ΅)` (yes, it looks like a type constructor) which stores $A$ in a memory-efficient way. +""" + +# ╔═║ 3ab919ee-6d9a-47e1-93fe-d1ce25c63236 +hint(md"Use `MeetingMatrix` and `LazyMatrixSum`") + +# ╔═║ 85de703d-d9c9-40bc-a414-e8c3920800d7 +# Your code here + +# ╔═║ 499623fe-6a87-4b41-9f31-355c486c7ce4 +if @isdefined LongwaveMatrix + LongwaveMatrix(Ξ΅_val) +end + +# ╔═║ 447a7da7-c087-43fe-8abf-5b9079e711d8 +if @isdefined LongwaveMatrix + let + L_true = longwave_matrix5() + try + L = Matrix(LongwaveMatrix(Ξ΅_val)) + if isapprox(L, L_true; atol=1e-2) + correct() + else + almost(md"`LongwaveMatrix` returns an incorrect result") + end + catch e + almost(md"`LongwaveMatrix` throws an error") + end + end +else + almost(md"You need to define `LongwaveMatrix`") +end + +# ╔═║ f3de07e7-9421-4eb5-b52b-8c450ece3511 +md""" +!!! danger "Task 2.4.3" + Define a function `multiply_longwave_matrix(Ξ΅, x)` which takes a vector $x$ and returns $Ax$. +""" + +# ╔═║ 3c98b50b-decb-4e0a-88a4-a08166e450cc +hint(md"Use `multiply_meeting_matrix`") + +# ╔═║ 388af3f8-527d-4f1a-ad21-2fb1295bc265 +# Your code here + +# ╔═║ 5ce016da-1336-49ae-8735-7e73f4ef9031 +if (@isdefined longwave_matrix) && (@isdefined multiply_longwave_matrix) + let + x = rand(length(Ξ΅_val)) + longwave_matrix(Ξ΅_val) * x, multiply_longwave_matrix(Ξ΅_val, x) + end +end + +# ╔═║ c4bdbbf9-1c7a-43ee-8a21-93d6324902f6 +if @isdefined multiply_longwave_matrix + let + L_true = longwave_matrix5() + try + L = hcat( + (multiply_longwave_matrix(Ξ΅_val, one_hot(5, i)) for i in 1:5)... + ) + if isapprox(L, L_true; atol=1e-2) + correct() + else + almost(md"`multiply_longwave_matrix` returns an incorrect result") + end + catch e + almost(md"`multiply_longwave_matrix` throws an error") + end + end +else + almost(md"You need to define `multiply_longwave_matrix`") +end + +# ╔═║ ae4bc271-0ca2-4d66-a8ca-cf63474aef0b +md""" +## 2.5 Finding the equilibrium +""" + +# ╔═║ d93ca9c1-81f9-47dc-9b5c-8a682deb672e +md""" +!!! danger "Task 2.5.1" + Compute the equilibrium temperatures for a 4-layer atmosphere with the numerical values given in section 2.2. + Use the three matrix representations you defined above, and check that you obtain the same results. +""" + +# ╔═║ 9d4bb825-ec3f-4c12-9db0-8067d2facb25 +hint(md"Depending on the representation, you might have to choose between `\` and `linsolve`") + +# ╔═║ 7c5abef9-382a-4947-ab9f-c6e721828615 +# Your code here + +# ╔═║ 243ae79c-3a94-48f2-b9b4-11e7e74cbea8 +# Your code here + +# ╔═║ 0cd01e96-5cd6-4200-83e2-5dfd1fc874c2 +# Your code here + +# ╔═║ 659b2aa6-c95f-4d88-ae58-17f520250791 +if ( + (@isdefined longwave_matrix) && + (@isdefined LongwaveMatrix) && + (@isdefined multiply_longwave_matrix) +) + let + b = shortwave_vector(Ξ²_val, Sβ‚€_val, Οƒ_val) + F_true = [89.3755, 38.494, 1.30706, -25.7982, -32.3701] + try + A1 = A = longwave_matrix(Ξ΅_val) + A2 = LongwaveMatrix(Ξ΅_val) + A3 = x -> multiply_longwave_matrix(Ξ΅_val, x) + x1 = A1 \ b + x2 = A2 \ b + x3, _ = linsolve(A3, b) + T1 = x1 .^ (1/4) + T2 = x2 .^ (1/4) + T3 = x3 .^ (1/4) + F1 = fahrenheit.(T1) + F2 = fahrenheit.(T2) + F3 = fahrenheit.(T3) + if !isapprox(F1, F_true; atol=1e-2) + almost(md"The equilibrium temperatures deduced from `longwave_matrix` are incorrect") + elseif !isapprox(F2, F_true; atol=1e-2) + almost(md"The equilibrium temperatures deduced from `LongwaveMatrix` are incorrect") + elseif !isapprox(F3, F_true; atol=1e-2) + almost(md"The equilibrium temperatures deduced from `multiply_longwave_matrix` are incorrect") + else + correct() + end + catch e + almost(md"Either `longwave_matrix`, `LongwaveMatrix`, `multiply_longwave_matrix` or one of the linear systems throws an error.") + end + end +else + almost(md"You need to define `longwave_matrix`, `LongwaveMatrix` and `multiply_longwave_matrix`") +end + +# ╔═║ 685fa229-5cd1-432b-8dc6-fe5beb47fa67 +md""" +## 2.6 Anthopogenic climate change? +""" + +# ╔═║ 99c61fe1-6ac3-4e66-95a7-0750426f6eac +md""" +In our simple model, the surface of the earth can heat up because of 2 different causes: +- an increase in solar flux $S_0$ (natural fluctuations of the sun's activity) +- an increase in $\varepsilon$ (anthropogenic modifications of the atmosphere) +""" + +# ╔═║ 371bb174-3757-4809-8ec8-73ca27c5b3ba +md""" +`Ξ”Sβ‚€ = ` $(@bind Ξ”Sβ‚€ Slider(0.0:1e0:2e2; default=0.0, show_value=true)) +""" + +# ╔═║ b0bebbb7-83bc-456a-a125-206922b667bb +md""" +`ΔΡ = ` $(@bind ΔΡ Slider(0.0:1e-2:0.1; default=0.0, show_value=true)) +""" + +# ╔═║ 623889cd-937c-44e0-9e47-17d5eb05bb68 +if (@isdefined longwave_matrix) + let + A = longwave_matrix(min.(1.0, Ξ΅_val .+ ΔΡ)) + b = shortwave_vector(Ξ²_val, Sβ‚€_val + Ξ”Sβ‚€, Οƒ_val) + x = A \ b + T = x .^ (1/4) + fahrenheit.(T) + end +end + +# ╔═║ c6d3945c-9e16-4c4c-a07b-b7070226e936 +md""" +!!! danger "Task 2.6.1" + Increase the solar flux `Sβ‚€_val` and look at the effect on the equilibrium temperatures. + Verify that the surface layer heats up. + What happens to the upper layer? +""" + +# ╔═║ b7e239c4-00e1-4083-983c-9364f3fdf57e +md""" +> Your answer here +""" + +# ╔═║ 3baed377-7b8f-4d31-bc6b-84b41724e76c +md""" +!!! danger "Task 2.6.2" + Increase all the coefficients `Ξ΅_val` (except that of the surface) and look at the effect on the equilibrium temperatures. + Verify that the surface layer heats up. + What happens to the upper layer? +""" + +# ╔═║ 06a7b2ed-1693-4a68-979d-2ff9eeda8d94 +md""" +> Your answer here +""" + +# ╔═║ 86daab2d-695c-4f62-9e8c-8dd13939e008 +md""" +!!! danger "Task 2.6.3" + Observations clearly show that the upper atmosphere is cooling down. + Which of our two candidate causes for global heating is confirmed by the data? +""" + +# ╔═║ 330aceeb-147a-423f-81ff-462c0cd3aeda +md""" +> Your answer here +""" + +# ╔═║ e902d91c-040b-4374-801b-a9f6e35abc4d +md""" +# 3. Hello world on a GPU +""" + +# ╔═║ ede76efa-36aa-4e4a-820c-b223276e4a91 +md""" +We are now entering the HPC and GPU portion of the class. +Next week's homework will require you to work on a GPU, so this week we want to make sure everyone is able to access JuliaHub in order to avoid surprises. + +Follow the steps outlined in [this document](https://docs.google.com/document/d/146_lPEcIq6WODdw8oPUVs6Bflp5ptjL6t0YQ6zuyG44/edit?usp=sharing) to log in to JuliaHub and connect to a GPU Pluto notebook. +Use this notebook URL: + +Run the JuliaHub notebook and answer the following questions **here**. +You do not need to submit the JuliaHub notebook, only this one. +""" + +# ╔═║ b4e13749-640f-49bf-baba-3e6bb877c2c3 +md""" +!!! danger "Task 3.1" + What speedup did you observe when running matrix multiply on the GPU compared to the CPU? For example if the CPU calculation took 1 second and the GPU computation took 0.5 seconds, you would have a 2x speedup. +""" + +# ╔═║ 3b82d62e-26ca-42a2-b8dd-2e2cf53666e6 +hint(md" +Look at the median time in the output of `@benchmark`. +") + +# ╔═║ 2cbe52a4-9959-4a96-bf65-39223aacefc7 +md""" +> Your answer here +""" + +# ╔═║ 24d0d3a0-41d9-46b2-addb-2ef9292fb3a5 +md""" +!!! danger "Task 3.2" + What value did you observe for the mean deviation between the matrix elements computed on the CPU vs. GPU? +""" + +# ╔═║ b4c91b27-d1a9-4a77-a47d-9ed2c477b05e +md""" +> Your answer here +""" + +# ╔═║ 00000000-0000-0000-0000-000000000001 +PLUTO_PROJECT_TOML_CONTENTS = """ +[deps] +BenchmarkTools = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf" +FileIO = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" +ImageIO = "82e4d734-157c-48bb-816b-45c225c6df19" +ImageShow = "4e3cecfd-b093-5904-9786-8bbb286a6a31" +KrylovKit = "0b1a1467-8014-51b9-945f-bf0ae24f4b77" +LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" +PlutoTeachingTools = "661c6b06-c737-4d37-b85c-46df65de6f69" +PlutoUI = "7f904dfe-b85e-4ff6-b463-dae2292396a8" + +[compat] +BenchmarkTools = "~1.3.1" +FileIO = "~1.16.0" +ImageIO = "~0.6.6" +ImageShow = "~0.3.6" +KrylovKit = "~0.5.4" +PlutoTeachingTools = "~0.2.3" +PlutoUI = "~0.7.48" +""" + +# ╔═║ 00000000-0000-0000-0000-000000000002 +PLUTO_MANIFEST_TOML_CONTENTS = """ +# This file is machine-generated - editing it directly is not advised + +julia_version = "1.8.2" +manifest_format = "2.0" +project_hash = "96c27fda5b3ffbfc2845104e3f62759ddf425b2b" + +[[deps.AbstractFFTs]] +deps = ["ChainRulesCore", "LinearAlgebra"] +git-tree-sha1 = "69f7020bd72f069c219b5e8c236c1fa90d2cb409" +uuid = "621f4979-c628-5d54-868e-fcf4e3e8185c" +version = "1.2.1" + +[[deps.AbstractPlutoDingetjes]] +deps = ["Pkg"] +git-tree-sha1 = "8eaf9f1b4921132a4cff3f36a1d9ba923b14a481" +uuid = "6e696c72-6542-2067-7265-42206c756150" +version = "1.1.4" + +[[deps.Adapt]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "195c5505521008abea5aee4f96930717958eac6f" +uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" +version = "3.4.0" + +[[deps.ArgTools]] +uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" +version = "1.1.1" + +[[deps.Artifacts]] +uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" + +[[deps.Base64]] +uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" + +[[deps.BenchmarkTools]] +deps = ["JSON", "Logging", "Printf", "Profile", "Statistics", "UUIDs"] +git-tree-sha1 = "4c10eee4af024676200bc7752e536f858c6b8f93" +uuid = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf" +version = "1.3.1" + +[[deps.CEnum]] +git-tree-sha1 = "eb4cb44a499229b3b8426dcfb5dd85333951ff90" +uuid = "fa961155-64e5-5f13-b03f-caf6b980ea82" +version = "0.4.2" + +[[deps.ChainRulesCore]] +deps = ["Compat", "LinearAlgebra", "SparseArrays"] +git-tree-sha1 = "e7ff6cadf743c098e08fca25c91103ee4303c9bb" +uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" +version = "1.15.6" + +[[deps.ChangesOfVariables]] +deps = ["ChainRulesCore", "LinearAlgebra", "Test"] +git-tree-sha1 = "38f7a08f19d8810338d4f5085211c7dfa5d5bdd8" +uuid = "9e997f8a-9a97-42d5-a9f1-ce6bfc15e2c0" +version = "0.1.4" + +[[deps.CodeTracking]] +deps = ["InteractiveUtils", "UUIDs"] +git-tree-sha1 = "cc4bd91eba9cdbbb4df4746124c22c0832a460d6" +uuid = "da1fd8a2-8d9e-5ec2-8556-3022fb5608a2" +version = "1.1.1" + +[[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", "SpecialFunctions", "Statistics", "TensorCore"] +git-tree-sha1 = "d08c20eef1f2cbc6e60fd3612ac4340b89fea322" +uuid = "c3611d14-8923-5661-9e6a-0046d554d3a4" +version = "0.9.9" + +[[deps.Colors]] +deps = ["ColorTypes", "FixedPointNumbers", "Reexport"] +git-tree-sha1 = "417b0ed7b8b838aa6ca0a87aadf1bb9eb111ce40" +uuid = "5ae59095-9a9b-59fe-a467-6f913c188581" +version = "0.12.8" + +[[deps.Compat]] +deps = ["Dates", "LinearAlgebra", "UUIDs"] +git-tree-sha1 = "3ca828fe1b75fa84b021a7860bd039eaea84d2f2" +uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" +version = "4.3.0" + +[[deps.CompilerSupportLibraries_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" +version = "0.5.2+0" + +[[deps.DataStructures]] +deps = ["Compat", "InteractiveUtils", "OrderedCollections"] +git-tree-sha1 = "d1fff3a548102f48987a52a2e0d114fa97d730f0" +uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" +version = "0.18.13" + +[[deps.Dates]] +deps = ["Printf"] +uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" + +[[deps.Distributed]] +deps = ["Random", "Serialization", "Sockets"] +uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" + +[[deps.DocStringExtensions]] +deps = ["LibGit2"] +git-tree-sha1 = "c36550cb29cbe373e95b3f40486b9a4148f89ffd" +uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" +version = "0.9.2" + +[[deps.Downloads]] +deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] +uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" +version = "1.6.0" + +[[deps.FileIO]] +deps = ["Pkg", "Requires", "UUIDs"] +git-tree-sha1 = "7be5f99f7d15578798f338f5433b6c432ea8037b" +uuid = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" +version = "1.16.0" + +[[deps.FileWatching]] +uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" + +[[deps.FixedPointNumbers]] +deps = ["Statistics"] +git-tree-sha1 = "335bfdceacc84c5cdf16aadc768aa5ddfc5383cc" +uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" +version = "0.8.4" + +[[deps.Formatting]] +deps = ["Printf"] +git-tree-sha1 = "8339d61043228fdd3eb658d86c926cb282ae72a8" +uuid = "59287772-0a20-5a39-b81b-1366585eb4c0" +version = "0.4.2" + +[[deps.Graphics]] +deps = ["Colors", "LinearAlgebra", "NaNMath"] +git-tree-sha1 = "d61890399bc535850c4bf08e4e0d3a7ad0f21cbd" +uuid = "a2bd30eb-e257-5431-a919-1863eab51364" +version = "1.1.2" + +[[deps.Hyperscript]] +deps = ["Test"] +git-tree-sha1 = "8d511d5b81240fc8e6802386302675bdf47737b9" +uuid = "47d2ed2b-36de-50cf-bf87-49c2cf4b8b91" +version = "0.0.4" + +[[deps.HypertextLiteral]] +deps = ["Tricks"] +git-tree-sha1 = "c47c5fa4c5308f27ccaac35504858d8914e102f9" +uuid = "ac1192a8-f4b3-4bfe-ba22-af5b92cd3ab2" +version = "0.9.4" + +[[deps.IOCapture]] +deps = ["Logging", "Random"] +git-tree-sha1 = "f7be53659ab06ddc986428d3a9dcc95f6fa6705a" +uuid = "b5f81e59-6552-4d32-b1f0-c071b021bf89" +version = "0.2.2" + +[[deps.ImageBase]] +deps = ["ImageCore", "Reexport"] +git-tree-sha1 = "b51bb8cae22c66d0f6357e3bcb6363145ef20835" +uuid = "c817782e-172a-44cc-b673-b171935fbb9e" +version = "0.1.5" + +[[deps.ImageCore]] +deps = ["AbstractFFTs", "ColorVectorSpace", "Colors", "FixedPointNumbers", "Graphics", "MappedArrays", "MosaicViews", "OffsetArrays", "PaddedViews", "Reexport"] +git-tree-sha1 = "acf614720ef026d38400b3817614c45882d75500" +uuid = "a09fc81d-aa75-5fe9-8630-4744c3626534" +version = "0.9.4" + +[[deps.ImageIO]] +deps = ["FileIO", "IndirectArrays", "JpegTurbo", "LazyModules", "Netpbm", "OpenEXR", "PNGFiles", "QOI", "Sixel", "TiffImages", "UUIDs"] +git-tree-sha1 = "342f789fd041a55166764c351da1710db97ce0e0" +uuid = "82e4d734-157c-48bb-816b-45c225c6df19" +version = "0.6.6" + +[[deps.ImageShow]] +deps = ["Base64", "FileIO", "ImageBase", "ImageCore", "OffsetArrays", "StackViews"] +git-tree-sha1 = "b563cf9ae75a635592fc73d3eb78b86220e55bd8" +uuid = "4e3cecfd-b093-5904-9786-8bbb286a6a31" +version = "0.3.6" + +[[deps.Imath_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "87f7662e03a649cffa2e05bf19c303e168732d3e" +uuid = "905a6f67-0a94-5f89-b386-d35d92009cd1" +version = "3.1.2+0" + +[[deps.IndirectArrays]] +git-tree-sha1 = "012e604e1c7458645cb8b436f8fba789a51b257f" +uuid = "9b13fd28-a010-5f03-acff-a1bbcff69959" +version = "1.0.0" + +[[deps.Inflate]] +git-tree-sha1 = "5cd07aab533df5170988219191dfad0519391428" +uuid = "d25df0c9-e2be-5dd7-82c8-3ad0b3e990b9" +version = "0.1.3" + +[[deps.InteractiveUtils]] +deps = ["Markdown"] +uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" + +[[deps.InverseFunctions]] +deps = ["Test"] +git-tree-sha1 = "49510dfcb407e572524ba94aeae2fced1f3feb0f" +uuid = "3587e190-3f89-42d0-90ee-14403ec27112" +version = "0.1.8" + +[[deps.IrrationalConstants]] +git-tree-sha1 = "7fd44fd4ff43fc60815f8e764c0f352b83c49151" +uuid = "92d709cd-6900-40b7-9082-c6be49f344b6" +version = "0.1.1" + +[[deps.JLLWrappers]] +deps = ["Preferences"] +git-tree-sha1 = "abc9885a7ca2052a736a600f7fa66209f96506e1" +uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" +version = "1.4.1" + +[[deps.JSON]] +deps = ["Dates", "Mmap", "Parsers", "Unicode"] +git-tree-sha1 = "3c837543ddb02250ef42f4738347454f95079d4e" +uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" +version = "0.21.3" + +[[deps.JpegTurbo]] +deps = ["CEnum", "FileIO", "ImageCore", "JpegTurbo_jll", "TOML"] +git-tree-sha1 = "a77b273f1ddec645d1b7c4fd5fb98c8f90ad10a5" +uuid = "b835a17e-a41a-41e7-81f0-2f016b05efe0" +version = "0.1.1" + +[[deps.JpegTurbo_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "b53380851c6e6664204efb2e62cd24fa5c47e4ba" +uuid = "aacddb02-875f-59d6-b918-886e6ef4fbf8" +version = "2.1.2+0" + +[[deps.JuliaInterpreter]] +deps = ["CodeTracking", "InteractiveUtils", "Random", "UUIDs"] +git-tree-sha1 = "0f960b1404abb0b244c1ece579a0ec78d056a5d1" +uuid = "aa1ae85d-cabe-5617-a682-6adf51b2e16a" +version = "0.9.15" + +[[deps.KrylovKit]] +deps = ["LinearAlgebra", "Printf"] +git-tree-sha1 = "49b0c1dd5c292870577b8f58c51072bd558febb9" +uuid = "0b1a1467-8014-51b9-945f-bf0ae24f4b77" +version = "0.5.4" + +[[deps.LaTeXStrings]] +git-tree-sha1 = "f2355693d6778a178ade15952b7ac47a4ff97996" +uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" +version = "1.3.0" + +[[deps.Latexify]] +deps = ["Formatting", "InteractiveUtils", "LaTeXStrings", "MacroTools", "Markdown", "OrderedCollections", "Printf", "Requires"] +git-tree-sha1 = "ab9aa169d2160129beb241cb2750ca499b4e90e9" +uuid = "23fbe1c1-3f47-55db-b15f-69d7ec21a316" +version = "0.15.17" + +[[deps.LazyModules]] +git-tree-sha1 = "a560dd966b386ac9ae60bdd3a3d3a326062d3c3e" +uuid = "8cdb02fc-e678-4876-92c5-9defec4f444e" +version = "0.3.1" + +[[deps.LibCURL]] +deps = ["LibCURL_jll", "MozillaCACerts_jll"] +uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" +version = "0.6.3" + +[[deps.LibCURL_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] +uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" +version = "7.84.0+0" + +[[deps.LibGit2]] +deps = ["Base64", "NetworkOptions", "Printf", "SHA"] +uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" + +[[deps.LibSSH2_jll]] +deps = ["Artifacts", "Libdl", "MbedTLS_jll"] +uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" +version = "1.10.2+0" + +[[deps.Libdl]] +uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" + +[[deps.LinearAlgebra]] +deps = ["Libdl", "libblastrampoline_jll"] +uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + +[[deps.LogExpFunctions]] +deps = ["ChainRulesCore", "ChangesOfVariables", "DocStringExtensions", "InverseFunctions", "IrrationalConstants", "LinearAlgebra"] +git-tree-sha1 = "94d9c52ca447e23eac0c0f074effbcd38830deb5" +uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688" +version = "0.3.18" + +[[deps.Logging]] +uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" + +[[deps.LoweredCodeUtils]] +deps = ["JuliaInterpreter"] +git-tree-sha1 = "dedbebe234e06e1ddad435f5c6f4b85cd8ce55f7" +uuid = "6f1432cf-f94c-5a45-995e-cdbf5db27b0b" +version = "2.2.2" + +[[deps.MIMEs]] +git-tree-sha1 = "65f28ad4b594aebe22157d6fac869786a255b7eb" +uuid = "6c6e2e6c-3030-632d-7369-2d6c69616d65" +version = "0.1.4" + +[[deps.MacroTools]] +deps = ["Markdown", "Random"] +git-tree-sha1 = "42324d08725e200c23d4dfb549e0d5d89dede2d2" +uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" +version = "0.5.10" + +[[deps.MappedArrays]] +git-tree-sha1 = "e8b359ef06ec72e8c030463fe02efe5527ee5142" +uuid = "dbb5928d-eab1-5f90-85c2-b9b0edb7c900" +version = "0.4.1" + +[[deps.Markdown]] +deps = ["Base64"] +uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" + +[[deps.MbedTLS_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" +version = "2.28.0+0" + +[[deps.Mmap]] +uuid = "a63ad114-7e13-5084-954f-fe012c677804" + +[[deps.MosaicViews]] +deps = ["MappedArrays", "OffsetArrays", "PaddedViews", "StackViews"] +git-tree-sha1 = "b34e3bc3ca7c94914418637cb10cc4d1d80d877d" +uuid = "e94cdb99-869f-56ef-bcf0-1ae2bcbe0389" +version = "0.3.3" + +[[deps.MozillaCACerts_jll]] +uuid = "14a3606d-f60d-562e-9121-12d972cd8159" +version = "2022.2.1" + +[[deps.NaNMath]] +deps = ["OpenLibm_jll"] +git-tree-sha1 = "a7c3d1da1189a1c2fe843a3bfa04d18d20eb3211" +uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" +version = "1.0.1" + +[[deps.Netpbm]] +deps = ["FileIO", "ImageCore"] +git-tree-sha1 = "18efc06f6ec36a8b801b23f076e3c6ac7c3bf153" +uuid = "f09324ee-3d7c-5217-9330-fc30815ba969" +version = "1.0.2" + +[[deps.NetworkOptions]] +uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" +version = "1.2.0" + +[[deps.OffsetArrays]] +deps = ["Adapt"] +git-tree-sha1 = "f71d8950b724e9ff6110fc948dff5a329f901d64" +uuid = "6fe1bfb0-de20-5000-8ca7-80f57d26f881" +version = "1.12.8" + +[[deps.OpenBLAS_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] +uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" +version = "0.3.20+0" + +[[deps.OpenEXR]] +deps = ["Colors", "FileIO", "OpenEXR_jll"] +git-tree-sha1 = "327f53360fdb54df7ecd01e96ef1983536d1e633" +uuid = "52e1d378-f018-4a11-a4be-720524705ac7" +version = "0.3.2" + +[[deps.OpenEXR_jll]] +deps = ["Artifacts", "Imath_jll", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] +git-tree-sha1 = "923319661e9a22712f24596ce81c54fc0366f304" +uuid = "18a262bb-aa17-5467-a713-aee519bc75cb" +version = "3.1.1+0" + +[[deps.OpenLibm_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "05823500-19ac-5b8b-9628-191a04bc5112" +version = "0.8.1+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.OrderedCollections]] +git-tree-sha1 = "85f8e6578bf1f9ee0d11e7bb1b1456435479d47c" +uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" +version = "1.4.1" + +[[deps.PNGFiles]] +deps = ["Base64", "CEnum", "ImageCore", "IndirectArrays", "OffsetArrays", "libpng_jll"] +git-tree-sha1 = "f809158b27eba0c18c269cf2a2be6ed751d3e81d" +uuid = "f57f5aa1-a3ce-4bc8-8ab9-96f992907883" +version = "0.3.17" + +[[deps.PaddedViews]] +deps = ["OffsetArrays"] +git-tree-sha1 = "03a7a85b76381a3d04c7a1656039197e70eda03d" +uuid = "5432bcbf-9aad-5242-b902-cca2824c8663" +version = "0.5.11" + +[[deps.Parsers]] +deps = ["Dates"] +git-tree-sha1 = "6c01a9b494f6d2a9fc180a08b182fcb06f0958a0" +uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" +version = "2.4.2" + +[[deps.Pkg]] +deps = ["Artifacts", "Dates", "Downloads", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] +uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" +version = "1.8.0" + +[[deps.PkgVersion]] +deps = ["Pkg"] +git-tree-sha1 = "f6cf8e7944e50901594838951729a1861e668cb8" +uuid = "eebad327-c553-4316-9ea0-9fa01ccd7688" +version = "0.3.2" + +[[deps.PlutoHooks]] +deps = ["InteractiveUtils", "Markdown", "UUIDs"] +git-tree-sha1 = "072cdf20c9b0507fdd977d7d246d90030609674b" +uuid = "0ff47ea0-7a50-410d-8455-4348d5de0774" +version = "0.0.5" + +[[deps.PlutoLinks]] +deps = ["FileWatching", "InteractiveUtils", "Markdown", "PlutoHooks", "Revise", "UUIDs"] +git-tree-sha1 = "0e8bcc235ec8367a8e9648d48325ff00e4b0a545" +uuid = "0ff47ea0-7a50-410d-8455-4348d5de0420" +version = "0.1.5" + +[[deps.PlutoTeachingTools]] +deps = ["Downloads", "HypertextLiteral", "LaTeXStrings", "Latexify", "Markdown", "PlutoLinks", "PlutoUI", "Random"] +git-tree-sha1 = "d8be3432505c2febcea02f44e5f4396fae017503" +uuid = "661c6b06-c737-4d37-b85c-46df65de6f69" +version = "0.2.3" + +[[deps.PlutoUI]] +deps = ["AbstractPlutoDingetjes", "Base64", "ColorTypes", "Dates", "FixedPointNumbers", "Hyperscript", "HypertextLiteral", "IOCapture", "InteractiveUtils", "JSON", "Logging", "MIMEs", "Markdown", "Random", "Reexport", "URIs", "UUIDs"] +git-tree-sha1 = "efc140104e6d0ae3e7e30d56c98c4a927154d684" +uuid = "7f904dfe-b85e-4ff6-b463-dae2292396a8" +version = "0.7.48" + +[[deps.Preferences]] +deps = ["TOML"] +git-tree-sha1 = "47e5f437cc0e7ef2ce8406ce1e7e24d44915f88d" +uuid = "21216c6a-2e73-6563-6e65-726566657250" +version = "1.3.0" + +[[deps.Printf]] +deps = ["Unicode"] +uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" + +[[deps.Profile]] +deps = ["Printf"] +uuid = "9abbd945-dff8-562f-b5e8-e1ebf5ef1b79" + +[[deps.ProgressMeter]] +deps = ["Distributed", "Printf"] +git-tree-sha1 = "d7a7aef8f8f2d537104f170139553b14dfe39fe9" +uuid = "92933f4c-e287-5a05-a399-4b506db050ca" +version = "1.7.2" + +[[deps.QOI]] +deps = ["ColorTypes", "FileIO", "FixedPointNumbers"] +git-tree-sha1 = "18e8f4d1426e965c7b532ddd260599e1510d26ce" +uuid = "4b34888f-f399-49d4-9bb3-47ed5cae4e65" +version = "1.0.0" + +[[deps.REPL]] +deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] +uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" + +[[deps.Random]] +deps = ["SHA", "Serialization"] +uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" + +[[deps.Reexport]] +git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" +uuid = "189a3867-3050-52da-a836-e630ba90ab69" +version = "1.2.2" + +[[deps.Requires]] +deps = ["UUIDs"] +git-tree-sha1 = "838a3a4188e2ded87a4f9f184b4b0d78a1e91cb7" +uuid = "ae029012-a4dd-5104-9daa-d747884805df" +version = "1.3.0" + +[[deps.Revise]] +deps = ["CodeTracking", "Distributed", "FileWatching", "JuliaInterpreter", "LibGit2", "LoweredCodeUtils", "OrderedCollections", "Pkg", "REPL", "Requires", "UUIDs", "Unicode"] +git-tree-sha1 = "dad726963ecea2d8a81e26286f625aee09a91b7c" +uuid = "295af30f-e4ad-537b-8983-00126c2a3abe" +version = "3.4.0" + +[[deps.SHA]] +uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" +version = "0.7.0" + +[[deps.Serialization]] +uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" + +[[deps.Sixel]] +deps = ["Dates", "FileIO", "ImageCore", "IndirectArrays", "OffsetArrays", "REPL", "libsixel_jll"] +git-tree-sha1 = "8fb59825be681d451c246a795117f317ecbcaa28" +uuid = "45858cf5-a6b0-47a3-bbea-62219f50df47" +version = "0.1.2" + +[[deps.Sockets]] +uuid = "6462fe0b-24de-5631-8697-dd941f90decc" + +[[deps.SparseArrays]] +deps = ["LinearAlgebra", "Random"] +uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + +[[deps.SpecialFunctions]] +deps = ["ChainRulesCore", "IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"] +git-tree-sha1 = "d75bda01f8c31ebb72df80a46c88b25d1c79c56d" +uuid = "276daf66-3868-5448-9aa4-cd146d93841b" +version = "2.1.7" + +[[deps.StackViews]] +deps = ["OffsetArrays"] +git-tree-sha1 = "46e589465204cd0c08b4bd97385e4fa79a0c770c" +uuid = "cae243ae-269e-4f55-b966-ac2d0dc13c15" +version = "0.1.1" + +[[deps.Statistics]] +deps = ["LinearAlgebra", "SparseArrays"] +uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" + +[[deps.TOML]] +deps = ["Dates"] +uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" +version = "1.0.0" + +[[deps.Tar]] +deps = ["ArgTools", "SHA"] +uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" +version = "1.10.1" + +[[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.TiffImages]] +deps = ["ColorTypes", "DataStructures", "DocStringExtensions", "FileIO", "FixedPointNumbers", "IndirectArrays", "Inflate", "Mmap", "OffsetArrays", "PkgVersion", "ProgressMeter", "UUIDs"] +git-tree-sha1 = "70e6d2da9210371c927176cb7a56d41ef1260db7" +uuid = "731e570b-9d59-4bfa-96dc-6df516fadf69" +version = "0.6.1" + +[[deps.Tricks]] +git-tree-sha1 = "6bac775f2d42a611cdfcd1fb217ee719630c4175" +uuid = "410a4b4d-49e4-4fbc-ab6d-cb71b17b3775" +version = "0.1.6" + +[[deps.URIs]] +git-tree-sha1 = "e59ecc5a41b000fa94423a578d29290c7266fc10" +uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" +version = "1.4.0" + +[[deps.UUIDs]] +deps = ["Random", "SHA"] +uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" + +[[deps.Unicode]] +uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" + +[[deps.Zlib_jll]] +deps = ["Libdl"] +uuid = "83775a58-1f1d-513f-b197-d71354ab007a" +version = "1.2.12+3" + +[[deps.libblastrampoline_jll]] +deps = ["Artifacts", "Libdl", "OpenBLAS_jll"] +uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" +version = "5.1.1+0" + +[[deps.libpng_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] +git-tree-sha1 = "94d180a6d2b5e55e447e2d27a29ed04fe79eb30c" +uuid = "b53b4c65-9356-5827-b1ea-8c7a1a84506f" +version = "1.6.38+0" + +[[deps.libsixel_jll]] +deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Pkg", "libpng_jll"] +git-tree-sha1 = "d4f63314c8aa1e48cd22aa0c17ed76cd1ae48c3c" +uuid = "075b6546-f08a-558a-be8f-8157d0f608a5" +version = "1.10.3+0" + +[[deps.nghttp2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" +version = "1.48.0+0" + +[[deps.p7zip_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" +version = "17.4.0+0" +""" + +# ╔═║ Cell order: +# ╠═d4f96362-7945-4a18-99dd-52a94f6cc65b +# ╠═d5cd95f9-6728-47e2-bba4-00298c78d50c +# ╠═0d4205ec-fec1-4ef4-af48-7dae51ab31ee +# ╠═1b452080-14eb-41f7-969b-e2727af54fa3 +# β•Ÿβ”€c0f57380-f746-4d22-8403-8d9d4606012f +# β•Ÿβ”€fedf534f-24b2-43ea-96dd-86f678987ec9 +# β•Ÿβ”€36976d68-1684-4123-a663-8b0407ee31ee +# β•Ÿβ”€355479cd-7598-48e9-8283-da36d0e84393 +# β•Ÿβ”€33845853-3597-4998-b04b-c6886d64adea +# β•Ÿβ”€36ba0cd6-61e7-46ea-92af-bec8758b2f0a +# β•Ÿβ”€df267206-71ee-47b1-b732-5adbad023cea +# β•Ÿβ”€e1d3d726-0f2b-437f-831c-521e9c105176 +# β•Ÿβ”€363b3a59-4e7c-4532-a52d-aa1ece8a2237 +# ╠═f205fe06-9849-435f-963c-d7596592c979 +# ╠═fab7a339-a43c-4209-b15a-fe64e670636f +# β•Ÿβ”€fe962381-6010-4c9c-8893-c51ce0ce17e4 +# β•Ÿβ”€625b8ace-cbbc-4dfe-aa71-0d60ad9786b6 +# β•Ÿβ”€dc47f817-b451-4055-bb8e-3bd6687f0e3c +# β•Ÿβ”€c6cf31d9-dfe1-4b9a-acb3-0ad199b7f03a +# ╠═59381db6-4f7c-4255-9e4a-6b116d6542fa +# ╠═f90861ce-0854-44aa-b064-d59b1d113528 +# β•Ÿβ”€641c4d16-445e-41e6-b978-b7acb2a31981 +# β•Ÿβ”€1fecaaac-7c37-4032-af5e-f784b9977765 +# β•Ÿβ”€36fc7d25-77b9-4088-b46c-6e718528ffa0 +# ╠═2bf674a4-d039-48af-8642-1160873b2f70 +# β•Ÿβ”€5e68a931-0306-4581-b256-a193658439a5 +# ╠═02f7ec49-1ab9-4ae0-a3ee-baee0dd25ea6 +# ╠═2d3f2591-3d7b-41b6-9129-777168379510 +# ╠═8686e348-f608-4b2f-aec5-c524444d6ce5 +# β•Ÿβ”€eb5404f6-8f4d-449e-959f-fc81debbef7f +# β•Ÿβ”€ddf2584f-63e0-4fe7-a895-a850ed97a0b8 +# β•Ÿβ”€55d51ebf-8172-414f-b868-b7b24cbb787d +# β•Ÿβ”€3403402f-7a4c-4d00-873e-17a44ca8f7aa +# ╠═efa37d3b-b556-419e-a8ab-5e627975cca4 +# ╠═aef77331-eaea-4b34-a944-537f1c0b53a0 +# β•Ÿβ”€7d39ac63-708b-4374-902f-cedf3d9df384 +# ╠═e029e040-b0f9-41ed-9474-7f31bd21bf06 +# β•Ÿβ”€f6b41ff9-d362-469d-a714-2b85acba2b03 +# β•Ÿβ”€9177bb33-0240-41a7-8732-85b0471d5548 +# ╠═5e8c1a90-7461-4116-a6aa-fff4d8f2def6 +# β•Ÿβ”€f2a9da31-8c31-4a72-9f2b-9541ee3931fc +# ╠═3f6001f1-3bf3-4a89-92ca-07a8ee0bab75 +# β•Ÿβ”€2befedaf-5fd2-471c-8e8b-574f741277ef +# β•Ÿβ”€80030ad9-956d-464a-87d3-e5b6083e8113 +# ╠═d3f9486e-1ad5-4062-845a-76e6cfeb715c +# ╠═1821f496-c065-468e-a206-c0fd2e75e539 +# β•Ÿβ”€8b896d3d-7796-468d-ae6e-553ed4eb84e4 +# β•Ÿβ”€af29b6cc-ed69-466d-98eb-62fa41806cae +# β•Ÿβ”€7a2d0d30-4dc1-4701-bb7f-04ef9e46974a +# β•Ÿβ”€4ea6b4f9-3f7c-4d23-b911-f7f2a4e23135 +# β•Ÿβ”€ffdca609-1047-46fa-a2d2-8ca0db26371f +# ╠═28d69223-f7a3-4b9f-8eb9-8dc1239ba04a +# ╠═def18cb7-29db-4de6-b896-69923c038f74 +# β•Ÿβ”€d44754fe-6c16-4561-9b4e-c64cad147b8d +# β•Ÿβ”€4988e048-4846-498a-86b5-da54a61b247c +# β•Ÿβ”€3407e79e-96bd-4425-8655-a6bbff21173b +# β•Ÿβ”€26e252b6-956d-428f-9228-f705095ac946 +# ╠═51bdc11d-8bcb-4a31-b455-af176e4adf1a +# β•Ÿβ”€20979a07-b6c9-4b7b-987f-266e900c8543 +# ╠═047d66ac-64fa-47e9-a566-89d840b8ea07 +# β•Ÿβ”€f0bec76f-d70b-41b0-859c-645a40b3733c +# ╠═a94d571f-a983-474e-b4e2-f9044dd87be0 +# β•Ÿβ”€2b4b2084-1c38-490d-b3f8-215963b87d82 +# ╠═2af6a3a0-6ccc-40d6-9af1-9046551a85d1 +# β•Ÿβ”€f942b9c0-b40a-4d9f-aedb-73b1848d9709 +# β•Ÿβ”€2063fdfc-120b-4603-983f-f1abb2790ad2 +# ╠═a876ca5b-1b10-420e-b070-bfc5126e9065 +# ╠═bb3e3399-a7bc-49a2-8e10-88e6e7f82751 +# ╠═87300b00-cb9b-4584-8d17-fe9e8a9359de +# ╠═d306cee2-6261-4125-8c5f-52d8e46f8a54 +# β•Ÿβ”€f3a64b98-e901-4f06-bdfc-0f2b99014049 +# β•Ÿβ”€fbcba267-24ed-461c-bd3e-4a3a8182c32c +# ╠═0a0afd07-6ab4-418e-80e0-d0cc4eccce54 +# β•Ÿβ”€02d10c6b-a987-4f8f-ba00-45a38df9abe1 +# ╠═8151780e-6e83-473f-ae88-fb991ce35ec7 +# β•Ÿβ”€16061b47-c086-4f38-a6d8-685872504f72 +# β•Ÿβ”€de4508fc-7549-4ced-91cd-9f7166ebffc1 +# β•Ÿβ”€8f0da298-9bb4-491e-8be7-e8def8ded6e5 +# ╠═480252e0-0815-45b0-b1c4-51bdbd02561c +# ╠═a201234a-65e0-42d9-8b4a-619243542cb7 +# ╠═e4c988de-2d03-43c8-ae5d-c708e76dc463 +# ╠═466cb64c-0570-4951-9c1e-31afec1aef49 +# ╠═bfad99bc-3805-4037-8f3b-600e978c3976 +# β•Ÿβ”€fa0c41c6-ad85-48e8-a9e0-d88539199355 +# β•Ÿβ”€4ec40d1a-66d6-4d3c-9e45-a7432082083f +# β•Ÿβ”€b7ea1640-01e3-4f9b-9232-51764024dcb0 +# β•Ÿβ”€6e8b5dbe-4f1a-11ed-1d6d-898b90885e3d +# β•Ÿβ”€047f32ac-c8bf-4f36-9f9c-3a4ab2998371 +# β•Ÿβ”€f1faf89a-58ef-445e-b7f3-cc15391a127e +# β•Ÿβ”€7de00277-3dc9-4c87-8b4b-fcbeeed8656d +# ╠═1eebce33-d71d-4a8d-be22-843e2ee283ea +# ╠═9b8f0c49-aff6-4705-be09-134784bee7ad +# ╠═83af51e5-b8d7-4487-9664-2052a7ef21c5 +# ╠═149140f0-8849-4011-adf9-b50b24052e16 +# β•Ÿβ”€7a3b31ea-dee5-4d90-96e5-83fcb4f98f53 +# β•Ÿβ”€7ec215a8-3f60-4752-833d-85dafc71ad3d +# β•Ÿβ”€017d0901-9045-4622-bc73-13a74ecf38ad +# β•Ÿβ”€6dce25d0-907c-45ec-a73d-6ed0948dd112 +# β•Ÿβ”€a4d6fe4b-cbac-4165-9467-606035bbf70f +# β•Ÿβ”€8eb52f83-ff89-4dc0-a90f-99d1bfb59b20 +# β•Ÿβ”€a0a6bacc-26d9-4c65-b218-9616db10f856 +# β•Ÿβ”€c53630b5-0b7e-4fcb-ac96-affb16e1b9f0 +# β•Ÿβ”€5098783f-75fd-4373-9ad9-dd39b5a86aa8 +# ╠═0205887c-69ed-4e1e-84df-0d1b4b935ddc +# β•Ÿβ”€3caa1420-97f9-40c7-bc0e-0243c845ee59 +# ╠═e49db03e-ca45-4c7f-a93c-bc679c1fd01a +# ╠═a7096c5e-d409-490c-8caf-d064427a5265 +# β•Ÿβ”€563bc60a-019f-42be-a311-84547a851b81 +# β•Ÿβ”€7a0dc9b7-d4cc-415c-83a6-7d50f17d89f6 +# β•Ÿβ”€b5cdbbb4-b186-4124-be6a-be18bbc754ff +# β•Ÿβ”€8f710f8a-afe2-454a-9f2c-15cfffb1c50e +# ╠═27c38ade-61d3-409f-ad7a-16a2361397ce +# ╠═d0a4f988-271c-41e0-a0c7-fd013eb8aabe +# β•Ÿβ”€d2e80eee-db09-4711-b542-205b38248b57 +# β•Ÿβ”€f47a9a12-65ef-44f4-bc77-1b852f61986e +# β•Ÿβ”€6e0c6e9f-ef00-44bb-956b-923af174000c +# β•Ÿβ”€3ab919ee-6d9a-47e1-93fe-d1ce25c63236 +# ╠═85de703d-d9c9-40bc-a414-e8c3920800d7 +# ╠═499623fe-6a87-4b41-9f31-355c486c7ce4 +# β•Ÿβ”€447a7da7-c087-43fe-8abf-5b9079e711d8 +# β•Ÿβ”€f3de07e7-9421-4eb5-b52b-8c450ece3511 +# β•Ÿβ”€3c98b50b-decb-4e0a-88a4-a08166e450cc +# ╠═388af3f8-527d-4f1a-ad21-2fb1295bc265 +# ╠═5ce016da-1336-49ae-8735-7e73f4ef9031 +# β•Ÿβ”€c4bdbbf9-1c7a-43ee-8a21-93d6324902f6 +# β•Ÿβ”€ae4bc271-0ca2-4d66-a8ca-cf63474aef0b +# β•Ÿβ”€d93ca9c1-81f9-47dc-9b5c-8a682deb672e +# β•Ÿβ”€9d4bb825-ec3f-4c12-9db0-8067d2facb25 +# ╠═7c5abef9-382a-4947-ab9f-c6e721828615 +# ╠═243ae79c-3a94-48f2-b9b4-11e7e74cbea8 +# ╠═0cd01e96-5cd6-4200-83e2-5dfd1fc874c2 +# β•Ÿβ”€659b2aa6-c95f-4d88-ae58-17f520250791 +# β•Ÿβ”€685fa229-5cd1-432b-8dc6-fe5beb47fa67 +# β•Ÿβ”€99c61fe1-6ac3-4e66-95a7-0750426f6eac +# β•Ÿβ”€371bb174-3757-4809-8ec8-73ca27c5b3ba +# β•Ÿβ”€b0bebbb7-83bc-456a-a125-206922b667bb +# ╠═623889cd-937c-44e0-9e47-17d5eb05bb68 +# β•Ÿβ”€c6d3945c-9e16-4c4c-a07b-b7070226e936 +# ╠═b7e239c4-00e1-4083-983c-9364f3fdf57e +# β•Ÿβ”€3baed377-7b8f-4d31-bc6b-84b41724e76c +# ╠═06a7b2ed-1693-4a68-979d-2ff9eeda8d94 +# β•Ÿβ”€86daab2d-695c-4f62-9e8c-8dd13939e008 +# ╠═330aceeb-147a-423f-81ff-462c0cd3aeda +# β•Ÿβ”€e902d91c-040b-4374-801b-a9f6e35abc4d +# β•Ÿβ”€ede76efa-36aa-4e4a-820c-b223276e4a91 +# β•Ÿβ”€b4e13749-640f-49bf-baba-3e6bb877c2c3 +# β•Ÿβ”€3b82d62e-26ca-42a2-b8dd-2e2cf53666e6 +# ╠═2cbe52a4-9959-4a96-bf65-39223aacefc7 +# β•Ÿβ”€24d0d3a0-41d9-46b2-addb-2ef9292fb3a5 +# ╠═b4c91b27-d1a9-4a77-a47d-9ed2c477b05e +# β•Ÿβ”€00000000-0000-0000-0000-000000000001 +# β•Ÿβ”€00000000-0000-0000-0000-000000000002 diff --git a/homeworks_old/hw6.jl b/homeworks_old/hw6.jl new file mode 100644 index 0000000..4a41d3b --- /dev/null +++ b/homeworks_old/hw6.jl @@ -0,0 +1,1920 @@ +### A Pluto.jl notebook ### +# v0.19.14 + +using Markdown +using InteractiveUtils + +# ╔═║ 5803a81e-5b75-11ed-08ff-17c142080826 +begin + using BenchmarkTools + using CUDA + using CUDAKernels + using KernelAbstractions + using LinearAlgebra + using Plots + using PlutoTeachingTools + using PlutoUI + using Random + using StaticArrays +end + +# ╔═║ f984ae77-cd98-4002-bdbf-c532ad9fc1c6 +md""" +Homework 5 of the MIT Course [_Julia: solving real-world problems with computation_](https://github.com/mitmath/JuliaComputation) + +Release date: Saturday, Nov 5, 2022 (version 2) + +**Due date: Thursday, Nov 10, 2022 at 11:59pm EST** + +Submission by: Jazzy Doe (jazz@mit.edu) +""" + +# ╔═║ 11361b6d-7338-4f7c-a196-a87236887484 +md""" +> Please run this notebook on [JuliaHub](https://juliahub.com/) and generate both the `.jl` and `.html` files from there. +> You can use the following link for the notebook: +""" + +# ╔═║ ec43be3f-2ae1-41fa-b630-4de63271fbb3 +CUDA.has_cuda_gpu() + +# ╔═║ 2e70ac93-80ac-44bb-a7e0-06a89a2a0188 +try + CUDA.versioninfo() + @info "CUDA.jl is working correctly on this machine" +catch e + @info "CUDA.jl is not working correctly on this machine" +end + +# ╔═║ a353c90a-32c5-4cf7-aa3a-0a9c0e7e4f47 +TableOfContents() + +# ╔═║ d79b1c88-73f6-462f-8bab-07c311c9cac1 +md""" +# HW6: $n$-body problem + parallelism +""" + +# ╔═║ 6f256181-b70d-41f5-a0cf-8fbf0ff94ed4 +md""" +In this homework, we will simulate the motion of $n$ interacting bodies. +This is an excellent excuse to talk about parallelism and GPU computing. +Thanks to James Schloss for his help! +""" + +# ╔═║ feff0c0f-e874-46f2-9006-3e59bacc8417 +md""" +## Task recap +""" + +# ╔═║ ccce9e18-a32f-49c7-9cdf-b465d999272e +tick(done) = done ? "βœ“" : "βˆ…" + +# ╔═║ 5e31e98e-0688-4b9d-aa81-0f49a793c71a +md""" +# 0. Statically-sized arrays +""" + +# ╔═║ 0333d1f7-be89-4a26-931b-372f3085c618 +md""" +You are already familiar with arrays from base Julia, which have variable size and can grow or shrink dynamically. +But in some situations, we might need arrays whose size is fixed and known statically, i.e. hardcoded in their type. +An interesting example is physical simulations, where we often deal with small vectors / matrices of dimensions 2 or 3. + +If we provide static size information to the compiler, array operations can be made faster by "unrolling" the loops. +This is the role of the [StaticArrays.jl](https://github.com/JuliaArrays/StaticArrays.jl) package. +It defines the types `SArray` and `MArray` for immutable and mutable arrays respectively. +""" + +# ╔═║ b7f9507f-b956-4453-ba66-4787d6b2b313 +md""" +!!! danger "Task 0.1" + Benchmark the performance of `Vector` against `SVector` and `MVector` for adding two vectors of size $n$, with $n \in \{2, 20, 200\}$. + What do you observe? +""" + +# ╔═║ f4760fa0-a0b5-41e9-b49d-0bd9cc7e2782 +hint(md"Use `SVector(Tuple(x))` to convert `x` into a static vector") + +# ╔═║ eb61a025-c36f-4c96-bf3f-029bc3a2cecf + + +# ╔═║ 27f75a0b-3b90-4982-b411-2b7907f9b7d7 +answer_01 = md""" + +""" + +# ╔═║ e7fbd945-bd94-4639-a9b2-ef2aa78f6600 +md""" +In practice, this means that computations involving small `SArray`s or `MArray`s are very fast and memory-efficient, even when we forget about the usual performance tips (which is what will happen in the rest of this homework). +""" + +# ╔═║ e75d3a86-604f-4502-b72a-6220e1543b64 +md""" +# 1. Inroduction to parallelism +""" + +# ╔═║ 60907f8e-13a2-4b31-bf6f-6a7e06eacc01 +md""" +Julia supports several flavors of [parallel computing](https://docs.julialang.org/en/v1/manual/parallel-computing/). +Here, we focus on multithreading and GPU computing. +""" + +# ╔═║ c2112a28-3b1a-4f1d-a9c3-474a20e6b1b1 +md""" +## 1.1 Multithreading +""" + +# ╔═║ 6fb37947-c4dd-4807-9369-7e1d67b23b9e +md""" +[Multithreading](https://docs.julialang.org/en/v1/manual/multi-threading/) is part of base Julia and works out of the box on every computer. +To use it, you need to start Julia with several threads, but Pluto already takes care of that. +""" + +# ╔═║ ab60a366-44a3-4898-8b46-25a3d0fb7a38 +Threads.nthreads() + +# ╔═║ 7cd14a96-7894-4ed1-b002-48644f7c65ab +md""" +To parallelize a `for` loop, all you have to do is add the `Threads.@threads` macro in front of it, and the loop iterations will be split among the available threads (in this case, there are $(Threads.nthreads())). +""" + +# ╔═║ a44627dc-fdb5-478b-a695-11a2eb02d7f1 +let + a = zeros(Int, 20) + Threads.@threads for i in 1:20 + a[i] = Threads.threadid() + end + a +end + +# ╔═║ 2c644f2a-6416-4a0e-8e38-2b4ef097abc3 +md""" +Since all threads share the same memory, multithreading can give incorrect results when used carelessly, as in the example below. +""" + +# ╔═║ f32302b6-ead0-4a56-b0df-1776816815e3 +let + s = 0 + Threads.@threads for i in 1:1_000_000 + s += 1 + end + s +end + +# ╔═║ 41fee41a-8b78-4337-aa37-b638a24448fb +md""" +The reason why `s != 1_000_000` is because threads step on each other's toes, a phenomenon also known as race conditions. +Check out the (short) explanation [here](https://en.wikipedia.org/wiki/Race_condition#Example). + +To prevent such behavior, a simple method is to make sure that each thread writes to a separate part of memory, which is not accessible to the other threads. +On the other hand, reading from the same memory is usually okay. +""" + +# ╔═║ e2365d69-217f-46c8-8058-fcb2449f01aa +let + s_by_thread = zeros(Int, Threads.nthreads()) + Threads.@threads for i in 1:1_000_000 + s_by_thread[Threads.threadid()] += 1 + end + sum(s_by_thread) +end + +# ╔═║ 3b6ff29a-0d42-4441-ba49-f0e5adfbb583 +md""" +The maximum speedup you can obtain from multithreading is the number of CPU cores on your machine (possibly x2 with [hyperthreading](https://en.wikipedia.org/wiki/Hyper-threading)). +However, depending on the underlying code, the actual speedup is usually lower, due to threading overhead or costly memory access. + +So if you need to tune the number of threads for a given application, just increase it until you stop gaining performance. +""" + +# ╔═║ a3eea236-a688-433a-8a22-ccffc37ce4af +md""" +!!! danger "Task 1.1" + Is the data structure `Dict` thread-safe? +""" + +# ╔═║ d62e68e2-13be-48f8-9599-49e358dbde59 +hint(md"Try to modify a `Dict` from various threads and see what happens") + +# ╔═║ 7df074c1-1f24-475d-b446-1c16f9c86538 + + +# ╔═║ 95dfeb17-7134-41e1-8015-dc14845f369a +answer_11 = md""" + +""" + +# ╔═║ 570e7ebe-252f-4cd7-b3a5-31232e5642ec +md""" +It is useful to remember that memory management is the main difference between multithreading and [multiprocessing / distributed computing](https://docs.julialang.org/en/v1/manual/distributed-computing/). +The latter assumes that each process or machine has its own memory. +This makes it easier to write correct code, but the costs of exchanging information between processes are usually higher. +We will not give more details at this stage. +""" + +# ╔═║ d8611f20-387b-40d1-9490-f7bf0a93a437 +md""" +## 1.2 GPU computing +""" + +# ╔═║ 56bac60c-65ff-4b5c-a5ca-29a723a79d89 +md""" +GPU computing exploits the graphics card of a computer, which is why its implementation is hardware-dependent. +The most prominent package is [CUDA.jl](https://juliagpu.org/) for NVIDIA GPUs, but Intel and AMD GPUs can be used as well (see the JuliaGPU [website](https://juliagpu.org/)). +The CUDA.jl [tutorial](https://cuda.juliagpu.org/stable/tutorials/introduction/) is a very interesting read if you want to understand what happens under the hood. +""" + +# ╔═║ 51041f7e-19ce-482d-b993-4b9d80e0745c +md""" +Programming for GPUs relies on "kernels", basic routines that generate very efficient and highly parallel machine code. +The package [KernelAbstractions.jl](https://github.com/JuliaGPU/KernelAbstractions.jl) allows us to write generic kernels that can be specialized for several types of devices. + +Here is a simple kernel that performs in-place elementwise multiplication. +""" + +# ╔═║ a151f96e-ab07-4b51-9213-45c36e588ab0 +@kernel function double_kernel!(a) + i = @index(Global, Linear) # replaces the for loop, parallelizes along i + a[i] *= 2 +end + +# ╔═║ c736fb2c-3afc-456d-a0fa-44caa067dd2d +md""" +When looking at this kernel, it's important to note that there is no outer `for` loop. +Instead, we are essentially programming what each individual core (called a thread) does. +Because of this, the kernel needs to be configured to know: +- How many cores you want to run with, which is called the `workgroupsize`. In the case of GPU computing, the `workgroupsize` is often on the order of 100s (so 256, for example), whereas for CPU computing, we better choose something like the number `Threads.nthreads()` of available threads. +- The maximum size to "iterate over", which is called the `ndrange`. As an example, you might run a kernel with 256 unique computational threads (`workgroupsize = 256`) that needs to do something with an array of size 1024 (`ndrange = 1024`). In this case, each computational thread would need execute the kernel 4 times. +""" + +# ╔═║ 85be94f8-452b-4fdc-a195-4e9e474b83b8 +md""" +We now show how to use this kernel on a specific device, in this case the CPU. +This is a good practice to debug your code locally before running it on a GPU-enabled machine. +""" + +# ╔═║ 150b90bd-47bb-4f34-ba88-ba3e1d458811 +let + a = ones(1024) + device = KernelAbstractions.get_device(a) # where the array is stored + workgroupsize = device isa GPU ? 256 : Threads.nthreads() # how much parallelism + @info "Kernel" device workgroupsize + kernel! = double_kernel!(device, workgroupsize) # prepare kernel for device + event = kernel!(a; ndrange=length(a)) # specify range for i & launch kernel + wait(event) # wait for the computation to finish on the device + sum(a) +end + +# ╔═║ a8fa5ee2-0b88-4760-a7c1-3e7b8a31d6a2 +md""" +If we want to migrate to the GPU, we only need to use the dedicated array type: `CuArray` from CUDA.jl. +""" + +# ╔═║ a85927b0-152a-4a55-a23b-0ff560c40ead +md""" +!!! danger "Task 1.2" + Copy the cell above and initialize `a` as a `CuVector` instead. + - What is the new `device`? + - What might happen if we removed the line `wait(event)`? +""" + +# ╔═║ e57cb666-08fd-40b1-9cff-fd19b82563d7 +hint(md"In practice you won't see the effect of not waiting for this very fast kernel, but in other cases you might") + +# ╔═║ d7a4e9c6-2a39-4004-b3a6-0beb63d34a47 + + +# ╔═║ 51ad839c-42cd-4da5-a92c-a6e047fd4ec8 +answer_12 = md""" + +""" + +# ╔═║ b1f56b3f-85dc-4580-aa30-ef2ba0021c4d +md""" +You may be wondering why we're going through all this trouble to multiply a vector by 2. +Indeed, in this simple case, `a .*= 2` gives rise to efficient GPU code when applied to a `CuArray`. +But there are many situations where vectorization is not so obvious, and things are easier to write as loops. +Besides, the broadcasting syntax is just a facade that generates new kernels on the fly for every operation, which means writing your own kernels is often more efficient. +""" + +# ╔═║ 9b65f47f-f569-4aee-9250-af169d13d604 +md""" +# 2. Serial simulation +""" + +# ╔═║ 01b6edaf-a83f-429f-9108-35b43f6d299c +md""" +We consider the [$n$-body problem](https://en.wikipedia.org/wiki/N-body_problem) in $\mathbb{R}^d$. +Let $m = (m_1, ..., m_n)$ be the vector of masses and $\mathbf{p}(t) = (\mathbf{p}_1(t), ..., \mathbf{p}_n(t))$ be the vector of positions at a given time $t$. +For each particle $i \in [n]$, Newton's second law gives us +```math + m_i \overset{..}{\mathbf{p}}_i = \sum_{j \neq i} \frac{G m_j m_i}{\lVert \mathbf{p}_j - \mathbf{p}_i \rVert^2} \mathbf{u}_{ij} \quad \text{where} \quad \mathbf{u}_{ij} = \frac{\mathbf{p}_j - \mathbf{p}_i}{\lVert \mathbf{p}_j - \mathbf{p}_i \rVert} +``` +We will simulate this system of ODEs using [Verlet integration](https://en.wikipedia.org/wiki/Verlet_integration), and to avoid extreme behavior we replace $r_{ij}^2 = \lVert \mathbf{p}_j - \mathbf{p}_i \rVert^2$ with $r_{ij}^2 + 1$ (this is called softening). +""" + +# ╔═║ 8429ef19-3306-4d85-b8f6-194a04711dd2 +md""" +## 2.1 Storage +""" + +# ╔═║ 2087f4f2-9d85-4358-bf7f-9ea53db7eead +struct Particles{ + Mas<:AbstractVector{<:Real}, + Pos<:AbstractVector{<:AbstractVector{<:Real}}, + Acc<:AbstractVector{<:AbstractVector{<:Real}}, +} + masses::Mas + positions::Pos + last_positions::Pos + accelerations::Acc +end + +# ╔═║ ac093aed-406b-4e78-b746-d61ee37829e7 +""" + initialize_particles(ArrayType; n, d, rng) + +Create `n` particles in dimension `d` with random initial positions and masses (using the generator `rng`). Store them as `SVector`s within a vector of type `ArrayType`. +""" +function initialize_particles( + ::Type{ArrayType}=Array; n, d, rng=Random.GLOBAL_RNG +) where {ArrayType<:AbstractArray} + masses = ArrayType(rand(rng, Float32, n)) + positions = ArrayType([SVector(Tuple(rand(rng, Float32, d))) for i in 1:n]) + last_positions = copy(positions) + accelerations = ArrayType([SVector(Tuple(zeros(Float32, d))) for i in 1:n]) + return Particles(masses, positions, last_positions, accelerations) +end + +# ╔═║ e7dc5fd6-6b12-453e-9ccf-910af73850e6 +md""" +## 2.2 Simulation +""" + +# ╔═║ 2228ceb5-1f53-4e68-9913-e2edafa0979f +""" + xsqrtx(y) + +Compute `y^(3/2)` in an efficient way. +""" +xsqrtx(y) = y * sqrt(y) + +# ╔═║ 5559bdac-56be-4230-a7e0-2efcc14d03e0 +""" + update_acceleration!(accelerations, masses, positions, i) + +Update the acceleration for particle `i` using Newton's 2nd law. +""" +function update_acceleration!(accelerations, masses, positions, i) + n = length(masses) + pα΅’ = positions[i] + aα΅’ = zero(accelerations[i]) # zero vector of the same type + for j in 1:n + if j != i + mβ±Ό, pβ±Ό = masses[j], positions[j] + rα΅’β±ΌΒ² = sum(abs2, pβ±Ό - pα΅’) + aα΅’ += (mβ±Ό / xsqrtx(rα΅’β±ΌΒ² + 1)) * (pβ±Ό - pα΅’) # acceleration = force / mass + end + end + accelerations[i] = aα΅’ +end + +# ╔═║ e7ea34ed-4dd5-4fa8-806f-af157bfb6590 +""" + update_positions!(positions, last_positions, accelerations, i, Ξ”t) + +Update all current and last positions for particle `i` for a time interval `Ξ”t` using Verlet integration. +""" +function update_position!(positions, last_positions, accelerations, i, Ξ”t) + pα΅’, last_pα΅’, aα΅’ = positions[i], last_positions[i], accelerations[i] + positions[i] = 2 * pα΅’ - last_pα΅’ + aα΅’ * Ξ”t^2 # Verlet integration + last_positions[i] = pα΅’ +end + +# ╔═║ 4a0cba53-3e9c-4277-9a30-7455741a5f50 +""" + nbody!(particles; Ξ”t, steps) + +Run `steps` intervals of an n-body simulation on a set of `particles`, where each intervals has duration `Ξ”t`. +""" +function nbody!(particles::Particles; Ξ”t, steps) + # the following syntax parses the fields of a struct + (; masses, positions, last_positions, accelerations) = particles + n = length(masses) + for s in 1:steps + for i in 1:n + update_acceleration!(accelerations, masses, positions, i) + end + for i in 1:n + update_position!(positions, last_positions, accelerations, i, Ξ”t) + end + end +end + +# ╔═║ 51061846-6f58-479b-ab24-0a773c2af034 +let + n, d, Ξ”t, steps = 5, 2, 0.01, 10 + particles = initialize_particles(Array; n=n, d=d) + nbody!(particles; Ξ”t=Ξ”t, steps=steps) +end + +# ╔═║ fe4b8a41-02a2-4c7f-996f-6913fc62713e +md""" +!!! danger "Task 2.2" + The `nbody!` function contains 3 nested loops: on `s`, `i` and `j` (the latter being inside the `update_acceleration!` subroutine). + Which one of them + 1. can be parallelized easily? + 1. could be parallelized if we modified the code a little bit? + 1. should never be parallelized? +""" + +# ╔═║ 23ef2c59-6301-4e42-81e2-6c4481f4bb9b +answer_22 = md""" + +""" + +# ╔═║ 3cd38682-aa95-4d27-831f-814641b92754 +md""" +In what follows, we will focus on parallelizing the answer to 1., because it requires the least effort. +""" + +# ╔═║ 903e087d-a77e-4c56-9761-05c54a0cc81c +md""" +## 2.3 Plotting +""" + +# ╔═║ 48da2f41-d9e2-4c8b-b23f-9d7e1346769f +function plot_nbody(; n, d, Ξ”t, steps) + particles = initialize_particles(Array; n=n, d=d) + (; masses, positions, last_positions, accelerations) = particles + n = length(masses) + trajectories = [copy(positions)] + for s in 1:steps + for i in 1:n + update_acceleration!(accelerations, masses, positions, i) + end + for i in 1:n + update_position!(positions, last_positions, accelerations, i, Ξ”t) + end + push!(trajectories, copy(positions)) + end + @gif for s in 1:steps + scatter( + map(first, trajectories[s]), + map(last, trajectories[s]), + markershape=:circle, + xlim=(-0.5, 1.5), + ylim=(-0.5, 1.5), + label=nothing, + title="n-body simulation, time=$s" + ) + end every 10 +end + +# ╔═║ 17c5ee50-7baa-4d28-a39a-b9f58eaf7f0a +plot_nbody(n=5, d=2, Ξ”t=0.01, steps=1000) + +# ╔═║ 960288de-ab52-4bae-baa2-6c582c26c2b2 +md""" +# 3. Multithreaded simulation +""" + +# ╔═║ cc734b56-93b2-40c3-acbb-2d18b028ae21 +md""" +!!! danger "Task 3.1" + Implement `nbody_threaded!` as a multithreaded version of `nbody!` +""" + +# ╔═║ cc92ac8f-8430-4ee1-8090-31b4dbd0253b + + +# ╔═║ 9ffe6c48-20f7-4866-af2e-22977315fa60 +let + if @isdefined nbody_threaded! + n, d, Ξ”t, steps = 5, 2, 0.01, 10 + particles = initialize_particles(Array; n=n, d=d) + nbody_threaded!(particles; Ξ”t=Ξ”t, steps=steps) + end +end + +# ╔═║ 3fc6b27e-ad34-4fa2-8405-91261d7b3384 +check_31 = let + if @isdefined nbody_threaded! + n, d, Ξ”t, steps = 5, 2, 0.01, 10 + particles = initialize_particles(Array; n=n, d=d, rng=MersenneTwister(63)) + particles_ref = deepcopy(particles) + nbody!(particles_ref; Ξ”t=Ξ”t, steps=steps) + try + nbody_threaded!(particles; Ξ”t=Ξ”t, steps=steps) + if particles.positions β‰ˆ particles_ref.positions + correct(md"`nbody_threaded!` returns the same result as `nbody!`") + else + almost(md"`nbody_threaded!` returns an incorrect result") + end + catch e + almost(md"`nbody_threaded!` throws a $(typeof(e))") + end + else + almost(md"You need to define `nbody_threaded!`") + end +end + +# ╔═║ c1ad1392-005d-4c99-826f-be9c7c240f88 +md""" +!!! danger "Task 3.2" + Benchmark `nbody_threaded!` against `nbody!`, both with `Vector` storage. + Comment on the cases where a speedup is achieved +""" + +# ╔═║ 4a330f54-a220-466c-af5e-ad70d5387d5b +hint(md"Try playing with the number of particles") + +# ╔═║ 3313e718-9cd2-41d9-8615-b72871f9fda5 + + +# ╔═║ 904e5a60-65ce-419e-9f8c-32b29a98d0f4 +answer_32 = md""" + +""" + +# ╔═║ 09d5ed7f-5c78-470b-a832-d6ce951dc8a2 +md""" +# 4. GPU simulation +""" + +# ╔═║ 449d8103-dc1f-4496-bd90-a4718d9f30ea +md""" +!!! danger "Task 4.1" + Implement `nbody_gpu!` as a GPU-compatible version of `nbody!` +""" + +# ╔═║ 0b60df5e-732d-47cb-ad56-9c9a81fe374b +hint(md"Start by writing two kernels `update_accelerations_kernel!` and `update_positions_kernel!`. Then specialize both of them for the right device inside `nbody_gpu!`, as shown in section 1.2. Don't forget to `wait` until the first kernel is done running before launching the second one!") + +# ╔═║ f8eef0e0-eaa8-4161-be01-b8551af21f1f + + +# ╔═║ f83755c7-d6ff-4438-b9a5-659561d1b6dc + + +# ╔═║ f7e8e7c9-d71d-48ee-9909-a6a5a4e06d1b + + +# ╔═║ ba83ffdd-480e-496e-b8d6-4475cffd9ea8 +let + if @isdefined nbody_gpu! + n, d, Ξ”t, steps = 5, 2, 0.01, 10 + particles = initialize_particles(Array; n=n, d=d) + nbody_gpu!(particles; Ξ”t=Ξ”t, steps=steps) + end +end + +# ╔═║ 04ac0905-2ab0-4e0c-abbb-343a96c10c16 +let + if (@isdefined nbody_gpu!) && CUDA.has_cuda_gpu() + n, d, Ξ”t, steps = 5, 2, 0.01, 10 + particles = initialize_particles(CuArray; n=n, d=d) + nbody_gpu!(particles; Ξ”t=Ξ”t, steps=steps) + end +end + +# ╔═║ a02b2923-bfb0-4cfa-bf05-c1e37d0f9420 +check_41 = let + if (@isdefined nbody_gpu!) && CUDA.has_cuda_gpu() + n, d, Ξ”t, steps = 5, 2, 0.01, 10 + particles_cpu = initialize_particles(Array; n=n, d=d, rng=MersenneTwister(63)) + particles_gpu = initialize_particles(CuArray; n=n, d=d, rng=MersenneTwister(63)) + particles_cpu_ref = deepcopy(particles_cpu) + nbody!(particles_cpu_ref; Ξ”t=Ξ”t, steps=steps) + try + nbody_gpu!(particles_cpu; Ξ”t=Ξ”t, steps=steps) + if particles_cpu.positions β‰ˆ particles_cpu_ref.positions + try + nbody_gpu!(particles_gpu; Ξ”t=Ξ”t, steps=steps) + if Array(particles_gpu.positions) β‰ˆ particles_cpu_ref.positions + correct(md"`nbody_threaded!` returns the same result as `nbody!` on both CPU and GPU arrays") + else + almost(md"`nbody_gpu!` returns an incorrect result on GPU arrays") + end + catch e + almost(md"`nbody_gpu!` throws a $(typeof(e)) on GPU arrays") + end + else + almost(md"`nbody_gpu!` returns an incorrect result on CPU arrays") + end + catch e + almost(md"`nbody_gpu!` throws a $(typeof(e)) on CPU arrays") + end + else + almost(md"You need to define `nbody_gpu!` and have a CUDA-enabled machine") + end +end + +# ╔═║ 4c1f3efe-2374-4471-ae5f-48d7eff4d379 +md""" +!!! danger "Task 4.2" + Benchmark `nbody_gpu!` on a `CuVector` against `nbody_threaded!` on a `Vector`. + Comment on the cases where a speedup is achieved +""" + +# ╔═║ 2db23a84-50f2-4b28-9ea2-218cd850a157 + + +# ╔═║ dc7cfac4-2076-4b7b-b469-d3399cdb88e2 +answer_42 = md""" + +""" + +# ╔═║ 54b2103f-374a-40fd-aaf4-832151e0e437 +md""" +# 5. Midpoint survey +""" + +# ╔═║ 221e063b-84c4-43aa-b07c-40519330a9b9 +md""" +!!! danger "Task 5.1" + Have you completed the [class midpoint survey](https://forms.gle/CsCMaJ4nA4qCU6bq9)? +""" + +# ╔═║ cd234be4-f2a6-4c3b-be65-a053ee7224be +answer_51 = false + +# ╔═║ 45e5d832-a12b-4512-903a-80899f3cc2a4 +md""" +| Task | Status | +| --- | --- | +| 0.1 | $(tick(length(answer_01) > 0)) | +| 1.1 | $(tick(length(answer_11) > 0)) | +| 1.2 | $(tick(length(answer_12) > 0)) | +| 2.2 | $(tick(length(answer_22) > 0)) | +| 3.1 | $(tick(check_31.content[1].category == "correct")) | +| 3.2 | $(tick(length(answer_32) > 0)) | +| 4.1 | $(tick(check_31.content[1].category == "correct")) | +| 4.2 | $(tick(length(answer_42) > 0)) | +| 5.1 | $(tick(answer_51)) | +""" + +# ╔═║ 00000000-0000-0000-0000-000000000001 +PLUTO_PROJECT_TOML_CONTENTS = """ +[deps] +BenchmarkTools = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf" +CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" +CUDAKernels = "72cfdca4-0801-4ab0-bf6a-d52aa10adc57" +KernelAbstractions = "63c18a36-062a-441e-b654-da1e3ab1ce7c" +LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" +Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" +PlutoTeachingTools = "661c6b06-c737-4d37-b85c-46df65de6f69" +PlutoUI = "7f904dfe-b85e-4ff6-b463-dae2292396a8" +Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" +StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + +[compat] +BenchmarkTools = "~1.3.1" +CUDA = "~3.12.0" +CUDAKernels = "~0.4.3" +KernelAbstractions = "~0.8.4" +Plots = "~1.35.7" +PlutoTeachingTools = "~0.2.5" +PlutoUI = "~0.7.48" +StaticArrays = "~1.5.9" +""" + +# ╔═║ 00000000-0000-0000-0000-000000000002 +PLUTO_MANIFEST_TOML_CONTENTS = """ +# This file is machine-generated - editing it directly is not advised + +julia_version = "1.8.2" +manifest_format = "2.0" +project_hash = "c3a9b986999b1b531a1f830e4891a2d6587bec22" + +[[deps.AbstractFFTs]] +deps = ["ChainRulesCore", "LinearAlgebra"] +git-tree-sha1 = "69f7020bd72f069c219b5e8c236c1fa90d2cb409" +uuid = "621f4979-c628-5d54-868e-fcf4e3e8185c" +version = "1.2.1" + +[[deps.AbstractPlutoDingetjes]] +deps = ["Pkg"] +git-tree-sha1 = "8eaf9f1b4921132a4cff3f36a1d9ba923b14a481" +uuid = "6e696c72-6542-2067-7265-42206c756150" +version = "1.1.4" + +[[deps.Adapt]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "195c5505521008abea5aee4f96930717958eac6f" +uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" +version = "3.4.0" + +[[deps.ArgTools]] +uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" +version = "1.1.1" + +[[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.BFloat16s]] +deps = ["LinearAlgebra", "Printf", "Random", "Test"] +git-tree-sha1 = "a598ecb0d717092b5539dbbe890c98bac842b072" +uuid = "ab4f0b2a-ad5b-11e8-123f-65d77653426b" +version = "0.2.0" + +[[deps.Base64]] +uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" + +[[deps.BenchmarkTools]] +deps = ["JSON", "Logging", "Printf", "Profile", "Statistics", "UUIDs"] +git-tree-sha1 = "4c10eee4af024676200bc7752e536f858c6b8f93" +uuid = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf" +version = "1.3.1" + +[[deps.BitFlags]] +git-tree-sha1 = "84259bb6172806304b9101094a7cc4bc6f56dbc6" +uuid = "d1d4a3ce-64b1-5f1a-9ba4-7e7e69966f35" +version = "0.1.5" + +[[deps.Bzip2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "19a35467a82e236ff51bc17a3a44b69ef35185a2" +uuid = "6e34b625-4abd-537c-b88f-471c36dfa7a0" +version = "1.0.8+0" + +[[deps.CEnum]] +git-tree-sha1 = "eb4cb44a499229b3b8426dcfb5dd85333951ff90" +uuid = "fa961155-64e5-5f13-b03f-caf6b980ea82" +version = "0.4.2" + +[[deps.CUDA]] +deps = ["AbstractFFTs", "Adapt", "BFloat16s", "CEnum", "CompilerSupportLibraries_jll", "ExprTools", "GPUArrays", "GPUCompiler", "LLVM", "LazyArtifacts", "Libdl", "LinearAlgebra", "Logging", "Printf", "Random", "Random123", "RandomNumbers", "Reexport", "Requires", "SparseArrays", "SpecialFunctions", "TimerOutputs"] +git-tree-sha1 = "49549e2c28ffb9cc77b3689dc10e46e6271e9452" +uuid = "052768ef-5323-5732-b1bb-66c8b64840ba" +version = "3.12.0" + +[[deps.CUDAKernels]] +deps = ["Adapt", "CUDA", "KernelAbstractions", "StaticArrays", "UnsafeAtomicsLLVM"] +git-tree-sha1 = "bbab4d1a4001ec322c384dfff0889cec4118da93" +uuid = "72cfdca4-0801-4ab0-bf6a-d52aa10adc57" +version = "0.4.3" + +[[deps.Cairo_jll]] +deps = ["Artifacts", "Bzip2_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.ChainRulesCore]] +deps = ["Compat", "LinearAlgebra", "SparseArrays"] +git-tree-sha1 = "e7ff6cadf743c098e08fca25c91103ee4303c9bb" +uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" +version = "1.15.6" + +[[deps.ChangesOfVariables]] +deps = ["ChainRulesCore", "LinearAlgebra", "Test"] +git-tree-sha1 = "38f7a08f19d8810338d4f5085211c7dfa5d5bdd8" +uuid = "9e997f8a-9a97-42d5-a9f1-ce6bfc15e2c0" +version = "0.1.4" + +[[deps.CodeTracking]] +deps = ["InteractiveUtils", "UUIDs"] +git-tree-sha1 = "cc4bd91eba9cdbbb4df4746124c22c0832a460d6" +uuid = "da1fd8a2-8d9e-5ec2-8556-3022fb5608a2" +version = "1.1.1" + +[[deps.CodecZlib]] +deps = ["TranscodingStreams", "Zlib_jll"] +git-tree-sha1 = "ded953804d019afa9a3f98981d99b33e3db7b6da" +uuid = "944b1d66-785c-5afd-91f1-9de20f533193" +version = "0.7.0" + +[[deps.ColorSchemes]] +deps = ["ColorTypes", "ColorVectorSpace", "Colors", "FixedPointNumbers", "Random"] +git-tree-sha1 = "1fd869cc3875b57347f7027521f561cf46d1fcd8" +uuid = "35d6a980-a343-548e-a6ea-1d62b119f2f4" +version = "3.19.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", "SpecialFunctions", "Statistics", "TensorCore"] +git-tree-sha1 = "d08c20eef1f2cbc6e60fd3612ac4340b89fea322" +uuid = "c3611d14-8923-5661-9e6a-0046d554d3a4" +version = "0.9.9" + +[[deps.Colors]] +deps = ["ColorTypes", "FixedPointNumbers", "Reexport"] +git-tree-sha1 = "417b0ed7b8b838aa6ca0a87aadf1bb9eb111ce40" +uuid = "5ae59095-9a9b-59fe-a467-6f913c188581" +version = "0.12.8" + +[[deps.Compat]] +deps = ["Dates", "LinearAlgebra", "UUIDs"] +git-tree-sha1 = "3ca828fe1b75fa84b021a7860bd039eaea84d2f2" +uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" +version = "4.3.0" + +[[deps.CompilerSupportLibraries_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" +version = "0.5.2+0" + +[[deps.Contour]] +git-tree-sha1 = "d05d9e7b7aedff4e5b51a029dced05cfb6125781" +uuid = "d38c429a-6771-53c6-b99e-75d170b6e991" +version = "0.6.2" + +[[deps.DataAPI]] +git-tree-sha1 = "46d2680e618f8abd007bce0c3026cb0c4a8f2032" +uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a" +version = "1.12.0" + +[[deps.DataStructures]] +deps = ["Compat", "InteractiveUtils", "OrderedCollections"] +git-tree-sha1 = "d1fff3a548102f48987a52a2e0d114fa97d730f0" +uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" +version = "0.18.13" + +[[deps.Dates]] +deps = ["Printf"] +uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" + +[[deps.DelimitedFiles]] +deps = ["Mmap"] +uuid = "8bb1440f-4735-579b-a4ab-409b98df4dab" + +[[deps.Distributed]] +deps = ["Random", "Serialization", "Sockets"] +uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" + +[[deps.DocStringExtensions]] +deps = ["LibGit2"] +git-tree-sha1 = "c36550cb29cbe373e95b3f40486b9a4148f89ffd" +uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" +version = "0.9.2" + +[[deps.Downloads]] +deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] +uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" +version = "1.6.0" + +[[deps.Expat_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "bad72f730e9e91c08d9427d5e8db95478a3c323d" +uuid = "2e619515-83b5-522b-bb60-26c02a35a201" +version = "2.4.8+0" + +[[deps.ExprTools]] +git-tree-sha1 = "56559bbef6ca5ea0c0818fa5c90320398a6fbf8d" +uuid = "e2ba6199-217a-4e67-a87a-7c52f15ade04" +version = "0.1.8" + +[[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", "Pkg", "Zlib_jll", "libaom_jll", "libass_jll", "libfdk_aac_jll", "libvorbis_jll", "x264_jll", "x265_jll"] +git-tree-sha1 = "74faea50c1d007c85837327f6775bea60b5492dd" +uuid = "b22a6f82-2f65-5046-a5b2-351ab43fb4e5" +version = "4.4.2+2" + +[[deps.FileWatching]] +uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" + +[[deps.FixedPointNumbers]] +deps = ["Statistics"] +git-tree-sha1 = "335bfdceacc84c5cdf16aadc768aa5ddfc5383cc" +uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" +version = "0.8.4" + +[[deps.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.FreeType2_jll]] +deps = ["Artifacts", "Bzip2_jll", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] +git-tree-sha1 = "87eb71354d8ec1a96d4a7636bd57a7347dde3ef9" +uuid = "d7e528f0-a631-5988-bf34-fe36492bcfd7" +version = "2.10.4+0" + +[[deps.FriBidi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "aa31987c2ba8704e23c6c8ba8a4f769d5d7e4f91" +uuid = "559328eb-81f9-559d-9380-de523a88c83c" +version = "1.0.10+0" + +[[deps.GLFW_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libglvnd_jll", "Pkg", "Xorg_libXcursor_jll", "Xorg_libXi_jll", "Xorg_libXinerama_jll", "Xorg_libXrandr_jll"] +git-tree-sha1 = "d972031d28c8c8d9d7b41a536ad7bb0c2579caca" +uuid = "0656b61e-2033-5cc2-a64a-77c0f6c09b89" +version = "3.3.8+0" + +[[deps.GPUArrays]] +deps = ["Adapt", "GPUArraysCore", "LLVM", "LinearAlgebra", "Printf", "Random", "Reexport", "Serialization", "Statistics"] +git-tree-sha1 = "45d7deaf05cbb44116ba785d147c518ab46352d7" +uuid = "0c68f7d7-f131-5f86-a1c3-88cf8149b2d7" +version = "8.5.0" + +[[deps.GPUArraysCore]] +deps = ["Adapt"] +git-tree-sha1 = "6872f5ec8fd1a38880f027a26739d42dcda6691f" +uuid = "46192b85-c4d5-4398-a991-12ede77f4527" +version = "0.1.2" + +[[deps.GPUCompiler]] +deps = ["ExprTools", "InteractiveUtils", "LLVM", "Libdl", "Logging", "TimerOutputs", "UUIDs"] +git-tree-sha1 = "76f70a337a153c1632104af19d29023dbb6f30dd" +uuid = "61eb1bfa-7361-4325-ad38-22787b887f55" +version = "0.16.6" + +[[deps.GR]] +deps = ["Base64", "DelimitedFiles", "GR_jll", "HTTP", "JSON", "Libdl", "LinearAlgebra", "Pkg", "Preferences", "Printf", "Random", "Serialization", "Sockets", "Test", "UUIDs"] +git-tree-sha1 = "00a9d4abadc05b9476e937a5557fcce476b9e547" +uuid = "28b8d3ca-fb5f-59d9-8090-bfdbd6d07a71" +version = "0.69.5" + +[[deps.GR_jll]] +deps = ["Artifacts", "Bzip2_jll", "Cairo_jll", "FFMPEG_jll", "Fontconfig_jll", "GLFW_jll", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Libtiff_jll", "Pixman_jll", "Pkg", "Qt5Base_jll", "Zlib_jll", "libpng_jll"] +git-tree-sha1 = "bc9f7725571ddb4ab2c4bc74fa397c1c5ad08943" +uuid = "d2c73de3-f751-5644-a686-071e5b155ba9" +version = "0.69.1+0" + +[[deps.Gettext_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Libiconv_jll", "Pkg", "XML2_jll"] +git-tree-sha1 = "9b02998aba7bf074d14de89f9d37ca24a1a0b046" +uuid = "78b55507-aeef-58d4-861c-77aaff3498b1" +version = "0.21.0+0" + +[[deps.Glib_jll]] +deps = ["Artifacts", "Gettext_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Libiconv_jll", "Libmount_jll", "PCRE2_jll", "Pkg", "Zlib_jll"] +git-tree-sha1 = "fb83fbe02fe57f2c068013aa94bcdf6760d3a7a7" +uuid = "7746bdde-850d-59dc-9ae8-88ece973131d" +version = "2.74.0+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.Grisu]] +git-tree-sha1 = "53bb909d1151e57e2484c3d1b53e19552b887fb2" +uuid = "42e2da0e-8278-4e71-bc24-59509adca0fe" +version = "1.0.2" + +[[deps.HTTP]] +deps = ["Base64", "CodecZlib", "Dates", "IniFile", "Logging", "LoggingExtras", "MbedTLS", "NetworkOptions", "OpenSSL", "Random", "SimpleBufferStream", "Sockets", "URIs", "UUIDs"] +git-tree-sha1 = "a97d47758e933cd5fe5ea181d178936a9fc60427" +uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3" +version = "1.5.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.Hyperscript]] +deps = ["Test"] +git-tree-sha1 = "8d511d5b81240fc8e6802386302675bdf47737b9" +uuid = "47d2ed2b-36de-50cf-bf87-49c2cf4b8b91" +version = "0.0.4" + +[[deps.HypertextLiteral]] +deps = ["Tricks"] +git-tree-sha1 = "c47c5fa4c5308f27ccaac35504858d8914e102f9" +uuid = "ac1192a8-f4b3-4bfe-ba22-af5b92cd3ab2" +version = "0.9.4" + +[[deps.IOCapture]] +deps = ["Logging", "Random"] +git-tree-sha1 = "f7be53659ab06ddc986428d3a9dcc95f6fa6705a" +uuid = "b5f81e59-6552-4d32-b1f0-c071b021bf89" +version = "0.2.2" + +[[deps.IniFile]] +git-tree-sha1 = "f550e6e32074c939295eb5ea6de31849ac2c9625" +uuid = "83e8ac13-25f8-5344-8a64-a9f2b223428f" +version = "0.5.1" + +[[deps.InteractiveUtils]] +deps = ["Markdown"] +uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" + +[[deps.InverseFunctions]] +deps = ["Test"] +git-tree-sha1 = "49510dfcb407e572524ba94aeae2fced1f3feb0f" +uuid = "3587e190-3f89-42d0-90ee-14403ec27112" +version = "0.1.8" + +[[deps.IrrationalConstants]] +git-tree-sha1 = "7fd44fd4ff43fc60815f8e764c0f352b83c49151" +uuid = "92d709cd-6900-40b7-9082-c6be49f344b6" +version = "0.1.1" + +[[deps.JLFzf]] +deps = ["Pipe", "REPL", "Random", "fzf_jll"] +git-tree-sha1 = "f377670cda23b6b7c1c0b3893e37451c5c1a2185" +uuid = "1019f520-868f-41f5-a6de-eb00f4b6a39c" +version = "0.1.5" + +[[deps.JLLWrappers]] +deps = ["Preferences"] +git-tree-sha1 = "abc9885a7ca2052a736a600f7fa66209f96506e1" +uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" +version = "1.4.1" + +[[deps.JSON]] +deps = ["Dates", "Mmap", "Parsers", "Unicode"] +git-tree-sha1 = "3c837543ddb02250ef42f4738347454f95079d4e" +uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" +version = "0.21.3" + +[[deps.JpegTurbo_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "b53380851c6e6664204efb2e62cd24fa5c47e4ba" +uuid = "aacddb02-875f-59d6-b918-886e6ef4fbf8" +version = "2.1.2+0" + +[[deps.JuliaInterpreter]] +deps = ["CodeTracking", "InteractiveUtils", "Random", "UUIDs"] +git-tree-sha1 = "0f960b1404abb0b244c1ece579a0ec78d056a5d1" +uuid = "aa1ae85d-cabe-5617-a682-6adf51b2e16a" +version = "0.9.15" + +[[deps.KernelAbstractions]] +deps = ["Adapt", "Atomix", "InteractiveUtils", "LinearAlgebra", "MacroTools", "SparseArrays", "StaticArrays", "UUIDs", "UnsafeAtomics", "UnsafeAtomicsLLVM"] +git-tree-sha1 = "eed4743b01ca88d23be3663bac121374940b475b" +uuid = "63c18a36-062a-441e-b654-da1e3ab1ce7c" +version = "0.8.4" + +[[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", "Printf", "Unicode"] +git-tree-sha1 = "e7e9184b0bf0158ac4e4aa9daf00041b5909bf1a" +uuid = "929cbde3-209d-540e-8aea-75f648917ca0" +version = "4.14.0" + +[[deps.LLVMExtra_jll]] +deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl", "Pkg", "TOML"] +git-tree-sha1 = "771bfe376249626d3ca12bcd58ba243d3f961576" +uuid = "dad2f222-ce93-54a1-a47d-0025e8a3acab" +version = "0.0.16+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 = "f2355693d6778a178ade15952b7ac47a4ff97996" +uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" +version = "1.3.0" + +[[deps.Latexify]] +deps = ["Formatting", "InteractiveUtils", "LaTeXStrings", "MacroTools", "Markdown", "OrderedCollections", "Printf", "Requires"] +git-tree-sha1 = "ab9aa169d2160129beb241cb2750ca499b4e90e9" +uuid = "23fbe1c1-3f47-55db-b15f-69d7ec21a316" +version = "0.15.17" + +[[deps.LazyArtifacts]] +deps = ["Artifacts", "Pkg"] +uuid = "4af54fe1-eca0-43a8-85a7-787d91b784e3" + +[[deps.LibCURL]] +deps = ["LibCURL_jll", "MozillaCACerts_jll"] +uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" +version = "0.6.3" + +[[deps.LibCURL_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] +uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" +version = "7.84.0+0" + +[[deps.LibGit2]] +deps = ["Base64", "NetworkOptions", "Printf", "SHA"] +uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" + +[[deps.LibSSH2_jll]] +deps = ["Artifacts", "Libdl", "MbedTLS_jll"] +uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" +version = "1.10.2+0" + +[[deps.Libdl]] +uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" + +[[deps.Libffi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "0b4a5d71f3e5200a7dff793393e09dfc2d874290" +uuid = "e9f186c6-92d2-5b65-8a66-fee21dc1b490" +version = "3.2.2+1" + +[[deps.Libgcrypt_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgpg_error_jll", "Pkg"] +git-tree-sha1 = "64613c82a59c120435c067c2b809fc61cf5166ae" +uuid = "d4300ac3-e22c-5743-9152-c294e39db1e4" +version = "1.8.7+0" + +[[deps.Libglvnd_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll", "Xorg_libXext_jll"] +git-tree-sha1 = "7739f837d6447403596a75d19ed01fd08d6f56bf" +uuid = "7e76a0d4-f3c7-5321-8279-8d96eeed0f29" +version = "1.3.0+3" + +[[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", "Pkg"] +git-tree-sha1 = "42b62845d70a619f063a7da093d995ec8e15e778" +uuid = "94ce4f54-9a6c-5748-9c1c-f9c7231a4531" +version = "1.16.1+1" + +[[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", "Pkg", "Zlib_jll", "Zstd_jll"] +git-tree-sha1 = "3eb79b0ca5764d4799c06699573fd8f533259713" +uuid = "89763e89-9b03-5906-acba-b20f662cd828" +version = "4.4.0+0" + +[[deps.Libuuid_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "7f3efec06033682db852f8b3bc3c1d2b0a0ab066" +uuid = "38a345b3-de98-5d2b-a5d3-14cd9215e700" +version = "2.36.0+0" + +[[deps.LinearAlgebra]] +deps = ["Libdl", "libblastrampoline_jll"] +uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + +[[deps.LogExpFunctions]] +deps = ["ChainRulesCore", "ChangesOfVariables", "DocStringExtensions", "InverseFunctions", "IrrationalConstants", "LinearAlgebra"] +git-tree-sha1 = "94d9c52ca447e23eac0c0f074effbcd38830deb5" +uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688" +version = "0.3.18" + +[[deps.Logging]] +uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" + +[[deps.LoggingExtras]] +deps = ["Dates", "Logging"] +git-tree-sha1 = "5d4d2d9904227b8bd66386c1138cf4d5ffa826bf" +uuid = "e6f89c97-d47a-5376-807f-9c37f3926c36" +version = "0.4.9" + +[[deps.LoweredCodeUtils]] +deps = ["JuliaInterpreter"] +git-tree-sha1 = "dedbebe234e06e1ddad435f5c6f4b85cd8ce55f7" +uuid = "6f1432cf-f94c-5a45-995e-cdbf5db27b0b" +version = "2.2.2" + +[[deps.MIMEs]] +git-tree-sha1 = "65f28ad4b594aebe22157d6fac869786a255b7eb" +uuid = "6c6e2e6c-3030-632d-7369-2d6c69616d65" +version = "0.1.4" + +[[deps.MacroTools]] +deps = ["Markdown", "Random"] +git-tree-sha1 = "42324d08725e200c23d4dfb549e0d5d89dede2d2" +uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" +version = "0.5.10" + +[[deps.Markdown]] +deps = ["Base64"] +uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" + +[[deps.MbedTLS]] +deps = ["Dates", "MbedTLS_jll", "MozillaCACerts_jll", "Random", "Sockets"] +git-tree-sha1 = "03a9b9718f5682ecb107ac9f7308991db4ce395b" +uuid = "739be429-bea8-5141-9913-cc70e7f3736d" +version = "1.1.7" + +[[deps.MbedTLS_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" +version = "2.28.0+0" + +[[deps.Measures]] +git-tree-sha1 = "e498ddeee6f9fdb4551ce855a46f54dbd900245f" +uuid = "442fdcdd-2543-5da2-b0f3-8c86c306513e" +version = "0.3.1" + +[[deps.Missings]] +deps = ["DataAPI"] +git-tree-sha1 = "bf210ce90b6c9eed32d25dbcae1ebc565df2687f" +uuid = "e1d29d7a-bbdc-5cf2-9ac0-f12de2c33e28" +version = "1.0.2" + +[[deps.Mmap]] +uuid = "a63ad114-7e13-5084-954f-fe012c677804" + +[[deps.MozillaCACerts_jll]] +uuid = "14a3606d-f60d-562e-9121-12d972cd8159" +version = "2022.2.1" + +[[deps.NaNMath]] +deps = ["OpenLibm_jll"] +git-tree-sha1 = "a7c3d1da1189a1c2fe843a3bfa04d18d20eb3211" +uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" +version = "1.0.1" + +[[deps.NetworkOptions]] +uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" +version = "1.2.0" + +[[deps.Ogg_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "887579a3eb005446d514ab7aeac5d1d027658b8f" +uuid = "e7412a2a-1a6e-54c0-be00-318e2571c051" +version = "1.3.5+1" + +[[deps.OpenBLAS_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] +uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" +version = "0.3.20+0" + +[[deps.OpenLibm_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "05823500-19ac-5b8b-9628-191a04bc5112" +version = "0.8.1+0" + +[[deps.OpenSSL]] +deps = ["BitFlags", "Dates", "MozillaCACerts_jll", "OpenSSL_jll", "Sockets"] +git-tree-sha1 = "3c3c4a401d267b04942545b1e964a20279587fd7" +uuid = "4d8831e6-92b7-49fb-bdf8-b643e874388c" +version = "1.3.0" + +[[deps.OpenSSL_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "f6e9dba33f9f2c44e08a020b0caf6903be540004" +uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95" +version = "1.1.19+0" + +[[deps.OpenSpecFun_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "13652491f6856acfd2db29360e1bbcd4565d04f1" +uuid = "efe28fd5-8261-553b-a9e1-b2916fc3738e" +version = "0.5.5+0" + +[[deps.Opus_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "51a08fb14ec28da2ec7a927c4337e4332c2a4720" +uuid = "91d4177d-7536-5919-b921-800302f37372" +version = "1.3.2+0" + +[[deps.OrderedCollections]] +git-tree-sha1 = "85f8e6578bf1f9ee0d11e7bb1b1456435479d47c" +uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" +version = "1.4.1" + +[[deps.PCRE2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "efcefdf7-47ab-520b-bdef-62a2eaa19f15" +version = "10.40.0+0" + +[[deps.Parsers]] +deps = ["Dates"] +git-tree-sha1 = "6c01a9b494f6d2a9fc180a08b182fcb06f0958a0" +uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" +version = "2.4.2" + +[[deps.Pipe]] +git-tree-sha1 = "6842804e7867b115ca9de748a0cf6b364523c16d" +uuid = "b98c9c47-44ae-5843-9183-064241ee97a0" +version = "1.3.0" + +[[deps.Pixman_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "b4f5d02549a10e20780a24fce72bea96b6329e29" +uuid = "30392449-352a-5448-841d-b1acce4e97dc" +version = "0.40.1+0" + +[[deps.Pkg]] +deps = ["Artifacts", "Dates", "Downloads", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] +uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" +version = "1.8.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", "Printf", "Random", "Reexport", "SnoopPrecompile", "Statistics"] +git-tree-sha1 = "21303256d239f6b484977314674aef4bb1fe4420" +uuid = "995b91a9-d308-5afd-9ec6-746e21dbc043" +version = "1.3.1" + +[[deps.Plots]] +deps = ["Base64", "Contour", "Dates", "Downloads", "FFMPEG", "FixedPointNumbers", "GR", "JLFzf", "JSON", "LaTeXStrings", "Latexify", "LinearAlgebra", "Measures", "NaNMath", "Pkg", "PlotThemes", "PlotUtils", "Printf", "REPL", "Random", "RecipesBase", "RecipesPipeline", "Reexport", "RelocatableFolders", "Requires", "Scratch", "Showoff", "SnoopPrecompile", "SparseArrays", "Statistics", "StatsBase", "UUIDs", "UnicodeFun", "Unzip"] +git-tree-sha1 = "8c5643a30c97e02f4e80b9fff99544f64292eb6f" +uuid = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" +version = "1.35.7" + +[[deps.PlutoHooks]] +deps = ["InteractiveUtils", "Markdown", "UUIDs"] +git-tree-sha1 = "072cdf20c9b0507fdd977d7d246d90030609674b" +uuid = "0ff47ea0-7a50-410d-8455-4348d5de0774" +version = "0.0.5" + +[[deps.PlutoLinks]] +deps = ["FileWatching", "InteractiveUtils", "Markdown", "PlutoHooks", "Revise", "UUIDs"] +git-tree-sha1 = "0e8bcc235ec8367a8e9648d48325ff00e4b0a545" +uuid = "0ff47ea0-7a50-410d-8455-4348d5de0420" +version = "0.1.5" + +[[deps.PlutoTeachingTools]] +deps = ["Downloads", "HypertextLiteral", "LaTeXStrings", "Latexify", "Markdown", "PlutoLinks", "PlutoUI", "Random"] +git-tree-sha1 = "ea3e4ac2e49e3438815f8946fa7673b658e35bdb" +uuid = "661c6b06-c737-4d37-b85c-46df65de6f69" +version = "0.2.5" + +[[deps.PlutoUI]] +deps = ["AbstractPlutoDingetjes", "Base64", "ColorTypes", "Dates", "FixedPointNumbers", "Hyperscript", "HypertextLiteral", "IOCapture", "InteractiveUtils", "JSON", "Logging", "MIMEs", "Markdown", "Random", "Reexport", "URIs", "UUIDs"] +git-tree-sha1 = "efc140104e6d0ae3e7e30d56c98c4a927154d684" +uuid = "7f904dfe-b85e-4ff6-b463-dae2292396a8" +version = "0.7.48" + +[[deps.Preferences]] +deps = ["TOML"] +git-tree-sha1 = "47e5f437cc0e7ef2ce8406ce1e7e24d44915f88d" +uuid = "21216c6a-2e73-6563-6e65-726566657250" +version = "1.3.0" + +[[deps.Printf]] +deps = ["Unicode"] +uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" + +[[deps.Profile]] +deps = ["Printf"] +uuid = "9abbd945-dff8-562f-b5e8-e1ebf5ef1b79" + +[[deps.Qt5Base_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Fontconfig_jll", "Glib_jll", "JLLWrappers", "Libdl", "Libglvnd_jll", "OpenSSL_jll", "Pkg", "Xorg_libXext_jll", "Xorg_libxcb_jll", "Xorg_xcb_util_image_jll", "Xorg_xcb_util_keysyms_jll", "Xorg_xcb_util_renderutil_jll", "Xorg_xcb_util_wm_jll", "Zlib_jll", "xkbcommon_jll"] +git-tree-sha1 = "c6c0f690d0cc7caddb74cef7aa847b824a16b256" +uuid = "ea2cea3b-5b76-57ae-a6ef-0a8af62496e1" +version = "5.15.3+1" + +[[deps.REPL]] +deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] +uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" + +[[deps.Random]] +deps = ["SHA", "Serialization"] +uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" + +[[deps.Random123]] +deps = ["Random", "RandomNumbers"] +git-tree-sha1 = "7a1a306b72cfa60634f03a911405f4e64d1b718b" +uuid = "74087812-796a-5b5d-8853-05524746bad3" +version = "1.6.0" + +[[deps.RandomNumbers]] +deps = ["Random", "Requires"] +git-tree-sha1 = "043da614cc7e95c703498a491e2c21f58a2b8111" +uuid = "e6cf234a-135c-5ec9-84dd-332b85af5143" +version = "1.5.3" + +[[deps.RecipesBase]] +deps = ["SnoopPrecompile"] +git-tree-sha1 = "d12e612bba40d189cead6ff857ddb67bd2e6a387" +uuid = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" +version = "1.3.1" + +[[deps.RecipesPipeline]] +deps = ["Dates", "NaNMath", "PlotUtils", "RecipesBase", "SnoopPrecompile"] +git-tree-sha1 = "249df6fb3520492092ccebe921829920215ab205" +uuid = "01d81517-befc-4cb6-b9ec-a95719d0359c" +version = "0.6.9" + +[[deps.Reexport]] +git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" +uuid = "189a3867-3050-52da-a836-e630ba90ab69" +version = "1.2.2" + +[[deps.RelocatableFolders]] +deps = ["SHA", "Scratch"] +git-tree-sha1 = "90bc7a7c96410424509e4263e277e43250c05691" +uuid = "05181044-ff0b-4ac5-8273-598c1e38db00" +version = "1.0.0" + +[[deps.Requires]] +deps = ["UUIDs"] +git-tree-sha1 = "838a3a4188e2ded87a4f9f184b4b0d78a1e91cb7" +uuid = "ae029012-a4dd-5104-9daa-d747884805df" +version = "1.3.0" + +[[deps.Revise]] +deps = ["CodeTracking", "Distributed", "FileWatching", "JuliaInterpreter", "LibGit2", "LoweredCodeUtils", "OrderedCollections", "Pkg", "REPL", "Requires", "UUIDs", "Unicode"] +git-tree-sha1 = "dad726963ecea2d8a81e26286f625aee09a91b7c" +uuid = "295af30f-e4ad-537b-8983-00126c2a3abe" +version = "3.4.0" + +[[deps.SHA]] +uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" +version = "0.7.0" + +[[deps.Scratch]] +deps = ["Dates"] +git-tree-sha1 = "f94f779c94e58bf9ea243e77a37e16d9de9126bd" +uuid = "6c6a2e73-6563-6170-7368-637461726353" +version = "1.1.1" + +[[deps.Serialization]] +uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" + +[[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.SnoopPrecompile]] +git-tree-sha1 = "f604441450a3c0569830946e5b33b78c928e1a85" +uuid = "66db9d55-30c0-4569-8b51-7e840670fc0c" +version = "1.0.1" + +[[deps.Sockets]] +uuid = "6462fe0b-24de-5631-8697-dd941f90decc" + +[[deps.SortingAlgorithms]] +deps = ["DataStructures"] +git-tree-sha1 = "b3363d7460f7d098ca0912c69b082f75625d7508" +uuid = "a2af1166-a08f-5f64-846c-94a0d3cef48c" +version = "1.0.1" + +[[deps.SparseArrays]] +deps = ["LinearAlgebra", "Random"] +uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + +[[deps.SpecialFunctions]] +deps = ["ChainRulesCore", "IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"] +git-tree-sha1 = "d75bda01f8c31ebb72df80a46c88b25d1c79c56d" +uuid = "276daf66-3868-5448-9aa4-cd146d93841b" +version = "2.1.7" + +[[deps.StaticArrays]] +deps = ["LinearAlgebra", "Random", "StaticArraysCore", "Statistics"] +git-tree-sha1 = "f86b3a049e5d05227b10e15dbb315c5b90f14988" +uuid = "90137ffa-7385-5640-81b9-e52037218182" +version = "1.5.9" + +[[deps.StaticArraysCore]] +git-tree-sha1 = "6b7ba252635a5eff6a0b0664a41ee140a1c9e72a" +uuid = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" +version = "1.4.0" + +[[deps.Statistics]] +deps = ["LinearAlgebra", "SparseArrays"] +uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" + +[[deps.StatsAPI]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "f9af7f195fb13589dd2e2d57fdb401717d2eb1f6" +uuid = "82ae8749-77ed-4fe6-ae5f-f523153014b0" +version = "1.5.0" + +[[deps.StatsBase]] +deps = ["DataAPI", "DataStructures", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"] +git-tree-sha1 = "d1bf48bfcc554a3761a133fe3a9bb01488e06916" +uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" +version = "0.33.21" + +[[deps.TOML]] +deps = ["Dates"] +uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" +version = "1.0.0" + +[[deps.Tar]] +deps = ["ArgTools", "SHA"] +uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" +version = "1.10.1" + +[[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.TimerOutputs]] +deps = ["ExprTools", "Printf"] +git-tree-sha1 = "9dfcb767e17b0849d6aaf85997c98a5aea292513" +uuid = "a759f4b9-e2f1-59dc-863e-4aeb61b1ea8f" +version = "0.5.21" + +[[deps.TranscodingStreams]] +deps = ["Random", "Test"] +git-tree-sha1 = "8a75929dcd3c38611db2f8d08546decb514fcadf" +uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa" +version = "0.9.9" + +[[deps.Tricks]] +git-tree-sha1 = "6bac775f2d42a611cdfcd1fb217ee719630c4175" +uuid = "410a4b4d-49e4-4fbc-ab6d-cb71b17b3775" +version = "0.1.6" + +[[deps.URIs]] +git-tree-sha1 = "e59ecc5a41b000fa94423a578d29290c7266fc10" +uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" +version = "1.4.0" + +[[deps.UUIDs]] +deps = ["Random", "SHA"] +uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" + +[[deps.Unicode]] +uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" + +[[deps.UnicodeFun]] +deps = ["REPL"] +git-tree-sha1 = "53915e50200959667e78a92a418594b428dffddf" +uuid = "1cfade01-22cf-5700-b092-accc4b62d6e1" +version = "0.4.1" + +[[deps.UnsafeAtomics]] +git-tree-sha1 = "6331ac3440856ea1988316b46045303bef658278" +uuid = "013be700-e6cd-48c3-b4a1-df204f14c38f" +version = "0.2.1" + +[[deps.UnsafeAtomicsLLVM]] +deps = ["LLVM", "UnsafeAtomics"] +git-tree-sha1 = "33af9d2031d0dc09e2be9a0d4beefec4466def8e" +uuid = "d80eeb9a-aca5-4d75-85e5-170c8b632249" +version = "0.1.0" + +[[deps.Unzip]] +git-tree-sha1 = "ca0969166a028236229f63514992fc073799bb78" +uuid = "41fe7b60-77ed-43a1-b4f0-825fd5a5650d" +version = "0.2.0" + +[[deps.Wayland_jll]] +deps = ["Artifacts", "Expat_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Pkg", "XML2_jll"] +git-tree-sha1 = "3e61f0b86f90dacb0bc0e73a0c5a83f6a8636e23" +uuid = "a2964d1f-97da-50d4-b82a-358c7fce9d89" +version = "1.19.0+0" + +[[deps.Wayland_protocols_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "4528479aa01ee1b3b4cd0e6faef0e04cf16466da" +uuid = "2381bf8a-dfd0-557d-9999-79630e7b1b91" +version = "1.25.0+0" + +[[deps.XML2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Pkg", "Zlib_jll"] +git-tree-sha1 = "58443b63fb7e465a8a7210828c91c08b92132dff" +uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a" +version = "2.9.14+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.Xorg_libX11_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libxcb_jll", "Xorg_xtrans_jll"] +git-tree-sha1 = "5be649d550f3f4b95308bf0183b82e2582876527" +uuid = "4f6342f7-b3d2-589e-9d20-edeb45f2b2bc" +version = "1.6.9+4" + +[[deps.Xorg_libXau_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "4e490d5c960c314f33885790ed410ff3a94ce67e" +uuid = "0c0b7dd1-d40b-584c-a123-a41640f87eec" +version = "1.0.9+4" + +[[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", "Pkg"] +git-tree-sha1 = "4fe47bd2247248125c428978740e18a681372dd4" +uuid = "a3789734-cfe1-5b06-b2d0-1dd0d9d62d05" +version = "1.1.3+4" + +[[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", "Pkg"] +git-tree-sha1 = "6783737e45d3c59a4a4c4091f5f88cdcf0908cbb" +uuid = "14d82f49-176c-5ed1-bb49-ad3f5cbd8c74" +version = "0.1.0+3" + +[[deps.Xorg_libxcb_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "XSLT_jll", "Xorg_libXau_jll", "Xorg_libXdmcp_jll", "Xorg_libpthread_stubs_jll"] +git-tree-sha1 = "daf17f441228e7a3833846cd048892861cff16d6" +uuid = "c7cfdc94-dc32-55de-ac96-5a1b8d977c5b" +version = "1.13.0+3" + +[[deps.Xorg_libxkbfile_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll"] +git-tree-sha1 = "926af861744212db0eb001d9e40b5d16292080b2" +uuid = "cc61e674-0454-545c-8b26-ed2c68acab7a" +version = "1.1.0+4" + +[[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", "Pkg", "Xorg_libxkbfile_jll"] +git-tree-sha1 = "4bcbf660f6c2e714f87e960a171b119d06ee163b" +uuid = "35661453-b289-5fab-8a00-3d9160c6a3a4" +version = "1.4.2+4" + +[[deps.Xorg_xkeyboard_config_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xkbcomp_jll"] +git-tree-sha1 = "5c8424f8a67c3f2209646d4425f3d415fee5931d" +uuid = "33bec58e-1273-512f-9401-5d533626f822" +version = "2.27.0+4" + +[[deps.Xorg_xtrans_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "79c31e7844f6ecf779705fbc12146eb190b7d845" +uuid = "c5fb5394-a638-5e4d-96e5-b29de1b5cf10" +version = "1.4.0+3" + +[[deps.Zlib_jll]] +deps = ["Libdl"] +uuid = "83775a58-1f1d-513f-b197-d71354ab007a" +version = "1.2.12+3" + +[[deps.Zstd_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "e45044cd873ded54b6a5bac0eb5c971392cf1927" +uuid = "3161d3a3-bdf6-5164-811a-617609db77b4" +version = "1.5.2+0" + +[[deps.fzf_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "868e669ccb12ba16eaf50cb2957ee2ff61261c56" +uuid = "214eeab7-80f7-51ab-84ad-2988db7cef09" +version = "0.29.0+0" + +[[deps.libaom_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "3a2ea60308f0996d26f1e5354e10c24e9ef905d4" +uuid = "a4ae2306-e953-59d6-aa16-d00cac43593b" +version = "3.4.0+0" + +[[deps.libass_jll]] +deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] +git-tree-sha1 = "5982a94fcba20f02f42ace44b9894ee2b140fe47" +uuid = "0ac62f75-1d6f-5e53-bd7c-93b484bb37c0" +version = "0.15.1+0" + +[[deps.libblastrampoline_jll]] +deps = ["Artifacts", "Libdl", "OpenBLAS_jll"] +uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" +version = "5.1.1+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.libpng_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] +git-tree-sha1 = "94d180a6d2b5e55e447e2d27a29ed04fe79eb30c" +uuid = "b53b4c65-9356-5827-b1ea-8c7a1a84506f" +version = "1.6.38+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.nghttp2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" +version = "1.48.0+0" + +[[deps.p7zip_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" +version = "17.4.0+0" + +[[deps.x264_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "4fea590b89e6ec504593146bf8b988b2c00922b2" +uuid = "1270edf5-f2f9-52d2-97e9-ab00b5d0237a" +version = "2021.5.5+0" + +[[deps.x265_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "ee567a171cce03570d77ad3a43e90218e38937a9" +uuid = "dfaa095f-4041-5dcd-9319-2fabd8486b76" +version = "3.5.0+0" + +[[deps.xkbcommon_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Wayland_jll", "Wayland_protocols_jll", "Xorg_libxcb_jll", "Xorg_xkeyboard_config_jll"] +git-tree-sha1 = "9ebfc140cc56e8c2156a15ceac2f0302e327ac0a" +uuid = "d8fb68d0-12a3-5cfd-a85a-d49703b185fd" +version = "1.4.1+0" +""" + +# ╔═║ Cell order: +# ╠═f984ae77-cd98-4002-bdbf-c532ad9fc1c6 +# β•Ÿβ”€11361b6d-7338-4f7c-a196-a87236887484 +# ╠═5803a81e-5b75-11ed-08ff-17c142080826 +# ╠═ec43be3f-2ae1-41fa-b630-4de63271fbb3 +# ╠═2e70ac93-80ac-44bb-a7e0-06a89a2a0188 +# ╠═a353c90a-32c5-4cf7-aa3a-0a9c0e7e4f47 +# β•Ÿβ”€d79b1c88-73f6-462f-8bab-07c311c9cac1 +# β•Ÿβ”€6f256181-b70d-41f5-a0cf-8fbf0ff94ed4 +# β•Ÿβ”€feff0c0f-e874-46f2-9006-3e59bacc8417 +# β•Ÿβ”€45e5d832-a12b-4512-903a-80899f3cc2a4 +# β•Ÿβ”€ccce9e18-a32f-49c7-9cdf-b465d999272e +# β•Ÿβ”€5e31e98e-0688-4b9d-aa81-0f49a793c71a +# β•Ÿβ”€0333d1f7-be89-4a26-931b-372f3085c618 +# β•Ÿβ”€b7f9507f-b956-4453-ba66-4787d6b2b313 +# β•Ÿβ”€f4760fa0-a0b5-41e9-b49d-0bd9cc7e2782 +# ╠═eb61a025-c36f-4c96-bf3f-029bc3a2cecf +# ╠═27f75a0b-3b90-4982-b411-2b7907f9b7d7 +# β•Ÿβ”€e7fbd945-bd94-4639-a9b2-ef2aa78f6600 +# β•Ÿβ”€e75d3a86-604f-4502-b72a-6220e1543b64 +# β•Ÿβ”€60907f8e-13a2-4b31-bf6f-6a7e06eacc01 +# β•Ÿβ”€c2112a28-3b1a-4f1d-a9c3-474a20e6b1b1 +# β•Ÿβ”€6fb37947-c4dd-4807-9369-7e1d67b23b9e +# ╠═ab60a366-44a3-4898-8b46-25a3d0fb7a38 +# β•Ÿβ”€7cd14a96-7894-4ed1-b002-48644f7c65ab +# ╠═a44627dc-fdb5-478b-a695-11a2eb02d7f1 +# β•Ÿβ”€2c644f2a-6416-4a0e-8e38-2b4ef097abc3 +# ╠═f32302b6-ead0-4a56-b0df-1776816815e3 +# β•Ÿβ”€41fee41a-8b78-4337-aa37-b638a24448fb +# ╠═e2365d69-217f-46c8-8058-fcb2449f01aa +# β•Ÿβ”€3b6ff29a-0d42-4441-ba49-f0e5adfbb583 +# β•Ÿβ”€a3eea236-a688-433a-8a22-ccffc37ce4af +# β•Ÿβ”€d62e68e2-13be-48f8-9599-49e358dbde59 +# ╠═7df074c1-1f24-475d-b446-1c16f9c86538 +# ╠═95dfeb17-7134-41e1-8015-dc14845f369a +# β•Ÿβ”€570e7ebe-252f-4cd7-b3a5-31232e5642ec +# β•Ÿβ”€d8611f20-387b-40d1-9490-f7bf0a93a437 +# β•Ÿβ”€56bac60c-65ff-4b5c-a5ca-29a723a79d89 +# β•Ÿβ”€51041f7e-19ce-482d-b993-4b9d80e0745c +# ╠═a151f96e-ab07-4b51-9213-45c36e588ab0 +# β•Ÿβ”€c736fb2c-3afc-456d-a0fa-44caa067dd2d +# β•Ÿβ”€85be94f8-452b-4fdc-a195-4e9e474b83b8 +# ╠═150b90bd-47bb-4f34-ba88-ba3e1d458811 +# β•Ÿβ”€a8fa5ee2-0b88-4760-a7c1-3e7b8a31d6a2 +# β•Ÿβ”€a85927b0-152a-4a55-a23b-0ff560c40ead +# β•Ÿβ”€e57cb666-08fd-40b1-9cff-fd19b82563d7 +# ╠═d7a4e9c6-2a39-4004-b3a6-0beb63d34a47 +# ╠═51ad839c-42cd-4da5-a92c-a6e047fd4ec8 +# β•Ÿβ”€b1f56b3f-85dc-4580-aa30-ef2ba0021c4d +# β•Ÿβ”€9b65f47f-f569-4aee-9250-af169d13d604 +# β•Ÿβ”€01b6edaf-a83f-429f-9108-35b43f6d299c +# β•Ÿβ”€8429ef19-3306-4d85-b8f6-194a04711dd2 +# ╠═2087f4f2-9d85-4358-bf7f-9ea53db7eead +# ╠═ac093aed-406b-4e78-b746-d61ee37829e7 +# β•Ÿβ”€e7dc5fd6-6b12-453e-9ccf-910af73850e6 +# ╠═2228ceb5-1f53-4e68-9913-e2edafa0979f +# ╠═5559bdac-56be-4230-a7e0-2efcc14d03e0 +# ╠═e7ea34ed-4dd5-4fa8-806f-af157bfb6590 +# ╠═4a0cba53-3e9c-4277-9a30-7455741a5f50 +# ╠═51061846-6f58-479b-ab24-0a773c2af034 +# β•Ÿβ”€fe4b8a41-02a2-4c7f-996f-6913fc62713e +# ╠═23ef2c59-6301-4e42-81e2-6c4481f4bb9b +# β•Ÿβ”€3cd38682-aa95-4d27-831f-814641b92754 +# β•Ÿβ”€903e087d-a77e-4c56-9761-05c54a0cc81c +# ╠═48da2f41-d9e2-4c8b-b23f-9d7e1346769f +# ╠═17c5ee50-7baa-4d28-a39a-b9f58eaf7f0a +# β•Ÿβ”€960288de-ab52-4bae-baa2-6c582c26c2b2 +# β•Ÿβ”€cc734b56-93b2-40c3-acbb-2d18b028ae21 +# ╠═cc92ac8f-8430-4ee1-8090-31b4dbd0253b +# ╠═9ffe6c48-20f7-4866-af2e-22977315fa60 +# β•Ÿβ”€3fc6b27e-ad34-4fa2-8405-91261d7b3384 +# β•Ÿβ”€c1ad1392-005d-4c99-826f-be9c7c240f88 +# β•Ÿβ”€4a330f54-a220-466c-af5e-ad70d5387d5b +# ╠═3313e718-9cd2-41d9-8615-b72871f9fda5 +# ╠═904e5a60-65ce-419e-9f8c-32b29a98d0f4 +# β•Ÿβ”€09d5ed7f-5c78-470b-a832-d6ce951dc8a2 +# β•Ÿβ”€449d8103-dc1f-4496-bd90-a4718d9f30ea +# β•Ÿβ”€0b60df5e-732d-47cb-ad56-9c9a81fe374b +# ╠═f8eef0e0-eaa8-4161-be01-b8551af21f1f +# ╠═f83755c7-d6ff-4438-b9a5-659561d1b6dc +# ╠═f7e8e7c9-d71d-48ee-9909-a6a5a4e06d1b +# ╠═ba83ffdd-480e-496e-b8d6-4475cffd9ea8 +# ╠═04ac0905-2ab0-4e0c-abbb-343a96c10c16 +# β•Ÿβ”€a02b2923-bfb0-4cfa-bf05-c1e37d0f9420 +# β•Ÿβ”€4c1f3efe-2374-4471-ae5f-48d7eff4d379 +# ╠═2db23a84-50f2-4b28-9ea2-218cd850a157 +# ╠═dc7cfac4-2076-4b7b-b469-d3399cdb88e2 +# β•Ÿβ”€54b2103f-374a-40fd-aaf4-832151e0e437 +# β•Ÿβ”€221e063b-84c4-43aa-b07c-40519330a9b9 +# ╠═cd234be4-f2a6-4c3b-be65-a053ee7224be +# β•Ÿβ”€00000000-0000-0000-0000-000000000001 +# β•Ÿβ”€00000000-0000-0000-0000-000000000002 diff --git a/homeworks_old/images/atmosphere.png b/homeworks_old/images/atmosphere.png new file mode 100644 index 0000000..70b10c4 Binary files /dev/null and b/homeworks_old/images/atmosphere.png differ diff --git a/homeworks_old/images/lineland.png b/homeworks_old/images/lineland.png new file mode 100644 index 0000000..04da51f Binary files /dev/null and b/homeworks_old/images/lineland.png differ diff --git a/index.html b/index.html new file mode 100644 index 0000000..d2a0369 --- /dev/null +++ b/index.html @@ -0,0 +1,23 @@ + + + + + + + + + + + + +

Notebooks

+ + + + diff --git a/netlify.toml b/netlify.toml new file mode 100644 index 0000000..44c3296 --- /dev/null +++ b/netlify.toml @@ -0,0 +1,4 @@ +[[headers]] + for = "/*" + [headers.values] + Access-Control-Allow-Origin = "*" diff --git a/notebooks/0_julia_tutorial.html b/notebooks/0_julia_tutorial.html new file mode 100644 index 0000000..90cd376 --- /dev/null +++ b/notebooks/0_julia_tutorial.html @@ -0,0 +1,16 @@ + + + + + + +
\ No newline at end of file diff --git a/notebooks/0_julia_tutorial.jl b/notebooks/0_julia_tutorial.jl new file mode 100644 index 0000000..1498856 --- /dev/null +++ b/notebooks/0_julia_tutorial.jl @@ -0,0 +1,2136 @@ +### A Pluto.jl notebook ### +# v0.19.27 + +using Markdown +using InteractiveUtils + +# ╔═║ 5b0d8c7e-5b74-4bc5-9f3a-d84d44b68605 +begin + using AbstractTrees + using LinearAlgebra + using Plots + using PlutoUI +end + +# ╔═║ 05b0eb5c-37ae-11ed-2a1e-e565ae78b5db +md""" +# Julia Basics Tutorial +This is a tutorial notebook designed for [Julia: Solving Real-World Problems with Computation, Fall 2023](https://github.com/mitmath/JuliaComputation). + +This notebook is targeted at students who are already experienced with basic programming language concepts and have used one or more languages but are new to Julia. We focus on the semantics that are different from other languages and may be surprising to new Julia programmers. More advanced topics such as generic types, macros, multithreaded code, and performance analysis will be saved for later in the term. +""" + +# ╔═║ e1f9ae36-225e-42dd-8206-41c8a1a8e97c +TableOfContents() + +# ╔═║ 3ebc35e4-73be-48c1-9d3b-b99d89413810 +md""" +# Pluto +""" + +# ╔═║ ec2750c6-bcd6-40bd-b09c-4055852e186b +md""" +This document you see is a notebook created with [Pluto.jl](https://github.com/fonsp/Pluto.jl). +It is a mixture of Julia code and web components, designed to make the programming experience more fun and interactive. + +In this notebook, you have access to a structured equivalent of Julia's REPL (Read-Eval-Print Loop), i.e. the interactive console. Here, you can divide your code in cells to modify and run each one separately. +Press `Ctrl + Shift + ?` (or `Cmd + Shift + ?` on a Mac) to open the list of keyboard shortcuts. +""" + +# ╔═║ f0bcdf1c-f77d-4ffe-b5b7-fd7ec2bbf815 +md""" +## Some quirks + +The behaviors described below are specific to Pluto notebooks and do not apply to Julia as a whole: +- To put several lines in a Pluto cell, you must wrap them in a `begin ... end` block. +- You cannot redefine a variable with the same name twice in the same notebook. +- If you want interactivity to work, avoid modifying variables in another cell that the one containing their definition. +- By default, the output of a cell is the value of its last expression, you can hide it by ending the cell with `;`. +- Usually, packages have to be installed (with `import Pkg; Pkg.add("MyPackage")`) before they can be used. However, Pluto takes care of that for us, so when you need a package, just write `using MyPackage` in a cell. This package will then be downloaded and installed in a local environment specific to the current notebook. +""" + +# ╔═║ 9c801be7-2387-4665-8421-c1eee596a592 +md""" +## Help and documentation + +Pluto offers you a `Live Docs` tab on the bottom right corner of the screen. If you expand it and click a function or variable, you will be able to explore the documentation associated with it. The same goes if you type `?` before a command in the REPL. + +For details on Pluto itself, check out the [FAQ](https://github.com/fonsp/Pluto.jl/wiki). +""" + +# ╔═║ 1b5740a7-d0c3-487f-8a6a-8b2a9861ddc7 +md""" +# Basic syntax +""" + +# ╔═║ a2998593-f16c-4dc0-abb6-0534dd3e710a +md""" +Julia has Unicode support for identifiers +""" + +# ╔═║ 08e99dfa-61c9-49b7-93db-3546a2850eef +let + Ξ± = 3 # type \alpha + πŸ‘½ = "abc" # type \:alien: +end; + +# ╔═║ 43fb2f38-3150-44e1-90fd-cdf68d4c8f89 +md""" +Loops, `if/then` statements, functions and other blocks are not delimited by the indentation, but by an `end` keyword. Don't forget it! +""" + +# ╔═║ 026c9439-5ffa-459d-8353-63bffc80306f +begin + # You can use =, in, or ∈ (\in) + # start:step:end is the syntax for a range literal in Julia (includes both ends) + for i = 1:3, j in 2:2:6, k ∈ 2:-1:0 + println((i, j, k)) + end + # Notice that you can put multiple loop iterators in one line. +end + +# ╔═║ 29098bf7-6a4f-4819-8b1b-d569b7bbfbc3 +md""" +Null object +""" + +# ╔═║ fb1f9e35-4538-44f9-8795-ab60805c3211 +isnothing(nothing) + +# ╔═║ 8028f4e6-4e16-4004-b1cd-80793920b12c +typeof(nothing) + +# ╔═║ 0589e51d-e420-4e9a-ba6d-e08dd063fc0f +md""" +Integer types have a fixed number of bits, so they can overflow. The default `Int` type uses 64 bits, so it can express an integer in the range $[-2^{63}, 2^{63} - 1]$. If you actually need arbitrary-precision integers, you can use `BigInt`. +""" + +# ╔═║ 8ed5706e-1b2c-4c83-8c6c-7e8190d31405 +typemax(Int) + +# ╔═║ 7166a14e-87bf-42ff-a88f-bde7a1d3c6ca +2^63 - 1 + +# ╔═║ f55948fa-ae0e-4d5d-b9ca-347dd39ed138 +typemax(Int) + 1 + +# ╔═║ ceddc242-445d-4bbf-bcb5-2bf9a264ea3d +- 2^63 + +# ╔═║ 7890c7b6-0d66-4b25-b30b-98542de9a32f +md""" +For more surprises, check out the [noteworthy differences from Python](https://docs.julialang.org/en/v1/manual/noteworthy-differences/#Noteworthy-differences-from-Python). +""" + +# ╔═║ e8906a7c-18e6-469c-99a8-0d21b76182e2 +md""" +# Arrays +""" + +# ╔═║ cd88584f-c46b-414c-84a7-53038a6b8e38 +md""" +## Terminology +In Julia, `Array` is meant in the mathematical sense (unlike in some languages where arrays only have one dimension). `Vector` and `Matrix` are also meant in the mathematical sense. So `Vector` is the special case of `Array` where there is only one dimension and `Matrix` is the special case of `Array` where there are two dimensions. +""" + +# ╔═║ 9df547e0-5c95-474f-b74a-f6dfe0e9fc39 +# See in the output that `Vector` is really an alias for `Array` +Vector{Int} + +# ╔═║ 7c57e8b0-36e1-45a2-942a-6aa013af80c9 +# See in the output that `Matrix` is really an alias for `Array` +Matrix{Int} + +# ╔═║ 850e864c-3a0d-42c9-afe4-4149208c18b2 +md""" +## Initialization +There are many ways to initialize an array in Julia. +""" + +# ╔═║ cd0b2fdf-8a6e-4096-8161-df408f92767e +md""" +### Literals +""" + +# ╔═║ 25202060-8199-4405-915a-a01389f04545 +[1, 2, 3] # Vector literal (treated as column vector if used for linear algebra) + +# ╔═║ 5d2a5942-607a-428e-9257-3a1fe5fbc3c6 +[1 2 3] # row vector literal (1x3 Matrix) + +# ╔═║ a70d1718-f546-43e4-8553-045dcffd1ad3 +[1 2 + 3 4] # Matrix literal + +# ╔═║ 736f87c1-f8db-4d16-bad6-95baaa6dd908 +[1 2; 3 4] # ; works the same way as the newline in the previous example + +# ╔═║ 0987f560-01ae-468e-ba50-3ede19bc2ed9 +md""" +### Vector Comprehension +""" + +# ╔═║ 8cae53e5-e5d0-48ef-b33f-c9c78200dcbc +[x for x in 1:10 if x % 3 == 1] # (same syntax list comprehension in Python) + +# ╔═║ 3df5875a-55e2-4a6f-bf6d-aa2192126a30 +[i + j for i in 1:4, j in 1:3] # (also works for matrices) + +# ╔═║ 459b8c60-e16d-429a-ae1d-9a99d57cf554 +md""" +### Constructors +""" + +# ╔═║ 0ddcd01a-dc34-48b6-83e5-6def28fce78e +Char[] # empty Vector that can only store Chars in the future + +# ╔═║ f3c3ad60-9c87-40e5-ba15-d9f72c3bae60 +Vector{Int}(undef, 5) # new 5 Vector of Int64s + # uses whatever memory is convenient for the compiler + +# ╔═║ 0e7ce1f3-510d-44ad-bd7c-a25a840eda5e +Matrix{Float64}(undef, 2, 3) # new 2x3 Matrix of Float64s + # uses whatever memory is convenient for the compiler + +# ╔═║ c2dd2043-df98-45ab-a4e3-a73f31b03cbd +Array{Bool}(undef, 1, 2, 3) # new 1x2x3 Array of Bools + # uses whatever memory is convenient for the compiler + +# ╔═║ bd5060ec-758f-418a-98a5-f57f424d64d5 +md""" +### `zeros` and `fill` +""" + +# ╔═║ 9b17807e-a18f-4735-bdae-0924d28fd5ee +zeros(Complex, 4) # 4 Vector of zeros of type Complex + +# ╔═║ 8c25ac44-6a59-4442-be4c-3ed8effdb20d +zeros(3, 2) # defaults to Float64 if a type isn't specified + +# ╔═║ 1b1d8481-0eff-446d-b932-8bd52817cbfc +fill(5, 4, 2) # 4x2 Matrix of the value 5 + +# ╔═║ 59cd4167-d100-4dfc-ac7c-02e1887af0c8 +let + # beware of filling with mutable values! + x = fill([1,2,3], 3) # this just creates one vector that is aliased + x[1][2] = 10 + x +end + +# ╔═║ 071c630e-d45d-4820-b483-104d2ae78670 +let + # this would be a good way to avoid the issue from the previous cell + x = [[1,2,3] for _ in 1:3] + x[1][2] = 10 + x +end + +# ╔═║ 6d4e8e1f-9fa3-440d-bf83-c8b3e07fc71d +md""" +### The `rand` function +""" + +# ╔═║ a266a5d7-e8a3-4a90-a113-279b2f6eaba9 +md""" +Run these cells a few times and see how the results change. +""" + +# ╔═║ 8842dd3f-9b7f-4916-aaf7-067a4be8bb0c +rand(UInt8) # single random number of type UInt8 + +# ╔═║ 96e678e9-ff11-4cec-a115-15d4a334b7fe +rand(3) # random 3-vector of Float64 + +# ╔═║ c45ba9aa-13ab-4d03-a345-955659c6ff41 +rand(Int16, 2, 3, 4) # random 2x3x4 Array of Int16 + +# ╔═║ 7f303cbc-22e4-4b4f-be9c-2585f50dd166 +let + x = [:🐱, :🐢, :🐟, :🐹] + rand(x) # random selection from the collection x +end + +# ╔═║ ddf33d10-9b5e-456a-aea1-d0ce465487be +md""" +## Array Indexing +""" + +# ╔═║ 4df4f662-0ece-4f61-9f42-faa4999d29ab +let + v = [1, 3, 5, 7, 9] + v[3] # Julia is 1-indexed (by default)! +end + +# ╔═║ ccd607b8-c2a0-4c6b-9d78-4c264f555fb4 +let + M = [1 2 3 + 4 5 6 + 7 8 9] + M[6] # this is called "linear indexing" because we only include one index + # notice Julia uses a column-major ordering for multi-dimensional arrays +end + +# ╔═║ 0dbbe879-49a2-4ee7-9758-f3dffad3e075 +let + M = [1 2 3 + 4 5 6 + 7 8 9] + M[3, 2] # this is called "cartesion indexing" + # the first number is the row, and the second number is the column +end + +# ╔═║ cd75a2cd-a718-4d9a-98a4-2b6654680d7d +let + M = [1 2 3 + 4 5 6 + 7 8 9] + M[:, 2] # : in the first index means get the entire column +end + +# ╔═║ 32582dec-38a2-41b2-80f1-81eadaae41e1 +let + M = [1 2 3 + 4 5 6 + 7 8 9] + M[3, :] # : in the second index means get the entire row +end + +# ╔═║ 3f945734-aedc-466b-8b80-0bf841142b74 +let + v = [1, 4, 3, 164, 14, 631, 752, 43, 1, 3] + indices = [1, 5, 7] + v[indices] # you can get multiple values at once by passing a vector of indices +end + +# ╔═║ 61bcc9ca-1f68-45a2-9117-a1a3662354d8 +let + data = [1,2,3,4] + indicies = [true, false, false, true] + data[indicies] # you can also index with a vector of boolean values +end + +# ╔═║ d593a687-519d-4693-bda4-ad6ac8e26a45 +let + data = [14, 146, 234, 6416, 3, 164, 3252, 675, 3] + data[data .> 100] # this gives you a really compact way of filtering + # .> is an example of broadcasting which we will cover below +end + +# ╔═║ 1a3ef85c-116a-4a74-9c96-28e88829fb7d +md""" +## Basic Array Functions +""" + +# ╔═║ 7ca9e326-064f-4f2e-9eb3-746e347fc693 +length([1 2 + 3 4]) + +# ╔═║ 185c0731-3c06-4640-b19c-cdb1b3e0f3a5 +size([1 2 3 + 4 5 6]) + +# ╔═║ 060f65c7-40ac-4ad5-8a86-21d1931b7a2a +vec([1 2 + 3 4]) # notice that Julia uses column-major order + +# ╔═║ 03f4a36c-669e-47e8-96f1-b58b1df8afb0 +reshape([1, 2, 3, 4], 2, 2) # notice that Julia uses column-major order + +# ╔═║ f0351fc7-d3ce-4036-9be6-14e0458418c6 +reshape(1:12, 2, 3, 2) + +# ╔═║ 5947547b-96f7-4e3e-bf61-87aea647eab0 +vcat([1, 2, 3], [4, 5, 6]) # vcat mean "vertical concatenation" + # recall that vectors are treated as columns + +# ╔═║ 383d0c2c-42f0-484d-8292-b6f6abae50cf +[[1, 2, 3]; [4, 5, 6]] # [a ; b] is the same as vcat(a, b) + +# ╔═║ 632f9251-f2a8-4549-b0e0-bd965a0c513b +vcat([1 2 + 3 4], + [5 6 + 7 8]) + +# ╔═║ 48c2ddcf-5d02-499d-ba69-e1cc38391443 +hcat([1, 2, 3], [4, 5, 6]) # hcat mean "horizontal concatenation" + # recall that vectors are treated as columns + +# ╔═║ c3b13f6e-c245-49e6-b892-bc1b446d7a52 +[[1, 2, 3] [4, 5, 6]] # [a b] is the same as hcat(a, b) + +# ╔═║ 5c8effcd-a6fe-4ed7-b06a-68494f378136 +hcat([1 2 + 3 4], + [5 6 + 7 8]) + +# ╔═║ 3d054687-0739-4c73-b578-4b7baa8ba8c7 +# enumerate gives us index-value tuples which can be useful when iterating +# collect converts a generator into an Array +collect(enumerate(['a', 'b', 'c'])) + +# ╔═║ d70faeb4-e75d-4598-b1fd-986dacadf190 +let + v = Int[] + push!(v, 1) # the ! is a Julia convention to indicate + # that the function mutates its arguments + append!(v, [2.0, false, 'a']) # notice how all the types are converted + # to match the type of the Vector +end + +# ╔═║ 42e14b85-28cc-429e-8267-25107cca6101 +md""" +## Other Data Structures +Dictionaries, Sets, and other common data structures exist in Julia just like other programming languages. See the docs for more: [https://docs.julialang.org/en/v1/base/collections/](https://docs.julialang.org/en/v1/base/collections/) +""" + +# ╔═║ 41ab85eb-67c2-440c-8f1a-8e365981418f +md""" +# Operators +""" + +# ╔═║ 3cd02837-36d6-496d-a08a-e83c65135530 +md""" +For the most part, the characters used for operators in Julia are what you would expect from math. +""" + +# ╔═║ 9d3f74e2-18f2-4c86-bd48-12ca01972539 +md""" +## Basic Operators +""" + +# ╔═║ 87d9312a-5ece-4ea4-8d98-bac120273155 +3 ^ 2 # exponentiation + +# ╔═║ 3ac2a971-7029-4de1-955e-16bb0dd9a9aa +8 / 3 # true division + +# ╔═║ 406dd220-54a6-4aa2-95ec-a7d533252a5a +8 Γ· 3 # floor division (\div ) + +# ╔═║ 966ebaa7-da63-41f9-bfde-951dd6ab9c8c +8 // 3 # Rational literal + +# ╔═║ 830f0714-171e-4115-9f83-953560cf9a2e +begin + 3 >= 2 + 3 β‰₯ 2 # \geq +end + +# ╔═║ deee9c05-2e58-4a94-bbe5-3244c272dfaa +begin + 3 <= 2 + 3 ≀ 2 # \leq +end + +# ╔═║ b3bf3e26-f80f-482d-b93f-b37f61a63cb3 +begin + 3 != 2 + 3 β‰  2 # \ne +end + +# ╔═║ cdfef9ad-ef97-4130-8ba0-bae7d76127bf +5 < 7 ? "yes" : "no" # ternary operator + +# ╔═║ 8dc47309-5355-41bc-aa9f-b92af247a4ed +md""" +## Linear Algebra Operators +""" + +# ╔═║ 7ead5eb1-391a-4422-b75a-3908e1c30321 +[1 2 + 3 4]' # transpose + +# ╔═║ 64d33d2e-8079-458f-926a-d9db16ae72c4 +let + A = [1 2; 3 4] + b = [1, 1] + x = A \ b # linear solve (solution to Ax = b) +end + +# ╔═║ 4257aac6-ba4a-4df7-9a93-1c091ab55b70 +[1, 2, 3] β‹… [1, 4, 9] # dot product (\cdot ) + +# ╔═║ 897bfd00-bc16-4c6f-8d10-eaa17a74e9fc +md""" +## Set Theory Operators +""" + +# ╔═║ c8a252b5-c7a0-4403-9636-e8459c1251be +4 in 1:2:7 + +# ╔═║ 76ea45e0-f8ca-495f-bdbb-8ace33a76cbf +4 ∈ 1:2:7 # \in + +# ╔═║ b137aa6f-a683-4d73-8c56-2f052e7cc534 +4 βˆ‰ 1:2:7 # \notin + +# ╔═║ e3368777-ecca-4273-9501-836789ccdb3f +(1, 3, 4) βŠ† (3, 4, 5) # \subseteq + +# ╔═║ 33756b2a-24f7-49cb-8616-c2fa6c716f52 +(1, 3, 4) ⊊ (3, 4, 5) # \subsetneq + +# ╔═║ 111e1e15-c462-4c33-89b6-3d55597ee092 +(1, 3, 4) ⊈ (3, 4, 5) # \nsubseteq + +# ╔═║ 9a0971e9-3625-4a87-b5cb-23ebfaafb042 +(1, 3, 4) ∩ (3, 4, 5) # \cap + +# ╔═║ 88e9f3b1-adda-4a0f-bc16-4d144bbd28c3 +(1, 3, 4) βˆͺ (3, 4, 5) # \cup + +# ╔═║ 19672d03-80ff-4997-8f08-b0dc8405cf24 +md""" +# Functions +""" + +# ╔═║ 4f66a82d-b9bd-469f-b327-56c40c8baa17 +md""" +## Function Definitions +There are a few different ways to define a function in Julia. +""" + +# ╔═║ bf6fba34-2a52-47e1-820a-d17339f17379 +let + function f(a::Int) + return a + 1 + end + f(10) +end + +# ╔═║ e0146124-eac2-45c6-99e8-90f6cf82e294 +let + function f(a) # by excluding the type we are able to use generic programming + a + 1 # the evaluation of the last line is implicitly returned, + # so the return keyword is optional in this case + end + (f(10), f(1 + 3im), f(3.7)) +end + +# ╔═║ e8d60909-6dd6-4841-b4c3-9dfa5c18f41e +let + f(a) = a + 1 # This is a short-hand syntax that looks more like math + (f(10), f(1 + 3im), f(3.7)) +end + +# ╔═║ b8827029-2561-4883-ae95-05ea9f3d2b1b +let + f = a -> a + 1 # and this is a lambda function + (f(10), f(1 + 3im), f(3.7)) +end + +# ╔═║ ee85e0bf-f985-41b0-be55-92d6faa4eede +md""" +## Function Arguments +""" + +# ╔═║ b8c22481-c851-4abb-986b-6766d7e71b88 +let + # arguments before the ; are positional, after are keyword + # there can be defaults in both categories + # anything without a default must be assigned when the function is called + # ... before the ; accepts any number of positional arguments + # ... after the ; accepts any keyword arguments + # the names args and kwargs are conventional for these extra arguments + function f(a, b=0, args...; c, d=1, kwargs...) + println(a) + println(b) + println(args) + println(c) + println(d) + println(kwargs) + end + f('a', 2, 3, 4; c=3, e=7) + println() + f(1; c=7) + # f(0) # this would be an error because c is not assigned +end + +# ╔═║ c1c8dd57-0b8e-4d76-ae1e-f7f93452aeb0 +let + f(a, b, c) = a + b + c + x = (1, 2, 3) + f(x...) # this is the splat operator +end + +# ╔═║ 73e5f533-fe6c-41c5-ae1a-0d49296ec5ac +let + x = [rand(3) for i = 1:3] + # this is one use of the splat operator, converting vector of vectors to a matrix + hcat(x...) + # this is equivalent to hcat(x[1], x[2], x[3]) but it is more concise + # and more general because we don't need to know the length of x +end + +# ╔═║ 3a0151a0-c837-44ea-8d2a-529756550989 +let + f(; a, b, c) = a + b + c + x = (a=1, b=2, c=3) + f(; x...) # works for kwargs too +end + +# ╔═║ f4244d75-9d09-4a38-aa97-53062b0fe388 +md""" +## Mutating functions +""" + +# ╔═║ 83070622-c71b-4757-8349-e7364ec5cb55 +md""" +You will often come across functions with a `!` at the end of their name. +This is a style convention which indicates that at least one of the function's arguments is modified in-place. +""" + +# ╔═║ 33d8d8d2-4343-4ae2-8174-ac245a5d3de9 +let + a = [3, 2, 1] + b = sort(a) + a, b +end + +# ╔═║ 27049ede-8943-4e3c-9538-c9b67dd3da05 +let + a = [3, 2, 1] + sort!(a) + a +end + +# ╔═║ 171d4a16-ea05-42ff-ba10-081500ef4b2f +md""" +## Higher-Order Functions +""" + +# ╔═║ 67ef0b42-e3fd-4777-a49e-090a6a874ffe +let + function f(a) # f is called a higher-order function because it returns a function + g(b) = a + b + end + f(3)(4) +end + +# ╔═║ fea409ec-e042-4723-8cd5-48cc6ac94a1b +let + f(a) = b -> a + b # more concise syntax for the same thing as above + f(3)(4) +end + +# ╔═║ 9a835c95-685e-4155-836c-d4c1273a06c3 +# filter is a higher-order function because it takes a function as a parameter +filter(x -> x % 3 == 1, [1, 5, 43, 2, 51, 2, 19]) + +# ╔═║ b031b745-aabc-46e7-a15f-bb50a5977779 +map(sqrt, [1, 16, 4, 25]) + +# ╔═║ 075c5a43-0af8-441b-b831-7faba2f48f0c +# you can also use do ... end syntax to define the first argument to the function +map(1:10, 11:20) do x, y + x + y +end +# the following are also equivalent to this syntax +# map((x, y) -> x + y, 1:10, 11:20) +# map(+, 1:10, 11:20) + +# ╔═║ 1ac98406-dc58-4594-a462-93525a6cf2d0 +reduce(*, [3, 4, 5, 6]) +# see maximum, minimum, sum, prod, any, all + +# ╔═║ 56c58e54-2276-44fc-89b0-5f86e1c4fd15 +mapreduce(abs2, +, [1, 2, 3]) + +# ╔═║ a2643fe2-b2cb-41ef-8557-d2a901239708 +let + f(x) = x * x + g(x) = x + 2 + h = f ∘ g # function composition: h(x) = f(g(x)) (\circ ) + h(3) +end + +# ╔═║ 69ac8b2f-7c43-4f33-9b32-6033457467df +(sqrt ∘ +)(9, 16) + +# ╔═║ 897679bf-ef08-4c7d-8078-2de9adfedcf9 +# |> is the pipe operator which is used for function chaining +"PooRly formattED TEXT " |> strip |> lowercase + +# ╔═║ f0a08ec8-3c3a-4fc2-9efe-6eb5c55b96e8 +md""" +## Broadcasting +""" + +# ╔═║ 61e4b1a1-2d2a-42fb-91cd-c245d6c54399 +# f.(collection) means apply f to each element of collection +sqrt.(1:9) + +# ╔═║ bf292bf8-5a3e-4913-a1b2-dfe55f46e438 +[1, 5, 3] .* [7, 2, 1] # works for functions of multiple variables as well + # in this case multiplication + +# ╔═║ fadb3713-3ab3-44d7-a8e6-e0b146a86c75 +[1, 2, 3] .+ zeros(Int, 3, 2, 2) # for arrays of different sizes, + # the leading dimensions must match + +# ╔═║ c1072ede-5c7a-4c1f-82f6-ac81fcf037d3 +let + # Broadcasting can also be used for assignment + A = collect(1:10) + A[3:5] .= 100 + A +end + +# ╔═║ e21a076f-3dcd-466e-be82-d00646f2457f +md""" +# Structs and types +""" + +# ╔═║ 98a825e8-b0a6-483f-b980-1b9600a42c9a +md""" +## Types +""" + +# ╔═║ 0202b549-7960-4e4d-b76a-71b3b4256473 +md""" +Julia's type system does not have classes and inheritance like in Python or Java. +Instead, it is built as hierarchy of abstract types, which can be thought of as interfaces, and concrete types (or structs), which actually store data. +""" + +# ╔═║ 669a2b4f-0faa-4c67-8def-ee762b521eb3 +AbstractTrees.children(x::Type) = subtypes(x) + +# ╔═║ 025a2137-8fee-435b-a295-853ce8b29b77 +print_tree(Number) + +# ╔═║ d7a5d1b5-e67f-4b4b-b299-987a031fd9a4 +md""" +In the cell above, only the rightmost types (at the bottom of the hierarchy) are concrete, which means you can instantiate them. +The other levels are mainly used for dispatch purposes. +More on this in HW1. +""" + +# ╔═║ 26c08688-8966-42d6-84b9-a96d17e9f41b +isconcretetype(Number) + +# ╔═║ 1582f8d6-95e7-4b07-a7a5-927dda90ee43 +isconcretetype(Float64) + +# ╔═║ ba8e4203-f889-4036-b042-35c4c160f75a +md""" +## Structs +""" + +# ╔═║ e3d1b330-b678-45e9-b0c4-ab1d2bd842e6 +md""" +We now show how to define a concrete type. +""" + +# ╔═║ 370d3ce1-467b-4caa-a10b-d13218dfb1fe +# basic struct definition +struct Point1 + x + y +end + +# ╔═║ 60ced228-90d5-460c-95c0-8ddea2e9e9fc +# this is how we create an instance +p1 = Point1(0, 5) + +# ╔═║ 6c80fe2d-c465-45aa-b3fe-94fe904b0903 +# access fields with the . syntax +p1.x + +# ╔═║ df9f3334-2227-47e6-a7cb-fdc1b9a5ce21 +# we can restrict the types of fields like this +struct Point2 + x::Float64 + y::Number +end + +# ╔═║ 457b7225-c4ad-4d76-92a1-ff2b0b2ea372 +# by default, fields are immutable (which can make our code faster!) +p1.x = 2 + +# ╔═║ e5804ae5-cf1f-47b3-9fe2-532fb0f9665a +# if you want your entire struct to be mutable use the mutable keyword +begin + mutable struct Point3 + x + y + end + p3 = Point3(7, 3) + p3.x = 2 + p3 +end + +# ╔═║ fdcec36b-4cdc-4994-8703-00ff708f6070 +# new in 1.8: we can now mark individual fields as constant +# this is good for readability, encapsulation, and compiler optimizations +mutable struct Record1 + const id::Int + name::String +end + +# ╔═║ 645eed27-1cb8-4b7f-8590-539f543e63a1 +md""" +## Constructors +There are two types of Constructors in Julia: inner constructors and outer constructors. +""" + +# ╔═║ b55497bd-bd4e-4d31-b4f6-8c2832aeb35e +# Inner Constructors are special methods that restrict the ways that a struct can be created +# these are especially useful if you want to enforce some sort of invariant +begin + struct Point4 + x + y + d + Point4(x,y) = new(x, y, sqrt(x*x + y*y)) + end + + mutable struct Record2 + const id::UInt64 + name::String + function Record2(name::String) + name == "" ? error("empty name is not allowed") : new(rand(UInt64), name) + end + end +end + +# ╔═║ d2032057-1269-4b32-b489-8c90608e8dd5 +Point4(3, 4) + +# ╔═║ f861c4fa-5453-44d2-af30-b9376a95cf2b +Point4(3, 4, 5) + +# ╔═║ c04c353d-8db8-4e1d-a409-df10e46a5c21 +Record2("Hello World") + +# ╔═║ e83e153f-8269-4020-a8b4-afc4c5cd6828 +Record2("") + +# ╔═║ edf980c3-a838-4c3f-9321-2c5142bce2e2 +# Outer Constructors are just the same as any other method +# they are basically used as a convenient way to initialize a struct +begin + struct Point5 + x + y + end + Point5(pair::Tuple) = Point5(pair...) + coordinates = (10, 100) + Point5(coordinates) +end + +# ╔═║ 501d14cd-3747-4997-99cb-6bbca56b31b5 +md""" +# Miscellaneous +""" + +# ╔═║ a9244d09-d458-44c9-9c9f-a271e7951b35 +md""" +## Macros +""" + +# ╔═║ fd8a9c43-9ab5-4b80-931c-9b772656c186 +md""" +In Julia, macros are special language constructs that transform the source code itself. +You don't need to understand them, just learn to recognize them: they always begin with a `@` character. +Here are some useful examples: +""" + +# ╔═║ 8b706854-ebe6-49e9-bf6c-7eb08318125e +@info "Hello" + +# ╔═║ 08fcfccd-f2ec-49ef-8df6-c9b9bc07bd59 +@warn "Goodbye" + +# ╔═║ 4b17015d-d56b-43d9-a86a-82c25a7bb4f5 +let + x = 1 + y = 2 + @error "Noooooo" x y +end + +# ╔═║ b4cc0368-cf8a-4502-a658-f4d229d89029 +@time rand(10, 10) * rand(10, 10) + +# ╔═║ 4ec25214-8ebc-4d87-93fe-a84e8ea6e1c7 +@elapsed rand(10, 10) * rand(10, 10) + +# ╔═║ f71b573d-9486-475d-8763-e3a517265c62 +@assert 1 + 1 == 3 + +# ╔═║ ec7bec64-3d25-421f-878e-60b381bdaee0 +md""" +## Plots +""" + +# ╔═║ 351813ef-6075-4d38-be38-e53a5651209f +md""" +The standard plotting library in Julia is called Plots.jl, and its syntax is quite similar to Python's Matplotlib. +""" + +# ╔═║ 4a96d787-de19-4beb-aeb5-ba92bc54502f +plot(1:10, exp, xlabel="x", ylabel="exp(x)", title="this grows fast", legend=false) + +# ╔═║ c6ef3656-e026-42ed-82e0-a85499bdfe02 +md""" +It is very easy to build plots incrementally by using the in-place syntax, which implicitly modify the current plot. +""" + +# ╔═║ d062c5e3-7261-4ff4-b16d-764744be9924 +begin + plot(title="example plot", legend=:bottomright) + plot!(1:10, rand(10), color="blue", label="line1") + plot!(1:10, rand(10), color="green", label="line2") + scatter!(1:10, rand(10), color="red", label="dots") +end + +# ╔═║ 7504555a-f56e-46eb-85e3-134b4a14f35a +md""" +When you make plots in homework assignments or for any other projects, it is best practice to always include a title, axis labels, and an appropriate legend. +""" + +# ╔═║ 850492bd-baf6-49db-aae4-23bfdb544528 +md""" +There are a lot of different options available to get your plot looking just how you want it. Here is some documentation that you can check out for more: +- [https://docs.juliaplots.org/stable/](https://docs.juliaplots.org/stable/) +- [https://github.com/sswatson/cheatsheets/blob/master/plotsjl-cheatsheet.pdf](https://github.com/sswatson/cheatsheets/blob/master/plotsjl-cheatsheet.pdf) +""" + +# ╔═║ abbf92ab-6261-4cbf-bbfd-8d5257b2b268 +md""" +# More Resources + +**Cheatsheets** +- [https://juliadocs.github.io/Julia-Cheat-Sheet](https://juliadocs.github.io/Julia-Cheat-Sheet) +- [https://cheatsheets.quantecon.org](https://cheatsheets.quantecon.org) + +**Documentation** +- [Julia Documentation](https://docs.julialang.org/en/v1/) +- in the REPL, press `?` to enter help mode then type any symbol to see documentation +- in Pluto, put your cursor on a symbol and open the 'live docs' menu in the bottom right to see documentation +- in VSCode hover your mouse over a symbol to see documentation + +**Forums** +- [Julia Discourse](https://discourse.julialang.org) +""" + +# ╔═║ 00000000-0000-0000-0000-000000000001 +PLUTO_PROJECT_TOML_CONTENTS = """ +[deps] +AbstractTrees = "1520ce14-60c1-5f80-bbc7-55ef81b5835c" +LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" +Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" +PlutoUI = "7f904dfe-b85e-4ff6-b463-dae2292396a8" + +[compat] +AbstractTrees = "~0.4.4" +Plots = "~1.39.0" +PlutoUI = "~0.7.52" +""" + +# ╔═║ 00000000-0000-0000-0000-000000000002 +PLUTO_MANIFEST_TOML_CONTENTS = """ +# This file is machine-generated - editing it directly is not advised + +julia_version = "1.9.3" +manifest_format = "2.0" +project_hash = "36a3312ff29e140a55fb5d7d8b1d02959153f0b9" + +[[deps.AbstractPlutoDingetjes]] +deps = ["Pkg"] +git-tree-sha1 = "91bd53c39b9cbfb5ef4b015e8b582d344532bd0a" +uuid = "6e696c72-6542-2067-7265-42206c756150" +version = "1.2.0" + +[[deps.AbstractTrees]] +git-tree-sha1 = "faa260e4cb5aba097a73fab382dd4b5819d8ec8c" +uuid = "1520ce14-60c1-5f80-bbc7-55ef81b5835c" +version = "0.4.4" + +[[deps.ArgTools]] +uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" +version = "1.1.1" + +[[deps.Artifacts]] +uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" + +[[deps.Base64]] +uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" + +[[deps.BitFlags]] +git-tree-sha1 = "43b1a4a8f797c1cddadf60499a8a077d4af2cd2d" +uuid = "d1d4a3ce-64b1-5f1a-9ba4-7e7e69966f35" +version = "0.1.7" + +[[deps.Bzip2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "19a35467a82e236ff51bc17a3a44b69ef35185a2" +uuid = "6e34b625-4abd-537c-b88f-471c36dfa7a0" +version = "1.0.8+0" + +[[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.CodecZlib]] +deps = ["TranscodingStreams", "Zlib_jll"] +git-tree-sha1 = "02aa26a4cf76381be7f66e020a3eddeb27b0a092" +uuid = "944b1d66-785c-5afd-91f1-9de20f533193" +version = "0.7.2" + +[[deps.ColorSchemes]] +deps = ["ColorTypes", "ColorVectorSpace", "Colors", "FixedPointNumbers", "PrecompileTools", "Random"] +git-tree-sha1 = "d9a8f86737b665e15a9641ecbac64deef9ce6724" +uuid = "35d6a980-a343-548e-a6ea-1d62b119f2f4" +version = "3.23.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" + + [deps.ColorVectorSpace.extensions] + SpecialFunctionsExt = "SpecialFunctions" + + [deps.ColorVectorSpace.weakdeps] + SpecialFunctions = "276daf66-3868-5448-9aa4-cd146d93841b" + +[[deps.Colors]] +deps = ["ColorTypes", "FixedPointNumbers", "Reexport"] +git-tree-sha1 = "fc08e5930ee9a4e03f84bfb5211cb54e7769758a" +uuid = "5ae59095-9a9b-59fe-a467-6f913c188581" +version = "0.12.10" + +[[deps.Compat]] +deps = ["UUIDs"] +git-tree-sha1 = "e460f044ca8b99be31d35fe54fc33a5c33dd8ed7" +uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" +version = "4.9.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+0" + +[[deps.ConcurrentUtilities]] +deps = ["Serialization", "Sockets"] +git-tree-sha1 = "5372dbbf8f0bdb8c700db5367132925c0771ef7e" +uuid = "f0e56b4a-5159-44fe-b623-3e5288b988bb" +version = "2.2.1" + +[[deps.Contour]] +git-tree-sha1 = "d05d9e7b7aedff4e5b51a029dced05cfb6125781" +uuid = "d38c429a-6771-53c6-b99e-75d170b6e991" +version = "0.6.2" + +[[deps.DataAPI]] +git-tree-sha1 = "8da84edb865b0b5b0100c0666a9bc9a0b71c553c" +uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a" +version = "1.15.0" + +[[deps.DataStructures]] +deps = ["Compat", "InteractiveUtils", "OrderedCollections"] +git-tree-sha1 = "3dbd312d370723b6bb43ba9d02fc36abade4518d" +uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" +version = "0.18.15" + +[[deps.Dates]] +deps = ["Printf"] +uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" + +[[deps.DelimitedFiles]] +deps = ["Mmap"] +git-tree-sha1 = "9e2f36d3c96a820c678f2f1f1782582fcf685bae" +uuid = "8bb1440f-4735-579b-a4ab-409b98df4dab" +version = "1.9.1" + +[[deps.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.ExceptionUnwrapping]] +deps = ["Test"] +git-tree-sha1 = "e90caa41f5a86296e014e148ee061bd6c3edec96" +uuid = "460bff9d-24e4-43bc-9d9f-a8973cb893f4" +version = "0.1.9" + +[[deps.Expat_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "4558ab818dcceaab612d1bb8c19cee87eda2b83c" +uuid = "2e619515-83b5-522b-bb60-26c02a35a201" +version = "2.5.0+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", "Pkg", "Zlib_jll", "libaom_jll", "libass_jll", "libfdk_aac_jll", "libvorbis_jll", "x264_jll", "x265_jll"] +git-tree-sha1 = "74faea50c1d007c85837327f6775bea60b5492dd" +uuid = "b22a6f82-2f65-5046-a5b2-351ab43fb4e5" +version = "4.4.2+2" + +[[deps.FileWatching]] +uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" + +[[deps.FixedPointNumbers]] +deps = ["Statistics"] +git-tree-sha1 = "335bfdceacc84c5cdf16aadc768aa5ddfc5383cc" +uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" +version = "0.8.4" + +[[deps.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.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.GLFW_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libglvnd_jll", "Pkg", "Xorg_libXcursor_jll", "Xorg_libXi_jll", "Xorg_libXinerama_jll", "Xorg_libXrandr_jll"] +git-tree-sha1 = "d972031d28c8c8d9d7b41a536ad7bb0c2579caca" +uuid = "0656b61e-2033-5cc2-a64a-77c0f6c09b89" +version = "3.3.8+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 = "d73afa4a2bb9de56077242d98cf763074ab9a970" +uuid = "28b8d3ca-fb5f-59d9-8090-bfdbd6d07a71" +version = "0.72.9" + +[[deps.GR_jll]] +deps = ["Artifacts", "Bzip2_jll", "Cairo_jll", "FFMPEG_jll", "Fontconfig_jll", "FreeType2_jll", "GLFW_jll", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Libtiff_jll", "Pixman_jll", "Qt6Base_jll", "Zlib_jll", "libpng_jll"] +git-tree-sha1 = "1596bab77f4f073a14c62424283e7ebff3072eca" +uuid = "d2c73de3-f751-5644-a686-071e5b155ba9" +version = "0.72.9+1" + +[[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", "Pkg", "Zlib_jll"] +git-tree-sha1 = "d3b3624125c1474292d0d8ed0f65554ac37ddb23" +uuid = "7746bdde-850d-59dc-9ae8-88ece973131d" +version = "2.74.0+2" + +[[deps.Graphite2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "344bf40dcab1073aca04aa0df4fb092f920e4011" +uuid = "3b182d85-2403-5c21-9c21-1e1f0cc25472" +version = "1.3.14+0" + +[[deps.Grisu]] +git-tree-sha1 = "53bb909d1151e57e2484c3d1b53e19552b887fb2" +uuid = "42e2da0e-8278-4e71-bc24-59509adca0fe" +version = "1.0.2" + +[[deps.HTTP]] +deps = ["Base64", "CodecZlib", "ConcurrentUtilities", "Dates", "ExceptionUnwrapping", "Logging", "LoggingExtras", "MbedTLS", "NetworkOptions", "OpenSSL", "Random", "SimpleBufferStream", "Sockets", "URIs", "UUIDs"] +git-tree-sha1 = "cb56ccdd481c0dd7f975ad2b3b62d9eda088f7e2" +uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3" +version = "1.9.14" + +[[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.Hyperscript]] +deps = ["Test"] +git-tree-sha1 = "8d511d5b81240fc8e6802386302675bdf47737b9" +uuid = "47d2ed2b-36de-50cf-bf87-49c2cf4b8b91" +version = "0.0.4" + +[[deps.HypertextLiteral]] +deps = ["Tricks"] +git-tree-sha1 = "c47c5fa4c5308f27ccaac35504858d8914e102f9" +uuid = "ac1192a8-f4b3-4bfe-ba22-af5b92cd3ab2" +version = "0.9.4" + +[[deps.IOCapture]] +deps = ["Logging", "Random"] +git-tree-sha1 = "d75853a0bdbfb1ac815478bacd89cd27b550ace6" +uuid = "b5f81e59-6552-4d32-b1f0-c071b021bf89" +version = "0.2.3" + +[[deps.InteractiveUtils]] +deps = ["Markdown"] +uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" + +[[deps.IrrationalConstants]] +git-tree-sha1 = "630b497eafcc20001bba38a4651b327dcfc491d2" +uuid = "92d709cd-6900-40b7-9082-c6be49f344b6" +version = "0.2.2" + +[[deps.JLFzf]] +deps = ["Pipe", "REPL", "Random", "fzf_jll"] +git-tree-sha1 = "f377670cda23b6b7c1c0b3893e37451c5c1a2185" +uuid = "1019f520-868f-41f5-a6de-eb00f4b6a39c" +version = "0.1.5" + +[[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 = "6f2675ef130a300a112286de91973805fcc5ffbc" +uuid = "aacddb02-875f-59d6-b918-886e6ef4fbf8" +version = "2.1.91+0" + +[[deps.LAME_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "f6250b16881adf048549549fba48b1161acdac8c" +uuid = "c1c5ebd0-6772-5130-a774-d5fcae4a789d" +version = "3.100.1+0" + +[[deps.LERC_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "bf36f528eec6634efc60d7ec062008f171071434" +uuid = "88015f11-f218-50d7-93a8-a6af411a945d" +version = "3.0.0+1" + +[[deps.LLVMOpenMP_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "f689897ccbe049adb19a065c495e75f372ecd42b" +uuid = "1d63c593-3942-5779-bab2-d838dc0a180e" +version = "15.0.4+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 = "f2355693d6778a178ade15952b7ac47a4ff97996" +uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" +version = "1.3.0" + +[[deps.Latexify]] +deps = ["Formatting", "InteractiveUtils", "LaTeXStrings", "MacroTools", "Markdown", "OrderedCollections", "Printf", "Requires"] +git-tree-sha1 = "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.LibCURL]] +deps = ["LibCURL_jll", "MozillaCACerts_jll"] +uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" +version = "0.6.3" + +[[deps.LibCURL_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] +uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" +version = "7.84.0+0" + +[[deps.LibGit2]] +deps = ["Base64", "NetworkOptions", "Printf", "SHA"] +uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" + +[[deps.LibSSH2_jll]] +deps = ["Artifacts", "Libdl", "MbedTLS_jll"] +uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" +version = "1.10.2+0" + +[[deps.Libdl]] +uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" + +[[deps.Libffi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "0b4a5d71f3e5200a7dff793393e09dfc2d874290" +uuid = "e9f186c6-92d2-5b65-8a66-fee21dc1b490" +version = "3.2.2+1" + +[[deps.Libgcrypt_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgpg_error_jll", "Pkg"] +git-tree-sha1 = "64613c82a59c120435c067c2b809fc61cf5166ae" +uuid = "d4300ac3-e22c-5743-9152-c294e39db1e4" +version = "1.8.7+0" + +[[deps.Libglvnd_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll", "Xorg_libXext_jll"] +git-tree-sha1 = "6f73d1dd803986947b2c750138528a999a6c7733" +uuid = "7e76a0d4-f3c7-5321-8279-8d96eeed0f29" +version = "1.6.0+0" + +[[deps.Libgpg_error_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "c333716e46366857753e273ce6a69ee0945a6db9" +uuid = "7add5ba3-2f88-524e-9cd5-f83b8a55f7b8" +version = "1.42.0+0" + +[[deps.Libiconv_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "f9557a255370125b405568f9767d6d195822a175" +uuid = "94ce4f54-9a6c-5748-9c1c-f9c7231a4531" +version = "1.17.0+0" + +[[deps.Libmount_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "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.LinearAlgebra]] +deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"] +uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + +[[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 = "0d097476b6c381ab7906460ef1ef1638fbce1d91" +uuid = "e6f89c97-d47a-5376-807f-9c37f3926c36" +version = "1.0.2" + +[[deps.MIMEs]] +git-tree-sha1 = "65f28ad4b594aebe22157d6fac869786a255b7eb" +uuid = "6c6e2e6c-3030-632d-7369-2d6c69616d65" +version = "0.1.4" + +[[deps.MacroTools]] +deps = ["Markdown", "Random"] +git-tree-sha1 = "9ee1618cbf5240e6d4e0371d6f24065083f60c48" +uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" +version = "0.5.11" + +[[deps.Markdown]] +deps = ["Base64"] +uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" + +[[deps.MbedTLS]] +deps = ["Dates", "MbedTLS_jll", "MozillaCACerts_jll", "Random", "Sockets"] +git-tree-sha1 = "03a9b9718f5682ecb107ac9f7308991db4ce395b" +uuid = "739be429-bea8-5141-9913-cc70e7f3736d" +version = "1.1.7" + +[[deps.MbedTLS_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" +version = "2.28.2+0" + +[[deps.Measures]] +git-tree-sha1 = "c13304c81eec1ed3af7fc20e75fb6b26092a1102" +uuid = "442fdcdd-2543-5da2-b0f3-8c86c306513e" +version = "0.3.2" + +[[deps.Missings]] +deps = ["DataAPI"] +git-tree-sha1 = "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 = "2022.10.11" + +[[deps.NaNMath]] +deps = ["OpenLibm_jll"] +git-tree-sha1 = "0877504529a3e5c3343c6f8b4c0381e57e4387e4" +uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" +version = "1.0.2" + +[[deps.NetworkOptions]] +uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" +version = "1.2.0" + +[[deps.Ogg_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "887579a3eb005446d514ab7aeac5d1d027658b8f" +uuid = "e7412a2a-1a6e-54c0-be00-318e2571c051" +version = "1.3.5+1" + +[[deps.OpenBLAS_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] +uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" +version = "0.3.21+4" + +[[deps.OpenLibm_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "05823500-19ac-5b8b-9628-191a04bc5112" +version = "0.8.1+0" + +[[deps.OpenSSL]] +deps = ["BitFlags", "Dates", "MozillaCACerts_jll", "OpenSSL_jll", "Sockets"] +git-tree-sha1 = "51901a49222b09e3743c65b8847687ae5fc78eb2" +uuid = "4d8831e6-92b7-49fb-bdf8-b643e874388c" +version = "1.4.1" + +[[deps.OpenSSL_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "bbb5c2115d63c2f1451cb70e5ef75e8fe4707019" +uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95" +version = "1.1.22+0" + +[[deps.Opus_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "51a08fb14ec28da2ec7a927c4337e4332c2a4720" +uuid = "91d4177d-7536-5919-b921-800302f37372" +version = "1.3.2+0" + +[[deps.OrderedCollections]] +git-tree-sha1 = "2e73fe17cac3c62ad1aebe70d44c963c3cfdc3e3" +uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" +version = "1.6.2" + +[[deps.PCRE2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "efcefdf7-47ab-520b-bdef-62a2eaa19f15" +version = "10.42.0+0" + +[[deps.Parsers]] +deps = ["Dates", "PrecompileTools", "UUIDs"] +git-tree-sha1 = "716e24b21538abc91f6205fd1d8363f39b442851" +uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" +version = "2.7.2" + +[[deps.Pipe]] +git-tree-sha1 = "6842804e7867b115ca9de748a0cf6b364523c16d" +uuid = "b98c9c47-44ae-5843-9183-064241ee97a0" +version = "1.3.0" + +[[deps.Pixman_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LLVMOpenMP_jll", "Libdl"] +git-tree-sha1 = "64779bc4c9784fee475689a1752ef4d5747c5e87" +uuid = "30392449-352a-5448-841d-b1acce4e97dc" +version = "0.42.2+0" + +[[deps.Pkg]] +deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] +uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" +version = "1.9.2" + +[[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 = "f92e1315dadf8c46561fb9396e525f7200cdc227" +uuid = "995b91a9-d308-5afd-9ec6-746e21dbc043" +version = "1.3.5" + +[[deps.Plots]] +deps = ["Base64", "Contour", "Dates", "Downloads", "FFMPEG", "FixedPointNumbers", "GR", "JLFzf", "JSON", "LaTeXStrings", "Latexify", "LinearAlgebra", "Measures", "NaNMath", "Pkg", "PlotThemes", "PlotUtils", "PrecompileTools", "Preferences", "Printf", "REPL", "Random", "RecipesBase", "RecipesPipeline", "Reexport", "RelocatableFolders", "Requires", "Scratch", "Showoff", "SparseArrays", "Statistics", "StatsBase", "UUIDs", "UnicodeFun", "UnitfulLatexify", "Unzip"] +git-tree-sha1 = "ccee59c6e48e6f2edf8a5b64dc817b6729f99eb5" +uuid = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" +version = "1.39.0" + + [deps.Plots.extensions] + FileIOExt = "FileIO" + GeometryBasicsExt = "GeometryBasics" + IJuliaExt = "IJulia" + ImageInTerminalExt = "ImageInTerminal" + UnitfulExt = "Unitful" + + [deps.Plots.weakdeps] + FileIO = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" + GeometryBasics = "5c1252a2-5f33-56bf-86c9-59e7332b4326" + IJulia = "7073ff75-c697-5162-941a-fcdaad2a7d2a" + ImageInTerminal = "d8c32880-2388-543b-8c61-d9f865259254" + Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" + +[[deps.PlutoUI]] +deps = ["AbstractPlutoDingetjes", "Base64", "ColorTypes", "Dates", "FixedPointNumbers", "Hyperscript", "HypertextLiteral", "IOCapture", "InteractiveUtils", "JSON", "Logging", "MIMEs", "Markdown", "Random", "Reexport", "URIs", "UUIDs"] +git-tree-sha1 = "e47cd150dbe0443c3a3651bc5b9cbd5576ab75b7" +uuid = "7f904dfe-b85e-4ff6-b463-dae2292396a8" +version = "0.7.52" + +[[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 = "7eb1686b4f04b82f96ed7a4ea5890a4f0c7a09f1" +uuid = "21216c6a-2e73-6563-6e65-726566657250" +version = "1.4.0" + +[[deps.Printf]] +deps = ["Unicode"] +uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" + +[[deps.Qt6Base_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Fontconfig_jll", "Glib_jll", "JLLWrappers", "Libdl", "Libglvnd_jll", "OpenSSL_jll", "Pkg", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Xorg_libxcb_jll", "Xorg_xcb_util_image_jll", "Xorg_xcb_util_keysyms_jll", "Xorg_xcb_util_renderutil_jll", "Xorg_xcb_util_wm_jll", "Zlib_jll", "xkbcommon_jll"] +git-tree-sha1 = "364898e8f13f7eaaceec55fd3d08680498c0aa6e" +uuid = "c0090381-4147-56d7-9ebc-da0b1113ec56" +version = "6.4.2+3" + +[[deps.REPL]] +deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] +uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" + +[[deps.Random]] +deps = ["SHA", "Serialization"] +uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" + +[[deps.RecipesBase]] +deps = ["PrecompileTools"] +git-tree-sha1 = "5c3d09cc4f31f5fc6af001c250bf1278733100ff" +uuid = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" +version = "1.3.4" + +[[deps.RecipesPipeline]] +deps = ["Dates", "NaNMath", "PlotUtils", "PrecompileTools", "RecipesBase"] +git-tree-sha1 = "45cf9fd0ca5839d06ef333c8201714e888486342" +uuid = "01d81517-befc-4cb6-b9ec-a95719d0359c" +version = "0.6.12" + +[[deps.Reexport]] +git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" +uuid = "189a3867-3050-52da-a836-e630ba90ab69" +version = "1.2.2" + +[[deps.RelocatableFolders]] +deps = ["SHA", "Scratch"] +git-tree-sha1 = "90bc7a7c96410424509e4263e277e43250c05691" +uuid = "05181044-ff0b-4ac5-8273-598c1e38db00" +version = "1.0.0" + +[[deps.Requires]] +deps = ["UUIDs"] +git-tree-sha1 = "838a3a4188e2ded87a4f9f184b4b0d78a1e91cb7" +uuid = "ae029012-a4dd-5104-9daa-d747884805df" +version = "1.3.0" + +[[deps.SHA]] +uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" +version = "0.7.0" + +[[deps.Scratch]] +deps = ["Dates"] +git-tree-sha1 = "30449ee12237627992a99d5e30ae63e4d78cd24a" +uuid = "6c6a2e73-6563-6170-7368-637461726353" +version = "1.2.0" + +[[deps.Serialization]] +uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" + +[[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.Sockets]] +uuid = "6462fe0b-24de-5631-8697-dd941f90decc" + +[[deps.SortingAlgorithms]] +deps = ["DataStructures"] +git-tree-sha1 = "c60ec5c62180f27efea3ba2908480f8055e17cee" +uuid = "a2af1166-a08f-5f64-846c-94a0d3cef48c" +version = "1.1.1" + +[[deps.SparseArrays]] +deps = ["Libdl", "LinearAlgebra", "Random", "Serialization", "SuiteSparse_jll"] +uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + +[[deps.Statistics]] +deps = ["LinearAlgebra", "SparseArrays"] +uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" +version = "1.9.0" + +[[deps.StatsAPI]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "45a7769a04a3cf80da1c1c7c60caf932e6f4c9f7" +uuid = "82ae8749-77ed-4fe6-ae5f-f523153014b0" +version = "1.6.0" + +[[deps.StatsBase]] +deps = ["DataAPI", "DataStructures", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"] +git-tree-sha1 = "75ebe04c5bed70b91614d684259b661c9e6274a4" +uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" +version = "0.34.0" + +[[deps.SuiteSparse_jll]] +deps = ["Artifacts", "Libdl", "Pkg", "libblastrampoline_jll"] +uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c" +version = "5.10.1+6" + +[[deps.TOML]] +deps = ["Dates"] +uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" +version = "1.0.3" + +[[deps.Tar]] +deps = ["ArgTools", "SHA"] +uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" +version = "1.10.0" + +[[deps.TensorCore]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "1feb45f88d133a655e001435632f019a9a1bcdb6" +uuid = "62fd8b95-f654-4bbd-a8a5-9c27f68ccd50" +version = "0.1.1" + +[[deps.Test]] +deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] +uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[[deps.TranscodingStreams]] +deps = ["Random", "Test"] +git-tree-sha1 = "9a6ae7ed916312b41236fcef7e0af564ef934769" +uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa" +version = "0.9.13" + +[[deps.Tricks]] +git-tree-sha1 = "aadb748be58b492045b4f56166b5188aa63ce549" +uuid = "410a4b4d-49e4-4fbc-ab6d-cb71b17b3775" +version = "0.1.7" + +[[deps.URIs]] +git-tree-sha1 = "b7a5e99f24892b6824a954199a45e9ffcc1c70f0" +uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" +version = "1.5.0" + +[[deps.UUIDs]] +deps = ["Random", "SHA"] +uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" + +[[deps.Unicode]] +uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" + +[[deps.UnicodeFun]] +deps = ["REPL"] +git-tree-sha1 = "53915e50200959667e78a92a418594b428dffddf" +uuid = "1cfade01-22cf-5700-b092-accc4b62d6e1" +version = "0.4.1" + +[[deps.Unitful]] +deps = ["Dates", "LinearAlgebra", "Random"] +git-tree-sha1 = "a72d22c7e13fe2de562feda8645aa134712a87ee" +uuid = "1986cc42-f94f-5a68-af5c-568840ba703d" +version = "1.17.0" + + [deps.Unitful.extensions] + ConstructionBaseUnitfulExt = "ConstructionBase" + InverseFunctionsUnitfulExt = "InverseFunctions" + + [deps.Unitful.weakdeps] + ConstructionBase = "187b0558-2788-49d3-abe0-74a17ed4e7c9" + InverseFunctions = "3587e190-3f89-42d0-90ee-14403ec27112" + +[[deps.UnitfulLatexify]] +deps = ["LaTeXStrings", "Latexify", "Unitful"] +git-tree-sha1 = "e2d817cc500e960fdbafcf988ac8436ba3208bfd" +uuid = "45397f5d-5981-4c77-b2b3-fc36d6e9b728" +version = "1.6.3" + +[[deps.Unzip]] +git-tree-sha1 = "ca0969166a028236229f63514992fc073799bb78" +uuid = "41fe7b60-77ed-43a1-b4f0-825fd5a5650d" +version = "0.2.0" + +[[deps.Wayland_jll]] +deps = ["Artifacts", "Expat_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Pkg", "XML2_jll"] +git-tree-sha1 = "ed8d92d9774b077c53e1da50fd81a36af3744c1c" +uuid = "a2964d1f-97da-50d4-b82a-358c7fce9d89" +version = "1.21.0+0" + +[[deps.Wayland_protocols_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "4528479aa01ee1b3b4cd0e6faef0e04cf16466da" +uuid = "2381bf8a-dfd0-557d-9999-79630e7b1b91" +version = "1.25.0+0" + +[[deps.XML2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Zlib_jll"] +git-tree-sha1 = "04a51d15436a572301b5abbb9d099713327e9fc4" +uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a" +version = "2.10.4+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 = "cf2c7de82431ca6f39250d2fc4aacd0daa1675c0" +uuid = "ffd25f8a-64ca-5728-b0f7-c24cf3aae800" +version = "5.4.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", "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_image_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] +git-tree-sha1 = "0fab0a40349ba1cba2c1da699243396ff8e94b97" +uuid = "12413925-8142-5f55-bb0e-6d7ca50bb09b" +version = "0.4.0+1" + +[[deps.Xorg_xcb_util_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libxcb_jll"] +git-tree-sha1 = "e7fd7b2881fa2eaa72717420894d3938177862d1" +uuid = "2def613f-5ad1-5310-b15b-b15d46f528f5" +version = "0.4.0+1" + +[[deps.Xorg_xcb_util_keysyms_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] +git-tree-sha1 = "d1151e2c45a544f32441a567d1690e701ec89b00" +uuid = "975044d2-76e6-5fbe-bf08-97ce7c6574c7" +version = "0.4.0+1" + +[[deps.Xorg_xcb_util_renderutil_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] +git-tree-sha1 = "dfd7a8f38d4613b6a575253b3174dd991ca6183e" +uuid = "0d47668e-0667-5a69-a72c-f761630bfb7e" +version = "0.3.9+1" + +[[deps.Xorg_xcb_util_wm_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] +git-tree-sha1 = "e78d10aab01a4a154142c5006ed44fd9e8e31b67" +uuid = "c22f9ab0-d5fe-5066-847c-f4bb1cd4e361" +version = "0.4.1+1" + +[[deps.Xorg_xkbcomp_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxkbfile_jll"] +git-tree-sha1 = "330f955bc41bb8f5270a369c473fc4a5a4e4d3cb" +uuid = "35661453-b289-5fab-8a00-3d9160c6a3a4" +version = "1.4.6+0" + +[[deps.Xorg_xkeyboard_config_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_xkbcomp_jll"] +git-tree-sha1 = "691634e5453ad362044e2ad653e79f3ee3bb98c3" +uuid = "33bec58e-1273-512f-9401-5d533626f822" +version = "2.39.0+0" + +[[deps.Xorg_xtrans_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "e92a1a012a10506618f10b7047e478403a046c77" +uuid = "c5fb5394-a638-5e4d-96e5-b29de1b5cf10" +version = "1.5.0+0" + +[[deps.Zlib_jll]] +deps = ["Libdl"] +uuid = "83775a58-1f1d-513f-b197-d71354ab007a" +version = "1.2.13+0" + +[[deps.Zstd_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "49ce682769cd5de6c72dcf1b94ed7790cd08974c" +uuid = "3161d3a3-bdf6-5164-811a-617609db77b4" +version = "1.5.5+0" + +[[deps.fzf_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "868e669ccb12ba16eaf50cb2957ee2ff61261c56" +uuid = "214eeab7-80f7-51ab-84ad-2988db7cef09" +version = "0.29.0+0" + +[[deps.libaom_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "3a2ea60308f0996d26f1e5354e10c24e9ef905d4" +uuid = "a4ae2306-e953-59d6-aa16-d00cac43593b" +version = "3.4.0+0" + +[[deps.libass_jll]] +deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] +git-tree-sha1 = "5982a94fcba20f02f42ace44b9894ee2b140fe47" +uuid = "0ac62f75-1d6f-5e53-bd7c-93b484bb37c0" +version = "0.15.1+0" + +[[deps.libblastrampoline_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" +version = "5.8.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.libpng_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] +git-tree-sha1 = "94d180a6d2b5e55e447e2d27a29ed04fe79eb30c" +uuid = "b53b4c65-9356-5827-b1ea-8c7a1a84506f" +version = "1.6.38+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.nghttp2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" +version = "1.48.0+0" + +[[deps.p7zip_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" +version = "17.4.0+0" + +[[deps.x264_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "4fea590b89e6ec504593146bf8b988b2c00922b2" +uuid = "1270edf5-f2f9-52d2-97e9-ab00b5d0237a" +version = "2021.5.5+0" + +[[deps.x265_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "ee567a171cce03570d77ad3a43e90218e38937a9" +uuid = "dfaa095f-4041-5dcd-9319-2fabd8486b76" +version = "3.5.0+0" + +[[deps.xkbcommon_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Wayland_jll", "Wayland_protocols_jll", "Xorg_libxcb_jll", "Xorg_xkeyboard_config_jll"] +git-tree-sha1 = "9ebfc140cc56e8c2156a15ceac2f0302e327ac0a" +uuid = "d8fb68d0-12a3-5cfd-a85a-d49703b185fd" +version = "1.4.1+0" +""" + +# ╔═║ Cell order: +# β•Ÿβ”€05b0eb5c-37ae-11ed-2a1e-e565ae78b5db +# ╠═5b0d8c7e-5b74-4bc5-9f3a-d84d44b68605 +# ╠═e1f9ae36-225e-42dd-8206-41c8a1a8e97c +# β•Ÿβ”€3ebc35e4-73be-48c1-9d3b-b99d89413810 +# β•Ÿβ”€ec2750c6-bcd6-40bd-b09c-4055852e186b +# β•Ÿβ”€f0bcdf1c-f77d-4ffe-b5b7-fd7ec2bbf815 +# β•Ÿβ”€9c801be7-2387-4665-8421-c1eee596a592 +# β•Ÿβ”€1b5740a7-d0c3-487f-8a6a-8b2a9861ddc7 +# β•Ÿβ”€a2998593-f16c-4dc0-abb6-0534dd3e710a +# ╠═08e99dfa-61c9-49b7-93db-3546a2850eef +# β•Ÿβ”€43fb2f38-3150-44e1-90fd-cdf68d4c8f89 +# ╠═026c9439-5ffa-459d-8353-63bffc80306f +# β•Ÿβ”€29098bf7-6a4f-4819-8b1b-d569b7bbfbc3 +# ╠═fb1f9e35-4538-44f9-8795-ab60805c3211 +# ╠═8028f4e6-4e16-4004-b1cd-80793920b12c +# β•Ÿβ”€0589e51d-e420-4e9a-ba6d-e08dd063fc0f +# ╠═8ed5706e-1b2c-4c83-8c6c-7e8190d31405 +# ╠═7166a14e-87bf-42ff-a88f-bde7a1d3c6ca +# ╠═f55948fa-ae0e-4d5d-b9ca-347dd39ed138 +# ╠═ceddc242-445d-4bbf-bcb5-2bf9a264ea3d +# β•Ÿβ”€7890c7b6-0d66-4b25-b30b-98542de9a32f +# β•Ÿβ”€e8906a7c-18e6-469c-99a8-0d21b76182e2 +# β•Ÿβ”€cd88584f-c46b-414c-84a7-53038a6b8e38 +# ╠═9df547e0-5c95-474f-b74a-f6dfe0e9fc39 +# ╠═7c57e8b0-36e1-45a2-942a-6aa013af80c9 +# β•Ÿβ”€850e864c-3a0d-42c9-afe4-4149208c18b2 +# β•Ÿβ”€cd0b2fdf-8a6e-4096-8161-df408f92767e +# ╠═25202060-8199-4405-915a-a01389f04545 +# ╠═5d2a5942-607a-428e-9257-3a1fe5fbc3c6 +# ╠═a70d1718-f546-43e4-8553-045dcffd1ad3 +# ╠═736f87c1-f8db-4d16-bad6-95baaa6dd908 +# β•Ÿβ”€0987f560-01ae-468e-ba50-3ede19bc2ed9 +# ╠═8cae53e5-e5d0-48ef-b33f-c9c78200dcbc +# ╠═3df5875a-55e2-4a6f-bf6d-aa2192126a30 +# β•Ÿβ”€459b8c60-e16d-429a-ae1d-9a99d57cf554 +# ╠═0ddcd01a-dc34-48b6-83e5-6def28fce78e +# ╠═f3c3ad60-9c87-40e5-ba15-d9f72c3bae60 +# ╠═0e7ce1f3-510d-44ad-bd7c-a25a840eda5e +# ╠═c2dd2043-df98-45ab-a4e3-a73f31b03cbd +# β•Ÿβ”€bd5060ec-758f-418a-98a5-f57f424d64d5 +# ╠═9b17807e-a18f-4735-bdae-0924d28fd5ee +# ╠═8c25ac44-6a59-4442-be4c-3ed8effdb20d +# ╠═1b1d8481-0eff-446d-b932-8bd52817cbfc +# ╠═59cd4167-d100-4dfc-ac7c-02e1887af0c8 +# ╠═071c630e-d45d-4820-b483-104d2ae78670 +# β•Ÿβ”€6d4e8e1f-9fa3-440d-bf83-c8b3e07fc71d +# β•Ÿβ”€a266a5d7-e8a3-4a90-a113-279b2f6eaba9 +# ╠═8842dd3f-9b7f-4916-aaf7-067a4be8bb0c +# ╠═96e678e9-ff11-4cec-a115-15d4a334b7fe +# ╠═c45ba9aa-13ab-4d03-a345-955659c6ff41 +# ╠═7f303cbc-22e4-4b4f-be9c-2585f50dd166 +# β•Ÿβ”€ddf33d10-9b5e-456a-aea1-d0ce465487be +# ╠═4df4f662-0ece-4f61-9f42-faa4999d29ab +# ╠═ccd607b8-c2a0-4c6b-9d78-4c264f555fb4 +# ╠═0dbbe879-49a2-4ee7-9758-f3dffad3e075 +# ╠═cd75a2cd-a718-4d9a-98a4-2b6654680d7d +# ╠═32582dec-38a2-41b2-80f1-81eadaae41e1 +# ╠═3f945734-aedc-466b-8b80-0bf841142b74 +# ╠═61bcc9ca-1f68-45a2-9117-a1a3662354d8 +# ╠═d593a687-519d-4693-bda4-ad6ac8e26a45 +# β•Ÿβ”€1a3ef85c-116a-4a74-9c96-28e88829fb7d +# ╠═7ca9e326-064f-4f2e-9eb3-746e347fc693 +# ╠═185c0731-3c06-4640-b19c-cdb1b3e0f3a5 +# ╠═060f65c7-40ac-4ad5-8a86-21d1931b7a2a +# ╠═03f4a36c-669e-47e8-96f1-b58b1df8afb0 +# ╠═f0351fc7-d3ce-4036-9be6-14e0458418c6 +# ╠═5947547b-96f7-4e3e-bf61-87aea647eab0 +# ╠═383d0c2c-42f0-484d-8292-b6f6abae50cf +# ╠═632f9251-f2a8-4549-b0e0-bd965a0c513b +# ╠═48c2ddcf-5d02-499d-ba69-e1cc38391443 +# ╠═c3b13f6e-c245-49e6-b892-bc1b446d7a52 +# ╠═5c8effcd-a6fe-4ed7-b06a-68494f378136 +# ╠═3d054687-0739-4c73-b578-4b7baa8ba8c7 +# ╠═d70faeb4-e75d-4598-b1fd-986dacadf190 +# β•Ÿβ”€42e14b85-28cc-429e-8267-25107cca6101 +# β•Ÿβ”€41ab85eb-67c2-440c-8f1a-8e365981418f +# β•Ÿβ”€3cd02837-36d6-496d-a08a-e83c65135530 +# β•Ÿβ”€9d3f74e2-18f2-4c86-bd48-12ca01972539 +# ╠═87d9312a-5ece-4ea4-8d98-bac120273155 +# ╠═3ac2a971-7029-4de1-955e-16bb0dd9a9aa +# ╠═406dd220-54a6-4aa2-95ec-a7d533252a5a +# ╠═966ebaa7-da63-41f9-bfde-951dd6ab9c8c +# ╠═830f0714-171e-4115-9f83-953560cf9a2e +# ╠═deee9c05-2e58-4a94-bbe5-3244c272dfaa +# ╠═b3bf3e26-f80f-482d-b93f-b37f61a63cb3 +# ╠═cdfef9ad-ef97-4130-8ba0-bae7d76127bf +# β•Ÿβ”€8dc47309-5355-41bc-aa9f-b92af247a4ed +# ╠═7ead5eb1-391a-4422-b75a-3908e1c30321 +# ╠═64d33d2e-8079-458f-926a-d9db16ae72c4 +# ╠═4257aac6-ba4a-4df7-9a93-1c091ab55b70 +# β•Ÿβ”€897bfd00-bc16-4c6f-8d10-eaa17a74e9fc +# ╠═c8a252b5-c7a0-4403-9636-e8459c1251be +# ╠═76ea45e0-f8ca-495f-bdbb-8ace33a76cbf +# ╠═b137aa6f-a683-4d73-8c56-2f052e7cc534 +# ╠═e3368777-ecca-4273-9501-836789ccdb3f +# ╠═33756b2a-24f7-49cb-8616-c2fa6c716f52 +# ╠═111e1e15-c462-4c33-89b6-3d55597ee092 +# ╠═9a0971e9-3625-4a87-b5cb-23ebfaafb042 +# ╠═88e9f3b1-adda-4a0f-bc16-4d144bbd28c3 +# β•Ÿβ”€19672d03-80ff-4997-8f08-b0dc8405cf24 +# β•Ÿβ”€4f66a82d-b9bd-469f-b327-56c40c8baa17 +# ╠═bf6fba34-2a52-47e1-820a-d17339f17379 +# ╠═e0146124-eac2-45c6-99e8-90f6cf82e294 +# ╠═e8d60909-6dd6-4841-b4c3-9dfa5c18f41e +# ╠═b8827029-2561-4883-ae95-05ea9f3d2b1b +# β•Ÿβ”€ee85e0bf-f985-41b0-be55-92d6faa4eede +# ╠═b8c22481-c851-4abb-986b-6766d7e71b88 +# ╠═c1c8dd57-0b8e-4d76-ae1e-f7f93452aeb0 +# ╠═73e5f533-fe6c-41c5-ae1a-0d49296ec5ac +# ╠═3a0151a0-c837-44ea-8d2a-529756550989 +# β•Ÿβ”€f4244d75-9d09-4a38-aa97-53062b0fe388 +# β•Ÿβ”€83070622-c71b-4757-8349-e7364ec5cb55 +# ╠═33d8d8d2-4343-4ae2-8174-ac245a5d3de9 +# ╠═27049ede-8943-4e3c-9538-c9b67dd3da05 +# β•Ÿβ”€171d4a16-ea05-42ff-ba10-081500ef4b2f +# ╠═67ef0b42-e3fd-4777-a49e-090a6a874ffe +# ╠═fea409ec-e042-4723-8cd5-48cc6ac94a1b +# ╠═9a835c95-685e-4155-836c-d4c1273a06c3 +# ╠═b031b745-aabc-46e7-a15f-bb50a5977779 +# ╠═075c5a43-0af8-441b-b831-7faba2f48f0c +# ╠═1ac98406-dc58-4594-a462-93525a6cf2d0 +# ╠═56c58e54-2276-44fc-89b0-5f86e1c4fd15 +# ╠═a2643fe2-b2cb-41ef-8557-d2a901239708 +# ╠═69ac8b2f-7c43-4f33-9b32-6033457467df +# ╠═897679bf-ef08-4c7d-8078-2de9adfedcf9 +# β•Ÿβ”€f0a08ec8-3c3a-4fc2-9efe-6eb5c55b96e8 +# ╠═61e4b1a1-2d2a-42fb-91cd-c245d6c54399 +# ╠═bf292bf8-5a3e-4913-a1b2-dfe55f46e438 +# ╠═fadb3713-3ab3-44d7-a8e6-e0b146a86c75 +# ╠═c1072ede-5c7a-4c1f-82f6-ac81fcf037d3 +# β•Ÿβ”€e21a076f-3dcd-466e-be82-d00646f2457f +# β•Ÿβ”€98a825e8-b0a6-483f-b980-1b9600a42c9a +# β•Ÿβ”€0202b549-7960-4e4d-b76a-71b3b4256473 +# ╠═669a2b4f-0faa-4c67-8def-ee762b521eb3 +# ╠═025a2137-8fee-435b-a295-853ce8b29b77 +# β•Ÿβ”€d7a5d1b5-e67f-4b4b-b299-987a031fd9a4 +# ╠═26c08688-8966-42d6-84b9-a96d17e9f41b +# ╠═1582f8d6-95e7-4b07-a7a5-927dda90ee43 +# β•Ÿβ”€ba8e4203-f889-4036-b042-35c4c160f75a +# β•Ÿβ”€e3d1b330-b678-45e9-b0c4-ab1d2bd842e6 +# ╠═370d3ce1-467b-4caa-a10b-d13218dfb1fe +# ╠═60ced228-90d5-460c-95c0-8ddea2e9e9fc +# ╠═6c80fe2d-c465-45aa-b3fe-94fe904b0903 +# ╠═df9f3334-2227-47e6-a7cb-fdc1b9a5ce21 +# ╠═457b7225-c4ad-4d76-92a1-ff2b0b2ea372 +# ╠═e5804ae5-cf1f-47b3-9fe2-532fb0f9665a +# ╠═fdcec36b-4cdc-4994-8703-00ff708f6070 +# β•Ÿβ”€645eed27-1cb8-4b7f-8590-539f543e63a1 +# ╠═b55497bd-bd4e-4d31-b4f6-8c2832aeb35e +# ╠═d2032057-1269-4b32-b489-8c90608e8dd5 +# ╠═f861c4fa-5453-44d2-af30-b9376a95cf2b +# ╠═c04c353d-8db8-4e1d-a409-df10e46a5c21 +# ╠═e83e153f-8269-4020-a8b4-afc4c5cd6828 +# ╠═edf980c3-a838-4c3f-9321-2c5142bce2e2 +# β•Ÿβ”€501d14cd-3747-4997-99cb-6bbca56b31b5 +# β•Ÿβ”€a9244d09-d458-44c9-9c9f-a271e7951b35 +# β•Ÿβ”€fd8a9c43-9ab5-4b80-931c-9b772656c186 +# ╠═8b706854-ebe6-49e9-bf6c-7eb08318125e +# ╠═08fcfccd-f2ec-49ef-8df6-c9b9bc07bd59 +# ╠═4b17015d-d56b-43d9-a86a-82c25a7bb4f5 +# ╠═b4cc0368-cf8a-4502-a658-f4d229d89029 +# ╠═4ec25214-8ebc-4d87-93fe-a84e8ea6e1c7 +# ╠═f71b573d-9486-475d-8763-e3a517265c62 +# β•Ÿβ”€ec7bec64-3d25-421f-878e-60b381bdaee0 +# β•Ÿβ”€351813ef-6075-4d38-be38-e53a5651209f +# ╠═4a96d787-de19-4beb-aeb5-ba92bc54502f +# β•Ÿβ”€c6ef3656-e026-42ed-82e0-a85499bdfe02 +# ╠═d062c5e3-7261-4ff4-b16d-764744be9924 +# β•Ÿβ”€7504555a-f56e-46eb-85e3-134b4a14f35a +# β•Ÿβ”€850492bd-baf6-49db-aae4-23bfdb544528 +# β•Ÿβ”€abbf92ab-6261-4cbf-bbfd-8d5257b2b268 +# β•Ÿβ”€00000000-0000-0000-0000-000000000001 +# β•Ÿβ”€00000000-0000-0000-0000-000000000002 diff --git a/notebooks/0_julia_tutorial.plutostate b/notebooks/0_julia_tutorial.plutostate new file mode 100644 index 0000000..db64566 Binary files /dev/null and b/notebooks/0_julia_tutorial.plutostate differ diff --git a/notebooks/1_abstraction.html b/notebooks/1_abstraction.html new file mode 100644 index 0000000..7282684 --- /dev/null +++ b/notebooks/1_abstraction.html @@ -0,0 +1,16 @@ + + + + + + +
\ No newline at end of file diff --git a/notebooks/1_abstraction.jl b/notebooks/1_abstraction.jl new file mode 100644 index 0000000..4b134fc --- /dev/null +++ b/notebooks/1_abstraction.jl @@ -0,0 +1,1404 @@ +### A Pluto.jl notebook ### +# v0.19.27 + +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 + +# ╔═║ da1d65a0-ec42-11ea-0141-334c9eeeb035 +begin + #import ImageMagick + using PlutoUI + using Images +end + +# ╔═║ 5ef51c3a-70a7-11eb-2023-31113399a57f +html""" +
+ +
+

Section 1.2

+

+ Intro to Abstractions +

+ +

Lecture Video

+
+
+
+
+
+ +""" + +# ╔═║ 60ae819a-70a7-11eb-31d4-750c7f5dc6ca +PlutoUI.TableOfContents(aside=true) + +# ╔═║ 792c6a62-ec41-11ea-01f3-73e7eee23cc7 +md""" +#### Initializing packages + +_When running this notebook for the first time, this could take up to 15 minutes. Hang in there!_ +""" + +# ╔═║ ef1bfa16-70ea-11eb-189c-a54db292cd6f +md" +## Introduction + +The goal of this section is to introduce you to the notion of abstraction. You can think of abstraction as an opposite to specialization. We will illustrate this by looking at the following example. + +### What is _one_? + +Before we get lost talking about the foundations of number theory, I will present you with a few examples that represent one to me. +" + +# ╔═║ 6fcac482-70ee-11eb-0b80-ff41c708053b +md"Each of the items in this list is a specific, or **_specialized_** representation of _one_: +1. as an integer +1. as a float +1. as a string +1. as a rational number +1. as a cute picture +1. as an 2x2 identity matrix +1. as a singular dog + +Of course, these are just a few examples of _one_. People have been representing _one_ for ages in different languages, scripts, artistic expression, etc. + +The difference between these ones to me is clear. In fact, I just articulated it to you. Now, let's turn to how a computer sees _one_ differently based on what I type. +" + +# ╔═║ 637975a0-72f6-4284-bf88-df1a039859ef +md"On a computer we can see the difference between 1 and 1.0 in terms of the 64 bits of storage:" + +# ╔═║ 960ad23c-14ab-4a0b-9591-926e529e538c +bitstring(1) + +# ╔═║ 4c866972-f588-4233-b44b-36871eac6ceb +bitstring(1.0) + +# ╔═║ a4316001-1c58-47e5-992e-b7fe9ed00ba3 +md"Obviously the computer is storing something different for 1.0. The type tells the computer how to interpret the pattern of 0's and 1's." + +# ╔═║ 9ebc079a-70f0-11eb-07d9-f9e80f3f4584 +md"So to a computer, all of these are different types." + +# ╔═║ f6886d90-70ed-11eb-07c4-471ee267e7c1 +md""" +Before we even look at the output, I am amazed that this code even ran. Are you telling me that the computer doesn't care which _one_ I am using in my array? + +Yes! That's exactly what abstraction is. By stepping back, we can now think and operate at a level that doesn't care about which _specific_ one I am using. This is what we mean by **abstraction is the opposite of specialization**. + +The information that Julia gives back is quite informative. Here is an example of the first line of the output for a few different types: + +``` +array = 3x4 Array{Int64, 2} +array = 3x4 Array{Float64, 2} +array = 3x4 Array{Rational{Int64}, 2} +``` + +Notice that for all of these, we have the same `3x4 Array{***, 2}`. +""" + +# ╔═║ 15f7f90a-70f0-11eb-0d41-63677e4023f4 +md"### What is a collection of _one_s? + +Now, I want to make a collection of ones for some reason. Below is a way for you to experiment building this collection with different _one_s. As you do this experiment, I want you to look at what stays in the same in the Julia output, and what doesn't." + +# ╔═║ bd6ae241-5ad0-4660-895b-492ec7716c7f +md"## Steve Strogatz Essay +Check out [Sesame St](https://youtu.be/fFYYVgdro5w?t=918) +and Steve Strogatz' gorgeous essay [From Fish to Infinity](https://blogs.baruch.cuny.edu/authenticityandastonishment/files/2012/09/From-Fish-to-Infinity.-Steven-Strogatz.pdf)" + +# ╔═║ d637f69c-e388-4d45-9611-31d1563c9c14 +md"MORAL OF THE STORY: Humphrey asks does the idea of counting work on Cinammon Rolls, Cream Pies, Spark Plugs? When a concept is separated from the underlying representation, we have abstraction. All too often computer programs are unnecessarily specialized either by force from the computer language or +because the programmer is thinking unnecessarily narrowly." + +# ╔═║ 3c1a3cf8-70f8-11eb-3c18-375207f321eb +md""" +## First Taste of Abstraction + +Now, I want to do something to a collection of ones, that doesn't care about which one I'm using. So I'm going to write a function that takes in my collection, and add a corgi whereever I desire. +""" + +# ╔═║ 19f4ddb0-ec44-11ea-20b9-5d97fb2b1cf4 +function insert(new, A, i, j) + B = copy(A) + B[i,j] = new + return B +end + +# ╔═║ 424f5f10-ec44-11ea-076d-f3cba4435e0c +begin + A = fill(0, 3, 4) + md""" + $(@bind i Slider(1: size(A,1), show_value=true)) + $(@bind j Slider(1: size(A,2), show_value=true)) + """ +end + +# ╔═║ 71ac08ea-7145-11eb-237d-5506adfb9533 +begin + one_number_array = fill(1,3,4) + insert(5, one_number_array, i, j) +end + +# ╔═║ ee43d808-70fa-11eb-0cc6-337279f41494 +md"This is still amazing. I wrote one function that just cares about how to insert an object into an array, without knowing anything about what's inside, and it worked for two completely different arrays, _collections of ones of **any kind**_." + +# ╔═║ 263a8a0a-70ee-11eb-236d-c941ba63dff3 +md" +## Conclusion +The key idea here is that a computer language should allow you to do operations that make sense. Often times, an operation can make sense for many different objects. So we can abstract away the specifics of the object in our implementation. It should let you step back from there. +" + +# ╔═║ 52461588-ea1a-4e7d-aec2-3de388d31656 +md""" +## Appendix +""" + +# ╔═║ 1a2a9000-ec43-11ea-3f39-8312ea286a92 +begin + oneimage = load(download("https://gallery.yopriceville.com/var/albums/Free-Clipart-Pictures/Decorative-Numbers/Cute_Number_One_PNG_Clipart_Image.png?m=1437447301")) + corgi = load(download("https://raw.githubusercontent.com/mitmath/JuliaComputation/756ee73e14dd4e27bb9a1ac2ca7c415d241366b4/notebooks/20220422_philip.jpg")) + nothing +end + + +# ╔═║ 0504ac94-70ee-11eb-1c4e-977d9e7d35c9 +one = [ + 1, + 1.0, + "one", + 1//1, + oneimage, + [1 0; 0 1], + corgi, +] + +# ╔═║ 0b1668ba-ec42-11ea-3e50-ed97c5b17ced +computer_ones = typeof.(one) + +# ╔═║ b2239b96-70ef-11eb-0b85-21ecab25dc9f +begin + one_keys = ["1", "1.0", "one", "1//1", "Cute One", "2x2 Identity", "One Corgi"] + selections = one_keys .=> one_keys + lookup_element = Dict(one_keys .=> one) + md"$(@bind element_key Select(selections))" +end + +# ╔═║ 4251f668-70aa-11eb-3d89-35f8d53b7d9b +# your chosen one +element = lookup_element[element_key] + +# ╔═║ f1568d10-ec41-11ea-3dd2-a9cb273ce5b8 +# its type +typeof(element) + +# ╔═║ ab02d850-ec41-11ea-10b2-a1b600b12658 +# a 3x4 array of this one. +array = fill(element,3,4) + +# ╔═║ 5363a400-ec44-11ea-284e-d13a8872551c +begin + one_image_array = fill(oneimage,3,4) + insert(corgi, one_image_array, i, j) +end + +# ╔═║ 00000000-0000-0000-0000-000000000001 +PLUTO_PROJECT_TOML_CONTENTS = """ +[deps] +Images = "916415d5-f1e6-5110-898d-aaa5f9f070e0" +PlutoUI = "7f904dfe-b85e-4ff6-b463-dae2292396a8" + +[compat] +Images = "~0.26.0" +PlutoUI = "~0.7.52" +""" + +# ╔═║ 00000000-0000-0000-0000-000000000002 +PLUTO_MANIFEST_TOML_CONTENTS = """ +# This file is machine-generated - editing it directly is not advised + +julia_version = "1.9.3" +manifest_format = "2.0" +project_hash = "699d195198e880515a7531236526b7d0e081b4fd" + +[[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 = "91bd53c39b9cbfb5ef4b015e8b582d344532bd0a" +uuid = "6e696c72-6542-2067-7265-42206c756150" +version = "1.2.0" + +[[deps.Adapt]] +deps = ["LinearAlgebra", "Requires"] +git-tree-sha1 = "76289dc51920fdc6e0013c872ba9551d54961c24" +uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" +version = "3.6.2" +weakdeps = ["StaticArrays"] + + [deps.Adapt.extensions] + AdaptStaticArraysExt = "StaticArrays" + +[[deps.ArgTools]] +uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" +version = "1.1.1" + +[[deps.ArnoldiMethod]] +deps = ["LinearAlgebra", "Random", "StaticArrays"] +git-tree-sha1 = "62e51b39331de8911e4a7ff6f5aaf38a5f4cc0ae" +uuid = "ec485272-7323-5ecc-a04f-4719b315124d" +version = "0.2.0" + +[[deps.ArrayInterface]] +deps = ["Adapt", "LinearAlgebra", "Requires", "SparseArrays", "SuiteSparse"] +git-tree-sha1 = "f83ec24f76d4c8f525099b2ac475fc098138ec31" +uuid = "4fba245c-0d91-5ea0-9b3e-6abc04ee57a9" +version = "7.4.11" + + [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.ArrayInterfaceCore]] +deps = ["LinearAlgebra", "SnoopPrecompile", "SparseArrays", "SuiteSparse"] +git-tree-sha1 = "e5f08b5689b1aad068e01751889f2f615c7db36d" +uuid = "30b0a656-2188-435a-8636-2ec0e6a096e2" +version = "0.1.29" + +[[deps.Artifacts]] +uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" + +[[deps.AxisAlgorithms]] +deps = ["LinearAlgebra", "Random", "SparseArrays", "WoodburyMatrices"] +git-tree-sha1 = "66771c8d21c8ff5e3a93379480a2307ac36863f7" +uuid = "13072b0f-2c55-5437-9ae7-d433b7a33950" +version = "1.0.1" + +[[deps.AxisArrays]] +deps = ["Dates", "IntervalSets", "IterTools", "RangeArrays"] +git-tree-sha1 = "16351be62963a67ac4083f748fdb3cca58bfd52f" +uuid = "39de3d68-74b9-583c-8d2d-e117c070f3a9" +version = "0.4.7" + +[[deps.Base64]] +uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" + +[[deps.BitTwiddlingConvenienceFunctions]] +deps = ["Static"] +git-tree-sha1 = "0c5f81f47bbbcf4aea7b2959135713459170798b" +uuid = "62783981-4cbd-42fc-bca8-16325de8dc4b" +version = "0.1.5" + +[[deps.CEnum]] +git-tree-sha1 = "eb4cb44a499229b3b8426dcfb5dd85333951ff90" +uuid = "fa961155-64e5-5f13-b03f-caf6b980ea82" +version = "0.4.2" + +[[deps.CPUSummary]] +deps = ["CpuId", "IfElse", "PrecompileTools", "Static"] +git-tree-sha1 = "89e0654ed8c7aebad6d5ad235d6242c2d737a928" +uuid = "2a0fbf3d-bb9c-48f3-b0a9-814d99fd7ab9" +version = "0.2.3" + +[[deps.CatIndices]] +deps = ["CustomUnitRanges", "OffsetArrays"] +git-tree-sha1 = "a0f80a09780eed9b1d106a1bf62041c2efc995bc" +uuid = "aafaddc9-749c-510e-ac4f-586e18779b91" +version = "0.2.2" + +[[deps.ChainRulesCore]] +deps = ["Compat", "LinearAlgebra", "SparseArrays"] +git-tree-sha1 = "e30f2f4e20f7f186dc36529910beaedc60cfa644" +uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" +version = "1.16.0" + +[[deps.CloseOpenIntervals]] +deps = ["Static", "StaticArrayInterface"] +git-tree-sha1 = "70232f82ffaab9dc52585e0dd043b5e0c6b714f1" +uuid = "fb6a15b2-703c-40df-9091-08a04967cfa9" +version = "0.1.12" + +[[deps.Clustering]] +deps = ["Distances", "LinearAlgebra", "NearestNeighbors", "Printf", "Random", "SparseArrays", "Statistics", "StatsBase"] +git-tree-sha1 = "b86ac2c5543660d238957dbde5ac04520ae977a7" +uuid = "aaaa29a8-35af-508c-8bc3-b662a17a0fe5" +version = "0.15.4" + +[[deps.ColorSchemes]] +deps = ["ColorTypes", "ColorVectorSpace", "Colors", "FixedPointNumbers", "PrecompileTools", "Random"] +git-tree-sha1 = "d9a8f86737b665e15a9641ecbac64deef9ce6724" +uuid = "35d6a980-a343-548e-a6ea-1d62b119f2f4" +version = "3.23.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" + + [deps.ColorVectorSpace.extensions] + SpecialFunctionsExt = "SpecialFunctions" + + [deps.ColorVectorSpace.weakdeps] + SpecialFunctions = "276daf66-3868-5448-9aa4-cd146d93841b" + +[[deps.Colors]] +deps = ["ColorTypes", "FixedPointNumbers", "Reexport"] +git-tree-sha1 = "fc08e5930ee9a4e03f84bfb5211cb54e7769758a" +uuid = "5ae59095-9a9b-59fe-a467-6f913c188581" +version = "0.12.10" + +[[deps.Compat]] +deps = ["UUIDs"] +git-tree-sha1 = "e460f044ca8b99be31d35fe54fc33a5c33dd8ed7" +uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" +version = "4.9.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+0" + +[[deps.ComputationalResources]] +git-tree-sha1 = "52cb3ec90e8a8bea0e62e275ba577ad0f74821f7" +uuid = "ed09eef8-17a6-5b46-8889-db040fac31e3" +version = "0.3.2" + +[[deps.CoordinateTransformations]] +deps = ["LinearAlgebra", "StaticArrays"] +git-tree-sha1 = "f9d7112bfff8a19a3a4ea4e03a8e6a91fe8456bf" +uuid = "150eb455-5306-5404-9cee-2592286d6298" +version = "0.6.3" + +[[deps.CpuId]] +deps = ["Markdown"] +git-tree-sha1 = "fcbb72b032692610bfbdb15018ac16a36cf2e406" +uuid = "adafc99b-e345-5852-983c-f28acb93d879" +version = "0.3.1" + +[[deps.CustomUnitRanges]] +git-tree-sha1 = "1a3f97f907e6dd8983b744d2642651bb162a3f7a" +uuid = "dc8bdbbb-1ca9-579f-8c36-e416f6a65cce" +version = "1.0.2" + +[[deps.DataAPI]] +git-tree-sha1 = "8da84edb865b0b5b0100c0666a9bc9a0b71c553c" +uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a" +version = "1.15.0" + +[[deps.DataStructures]] +deps = ["Compat", "InteractiveUtils", "OrderedCollections"] +git-tree-sha1 = "3dbd312d370723b6bb43ba9d02fc36abade4518d" +uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" +version = "0.18.15" + +[[deps.Dates]] +deps = ["Printf"] +uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" + +[[deps.Distances]] +deps = ["LinearAlgebra", "Statistics", "StatsAPI"] +git-tree-sha1 = "b6def76ffad15143924a2199f72a5cd883a2e8a9" +uuid = "b4f34e82-e78d-54a5-968a-f98e89d6e8f7" +version = "0.10.9" +weakdeps = ["SparseArrays"] + + [deps.Distances.extensions] + DistancesSparseArraysExt = "SparseArrays" + +[[deps.Distributed]] +deps = ["Random", "Serialization", "Sockets"] +uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" + +[[deps.DocStringExtensions]] +deps = ["LibGit2"] +git-tree-sha1 = "2fb1e02f2b635d0845df5d7c167fec4dd739b00d" +uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" +version = "0.9.3" + +[[deps.Downloads]] +deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] +uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" +version = "1.6.0" + +[[deps.FFTViews]] +deps = ["CustomUnitRanges", "FFTW"] +git-tree-sha1 = "cbdf14d1e8c7c8aacbe8b19862e0179fd08321c2" +uuid = "4f61f5a4-77b1-5117-aa51-3ab5ef4ef0cd" +version = "0.3.2" + +[[deps.FFTW]] +deps = ["AbstractFFTs", "FFTW_jll", "LinearAlgebra", "MKL_jll", "Preferences", "Reexport"] +git-tree-sha1 = "b4fbdd20c889804969571cc589900803edda16b7" +uuid = "7a1cc6ca-52ef-59f5-83cd-3a7055c09341" +version = "1.7.1" + +[[deps.FFTW_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "c6033cc3892d0ef5bb9cd29b7f2f0331ea5184ea" +uuid = "f5851436-0d7a-5f13-b9de-f02708fd171a" +version = "3.3.10+0" + +[[deps.FileIO]] +deps = ["Pkg", "Requires", "UUIDs"] +git-tree-sha1 = "299dc33549f68299137e51e6d49a13b5b1da9673" +uuid = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" +version = "1.16.1" + +[[deps.FileWatching]] +uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" + +[[deps.FixedPointNumbers]] +deps = ["Statistics"] +git-tree-sha1 = "335bfdceacc84c5cdf16aadc768aa5ddfc5383cc" +uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" +version = "0.8.4" + +[[deps.Graphics]] +deps = ["Colors", "LinearAlgebra", "NaNMath"] +git-tree-sha1 = "d61890399bc535850c4bf08e4e0d3a7ad0f21cbd" +uuid = "a2bd30eb-e257-5431-a919-1863eab51364" +version = "1.1.2" + +[[deps.Graphs]] +deps = ["ArnoldiMethod", "Compat", "DataStructures", "Distributed", "Inflate", "LinearAlgebra", "Random", "SharedArrays", "SimpleTraits", "SparseArrays", "Statistics"] +git-tree-sha1 = "1cf1d7dcb4bc32d7b4a5add4232db3750c27ecb4" +uuid = "86223c79-3864-5bf0-83f7-82e725a168b6" +version = "1.8.0" + +[[deps.HistogramThresholding]] +deps = ["ImageBase", "LinearAlgebra", "MappedArrays"] +git-tree-sha1 = "7194dfbb2f8d945abdaf68fa9480a965d6661e69" +uuid = "2c695a8d-9458-5d45-9878-1b8a99cf7853" +version = "0.3.1" + +[[deps.HostCPUFeatures]] +deps = ["BitTwiddlingConvenienceFunctions", "IfElse", "Libdl", "Static"] +git-tree-sha1 = "eb8fed28f4994600e29beef49744639d985a04b2" +uuid = "3e5b6fbb-0976-4d2c-9146-d79de83f2fb0" +version = "0.1.16" + +[[deps.Hyperscript]] +deps = ["Test"] +git-tree-sha1 = "8d511d5b81240fc8e6802386302675bdf47737b9" +uuid = "47d2ed2b-36de-50cf-bf87-49c2cf4b8b91" +version = "0.0.4" + +[[deps.HypertextLiteral]] +deps = ["Tricks"] +git-tree-sha1 = "c47c5fa4c5308f27ccaac35504858d8914e102f9" +uuid = "ac1192a8-f4b3-4bfe-ba22-af5b92cd3ab2" +version = "0.9.4" + +[[deps.IOCapture]] +deps = ["Logging", "Random"] +git-tree-sha1 = "d75853a0bdbfb1ac815478bacd89cd27b550ace6" +uuid = "b5f81e59-6552-4d32-b1f0-c071b021bf89" +version = "0.2.3" + +[[deps.IfElse]] +git-tree-sha1 = "debdd00ffef04665ccbb3e150747a77560e8fad1" +uuid = "615f187c-cbe4-4ef1-ba3b-2fcf58d6d173" +version = "0.1.1" + +[[deps.ImageAxes]] +deps = ["AxisArrays", "ImageBase", "ImageCore", "Reexport", "SimpleTraits"] +git-tree-sha1 = "2e4520d67b0cef90865b3ef727594d2a58e0e1f8" +uuid = "2803e5a7-5153-5ecf-9a86-9b4c37f5f5ac" +version = "0.6.11" + +[[deps.ImageBase]] +deps = ["ImageCore", "Reexport"] +git-tree-sha1 = "eb49b82c172811fd2c86759fa0553a2221feb909" +uuid = "c817782e-172a-44cc-b673-b171935fbb9e" +version = "0.1.7" + +[[deps.ImageBinarization]] +deps = ["HistogramThresholding", "ImageCore", "LinearAlgebra", "Polynomials", "Reexport", "Statistics"] +git-tree-sha1 = "f5356e7203c4a9954962e3757c08033f2efe578a" +uuid = "cbc4b850-ae4b-5111-9e64-df94c024a13d" +version = "0.3.0" + +[[deps.ImageContrastAdjustment]] +deps = ["ImageBase", "ImageCore", "ImageTransformations", "Parameters"] +git-tree-sha1 = "eb3d4365a10e3f3ecb3b115e9d12db131d28a386" +uuid = "f332f351-ec65-5f6a-b3d1-319c6670881a" +version = "0.3.12" + +[[deps.ImageCore]] +deps = ["AbstractFFTs", "ColorVectorSpace", "Colors", "FixedPointNumbers", "MappedArrays", "MosaicViews", "OffsetArrays", "PaddedViews", "PrecompileTools", "Reexport"] +git-tree-sha1 = "fc5d1d3443a124fde6e92d0260cd9e064eba69f8" +uuid = "a09fc81d-aa75-5fe9-8630-4744c3626534" +version = "0.10.1" + +[[deps.ImageCorners]] +deps = ["ImageCore", "ImageFiltering", "PrecompileTools", "StaticArrays", "StatsBase"] +git-tree-sha1 = "24c52de051293745a9bad7d73497708954562b79" +uuid = "89d5987c-236e-4e32-acd0-25bd6bd87b70" +version = "0.1.3" + +[[deps.ImageDistances]] +deps = ["Distances", "ImageCore", "ImageMorphology", "LinearAlgebra", "Statistics"] +git-tree-sha1 = "08b0e6354b21ef5dd5e49026028e41831401aca8" +uuid = "51556ac3-7006-55f5-8cb3-34580c88182d" +version = "0.2.17" + +[[deps.ImageFiltering]] +deps = ["CatIndices", "ComputationalResources", "DataStructures", "FFTViews", "FFTW", "ImageBase", "ImageCore", "LinearAlgebra", "OffsetArrays", "PrecompileTools", "Reexport", "SparseArrays", "StaticArrays", "Statistics", "TiledIteration"] +git-tree-sha1 = "432ae2b430a18c58eb7eca9ef8d0f2db90bc749c" +uuid = "6a3955dd-da59-5b1f-98d4-e7296123deb5" +version = "0.7.8" + +[[deps.ImageIO]] +deps = ["FileIO", "IndirectArrays", "JpegTurbo", "LazyModules", "Netpbm", "OpenEXR", "PNGFiles", "QOI", "Sixel", "TiffImages", "UUIDs"] +git-tree-sha1 = "bca20b2f5d00c4fbc192c3212da8fa79f4688009" +uuid = "82e4d734-157c-48bb-816b-45c225c6df19" +version = "0.6.7" + +[[deps.ImageMagick]] +deps = ["FileIO", "ImageCore", "ImageMagick_jll", "InteractiveUtils"] +git-tree-sha1 = "b0b765ff0b4c3ee20ce6740d843be8dfce48487c" +uuid = "6218d12a-5da1-5696-b52f-db25d2ecc6d1" +version = "1.3.0" + +[[deps.ImageMagick_jll]] +deps = ["JpegTurbo_jll", "Libdl", "Libtiff_jll", "Pkg", "Zlib_jll", "libpng_jll"] +git-tree-sha1 = "1c0a2295cca535fabaf2029062912591e9b61987" +uuid = "c73af94c-d91f-53ed-93a7-00f77d67a9d7" +version = "6.9.10-12+3" + +[[deps.ImageMetadata]] +deps = ["AxisArrays", "ImageAxes", "ImageBase", "ImageCore"] +git-tree-sha1 = "355e2b974f2e3212a75dfb60519de21361ad3cb7" +uuid = "bc367c6b-8a6b-528e-b4bd-a4b897500b49" +version = "0.9.9" + +[[deps.ImageMorphology]] +deps = ["DataStructures", "ImageCore", "LinearAlgebra", "LoopVectorization", "OffsetArrays", "Requires", "TiledIteration"] +git-tree-sha1 = "6f0a801136cb9c229aebea0df296cdcd471dbcd1" +uuid = "787d08f9-d448-5407-9aad-5290dd7ab264" +version = "0.4.5" + +[[deps.ImageQualityIndexes]] +deps = ["ImageContrastAdjustment", "ImageCore", "ImageDistances", "ImageFiltering", "LazyModules", "OffsetArrays", "PrecompileTools", "Statistics"] +git-tree-sha1 = "783b70725ed326340adf225be4889906c96b8fd1" +uuid = "2996bd0c-7a13-11e9-2da2-2f5ce47296a9" +version = "0.3.7" + +[[deps.ImageSegmentation]] +deps = ["Clustering", "DataStructures", "Distances", "Graphs", "ImageCore", "ImageFiltering", "ImageMorphology", "LinearAlgebra", "MetaGraphs", "RegionTrees", "SimpleWeightedGraphs", "StaticArrays", "Statistics"] +git-tree-sha1 = "3ff0ca203501c3eedde3c6fa7fd76b703c336b5f" +uuid = "80713f31-8817-5129-9cf8-209ff8fb23e1" +version = "1.8.2" + +[[deps.ImageShow]] +deps = ["Base64", "ColorSchemes", "FileIO", "ImageBase", "ImageCore", "OffsetArrays", "StackViews"] +git-tree-sha1 = "3b5344bcdbdc11ad58f3b1956709b5b9345355de" +uuid = "4e3cecfd-b093-5904-9786-8bbb286a6a31" +version = "0.3.8" + +[[deps.ImageTransformations]] +deps = ["AxisAlgorithms", "CoordinateTransformations", "ImageBase", "ImageCore", "Interpolations", "OffsetArrays", "Rotations", "StaticArrays"] +git-tree-sha1 = "7ec124670cbce8f9f0267ba703396960337e54b5" +uuid = "02fcd773-0e25-5acc-982a-7f6622650795" +version = "0.10.0" + +[[deps.Images]] +deps = ["Base64", "FileIO", "Graphics", "ImageAxes", "ImageBase", "ImageBinarization", "ImageContrastAdjustment", "ImageCore", "ImageCorners", "ImageDistances", "ImageFiltering", "ImageIO", "ImageMagick", "ImageMetadata", "ImageMorphology", "ImageQualityIndexes", "ImageSegmentation", "ImageShow", "ImageTransformations", "IndirectArrays", "IntegralArrays", "Random", "Reexport", "SparseArrays", "StaticArrays", "Statistics", "StatsBase", "TiledIteration"] +git-tree-sha1 = "d438268ed7a665f8322572be0dabda83634d5f45" +uuid = "916415d5-f1e6-5110-898d-aaa5f9f070e0" +version = "0.26.0" + +[[deps.Imath_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "3d09a9f60edf77f8a4d99f9e015e8fbf9989605d" +uuid = "905a6f67-0a94-5f89-b386-d35d92009cd1" +version = "3.1.7+0" + +[[deps.IndirectArrays]] +git-tree-sha1 = "012e604e1c7458645cb8b436f8fba789a51b257f" +uuid = "9b13fd28-a010-5f03-acff-a1bbcff69959" +version = "1.0.0" + +[[deps.Inflate]] +git-tree-sha1 = "5cd07aab533df5170988219191dfad0519391428" +uuid = "d25df0c9-e2be-5dd7-82c8-3ad0b3e990b9" +version = "0.1.3" + +[[deps.IntegralArrays]] +deps = ["ColorTypes", "FixedPointNumbers", "IntervalSets"] +git-tree-sha1 = "be8e690c3973443bec584db3346ddc904d4884eb" +uuid = "1d092043-8f09-5a30-832f-7509e371ab51" +version = "0.1.5" + +[[deps.IntelOpenMP_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "ad37c091f7d7daf900963171600d7c1c5c3ede32" +uuid = "1d5cc7b8-4909-519e-a0f8-d0f5ad9712d0" +version = "2023.2.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 = "721ec2cf720536ad005cb38f50dbba7b02419a15" +uuid = "a98d9a8b-a2ab-59e6-89dd-64a1c18fca59" +version = "0.14.7" + +[[deps.IntervalSets]] +deps = ["Dates", "Random"] +git-tree-sha1 = "8e59ea773deee525c99a8018409f64f19fb719e6" +uuid = "8197267c-284f-5f27-9208-e0e47529a953" +version = "0.7.7" +weakdeps = ["Statistics"] + + [deps.IntervalSets.extensions] + IntervalSetsStatisticsExt = "Statistics" + +[[deps.IrrationalConstants]] +git-tree-sha1 = "630b497eafcc20001bba38a4651b327dcfc491d2" +uuid = "92d709cd-6900-40b7-9082-c6be49f344b6" +version = "0.2.2" + +[[deps.IterTools]] +git-tree-sha1 = "4ced6667f9974fc5c5943fa5e2ef1ca43ea9e450" +uuid = "c8e1da08-722c-5040-9ed9-7db0dc04731e" +version = "1.8.0" + +[[deps.JLD2]] +deps = ["FileIO", "MacroTools", "Mmap", "OrderedCollections", "Pkg", "Printf", "Reexport", "Requires", "TranscodingStreams", "UUIDs"] +git-tree-sha1 = "aa6ffef1fd85657f4999030c52eaeec22a279738" +uuid = "033835bb-8acc-5ee8-8aae-3f567f8a3819" +version = "0.4.33" + +[[deps.JLLWrappers]] +deps = ["Artifacts", "Preferences"] +git-tree-sha1 = "7e5d6779a1e09a36db2a7b6cff50942a0a7d0fca" +uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" +version = "1.5.0" + +[[deps.JSON]] +deps = ["Dates", "Mmap", "Parsers", "Unicode"] +git-tree-sha1 = "31e996f0a15c7b280ba9f76636b3ff9e2ae58c9a" +uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" +version = "0.21.4" + +[[deps.JpegTurbo]] +deps = ["CEnum", "FileIO", "ImageCore", "JpegTurbo_jll", "TOML"] +git-tree-sha1 = "327713faef2a3e5c80f96bf38d1fa26f7a6ae29e" +uuid = "b835a17e-a41a-41e7-81f0-2f016b05efe0" +version = "0.1.3" + +[[deps.JpegTurbo_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "6f2675ef130a300a112286de91973805fcc5ffbc" +uuid = "aacddb02-875f-59d6-b918-886e6ef4fbf8" +version = "2.1.91+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.LayoutPointers]] +deps = ["ArrayInterface", "LinearAlgebra", "ManualMemory", "SIMDTypes", "Static", "StaticArrayInterface"] +git-tree-sha1 = "88b8f66b604da079a627b6fb2860d3704a6729a1" +uuid = "10f19ff3-798f-405d-979b-55457f8fc047" +version = "0.1.14" + +[[deps.LazyArtifacts]] +deps = ["Artifacts", "Pkg"] +uuid = "4af54fe1-eca0-43a8-85a7-787d91b784e3" + +[[deps.LazyModules]] +git-tree-sha1 = "a560dd966b386ac9ae60bdd3a3d3a326062d3c3e" +uuid = "8cdb02fc-e678-4876-92c5-9defec4f444e" +version = "0.3.1" + +[[deps.LibCURL]] +deps = ["LibCURL_jll", "MozillaCACerts_jll"] +uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" +version = "0.6.3" + +[[deps.LibCURL_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] +uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" +version = "7.84.0+0" + +[[deps.LibGit2]] +deps = ["Base64", "NetworkOptions", "Printf", "SHA"] +uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" + +[[deps.LibSSH2_jll]] +deps = ["Artifacts", "Libdl", "MbedTLS_jll"] +uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" +version = "1.10.2+0" + +[[deps.Libdl]] +uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" + +[[deps.Libtiff_jll]] +deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "LERC_jll", "Libdl", "Pkg", "Zlib_jll", "Zstd_jll"] +git-tree-sha1 = "3eb79b0ca5764d4799c06699573fd8f533259713" +uuid = "89763e89-9b03-5906-acba-b20f662cd828" +version = "4.4.0+0" + +[[deps.LinearAlgebra]] +deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"] +uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + +[[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.LoopVectorization]] +deps = ["ArrayInterface", "ArrayInterfaceCore", "CPUSummary", "CloseOpenIntervals", "DocStringExtensions", "HostCPUFeatures", "IfElse", "LayoutPointers", "LinearAlgebra", "OffsetArrays", "PolyesterWeave", "PrecompileTools", "SIMDTypes", "SLEEFPirates", "Static", "StaticArrayInterface", "ThreadingUtilities", "UnPack", "VectorizationBase"] +git-tree-sha1 = "c88a4afe1703d731b1c4fdf4e3c7e77e3b176ea2" +uuid = "bdcacae8-1622-11e9-2a5c-532679323890" +version = "0.12.165" + + [deps.LoopVectorization.extensions] + ForwardDiffExt = ["ChainRulesCore", "ForwardDiff"] + SpecialFunctionsExt = "SpecialFunctions" + + [deps.LoopVectorization.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + SpecialFunctions = "276daf66-3868-5448-9aa4-cd146d93841b" + +[[deps.MIMEs]] +git-tree-sha1 = "65f28ad4b594aebe22157d6fac869786a255b7eb" +uuid = "6c6e2e6c-3030-632d-7369-2d6c69616d65" +version = "0.1.4" + +[[deps.MKL_jll]] +deps = ["Artifacts", "IntelOpenMP_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "Pkg"] +git-tree-sha1 = "eb006abbd7041c28e0d16260e50a24f8f9104913" +uuid = "856f044c-d86e-5d09-b602-aeab76dc8ba7" +version = "2023.2.0+0" + +[[deps.MacroTools]] +deps = ["Markdown", "Random"] +git-tree-sha1 = "9ee1618cbf5240e6d4e0371d6f24065083f60c48" +uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" +version = "0.5.11" + +[[deps.ManualMemory]] +git-tree-sha1 = "bcaef4fc7a0cfe2cba636d84cda54b5e4e4ca3cd" +uuid = "d125e4d3-2237-4719-b19c-fa641b8a4667" +version = "0.1.8" + +[[deps.MappedArrays]] +git-tree-sha1 = "2dab0221fe2b0f2cb6754eaa743cc266339f527e" +uuid = "dbb5928d-eab1-5f90-85c2-b9b0edb7c900" +version = "0.4.2" + +[[deps.Markdown]] +deps = ["Base64"] +uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" + +[[deps.MbedTLS_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" +version = "2.28.2+0" + +[[deps.MetaGraphs]] +deps = ["Graphs", "JLD2", "Random"] +git-tree-sha1 = "1130dbe1d5276cb656f6e1094ce97466ed700e5a" +uuid = "626554b9-1ddb-594c-aa3c-2596fe9399a5" +version = "0.7.2" + +[[deps.Missings]] +deps = ["DataAPI"] +git-tree-sha1 = "f66bdc5de519e8f8ae43bdc598782d35a25b1272" +uuid = "e1d29d7a-bbdc-5cf2-9ac0-f12de2c33e28" +version = "1.1.0" + +[[deps.Mmap]] +uuid = "a63ad114-7e13-5084-954f-fe012c677804" + +[[deps.MosaicViews]] +deps = ["MappedArrays", "OffsetArrays", "PaddedViews", "StackViews"] +git-tree-sha1 = "7b86a5d4d70a9f5cdf2dacb3cbe6d251d1a61dbe" +uuid = "e94cdb99-869f-56ef-bcf0-1ae2bcbe0389" +version = "0.3.4" + +[[deps.MozillaCACerts_jll]] +uuid = "14a3606d-f60d-562e-9121-12d972cd8159" +version = "2022.10.11" + +[[deps.NaNMath]] +deps = ["OpenLibm_jll"] +git-tree-sha1 = "0877504529a3e5c3343c6f8b4c0381e57e4387e4" +uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" +version = "1.0.2" + +[[deps.NearestNeighbors]] +deps = ["Distances", "StaticArrays"] +git-tree-sha1 = "2c3726ceb3388917602169bed973dbc97f1b51a8" +uuid = "b8a86587-4115-5ab1-83bc-aa920d37bbce" +version = "0.4.13" + +[[deps.Netpbm]] +deps = ["FileIO", "ImageCore", "ImageMetadata"] +git-tree-sha1 = "d92b107dbb887293622df7697a2223f9f8176fcd" +uuid = "f09324ee-3d7c-5217-9330-fc30815ba969" +version = "1.1.1" + +[[deps.NetworkOptions]] +uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" +version = "1.2.0" + +[[deps.OffsetArrays]] +deps = ["Adapt"] +git-tree-sha1 = "2ac17d29c523ce1cd38e27785a7d23024853a4bb" +uuid = "6fe1bfb0-de20-5000-8ca7-80f57d26f881" +version = "1.12.10" + +[[deps.OpenBLAS_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] +uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" +version = "0.3.21+4" + +[[deps.OpenEXR]] +deps = ["Colors", "FileIO", "OpenEXR_jll"] +git-tree-sha1 = "327f53360fdb54df7ecd01e96ef1983536d1e633" +uuid = "52e1d378-f018-4a11-a4be-720524705ac7" +version = "0.3.2" + +[[deps.OpenEXR_jll]] +deps = ["Artifacts", "Imath_jll", "JLLWrappers", "Libdl", "Zlib_jll"] +git-tree-sha1 = "a4ca623df1ae99d09bc9868b008262d0c0ac1e4f" +uuid = "18a262bb-aa17-5467-a713-aee519bc75cb" +version = "3.1.4+0" + +[[deps.OpenLibm_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "05823500-19ac-5b8b-9628-191a04bc5112" +version = "0.8.1+0" + +[[deps.OrderedCollections]] +git-tree-sha1 = "2e73fe17cac3c62ad1aebe70d44c963c3cfdc3e3" +uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" +version = "1.6.2" + +[[deps.PNGFiles]] +deps = ["Base64", "CEnum", "ImageCore", "IndirectArrays", "OffsetArrays", "libpng_jll"] +git-tree-sha1 = "9b02b27ac477cad98114584ff964e3052f656a0f" +uuid = "f57f5aa1-a3ce-4bc8-8ab9-96f992907883" +version = "0.4.0" + +[[deps.PaddedViews]] +deps = ["OffsetArrays"] +git-tree-sha1 = "0fac6313486baae819364c52b4f483450a9d793f" +uuid = "5432bcbf-9aad-5242-b902-cca2824c8663" +version = "0.5.12" + +[[deps.Parameters]] +deps = ["OrderedCollections", "UnPack"] +git-tree-sha1 = "34c0e9ad262e5f7fc75b10a9952ca7692cfc5fbe" +uuid = "d96e819e-fc66-5662-9728-84c9c7592b0a" +version = "0.12.3" + +[[deps.Parsers]] +deps = ["Dates", "PrecompileTools", "UUIDs"] +git-tree-sha1 = "716e24b21538abc91f6205fd1d8363f39b442851" +uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" +version = "2.7.2" + +[[deps.Pkg]] +deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] +uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" +version = "1.9.2" + +[[deps.PkgVersion]] +deps = ["Pkg"] +git-tree-sha1 = "f9501cc0430a26bc3d156ae1b5b0c1b47af4d6da" +uuid = "eebad327-c553-4316-9ea0-9fa01ccd7688" +version = "0.3.3" + +[[deps.PlutoUI]] +deps = ["AbstractPlutoDingetjes", "Base64", "ColorTypes", "Dates", "FixedPointNumbers", "Hyperscript", "HypertextLiteral", "IOCapture", "InteractiveUtils", "JSON", "Logging", "MIMEs", "Markdown", "Random", "Reexport", "URIs", "UUIDs"] +git-tree-sha1 = "e47cd150dbe0443c3a3651bc5b9cbd5576ab75b7" +uuid = "7f904dfe-b85e-4ff6-b463-dae2292396a8" +version = "0.7.52" + +[[deps.PolyesterWeave]] +deps = ["BitTwiddlingConvenienceFunctions", "CPUSummary", "IfElse", "Static", "ThreadingUtilities"] +git-tree-sha1 = "240d7170f5ffdb285f9427b92333c3463bf65bf6" +uuid = "1d0040c9-8b98-4ee7-8388-3f51789ca0ad" +version = "0.2.1" + +[[deps.Polynomials]] +deps = ["LinearAlgebra", "RecipesBase"] +git-tree-sha1 = "3aa2bb4982e575acd7583f01531f241af077b163" +uuid = "f27b6e38-b328-58d1-80ce-0feddd5e7a45" +version = "3.2.13" + + [deps.Polynomials.extensions] + PolynomialsChainRulesCoreExt = "ChainRulesCore" + PolynomialsMakieCoreExt = "MakieCore" + PolynomialsMutableArithmeticsExt = "MutableArithmetics" + + [deps.Polynomials.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + MakieCore = "20f20a25-4f0e-4fdf-b5d1-57303727442b" + MutableArithmetics = "d8a4904e-b15c-11e9-3269-09a3773c0cb0" + +[[deps.PrecompileTools]] +deps = ["Preferences"] +git-tree-sha1 = "03b4c25b43cb84cee5c90aa9b5ea0a78fd848d2f" +uuid = "aea7be01-6a6a-4083-8856-8a6e6704d82a" +version = "1.2.0" + +[[deps.Preferences]] +deps = ["TOML"] +git-tree-sha1 = "7eb1686b4f04b82f96ed7a4ea5890a4f0c7a09f1" +uuid = "21216c6a-2e73-6563-6e65-726566657250" +version = "1.4.0" + +[[deps.Printf]] +deps = ["Unicode"] +uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" + +[[deps.ProgressMeter]] +deps = ["Distributed", "Printf"] +git-tree-sha1 = "ae36206463b2395804f2787ffe172f44452b538d" +uuid = "92933f4c-e287-5a05-a399-4b506db050ca" +version = "1.8.0" + +[[deps.QOI]] +deps = ["ColorTypes", "FileIO", "FixedPointNumbers"] +git-tree-sha1 = "18e8f4d1426e965c7b532ddd260599e1510d26ce" +uuid = "4b34888f-f399-49d4-9bb3-47ed5cae4e65" +version = "1.0.0" + +[[deps.Quaternions]] +deps = ["LinearAlgebra", "Random", "RealDot"] +git-tree-sha1 = "da095158bdc8eaccb7890f9884048555ab771019" +uuid = "94ee1d12-ae83-5a48-8b1c-48b8ff168ae0" +version = "0.7.4" + +[[deps.REPL]] +deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] +uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" + +[[deps.Random]] +deps = ["SHA", "Serialization"] +uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" + +[[deps.RangeArrays]] +git-tree-sha1 = "b9039e93773ddcfc828f12aadf7115b4b4d225f5" +uuid = "b3c3ace0-ae52-54e7-9d0b-2c1406fd6b9d" +version = "0.3.2" + +[[deps.Ratios]] +deps = ["Requires"] +git-tree-sha1 = "1342a47bf3260ee108163042310d26f2be5ec90b" +uuid = "c84ed2f1-dad5-54f0-aa8e-dbefe2724439" +version = "0.4.5" +weakdeps = ["FixedPointNumbers"] + + [deps.Ratios.extensions] + RatiosFixedPointNumbersExt = "FixedPointNumbers" + +[[deps.RealDot]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "9f0a1b71baaf7650f4fa8a1d168c7fb6ee41f0c9" +uuid = "c1ae055f-0cd5-4b69-90a6-9a35b1a98df9" +version = "0.1.0" + +[[deps.RecipesBase]] +deps = ["PrecompileTools"] +git-tree-sha1 = "5c3d09cc4f31f5fc6af001c250bf1278733100ff" +uuid = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" +version = "1.3.4" + +[[deps.Reexport]] +git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" +uuid = "189a3867-3050-52da-a836-e630ba90ab69" +version = "1.2.2" + +[[deps.RegionTrees]] +deps = ["IterTools", "LinearAlgebra", "StaticArrays"] +git-tree-sha1 = "4618ed0da7a251c7f92e869ae1a19c74a7d2a7f9" +uuid = "dee08c22-ab7f-5625-9660-a9af2021b33f" +version = "0.3.2" + +[[deps.Requires]] +deps = ["UUIDs"] +git-tree-sha1 = "838a3a4188e2ded87a4f9f184b4b0d78a1e91cb7" +uuid = "ae029012-a4dd-5104-9daa-d747884805df" +version = "1.3.0" + +[[deps.Rotations]] +deps = ["LinearAlgebra", "Quaternions", "Random", "StaticArrays"] +git-tree-sha1 = "54ccb4dbab4b1f69beb255a2c0ca5f65a9c82f08" +uuid = "6038ab10-8711-5258-84ad-4b1120ba62dc" +version = "1.5.1" + +[[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 = "4b8586aece42bee682399c4c4aee95446aa5cd19" +uuid = "476501e8-09a2-5ece-8869-fb82de89a1fa" +version = "0.6.39" + +[[deps.Serialization]] +uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" + +[[deps.SharedArrays]] +deps = ["Distributed", "Mmap", "Random", "Serialization"] +uuid = "1a1011a3-84de-559e-8e89-a11a2f7dc383" + +[[deps.SimpleTraits]] +deps = ["InteractiveUtils", "MacroTools"] +git-tree-sha1 = "5d7e3f4e11935503d3ecaf7186eac40602e7d231" +uuid = "699a6c99-e7fa-54fc-8d76-47d257e15c1d" +version = "0.9.4" + +[[deps.SimpleWeightedGraphs]] +deps = ["Graphs", "LinearAlgebra", "Markdown", "SparseArrays"] +git-tree-sha1 = "4b33e0e081a825dbfaf314decf58fa47e53d6acb" +uuid = "47aef6b3-ad0c-573a-a1e2-d07658019622" +version = "1.4.0" + +[[deps.Sixel]] +deps = ["Dates", "FileIO", "ImageCore", "IndirectArrays", "OffsetArrays", "REPL", "libsixel_jll"] +git-tree-sha1 = "2da10356e31327c7096832eb9cd86307a50b1eb6" +uuid = "45858cf5-a6b0-47a3-bbea-62219f50df47" +version = "0.1.3" + +[[deps.SnoopPrecompile]] +deps = ["Preferences"] +git-tree-sha1 = "e760a70afdcd461cf01a575947738d359234665c" +uuid = "66db9d55-30c0-4569-8b51-7e840670fc0c" +version = "1.0.3" + +[[deps.Sockets]] +uuid = "6462fe0b-24de-5631-8697-dd941f90decc" + +[[deps.SortingAlgorithms]] +deps = ["DataStructures"] +git-tree-sha1 = "c60ec5c62180f27efea3ba2908480f8055e17cee" +uuid = "a2af1166-a08f-5f64-846c-94a0d3cef48c" +version = "1.1.1" + +[[deps.SparseArrays]] +deps = ["Libdl", "LinearAlgebra", "Random", "Serialization", "SuiteSparse_jll"] +uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + +[[deps.StackViews]] +deps = ["OffsetArrays"] +git-tree-sha1 = "46e589465204cd0c08b4bd97385e4fa79a0c770c" +uuid = "cae243ae-269e-4f55-b966-ac2d0dc13c15" +version = "0.1.1" + +[[deps.Static]] +deps = ["IfElse"] +git-tree-sha1 = "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 = "03fec6800a986d191f64f5c0996b59ed526eda25" +uuid = "0d7ed370-da01-4f52-bd93-41d350b8b718" +version = "1.4.1" +weakdeps = ["OffsetArrays", "StaticArrays"] + + [deps.StaticArrayInterface.extensions] + StaticArrayInterfaceOffsetArraysExt = "OffsetArrays" + StaticArrayInterfaceStaticArraysExt = "StaticArrays" + +[[deps.StaticArrays]] +deps = ["LinearAlgebra", "Random", "StaticArraysCore"] +git-tree-sha1 = "9cabadf6e7cd2349b6cf49f1915ad2028d65e881" +uuid = "90137ffa-7385-5640-81b9-e52037218182" +version = "1.6.2" +weakdeps = ["Statistics"] + + [deps.StaticArrays.extensions] + StaticArraysStatisticsExt = "Statistics" + +[[deps.StaticArraysCore]] +git-tree-sha1 = "36b3d696ce6366023a0ea192b4cd442268995a0d" +uuid = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" +version = "1.4.2" + +[[deps.Statistics]] +deps = ["LinearAlgebra", "SparseArrays"] +uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" +version = "1.9.0" + +[[deps.StatsAPI]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "45a7769a04a3cf80da1c1c7c60caf932e6f4c9f7" +uuid = "82ae8749-77ed-4fe6-ae5f-f523153014b0" +version = "1.6.0" + +[[deps.StatsBase]] +deps = ["DataAPI", "DataStructures", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"] +git-tree-sha1 = "75ebe04c5bed70b91614d684259b661c9e6274a4" +uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" +version = "0.34.0" + +[[deps.SuiteSparse]] +deps = ["Libdl", "LinearAlgebra", "Serialization", "SparseArrays"] +uuid = "4607b0f0-06f3-5cda-b6b1-a6196a1729e9" + +[[deps.SuiteSparse_jll]] +deps = ["Artifacts", "Libdl", "Pkg", "libblastrampoline_jll"] +uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c" +version = "5.10.1+6" + +[[deps.TOML]] +deps = ["Dates"] +uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" +version = "1.0.3" + +[[deps.Tar]] +deps = ["ArgTools", "SHA"] +uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" +version = "1.10.0" + +[[deps.TensorCore]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "1feb45f88d133a655e001435632f019a9a1bcdb6" +uuid = "62fd8b95-f654-4bbd-a8a5-9c27f68ccd50" +version = "0.1.1" + +[[deps.Test]] +deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] +uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[[deps.ThreadingUtilities]] +deps = ["ManualMemory"] +git-tree-sha1 = "eda08f7e9818eb53661b3deb74e3159460dfbc27" +uuid = "8290d209-cae3-49c0-8002-c8c24d57dab5" +version = "0.5.2" + +[[deps.TiffImages]] +deps = ["ColorTypes", "DataStructures", "DocStringExtensions", "FileIO", "FixedPointNumbers", "IndirectArrays", "Inflate", "Mmap", "OffsetArrays", "PkgVersion", "ProgressMeter", "UUIDs"] +git-tree-sha1 = "8621f5c499a8aa4aa970b1ae381aae0ef1576966" +uuid = "731e570b-9d59-4bfa-96dc-6df516fadf69" +version = "0.6.4" + +[[deps.TiledIteration]] +deps = ["OffsetArrays", "StaticArrayInterface"] +git-tree-sha1 = "1176cc31e867217b06928e2f140c90bd1bc88283" +uuid = "06e1c1a7-607b-532d-9fad-de7d9aa2abac" +version = "0.5.0" + +[[deps.TranscodingStreams]] +deps = ["Random", "Test"] +git-tree-sha1 = "9a6ae7ed916312b41236fcef7e0af564ef934769" +uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa" +version = "0.9.13" + +[[deps.Tricks]] +git-tree-sha1 = "aadb748be58b492045b4f56166b5188aa63ce549" +uuid = "410a4b4d-49e4-4fbc-ab6d-cb71b17b3775" +version = "0.1.7" + +[[deps.URIs]] +git-tree-sha1 = "b7a5e99f24892b6824a954199a45e9ffcc1c70f0" +uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" +version = "1.5.0" + +[[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.VectorizationBase]] +deps = ["ArrayInterface", "CPUSummary", "HostCPUFeatures", "IfElse", "LayoutPointers", "Libdl", "LinearAlgebra", "SIMDTypes", "Static", "StaticArrayInterface"] +git-tree-sha1 = "b182207d4af54ac64cbc71797765068fdeff475d" +uuid = "3d5dd08c-fd9d-11e8-17fa-ed2836048c2f" +version = "0.21.64" + +[[deps.WoodburyMatrices]] +deps = ["LinearAlgebra", "SparseArrays"] +git-tree-sha1 = "de67fa59e33ad156a590055375a30b23c40299d3" +uuid = "efce3f68-66dc-5838-9240-27a6d6f5f9b6" +version = "0.5.5" + +[[deps.Zlib_jll]] +deps = ["Libdl"] +uuid = "83775a58-1f1d-513f-b197-d71354ab007a" +version = "1.2.13+0" + +[[deps.Zstd_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "49ce682769cd5de6c72dcf1b94ed7790cd08974c" +uuid = "3161d3a3-bdf6-5164-811a-617609db77b4" +version = "1.5.5+0" + +[[deps.libblastrampoline_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" +version = "5.8.0+0" + +[[deps.libpng_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] +git-tree-sha1 = "94d180a6d2b5e55e447e2d27a29ed04fe79eb30c" +uuid = "b53b4c65-9356-5827-b1ea-8c7a1a84506f" +version = "1.6.38+0" + +[[deps.libsixel_jll]] +deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Pkg", "libpng_jll"] +git-tree-sha1 = "d4f63314c8aa1e48cd22aa0c17ed76cd1ae48c3c" +uuid = "075b6546-f08a-558a-be8f-8157d0f608a5" +version = "1.10.3+0" + +[[deps.nghttp2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" +version = "1.48.0+0" + +[[deps.p7zip_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" +version = "17.4.0+0" +""" + +# ╔═║ Cell order: +# β•Ÿβ”€5ef51c3a-70a7-11eb-2023-31113399a57f +# β•Ÿβ”€60ae819a-70a7-11eb-31d4-750c7f5dc6ca +# β•Ÿβ”€792c6a62-ec41-11ea-01f3-73e7eee23cc7 +# ╠═da1d65a0-ec42-11ea-0141-334c9eeeb035 +# β•Ÿβ”€ef1bfa16-70ea-11eb-189c-a54db292cd6f +# ╠═0504ac94-70ee-11eb-1c4e-977d9e7d35c9 +# β•Ÿβ”€6fcac482-70ee-11eb-0b80-ff41c708053b +# ╠═0b1668ba-ec42-11ea-3e50-ed97c5b17ced +# β•Ÿβ”€637975a0-72f6-4284-bf88-df1a039859ef +# ╠═960ad23c-14ab-4a0b-9591-926e529e538c +# ╠═4c866972-f588-4233-b44b-36871eac6ceb +# β•Ÿβ”€a4316001-1c58-47e5-992e-b7fe9ed00ba3 +# β•Ÿβ”€9ebc079a-70f0-11eb-07d9-f9e80f3f4584 +# ╠═b2239b96-70ef-11eb-0b85-21ecab25dc9f +# ╠═4251f668-70aa-11eb-3d89-35f8d53b7d9b +# ╠═f1568d10-ec41-11ea-3dd2-a9cb273ce5b8 +# ╠═ab02d850-ec41-11ea-10b2-a1b600b12658 +# β•Ÿβ”€f6886d90-70ed-11eb-07c4-471ee267e7c1 +# β•Ÿβ”€15f7f90a-70f0-11eb-0d41-63677e4023f4 +# β•Ÿβ”€bd6ae241-5ad0-4660-895b-492ec7716c7f +# β•Ÿβ”€d637f69c-e388-4d45-9611-31d1563c9c14 +# β•Ÿβ”€3c1a3cf8-70f8-11eb-3c18-375207f321eb +# ╠═19f4ddb0-ec44-11ea-20b9-5d97fb2b1cf4 +# ╠═424f5f10-ec44-11ea-076d-f3cba4435e0c +# ╠═71ac08ea-7145-11eb-237d-5506adfb9533 +# ╠═5363a400-ec44-11ea-284e-d13a8872551c +# β•Ÿβ”€ee43d808-70fa-11eb-0cc6-337279f41494 +# β•Ÿβ”€263a8a0a-70ee-11eb-236d-c941ba63dff3 +# β•Ÿβ”€52461588-ea1a-4e7d-aec2-3de388d31656 +# ╠═1a2a9000-ec43-11ea-3f39-8312ea286a92 +# β•Ÿβ”€00000000-0000-0000-0000-000000000001 +# β•Ÿβ”€00000000-0000-0000-0000-000000000002 diff --git a/notebooks/1_abstraction.plutostate b/notebooks/1_abstraction.plutostate new file mode 100644 index 0000000..77098e2 Binary files /dev/null and b/notebooks/1_abstraction.plutostate differ diff --git a/notebooks/1_hyperbolic_corgi.html b/notebooks/1_hyperbolic_corgi.html new file mode 100644 index 0000000..2ebfd7b --- /dev/null +++ b/notebooks/1_hyperbolic_corgi.html @@ -0,0 +1,16 @@ + + + + + + +
\ No newline at end of file diff --git a/notebooks/1_hyperbolic_corgi.jl b/notebooks/1_hyperbolic_corgi.jl new file mode 100644 index 0000000..c204650 --- /dev/null +++ b/notebooks/1_hyperbolic_corgi.jl @@ -0,0 +1,1869 @@ +### A Pluto.jl notebook ### +# v0.19.27 + +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 + +# ╔═║ 81f4b64e-2b9c-11ed-019a-fb5ad22925bc +using PlutoUI, FileIO, Images, Plots + +# ╔═║ d6bdc777-e55c-42aa-8adc-0a53b885cf3b +TableOfContents(title="πŸ“š Table of Contents", indent=true, depth=4, aside=true) + +# ╔═║ e4c56119-24c7-4572-b0e6-7626f3acc4c0 +md"# Make mathematics your playground (with software)!" + +# ╔═║ 192cee86-fb75-4ca9-832d-e413630ecf50 +md"## 1. Grab a favorite photo" + +# ╔═║ cd0f944a-d476-4f4b-95cf-d78884bb461a +begin + url = "https://raw.githubusercontent.com/mitmath/JuliaComputation/756ee73e14dd4e27bb9a1ac2ca7c415d241366b4/notebooks/20220422_philip.jpg" + bigphil = load(download(url)) + smallphil = imresize(bigphil, (400, 300)) + pic = smallphil +end + +# ╔═║ 12db97b2-d610-4e84-9bba-84f3c86fdebc +md"## 2. Transform the Corgi!" + +# ╔═║ 9d9ca208-8124-4992-a623-b6568340df79 +md"ΞΈ=$(@bind ΞΈ Slider(-360:10:360;default=0, show_value=true)) degrees" + +# ╔═║ 8dd287b7-52f4-4793-bb8c-7452016808ad +md"## 3. Math Transformations" + +# ╔═║ 4f22047e-6017-435e-b9b4-a3f084cedcf6 +begin + translate(Ξ±,Ξ²) = ((x, y),) -> [x+Ξ±, y+Ξ²] + + scale(Ξ±) = ((x, y),) -> [Ξ±*x, Ξ±*y] + swap((x, y)) = [y, x] + flipy((x, y)) = [x, -y] + + rotate(ΞΈ) = ((x, y),) -> [cos(ΞΈ)*x + sin(ΞΈ)*y, -sin(ΞΈ)*x + cos(ΞΈ)*y] + hyperbolic_rotate(ΞΈ) = ((x, y),) -> [cosh(ΞΈ)*x + sinh(ΞΈ)*y, sinh(ΞΈ)*x + cosh(ΞΈ)*y] + nonlin_shear(ΞΈ) = ((x, y),) -> [x, y + ΞΈ*x^2] + warp(ΞΈ) = ((x, y),) -> rotate(ΞΈ*√(x^2+y^2))([x, y]) +end + +# ╔═║ 4fff63cc-7872-4498-9a40-fecab32c0672 +md"## 4. Image Transformations" + +# ╔═║ 96a678e6-c430-44b6-acce-661425b0cd01 +begin + + xy_to_ij((x,y),img::AbstractMatrix) = xy_to_ij((x,y),size(img)) + + function xy_to_ij((x,y),(rows,cols)) + m = max(cols, rows) + Ο† = translate(rows/2, cols/2) ∘ swap ∘ flipy ∘ scale(m/2) + i,j = floor.(Int, Ο†((x,y))) + end + + function ij_to_xy( (i,j), m) + Ο† = scale(2/m) ∘ flipy ∘ swap ∘ translate(-m/2,-m/2) + Ο†((i,j)) + end + +end + +# ╔═║ 9c1cab17-7ff5-44a2-9d6f-391aa8933d1a +md"## 5. Get Pixel " + +# ╔═║ 83a7a441-724e-4002-95b6-17e3f0f075ff +begin + black(c::RGB) = RGB(0,0,0) + black(c::RGBA) = RGBA(0,0,0,0.75) + + + function getpixel(img,i::Int,j::Int) + # grab image color or default + rows, cols = size(img) + + if 1 ≀ i ≀ rows && 1 ≀ j ≀ cols + img[i, j] + else + black(img[1,1]) # or default to black + end + end +end + +# ╔═║ c13ee678-f15e-45b8-b871-4a4abab5d615 +md"## 6. Code to Transform" + +# ╔═║ 0064e7bd-3a9e-4f4b-802d-09fb8d221499 +function transform_image(T,pic,pixels=800) + + [ + begin + x, y = ij_to_xy((i,j), pixels) + X, Y = T((x,y)) + i, j = xy_to_ij((X,Y),pic) + getpixel(pic,i,j) + end + + for i = 1:pixels, j = 1:pixels + ] +end + +# ╔═║ d44608ba-6294-41e4-a2b5-f525f3ed4aa2 +begin + # T = rotate(ΞΈ*Ο€/180) + # T = hyperbolic_rotate(ΞΈ/100) + # T = nonlin_shear(ΞΈ) + T = warp(ΞΈ/10) ## Corgi in the Washing Machine + + plot(transform_image(T,pic), axis=nothing, size=(800,800)) + + plot!(xlims=(0,800),ylims=(0,800)) + + # red circle + t = (0:.01:1).*(2Ο€) + plot!( 400 .+310 .*cos.(t), 400 .+ 310 .* sin.(t), color=:red, lw=10) + + # green hyperbolas + t= -10:.01:10 + s = 80 + plot!( 400 .+s .*cosh.(t), 400 .+ s .* sinh.(t), color=:green, lw=10) + plot!( 400 .-s .*cosh.(t), 400 .+ s .* sinh.(t), color=:green, lw=10) + plot!( 400 .+s .*sinh.(t), 400 .+ s .* cosh.(t), color=:green, lw=10) + plot!( 400 .-s .*sinh.(t), 400 .- s .* cosh.(t), color=:green, lw=10, legend=false) +end + +# ╔═║ 00000000-0000-0000-0000-000000000001 +PLUTO_PROJECT_TOML_CONTENTS = """ +[deps] +FileIO = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" +Images = "916415d5-f1e6-5110-898d-aaa5f9f070e0" +Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" +PlutoUI = "7f904dfe-b85e-4ff6-b463-dae2292396a8" + +[compat] +FileIO = "~1.16.1" +Images = "~0.26.0" +Plots = "~1.39.0" +PlutoUI = "~0.7.52" +""" + +# ╔═║ 00000000-0000-0000-0000-000000000002 +PLUTO_MANIFEST_TOML_CONTENTS = """ +# This file is machine-generated - editing it directly is not advised + +julia_version = "1.9.3" +manifest_format = "2.0" +project_hash = "6debf5789a41002606ead803a494713db0359556" + +[[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 = "91bd53c39b9cbfb5ef4b015e8b582d344532bd0a" +uuid = "6e696c72-6542-2067-7265-42206c756150" +version = "1.2.0" + +[[deps.Adapt]] +deps = ["LinearAlgebra", "Requires"] +git-tree-sha1 = "76289dc51920fdc6e0013c872ba9551d54961c24" +uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" +version = "3.6.2" +weakdeps = ["StaticArrays"] + + [deps.Adapt.extensions] + AdaptStaticArraysExt = "StaticArrays" + +[[deps.ArgTools]] +uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" +version = "1.1.1" + +[[deps.ArnoldiMethod]] +deps = ["LinearAlgebra", "Random", "StaticArrays"] +git-tree-sha1 = "62e51b39331de8911e4a7ff6f5aaf38a5f4cc0ae" +uuid = "ec485272-7323-5ecc-a04f-4719b315124d" +version = "0.2.0" + +[[deps.ArrayInterface]] +deps = ["Adapt", "LinearAlgebra", "Requires", "SparseArrays", "SuiteSparse"] +git-tree-sha1 = "f83ec24f76d4c8f525099b2ac475fc098138ec31" +uuid = "4fba245c-0d91-5ea0-9b3e-6abc04ee57a9" +version = "7.4.11" + + [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.ArrayInterfaceCore]] +deps = ["LinearAlgebra", "SnoopPrecompile", "SparseArrays", "SuiteSparse"] +git-tree-sha1 = "e5f08b5689b1aad068e01751889f2f615c7db36d" +uuid = "30b0a656-2188-435a-8636-2ec0e6a096e2" +version = "0.1.29" + +[[deps.Artifacts]] +uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" + +[[deps.AxisAlgorithms]] +deps = ["LinearAlgebra", "Random", "SparseArrays", "WoodburyMatrices"] +git-tree-sha1 = "66771c8d21c8ff5e3a93379480a2307ac36863f7" +uuid = "13072b0f-2c55-5437-9ae7-d433b7a33950" +version = "1.0.1" + +[[deps.AxisArrays]] +deps = ["Dates", "IntervalSets", "IterTools", "RangeArrays"] +git-tree-sha1 = "16351be62963a67ac4083f748fdb3cca58bfd52f" +uuid = "39de3d68-74b9-583c-8d2d-e117c070f3a9" +version = "0.4.7" + +[[deps.Base64]] +uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" + +[[deps.BitFlags]] +git-tree-sha1 = "43b1a4a8f797c1cddadf60499a8a077d4af2cd2d" +uuid = "d1d4a3ce-64b1-5f1a-9ba4-7e7e69966f35" +version = "0.1.7" + +[[deps.BitTwiddlingConvenienceFunctions]] +deps = ["Static"] +git-tree-sha1 = "0c5f81f47bbbcf4aea7b2959135713459170798b" +uuid = "62783981-4cbd-42fc-bca8-16325de8dc4b" +version = "0.1.5" + +[[deps.Bzip2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "19a35467a82e236ff51bc17a3a44b69ef35185a2" +uuid = "6e34b625-4abd-537c-b88f-471c36dfa7a0" +version = "1.0.8+0" + +[[deps.CEnum]] +git-tree-sha1 = "eb4cb44a499229b3b8426dcfb5dd85333951ff90" +uuid = "fa961155-64e5-5f13-b03f-caf6b980ea82" +version = "0.4.2" + +[[deps.CPUSummary]] +deps = ["CpuId", "IfElse", "PrecompileTools", "Static"] +git-tree-sha1 = "89e0654ed8c7aebad6d5ad235d6242c2d737a928" +uuid = "2a0fbf3d-bb9c-48f3-b0a9-814d99fd7ab9" +version = "0.2.3" + +[[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.CatIndices]] +deps = ["CustomUnitRanges", "OffsetArrays"] +git-tree-sha1 = "a0f80a09780eed9b1d106a1bf62041c2efc995bc" +uuid = "aafaddc9-749c-510e-ac4f-586e18779b91" +version = "0.2.2" + +[[deps.ChainRulesCore]] +deps = ["Compat", "LinearAlgebra", "SparseArrays"] +git-tree-sha1 = "e30f2f4e20f7f186dc36529910beaedc60cfa644" +uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" +version = "1.16.0" + +[[deps.CloseOpenIntervals]] +deps = ["Static", "StaticArrayInterface"] +git-tree-sha1 = "70232f82ffaab9dc52585e0dd043b5e0c6b714f1" +uuid = "fb6a15b2-703c-40df-9091-08a04967cfa9" +version = "0.1.12" + +[[deps.Clustering]] +deps = ["Distances", "LinearAlgebra", "NearestNeighbors", "Printf", "Random", "SparseArrays", "Statistics", "StatsBase"] +git-tree-sha1 = "b86ac2c5543660d238957dbde5ac04520ae977a7" +uuid = "aaaa29a8-35af-508c-8bc3-b662a17a0fe5" +version = "0.15.4" + +[[deps.CodecZlib]] +deps = ["TranscodingStreams", "Zlib_jll"] +git-tree-sha1 = "02aa26a4cf76381be7f66e020a3eddeb27b0a092" +uuid = "944b1d66-785c-5afd-91f1-9de20f533193" +version = "0.7.2" + +[[deps.ColorSchemes]] +deps = ["ColorTypes", "ColorVectorSpace", "Colors", "FixedPointNumbers", "PrecompileTools", "Random"] +git-tree-sha1 = "d9a8f86737b665e15a9641ecbac64deef9ce6724" +uuid = "35d6a980-a343-548e-a6ea-1d62b119f2f4" +version = "3.23.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" + + [deps.ColorVectorSpace.extensions] + SpecialFunctionsExt = "SpecialFunctions" + + [deps.ColorVectorSpace.weakdeps] + SpecialFunctions = "276daf66-3868-5448-9aa4-cd146d93841b" + +[[deps.Colors]] +deps = ["ColorTypes", "FixedPointNumbers", "Reexport"] +git-tree-sha1 = "fc08e5930ee9a4e03f84bfb5211cb54e7769758a" +uuid = "5ae59095-9a9b-59fe-a467-6f913c188581" +version = "0.12.10" + +[[deps.Compat]] +deps = ["UUIDs"] +git-tree-sha1 = "e460f044ca8b99be31d35fe54fc33a5c33dd8ed7" +uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" +version = "4.9.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+0" + +[[deps.ComputationalResources]] +git-tree-sha1 = "52cb3ec90e8a8bea0e62e275ba577ad0f74821f7" +uuid = "ed09eef8-17a6-5b46-8889-db040fac31e3" +version = "0.3.2" + +[[deps.ConcurrentUtilities]] +deps = ["Serialization", "Sockets"] +git-tree-sha1 = "5372dbbf8f0bdb8c700db5367132925c0771ef7e" +uuid = "f0e56b4a-5159-44fe-b623-3e5288b988bb" +version = "2.2.1" + +[[deps.Contour]] +git-tree-sha1 = "d05d9e7b7aedff4e5b51a029dced05cfb6125781" +uuid = "d38c429a-6771-53c6-b99e-75d170b6e991" +version = "0.6.2" + +[[deps.CoordinateTransformations]] +deps = ["LinearAlgebra", "StaticArrays"] +git-tree-sha1 = "f9d7112bfff8a19a3a4ea4e03a8e6a91fe8456bf" +uuid = "150eb455-5306-5404-9cee-2592286d6298" +version = "0.6.3" + +[[deps.CpuId]] +deps = ["Markdown"] +git-tree-sha1 = "fcbb72b032692610bfbdb15018ac16a36cf2e406" +uuid = "adafc99b-e345-5852-983c-f28acb93d879" +version = "0.3.1" + +[[deps.CustomUnitRanges]] +git-tree-sha1 = "1a3f97f907e6dd8983b744d2642651bb162a3f7a" +uuid = "dc8bdbbb-1ca9-579f-8c36-e416f6a65cce" +version = "1.0.2" + +[[deps.DataAPI]] +git-tree-sha1 = "8da84edb865b0b5b0100c0666a9bc9a0b71c553c" +uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a" +version = "1.15.0" + +[[deps.DataStructures]] +deps = ["Compat", "InteractiveUtils", "OrderedCollections"] +git-tree-sha1 = "3dbd312d370723b6bb43ba9d02fc36abade4518d" +uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" +version = "0.18.15" + +[[deps.Dates]] +deps = ["Printf"] +uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" + +[[deps.DelimitedFiles]] +deps = ["Mmap"] +git-tree-sha1 = "9e2f36d3c96a820c678f2f1f1782582fcf685bae" +uuid = "8bb1440f-4735-579b-a4ab-409b98df4dab" +version = "1.9.1" + +[[deps.Distances]] +deps = ["LinearAlgebra", "Statistics", "StatsAPI"] +git-tree-sha1 = "b6def76ffad15143924a2199f72a5cd883a2e8a9" +uuid = "b4f34e82-e78d-54a5-968a-f98e89d6e8f7" +version = "0.10.9" +weakdeps = ["SparseArrays"] + + [deps.Distances.extensions] + DistancesSparseArraysExt = "SparseArrays" + +[[deps.Distributed]] +deps = ["Random", "Serialization", "Sockets"] +uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" + +[[deps.DocStringExtensions]] +deps = ["LibGit2"] +git-tree-sha1 = "2fb1e02f2b635d0845df5d7c167fec4dd739b00d" +uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" +version = "0.9.3" + +[[deps.Downloads]] +deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] +uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" +version = "1.6.0" + +[[deps.ExceptionUnwrapping]] +deps = ["Test"] +git-tree-sha1 = "e90caa41f5a86296e014e148ee061bd6c3edec96" +uuid = "460bff9d-24e4-43bc-9d9f-a8973cb893f4" +version = "0.1.9" + +[[deps.Expat_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "4558ab818dcceaab612d1bb8c19cee87eda2b83c" +uuid = "2e619515-83b5-522b-bb60-26c02a35a201" +version = "2.5.0+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", "Pkg", "Zlib_jll", "libaom_jll", "libass_jll", "libfdk_aac_jll", "libvorbis_jll", "x264_jll", "x265_jll"] +git-tree-sha1 = "74faea50c1d007c85837327f6775bea60b5492dd" +uuid = "b22a6f82-2f65-5046-a5b2-351ab43fb4e5" +version = "4.4.2+2" + +[[deps.FFTViews]] +deps = ["CustomUnitRanges", "FFTW"] +git-tree-sha1 = "cbdf14d1e8c7c8aacbe8b19862e0179fd08321c2" +uuid = "4f61f5a4-77b1-5117-aa51-3ab5ef4ef0cd" +version = "0.3.2" + +[[deps.FFTW]] +deps = ["AbstractFFTs", "FFTW_jll", "LinearAlgebra", "MKL_jll", "Preferences", "Reexport"] +git-tree-sha1 = "b4fbdd20c889804969571cc589900803edda16b7" +uuid = "7a1cc6ca-52ef-59f5-83cd-3a7055c09341" +version = "1.7.1" + +[[deps.FFTW_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "c6033cc3892d0ef5bb9cd29b7f2f0331ea5184ea" +uuid = "f5851436-0d7a-5f13-b9de-f02708fd171a" +version = "3.3.10+0" + +[[deps.FileIO]] +deps = ["Pkg", "Requires", "UUIDs"] +git-tree-sha1 = "299dc33549f68299137e51e6d49a13b5b1da9673" +uuid = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" +version = "1.16.1" + +[[deps.FileWatching]] +uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" + +[[deps.FixedPointNumbers]] +deps = ["Statistics"] +git-tree-sha1 = "335bfdceacc84c5cdf16aadc768aa5ddfc5383cc" +uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" +version = "0.8.4" + +[[deps.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.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.GLFW_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libglvnd_jll", "Pkg", "Xorg_libXcursor_jll", "Xorg_libXi_jll", "Xorg_libXinerama_jll", "Xorg_libXrandr_jll"] +git-tree-sha1 = "d972031d28c8c8d9d7b41a536ad7bb0c2579caca" +uuid = "0656b61e-2033-5cc2-a64a-77c0f6c09b89" +version = "3.3.8+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 = "8e2d86e06ceb4580110d9e716be26658effc5bfd" +uuid = "28b8d3ca-fb5f-59d9-8090-bfdbd6d07a71" +version = "0.72.8" + +[[deps.GR_jll]] +deps = ["Artifacts", "Bzip2_jll", "Cairo_jll", "FFMPEG_jll", "Fontconfig_jll", "GLFW_jll", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Libtiff_jll", "Pixman_jll", "Qt5Base_jll", "Zlib_jll", "libpng_jll"] +git-tree-sha1 = "da121cbdc95b065da07fbb93638367737969693f" +uuid = "d2c73de3-f751-5644-a686-071e5b155ba9" +version = "0.72.8+0" + +[[deps.Gettext_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Libiconv_jll", "Pkg", "XML2_jll"] +git-tree-sha1 = "9b02998aba7bf074d14de89f9d37ca24a1a0b046" +uuid = "78b55507-aeef-58d4-861c-77aaff3498b1" +version = "0.21.0+0" + +[[deps.Glib_jll]] +deps = ["Artifacts", "Gettext_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Libiconv_jll", "Libmount_jll", "PCRE2_jll", "Pkg", "Zlib_jll"] +git-tree-sha1 = "d3b3624125c1474292d0d8ed0f65554ac37ddb23" +uuid = "7746bdde-850d-59dc-9ae8-88ece973131d" +version = "2.74.0+2" + +[[deps.Graphics]] +deps = ["Colors", "LinearAlgebra", "NaNMath"] +git-tree-sha1 = "d61890399bc535850c4bf08e4e0d3a7ad0f21cbd" +uuid = "a2bd30eb-e257-5431-a919-1863eab51364" +version = "1.1.2" + +[[deps.Graphite2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "344bf40dcab1073aca04aa0df4fb092f920e4011" +uuid = "3b182d85-2403-5c21-9c21-1e1f0cc25472" +version = "1.3.14+0" + +[[deps.Graphs]] +deps = ["ArnoldiMethod", "Compat", "DataStructures", "Distributed", "Inflate", "LinearAlgebra", "Random", "SharedArrays", "SimpleTraits", "SparseArrays", "Statistics"] +git-tree-sha1 = "1cf1d7dcb4bc32d7b4a5add4232db3750c27ecb4" +uuid = "86223c79-3864-5bf0-83f7-82e725a168b6" +version = "1.8.0" + +[[deps.Grisu]] +git-tree-sha1 = "53bb909d1151e57e2484c3d1b53e19552b887fb2" +uuid = "42e2da0e-8278-4e71-bc24-59509adca0fe" +version = "1.0.2" + +[[deps.HTTP]] +deps = ["Base64", "CodecZlib", "ConcurrentUtilities", "Dates", "ExceptionUnwrapping", "Logging", "LoggingExtras", "MbedTLS", "NetworkOptions", "OpenSSL", "Random", "SimpleBufferStream", "Sockets", "URIs", "UUIDs"] +git-tree-sha1 = "cb56ccdd481c0dd7f975ad2b3b62d9eda088f7e2" +uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3" +version = "1.9.14" + +[[deps.HarfBuzz_jll]] +deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "Graphite2_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Pkg"] +git-tree-sha1 = "129acf094d168394e80ee1dc4bc06ec835e510a3" +uuid = "2e76f6c2-a576-52d4-95c1-20adfe4de566" +version = "2.8.1+1" + +[[deps.HistogramThresholding]] +deps = ["ImageBase", "LinearAlgebra", "MappedArrays"] +git-tree-sha1 = "7194dfbb2f8d945abdaf68fa9480a965d6661e69" +uuid = "2c695a8d-9458-5d45-9878-1b8a99cf7853" +version = "0.3.1" + +[[deps.HostCPUFeatures]] +deps = ["BitTwiddlingConvenienceFunctions", "IfElse", "Libdl", "Static"] +git-tree-sha1 = "eb8fed28f4994600e29beef49744639d985a04b2" +uuid = "3e5b6fbb-0976-4d2c-9146-d79de83f2fb0" +version = "0.1.16" + +[[deps.Hyperscript]] +deps = ["Test"] +git-tree-sha1 = "8d511d5b81240fc8e6802386302675bdf47737b9" +uuid = "47d2ed2b-36de-50cf-bf87-49c2cf4b8b91" +version = "0.0.4" + +[[deps.HypertextLiteral]] +deps = ["Tricks"] +git-tree-sha1 = "c47c5fa4c5308f27ccaac35504858d8914e102f9" +uuid = "ac1192a8-f4b3-4bfe-ba22-af5b92cd3ab2" +version = "0.9.4" + +[[deps.IOCapture]] +deps = ["Logging", "Random"] +git-tree-sha1 = "d75853a0bdbfb1ac815478bacd89cd27b550ace6" +uuid = "b5f81e59-6552-4d32-b1f0-c071b021bf89" +version = "0.2.3" + +[[deps.IfElse]] +git-tree-sha1 = "debdd00ffef04665ccbb3e150747a77560e8fad1" +uuid = "615f187c-cbe4-4ef1-ba3b-2fcf58d6d173" +version = "0.1.1" + +[[deps.ImageAxes]] +deps = ["AxisArrays", "ImageBase", "ImageCore", "Reexport", "SimpleTraits"] +git-tree-sha1 = "2e4520d67b0cef90865b3ef727594d2a58e0e1f8" +uuid = "2803e5a7-5153-5ecf-9a86-9b4c37f5f5ac" +version = "0.6.11" + +[[deps.ImageBase]] +deps = ["ImageCore", "Reexport"] +git-tree-sha1 = "eb49b82c172811fd2c86759fa0553a2221feb909" +uuid = "c817782e-172a-44cc-b673-b171935fbb9e" +version = "0.1.7" + +[[deps.ImageBinarization]] +deps = ["HistogramThresholding", "ImageCore", "LinearAlgebra", "Polynomials", "Reexport", "Statistics"] +git-tree-sha1 = "f5356e7203c4a9954962e3757c08033f2efe578a" +uuid = "cbc4b850-ae4b-5111-9e64-df94c024a13d" +version = "0.3.0" + +[[deps.ImageContrastAdjustment]] +deps = ["ImageBase", "ImageCore", "ImageTransformations", "Parameters"] +git-tree-sha1 = "eb3d4365a10e3f3ecb3b115e9d12db131d28a386" +uuid = "f332f351-ec65-5f6a-b3d1-319c6670881a" +version = "0.3.12" + +[[deps.ImageCore]] +deps = ["AbstractFFTs", "ColorVectorSpace", "Colors", "FixedPointNumbers", "MappedArrays", "MosaicViews", "OffsetArrays", "PaddedViews", "PrecompileTools", "Reexport"] +git-tree-sha1 = "fc5d1d3443a124fde6e92d0260cd9e064eba69f8" +uuid = "a09fc81d-aa75-5fe9-8630-4744c3626534" +version = "0.10.1" + +[[deps.ImageCorners]] +deps = ["ImageCore", "ImageFiltering", "PrecompileTools", "StaticArrays", "StatsBase"] +git-tree-sha1 = "24c52de051293745a9bad7d73497708954562b79" +uuid = "89d5987c-236e-4e32-acd0-25bd6bd87b70" +version = "0.1.3" + +[[deps.ImageDistances]] +deps = ["Distances", "ImageCore", "ImageMorphology", "LinearAlgebra", "Statistics"] +git-tree-sha1 = "08b0e6354b21ef5dd5e49026028e41831401aca8" +uuid = "51556ac3-7006-55f5-8cb3-34580c88182d" +version = "0.2.17" + +[[deps.ImageFiltering]] +deps = ["CatIndices", "ComputationalResources", "DataStructures", "FFTViews", "FFTW", "ImageBase", "ImageCore", "LinearAlgebra", "OffsetArrays", "PrecompileTools", "Reexport", "SparseArrays", "StaticArrays", "Statistics", "TiledIteration"] +git-tree-sha1 = "432ae2b430a18c58eb7eca9ef8d0f2db90bc749c" +uuid = "6a3955dd-da59-5b1f-98d4-e7296123deb5" +version = "0.7.8" + +[[deps.ImageIO]] +deps = ["FileIO", "IndirectArrays", "JpegTurbo", "LazyModules", "Netpbm", "OpenEXR", "PNGFiles", "QOI", "Sixel", "TiffImages", "UUIDs"] +git-tree-sha1 = "bca20b2f5d00c4fbc192c3212da8fa79f4688009" +uuid = "82e4d734-157c-48bb-816b-45c225c6df19" +version = "0.6.7" + +[[deps.ImageMagick]] +deps = ["FileIO", "ImageCore", "ImageMagick_jll", "InteractiveUtils"] +git-tree-sha1 = "b0b765ff0b4c3ee20ce6740d843be8dfce48487c" +uuid = "6218d12a-5da1-5696-b52f-db25d2ecc6d1" +version = "1.3.0" + +[[deps.ImageMagick_jll]] +deps = ["JpegTurbo_jll", "Libdl", "Libtiff_jll", "Pkg", "Zlib_jll", "libpng_jll"] +git-tree-sha1 = "1c0a2295cca535fabaf2029062912591e9b61987" +uuid = "c73af94c-d91f-53ed-93a7-00f77d67a9d7" +version = "6.9.10-12+3" + +[[deps.ImageMetadata]] +deps = ["AxisArrays", "ImageAxes", "ImageBase", "ImageCore"] +git-tree-sha1 = "355e2b974f2e3212a75dfb60519de21361ad3cb7" +uuid = "bc367c6b-8a6b-528e-b4bd-a4b897500b49" +version = "0.9.9" + +[[deps.ImageMorphology]] +deps = ["DataStructures", "ImageCore", "LinearAlgebra", "LoopVectorization", "OffsetArrays", "Requires", "TiledIteration"] +git-tree-sha1 = "6f0a801136cb9c229aebea0df296cdcd471dbcd1" +uuid = "787d08f9-d448-5407-9aad-5290dd7ab264" +version = "0.4.5" + +[[deps.ImageQualityIndexes]] +deps = ["ImageContrastAdjustment", "ImageCore", "ImageDistances", "ImageFiltering", "LazyModules", "OffsetArrays", "PrecompileTools", "Statistics"] +git-tree-sha1 = "783b70725ed326340adf225be4889906c96b8fd1" +uuid = "2996bd0c-7a13-11e9-2da2-2f5ce47296a9" +version = "0.3.7" + +[[deps.ImageSegmentation]] +deps = ["Clustering", "DataStructures", "Distances", "Graphs", "ImageCore", "ImageFiltering", "ImageMorphology", "LinearAlgebra", "MetaGraphs", "RegionTrees", "SimpleWeightedGraphs", "StaticArrays", "Statistics"] +git-tree-sha1 = "3ff0ca203501c3eedde3c6fa7fd76b703c336b5f" +uuid = "80713f31-8817-5129-9cf8-209ff8fb23e1" +version = "1.8.2" + +[[deps.ImageShow]] +deps = ["Base64", "ColorSchemes", "FileIO", "ImageBase", "ImageCore", "OffsetArrays", "StackViews"] +git-tree-sha1 = "3b5344bcdbdc11ad58f3b1956709b5b9345355de" +uuid = "4e3cecfd-b093-5904-9786-8bbb286a6a31" +version = "0.3.8" + +[[deps.ImageTransformations]] +deps = ["AxisAlgorithms", "CoordinateTransformations", "ImageBase", "ImageCore", "Interpolations", "OffsetArrays", "Rotations", "StaticArrays"] +git-tree-sha1 = "7ec124670cbce8f9f0267ba703396960337e54b5" +uuid = "02fcd773-0e25-5acc-982a-7f6622650795" +version = "0.10.0" + +[[deps.Images]] +deps = ["Base64", "FileIO", "Graphics", "ImageAxes", "ImageBase", "ImageBinarization", "ImageContrastAdjustment", "ImageCore", "ImageCorners", "ImageDistances", "ImageFiltering", "ImageIO", "ImageMagick", "ImageMetadata", "ImageMorphology", "ImageQualityIndexes", "ImageSegmentation", "ImageShow", "ImageTransformations", "IndirectArrays", "IntegralArrays", "Random", "Reexport", "SparseArrays", "StaticArrays", "Statistics", "StatsBase", "TiledIteration"] +git-tree-sha1 = "d438268ed7a665f8322572be0dabda83634d5f45" +uuid = "916415d5-f1e6-5110-898d-aaa5f9f070e0" +version = "0.26.0" + +[[deps.Imath_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "3d09a9f60edf77f8a4d99f9e015e8fbf9989605d" +uuid = "905a6f67-0a94-5f89-b386-d35d92009cd1" +version = "3.1.7+0" + +[[deps.IndirectArrays]] +git-tree-sha1 = "012e604e1c7458645cb8b436f8fba789a51b257f" +uuid = "9b13fd28-a010-5f03-acff-a1bbcff69959" +version = "1.0.0" + +[[deps.Inflate]] +git-tree-sha1 = "5cd07aab533df5170988219191dfad0519391428" +uuid = "d25df0c9-e2be-5dd7-82c8-3ad0b3e990b9" +version = "0.1.3" + +[[deps.IntegralArrays]] +deps = ["ColorTypes", "FixedPointNumbers", "IntervalSets"] +git-tree-sha1 = "be8e690c3973443bec584db3346ddc904d4884eb" +uuid = "1d092043-8f09-5a30-832f-7509e371ab51" +version = "0.1.5" + +[[deps.IntelOpenMP_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "ad37c091f7d7daf900963171600d7c1c5c3ede32" +uuid = "1d5cc7b8-4909-519e-a0f8-d0f5ad9712d0" +version = "2023.2.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 = "721ec2cf720536ad005cb38f50dbba7b02419a15" +uuid = "a98d9a8b-a2ab-59e6-89dd-64a1c18fca59" +version = "0.14.7" + +[[deps.IntervalSets]] +deps = ["Dates", "Random"] +git-tree-sha1 = "8e59ea773deee525c99a8018409f64f19fb719e6" +uuid = "8197267c-284f-5f27-9208-e0e47529a953" +version = "0.7.7" +weakdeps = ["Statistics"] + + [deps.IntervalSets.extensions] + IntervalSetsStatisticsExt = "Statistics" + +[[deps.IrrationalConstants]] +git-tree-sha1 = "630b497eafcc20001bba38a4651b327dcfc491d2" +uuid = "92d709cd-6900-40b7-9082-c6be49f344b6" +version = "0.2.2" + +[[deps.IterTools]] +git-tree-sha1 = "4ced6667f9974fc5c5943fa5e2ef1ca43ea9e450" +uuid = "c8e1da08-722c-5040-9ed9-7db0dc04731e" +version = "1.8.0" + +[[deps.JLD2]] +deps = ["FileIO", "MacroTools", "Mmap", "OrderedCollections", "Pkg", "Printf", "Reexport", "Requires", "TranscodingStreams", "UUIDs"] +git-tree-sha1 = "aa6ffef1fd85657f4999030c52eaeec22a279738" +uuid = "033835bb-8acc-5ee8-8aae-3f567f8a3819" +version = "0.4.33" + +[[deps.JLFzf]] +deps = ["Pipe", "REPL", "Random", "fzf_jll"] +git-tree-sha1 = "f377670cda23b6b7c1c0b3893e37451c5c1a2185" +uuid = "1019f520-868f-41f5-a6de-eb00f4b6a39c" +version = "0.1.5" + +[[deps.JLLWrappers]] +deps = ["Artifacts", "Preferences"] +git-tree-sha1 = "7e5d6779a1e09a36db2a7b6cff50942a0a7d0fca" +uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" +version = "1.5.0" + +[[deps.JSON]] +deps = ["Dates", "Mmap", "Parsers", "Unicode"] +git-tree-sha1 = "31e996f0a15c7b280ba9f76636b3ff9e2ae58c9a" +uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" +version = "0.21.4" + +[[deps.JpegTurbo]] +deps = ["CEnum", "FileIO", "ImageCore", "JpegTurbo_jll", "TOML"] +git-tree-sha1 = "327713faef2a3e5c80f96bf38d1fa26f7a6ae29e" +uuid = "b835a17e-a41a-41e7-81f0-2f016b05efe0" +version = "0.1.3" + +[[deps.JpegTurbo_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "6f2675ef130a300a112286de91973805fcc5ffbc" +uuid = "aacddb02-875f-59d6-b918-886e6ef4fbf8" +version = "2.1.91+0" + +[[deps.LAME_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "f6250b16881adf048549549fba48b1161acdac8c" +uuid = "c1c5ebd0-6772-5130-a774-d5fcae4a789d" +version = "3.100.1+0" + +[[deps.LERC_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "bf36f528eec6634efc60d7ec062008f171071434" +uuid = "88015f11-f218-50d7-93a8-a6af411a945d" +version = "3.0.0+1" + +[[deps.LLVMOpenMP_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "f689897ccbe049adb19a065c495e75f372ecd42b" +uuid = "1d63c593-3942-5779-bab2-d838dc0a180e" +version = "15.0.4+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 = "f2355693d6778a178ade15952b7ac47a4ff97996" +uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" +version = "1.3.0" + +[[deps.Latexify]] +deps = ["Formatting", "InteractiveUtils", "LaTeXStrings", "MacroTools", "Markdown", "OrderedCollections", "Printf", "Requires"] +git-tree-sha1 = "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 = "88b8f66b604da079a627b6fb2860d3704a6729a1" +uuid = "10f19ff3-798f-405d-979b-55457f8fc047" +version = "0.1.14" + +[[deps.LazyArtifacts]] +deps = ["Artifacts", "Pkg"] +uuid = "4af54fe1-eca0-43a8-85a7-787d91b784e3" + +[[deps.LazyModules]] +git-tree-sha1 = "a560dd966b386ac9ae60bdd3a3d3a326062d3c3e" +uuid = "8cdb02fc-e678-4876-92c5-9defec4f444e" +version = "0.3.1" + +[[deps.LibCURL]] +deps = ["LibCURL_jll", "MozillaCACerts_jll"] +uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" +version = "0.6.3" + +[[deps.LibCURL_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] +uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" +version = "7.84.0+0" + +[[deps.LibGit2]] +deps = ["Base64", "NetworkOptions", "Printf", "SHA"] +uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" + +[[deps.LibSSH2_jll]] +deps = ["Artifacts", "Libdl", "MbedTLS_jll"] +uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" +version = "1.10.2+0" + +[[deps.Libdl]] +uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" + +[[deps.Libffi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "0b4a5d71f3e5200a7dff793393e09dfc2d874290" +uuid = "e9f186c6-92d2-5b65-8a66-fee21dc1b490" +version = "3.2.2+1" + +[[deps.Libgcrypt_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgpg_error_jll", "Pkg"] +git-tree-sha1 = "64613c82a59c120435c067c2b809fc61cf5166ae" +uuid = "d4300ac3-e22c-5743-9152-c294e39db1e4" +version = "1.8.7+0" + +[[deps.Libglvnd_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll", "Xorg_libXext_jll"] +git-tree-sha1 = "6f73d1dd803986947b2c750138528a999a6c7733" +uuid = "7e76a0d4-f3c7-5321-8279-8d96eeed0f29" +version = "1.6.0+0" + +[[deps.Libgpg_error_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "c333716e46366857753e273ce6a69ee0945a6db9" +uuid = "7add5ba3-2f88-524e-9cd5-f83b8a55f7b8" +version = "1.42.0+0" + +[[deps.Libiconv_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "f9557a255370125b405568f9767d6d195822a175" +uuid = "94ce4f54-9a6c-5748-9c1c-f9c7231a4531" +version = "1.17.0+0" + +[[deps.Libmount_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "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", "Pkg", "Zlib_jll", "Zstd_jll"] +git-tree-sha1 = "3eb79b0ca5764d4799c06699573fd8f533259713" +uuid = "89763e89-9b03-5906-acba-b20f662cd828" +version = "4.4.0+0" + +[[deps.Libuuid_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "7f3efec06033682db852f8b3bc3c1d2b0a0ab066" +uuid = "38a345b3-de98-5d2b-a5d3-14cd9215e700" +version = "2.36.0+0" + +[[deps.LinearAlgebra]] +deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"] +uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + +[[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 = "0d097476b6c381ab7906460ef1ef1638fbce1d91" +uuid = "e6f89c97-d47a-5376-807f-9c37f3926c36" +version = "1.0.2" + +[[deps.LoopVectorization]] +deps = ["ArrayInterface", "ArrayInterfaceCore", "CPUSummary", "CloseOpenIntervals", "DocStringExtensions", "HostCPUFeatures", "IfElse", "LayoutPointers", "LinearAlgebra", "OffsetArrays", "PolyesterWeave", "PrecompileTools", "SIMDTypes", "SLEEFPirates", "Static", "StaticArrayInterface", "ThreadingUtilities", "UnPack", "VectorizationBase"] +git-tree-sha1 = "c88a4afe1703d731b1c4fdf4e3c7e77e3b176ea2" +uuid = "bdcacae8-1622-11e9-2a5c-532679323890" +version = "0.12.165" + + [deps.LoopVectorization.extensions] + ForwardDiffExt = ["ChainRulesCore", "ForwardDiff"] + SpecialFunctionsExt = "SpecialFunctions" + + [deps.LoopVectorization.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + SpecialFunctions = "276daf66-3868-5448-9aa4-cd146d93841b" + +[[deps.MIMEs]] +git-tree-sha1 = "65f28ad4b594aebe22157d6fac869786a255b7eb" +uuid = "6c6e2e6c-3030-632d-7369-2d6c69616d65" +version = "0.1.4" + +[[deps.MKL_jll]] +deps = ["Artifacts", "IntelOpenMP_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "Pkg"] +git-tree-sha1 = "eb006abbd7041c28e0d16260e50a24f8f9104913" +uuid = "856f044c-d86e-5d09-b602-aeab76dc8ba7" +version = "2023.2.0+0" + +[[deps.MacroTools]] +deps = ["Markdown", "Random"] +git-tree-sha1 = "9ee1618cbf5240e6d4e0371d6f24065083f60c48" +uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" +version = "0.5.11" + +[[deps.ManualMemory]] +git-tree-sha1 = "bcaef4fc7a0cfe2cba636d84cda54b5e4e4ca3cd" +uuid = "d125e4d3-2237-4719-b19c-fa641b8a4667" +version = "0.1.8" + +[[deps.MappedArrays]] +git-tree-sha1 = "2dab0221fe2b0f2cb6754eaa743cc266339f527e" +uuid = "dbb5928d-eab1-5f90-85c2-b9b0edb7c900" +version = "0.4.2" + +[[deps.Markdown]] +deps = ["Base64"] +uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" + +[[deps.MbedTLS]] +deps = ["Dates", "MbedTLS_jll", "MozillaCACerts_jll", "Random", "Sockets"] +git-tree-sha1 = "03a9b9718f5682ecb107ac9f7308991db4ce395b" +uuid = "739be429-bea8-5141-9913-cc70e7f3736d" +version = "1.1.7" + +[[deps.MbedTLS_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" +version = "2.28.2+0" + +[[deps.Measures]] +git-tree-sha1 = "c13304c81eec1ed3af7fc20e75fb6b26092a1102" +uuid = "442fdcdd-2543-5da2-b0f3-8c86c306513e" +version = "0.3.2" + +[[deps.MetaGraphs]] +deps = ["Graphs", "JLD2", "Random"] +git-tree-sha1 = "1130dbe1d5276cb656f6e1094ce97466ed700e5a" +uuid = "626554b9-1ddb-594c-aa3c-2596fe9399a5" +version = "0.7.2" + +[[deps.Missings]] +deps = ["DataAPI"] +git-tree-sha1 = "f66bdc5de519e8f8ae43bdc598782d35a25b1272" +uuid = "e1d29d7a-bbdc-5cf2-9ac0-f12de2c33e28" +version = "1.1.0" + +[[deps.Mmap]] +uuid = "a63ad114-7e13-5084-954f-fe012c677804" + +[[deps.MosaicViews]] +deps = ["MappedArrays", "OffsetArrays", "PaddedViews", "StackViews"] +git-tree-sha1 = "7b86a5d4d70a9f5cdf2dacb3cbe6d251d1a61dbe" +uuid = "e94cdb99-869f-56ef-bcf0-1ae2bcbe0389" +version = "0.3.4" + +[[deps.MozillaCACerts_jll]] +uuid = "14a3606d-f60d-562e-9121-12d972cd8159" +version = "2022.10.11" + +[[deps.NaNMath]] +deps = ["OpenLibm_jll"] +git-tree-sha1 = "0877504529a3e5c3343c6f8b4c0381e57e4387e4" +uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" +version = "1.0.2" + +[[deps.NearestNeighbors]] +deps = ["Distances", "StaticArrays"] +git-tree-sha1 = "2c3726ceb3388917602169bed973dbc97f1b51a8" +uuid = "b8a86587-4115-5ab1-83bc-aa920d37bbce" +version = "0.4.13" + +[[deps.Netpbm]] +deps = ["FileIO", "ImageCore", "ImageMetadata"] +git-tree-sha1 = "d92b107dbb887293622df7697a2223f9f8176fcd" +uuid = "f09324ee-3d7c-5217-9330-fc30815ba969" +version = "1.1.1" + +[[deps.NetworkOptions]] +uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" +version = "1.2.0" + +[[deps.OffsetArrays]] +deps = ["Adapt"] +git-tree-sha1 = "2ac17d29c523ce1cd38e27785a7d23024853a4bb" +uuid = "6fe1bfb0-de20-5000-8ca7-80f57d26f881" +version = "1.12.10" + +[[deps.Ogg_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "887579a3eb005446d514ab7aeac5d1d027658b8f" +uuid = "e7412a2a-1a6e-54c0-be00-318e2571c051" +version = "1.3.5+1" + +[[deps.OpenBLAS_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] +uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" +version = "0.3.21+4" + +[[deps.OpenEXR]] +deps = ["Colors", "FileIO", "OpenEXR_jll"] +git-tree-sha1 = "327f53360fdb54df7ecd01e96ef1983536d1e633" +uuid = "52e1d378-f018-4a11-a4be-720524705ac7" +version = "0.3.2" + +[[deps.OpenEXR_jll]] +deps = ["Artifacts", "Imath_jll", "JLLWrappers", "Libdl", "Zlib_jll"] +git-tree-sha1 = "a4ca623df1ae99d09bc9868b008262d0c0ac1e4f" +uuid = "18a262bb-aa17-5467-a713-aee519bc75cb" +version = "3.1.4+0" + +[[deps.OpenLibm_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "05823500-19ac-5b8b-9628-191a04bc5112" +version = "0.8.1+0" + +[[deps.OpenSSL]] +deps = ["BitFlags", "Dates", "MozillaCACerts_jll", "OpenSSL_jll", "Sockets"] +git-tree-sha1 = "51901a49222b09e3743c65b8847687ae5fc78eb2" +uuid = "4d8831e6-92b7-49fb-bdf8-b643e874388c" +version = "1.4.1" + +[[deps.OpenSSL_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "bbb5c2115d63c2f1451cb70e5ef75e8fe4707019" +uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95" +version = "1.1.22+0" + +[[deps.Opus_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "51a08fb14ec28da2ec7a927c4337e4332c2a4720" +uuid = "91d4177d-7536-5919-b921-800302f37372" +version = "1.3.2+0" + +[[deps.OrderedCollections]] +git-tree-sha1 = "2e73fe17cac3c62ad1aebe70d44c963c3cfdc3e3" +uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" +version = "1.6.2" + +[[deps.PCRE2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "efcefdf7-47ab-520b-bdef-62a2eaa19f15" +version = "10.42.0+0" + +[[deps.PNGFiles]] +deps = ["Base64", "CEnum", "ImageCore", "IndirectArrays", "OffsetArrays", "libpng_jll"] +git-tree-sha1 = "9b02b27ac477cad98114584ff964e3052f656a0f" +uuid = "f57f5aa1-a3ce-4bc8-8ab9-96f992907883" +version = "0.4.0" + +[[deps.PaddedViews]] +deps = ["OffsetArrays"] +git-tree-sha1 = "0fac6313486baae819364c52b4f483450a9d793f" +uuid = "5432bcbf-9aad-5242-b902-cca2824c8663" +version = "0.5.12" + +[[deps.Parameters]] +deps = ["OrderedCollections", "UnPack"] +git-tree-sha1 = "34c0e9ad262e5f7fc75b10a9952ca7692cfc5fbe" +uuid = "d96e819e-fc66-5662-9728-84c9c7592b0a" +version = "0.12.3" + +[[deps.Parsers]] +deps = ["Dates", "PrecompileTools", "UUIDs"] +git-tree-sha1 = "716e24b21538abc91f6205fd1d8363f39b442851" +uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" +version = "2.7.2" + +[[deps.Pipe]] +git-tree-sha1 = "6842804e7867b115ca9de748a0cf6b364523c16d" +uuid = "b98c9c47-44ae-5843-9183-064241ee97a0" +version = "1.3.0" + +[[deps.Pixman_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LLVMOpenMP_jll", "Libdl"] +git-tree-sha1 = "64779bc4c9784fee475689a1752ef4d5747c5e87" +uuid = "30392449-352a-5448-841d-b1acce4e97dc" +version = "0.42.2+0" + +[[deps.Pkg]] +deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] +uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" +version = "1.9.2" + +[[deps.PkgVersion]] +deps = ["Pkg"] +git-tree-sha1 = "f9501cc0430a26bc3d156ae1b5b0c1b47af4d6da" +uuid = "eebad327-c553-4316-9ea0-9fa01ccd7688" +version = "0.3.3" + +[[deps.PlotThemes]] +deps = ["PlotUtils", "Statistics"] +git-tree-sha1 = "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 = "f92e1315dadf8c46561fb9396e525f7200cdc227" +uuid = "995b91a9-d308-5afd-9ec6-746e21dbc043" +version = "1.3.5" + +[[deps.Plots]] +deps = ["Base64", "Contour", "Dates", "Downloads", "FFMPEG", "FixedPointNumbers", "GR", "JLFzf", "JSON", "LaTeXStrings", "Latexify", "LinearAlgebra", "Measures", "NaNMath", "Pkg", "PlotThemes", "PlotUtils", "PrecompileTools", "Preferences", "Printf", "REPL", "Random", "RecipesBase", "RecipesPipeline", "Reexport", "RelocatableFolders", "Requires", "Scratch", "Showoff", "SparseArrays", "Statistics", "StatsBase", "UUIDs", "UnicodeFun", "UnitfulLatexify", "Unzip"] +git-tree-sha1 = "ccee59c6e48e6f2edf8a5b64dc817b6729f99eb5" +uuid = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" +version = "1.39.0" + + [deps.Plots.extensions] + FileIOExt = "FileIO" + GeometryBasicsExt = "GeometryBasics" + IJuliaExt = "IJulia" + ImageInTerminalExt = "ImageInTerminal" + UnitfulExt = "Unitful" + + [deps.Plots.weakdeps] + FileIO = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" + GeometryBasics = "5c1252a2-5f33-56bf-86c9-59e7332b4326" + IJulia = "7073ff75-c697-5162-941a-fcdaad2a7d2a" + ImageInTerminal = "d8c32880-2388-543b-8c61-d9f865259254" + Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" + +[[deps.PlutoUI]] +deps = ["AbstractPlutoDingetjes", "Base64", "ColorTypes", "Dates", "FixedPointNumbers", "Hyperscript", "HypertextLiteral", "IOCapture", "InteractiveUtils", "JSON", "Logging", "MIMEs", "Markdown", "Random", "Reexport", "URIs", "UUIDs"] +git-tree-sha1 = "e47cd150dbe0443c3a3651bc5b9cbd5576ab75b7" +uuid = "7f904dfe-b85e-4ff6-b463-dae2292396a8" +version = "0.7.52" + +[[deps.PolyesterWeave]] +deps = ["BitTwiddlingConvenienceFunctions", "CPUSummary", "IfElse", "Static", "ThreadingUtilities"] +git-tree-sha1 = "240d7170f5ffdb285f9427b92333c3463bf65bf6" +uuid = "1d0040c9-8b98-4ee7-8388-3f51789ca0ad" +version = "0.2.1" + +[[deps.Polynomials]] +deps = ["LinearAlgebra", "RecipesBase"] +git-tree-sha1 = "3aa2bb4982e575acd7583f01531f241af077b163" +uuid = "f27b6e38-b328-58d1-80ce-0feddd5e7a45" +version = "3.2.13" + + [deps.Polynomials.extensions] + PolynomialsChainRulesCoreExt = "ChainRulesCore" + PolynomialsMakieCoreExt = "MakieCore" + PolynomialsMutableArithmeticsExt = "MutableArithmetics" + + [deps.Polynomials.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + MakieCore = "20f20a25-4f0e-4fdf-b5d1-57303727442b" + MutableArithmetics = "d8a4904e-b15c-11e9-3269-09a3773c0cb0" + +[[deps.PrecompileTools]] +deps = ["Preferences"] +git-tree-sha1 = "03b4c25b43cb84cee5c90aa9b5ea0a78fd848d2f" +uuid = "aea7be01-6a6a-4083-8856-8a6e6704d82a" +version = "1.2.0" + +[[deps.Preferences]] +deps = ["TOML"] +git-tree-sha1 = "7eb1686b4f04b82f96ed7a4ea5890a4f0c7a09f1" +uuid = "21216c6a-2e73-6563-6e65-726566657250" +version = "1.4.0" + +[[deps.Printf]] +deps = ["Unicode"] +uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" + +[[deps.ProgressMeter]] +deps = ["Distributed", "Printf"] +git-tree-sha1 = "ae36206463b2395804f2787ffe172f44452b538d" +uuid = "92933f4c-e287-5a05-a399-4b506db050ca" +version = "1.8.0" + +[[deps.QOI]] +deps = ["ColorTypes", "FileIO", "FixedPointNumbers"] +git-tree-sha1 = "18e8f4d1426e965c7b532ddd260599e1510d26ce" +uuid = "4b34888f-f399-49d4-9bb3-47ed5cae4e65" +version = "1.0.0" + +[[deps.Qt5Base_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Fontconfig_jll", "Glib_jll", "JLLWrappers", "Libdl", "Libglvnd_jll", "OpenSSL_jll", "Pkg", "Xorg_libXext_jll", "Xorg_libxcb_jll", "Xorg_xcb_util_image_jll", "Xorg_xcb_util_keysyms_jll", "Xorg_xcb_util_renderutil_jll", "Xorg_xcb_util_wm_jll", "Zlib_jll", "xkbcommon_jll"] +git-tree-sha1 = "0c03844e2231e12fda4d0086fd7cbe4098ee8dc5" +uuid = "ea2cea3b-5b76-57ae-a6ef-0a8af62496e1" +version = "5.15.3+2" + +[[deps.Quaternions]] +deps = ["LinearAlgebra", "Random", "RealDot"] +git-tree-sha1 = "da095158bdc8eaccb7890f9884048555ab771019" +uuid = "94ee1d12-ae83-5a48-8b1c-48b8ff168ae0" +version = "0.7.4" + +[[deps.REPL]] +deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] +uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" + +[[deps.Random]] +deps = ["SHA", "Serialization"] +uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" + +[[deps.RangeArrays]] +git-tree-sha1 = "b9039e93773ddcfc828f12aadf7115b4b4d225f5" +uuid = "b3c3ace0-ae52-54e7-9d0b-2c1406fd6b9d" +version = "0.3.2" + +[[deps.Ratios]] +deps = ["Requires"] +git-tree-sha1 = "1342a47bf3260ee108163042310d26f2be5ec90b" +uuid = "c84ed2f1-dad5-54f0-aa8e-dbefe2724439" +version = "0.4.5" +weakdeps = ["FixedPointNumbers"] + + [deps.Ratios.extensions] + RatiosFixedPointNumbersExt = "FixedPointNumbers" + +[[deps.RealDot]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "9f0a1b71baaf7650f4fa8a1d168c7fb6ee41f0c9" +uuid = "c1ae055f-0cd5-4b69-90a6-9a35b1a98df9" +version = "0.1.0" + +[[deps.RecipesBase]] +deps = ["PrecompileTools"] +git-tree-sha1 = "5c3d09cc4f31f5fc6af001c250bf1278733100ff" +uuid = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" +version = "1.3.4" + +[[deps.RecipesPipeline]] +deps = ["Dates", "NaNMath", "PlotUtils", "PrecompileTools", "RecipesBase"] +git-tree-sha1 = "45cf9fd0ca5839d06ef333c8201714e888486342" +uuid = "01d81517-befc-4cb6-b9ec-a95719d0359c" +version = "0.6.12" + +[[deps.Reexport]] +git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" +uuid = "189a3867-3050-52da-a836-e630ba90ab69" +version = "1.2.2" + +[[deps.RegionTrees]] +deps = ["IterTools", "LinearAlgebra", "StaticArrays"] +git-tree-sha1 = "4618ed0da7a251c7f92e869ae1a19c74a7d2a7f9" +uuid = "dee08c22-ab7f-5625-9660-a9af2021b33f" +version = "0.3.2" + +[[deps.RelocatableFolders]] +deps = ["SHA", "Scratch"] +git-tree-sha1 = "90bc7a7c96410424509e4263e277e43250c05691" +uuid = "05181044-ff0b-4ac5-8273-598c1e38db00" +version = "1.0.0" + +[[deps.Requires]] +deps = ["UUIDs"] +git-tree-sha1 = "838a3a4188e2ded87a4f9f184b4b0d78a1e91cb7" +uuid = "ae029012-a4dd-5104-9daa-d747884805df" +version = "1.3.0" + +[[deps.Rotations]] +deps = ["LinearAlgebra", "Quaternions", "Random", "StaticArrays"] +git-tree-sha1 = "54ccb4dbab4b1f69beb255a2c0ca5f65a9c82f08" +uuid = "6038ab10-8711-5258-84ad-4b1120ba62dc" +version = "1.5.1" + +[[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 = "4b8586aece42bee682399c4c4aee95446aa5cd19" +uuid = "476501e8-09a2-5ece-8869-fb82de89a1fa" +version = "0.6.39" + +[[deps.Scratch]] +deps = ["Dates"] +git-tree-sha1 = "30449ee12237627992a99d5e30ae63e4d78cd24a" +uuid = "6c6a2e73-6563-6170-7368-637461726353" +version = "1.2.0" + +[[deps.Serialization]] +uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" + +[[deps.SharedArrays]] +deps = ["Distributed", "Mmap", "Random", "Serialization"] +uuid = "1a1011a3-84de-559e-8e89-a11a2f7dc383" + +[[deps.Showoff]] +deps = ["Dates", "Grisu"] +git-tree-sha1 = "91eddf657aca81df9ae6ceb20b959ae5653ad1de" +uuid = "992d4aef-0814-514b-bc4d-f2e9a6c4116f" +version = "1.0.3" + +[[deps.SimpleBufferStream]] +git-tree-sha1 = "874e8867b33a00e784c8a7e4b60afe9e037b74e1" +uuid = "777ac1f9-54b0-4bf8-805c-2214025038e7" +version = "1.1.0" + +[[deps.SimpleTraits]] +deps = ["InteractiveUtils", "MacroTools"] +git-tree-sha1 = "5d7e3f4e11935503d3ecaf7186eac40602e7d231" +uuid = "699a6c99-e7fa-54fc-8d76-47d257e15c1d" +version = "0.9.4" + +[[deps.SimpleWeightedGraphs]] +deps = ["Graphs", "LinearAlgebra", "Markdown", "SparseArrays"] +git-tree-sha1 = "4b33e0e081a825dbfaf314decf58fa47e53d6acb" +uuid = "47aef6b3-ad0c-573a-a1e2-d07658019622" +version = "1.4.0" + +[[deps.Sixel]] +deps = ["Dates", "FileIO", "ImageCore", "IndirectArrays", "OffsetArrays", "REPL", "libsixel_jll"] +git-tree-sha1 = "2da10356e31327c7096832eb9cd86307a50b1eb6" +uuid = "45858cf5-a6b0-47a3-bbea-62219f50df47" +version = "0.1.3" + +[[deps.SnoopPrecompile]] +deps = ["Preferences"] +git-tree-sha1 = "e760a70afdcd461cf01a575947738d359234665c" +uuid = "66db9d55-30c0-4569-8b51-7e840670fc0c" +version = "1.0.3" + +[[deps.Sockets]] +uuid = "6462fe0b-24de-5631-8697-dd941f90decc" + +[[deps.SortingAlgorithms]] +deps = ["DataStructures"] +git-tree-sha1 = "c60ec5c62180f27efea3ba2908480f8055e17cee" +uuid = "a2af1166-a08f-5f64-846c-94a0d3cef48c" +version = "1.1.1" + +[[deps.SparseArrays]] +deps = ["Libdl", "LinearAlgebra", "Random", "Serialization", "SuiteSparse_jll"] +uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + +[[deps.StackViews]] +deps = ["OffsetArrays"] +git-tree-sha1 = "46e589465204cd0c08b4bd97385e4fa79a0c770c" +uuid = "cae243ae-269e-4f55-b966-ac2d0dc13c15" +version = "0.1.1" + +[[deps.Static]] +deps = ["IfElse"] +git-tree-sha1 = "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 = "03fec6800a986d191f64f5c0996b59ed526eda25" +uuid = "0d7ed370-da01-4f52-bd93-41d350b8b718" +version = "1.4.1" +weakdeps = ["OffsetArrays", "StaticArrays"] + + [deps.StaticArrayInterface.extensions] + StaticArrayInterfaceOffsetArraysExt = "OffsetArrays" + StaticArrayInterfaceStaticArraysExt = "StaticArrays" + +[[deps.StaticArrays]] +deps = ["LinearAlgebra", "Random", "StaticArraysCore"] +git-tree-sha1 = "9cabadf6e7cd2349b6cf49f1915ad2028d65e881" +uuid = "90137ffa-7385-5640-81b9-e52037218182" +version = "1.6.2" +weakdeps = ["Statistics"] + + [deps.StaticArrays.extensions] + StaticArraysStatisticsExt = "Statistics" + +[[deps.StaticArraysCore]] +git-tree-sha1 = "36b3d696ce6366023a0ea192b4cd442268995a0d" +uuid = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" +version = "1.4.2" + +[[deps.Statistics]] +deps = ["LinearAlgebra", "SparseArrays"] +uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" +version = "1.9.0" + +[[deps.StatsAPI]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "45a7769a04a3cf80da1c1c7c60caf932e6f4c9f7" +uuid = "82ae8749-77ed-4fe6-ae5f-f523153014b0" +version = "1.6.0" + +[[deps.StatsBase]] +deps = ["DataAPI", "DataStructures", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"] +git-tree-sha1 = "75ebe04c5bed70b91614d684259b661c9e6274a4" +uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" +version = "0.34.0" + +[[deps.SuiteSparse]] +deps = ["Libdl", "LinearAlgebra", "Serialization", "SparseArrays"] +uuid = "4607b0f0-06f3-5cda-b6b1-a6196a1729e9" + +[[deps.SuiteSparse_jll]] +deps = ["Artifacts", "Libdl", "Pkg", "libblastrampoline_jll"] +uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c" +version = "5.10.1+6" + +[[deps.TOML]] +deps = ["Dates"] +uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" +version = "1.0.3" + +[[deps.Tar]] +deps = ["ArgTools", "SHA"] +uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" +version = "1.10.0" + +[[deps.TensorCore]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "1feb45f88d133a655e001435632f019a9a1bcdb6" +uuid = "62fd8b95-f654-4bbd-a8a5-9c27f68ccd50" +version = "0.1.1" + +[[deps.Test]] +deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] +uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[[deps.ThreadingUtilities]] +deps = ["ManualMemory"] +git-tree-sha1 = "eda08f7e9818eb53661b3deb74e3159460dfbc27" +uuid = "8290d209-cae3-49c0-8002-c8c24d57dab5" +version = "0.5.2" + +[[deps.TiffImages]] +deps = ["ColorTypes", "DataStructures", "DocStringExtensions", "FileIO", "FixedPointNumbers", "IndirectArrays", "Inflate", "Mmap", "OffsetArrays", "PkgVersion", "ProgressMeter", "UUIDs"] +git-tree-sha1 = "8621f5c499a8aa4aa970b1ae381aae0ef1576966" +uuid = "731e570b-9d59-4bfa-96dc-6df516fadf69" +version = "0.6.4" + +[[deps.TiledIteration]] +deps = ["OffsetArrays", "StaticArrayInterface"] +git-tree-sha1 = "1176cc31e867217b06928e2f140c90bd1bc88283" +uuid = "06e1c1a7-607b-532d-9fad-de7d9aa2abac" +version = "0.5.0" + +[[deps.TranscodingStreams]] +deps = ["Random", "Test"] +git-tree-sha1 = "9a6ae7ed916312b41236fcef7e0af564ef934769" +uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa" +version = "0.9.13" + +[[deps.Tricks]] +git-tree-sha1 = "aadb748be58b492045b4f56166b5188aa63ce549" +uuid = "410a4b4d-49e4-4fbc-ab6d-cb71b17b3775" +version = "0.1.7" + +[[deps.URIs]] +git-tree-sha1 = "b7a5e99f24892b6824a954199a45e9ffcc1c70f0" +uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" +version = "1.5.0" + +[[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 = "a72d22c7e13fe2de562feda8645aa134712a87ee" +uuid = "1986cc42-f94f-5a68-af5c-568840ba703d" +version = "1.17.0" + + [deps.Unitful.extensions] + ConstructionBaseUnitfulExt = "ConstructionBase" + InverseFunctionsUnitfulExt = "InverseFunctions" + + [deps.Unitful.weakdeps] + ConstructionBase = "187b0558-2788-49d3-abe0-74a17ed4e7c9" + InverseFunctions = "3587e190-3f89-42d0-90ee-14403ec27112" + +[[deps.UnitfulLatexify]] +deps = ["LaTeXStrings", "Latexify", "Unitful"] +git-tree-sha1 = "e2d817cc500e960fdbafcf988ac8436ba3208bfd" +uuid = "45397f5d-5981-4c77-b2b3-fc36d6e9b728" +version = "1.6.3" + +[[deps.Unzip]] +git-tree-sha1 = "ca0969166a028236229f63514992fc073799bb78" +uuid = "41fe7b60-77ed-43a1-b4f0-825fd5a5650d" +version = "0.2.0" + +[[deps.VectorizationBase]] +deps = ["ArrayInterface", "CPUSummary", "HostCPUFeatures", "IfElse", "LayoutPointers", "Libdl", "LinearAlgebra", "SIMDTypes", "Static", "StaticArrayInterface"] +git-tree-sha1 = "b182207d4af54ac64cbc71797765068fdeff475d" +uuid = "3d5dd08c-fd9d-11e8-17fa-ed2836048c2f" +version = "0.21.64" + +[[deps.Wayland_jll]] +deps = ["Artifacts", "Expat_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Pkg", "XML2_jll"] +git-tree-sha1 = "ed8d92d9774b077c53e1da50fd81a36af3744c1c" +uuid = "a2964d1f-97da-50d4-b82a-358c7fce9d89" +version = "1.21.0+0" + +[[deps.Wayland_protocols_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "4528479aa01ee1b3b4cd0e6faef0e04cf16466da" +uuid = "2381bf8a-dfd0-557d-9999-79630e7b1b91" +version = "1.25.0+0" + +[[deps.WoodburyMatrices]] +deps = ["LinearAlgebra", "SparseArrays"] +git-tree-sha1 = "de67fa59e33ad156a590055375a30b23c40299d3" +uuid = "efce3f68-66dc-5838-9240-27a6d6f5f9b6" +version = "0.5.5" + +[[deps.XML2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Zlib_jll"] +git-tree-sha1 = "04a51d15436a572301b5abbb9d099713327e9fc4" +uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a" +version = "2.10.4+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.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_image_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] +git-tree-sha1 = "0fab0a40349ba1cba2c1da699243396ff8e94b97" +uuid = "12413925-8142-5f55-bb0e-6d7ca50bb09b" +version = "0.4.0+1" + +[[deps.Xorg_xcb_util_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libxcb_jll"] +git-tree-sha1 = "e7fd7b2881fa2eaa72717420894d3938177862d1" +uuid = "2def613f-5ad1-5310-b15b-b15d46f528f5" +version = "0.4.0+1" + +[[deps.Xorg_xcb_util_keysyms_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] +git-tree-sha1 = "d1151e2c45a544f32441a567d1690e701ec89b00" +uuid = "975044d2-76e6-5fbe-bf08-97ce7c6574c7" +version = "0.4.0+1" + +[[deps.Xorg_xcb_util_renderutil_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] +git-tree-sha1 = "dfd7a8f38d4613b6a575253b3174dd991ca6183e" +uuid = "0d47668e-0667-5a69-a72c-f761630bfb7e" +version = "0.3.9+1" + +[[deps.Xorg_xcb_util_wm_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] +git-tree-sha1 = "e78d10aab01a4a154142c5006ed44fd9e8e31b67" +uuid = "c22f9ab0-d5fe-5066-847c-f4bb1cd4e361" +version = "0.4.1+1" + +[[deps.Xorg_xkbcomp_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxkbfile_jll"] +git-tree-sha1 = "330f955bc41bb8f5270a369c473fc4a5a4e4d3cb" +uuid = "35661453-b289-5fab-8a00-3d9160c6a3a4" +version = "1.4.6+0" + +[[deps.Xorg_xkeyboard_config_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_xkbcomp_jll"] +git-tree-sha1 = "691634e5453ad362044e2ad653e79f3ee3bb98c3" +uuid = "33bec58e-1273-512f-9401-5d533626f822" +version = "2.39.0+0" + +[[deps.Xorg_xtrans_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "e92a1a012a10506618f10b7047e478403a046c77" +uuid = "c5fb5394-a638-5e4d-96e5-b29de1b5cf10" +version = "1.5.0+0" + +[[deps.Zlib_jll]] +deps = ["Libdl"] +uuid = "83775a58-1f1d-513f-b197-d71354ab007a" +version = "1.2.13+0" + +[[deps.Zstd_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "49ce682769cd5de6c72dcf1b94ed7790cd08974c" +uuid = "3161d3a3-bdf6-5164-811a-617609db77b4" +version = "1.5.5+0" + +[[deps.fzf_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "868e669ccb12ba16eaf50cb2957ee2ff61261c56" +uuid = "214eeab7-80f7-51ab-84ad-2988db7cef09" +version = "0.29.0+0" + +[[deps.libaom_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "3a2ea60308f0996d26f1e5354e10c24e9ef905d4" +uuid = "a4ae2306-e953-59d6-aa16-d00cac43593b" +version = "3.4.0+0" + +[[deps.libass_jll]] +deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] +git-tree-sha1 = "5982a94fcba20f02f42ace44b9894ee2b140fe47" +uuid = "0ac62f75-1d6f-5e53-bd7c-93b484bb37c0" +version = "0.15.1+0" + +[[deps.libblastrampoline_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" +version = "5.8.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.libpng_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] +git-tree-sha1 = "94d180a6d2b5e55e447e2d27a29ed04fe79eb30c" +uuid = "b53b4c65-9356-5827-b1ea-8c7a1a84506f" +version = "1.6.38+0" + +[[deps.libsixel_jll]] +deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Pkg", "libpng_jll"] +git-tree-sha1 = "d4f63314c8aa1e48cd22aa0c17ed76cd1ae48c3c" +uuid = "075b6546-f08a-558a-be8f-8157d0f608a5" +version = "1.10.3+0" + +[[deps.libvorbis_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Ogg_jll", "Pkg"] +git-tree-sha1 = "b910cb81ef3fe6e78bf6acee440bda86fd6ae00c" +uuid = "f27f6e37-5d2b-51aa-960f-b287f2bc3b7a" +version = "1.3.7+1" + +[[deps.nghttp2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" +version = "1.48.0+0" + +[[deps.p7zip_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" +version = "17.4.0+0" + +[[deps.x264_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "4fea590b89e6ec504593146bf8b988b2c00922b2" +uuid = "1270edf5-f2f9-52d2-97e9-ab00b5d0237a" +version = "2021.5.5+0" + +[[deps.x265_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "ee567a171cce03570d77ad3a43e90218e38937a9" +uuid = "dfaa095f-4041-5dcd-9319-2fabd8486b76" +version = "3.5.0+0" + +[[deps.xkbcommon_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Wayland_jll", "Wayland_protocols_jll", "Xorg_libxcb_jll", "Xorg_xkeyboard_config_jll"] +git-tree-sha1 = "9ebfc140cc56e8c2156a15ceac2f0302e327ac0a" +uuid = "d8fb68d0-12a3-5cfd-a85a-d49703b185fd" +version = "1.4.1+0" +""" + +# ╔═║ Cell order: +# ╠═81f4b64e-2b9c-11ed-019a-fb5ad22925bc +# ╠═d6bdc777-e55c-42aa-8adc-0a53b885cf3b +# β•Ÿβ”€e4c56119-24c7-4572-b0e6-7626f3acc4c0 +# β•Ÿβ”€192cee86-fb75-4ca9-832d-e413630ecf50 +# ╠═cd0f944a-d476-4f4b-95cf-d78884bb461a +# β•Ÿβ”€12db97b2-d610-4e84-9bba-84f3c86fdebc +# ╠═9d9ca208-8124-4992-a623-b6568340df79 +# ╠═d44608ba-6294-41e4-a2b5-f525f3ed4aa2 +# β•Ÿβ”€8dd287b7-52f4-4793-bb8c-7452016808ad +# ╠═4f22047e-6017-435e-b9b4-a3f084cedcf6 +# β•Ÿβ”€4fff63cc-7872-4498-9a40-fecab32c0672 +# ╠═96a678e6-c430-44b6-acce-661425b0cd01 +# β•Ÿβ”€9c1cab17-7ff5-44a2-9d6f-391aa8933d1a +# ╠═83a7a441-724e-4002-95b6-17e3f0f075ff +# β•Ÿβ”€c13ee678-f15e-45b8-b871-4a4abab5d615 +# ╠═0064e7bd-3a9e-4f4b-802d-09fb8d221499 +# β•Ÿβ”€00000000-0000-0000-0000-000000000001 +# β•Ÿβ”€00000000-0000-0000-0000-000000000002 diff --git a/notebooks/1_hyperbolic_corgi.plutostate b/notebooks/1_hyperbolic_corgi.plutostate new file mode 100644 index 0000000..d53e933 Binary files /dev/null and b/notebooks/1_hyperbolic_corgi.plutostate differ diff --git a/notebooks/1_images.html b/notebooks/1_images.html new file mode 100644 index 0000000..e760676 --- /dev/null +++ b/notebooks/1_images.html @@ -0,0 +1,16 @@ + + + + + + +
\ No newline at end of file diff --git a/notebooks/1_images.jl b/notebooks/1_images.jl new file mode 100644 index 0000000..ce16a29 --- /dev/null +++ b/notebooks/1_images.jl @@ -0,0 +1,1894 @@ +### A Pluto.jl notebook ### +# v0.19.27 + +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 + +# ╔═║ 74b008f6-ed6b-11ea-291f-b3791d6d1b35 +begin + using Colors, ColorVectorSpace, ImageShow, FileIO, ImageIO + using PlutoUI + using HypertextLiteral +end + +# ╔═║ e91d7926-ec6e-41e7-aba2-9dca333c8aa5 +html""" +
+ +
+

Section 1.1

+

+ Images as Data and Arrays +

+ +

Lecture Video

+
+
+
+
+
+ +""" + +# ╔═║ d07fcdb0-7afc-4a25-b68a-49fd1e3405e7 +PlutoUI.TableOfContents(aside=true) + +# ╔═║ 9b49500c-0164-4556-a17b-7595e35c5ede +md""" +#### Intializing packages + +_When running this notebook for the first time, this could take up to 15 minutes. Hang in there!_ +""" + +# ╔═║ ca1b507e-6017-11eb-34e6-6b85cd189002 +md""" +# Images as examples of data all around us +Welcome to the Computational Thinking using Julia for Real-World Problems, at MIT in Spring 2021! (and again in Fall 2022) + +The aim of this course is to bring together concepts from computer science and applied math with coding in the modern **Julia language**, and to see how to apply these techniques to study interesting applications (and of course to have fun). + +We would be pleased if students who have been interested in computer science now become interested in computational science and those interested in scientific applications learn computer science they may not see elsewhere. +... and for all students, we wish to share the value of +the Julia language as the best of both worlds. +""" + +# ╔═║ e9ff96d8-6bc1-11eb-0f6a-234b9fae047e +md""" + +## Alan's Essay: Are all programming languages the same? + +>Superficially, many programming languages are very similar. "Showoffs" will compare functional programming vs imperative programming. Others will compare compiled languages vs dynamic languages. I will avoid such fancy terms in this little essay, preferring to provide this course's pedagogical viewpoint. +> +>Generally speaking beginning programmers should learn to create "arrays" write "for loops", "conditionals", "comparisons", express mathematical formulas, etc. So why Julia at a time when Python seems to be the language of teaching, and Java and C++ so prominent in the corporate world? +> +>As you might imagine, we believe Julia is special. Oh you will still have the nitty gritty of when to use a bracket and a comma. You might have strong opinions as to whether arrays should begin with 0 or 1 (joke: some say it's time to compromise and use Β½.) Getting past these irrelevant issues, you will begin to experience one by one what makes Julia so very special. For starters, a language that runs fast is more fun. We can have you try things that would just be so slow in other languages it would be boring. We also think you will start to notice how natural Julia is, how it feels like the mathematics, and how flexible it can be. +> +>Getting to see the true value of fancy terms like multiple dispatch, strong typing, generic programming, and composable software will take a little longer, but stick with us, and you too will see why Julia is so very special. +""" + +# ╔═║ 9111db10-6bc3-11eb-38e5-cf3f58536914 +md""" +## Computer Science and Computational Science Working Together +""" + +# ╔═║ fb8a99ac-6bc1-11eb-0835-3146734a1c99 +md""" +Applications of computer science in the real world use **data**, i.e. information that we can **measure** in some way. Data take many different forms, for example: + +- Numbers that change over time (**time series**): + - Stock price each second / minute / day + - Weekly number of infections + - Earth's global average temperature + +- Video: + - The view from a window of a self-driving car + - A hurricane monitoring station + - Ultrasound e.g. prenatal + +- Images: + - Diseased versus healthy tissue in a medical scan + - Pictures of your favourite dog +""" + +# ╔═║ b795dcb4-6bc3-11eb-20ec-db2cc4b89bfb +md""" +#### Exercise: +> Think of another two examples in each category. Can you think of other categories of data? +""" + +# ╔═║ 8691e434-6bc4-11eb-07d1-8169158484e6 +md""" +Computational science can be summed up by a simplified workflow: +""" + +# ╔═║ 546db74c-6d4e-11eb-2e27-f5bed9dbd9ba +md""" +## data ⟢ input ⟢ process ⟢ model ⟢ visualize ⟢ output +""" + +# ╔═║ 6385d174-6d4e-11eb-093b-6f6fafb79f84 +md""" +$(html"
") +To use any data source, we need to **input** the data of interest, for example by downloading it, reading in the resulting file, and converting it into a form that we can use in the computer. Then we need to **process** it in some way to extract information of interest. We usually want to **visualize** the results, and we may want to **output** them, for example by saving to disc or putting them on a website. + +We often want to make a mathematical or computational **model** that can help us to understand and predict the behavior of the system of interest. + +> In this course we aim to show how programming, computer science and applied math combine to help us with these goals. +""" + +# ╔═║ 132f6596-6bc6-11eb-29f1-1b2478c929af +md""" +# Data: Images (as an example of data) +Let's start off by looking at **images** and how we can process them. +Our goal is to process the data contained in an image in some way, which we will do by developing and coding certain **algorithms**. + +Here is the the Fall 2020 version of this lecture (small variations) by 3-Blue-1-Brown (Grant Sanderson) for your reference. +""" + +# ╔═║ 635a03dd-abd7-49c8-a3d2-e68c7d83cc9b +html""" +
+""" + +# ╔═║ 9eb6efd2-6018-11eb-2db8-c3ce41d9e337 +md""" + + +If we open an image on our computer or the web and zoom in enough, we will see that it consists of many tiny squares, or **pixels** ("picture elements"). Each pixel is a block of one single colour, and the pixels are arranged in a two-dimensional square grid. + +You probably already know that these pixels are stored in a computer numerically +perhaps in some form of RGB (red,green,blue) format. This is the computer's represenation of the data. + +Note that an image is already an **approximation** of the real world -- it is a two-dimensional, discrete representation of a three-dimensional reality. + +""" + +# ╔═║ e37e4d40-6018-11eb-3e1d-093266c98507 +md""" +# Input and Visualize: loading and viewing an Image (in Julia) +""" + +# ╔═║ e1c9742a-6018-11eb-23ba-d974e57f78f9 +md""" +Let's use Julia to load actual images and play around with them. We can download images from the internet, your own file, or your own webcam. +""" + +# ╔═║ 9b004f70-6bc9-11eb-128c-914eadfc9a0e +md""" +## Downloading an image from the internet or a local file +We can use the `Images.jl` package to load an image file in three steps. +""" + +# ╔═║ 62fa19da-64c6-11eb-0038-5d40a6890cf5 +md""" +Step 1: (from internet) we specify the URL (web address) to download from: +$(html"
") +(note that Pluto places results before commands because some people believe +output is more interesting than code. This takes some getting used to.) +""" + +# ╔═║ 34ee0954-601e-11eb-1912-97dc2937fd52 +url = "https://user-images.githubusercontent.com/6933510/107239146-dcc3fd00-6a28-11eb-8c7b-41aaf6618935.png" + +# ╔═║ 9180fbcc-601e-11eb-0c22-c920dc7ee9a9 +md""" +Step 2: Now we use the aptly-named `download` function to download the image file to our own computer. (Philip is Prof. Edelman's corgi.) +""" + +# ╔═║ 34ffc3d8-601e-11eb-161c-6f9a07c5fd78 +philip_filename = download(url) # download to a local file. The filename is returned + +# ╔═║ abaaa980-601e-11eb-0f71-8ff02269b775 +md""" +Step 3: +Using the `Images.jl` package (loaded at the start of this notebook; scroll up and take a look.) we can **load** the file, which automatically converts it into usable data. We'll store the result in a variable. (Remember the code is after the output.) +""" + +# ╔═║ aafe76a6-601e-11eb-1ff5-01885c5238da +philip = load(philip_filename) + +# ╔═║ e86ed944-ee05-11ea-3e0f-d70fc73b789c +md"_Hi there Philip_" + +# ╔═║ c99d2aa8-601e-11eb-3469-497a246db17c +md""" +We see that the Pluto notebook has recognised that we created an object representing an image, and automatically displayed the resulting image of Philip, the cute Welsh Pembroke corgi and co-professor of this course. +Poor Philip will undergo quite a few transformations as we go along! +""" + +# ╔═║ 11dff4ce-6bca-11eb-1056-c1345c796ed4 +md""" +- Exercise : change the url. +- Exercise: download a file that is already on your own computer. +""" + +# ╔═║ efef3a32-6bc9-11eb-17e9-dd2171be9c21 +md""" +## Capturing an Image from your own camera +""" + +# ╔═║ e94dcc62-6d4e-11eb-3d53-ff9878f0091e +md""" +Even more fun is to use your own webcam. Try pressing the enable button below. Then +press the camera to capture an image. Kind of fun to keep pressing the button as you move your hand etc. +""" + +# ╔═║ cef1a95a-64c6-11eb-15e7-636a3621d727 +md""" +## Inspecting your data +""" + +# ╔═║ f26d9326-64c6-11eb-1166-5d82586422ed +md""" +### Image size +""" + +# ╔═║ 6f928b30-602c-11eb-1033-71d442feff93 +md""" +The first thing we might want to know is the size of the image: +""" + +# ╔═║ 75c5c85a-602c-11eb-2fb1-f7e7f2c5d04b +philip_size = size(philip) + +# ╔═║ 77f93eb8-602c-11eb-1f38-efa56cc93ca5 +md""" +Julia returns a pair of two numbers. Comparing these with the picture of the image, we see that the first number is the height, i.e. the vertical number of pixels, and the second is the width. +""" + +# ╔═║ 96b7d801-c427-4e27-ab1f-e2fd18fc24d0 +philip_height = philip_size[1] + +# ╔═║ f08d02af-6e38-4ace-8b11-7af4930b64ea +philip_width = philip_size[2] + +# ╔═║ f9244264-64c6-11eb-23a6-cfa76f8aff6d +md""" +### Locations in an image: Indexing + +Now suppose that we want to examine a piece of the image in more detail. We need some way of specifying which piece of the image we want. + +Thinking of the image as a grid of pixels, we need a way to tell the computer which pixel or group of pixels we want to refer to. +Since the image is a two-dimensional grid, we can use two integers (whole numbers) to give the coordinates of a single pixel. Specifying coordinates like this is called **indexing**: think of the index of a book, which tells you *on which page* an idea is discussed. + +In Julia we use (square) brackets, `[` and `]` for indexing: +""" + +# ╔═║ bd22d09a-64c7-11eb-146f-67733b8be241 +a_pixel = philip[200, 100] + +# ╔═║ 28860d48-64c8-11eb-240f-e1232b3638df +md""" +We see that Julia knows to draw our pixel object for us a block of the relevant color. + +When we index into an image like this, the first number indicates the *row* in the image, starting from the top, and the second the *column*, starting from the left. In Julia, the first row and column are numbered starting from 1, not from 0 as in some other programming languages. +""" + +# ╔═║ 4ef99715-4d8d-4f9d-bf0b-8df9907a14cf + + +# ╔═║ a510fc33-406e-4fb5-be83-9e4b5578717c +md""" +We can also use variables as indices... +""" + +# ╔═║ 13844ebf-52c4-47e9-bda4-106a02fad9d7 +md""" +...and these variables can be controlled by sliders! +""" + +# ╔═║ 08d61afb-c641-4aa9-b995-2552af89f3b8 +@bind row_i Slider(1:size(philip)[1], show_value=true) + +# ╔═║ 6511a498-7ac9-445b-9c15-ec02d09783fe +@bind col_i Slider(1:size(philip)[2], show_value=true) + +# ╔═║ 94b77934-713e-11eb-18cf-c5dc5e7afc5b +row_i,col_i + +# ╔═║ ff762861-b186-4eb0-9582-0ce66ca10f60 +philip[row_i, col_i] + +# ╔═║ c9ed950c-dcd9-4296-a431-ee0f36d5b557 +md""" +### Locations in an image: Range indexing + +We saw that we can use the **row number** and **column number** to index a _single pixel_ of our image. Next, we will use a **range of numbers** to index _multiple rows or columns_ at once, returning a subarray: +""" + +# ╔═║ f0796032-8105-4f6d-b5ee-3647b052f2f6 +philip[550:650, 1:philip_width] + +# ╔═║ b9be8761-a9c9-49eb-ba1b-527d12097362 +md""" +Here, we use `a:b` to mean "_all numbers between `a` and `b`_". For example: + +""" + +# ╔═║ d515286b-4ad4-449b-8967-06b9b4c87684 +collect(1:10) + +# ╔═║ eef8fbc8-8887-4628-8ba8-114575d6b91f +md""" + +You can also use a `:` without start and end to mean "_every index_" +""" + +# ╔═║ 4e6a31d6-1ef8-4a69-b346-ad58cfc4d8a5 +philip[550:650, :] + +# ╔═║ e11f0e47-02d9-48a6-9b1a-e313c18db129 +md""" +Let's get a single row of pixels: +""" + +# ╔═║ 9e447eab-14b6-45d8-83ab-1f7f1f1c70d2 +philip[550, :] + +# ╔═║ c926435c-c648-419c-9951-ac8a1d4f3b92 +philip_head = philip[470:800, 140:410] + +# ╔═║ 32e7e51c-dd0d-483d-95cb-e6043f2b2975 +md""" +#### Scroll in on Philip's nose! + +Use the widgets below (slide left and right sides). +""" + +# ╔═║ 4b64e1f2-d0ca-4e22-a89d-1d9a16bd6788 +@bind range_rows RangeSlider(1:size(philip_head)[1]) + +# ╔═║ 85919db9-1444-4904-930f-ba572cff9460 +@bind range_cols RangeSlider(1:size(philip_head)[2]) + +# ╔═║ 2ac47b91-bbc3-49ae-9bf5-4def30ff46f4 +nose = philip_head[range_rows, range_cols] + +# ╔═║ 5a0cc342-64c9-11eb-1211-f1b06d652497 +md""" +# Process: Modifying an image + +Now that we have access to image data, we can start to **process** that data to extract information and/or modify it in some way. + +We might want to detect what type of objects are in the image, say to detect whether a patient has a certain disease. To achieve a high-level goal like this, we will need to perform mid-level operations, such as detecting edges that separate different objects based on their color. And, in turn, to carry that out we will need to do low-level operations like comparing colors of neighboring pixels and somehow deciding if they are "different". + +""" + +# ╔═║ 4504577c-64c8-11eb-343b-3369b6d10d8b +md""" +## Representing colors + +We can use indexing to *modify* a pixel's color. To do so, we need a way to specify a new color. + +Color turns out to be a complicated concept, having to do with the interaction of the physical properties of light with the physiological mechanisms and mental processes by which we detect it! + +We will ignore this complexity by using a standard method of representing colours in the computer as an **RGB triple**, i.e. a triple of three numbers $(r, g, b)$, giving the amount of red, of green and of blue in a colour, respectively. These are numbers between 0 (none) and 1 (full). The final colour that we perceive is the result of "adding" the corresponding amount of light of each colour; the details are fascinating, but beyond the scope of this course! +""" + +# ╔═║ 40886d36-64c9-11eb-3c69-4b68673a6dde +md""" +We can create a new color in Julia as follows: +""" + +# ╔═║ 552235ec-64c9-11eb-1f7f-f76da2818cb3 +RGB(1.0, 0.0, 0.0) + +# ╔═║ c2907d1a-47b1-4634-8669-a68022706861 +begin + md""" + A pixel with $(@bind test_r Scrubbable(0:0.1:1; default=0.1)) red, $(@bind test_g Scrubbable(0:0.1:1; default=0.5)) green and $(@bind test_b Scrubbable(0:0.1:1; default=1.0)) blue looks like: + """ +end + + +# ╔═║ ff9eea3f-cab0-4030-8337-f519b94316c5 +RGB(test_r, test_g, test_b) + +# ╔═║ f6cc03a0-ee07-11ea-17d8-013991514d42 +md""" +#### Exercise 2.5 +πŸ‘‰ Write a function `invert` that inverts a color, i.e. sends $(r, g, b)$ to $(1 - r, 1-g, 1-b)$. +""" + +# ╔═║ 63e8d636-ee0b-11ea-173d-bd3327347d55 +function invert(color::AbstractRGB) + + return missing +end + +# ╔═║ 2cc2f84e-ee0d-11ea-373b-e7ad3204bb00 +md"Let's invert some colors:" + +# ╔═║ b8f26960-ee0a-11ea-05b9-3f4bc1099050 +black = RGB(0.0, 0.0, 0.0) + +# ╔═║ 5de3a22e-ee0b-11ea-230f-35df4ca3c96d +invert(black) + +# ╔═║ 4e21e0c4-ee0b-11ea-3d65-b311ae3f98e9 +red = RGB(0.8, 0.1, 0.1) + +# ╔═║ 6dbf67ce-ee0b-11ea-3b71-abc05a64dc43 +invert(red) + +# ╔═║ 846b1330-ee0b-11ea-3579-7d90fafd7290 +md"Can you invert the picture of Philip?" + +# ╔═║ 943103e2-ee0b-11ea-33aa-75a8a1529931 +philip_inverted = missing + +# ╔═║ 2ee543b2-64d6-11eb-3c39-c5660141787e +md""" + +## Modifying a pixel + +Let's start by seeing how to modify an image, e.g. in order to hide sensitive information. + +We do this by assigning a new value to the color of a pixel: +""" + +# ╔═║ 53bad296-4c7b-471f-b481-0e9423a9288a +let + temp = copy(philip_head) + temp[100, 200] = RGB(1.0, 0.0, 0.0) + temp +end + +# ╔═║ ab9af0f6-64c9-11eb-13d3-5dbdb75a69a7 +md""" +## Groups of pixels + +We probably want to examine and modify several pixels at once. +For example, we can extract a horizontal strip 1 pixel tall: +""" + +# ╔═║ e29b7954-64cb-11eb-2768-47de07766055 +philip_head[50, 50:100] + +# ╔═║ 8e7c4866-64cc-11eb-0457-85be566a8966 +md""" +Here, Julia is showing the strip as a collection of rectangles in a row. + + +""" + +# ╔═║ f2ad501a-64cb-11eb-1707-3365d05b300a +md""" +And then modify it: +""" + +# ╔═║ 4f03f651-56ed-4361-b954-e6848ac56089 +let + temp = copy(philip_head) + temp[50, 50:100] .= RGB(1.0, 0.0, 0.0) + temp +end + +# ╔═║ 2808339c-64cc-11eb-21d1-c76a9854aa5b +md""" +Similarly we can modify a whole rectangular block of pixels: +""" + +# ╔═║ 1bd53326-d705-4d1a-bf8f-5d7f2a4e696f +let + temp = copy(philip_head) + temp[50:100, 50:100] .= RGB(1.0, 0.0, 0.0) + temp +end + +# ╔═║ a5f8bafe-edf0-11ea-0da3-3330861ae43a +md""" +#### Exercise 1.2 + +πŸ‘‰ Generate a vector of 100 zeros. Change the center 20 elements to 1. +""" + +# ╔═║ b6b65b94-edf0-11ea-3686-fbff0ff53d08 +function create_bar() + + return missing +end + +# ╔═║ 693af19c-64cc-11eb-31f3-57ab2fbae597 +md""" +## Reducing the size of an image +""" + +# ╔═║ 6361d102-64cc-11eb-31b7-fb631b632040 +md""" +Maybe we would also like to reduce the size of this image, since it's rather large. For example, we could take every 10th row and every 10th column and make a new image from the result: +""" + +# ╔═║ ae542fe4-64cc-11eb-29fc-73b7a66314a9 +reduced_image = philip[1:10:end, 1:10:end] + +# ╔═║ c29292b8-64cc-11eb-28db-b52c46e865e6 +md""" +Note that the resulting image doesn't look very good, since we seem to have lost too much detail. + +#### Exercise + +> Think about what we might do to reduce the size of an image without losing so much detail. +""" + +# ╔═║ 7b04331a-6bcb-11eb-34fa-1f5b151e5510 +md""" +# Model: Creating synthetic images + +Think about your favorite Pixar movie (e.g. Monsters Inc.) Movie frames are images that are generated from complicated mathematical models. Ray tracing (which may be covered in this class) +is a method for making images feel realistic. +""" + +# ╔═║ 5319c03c-64cc-11eb-0743-a1612476e2d3 +md""" +# Output: Saving an image to a file + +Finally, we want to be able to save our new creation to a file. To do so, you can **right click** on a displayed image, or you can write it to a file. Fill in a path below: +""" + +# ╔═║ 3db09d92-64cc-11eb-0333-45193c0fd1fe +save("reduced_phil.png", reduced_image) + +# ╔═║ 61606acc-6bcc-11eb-2c80-69ceec9f9702 +md""" +# $(html"
") +""" + +# ╔═║ dd183eca-6018-11eb-2a83-2fcaeea62942 +md""" +# Computer science: Arrays + +An image is a concrete example of a fundamental concept in computer science, namely an **array**. + +Just as an image is a rectangular grid, where each grid cell contains a single color, +an array is a rectangular grid for storing data. Data is stored and retrieved using indexing, just as in the image examples: each cell in the grid can store a single "piece of data" of a given type. + + +## Dimension of an array + +An array can be one-dimensional, like the strip of pixels above, two-dimensional, three-dimensional, and so on. The dimension tells us the number of indices that we need to specify a unique location in the grid. +The array object also needs to know the length of the data in each dimension. + +## Names for different types of array + +One-dimensional arrays are often called **vectors** (or, in some other languages, "lists") and two-dimensional arrays are **matrices**. Higher-dimensional arrays are **tensors**. + + +## Arrays as data structures + +An array is an example of a **data structure**, i.e. a way of arranging data such that we can access it. A key theme in computer science is that of designing different data structures that represent data in different ways. + +Conceptually, we can think of an array as a block of data that has a position or location in space. This can be a useful way to arrange data if, for example, we want to represent the fact that values in nearby locations in array are somehow near to one another. + +Images are a good example of this: neighbouring pixels often represent different pieces of the same object, for example the rug or floor, or Philip himself, in the photo. We thus expect neighbouring pixels to be of a similar color. On the other hand, if they are not, this is also useful information, since that may correspond to the edge of an object. + +""" + +# ╔═║ 8ddcb286-602a-11eb-3ae0-07d3c77a0f8c +md""" +# Julia: constructing arrays + +## Creating vectors and matrices +Julia has strong support for arrays of any dimension. + +Vectors, or one-dimensional arrays, are written using square brackets and commas: +""" + +# ╔═║ f4b0aa23-2d76-4d88-b2a4-3807e88d27ce +[1, 20, "hello"] + +# ╔═║ 1b2b2b18-64d4-11eb-2d43-e31cb8bc25d1 +[RGB(1, 0, 0), RGB(0, 1, 0), RGB(0, 0, 1)] + +# ╔═║ 2b0e6450-64d4-11eb-182b-ff1bd515b56f +md""" +Matrices, or two-dimensional arrays, also use square brackets, but with spaces and new lines instead of commas: +""" + +# ╔═║ 3b2b041a-64d4-11eb-31dd-47d7321ee909 +[RGB(1, 0, 0) RGB(0, 1, 0) + RGB(0, 0, 1) RGB(0.5, 0.5, 0.5)] + +# ╔═║ 0f35603a-64d4-11eb-3baf-4fef06d82daa +md""" + +## Array comprehensions + +It's clear that if we want to create an array with more than a few elements, it will be *very* tedious to do so by hand like this. +Rather, we want to *automate* the process of creating an array by following some pattern, for example to create a whole palette of colors! + +Let's start with all the possible colors interpolating between black, `RGB(0, 0, 0)`, and red, `RGB(1, 0, 0)`. Since only one of the values is changing, we can represent this as a vector, i.e. a one-dimensional array. + +A neat method to do this is an **array comprehension**. Again we use square brackets to create an array, but now we use a **variable** that varies over a given **range** values: +""" + +# ╔═║ e69b02c6-64d6-11eb-02f1-21c4fb5d1043 +[RGB(x, 0, 0) for x in 0:0.1:1] + +# ╔═║ fce76132-64d6-11eb-259d-b130038bbae6 +md""" +Here, `0:0.1:1` is a **range**; the first and last numbers are the start and end values, and the middle number is the size of the step. +""" + +# ╔═║ 17a69736-64d7-11eb-2c6c-eb5ebf51b285 +md""" +In a similar way we can create two-dimensional matrices, by separating the two variables for each dimension with a comma (`,`): +""" + +# ╔═║ 291b04de-64d7-11eb-1ee0-d998dccb998c +[RGB(i, j, 0) for i in 0:0.1:1, j in 0:0.1:1] + +# ╔═║ 647fddf2-60ee-11eb-124d-5356c7014c3b +md""" +## Joining matrices + +We often want to join vectors and matrices together. We can do so using an extension of the array creation syntax: +""" + +# ╔═║ 7d9ad134-60ee-11eb-1b2a-a7d63f3a7a2d +[philip_head philip_head] + +# ╔═║ 8433b862-60ee-11eb-0cfc-add2b72997dc +[philip_head reverse(philip_head, dims=2) + reverse(philip_head, dims=1) rot180(philip_head)] + +# ╔═║ 5e52d12e-64d7-11eb-0905-c9038a404e24 +md""" +# Pluto: Interactivity using sliders +""" + +# ╔═║ 6aba7e62-64d7-11eb-2c49-7944e9e2b94b +md""" +Suppose we want to see the effect of changing the number of colors in our vector or matrix. We could, of course, do so by manually fiddling with the range. + +It would be nice if we could do so using a **user interface**, for example with a **slider**. Fortunately, the Pluto notebook allows us to do so! +""" + +# ╔═║ afc66dac-64d7-11eb-1ad0-7f62c20ffefb +md""" +We can define a slider using +""" + +# ╔═║ b37c9868-64d7-11eb-3033-a7b5d3065f7f +@bind number_reds Slider(1:100, show_value=true) + +# ╔═║ b1dfe122-64dc-11eb-1104-1b8852b2c4c5 +md""" +[The `Slider` type is defined in the `PlutoUI.jl` package.] +""" + +# ╔═║ cfc55140-64d7-11eb-0ff6-e59c70d01d67 +md""" +This creates a new variable called `number_reds`, whose value is the value shown by the slider. When we move the slider, the value of the variable gets updated. Since Pluto is a **reactive** notebook, other cells which use the value of this variable will *automatically be updated too*! +""" + +# ╔═║ fca72490-64d7-11eb-1464-f5e0582c4d18 +md""" +Let's use this to make a slider for our one-dimensional collection of reds: +""" + +# ╔═║ 88933746-6028-11eb-32de-13eb6ff43e29 +[RGB(red_value / number_reds, 0, 0) for red_value in 0:number_reds] + +# ╔═║ 1c539b02-64d8-11eb-3505-c9288357d139 +md""" +When you move the slider, you should see the number of red color patches change! +""" + +# ╔═║ 10f6e6da-64d8-11eb-366f-11f16e73043b +md""" +What is going on here is that we are creating a vector in which `red_value` takes each value in turn from the range from `0` up to the current value of `number_reds`. If we change `number_reds`, then we create a new vector with that new number of red patches. +""" + +# ╔═║ 82a8314c-64d8-11eb-1acb-e33625381178 +md""" +#### Exercise + +> Make three sliders with variables `r`, `g` and `b`. Then make a single color patch with the RGB color given by those values. +""" + +# ╔═║ 576d5e3a-64d8-11eb-10c9-876be31f7830 +md""" +We can do the same to create different size matrices, by creating two sliders, one for reds and one for greens. Try it out! +""" + +# ╔═║ ace86c8a-60ee-11eb-34ef-93c54abc7b1a +md""" +# Summary +""" + +# ╔═║ b08e57e4-60ee-11eb-0e1a-2f49c496668b +md""" +Let's summarize the main ideas from this notebook: +- Images are **arrays** of colors +- We can inspect and modify arrays using **indexing** +- We can create arrays directly or using **array comprehensions** +""" + +# ╔═║ 9025a5b4-6066-11eb-20e8-099e9b8f859e +md""" +---- +""" + +# ╔═║ 5da8cbe8-eded-11ea-2e43-c5b7cc71e133 +begin + colored_line(x::Vector{<:Real}) = Gray.(Float64.((hcat(x)'))) + colored_line(x::Any) = nothing +end + +# ╔═║ d862fb16-edf1-11ea-36ec-615d521e6bc0 +colored_line(create_bar()) + +# ╔═║ e074560a-601b-11eb-340e-47acd64f03b2 +hint(text) = Markdown.MD(Markdown.Admonition("hint", "Hint", [text])) + +# ╔═║ e0776548-601b-11eb-2563-57ba2cf1d5d1 +almost(text) = Markdown.MD(Markdown.Admonition("warning", "Almost there!", [text])) + +# ╔═║ e083bef6-601b-11eb-2134-e3063d5c4253 +still_missing(text=md"Replace `missing` with your answer.") = Markdown.MD(Markdown.Admonition("warning", "Here we go!", [text])) + +# ╔═║ e08ecb84-601b-11eb-0e25-152ed3a262f7 +keep_working(text=md"The answer is not quite right.") = Markdown.MD(Markdown.Admonition("danger", "Keep working on it!", [text])) + +# ╔═║ e09036a4-601b-11eb-1a8b-ef70105ab91c +yays = [md"Great!", md"Yay ❀", md"Great! πŸŽ‰", md"Well done!", md"Keep it up!", md"Good job!", md"Awesome!", md"You got the right answer!", md"Let's move on to the next section."] + +# ╔═║ e09af1a2-601b-11eb-14c8-57a46546f6ce +correct(text=rand(yays)) = Markdown.MD(Markdown.Admonition("correct", "Got it!", [text])) + +# ╔═║ e0a4fc10-601b-11eb-211d-03570aca2726 +not_defined(variable_name) = Markdown.MD(Markdown.Admonition("danger", "Oopsie!", [md"Make sure that you define a variable called **$(Markdown.Code(string(variable_name)))**"])) + +# ╔═║ e3394c8a-edf0-11ea-1bb8-619f7abb6881 +if !@isdefined(create_bar) + not_defined(:create_bar) +else + let + result = create_bar() + if ismissing(result) + still_missing() + elseif isnothing(result) + keep_working(md"Did you forget to write `return`?") + elseif !(result isa Vector) || length(result) != 100 + keep_working(md"The result should be a `Vector` with 100 elements.") + elseif result[[1,50,100]] != [0,1,0] + keep_working() + else + correct() + end + end +end + +# ╔═║ e0a6031c-601b-11eb-27a5-65140dd92897 +bigbreak = html"




"; + +# ╔═║ 45815734-ee0a-11ea-2982-595e1fc0e7b1 +bigbreak + +# ╔═║ e0b15582-601b-11eb-26d6-bbf708933bc8 +function camera_input(;max_size=150, default_url="https://i.imgur.com/SUmi94P.png") +""" + + + +
+
+ + +
+ +
+ +
+
+ +
+ + Enable webcam + +
+ + +
+""" |> HTML +end + +# ╔═║ d6742ea0-1106-4f3c-a5b8-a31a48d33f19 +@bind webcam_data1 camera_input() + +# ╔═║ 2a94a2cf-b697-4b0b-afd0-af2e35af2bb1 +@bind webcam_data camera_input() + +# ╔═║ e891fce0-601b-11eb-383b-bde5b128822e + +function process_raw_camera_data(raw_camera_data) + # the raw image data is a long byte array, we need to transform it into something + # more "Julian" - something with more _structure_. + + # The encoding of the raw byte stream is: + # every 4 bytes is a single pixel + # every pixel has 4 values: Red, Green, Blue, Alpha + # (we ignore alpha for this notebook) + + # So to get the red values for each pixel, we take every 4th value, starting at + # the 1st: + reds_flat = UInt8.(raw_camera_data["data"][1:4:end]) + greens_flat = UInt8.(raw_camera_data["data"][2:4:end]) + blues_flat = UInt8.(raw_camera_data["data"][3:4:end]) + + # but these are still 1-dimensional arrays, nicknamed 'flat' arrays + # We will 'reshape' this into 2D arrays: + + width = raw_camera_data["width"] + height = raw_camera_data["height"] + + # shuffle and flip to get it in the right shape + reds = reshape(reds_flat, (width, height))' / 255.0 + greens = reshape(greens_flat, (width, height))' / 255.0 + blues = reshape(blues_flat, (width, height))' / 255.0 + + # we have our 2D array for each color + # Let's create a single 2D array, where each value contains the R, G and B value of + # that pixel + + RGB.(reds, greens, blues) +end + +# ╔═║ 1d7375b7-7ea6-4d67-ab73-1c69d6b8b87f +myface1 = process_raw_camera_data(webcam_data1); + +# ╔═║ 6224c74b-8915-4983-abf0-30e6ba04a46d +[ + myface1 myface1[ : , end:-1:1] + myface1[end:-1:1, :] myface1[end:-1:1, end:-1:1] +] + +# ╔═║ 3e0ece65-b8a7-4be7-ae44-6d7210c2e15b +myface = process_raw_camera_data(webcam_data); + +# ╔═║ 4ee18bee-13e6-4478-b2ca-ab66100e57ec +[ + myface myface[ : , end:-1:1] + myface[end:-1:1, :] myface[end:-1:1, end:-1:1] +] + +# ╔═║ 3ef77236-1867-4d02-8af2-ff4777fcd6d9 +exercise_css = html""" + + +""" + +# ╔═║ 61b29e7d-5aba-4bc8-870b-c1c43919c236 +exercise(x, number="") = +@htl(""" + +

Exercise $(number)

+
$(x) +
+
+ """) + +# ╔═║ a9fef6c9-e911-4d8c-b141-a4832b40a260 +quick_question(x, number, options, correct) = let + name = join(rand('a':'z',16)) +@htl(""" + +

Quick Question $(number)

+
$(x) + + $(map(enumerate(options)) do (i, o) + @htl("$(o)") + end) + +
+
+ """) +end + +# ╔═║ edf900be-601b-11eb-0456-3f7cfc5e876b +md"_Lecture 1, Spring 2021, version 0_" + +# ╔═║ 00000000-0000-0000-0000-000000000001 +PLUTO_PROJECT_TOML_CONTENTS = """ +[deps] +ColorVectorSpace = "c3611d14-8923-5661-9e6a-0046d554d3a4" +Colors = "5ae59095-9a9b-59fe-a467-6f913c188581" +FileIO = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" +HypertextLiteral = "ac1192a8-f4b3-4bfe-ba22-af5b92cd3ab2" +ImageIO = "82e4d734-157c-48bb-816b-45c225c6df19" +ImageShow = "4e3cecfd-b093-5904-9786-8bbb286a6a31" +PlutoUI = "7f904dfe-b85e-4ff6-b463-dae2292396a8" + +[compat] +ColorVectorSpace = "~0.10.0" +Colors = "~0.12.10" +FileIO = "~1.16.1" +HypertextLiteral = "~0.9.4" +ImageIO = "~0.6.7" +ImageShow = "~0.3.8" +PlutoUI = "~0.7.52" +""" + +# ╔═║ 00000000-0000-0000-0000-000000000002 +PLUTO_MANIFEST_TOML_CONTENTS = """ +# This file is machine-generated - editing it directly is not advised + +julia_version = "1.9.3" +manifest_format = "2.0" +project_hash = "b7661e9c20df6473b907287fa6a176a7fe5c2988" + +[[deps.AbstractFFTs]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "d92ad398961a3ed262d8bf04a1a2b8340f915fef" +uuid = "621f4979-c628-5d54-868e-fcf4e3e8185c" +version = "1.5.0" + + [deps.AbstractFFTs.extensions] + AbstractFFTsChainRulesCoreExt = "ChainRulesCore" + AbstractFFTsTestExt = "Test" + + [deps.AbstractFFTs.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[[deps.AbstractPlutoDingetjes]] +deps = ["Pkg"] +git-tree-sha1 = "91bd53c39b9cbfb5ef4b015e8b582d344532bd0a" +uuid = "6e696c72-6542-2067-7265-42206c756150" +version = "1.2.0" + +[[deps.Adapt]] +deps = ["LinearAlgebra", "Requires"] +git-tree-sha1 = "76289dc51920fdc6e0013c872ba9551d54961c24" +uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" +version = "3.6.2" + + [deps.Adapt.extensions] + AdaptStaticArraysExt = "StaticArrays" + + [deps.Adapt.weakdeps] + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + +[[deps.ArgTools]] +uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" +version = "1.1.1" + +[[deps.Artifacts]] +uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" + +[[deps.AxisArrays]] +deps = ["Dates", "IntervalSets", "IterTools", "RangeArrays"] +git-tree-sha1 = "16351be62963a67ac4083f748fdb3cca58bfd52f" +uuid = "39de3d68-74b9-583c-8d2d-e117c070f3a9" +version = "0.4.7" + +[[deps.Base64]] +uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" + +[[deps.CEnum]] +git-tree-sha1 = "eb4cb44a499229b3b8426dcfb5dd85333951ff90" +uuid = "fa961155-64e5-5f13-b03f-caf6b980ea82" +version = "0.4.2" + +[[deps.ColorSchemes]] +deps = ["ColorTypes", "ColorVectorSpace", "Colors", "FixedPointNumbers", "PrecompileTools", "Random"] +git-tree-sha1 = "d9a8f86737b665e15a9641ecbac64deef9ce6724" +uuid = "35d6a980-a343-548e-a6ea-1d62b119f2f4" +version = "3.23.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" + + [deps.ColorVectorSpace.extensions] + SpecialFunctionsExt = "SpecialFunctions" + + [deps.ColorVectorSpace.weakdeps] + SpecialFunctions = "276daf66-3868-5448-9aa4-cd146d93841b" + +[[deps.Colors]] +deps = ["ColorTypes", "FixedPointNumbers", "Reexport"] +git-tree-sha1 = "fc08e5930ee9a4e03f84bfb5211cb54e7769758a" +uuid = "5ae59095-9a9b-59fe-a467-6f913c188581" +version = "0.12.10" + +[[deps.Compat]] +deps = ["UUIDs"] +git-tree-sha1 = "e460f044ca8b99be31d35fe54fc33a5c33dd8ed7" +uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" +version = "4.9.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+0" + +[[deps.DataStructures]] +deps = ["Compat", "InteractiveUtils", "OrderedCollections"] +git-tree-sha1 = "3dbd312d370723b6bb43ba9d02fc36abade4518d" +uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" +version = "0.18.15" + +[[deps.Dates]] +deps = ["Printf"] +uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" + +[[deps.Distributed]] +deps = ["Random", "Serialization", "Sockets"] +uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" + +[[deps.DocStringExtensions]] +deps = ["LibGit2"] +git-tree-sha1 = "2fb1e02f2b635d0845df5d7c167fec4dd739b00d" +uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" +version = "0.9.3" + +[[deps.Downloads]] +deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] +uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" +version = "1.6.0" + +[[deps.FileIO]] +deps = ["Pkg", "Requires", "UUIDs"] +git-tree-sha1 = "299dc33549f68299137e51e6d49a13b5b1da9673" +uuid = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" +version = "1.16.1" + +[[deps.FileWatching]] +uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" + +[[deps.FixedPointNumbers]] +deps = ["Statistics"] +git-tree-sha1 = "335bfdceacc84c5cdf16aadc768aa5ddfc5383cc" +uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" +version = "0.8.4" + +[[deps.Hyperscript]] +deps = ["Test"] +git-tree-sha1 = "8d511d5b81240fc8e6802386302675bdf47737b9" +uuid = "47d2ed2b-36de-50cf-bf87-49c2cf4b8b91" +version = "0.0.4" + +[[deps.HypertextLiteral]] +deps = ["Tricks"] +git-tree-sha1 = "c47c5fa4c5308f27ccaac35504858d8914e102f9" +uuid = "ac1192a8-f4b3-4bfe-ba22-af5b92cd3ab2" +version = "0.9.4" + +[[deps.IOCapture]] +deps = ["Logging", "Random"] +git-tree-sha1 = "d75853a0bdbfb1ac815478bacd89cd27b550ace6" +uuid = "b5f81e59-6552-4d32-b1f0-c071b021bf89" +version = "0.2.3" + +[[deps.ImageAxes]] +deps = ["AxisArrays", "ImageBase", "ImageCore", "Reexport", "SimpleTraits"] +git-tree-sha1 = "2e4520d67b0cef90865b3ef727594d2a58e0e1f8" +uuid = "2803e5a7-5153-5ecf-9a86-9b4c37f5f5ac" +version = "0.6.11" + +[[deps.ImageBase]] +deps = ["ImageCore", "Reexport"] +git-tree-sha1 = "eb49b82c172811fd2c86759fa0553a2221feb909" +uuid = "c817782e-172a-44cc-b673-b171935fbb9e" +version = "0.1.7" + +[[deps.ImageCore]] +deps = ["AbstractFFTs", "ColorVectorSpace", "Colors", "FixedPointNumbers", "MappedArrays", "MosaicViews", "OffsetArrays", "PaddedViews", "PrecompileTools", "Reexport"] +git-tree-sha1 = "fc5d1d3443a124fde6e92d0260cd9e064eba69f8" +uuid = "a09fc81d-aa75-5fe9-8630-4744c3626534" +version = "0.10.1" + +[[deps.ImageIO]] +deps = ["FileIO", "IndirectArrays", "JpegTurbo", "LazyModules", "Netpbm", "OpenEXR", "PNGFiles", "QOI", "Sixel", "TiffImages", "UUIDs"] +git-tree-sha1 = "bca20b2f5d00c4fbc192c3212da8fa79f4688009" +uuid = "82e4d734-157c-48bb-816b-45c225c6df19" +version = "0.6.7" + +[[deps.ImageMetadata]] +deps = ["AxisArrays", "ImageAxes", "ImageBase", "ImageCore"] +git-tree-sha1 = "355e2b974f2e3212a75dfb60519de21361ad3cb7" +uuid = "bc367c6b-8a6b-528e-b4bd-a4b897500b49" +version = "0.9.9" + +[[deps.ImageShow]] +deps = ["Base64", "ColorSchemes", "FileIO", "ImageBase", "ImageCore", "OffsetArrays", "StackViews"] +git-tree-sha1 = "3b5344bcdbdc11ad58f3b1956709b5b9345355de" +uuid = "4e3cecfd-b093-5904-9786-8bbb286a6a31" +version = "0.3.8" + +[[deps.Imath_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "3d09a9f60edf77f8a4d99f9e015e8fbf9989605d" +uuid = "905a6f67-0a94-5f89-b386-d35d92009cd1" +version = "3.1.7+0" + +[[deps.IndirectArrays]] +git-tree-sha1 = "012e604e1c7458645cb8b436f8fba789a51b257f" +uuid = "9b13fd28-a010-5f03-acff-a1bbcff69959" +version = "1.0.0" + +[[deps.Inflate]] +git-tree-sha1 = "5cd07aab533df5170988219191dfad0519391428" +uuid = "d25df0c9-e2be-5dd7-82c8-3ad0b3e990b9" +version = "0.1.3" + +[[deps.InteractiveUtils]] +deps = ["Markdown"] +uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" + +[[deps.IntervalSets]] +deps = ["Dates", "Random"] +git-tree-sha1 = "8e59ea773deee525c99a8018409f64f19fb719e6" +uuid = "8197267c-284f-5f27-9208-e0e47529a953" +version = "0.7.7" +weakdeps = ["Statistics"] + + [deps.IntervalSets.extensions] + IntervalSetsStatisticsExt = "Statistics" + +[[deps.IterTools]] +git-tree-sha1 = "4ced6667f9974fc5c5943fa5e2ef1ca43ea9e450" +uuid = "c8e1da08-722c-5040-9ed9-7db0dc04731e" +version = "1.8.0" + +[[deps.JLLWrappers]] +deps = ["Artifacts", "Preferences"] +git-tree-sha1 = "7e5d6779a1e09a36db2a7b6cff50942a0a7d0fca" +uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" +version = "1.5.0" + +[[deps.JSON]] +deps = ["Dates", "Mmap", "Parsers", "Unicode"] +git-tree-sha1 = "31e996f0a15c7b280ba9f76636b3ff9e2ae58c9a" +uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" +version = "0.21.4" + +[[deps.JpegTurbo]] +deps = ["CEnum", "FileIO", "ImageCore", "JpegTurbo_jll", "TOML"] +git-tree-sha1 = "327713faef2a3e5c80f96bf38d1fa26f7a6ae29e" +uuid = "b835a17e-a41a-41e7-81f0-2f016b05efe0" +version = "0.1.3" + +[[deps.JpegTurbo_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "6f2675ef130a300a112286de91973805fcc5ffbc" +uuid = "aacddb02-875f-59d6-b918-886e6ef4fbf8" +version = "2.1.91+0" + +[[deps.LazyModules]] +git-tree-sha1 = "a560dd966b386ac9ae60bdd3a3d3a326062d3c3e" +uuid = "8cdb02fc-e678-4876-92c5-9defec4f444e" +version = "0.3.1" + +[[deps.LibCURL]] +deps = ["LibCURL_jll", "MozillaCACerts_jll"] +uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" +version = "0.6.3" + +[[deps.LibCURL_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] +uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" +version = "7.84.0+0" + +[[deps.LibGit2]] +deps = ["Base64", "NetworkOptions", "Printf", "SHA"] +uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" + +[[deps.LibSSH2_jll]] +deps = ["Artifacts", "Libdl", "MbedTLS_jll"] +uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" +version = "1.10.2+0" + +[[deps.Libdl]] +uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" + +[[deps.LinearAlgebra]] +deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"] +uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + +[[deps.Logging]] +uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" + +[[deps.MIMEs]] +git-tree-sha1 = "65f28ad4b594aebe22157d6fac869786a255b7eb" +uuid = "6c6e2e6c-3030-632d-7369-2d6c69616d65" +version = "0.1.4" + +[[deps.MacroTools]] +deps = ["Markdown", "Random"] +git-tree-sha1 = "9ee1618cbf5240e6d4e0371d6f24065083f60c48" +uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" +version = "0.5.11" + +[[deps.MappedArrays]] +git-tree-sha1 = "2dab0221fe2b0f2cb6754eaa743cc266339f527e" +uuid = "dbb5928d-eab1-5f90-85c2-b9b0edb7c900" +version = "0.4.2" + +[[deps.Markdown]] +deps = ["Base64"] +uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" + +[[deps.MbedTLS_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" +version = "2.28.2+0" + +[[deps.Mmap]] +uuid = "a63ad114-7e13-5084-954f-fe012c677804" + +[[deps.MosaicViews]] +deps = ["MappedArrays", "OffsetArrays", "PaddedViews", "StackViews"] +git-tree-sha1 = "7b86a5d4d70a9f5cdf2dacb3cbe6d251d1a61dbe" +uuid = "e94cdb99-869f-56ef-bcf0-1ae2bcbe0389" +version = "0.3.4" + +[[deps.MozillaCACerts_jll]] +uuid = "14a3606d-f60d-562e-9121-12d972cd8159" +version = "2022.10.11" + +[[deps.Netpbm]] +deps = ["FileIO", "ImageCore", "ImageMetadata"] +git-tree-sha1 = "d92b107dbb887293622df7697a2223f9f8176fcd" +uuid = "f09324ee-3d7c-5217-9330-fc30815ba969" +version = "1.1.1" + +[[deps.NetworkOptions]] +uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" +version = "1.2.0" + +[[deps.OffsetArrays]] +deps = ["Adapt"] +git-tree-sha1 = "2ac17d29c523ce1cd38e27785a7d23024853a4bb" +uuid = "6fe1bfb0-de20-5000-8ca7-80f57d26f881" +version = "1.12.10" + +[[deps.OpenBLAS_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] +uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" +version = "0.3.21+4" + +[[deps.OpenEXR]] +deps = ["Colors", "FileIO", "OpenEXR_jll"] +git-tree-sha1 = "327f53360fdb54df7ecd01e96ef1983536d1e633" +uuid = "52e1d378-f018-4a11-a4be-720524705ac7" +version = "0.3.2" + +[[deps.OpenEXR_jll]] +deps = ["Artifacts", "Imath_jll", "JLLWrappers", "Libdl", "Zlib_jll"] +git-tree-sha1 = "a4ca623df1ae99d09bc9868b008262d0c0ac1e4f" +uuid = "18a262bb-aa17-5467-a713-aee519bc75cb" +version = "3.1.4+0" + +[[deps.OrderedCollections]] +git-tree-sha1 = "2e73fe17cac3c62ad1aebe70d44c963c3cfdc3e3" +uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" +version = "1.6.2" + +[[deps.PNGFiles]] +deps = ["Base64", "CEnum", "ImageCore", "IndirectArrays", "OffsetArrays", "libpng_jll"] +git-tree-sha1 = "9b02b27ac477cad98114584ff964e3052f656a0f" +uuid = "f57f5aa1-a3ce-4bc8-8ab9-96f992907883" +version = "0.4.0" + +[[deps.PaddedViews]] +deps = ["OffsetArrays"] +git-tree-sha1 = "0fac6313486baae819364c52b4f483450a9d793f" +uuid = "5432bcbf-9aad-5242-b902-cca2824c8663" +version = "0.5.12" + +[[deps.Parsers]] +deps = ["Dates", "PrecompileTools", "UUIDs"] +git-tree-sha1 = "716e24b21538abc91f6205fd1d8363f39b442851" +uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" +version = "2.7.2" + +[[deps.Pkg]] +deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] +uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" +version = "1.9.2" + +[[deps.PkgVersion]] +deps = ["Pkg"] +git-tree-sha1 = "f9501cc0430a26bc3d156ae1b5b0c1b47af4d6da" +uuid = "eebad327-c553-4316-9ea0-9fa01ccd7688" +version = "0.3.3" + +[[deps.PlutoUI]] +deps = ["AbstractPlutoDingetjes", "Base64", "ColorTypes", "Dates", "FixedPointNumbers", "Hyperscript", "HypertextLiteral", "IOCapture", "InteractiveUtils", "JSON", "Logging", "MIMEs", "Markdown", "Random", "Reexport", "URIs", "UUIDs"] +git-tree-sha1 = "e47cd150dbe0443c3a3651bc5b9cbd5576ab75b7" +uuid = "7f904dfe-b85e-4ff6-b463-dae2292396a8" +version = "0.7.52" + +[[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 = "7eb1686b4f04b82f96ed7a4ea5890a4f0c7a09f1" +uuid = "21216c6a-2e73-6563-6e65-726566657250" +version = "1.4.0" + +[[deps.Printf]] +deps = ["Unicode"] +uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" + +[[deps.ProgressMeter]] +deps = ["Distributed", "Printf"] +git-tree-sha1 = "ae36206463b2395804f2787ffe172f44452b538d" +uuid = "92933f4c-e287-5a05-a399-4b506db050ca" +version = "1.8.0" + +[[deps.QOI]] +deps = ["ColorTypes", "FileIO", "FixedPointNumbers"] +git-tree-sha1 = "18e8f4d1426e965c7b532ddd260599e1510d26ce" +uuid = "4b34888f-f399-49d4-9bb3-47ed5cae4e65" +version = "1.0.0" + +[[deps.REPL]] +deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] +uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" + +[[deps.Random]] +deps = ["SHA", "Serialization"] +uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" + +[[deps.RangeArrays]] +git-tree-sha1 = "b9039e93773ddcfc828f12aadf7115b4b4d225f5" +uuid = "b3c3ace0-ae52-54e7-9d0b-2c1406fd6b9d" +version = "0.3.2" + +[[deps.Reexport]] +git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" +uuid = "189a3867-3050-52da-a836-e630ba90ab69" +version = "1.2.2" + +[[deps.Requires]] +deps = ["UUIDs"] +git-tree-sha1 = "838a3a4188e2ded87a4f9f184b4b0d78a1e91cb7" +uuid = "ae029012-a4dd-5104-9daa-d747884805df" +version = "1.3.0" + +[[deps.SHA]] +uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" +version = "0.7.0" + +[[deps.Serialization]] +uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" + +[[deps.SimpleTraits]] +deps = ["InteractiveUtils", "MacroTools"] +git-tree-sha1 = "5d7e3f4e11935503d3ecaf7186eac40602e7d231" +uuid = "699a6c99-e7fa-54fc-8d76-47d257e15c1d" +version = "0.9.4" + +[[deps.Sixel]] +deps = ["Dates", "FileIO", "ImageCore", "IndirectArrays", "OffsetArrays", "REPL", "libsixel_jll"] +git-tree-sha1 = "2da10356e31327c7096832eb9cd86307a50b1eb6" +uuid = "45858cf5-a6b0-47a3-bbea-62219f50df47" +version = "0.1.3" + +[[deps.Sockets]] +uuid = "6462fe0b-24de-5631-8697-dd941f90decc" + +[[deps.SparseArrays]] +deps = ["Libdl", "LinearAlgebra", "Random", "Serialization", "SuiteSparse_jll"] +uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + +[[deps.StackViews]] +deps = ["OffsetArrays"] +git-tree-sha1 = "46e589465204cd0c08b4bd97385e4fa79a0c770c" +uuid = "cae243ae-269e-4f55-b966-ac2d0dc13c15" +version = "0.1.1" + +[[deps.Statistics]] +deps = ["LinearAlgebra", "SparseArrays"] +uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" +version = "1.9.0" + +[[deps.SuiteSparse_jll]] +deps = ["Artifacts", "Libdl", "Pkg", "libblastrampoline_jll"] +uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c" +version = "5.10.1+6" + +[[deps.TOML]] +deps = ["Dates"] +uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" +version = "1.0.3" + +[[deps.Tar]] +deps = ["ArgTools", "SHA"] +uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" +version = "1.10.0" + +[[deps.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.TiffImages]] +deps = ["ColorTypes", "DataStructures", "DocStringExtensions", "FileIO", "FixedPointNumbers", "IndirectArrays", "Inflate", "Mmap", "OffsetArrays", "PkgVersion", "ProgressMeter", "UUIDs"] +git-tree-sha1 = "8621f5c499a8aa4aa970b1ae381aae0ef1576966" +uuid = "731e570b-9d59-4bfa-96dc-6df516fadf69" +version = "0.6.4" + +[[deps.Tricks]] +git-tree-sha1 = "aadb748be58b492045b4f56166b5188aa63ce549" +uuid = "410a4b4d-49e4-4fbc-ab6d-cb71b17b3775" +version = "0.1.7" + +[[deps.URIs]] +git-tree-sha1 = "b7a5e99f24892b6824a954199a45e9ffcc1c70f0" +uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" +version = "1.5.0" + +[[deps.UUIDs]] +deps = ["Random", "SHA"] +uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" + +[[deps.Unicode]] +uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" + +[[deps.Zlib_jll]] +deps = ["Libdl"] +uuid = "83775a58-1f1d-513f-b197-d71354ab007a" +version = "1.2.13+0" + +[[deps.libblastrampoline_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" +version = "5.8.0+0" + +[[deps.libpng_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] +git-tree-sha1 = "94d180a6d2b5e55e447e2d27a29ed04fe79eb30c" +uuid = "b53b4c65-9356-5827-b1ea-8c7a1a84506f" +version = "1.6.38+0" + +[[deps.libsixel_jll]] +deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Pkg", "libpng_jll"] +git-tree-sha1 = "d4f63314c8aa1e48cd22aa0c17ed76cd1ae48c3c" +uuid = "075b6546-f08a-558a-be8f-8157d0f608a5" +version = "1.10.3+0" + +[[deps.nghttp2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" +version = "1.48.0+0" + +[[deps.p7zip_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" +version = "17.4.0+0" +""" + +# ╔═║ Cell order: +# β•Ÿβ”€e91d7926-ec6e-41e7-aba2-9dca333c8aa5 +# β•Ÿβ”€d07fcdb0-7afc-4a25-b68a-49fd1e3405e7 +# β•Ÿβ”€9b49500c-0164-4556-a17b-7595e35c5ede +# ╠═74b008f6-ed6b-11ea-291f-b3791d6d1b35 +# β•Ÿβ”€ca1b507e-6017-11eb-34e6-6b85cd189002 +# β•Ÿβ”€e9ff96d8-6bc1-11eb-0f6a-234b9fae047e +# β•Ÿβ”€9111db10-6bc3-11eb-38e5-cf3f58536914 +# β•Ÿβ”€fb8a99ac-6bc1-11eb-0835-3146734a1c99 +# β•Ÿβ”€b795dcb4-6bc3-11eb-20ec-db2cc4b89bfb +# β•Ÿβ”€8691e434-6bc4-11eb-07d1-8169158484e6 +# β•Ÿβ”€546db74c-6d4e-11eb-2e27-f5bed9dbd9ba +# β•Ÿβ”€6385d174-6d4e-11eb-093b-6f6fafb79f84 +# β•Ÿβ”€132f6596-6bc6-11eb-29f1-1b2478c929af +# β•Ÿβ”€635a03dd-abd7-49c8-a3d2-e68c7d83cc9b +# β•Ÿβ”€9eb6efd2-6018-11eb-2db8-c3ce41d9e337 +# β•Ÿβ”€e37e4d40-6018-11eb-3e1d-093266c98507 +# β•Ÿβ”€e1c9742a-6018-11eb-23ba-d974e57f78f9 +# β•Ÿβ”€9b004f70-6bc9-11eb-128c-914eadfc9a0e +# β•Ÿβ”€62fa19da-64c6-11eb-0038-5d40a6890cf5 +# ╠═34ee0954-601e-11eb-1912-97dc2937fd52 +# β•Ÿβ”€9180fbcc-601e-11eb-0c22-c920dc7ee9a9 +# ╠═34ffc3d8-601e-11eb-161c-6f9a07c5fd78 +# β•Ÿβ”€abaaa980-601e-11eb-0f71-8ff02269b775 +# ╠═aafe76a6-601e-11eb-1ff5-01885c5238da +# β•Ÿβ”€e86ed944-ee05-11ea-3e0f-d70fc73b789c +# β•Ÿβ”€c99d2aa8-601e-11eb-3469-497a246db17c +# β•Ÿβ”€11dff4ce-6bca-11eb-1056-c1345c796ed4 +# β•Ÿβ”€efef3a32-6bc9-11eb-17e9-dd2171be9c21 +# β•Ÿβ”€e94dcc62-6d4e-11eb-3d53-ff9878f0091e +# β•Ÿβ”€d6742ea0-1106-4f3c-a5b8-a31a48d33f19 +# ╠═1d7375b7-7ea6-4d67-ab73-1c69d6b8b87f +# ╠═6224c74b-8915-4983-abf0-30e6ba04a46d +# β•Ÿβ”€cef1a95a-64c6-11eb-15e7-636a3621d727 +# β•Ÿβ”€f26d9326-64c6-11eb-1166-5d82586422ed +# β•Ÿβ”€6f928b30-602c-11eb-1033-71d442feff93 +# ╠═75c5c85a-602c-11eb-2fb1-f7e7f2c5d04b +# β•Ÿβ”€77f93eb8-602c-11eb-1f38-efa56cc93ca5 +# ╠═96b7d801-c427-4e27-ab1f-e2fd18fc24d0 +# ╠═f08d02af-6e38-4ace-8b11-7af4930b64ea +# β•Ÿβ”€f9244264-64c6-11eb-23a6-cfa76f8aff6d +# ╠═bd22d09a-64c7-11eb-146f-67733b8be241 +# β•Ÿβ”€28860d48-64c8-11eb-240f-e1232b3638df +# β•Ÿβ”€4ef99715-4d8d-4f9d-bf0b-8df9907a14cf +# β•Ÿβ”€a510fc33-406e-4fb5-be83-9e4b5578717c +# ╠═94b77934-713e-11eb-18cf-c5dc5e7afc5b +# ╠═ff762861-b186-4eb0-9582-0ce66ca10f60 +# β•Ÿβ”€13844ebf-52c4-47e9-bda4-106a02fad9d7 +# ╠═08d61afb-c641-4aa9-b995-2552af89f3b8 +# ╠═6511a498-7ac9-445b-9c15-ec02d09783fe +# β•Ÿβ”€c9ed950c-dcd9-4296-a431-ee0f36d5b557 +# ╠═f0796032-8105-4f6d-b5ee-3647b052f2f6 +# β•Ÿβ”€b9be8761-a9c9-49eb-ba1b-527d12097362 +# ╠═d515286b-4ad4-449b-8967-06b9b4c87684 +# β•Ÿβ”€eef8fbc8-8887-4628-8ba8-114575d6b91f +# ╠═4e6a31d6-1ef8-4a69-b346-ad58cfc4d8a5 +# β•Ÿβ”€e11f0e47-02d9-48a6-9b1a-e313c18db129 +# ╠═9e447eab-14b6-45d8-83ab-1f7f1f1c70d2 +# ╠═c926435c-c648-419c-9951-ac8a1d4f3b92 +# β•Ÿβ”€32e7e51c-dd0d-483d-95cb-e6043f2b2975 +# ╠═4b64e1f2-d0ca-4e22-a89d-1d9a16bd6788 +# ╠═85919db9-1444-4904-930f-ba572cff9460 +# ╠═2ac47b91-bbc3-49ae-9bf5-4def30ff46f4 +# β•Ÿβ”€5a0cc342-64c9-11eb-1211-f1b06d652497 +# β•Ÿβ”€4504577c-64c8-11eb-343b-3369b6d10d8b +# β•Ÿβ”€40886d36-64c9-11eb-3c69-4b68673a6dde +# ╠═552235ec-64c9-11eb-1f7f-f76da2818cb3 +# β•Ÿβ”€c2907d1a-47b1-4634-8669-a68022706861 +# ╠═ff9eea3f-cab0-4030-8337-f519b94316c5 +# β•Ÿβ”€f6cc03a0-ee07-11ea-17d8-013991514d42 +# ╠═63e8d636-ee0b-11ea-173d-bd3327347d55 +# β•Ÿβ”€2cc2f84e-ee0d-11ea-373b-e7ad3204bb00 +# β•Ÿβ”€b8f26960-ee0a-11ea-05b9-3f4bc1099050 +# ╠═5de3a22e-ee0b-11ea-230f-35df4ca3c96d +# ╠═4e21e0c4-ee0b-11ea-3d65-b311ae3f98e9 +# ╠═6dbf67ce-ee0b-11ea-3b71-abc05a64dc43 +# β•Ÿβ”€846b1330-ee0b-11ea-3579-7d90fafd7290 +# ╠═943103e2-ee0b-11ea-33aa-75a8a1529931 +# β•Ÿβ”€2ee543b2-64d6-11eb-3c39-c5660141787e +# ╠═53bad296-4c7b-471f-b481-0e9423a9288a +# β•Ÿβ”€ab9af0f6-64c9-11eb-13d3-5dbdb75a69a7 +# ╠═e29b7954-64cb-11eb-2768-47de07766055 +# β•Ÿβ”€8e7c4866-64cc-11eb-0457-85be566a8966 +# β•Ÿβ”€f2ad501a-64cb-11eb-1707-3365d05b300a +# ╠═4f03f651-56ed-4361-b954-e6848ac56089 +# β•Ÿβ”€2808339c-64cc-11eb-21d1-c76a9854aa5b +# ╠═1bd53326-d705-4d1a-bf8f-5d7f2a4e696f +# β•Ÿβ”€a5f8bafe-edf0-11ea-0da3-3330861ae43a +# ╠═b6b65b94-edf0-11ea-3686-fbff0ff53d08 +# β•Ÿβ”€d862fb16-edf1-11ea-36ec-615d521e6bc0 +# β•Ÿβ”€e3394c8a-edf0-11ea-1bb8-619f7abb6881 +# β•Ÿβ”€693af19c-64cc-11eb-31f3-57ab2fbae597 +# β•Ÿβ”€6361d102-64cc-11eb-31b7-fb631b632040 +# ╠═ae542fe4-64cc-11eb-29fc-73b7a66314a9 +# β•Ÿβ”€c29292b8-64cc-11eb-28db-b52c46e865e6 +# β•Ÿβ”€7b04331a-6bcb-11eb-34fa-1f5b151e5510 +# β•Ÿβ”€5319c03c-64cc-11eb-0743-a1612476e2d3 +# ╠═3db09d92-64cc-11eb-0333-45193c0fd1fe +# β•Ÿβ”€61606acc-6bcc-11eb-2c80-69ceec9f9702 +# β•Ÿβ”€dd183eca-6018-11eb-2a83-2fcaeea62942 +# β•Ÿβ”€8ddcb286-602a-11eb-3ae0-07d3c77a0f8c +# ╠═f4b0aa23-2d76-4d88-b2a4-3807e88d27ce +# ╠═1b2b2b18-64d4-11eb-2d43-e31cb8bc25d1 +# β•Ÿβ”€2b0e6450-64d4-11eb-182b-ff1bd515b56f +# ╠═3b2b041a-64d4-11eb-31dd-47d7321ee909 +# β•Ÿβ”€0f35603a-64d4-11eb-3baf-4fef06d82daa +# ╠═e69b02c6-64d6-11eb-02f1-21c4fb5d1043 +# β•Ÿβ”€fce76132-64d6-11eb-259d-b130038bbae6 +# β•Ÿβ”€17a69736-64d7-11eb-2c6c-eb5ebf51b285 +# ╠═291b04de-64d7-11eb-1ee0-d998dccb998c +# β•Ÿβ”€647fddf2-60ee-11eb-124d-5356c7014c3b +# ╠═7d9ad134-60ee-11eb-1b2a-a7d63f3a7a2d +# ╠═8433b862-60ee-11eb-0cfc-add2b72997dc +# β•Ÿβ”€5e52d12e-64d7-11eb-0905-c9038a404e24 +# β•Ÿβ”€6aba7e62-64d7-11eb-2c49-7944e9e2b94b +# β•Ÿβ”€afc66dac-64d7-11eb-1ad0-7f62c20ffefb +# ╠═b37c9868-64d7-11eb-3033-a7b5d3065f7f +# β•Ÿβ”€b1dfe122-64dc-11eb-1104-1b8852b2c4c5 +# β•Ÿβ”€cfc55140-64d7-11eb-0ff6-e59c70d01d67 +# β•Ÿβ”€fca72490-64d7-11eb-1464-f5e0582c4d18 +# ╠═88933746-6028-11eb-32de-13eb6ff43e29 +# β•Ÿβ”€1c539b02-64d8-11eb-3505-c9288357d139 +# β•Ÿβ”€10f6e6da-64d8-11eb-366f-11f16e73043b +# β•Ÿβ”€82a8314c-64d8-11eb-1acb-e33625381178 +# β•Ÿβ”€576d5e3a-64d8-11eb-10c9-876be31f7830 +# ╠═2a94a2cf-b697-4b0b-afd0-af2e35af2bb1 +# ╠═3e0ece65-b8a7-4be7-ae44-6d7210c2e15b +# ╠═4ee18bee-13e6-4478-b2ca-ab66100e57ec +# β•Ÿβ”€ace86c8a-60ee-11eb-34ef-93c54abc7b1a +# β•Ÿβ”€b08e57e4-60ee-11eb-0e1a-2f49c496668b +# β•Ÿβ”€9025a5b4-6066-11eb-20e8-099e9b8f859e +# β•Ÿβ”€45815734-ee0a-11ea-2982-595e1fc0e7b1 +# β•Ÿβ”€5da8cbe8-eded-11ea-2e43-c5b7cc71e133 +# β•Ÿβ”€e074560a-601b-11eb-340e-47acd64f03b2 +# β•Ÿβ”€e0776548-601b-11eb-2563-57ba2cf1d5d1 +# β•Ÿβ”€e083bef6-601b-11eb-2134-e3063d5c4253 +# β•Ÿβ”€e08ecb84-601b-11eb-0e25-152ed3a262f7 +# β•Ÿβ”€e09036a4-601b-11eb-1a8b-ef70105ab91c +# β•Ÿβ”€e09af1a2-601b-11eb-14c8-57a46546f6ce +# β•Ÿβ”€e0a4fc10-601b-11eb-211d-03570aca2726 +# ╠═e0a6031c-601b-11eb-27a5-65140dd92897 +# β•Ÿβ”€e0b15582-601b-11eb-26d6-bbf708933bc8 +# β•Ÿβ”€e891fce0-601b-11eb-383b-bde5b128822e +# β•Ÿβ”€3ef77236-1867-4d02-8af2-ff4777fcd6d9 +# β•Ÿβ”€61b29e7d-5aba-4bc8-870b-c1c43919c236 +# β•Ÿβ”€a9fef6c9-e911-4d8c-b141-a4832b40a260 +# β•Ÿβ”€edf900be-601b-11eb-0456-3f7cfc5e876b +# β•Ÿβ”€00000000-0000-0000-0000-000000000001 +# β•Ÿβ”€00000000-0000-0000-0000-000000000002 diff --git a/notebooks/1_images.plutostate b/notebooks/1_images.plutostate new file mode 100644 index 0000000..7bf1f2b Binary files /dev/null and b/notebooks/1_images.plutostate differ diff --git a/notebooks/20220422_philip.jpg b/notebooks/20220422_philip.jpg new file mode 100644 index 0000000..da93a18 Binary files /dev/null and b/notebooks/20220422_philip.jpg differ diff --git a/notebooks/20220422_philip.png b/notebooks/20220422_philip.png new file mode 100644 index 0000000..2255543 Binary files /dev/null and b/notebooks/20220422_philip.png differ diff --git a/notebooks/reduced_phil.png b/notebooks/reduced_phil.png new file mode 100644 index 0000000..ba3fbb1 Binary files /dev/null and b/notebooks/reduced_phil.png differ diff --git a/notebooks_old/10_climate_science.jl b/notebooks_old/10_climate_science.jl new file mode 100644 index 0000000..1a672f5 --- /dev/null +++ b/notebooks_old/10_climate_science.jl @@ -0,0 +1,3056 @@ +### A Pluto.jl notebook ### +# v0.19.13 + +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 + +# ╔═║ d8e3d937-bcda-4c84-b543-e1324f696bbc +begin + + import Pkg + using Printf, CairoMakie, PlutoUI, JLD2 + using LinearAlgebra, SparseArrays, Optim + using DataDeps + + html""" +
+ +
+

Sections 2.3 and 2.4

+

+ Climate models: solving the climate system in Julia +

+ + """ +end + +# ╔═║ 8ef88534-dac4-4a62-b623-dcaf63482a96 +md""" +# Section 2.3: a latitude-dependent climate + +##### What is a climate model? + +A climate model is a complex PDE solver that solves a set of differential equations on a discretized version of the earth, with land, ocean, and atmosphere discretized on a three-dimensional grid. The equations usually ensure the conservation of mass, momentum, and energy. + +$(Resource("https://d32ogoqmya1dw8.cloudfront.net/images/eet/envisioningclimatechange/gcm_grid_graphic.jpg", :height => 400)) + +**Figure**: schematic depicting the discretization in a general circulation model (GCM) \ +Climate models are usually massive, sophisticated models which require years to develop and have to run on high-performance computing centers. + +##### Improving our first climate model +In section 2.1 you have seen your first climate model, a system of equations that predicts the earth's average surface temperature depending on the sun's forcing and the absorption of the atmosphere. + +```math +\begin{align} +C_a \frac{d T_a}{dt} & = \varepsilon \sigma T_s ^4 - 2\varepsilon \sigma T_a^4 \\ +C_s \frac{d T_s}{dt} & = \varepsilon \sigma T_a^4 - \sigma T_s ^4 + (1 - \alpha) \frac{S_0}{4} +\end{align} +``` + +$(Resource("https://www.acs.org/content/acs/en/climatescience/atmosphericwarming/singlelayermodel/_jcr_content/articleContent/columnbootstrap_2/column0/image.img.jpg/1374081917968.jpg", :height => 300)) +**Figure**: Earth's energy budget + +This simple model is handy for predicting global heating and cooling but does not bring us much further. In order to characterize our climate, an essential quantity we are interested in predicting is the temperature difference between low and high latitudes. The latitudinal temperature gradient is a significant quantity that drives motions in the atmosphere and is the cause of all major climatic events. We will also later see that the latitudinal temperature gradient is one measure of the efficiency of the global climate system in redistributing heat and is used to test the ability of models to represent the climate system through time + +To improve our simple model, we will introduce an extra dimension, the latitude + + +$(Resource("https://raw.githubusercontent.com/simone-silvestri/ComputationalThinking/main/two-models.png", :height => 200)) + +**Figure**: difference between a 0D model (averaged over earth's surface) and a 1D model (averaged over spherical segments) + +""" + +# ╔═║ cfb8f979-37ca-40ab-8d3c-0053911717e7 +md""" +## Variable insolation + +Let us introduce some variability in our climate system. The variability is imposed on the system by the forcing. You already saw that the spatially and annual averaged radiative flux that reaches the earth (in units of W/mΒ²) is +```math +S_0 / 4 , \ \ \ \ \text{with} \ \ \ \ S_0 \approx 1365 \ W m^{-2} +``` +of which only ``(1 - \alpha)`` is absorbed (where ``\alpha`` is the albedo (or reflectivity) of the surface). This flux is not distributed equally along the surface of the planet. The insolation amount and intensity vary in different locations, days, seasons, and years. \ + +Three main parameters affect the intensity of the incoming solar radiation: + +- the latitude +- the hour of the day +- the day of the year + +In practice, we will simplify the system by averaging the dependencies on hour and day. What remains is a 1D model which depends on time and latitude. +""" + +# ╔═║ eb95e773-b12a-40a4-a4f1-9dced86fc8a2 +md""" +##### Latitudinal dependency (angle ``\phi``) + +Different parts of Earth’s surface receive different amounts of sunlight (Figure below). The Sun’s rays strike Earth’s surface most directly at the equator. This focuses the rays on a small area. Near the poles, the Sun’s rays strike the surface at a slant. This spreads the rays over a wide area. The more focused the rays are, the more energy an area receives, and the warmer it is. + +$(Resource("https://static.manitobacooperator.ca/wp-content/uploads/2020/02/18151642/insolation_CMYK.jpg#_ga=2.245013061.1375356746.1664813564-1302273094.1664813564", :height => 300)) + +##### Hourly dependency (angle ``h``) + +As the earth rotates along its axis, the same happens in the east-west direction. At noon, the rays will be parallel to the earth, facing the smallest surface area. In the evening/morning, rays are slanted, facing a larger surface area. We can express this dependency as an angle (``h``) that takes the value of 0 at noon, positive values in the afternoon, and negative values in the morning. Since the Earth rotates 15Β° per hour, each hour away from noon corresponds to an angular motion of the sun in the sky of 15Β° + +##### Seasonal dependency (angle ``\delta``) + +The declination of the sun is the angle between the equator and a line drawn from the center of the Earth to the center of the sun. It is positive when it is north and negative when it is south. The declination reaches its maximum value, +23Β° 17', on 21 June (the summer solstice in the northern hemisphere, the winter solstice in the southern hemisphere). The minimum value, βˆ’23Β° 27', is reached on 20 December. +[Animation showing the declination angle.](https://www.pveducation.org/sites/default/files/PVCDROM/Properties-of-Sunlight/Animations/earth-rotation/earth-rotation_HTML5.html) +The declination, in degrees, for any given day may be calculated (approximately) with the equation: + +```math +\delta = 23.45^\circ \sin{\left(\frac{360}{365.25} \cdot (\text{day} - 81)\right)} +``` + +where ``\text{day}`` starts from 1 on the 1st of January and ends at 365 on December 31st, while the 81st day is the spring equinox (22nd of March), where the earth's axis is perpendicular to the orbit + + + +$(Resource("https://ars.els-cdn.com/content/image/3-s2.0-B9780080247441500061-f01-03-9780080247441.gif", :height => 300)) +**Figure**: Declination angle (``\delta``) versus days after the equinox. +""" + +# ╔═║ 75cacd05-c9f8-44ba-a0ce-8cde93fc8b85 +md""" +#### Bringing it all together + +$(Resource("https://raw.githubusercontent.com/simone-silvestri/ComputationalThinking/main/angles.png", :height => 300)) +**Figure:** Angles that define solar flux with respect to earth) + +We model the instantaneous solar flux with +```math +Q \approx S_0 \left( \underbrace{\sin{\phi} \sin{\delta} + \cos{h} \cos{\delta} \cos{\phi}}_{\cos{\theta_z}} \right) +``` + +where ``\theta_z`` is the zenith angle, shown in the figure below + +$(Resource("https://ars.els-cdn.com/content/image/3-s2.0-B9780128121498000028-f02-02-9780128121498.jpg", :height => 300)) +**Figure:** Zenith angle, (M. Rosa-Clot & G. Tina, Submerged and Floating Photovoltaic Systems, 2018, chapter 2) + +The cosine of the zenith angle is the useful percentage of ``S_0`` which strikes the earth's surface. +What does the first term on the right-hand side express? And the second? +Negative insolation does not exist... so negative values of ``\cos{\theta_z}`` indicate night-time, for which ``Q=0``. When ``cos(\theta_z)`` is exactly equal to zero, we are at sunset or sunrise. +We can calculate the sunset (and sunrise) hour angle (``h_{ss}``) as follows +```math +\cos{h_{ss}} = - \tan{\phi}\tan{\delta} +``` + +##### Polar Sunrise and Sunset + +Due to the inclination of the earth's axis, some regions experience days and nights that extend beyond 24 hours. This phenomenon is called Polar day and Polar night. The longest days and nights are at -90/90 α΅’N (the poles), which experience a single day and night in the year. Polar sunrise and sunset occur at a latitude that satisfies +```math +|\phi| > 90α΅’ - |\delta| +``` +``\delta`` and ``\phi`` of the same sign mean that the sun is rising, vice-versa, if the signs are opposite the sun is setting + +##### Daily Insolation + +Let's calculate the daily insolation (in 24 hr). Since we express the day in ``2\pi`` radians and ``Q = 0`` if ``|h| > h_{ss}`` + +```math +\langle Q \rangle_{day} = \frac{S_0}{2\pi} \int_{-h_{ss}}^{h_{ss}} (\sin{\phi}\sin{\delta} + \cos{\phi}\cos{\delta}\cos{h} ) \ dh +``` + +which is easily integrated to + +```math +\langle Q \rangle_{day} = \frac{S_0}{\pi} \left( h_{ss}\sin{\phi}\sin{\delta} + \cos{\phi}\cos{\delta}\sin{h_{ss}} \right) +``` + +""" + + +# ╔═║ 18ddf155-f9bc-4e5b-97dc-762fa83c9931 +function daily_insolation(lat; day = 81, Sβ‚€ = 1365.2) + + march_first = 81.0 + Ο• = deg2rad(lat) + Ξ΄ = deg2rad(23.45) * sind(360*(day - march_first) / 365.25) + + hβ‚€ = abs(Ξ΄) + abs(Ο•) < Ο€/2 ? # there is a sunset/sunrise + acos(-tan(Ο•) * tan(Ξ΄)) : + Ο• * Ξ΄ > 0 ? Ο€ : 0.0 # all day or all night + + # Zenith angle corresponding to the average daily insolation + cosΞΈβ‚› = hβ‚€*sin(Ο•)*sin(Ξ΄) + cos(Ο•)*cos(Ξ΄)*sin(hβ‚€) + + Q = Sβ‚€/Ο€ * cosΞΈβ‚› + + return Q +end + +# ╔═║ 87fdc7c2-536e-4aa1-9f68-8aec4bc7069d +md""" day $(@bind day_in_year PlutoUI.Slider(1:365, show_value=true)) """ + +# ╔═║ 8d4d8b93-ebfe-41ff-8b9e-f8931a9e83c2 +begin + latitude = -90:90 + Ξ΄ = (23 + 27/60) * sind(360*(day_in_year - 81.0) / 365.25) + + polar_Ο• = 90 - abs(Ξ΄) + + function day_to_date(day) + months = (:Jan, :Feb, :Mar, :Apr, :May, :Jun, :Jul, :Aug, :Sep, :Oct, :Nov, :Dec) + days_in_months = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 31, 31) + days_till_months = [1, [sum(days_in_months[1:i]) for i in 1:11]...] + + month = searchsortedlast(days_till_months, day) + day_in_month = month > 1 ? day - sum(days_in_months[1:month-1]) : day + + return "$(day_in_month) " * string(months[month]) + end + + Q = daily_insolation.(latitude; day = day_in_year) + fig = Figure(resolution = (700, 300)) + ax = Axis(fig[1, 1], title = "Daily average insolation, Day: $(day_in_year) ($(day_to_date(day_in_year)))", xlabel = "latitude α΅’N", ylabel ="daily ⟨Q⟩ Wm⁻²") + lines!(ax, latitude, Q, linewidth = 2, color=:red) + lines!(ax, polar_Ο•*[1, 1], [0, 600], linestyle=:dash, color=:yellow) + lines!(ax, -polar_Ο•*[1, 1], [0, 600], linestyle=:dash, color=:yellow) + ax.xticks = [-90, -90+23, -25, -50, 0, 25, 50, 90-23, 90] + ylims!(ax, -10, 600) + + md""" + $(current_figure()) + **Figure**: daily average insolation in Wm⁻². The yellow lines correspond to the latitude of polar sunset (sunrise), above (below) which it is only night (day) + + $(Resource("https://ars.els-cdn.com/content/image/1-s2.0-S0074614202800171-gr8.jpg", :height => 400)) + **Figure**: Daily mean solar insolation (Q/24 hr) as a function of latitude and day of year in units of W mβˆ’2 based on a solar constant of 1366 W mβˆ’2. The shaded areas denote zero insolation. The position of vernal equinox (VE), summer solstice (SS), autumnal equinox (AE), and winter solstice (WS) are indicated with solid vertical lines. Solar declination is shown with a dashed line (K.N. Liou, An Introduction to Atmospheric Radiation, 2002, chapter 2) + """ +end + +# ╔═║ 25223f7b-22f7-46c2-9270-4430eb6c186e +begin + function annual_mean_insolation(lat; Sβ‚€ = 1365.2) + Q_avg = 0 + for day in 1:365 + Q_avg += daily_insolation(lat; day, Sβ‚€) / 365 + end + + return Q_avg + end + + Q_avg = zeros(length(-90:90)) + for (idx, lat) in enumerate(-90:90) + Q_avg[idx] += annual_mean_insolation(lat) + end + + fm = Figure(resolution = (700, 300)) + am = Axis(fm[1, 1], title = "Yearly average insolation", xlabel = "latitude α΅’N", ylabel ="yearly ⟨Q⟩ Wm⁻²") + lines!(am, -90:90, Q_avg) + + md""" + For our purposes, let's forget about the seasons and calculate the yearly average mean isolation + + ```math + \langle Q \rangle_{\text{yr}} = \frac{1}{365}\sum_{\text{day} = 1}^{365} \langle Q \rangle_{\text{day}} + ``` + + $(current_figure()) + **Figure**: Annual mean insolation + + We can see that the average insolation is much lower (~2.5X) at the poles compared to the equator! This is reassuring given the climate we experience! + + """ +end + + +# ╔═║ 034fc483-b188-4b2a-891a-61b76c74072d +md""" +## Solving the climate system: equilibrium solution + +Let us recall the system of ODE that governs the surface and atmospheric temperature. \ +The forcing is now be latitude-dependent, resulting in a latitude-dependent temperature + +```math +\begin{align} +C_a \frac{d T_a}{dt} & = \varepsilon \sigma T_s ^4 - 2\varepsilon \sigma T_a^4 \\ +C_s \frac{d T_s}{dt} & = \varepsilon \sigma T_a^4 - \sigma T_s ^4 + (1 - \alpha) Q(\phi) +\end{align} +``` +Here ``T_s`` is the surface (or ocean) temperature, ``T_a`` is the atmospheric temperature, ``\varepsilon`` in the emissivity of the atmosphere, ``\alpha`` is the earth's albedo and ``C_s`` and ``C_a`` are the heat capacities of the surface and atmosphere, respectively. ``Q(\phi)`` is the yearly averaged latitudinal insolation. When the system reaches equilibrium it stops evolving in time \ +(i.e the ``dT/dt = 0``) +```math +\begin{align} +& \varepsilon \sigma T_{E,s}^4 - 2\varepsilon \sigma T_{E,a}^4 = 0 \\ +& \varepsilon \sigma T_{E,a}^4 - \sigma T_{E,s}^4 + (1 - \alpha) Q(\phi) = 0 +\end{align} +``` + +which yields +```math +\begin{align} +& T_{E,a}(\phi) = \sqrt[4]{\frac{(1 - \alpha) Q (\phi)}{\sigma (2 - \varepsilon)}} \\ +& T_{E,s}(\phi) = \sqrt[4]{\frac{2(1 - \alpha) Q (\phi)}{\sigma (2 - \varepsilon)}} +\end{align} +``` +""" + +# ╔═║ 5d31e2a8-e357-4479-bc48-de1a1b8bc4d4 +md""" +## Solving the climate system: numerical solution + +The equilibrium solution is a good approximation, but the climate is always evolving, so being able to solve the time-dependent system is important for climate predictions. The system is too complicated to be solved analytically, but we can easily solve it numerically. A numerical solution of a differential equation is an approximation of the analytical solution usually computed by _discretizing_ the derivatives. + +Let's see how to do this with two different methods: +- explicit time stepping +- implicit time stepping + +We first assume that the time derivative can be written simply as +```math +\frac{d T}{dt} \approx \frac{T^{(n+1)} - T^{(n)}}{t^{(n+1)} - t^{(n)}} +``` +where the ``n`` superscript stands for the time instant and the time step ``\Delta t`` is defined as ``\Delta t = t^{(n+1)} - t^{(n)}`` + +Now we can rewrite the equations as +```math +\begin{align} +C_a \frac{T_a^{(n+1)} - T_a^{(n)}}{\Delta t} & = G_a \\ +C_s \frac{T_s^{(n+1)} - T_s^{(n)}}{\Delta t} & = G_s +\end{align} +``` +where ``G`` are the _tendency terms_ defined as +```math +\begin{align} +G_a & = \varepsilon \sigma T_s ^4 - 2\varepsilon \sigma T_a^4 \\ +G_s & = \varepsilon \sigma T_a^4 - \sigma T_s ^4 + F +\end{align} +``` +and ``F`` is the _forcing_ +```math +F = (1-\alpha) Q +``` + +#### Explicit time stepping + +\ + +The tendencies are calculated at time ``n``, so the update rule becomes: +```math +\begin{align} +T_a^{(n+1)} & = T_a^{(n)} + \frac{\Delta t}{C_a} G_a^{(n)} \\ +T_s^{(n+1)} & = T_s^{(n)} + \frac{\Delta t}{C_s} G_s^{(n)} +\end{align} +``` +It is called _explicit time stepping_ because the values of ``G_a^{(n)}`` and ``G_s^{(n)}`` are readily available and the update rule for the time step ``n+1`` is explicitly dependent on time step ``n``. +Explicit time stepping is fast and simple to implement, but it has some shortcomings when time stepping with large ``\Delta t`` + +#### Implicit time stepping + +\ + +The tendencies are calculated at time ``n+1``. This means that they are not readily available and we have to relate them to temperatures at time ``n+1``. Then +```math +\begin{align} +G_a^{(n+1)} & = \varepsilon \sigma \left(T_s^{(n+1)}\right) ^4 - 2\varepsilon \sigma \left(T_a^{(n+1)}\right)^4 \\ +G_s^{(n+1)} & = \varepsilon \sigma \left(T_a^{(n+1)}\right)^4 - \sigma \left(T_s^{(n+1)}\right)^4 + F +\end{align} +``` +We would like to express the ODEs as a linear system, but these equations are non-linear. \ +Fortunately, if we assume that the temperature does not change significantly in one-time step (``T^{(n+1)} - T^{(n)} \ll T^{(n)}``) we can linearize ``\left(T^{(n+1)}\right)^4`` as +```math +\left(T^{(n+1)}\right)^4 \approx \left(T^{(n)}\right)^3 T^{(n+1)} +``` + +```math +\begin{align} +G_a^{(n+1)} & = \varepsilon \sigma \left(T_s^{(n)}\right)^3 T_s^{(n+1)} - 2\varepsilon \sigma \left(T_a^{(n)}\right)^3 T_a^{(n+1)} \\ +G_s^{(n+1)} & = \varepsilon \sigma \left(T_a^{(n)}\right)^3 T_a^{(n+1)} - \sigma \left(T_s^{(n)}\right)^3 T_s^{(n+1)} + F +\end{align} +``` + +Substituting the expressions for the tendencies in the update equations we get +```math +\begin{align} +\left(C_a + \Delta t 2 \varepsilon \sigma \left(T_a^{(n)}\right)^3\right) T_a^{(n+1)} - \Delta t \varepsilon \sigma \left(T_s^{(n)}\right)^3 T_s^{(n+1)} & = C_a T_a^{(n)}\\ +\left( C_s + \Delta t \sigma\left(T_s^{(n)}\right)^3 \right) T_s^{(n+1)} - \Delta t \varepsilon \sigma \left(T_a^{(n)}\right)^3 T_a^{(n+1)} & = C_s T_s^{(n)} + \Delta t F +\end{align} +``` + +This is a system of linear equations in the variables ``T = [T_a^{(n+1)}``; ``T_s^{(n+1)}]`` representable as the linear system +```math +A T = b +``` +where the matrix ``A`` is +```math +A = \begin{bmatrix} +C_a + \Delta t 2 \varepsilon \sigma \left(T_a^{(n)}\right)^3 & - \Delta t\varepsilon \sigma \left(T_s^{(n)}\right)^3 \\ + - \Delta t \varepsilon \sigma \left(T_a^{(n)}\right)^3 & +C_s + \Delta t \sigma\left(T_s^{(n)}\right)^3 \\ +\end{bmatrix} +``` +and the right hand side (``b``) is +```math +b = +\begin{bmatrix} +C_a T_a^{(n)} \\ C_s T_s^{(n)} + \Delta t F +\end{bmatrix} +``` + +""" + +# ╔═║ 724901e9-a19a-4d5f-aa6a-79ec0f230f24 +md""" +# Let's code our model in Julia + +We can start creating a ```struct``` that contains the information we need, i.e., the parameters, the state, and the solution method of the system. + +Some comments: +- Temperature (and forcing) are vectors depending on the discrete latitudinal grid ``\phi`` +- To retrieve parameters of the `struct` it is useful to write functions that we can later extend +- It is convenient to write a constructor with some default values and a `show` method +""" + +# ╔═║ 15dee5d8-e995-4e5a-aceb-48bcce42e76d +md""" +### Coding an explicit time stepping function + +Now we can write a function which evolves our model of a time step ``\Delta t``. +""" + +# ╔═║ 2287bff1-6fb0-4431-8e15-aff3d7b6e005 +md""" +### Coding an implicit time stepping function + +If we want to time step implicitly we have to solve the ``AT=b`` linear system \ +Fortunately in Julia, solving a linear system is as simple as writing +``` +T = A \ b +``` + +the only tricky part remaining is to construct the matrix \ +Since temperature can be vectors, we align them starting from the surface temperature and following with the atmospheric temperature. Let us imagine we have three different latitudes (βˆ’45,0,45) where subscript refers to ``\phi = -45``, while 2 and 3 to ``0`` and ``45``. We can arrange our matrix in the following way +```math + \begin{bmatrix} + {D_a}_{1} & & & {d_a}_1 & &\\ + & {D_a}_{2} & & & {d_a}_2 & \\ + & & {D_a}_{3} & & & {d_a}_2 \\ + {d_s}_1 & & & {D_s}_{1} & & \\ + & {d_s}_2 & & & {D_s}_{2} & \\ + & & {d_s}_3 & & & {D_s}_{3} \\ + \end{bmatrix} \begin{bmatrix} +{T_a}_1^{n+1} \\ {T_a}_2^{n+1} \\ {T_a}_3^{n+1} \\ {T_s}_1^{n+1} \\ {T_s}_2^{n+1} \\ {T_s}_3^{n+1} +\end{bmatrix} = +\begin{bmatrix} +C_a {T_a}_1^{n} \\ C_a {T_a}_2^{n} \\ C_a {T_a}_3^{n} \\ C_s {T_s}_1^{n} + \Delta t F_1 \\ C_s {T_s}_2^{n} + \Delta t F_2 \\ C_s {T_s}_3^{n} + \Delta t F_3 +\end{bmatrix} + +``` +where the diagonal terms are the sink terms, while the off-diagonal are the interexchange terms between surface and atmosphere. (Following the A matrix outlined above) +""" + +# ╔═║ e24e54a7-804e-40e8-818e-8766e5e3732b +md""" +Implicit time stepping implies constructing the matrix, calculating the rhs and solving the linear system +""" + +# ╔═║ 049e2164-24ac-467c-9d96-77510ac6ff57 +md""" +### Model verification + +Let's verify that our model reaches equilibrium with both implicit and explicit time stepping. + +Some constants to be defined: +- the stefan Boltzmann constant (Οƒ) in [Wm⁻²K⁻⁴] +- the oceanic and atmospheric heat capacity in [Wm⁻²K⁻¹⋅day] + +Note that we need the heat capacity in those units to be able to time step in [days]. +""" + +# ╔═║ f07006ac-c773-4829-9a38-6f9991403386 +begin + const Οƒ = 5.67e-8 + const Cβ‚› = 1000.0 * 4186.0 * 100 / (3600 * 24) # ρ * c * H / seconds_per_day + const Cₐ = 1e5 / 10 * 1000 / (3600 * 24) # Ξ”p / g * c / seconds_per_day +end + +# ╔═║ 039ec632-d238-4e63-81fc-a3225ccd2aee +latitude_dependent_equilibrium_temperature(lat, Ξ΅, Ξ±) = + (2 * annual_mean_insolation(lat) * (1 - Ξ±) / (2 - Ξ΅) / Οƒ )^(1/4) + +# ╔═║ 1431b11f-7838-41da-92e3-bcca9f4215b3 +begin + struct RadiativeModel{S, T, E, A, F, C} + stepper :: S # time stepping method + Tβ‚› :: T # surface temperature + Tₐ :: T # atmospheric temperature + Ξ΅ :: E # atmospheric emissivity + Ξ± :: A # surface albedo + Q :: F # forcing + Cβ‚› :: C # surface heat capacity + Cₐ :: C # atmospheric heat capacity + end + + # Types that specify the time-stepping method + struct ExplicitTimeStep end + struct ImplicitTimeStep end + + # convenience alias for dispatch + const ExplicitRadiativeModel = RadiativeModel{<:ExplicitTimeStep} + const ImplicitRadiativeModel = RadiativeModel{<:ImplicitTimeStep} + + # Let's define functions to retrieve the properties of the model. + # It is always useful to define functions to extract struct properties so we + # have the possibility to extend them in the future + # emissivity and albedo + albedo(model) = model.Ξ± + emissivity(model) = model.Ξ΅ + + # Utility functions to @show the model + timestepping(model::ExplicitRadiativeModel) = "Explicit" + timestepping(model::ImplicitRadiativeModel) = "Implicit" + + # A pretty show method that displays the model's parameters + function Base.show(io::IO, model::RadiativeModel) + print(io, "Radiative energy budget model with:", '\n', + "β”œβ”€β”€ time stepping: $(timestepping(model))", '\n', + "β”œβ”€β”€ length model: $(length(model.Tβ‚›))", '\n', + "β”œβ”€β”€ Ξ΅: $(emissivity(model))", '\n', + "β”œβ”€β”€ Ξ±: $(albedo(model))", '\n', + "└── Q: $(model.Q) Wm⁻²") + end + + # A constructor with some defaults... + function RadiativeModel(step = ImplicitTimeStep(); + Ξ΅ = 0.8, + Ξ± = 0.2985, + Ο• = range(-89.0, 89.0,length=90)) + N = length(Ο•) + Q = annual_mean_insolation.(Ο•) + Tβ‚›_init = 200.0 .* ones(N) + Tₐ_init = 180.0 .* ones(N) + + args = (Tβ‚›_init, Tₐ_init, Ξ΅, Ξ±, Q, Cβ‚›, Cₐ) + return RadiativeModel(step, args...) + end +end + +# ╔═║ de5d415f-8216-473d-8e0b-a73139540e1e +# Let's test the constructor and the show method +RadiativeModel(Ο• = 45) + +# ╔═║ b85fdf41-ef8f-4314-bc3c-383947b9f02c +@bind values PlutoUI.combine() do Child + md""" + What happens if we change latitude (``\phi``)? \ + And if we change ``\varepsilon`` or ``\alpha``? \ + And if we increase our Ξ”t? (hint: try increasing Ξ”t with high ``\varepsilon`` and low ``\alpha``) + + + ``\varepsilon`` $( + Child(PlutoUI.Slider(0:0.05:1, show_value=true, default=0.75)) + ) \ + + ``\alpha`` $( + Child(PlutoUI.Slider(0:0.05:1, show_value=true, default=0.3)) + ) \ + + ``\phi`` $( + Child(PlutoUI.Slider(-89:2:89, show_value=true, default=45)) + ) \ + + ``\Delta t`` $( + Child(PlutoUI.Slider(30:5:100, show_value=true, default=20)) + ) + + """ +end + + +# ╔═║ 16ca594c-c9db-4528-aa65-bab12cb6e22a +md""" +## Stability of time stepping methods + +Temperature starts oscillating and then explodes when using a large Ξ”t, this is because of the intrinsic stability of the time stepping method. A method is considered _unstable_ when it leads to unbounded growth despite the stability of the underlying differential equation. +Let's analyze this by simplifying a bit our discretized atmospheric equation. We remove the coupling between the surface and the atmosphere. This is like saying that all of a sudden the atmosphere becomes transparent to the radiation coming from the earth (unlikely) +```math +C_a \frac{T_a^{(n+1)} - T_a^{(n)}}{\Delta t} = -2\varepsilon \sigma T_a^4 +``` +Since there is no source, the temperature will exponentially decrease until it reaches equilibrium at 0 K. \ +let us define +```math +D = \frac{2 \varepsilon \sigma \left( T_a^{(n)}\right)^3}{C_a} +``` + +The update rule for the explicit time stepping is +```math +T_a^{(n+1)} = T_a^{(n)}(1 - D \Delta t) +``` + +We know that temperature should remain positive +```math +\frac{T_a^{(n+1)}}{T_a^{(n)}} = (1 - D\Delta t)> 0 \ . +``` +This translates in the condition on ``\Delta t`` +```math +\Delta t < \frac{1}{D} = \frac{C_a}{2\varepsilon \sigma \left( T_a^{(n)}\right)^3} +``` +For ``T_a`` equal to 288 K, ``\Delta t`` should be lower than $(@sprintf "%.2f" Cₐ / (2 * 0.5 * Οƒ * 288^3)) days \ +Going back to the previous plot, which combination of parameters will make my model the most unstable? + +What happens for implicit time stepping? We have that +```math +\frac{T_a^{(n+1)}}{T_a^n} = \frac{1}{1 + D\Delta t} > 0 +``` +Since ``D > 0``, implicit time stepping is stable for _any_ positive ``\Delta t`` \ + +In summary, for an ODE: +- _Explicit time stepping_ is generally **_conditionally stable_**, i.e. the discrete system is stable given ``\Delta t < C`` where ``C`` depends on the system. +- _Implicit time stepping_, on the other hand, is generally **_unconditionally stable_** +""" + +# ╔═║ ea517bbf-eb14-4d72-a4f4-9bb823e02f88 +md""" +# Predicting earth's temperature distribution +""" + +# ╔═║ b65e2af0-9a08-4915-834b-1a20b2440891 +md""" +Let's define some utility functions: +- a function that evolves our model in time +- a function that plots the results as a function of Ο• +""" + +# ╔═║ 91dec8b7-a9da-4c62-973e-2fd8e0a92e58 +function plot_latitudinal_variables!(Ο•, vars, labels, colors, styles; + ylabel = "Temperature [α΅’C]", + ylims = nothing, + title = "", + leg_pos = :cb, + ax_pos = [1, 1], + res = (700, 350), + fig = Figure(resolution = res)) + + axis = Axis(fig[ax_pos...]; title, ylabel, xlabel = "latitude [α΅’N]") + colors = + for (var, label, color, linestyle) in zip(vars, labels, colors, styles) + lines!(axis, Ο•, var; linestyle, label, color) + end + axislegend(axis, position = leg_pos, framevisible = false) + !isnothing(ylims) && ylims!(axis, ylims) + + return fig +end + +# ╔═║ 140bcdac-4145-47b3-952f-bfe50f6ed41c +md""" +$(Resource("https://www.researchgate.net/profile/Anders-Levermann/publication/274494740/figure/fig9/AS:668865801506834@1536481442913/a-Surface-air-temperature-as-a-function-of-latitude-for-land-dashed-line-corrected.png", :height => 400)) + +**Figure**: Observed temperature profile from: Feulner et al, _On the Origin of the Surface Air Temperature Difference between the Hemispheres in Earth's Present-Day Climate_ (2013), Journal of Climate. +""" + +# ╔═║ 849775fa-4990-47d3-afe0-d0a049bb90af +md""" +We download the annually and zonally average observed temperature and radiation profiles from `https://github.com/simone-silvestri/ComputationalThinking/raw/main/` using the Julia package DataDeps and open it using the JLD2 package +""" + +# ╔═║ 4d517df8-0496-40a2-8e44-5beda6cd7226 +# ╠═║ show_logs = false +begin + # We use the package DataDeps to download the data stored at `online_path` + ENV["DATADEPS_ALWAYS_ACCEPT"]="true" + + online_path = "https://github.com/simone-silvestri/ComputationalThinking/raw/main/" + + dh = DataDep("computional_thinking_data", + "Data for class", + [online_path * "observed_radiation.jld2", # Observed ASR and OLR (absorbed shortwave and outgoing longwave radiation) + online_path * "observed_T.jld2"] + ) + + DataDeps.register(dh) + + datadep"computional_thinking_data" + + obs_temp_path = @datadep_str "computional_thinking_data/observed_T.jld2" + obs_rad_path = @datadep_str "computional_thinking_data/observed_radiation.jld2" + + # Load the observed zonally and yearly averaged temperature profile + T_obs = jldopen(obs_temp_path)["T"] +end + +# ╔═║ 6932b969-0760-4f09-935a-478ac56de262 +md""" Ξ΅ $(@bind Ξ΅ PlutoUI.Slider(0:0.01:1, show_value=true, default = 0.0)) """ + +# ╔═║ 6ce47d90-d5a2-43c0-ad64-27c13aa0f5db +# RadiativeModel has parametric types {S, T, E, A, F, C} where the third one (E) +# corresponds to theemissivity +emissivity(model::RadiativeModel{<:Any, <:Any, <:Function}) = model.Ξ΅(model) + +# ╔═║ a93c36c9-b687-44b9-b0b6-5fe636ab061c +# Remember that our temperature can be a scalar or a vector, +# depending on the latitude given to construct the model +function time_step!(model::ExplicitRadiativeModel, Ξ”t) + # Temperatures at time step n + Tβ‚› = model.Tβ‚› + Tₐ = model.Tₐ + + Ξ± = albedo(model) + Ξ΅ = emissivity(model) + + # Calculate the explicit tendencies + Gβ‚› = @. Οƒ * (Ξ΅ * Tₐ^4 - Tβ‚›^4) + (1 - Ξ±) * model.Q + Gₐ = @. Οƒ * Ξ΅ * (Tβ‚›^4 - 2*Tₐ^4) + + # update temperatures to time step n+1 + @. model.Tβ‚› += Ξ”t * Gβ‚› / model.Cβ‚› + @. model.Tₐ += Ξ”t * Gₐ / model.Cₐ +end + +# ╔═║ c0ff6c61-c4be-462b-a91c-0ee1395ef584 +function construct_matrix(model, Ξ”t) + # Temperatures at time step n + Tβ‚› = model.Tβ‚› + Tₐ = model.Tₐ + + Ξ΅ = emissivity(model) + Q = model.Q + + Cₐ = model.Cₐ + Cβ‚› = model.Cβ‚› + + m = length(Tβ‚›) + + eₐ = @. Ξ”t * Οƒ * Tₐ^3 * Ξ΅ + eβ‚› = @. Ξ”t * Οƒ * Tβ‚›^3 + + # We build and insert the diagonal entries + Da = @. Cₐ + 2 * eₐ + Ds = @. Cβ‚› + eβ‚› + + D = [Da..., Ds...] + + # the off-diagonal entries corresponding to the interexchange terms + da = @. -Ξ΅ * eβ‚› + ds = @. -eₐ + + # spdiagm(idx => vector) constructs a sparse matrix + # with vector `vec` at the `idx`th diagonal + A = spdiagm(0 => D, + m => da, + -m => ds) + return A +end + +# ╔═║ 97e1ce89-f796-4bd1-8e82-94fc838829a6 +function time_step!(model::ImplicitRadiativeModel, Ξ”t) + # Construct the LHS matrix + A = construct_matrix(model, Ξ”t) + + Ξ± = albedo(model) + + # Calculate the RHS + rhsₐ = @. model.Cₐ * model.Tₐ + rhsβ‚› = @. model.Cβ‚› * model.Tβ‚› + Ξ”t * (1 - Ξ±) * model.Q + + rhs = [rhsₐ..., rhsβ‚›...] + + # Solve the linear system + T = A \ rhs + + nₐ = length(model.Tₐ) + nβ‚› = length(model.Tβ‚›) + + @inbounds @. model.Tₐ .= T[1:nₐ] + @inbounds @. model.Tβ‚› .= T[nₐ+1:nₐ+nβ‚›] +end + +# ╔═║ 00776863-2260-48a8-83c1-3f2696f11d96 +begin + function compare_methods!(Ξ΅, Ξ±, Ο•, Ξ”t) + + # Construct the two models + model_explicit = RadiativeModel(ExplicitTimeStep(); Ξ±, Ξ΅, Ο•) + model_implicit = RadiativeModel(ImplicitTimeStep(); Ξ±, Ξ΅, Ο•) + + # Time stepping parameters + stop_year = 50 + nsteps = Int((stop_year * 365) Γ· Ξ”t) # in Ξ”t days + + # Vectors holding Tβ‚›(time) + T_explicit = zeros(nsteps) + T_implicit = zeros(nsteps) + + # Time step and save temperature information + @inbounds for step in 1:nsteps + time_step!(model_explicit, Ξ”t) + time_step!(model_implicit, Ξ”t) + T_explicit[step] = model_explicit.Tβ‚›[1] + T_implicit[step] = model_implicit.Tβ‚›[1] + end + + # Calculate equilibrium temperature analytically + T_equilibrium = latitude_dependent_equilibrium_temperature(Ο•, Ξ΅, Ξ±) .* ones(nsteps) + T_reference = latitude_dependent_equilibrium_temperature(45.0, 0.75, 0.3) .* ones(nsteps) + + time_axis = (1:nsteps) .* (Ξ”t / 365) + + title = @sprintf("final temperature at %d α΅’N: (T_eq, T_exp, T_imp) = (%.2f, %.2f, %.2f) α΅’C", Ο•, T_equilibrium[end], T_explicit[end], T_implicit[end]) + + # Plot the results + fig = Figure(resolution = (800, 300)) + ax = Axis(fig[1, 1]; title, ylabel = "Temperature [K]", xlabel = "time [yr]") + lines!(ax, time_axis, T_reference, color = :black, linewidth = 1, linestyle=:dash, label = "equilibrium at 45 α΅’N and Ξ΅ = 0.75, Ξ± = 0.3") + lines!(ax, time_axis, T_equilibrium, color = :red, linewidth = 1, linestyle=:dashdot, label = "equilibrium temperature") + lines!(ax, time_axis, T_explicit , color = :blue, linewidth = 2, label = "explicit time stepping") + lines!(ax, time_axis, T_implicit , color = :green, linewidth = 2, label = "implicit time stepping") + + axislegend(ax, position = :rb, framevisible = false) + + return fig + end + + compare_methods!(values[1], values[2], values[3], values[4]) + current_figure() +end + +# ╔═║ dfde2f6a-f612-4013-8d42-5590221167c9 +function evolve_model!(model; Ξ”t = 30.0, stop_year = 40) + stop_iteration = Int(stop_year * 365 Γ· Ξ”t) + @inbounds for iter in 1:stop_iteration + time_step!(model, Ξ”t) + end +end + +# ╔═║ 1d8a69b7-52db-4865-8bf2-712c2b6442f5 +# ╠═║ show_logs = false +begin + Ο• = range(-89, 89, length=90) + + # calculating the equilibrium temperature + T_eq = latitude_dependent_equilibrium_temperature.(Ο•, Ref(Ξ΅), Ref(0.2985)); + + # construct and evolve a zero d model with constant Ξ΅ + model_lat = RadiativeModel(; Ξ΅, Ο•) + evolve_model!(model_lat, Ξ”t = 50, stop_year = 50); + + # plot the latitudinal dependent temperatures + plot_latitudinal_variables!(Ο•, [T_obs.-273.15, T_eq.-273.15, model_lat.Tβ‚› .- 273.15], + ["observed T", "equilibrium T", "modelled T"], + [:black, :green, :red], + [:dashdot, :solid, :solid]; ylims = (-60, 50), title = "emissivity: $Ξ΅"); + md""" + $(current_figure()) + **Figure**: Comparison between observed (dashed-dotted line) and temperature calculated by the model + """ +end + +# ╔═║ 5884999f-f136-4ae7-8831-cc3a36f50a98 +begin + ASR_obs = jldopen(obs_rad_path)["ASR"] + ASR(model) = (1 .- albedo(model)) .* model.Q + + plot_latitudinal_variables!(Ο•, [ASR(model_lat), ASR_obs], + ["modeled ASR [W/mΒ²]", "observed ASR [W/mΒ²]"], + [:red, :red], + [:solid, :dashdot], + ylabel = "") + md""" + ## Improving the model + + the model we constructed has several approximations which we can improve on + + ### Latitude-dependent albedo + + Till now, we assumed the albedo to be equal to 0.2985 because it gave us the best fit with observations in an averaged global scenario. However, is a constant albedo a good approximation when considering latitudinal dependency? We can infer the earth's _real_ albedo by looking at the absorbed radiation at the surface (ASR or absorbed shortwave radiation). In our model we can calculate it as such + ``` + ASR(model) = @. (1 - albedo(model)) * model.Q + ``` + $(current_figure()) + **Figure**: comparison between ASR used to force the RadiativeModel and the observed ASR (from [NCEP reanalysis](https://psl.noaa.gov/data/gridded/data.ncep.reanalysis.html)) + + The ASR seems lower at the poles, suggesting that the albedo is higher in those regions. This is a result of the lower sun angle present at the poles but also, the higher presence of fresh snow, ice, and smooth open water- all areas prone to high levels of reflectivity + + ``\alpha`` can be approximated with a function of ``\sin{\phi}`` that allows us to have a lower albedo at the poles than the one at the equator + ```math + \alpha(\phi) = \alpha_0 + \frac{\alpha_1}{2}\left( 3\sin^2{\phi} - 1\right) + ``` + ### Temperature-dependent emissivity + + If the temperature rises, the saturation pressure rises, allowing more water vapor to remain in equilibrium in the gaseous form in the atmosphere. Since the emissivity is largely dependent on the water vapor content, a temperature rise causes an increase in the atmosphere's emissivity. You have seen in 2.2 that this _feedback_ effect can be modeled with a linear function of temperature: + ```math + \varepsilon = \varepsilon_0 + \varepsilon_1 \log{\frac{\text{CO}_2}{{\text{CO}_2}_{\text{PRE}}}} + \varepsilon_2(T-T_{\text{PRE}}) + ``` + Where the subscript ``\text{PRE}`` indicates pre-industrial values. Remember! The temperature in the above formula is the _surface_ temperature. The effect of water vapor is not hugely important in the climate change context, as the vapor pressure of Hβ‚‚O is capped by the saturation pressure, but is of great importance in shaping the latitudinal temperature profile (it is much colder in the poles that in the equator). + To allow a temperature-dependent emissivity, we have to extend the ```emissivity``` method to ensure it can accept functions. We can define a function that accepts the model as an input and returns the temperature-dependent emissivity and use it as an input to our model + ``` + varΞ΅(model) = Ξ΅β‚€ + Ρ₁ * log2(440.0/280) + Ξ΅β‚‚ * (model.Tβ‚› - 286.38) + ``` + We that have to dispatch the emissivity function to behave in a different way when the Ξ΅ field of our RadiativeModel is a function + ``` + emissivity(model::RadiativeModel{<:Any, <:Any, <:Function}) = model.Ξ΅(model) + ``` + Note! Physical values of emissivity range between 0 and 1! + """ +end + +# ╔═║ f2510e0a-23f2-4a40-a7db-7b59898facfa +begin + # variable albedo + aβ‚€ = 0.312 + a₁ = 0.15 + varΞ± = @. aβ‚€ + a₁ .* 0.5 * (3 * sind(Ο•)^2 .- 1) + + # variable emissivity (function that depends on the model state) + Ξ΅β‚€, Ρ₁, Ξ΅β‚‚ = (0.75, 0.02, 0.005) + function varΞ΅(model) + return @. min(max(Ξ΅β‚€ + Ρ₁ * log2(440.0/280) + Ξ΅β‚‚ * (model.Tβ‚› - 286.38), 0), 1.0) + end +end + +# ╔═║ 4640a179-3373-4901-ac31-31022e8c7eb2 +begin + feedback_model = RadiativeModel(; Ξ΅ = varΞ΅, Ξ± = varΞ±, Ο•) + reference_model = RadiativeModel(; Ξ΅ = 0.8, Ο•) + + evolve_model!(feedback_model, Ξ”t = 50, stop_year = 50) + evolve_model!(reference_model, Ξ”t = 50, stop_year = 50); + + Ξ±_obs = 1 .- ASR_obs ./ feedback_model.Q + + fig_temp = plot_latitudinal_variables!(Ο•, [albedo(feedback_model), Ο• ./ Ο• .* 0.2985, Ξ±_obs], + ["varΞ±(model)", "Ξ± = 0.2985", "observed Ξ±"], + [:blue, :red, :black], + [:solid, :solid, :dashdot], ylabel = "albedo", + ylims = (0.0, 0.8), + leg_pos = :ct, + res = (700, 600)) + + fig_temp = plot_latitudinal_variables!(Ο•, [emissivity(feedback_model), Ο• ./ Ο• .* 0.75], + ["varΞ΅(model)", "Ξ΅ = 0.75"], + [:blue, :red], + [:solid, :dash], ylabel = "emissivity", + fig = fig_temp, + ax_pos = [1, 2], + ylims = (0.3, 1.0)) + + fig_temp = plot_latitudinal_variables!(Ο•, [feedback_model.Tβ‚› .- 273.15, + reference_model.Tβ‚› .- 273.15, + T_obs .- 273], + ["variable Ξ΅ and Ξ±", + "constant Ξ΅ and Ξ±", + "observed T"], + [:blue, :red, :black, :purple], + [:solid, :solid, :dashdot, :dash], + ylims = (-70, 70), + ax_pos = [2:2, 1:2], + fig = fig_temp) + + md""" + Let's take a look at our final latitudinal temperature model, complete with varying emissivity and albedo. + + $(current_figure()) + **Figure**: comparison between observed temperature (dashed-dotted line), temperature calculated from a model with constant ``\varepsilon`` and ``\alpha`` (red) and from a model with latitude-dependent ``\alpha`` and water vapor feedback (blue) + + The prediction worsens when compared to the simple constant emissivity/constant albedo model. This is usually a sign that we are neglecting some important physical phenomenon. + """ +end + +# ╔═║ d13c319d-345a-40b8-b90d-b0b226225434 +begin + OLR_obs = jldopen(obs_rad_path)["OLR"] + + OLR(model) = Οƒ .* ((1 .- emissivity(model)) .* model.Tβ‚›.^4 + emissivity(model) .* model.Tₐ.^4) + + plot_latitudinal_variables!(Ο•, [ASR_obs, ASR(feedback_model), OLR_obs, OLR(feedback_model)], + ["Observed ASR", + "Modeled ASR", + "Observed OLR", + "Modeled OLR"], + [:red, :red, :blue, :blue], + [:dashdot, :solid, :dashdot, :solid], + ylabel = "ASR and OLR [W/mΒ²]") + + md""" + ### Outgoing Longwave Radiation (OLR) + + Outgoing longwave radiation is the energy that the earth loses to space in the form of radiative emission. It has a contribution from the atmosphere and a contribution from the emitted energy from the surface that manages to escape from the absorption of the atmosphere + ``` + OLR(model) = @. (1 - emissivity(model)) * Οƒ * model.Tβ‚›^4 + emissivity(model) * Οƒ * model.Tₐ^4 + ``` + + $(current_figure()) + **Figure**: comparison between observed and calculated ASR and OLR + + The OLR and ASR from our model match quite closely. This is expected: since every latitude in our model is independent, the incoming energy (ASR) must match the outgoing energy (OLR) for energy conservation to hold. This is not the case for the observed profiles. We see that at the equator the incoming energy is larger than the emission and vice-versa happens at the poles. This is an indication that, in the real climate system, energy is transported from the equator to the poles. The mechanism that allows this heat transport is the presence of a global atmospheric circulation. + """ +end + +# ╔═║ 8f21fc70-e369-4938-b0c2-5a4fbae71713 +md""" +### Global atmospheric circulation + +There are three main factors that we have to take into account when considering large scale atmospheric circulation: +- hot air rises +- cold air sinks +- Coriolis force pushes winds to the right in the upper hemisphere and to the left in the lower hemisphere + +Hot air in the equator rises upwards and moves towards the pole. It cools down in the process and about 30α΅’ it starts to sink creating large circulation cells called Hadley cells. At the poles, cold dense air tends to sink and move down towards the equator, creating the Polar pressure cells. While moving toward the equator, the air coming from the pole encounters faster spinning latitudes and is, therefore, diverted by the Coriolis effect. In between these two major cells, we form strong winds which are diverted towards the east (westerlies) + +$(Resource("https://tdgil.com/wp-content/uploads/2020/04/Hadley-Cells-and-Wind-Directions.jpg", :height => 500)) +**Figure**: schematic depicting the global atmospheric circulation + +Global circulation requires the solution of a complex system of partial differential equations on the sphere. These equations (named Navier-Stokes equations) the conservation of mass, momentum, and energy in the climate system. +```math +\begin{align} + & \frac{\partial\boldsymbol{\rho u}}{\partial t} + \boldsymbol{\nabla} \cdot (\rho \boldsymbol{u} \otimes \boldsymbol{u}) + f\widehat{\boldsymbol{z}} \times \boldsymbol{u} = - \boldsymbol{\nabla} p + \rho \boldsymbol{g} \\ +& \frac{\partial \rho e}{\partial t} + \boldsymbol{\nabla}\cdot (\boldsymbol{u} (\rho e + p)) = Q_{incom} - \varepsilon \sigma T^4 \\ +& \frac{\partial \rho}{\partial t} + \boldsymbol{\nabla} \cdot (\rho \boldsymbol{u}) = 0 \\ +\end{align} +``` +complemented by an equation of state (usually ideal gas) in the form ``p = EOS(\rho, e)``. General Circulation Models (or GCMs) solve this system of equations on a discrete three-dimensional grid to provide velocities and temperatures on the surface and in the atmosphere. +""" + +# ╔═║ 901548f8-a6c9-48f8-9c8f-887500081316 +md""" +# Section 2.4: Heat transport + +We have seen that the latitudinal temperature gradient generates a global circulation that transports heat from the equator to the poles. It is too computationally expensive to solve the governing equations here (General Circulation Models, or GCMs run ono supercomputers for days to solve the climate system). So we have to model our latitudinal transport in an easier way +""" + +# ╔═║ 567fa8d3-35b4-40d7-8404-ae78d2874380 +md""" +## Modeling latitudinal transport +what do we have to add to our model to include atmospheric circulation? + +```math +\begin{align} +C_a \frac{dT_a}{dt} & = \sigma T_s^4 - 2\varepsilon \sigma T_a^4 + \mathcal{T}_a \\ +C_s \frac{dT_s}{dt} & = - \sigma T_s^4 + \varepsilon \sigma T_a^4 + (1 - \alpha) Q + \mathcal{T}_s +\end{align} +``` + +where ``\mathcal{T}_a`` and ``\mathcal{T}_s`` represent the source/sink caused by heat transported around by currents in the atmosphere and in the ocean. + +How can we calculate these additional terms? + +$(Resource("https://raw.githubusercontent.com/simone-silvestri/ComputationalThinking/main/schematic.png", :height => 400)) +**Figure**: energy fluxes in our control volume. + +In our control volume we have a flux in ``F^+`` and a flux out ``F^-`` +The energy stored in out control volume (``\mathcal{T}``) will be the difference of the fluxes divided by the surface are of the control volume, where +```math +A = \underbrace{2\pi R \cos{\phi}}_{\text{circumference}} \cdot \underbrace{R\Delta \phi}_{\text{width}} +``` +So +```math +\mathcal{T} = - \frac{1}{2\pi R^2 \cos{\phi}} \frac{F^- - F^+}{\Delta \phi} +``` +taking ``\Delta \phi \rightarrow 0`` +```math +\mathcal{T} = - \frac{1}{2\pi R^2 \cos{\phi}} \frac{\partial F}{\partial \phi} +``` + +How can we represent ``F``? +Mathematically, the flux at the boundary of a computational element is calculated as ``(V\cdot T)``. The velocity ``V`` is the flow velocity at the interface of the element, which is determined by the Navier-Stokes equations, 3-dimensional PDEs that ensure momentum conservation in fluid dynamic systems. These equations are notoriously hard to solve, they require very fine grids due to the chaotic nature of fluid flows. Therefore, we will take a shortcut and _parametrize_ the flux at the interface (i.e., approximate the flux with a semi-empirical model). +We can think at the transport of heat by the atmosphere as moving heat from _HOT_ to _COLD_ regions of the earth. In general, this holds if we zoom out enough. We can think of the transport by the atmosphere as a diffusion process, which goes "DOWN" the gradient of temperature. As such we can parametrize the heat flux with an effective conductivity +```math +F \approx - 2\pi R^2 \cos{\phi} \cdot \kappa \frac{\partial T}{\partial \phi} +``` +where ``\kappa`` is the "conductivity" of our climate system in W/(mΒ²K) due to the movement in the atmosphere +And, finally assuming that ``\kappa`` does not vary in latitude (very strong assumption!) we can model the heat source due to transport as +```math +\mathcal{T} = \frac{\kappa}{\cos{\phi}} \frac{\partial}{\partial \phi} \left(\cos{\phi} \frac{\partial T}{\partial \phi} \right) +``` + +NOTE: in a metal rod, where the area does not vary with length, the ``cos`` terms drop and a heat diffusion can be modelled with just +```math +\mathcal{T} \approx D \frac{\partial^2 T}{\partial x^2} +``` +""" + +# ╔═║ 0d8fffdc-a9f5-4d82-84ec-0f27acc04c21 +md""" +## Let's code it up! + +Our governing system of equation is now a system of PDE, so we have to solve the Ο•-direction as well at the time. + +```math +\begin{align} +C_a \frac{\partial T_a}{\partial t} & = \sigma T_s^4 - 2\varepsilon \sigma T_a^4 + \frac{\kappa}{\cos{\phi}} \frac{\partial}{\partial \phi} \left(\cos{\phi} \frac{\partial T_a}{\partial \phi} \right)\\ +C_s \frac{\partial T_s}{\partial t} & = - \sigma T_s^4 + \varepsilon \sigma T_a^4 + (1 - \alpha) Q + \frac{\kappa}{\cos{\phi}} \frac{\partial}{\partial \phi} \left(\cos{\phi} \frac{\partial T_s}{\partial \phi} \right) +\end{align} +``` + +We need to define a ``\Delta x`` (or ``\Delta \phi`` in our case) and we can discretize a spatial derivative in the same way as the time-derivative +```math +\left[\frac{1}{\cos{\phi}} \frac{\partial}{\partial \phi} \left(\cos{\phi} \frac{\partial T}{\partial \phi} \right) \right]_j \approx \frac{1}{\cos{\phi_j} \Delta \phi} \left(\left[ \cos{\phi} \frac{\partial T}{\partial \phi} \right]_{j+1/2} - \left[ \cos{\phi} \frac{\partial T}{\partial \phi} \right]_{j-1/2} \right) +``` +In the same way we can approximate the first derivative on interfaces as +```math +\left[\cos{\phi}\frac{\partial T}{\partial \phi} \right]_{j+1/2} \approx \cos{\phi_{j+1/2}}\frac{T_{j+1} - T_{j}}{\Delta \phi} +``` +The additional tendency term caused by heat transport becomes: +```math +G_\kappa = \frac{\kappa}{\cos{\phi_j}\Delta \phi} \left(\cos{\phi_{j+1/2}} \frac{T_{j+1} - T_j}{\Delta \phi} - \cos{\phi_{j-1/2}} \frac{T_{j} - T_{j-1}}{\Delta \phi} \right) +``` +""" + + +# ╔═║ 930935f8-832a-45b4-8e5e-b194afa917c6 +# begin +# struct DiffusiveModel{S, T, K, E, A, F, C, Ξ¦F, Ξ¦C} +# stepper :: S +# Tβ‚› :: T # surface temperature +# Tₐ :: T # atmospheric temperature +# ΞΊβ‚› :: K # surface diffusivity +# κₐ :: K # atmospheric diffusivity +# Ξ΅ :: E # atmospheric emissivity +# Ξ± :: A # surface albedo +# Q :: F # forcing +# Cβ‚› :: C # surface heat capacity +# Cₐ :: C # atmospheric heat capacity +# Ο•αΆ  :: Ξ¦F # the latitudinal grid at interface points +# Ο•αΆœ :: Ξ¦C # the latitudinal grid at center points +# end + +# const ExplicitDiffusiveModel = DiffusiveModel{<:ExplicitTimeStep} +# const ImplicitDiffusiveModel = DiffusiveModel{<:ImplicitTimeStep} + +# timestepping(model::ExplicitDiffusiveModel) = "Explicit" +# timestepping(model::ImplicitDiffusiveModel) = "Implicit" + +# # We define a constructor for the DiffusiveModel +# function DiffusiveModel(step, N; ΞΊ = 0.55, ΞΊβ‚› = ΞΊ, Ξ΅ = 0.5, Ξ± = 0.2985, Q = 341.3) +# Cβ‚› = 1000.0 * 4182.0 * 100 / (3600 * 24) # ρ * c * H / seconds_per_day +# Cₐ = 1e5 / 10 * 1000 / (3600 * 24) # Ξ”p / g * c / seconds_per_day +# Ο•αΆ  = range(-Ο€/2, Ο€/2, length=N+1) +# Ο•αΆœ = 0.5 .* (Ο•αΆ [2:end] .+ Ο•αΆ [1:end-1]) +# Tβ‚› = 288.0 * ones(N) +# Tₐ = 288.0 * ones(N) +# return DiffusiveModel(step, Tβ‚›, Tₐ, ΞΊβ‚›, ΞΊ, Ξ΅, Ξ±, Q, Cβ‚›, Cₐ, Ο•αΆ , Ο•αΆœ) +# end + +# # A pretty show method that displays the model's parameters +# function Base.show(io::IO, model::DiffusiveModel) +# print(io, "One-D energy budget model with:", '\n', +# "β”œβ”€β”€ time stepping: $(timestepping(model))", '\n', +# "β”œβ”€β”€ Ξ΅: $(emissivity(model))", '\n', +# "β”œβ”€β”€ Ξ±: $(albedo(model))", '\n', +# "β”œβ”€β”€ ΞΊ: $(model.ΞΊβ‚›)", '\n', +# "└── Q: $(model.Q) Wm⁻²") +# end + +# # We define, again, the emissivities and albedo as function of the model +# emissivity(model::DiffusiveModel) = model.Ξ΅ +# emissivity(model::DiffusiveModel{<:Any, <:Any, <:Any, <:Function}) = model.Ξ΅(model) + +# albedo(model::DiffusiveModel) = model.Ξ± +# albedo(model::DiffusiveModel{<:Any, <:Any, <:Any, <:Any, <:Function}) = model.Ξ±(model) +# end + +# ╔═║ abdbbcaa-3a76-4a47-824d-6da73bc71c31 +# test_1D_model = DiffusiveModel(ImplicitTimeStep(), 90) + +# ╔═║ 1cef338d-5c4a-4ea5-98d7-9ac4f11922f3 +md""" +### Coding explicit time stepping with diffusion + +Coding the explicit time stepping won't be too different than what we did with the ODE. \ +We define the tendencies and add the explicit diffusion term calculated as above. \ +This time we need boundary conditions for our PDE. + +We assume that there are no fluxes over the poles. +```math +F^+(90^\circ) = F^-(-90^\circ) = 0 +``` + +""" + +# ╔═║ 71cff056-a36c-4fd4-babb-53018894ac5c +# begin +# function explicit_diffusion(T, Δϕ, Ο•αΆ , Ο•αΆœ) +# # Calculate the flux at the interfaces +# Flux = cos.(Ο•αΆ [2:end-1]) .* (T[2:end] .- T[1:end-1]) ./ Δϕ +# # add boundary conditions +# # We impose 0-flux boundary conditions +# Flux = [0.0, Flux..., 0.0] +# return 1 ./ cos.(Ο•αΆœ) .* (Flux[2:end] .- Flux[1:end-1]) ./ Δϕ +# end + +# function tendencies(model) +# Tβ‚› = model.Tβ‚› +# Tₐ = model.Tₐ +# Ξ± = albedo(model) +# Ξ΅ = emissivity(model) + +# Δϕ = model.Ο•αΆ [2] - model.Ο•αΆ [1] +# Dβ‚› = model.ΞΊβ‚› .* explicit_diffusion(model.Tβ‚›, Δϕ, model.Ο•αΆ , model.Ο•αΆœ) +# Dₐ = model.κₐ .* explicit_diffusion(model.Tₐ, Δϕ, model.Ο•αΆ , model.Ο•αΆœ) + +# Gβ‚› = @. (1 - Ξ±) * model.Q + Οƒ * (Ξ΅ * Tₐ^4 - Tβ‚›^4) + Dβ‚› +# Gₐ = @. Οƒ * Ξ΅ * (Tβ‚›^4 - 2 * Tₐ^4) + Dₐ +# return Gβ‚›, Gₐ +# end + +# function time_step!(model::ExplicitDiffusiveModel, Ξ”t) + +# Gβ‚›, Gₐ = tendencies(model) + +# model.Tβ‚› .+= Ξ”t * Gβ‚› / model.Cβ‚› +# model.Tₐ .+= Ξ”t * Gₐ / model.Cₐ +# end +# end + +# ╔═║ 83be4f9d-6c85-4e5b-9379-00618c9e39be +md""" +### Coding implicit time stepping with diffusion + +to code an implicit time stepping method, we can reutilize the matrix we used before (the sources and interexchange terms do not change) +There are new terms to be added: + +```math +G_\kappa^{(n+1)} = \frac{\kappa}{\cos{\phi_j}\Delta \phi} \left(\cos{\phi_{j+1/2}} \frac{T_{j+1}^{(n+1)} - T_j^{(n+1)}}{\Delta \phi} - \cos{\phi_{j-1/2}} \frac{T_{j}^{(n+1)} - T_{j-1}^{(n+1)}}{\Delta \phi} \right) +``` +we can rearrange it as +```math +G_\kappa^{(n+1)} = \kappa\frac{\cos{\phi_{j-1/2}}}{\cos{\phi_j}\Delta\phi^2} T_{j-1}^{(n+1)} + \kappa\frac{\cos{\phi_{j+1/2}}}{\cos{\phi_j}\Delta\phi^2} T_{j+1}^{(n+1)} - \kappa\frac{\cos{\phi_{j+1/2}} + \cos{\phi_{j-1/2}}}{\cos{\phi_j}\Delta\phi^2} T_j^{(n+1)} +``` +```math +G_\kappa^{(n+1)} = a T_{j-1}^{(n+1)} + c T_{j+1}^{(n+1)} - (a+c) T_j^{(n+1)} +``` +where +```math +a = \kappa\frac{\cos{\phi_{j-1/2}}}{\cos{\phi_j}\Delta\phi^2} \ \ \ \text{and} \ \ \ c = \kappa\frac{\cos{\phi_{j+1/2}}}{\cos{\phi_j}\Delta\phi^2} +``` +we have to add ``(a+c)`` to the diagonal, ``a`` to the diagonal at position ``-1`` and ``c`` to the diagonal at position ``+1`` + +**_Adding boundary conditions_** \ +at ``j = 1/2`` we impose a no flux boundary condition. This implies that +```math +F_{1/2} = 0 \Rightarrow T_0 = T_1 +``` +then ``G_{\kappa}^{(n+1)}`` at 1 simplifies to +```math +\left[G_\kappa^{(n+1)}\right]_1 = c T_{2}^{(n+1)} - c T_1^{(n+1)} +``` +Simply put, we avoid adding ``a`` to the first row. The same happens for ``G_{\kappa}^{(n+1)}`` at ``m`` (with ``m`` the length of ``\phi``) where, assuming that ``F_{m+1/2} = 0`` implies that +```math +\left[G_\kappa^{(n+1)}\right]_m = a T_{m-1}^{(n+1)} - a T_m^{(n+1)} +``` +""" + +# ╔═║ 7c7439f0-d678-4b68-a5e5-bee650fa17e2 +# function construct_diffusion_matrix(model, Ξ”t) + +# A = construct_matrix(model, Ξ”t) + +# cosΟ•αΆœ = cos.(model.Ο•αΆœ) +# Δϕ = model.Ο•αΆ [2] - model.Ο•αΆ [1] + +# a = @. 1 / Δϕ^2 / cosΟ•αΆœ * cos(model.Ο•αΆ [1:end-1]) +# c = @. 1 / Δϕ^2 / cosΟ•αΆœ * cos(model.Ο•αΆ [2:end]) + +# m = length(model.Tβ‚›) +# for i in 1:m +# # Adding the off-diagonal entries corresponding to Tβ±Όβ‚Šβ‚ (exclude the last row) +# if i < m +# A[i , i+1] = - Ξ”t * model.κₐ * c[i] +# A[i+m, i+1+m] = - Ξ”t * model.ΞΊβ‚› * c[i] +# end +# # Adding the off-diagonal entries corresponding to Tⱼ₋₁ (exclude the first row) +# if i > 1 +# A[i, i-1] = - Ξ”t * model.κₐ * a[i] +# A[i+m, i-1+m] = - Ξ”t * model.ΞΊβ‚› * a[i] +# end +# # Adding the diagonal entries +# A[i , i] += Ξ”t * model.κₐ * (a[i] + c[i]) +# A[i+m, i+m] += Ξ”t * model.ΞΊβ‚› * (a[i] + c[i]) +# end + +# return A +# end + +# ╔═║ 57dde8ad-f7de-4ca6-bfab-235bc13131c0 +md""" +Last thing to do is calculate the rhs and solve the linear system +""" + +# ╔═║ 9a5ac384-f5e6-41b0-8bc4-44e2ed6be472 +# function time_step!(model::ImplicitDiffusiveModel, Ξ”t) + +# A = construct_diffusion_matrix(model, Ξ”t) +# Ξ± = albedo(model) + +# rhsₐ = model.Cₐ .* model.Tₐ +# rhsβ‚› = model.Cβ‚› .* model.Tβ‚› .+ Ξ”t .* (1 .- Ξ±) .* model.Q + +# rhs = [rhsₐ..., rhsβ‚›...] + +# T = A \ rhs + +# nₐ = length(model.Tₐ) +# nβ‚› = length(model.Tβ‚›) + +# model.Tₐ .= T[1:nₐ] +# model.Tβ‚› .= T[nₐ+1:nₐ+nβ‚›] +# end + +# ╔═║ d1a741ad-f28d-48c7-9f15-d55d0801573d +md""" +# Temperature distribution with diffusion +""" + +# ╔═║ a046b625-b046-4ca0-adde-be5249a420f4 +md""" ΞΊ $(@bind ΞΊ_slider PlutoUI.Slider(0:0.01:1, show_value=true)) """ + +# ╔═║ 514ee86b-0aeb-42cd-b4cd-a795ed23b3de +# begin +# F = annual_mean_insolation.(Ο•) + +# model_1D = DiffusiveModel(ImplicitTimeStep(), length(F); ΞΊ = ΞΊ_slider, Ξ΅ = varΞ΅, Ξ± = varΞ±, Q = F) + +# evolve_model!(model_1D, Ξ”t = 1, stop_year = 50) + +# DTΞΊ0 = feedback_model.Tβ‚›[45] - feedback_model.Tβ‚›[end] +# DTΞΊ1 = model_1D.Tβ‚›[45] - model_1D.Tβ‚›[end] +# DTob = T_obs[45] - T_obs[end-6] + +# title = @sprintf("T(0α΅’) - T(90α΅’): %.2f (ΞΊ = 0), %.2f (ΞΊ = %.2f), %.2f (obs)", +# DTΞΊ0, DTΞΊ1, ΞΊ_slider, DTob) + +# plot_latitudinal_variables!(Ο•, [feedback_model.Tβ‚› .- 273, +# model_1D.Tβ‚› .- 273, +# T_obs .- 273], +# ["model with ΞΊ = 0", +# "model with ΞΊ = $ΞΊ_slider", +# "observed T"], +# [:blue, :blue, :black], +# [:dash, :solid, :dashdot]; +# ylims = (-70, 70), title) + +# current_figure() +# end + +# ╔═║ c98fcf26-d715-47c2-84ac-63bffe02d813 +md""" +Is this a sensible conductivity value? Heat transport is caused by atmospheric circulation, so what is a plausible value of the diffusivity caused by atmospheric motion? If we take into account the velocity of a typical atmospheric eddy ``V``, the order of magnitude of the flux is ``V \cdot T`` (where ``T`` is a temperature scale). We parameterize this with a term that looks like ``K \cdot T / L`` where ``K`` is our diffusivity expressed in mΒ²/s and ``L`` is a typical length scale of movement in the atmosphere. Then it should hold that +```math +K \cdot\frac{T}{L} \sim V \cdot T +``` +If we fill in typical values for atmospheric velocity and length scales (about ``20`` m/s and ``2000`` km) we get that +```math +K \sim V\cdot L \sim 10^7 \ \ \text{m}^2/s +``` +This diffusivity corresponds to a conductivity ``\kappa`` (in W/mΒ²K) of +```math +\kappa \sim \frac{K C_a}{2\pi R^2} \approx 0.45 \ \ \text{W}/\text{m}^2\text{K} +``` +""" + +# ╔═║ 6534f98d-1270-4e7c-8ce8-66a6b1ee48f7 +# begin +# HF(model) = model.ΞΊβ‚› .* explicit_diffusion(model.Tβ‚›, deg2rad(2), model.Ο•αΆ , model.Ο•αΆœ) + +# plot_latitudinal_variables!(Ο•, [ASR(model_1D), +# OLR(model_1D), +# HF(model_1D)], +# ["ASR", "OLR", "transport"], +# [:red, :blue, :green], +# [:solid, :dash, :solid, :dash, :solid], +# ylabel = "Energy Budget Wm⁻²", +# leg_pos = :cc) +# md""" +# $(current_figure()) +# **Figure**: Energy budget for a climate with transport. +# """ +# end + +# ╔═║ 77a73a9d-9d78-4cf5-ae19-f1107fa5b4c2 +begin + md""" + + Heat flux can only redistribute energy. It is then important to check that our solution method does not create or destroy energy. + Let's compute the integral of the transport term in latitude + ```math + \int_{-90^o}^{90^o} \mathcal{T} \cos{\phi} d\phi \approx \sum_{j = 1}^N \mathcal{T}_j \cos{\phi_j} \cdot (\phi_{j+1/2} - \phi_{j-1/2}) + ``` + This is a good sanity check to make sure that our model is doing what is intended + """ +end + +# ╔═║ 80c72898-139e-44af-bab0-ca638f282188 +# sum(HF(model_1D) .* cos.(model_1D.Ο•αΆœ) .* (model_1D.Ο•αΆ [2:end] .- model_1D.Ο•αΆ [1:end-1])) + +# ╔═║ b0ca64b8-0211-4d1c-b007-7583bf8ac908 +md""" +## Stability of a diffusive model + +Let's, once again, reduce the two equations to a more simple, 1D partial differential equation, which only has a diffusion term. You can imagine that greenhouse gases are immediately removed from the atmosphere. As a result, the atmosphere stops absorbing heat from the surface and emitting it in space. The remaining heat then will only redistribute via transport along the atmosphere. (we also simplify the earth to be "flat", i.e., no cosines) + +```math +\frac{\partial T}{\partial t} = K \frac{\partial^2 T}{\partial x^2} +``` +where ``K`` is the diffusivity in mΒ²/s +```math +\frac{T^{(n+1)}_j - T^{(n)}_j}{\Delta t} = K \frac{T^{(n)}_{j+1} - 2T^{(n)}_j+ T^{(n)}_j}{\Delta x^2} +``` + +Imagine the initial temperature profile can be approximated by a spatial wave of wavenumber ``k``, i.e, +```math +T^{(n)}_j = \xi^{(n)}e^{ikx_j} \ , \ \ \ \ \text{where} \ \ \ \ x_j = j\Delta x +``` + +Let's substitute in the following equation and divide by ``\xi^{(n)}e^{ikj\Delta x}`` +```math +\left( \frac{\xi^{(n+1)}}{\xi^{(n)}} - 1\right) = K\Delta t \frac{e^{ik \Delta x} - 2 + e^{- ik \Delta x}}{\Delta x^2} +``` + +we can use ``e^{i\theta} + e^{-i\theta} = 2\cos{\theta}`` and we get +```math +\frac{\xi^{(n+1)}}{\xi^{(n)}} = 1 +\frac{K \Delta t}{\Delta x^2} \underbrace{\left( 2\cos{k\Delta x} - 2\right)}_{\text{between \ } -4 \text{ \ and \ } 0} +``` + +The worst-case scenario occurs for wavenumbers ``k`` which give +```math +\frac{\xi^{(n+1)}}{\xi^{(n)}} = 1 - 4\frac{K \Delta t}{\Delta x^2} +``` +again, we want the amplitude to remain positively correlated (otherwise it means that heat transfers from cold to hot temperatures), so we must ensure that +```math +\Delta t < \frac{\Delta x^2}{4K} +``` +In the previous case, we had that at temperatures which were reasonable for the atmosphere, the limitation was in the tenth of days... \ +We already saw that a reasonable diffusivity (in mΒ²/s) for the atmosphere is +```math +K \approx 10^7 \ \ \text{m}^2/\text{s} +``` +If we have a model with a two-degree resolution (90 points), then ``\Delta x = R \Delta \phi \approx 200`` km, which means that the condition on the time step is +```math +\Delta t < \frac{(2\cdot 10^{5})^2}{4 \cdot 10^7} = 1000 s +``` +We introduced another limitation in our explicit time stepping. The time step is connected with the spatial resolution of our model. This limitation is called CFL condition (Courant–Friedrichs–Lewy condition) and ensures that the temperature does not move more than one spatial grid cell in one-time step. + +**do it by yourself** \ +Demonstrate that implicit time stepping does not have the same limitations +""" + +# ╔═║ 51f3fd00-508b-4b42-bd95-ae19cb19b4db +md""" +## Ice-albedo feedback and the Snowball earth + +The albedo of Earth's surface varies from about 0.1 for the oceans to 0.6–0.9 for ice and clouds β€” meaning that clouds, snow, and ice are good radiation reflectors while liquid water is not. +We can build this process in our model by imagining the earth covered by ice when we lower the temperature below a certain threshold ``T_{ice}`` + +```math +\alpha(\phi, T) = \begin{cases} \alpha(\phi) & \ \ \text{if} \ \ T > T_{ice} \\ \alpha_{ice} & \ \ \text{if} \ \ T \le T_{ice} \end{cases} +``` +where ``\alpha(\phi)`` is our previously defined array `varΞ±`, ``T_{ice} = -10`` ``^\circ``C and ``\alpha_{ice} = 0.7`` +""" + +# ╔═║ 65dedef2-03e5-4e0f-8022-53168952e7a8 +# begin +# Ξ±_feedback(T, Ξ±) = T > 273.15 - 10.0 ? Ξ± : 0.7 +# ΞΊ = 0.5 +# Ξ±_model(model) = Ξ±_feedback.(model.Tβ‚›, varΞ±) + +# current_climate_model = DiffusiveModel(ImplicitTimeStep(), length(F); ΞΊ = 0.5, Ξ΅ = varΞ΅, Ξ± = Ξ±_model, Q = F) + +# current_climate_model.Tβ‚› .= model_1D.Tβ‚› +# current_climate_model.Tₐ .= model_1D.Tₐ + +# evolve_model!(current_climate_model, Ξ”t = 50, stop_year = 150) +# plot_latitudinal_variables!(Ο•, [feedback_model.Tβ‚› .- 273, +# model_1D.Tβ‚› .- 273, +# current_climate_model.Tβ‚› .- 273, +# T_obs .- 273], +# ["model with ΞΊ = 0", +# "model with ΞΊ = $ΞΊ_slider", +# "model with Ξ± feedback", +# "observed T"], +# [:blue, :blue, :red, :black], +# [:dash, :solid, :solid, :dashdot]; +# ylims = (-70, 70)) + + +# current_figure() +# end + +# ╔═║ 8afe64e3-d19a-4801-b7b8-56d886f7a59a +# plot_latitudinal_variables!(Ο•, [ASR(current_climate_model), +# OLR(current_climate_model), +# HF(current_climate_model)], +# ["ASR", "OLR", "transport"], +# [:red, :blue, :green], +# [:solid, :solid, :solid], +# ylabel = "Energy Budget Wm⁻²", +# leg_pos = :cc) + +# ╔═║ ebcf224f-c006-4098-abf0-5c3644e2ee97 +md""" +There will be a latitude where ``T_{\phi} = T_{ice}`` above which the earth will be covered in ice. We call this latitude ice line. +Let's define an **ice_line** function that retreives this latitude +""" + +# ╔═║ 73238f6c-b8d3-4f92-bdfe-1c657e239903 +# function ice_line(model) +# idx = searchsortedlast(model.Tβ‚›, 273.15 - 10) + +# return idx == 0 ? 90.0 : idx > length(model.Ο•αΆœ) ? 0.0 : - rad2deg(model.Ο•αΆœ[idx]) +# end + +# ╔═║ 247b4c3a-2777-47ed-8cc9-e90a5cdb640b +# "the ice line of our model is at $(ice_line(current_climate_model)) α΅’N" + +# ╔═║ 0353c906-55d9-4419-a55d-8fcd374004d7 +# begin +# function calc_different_climates(initial_condition_model; forcing) +# ice_line_model = zeros(length(forcing)) +# for (idx, Sβ‚€) in enumerate(forcing) +# Fβ‚‚ = annual_mean_insolation.(Ο•; Sβ‚€) +# model_tmp = DiffusiveModel(ImplicitTimeStep(), length(Fβ‚‚); ΞΊ, Ξ΅ = varΞ΅, Ξ± = Ξ±_model, Q = Fβ‚‚) + +# model_tmp.Tβ‚› .= initial_condition_model.Tβ‚› +# model_tmp.Tₐ .= initial_condition_model.Tₐ + +# evolve_model!(model_tmp, Ξ”t = 100, stop_year = 100) + +# ice_line_model[idx] = ice_line(model_tmp) +# end +# return ice_line_model +# end +# end + +# ╔═║ 1c33dc21-04af-4139-9061-696db73c3249 +# begin +# S₀₁ = range(1200.0, 1450, length = 25) +# ice_line_current = calc_different_climates(current_climate_model, forcing = S₀₁) + +# figure_ice = Figure(resolution = (500, 300)) + +# ax_ice = Axis(figure_ice[1, 1], title = "ice line", ylabel = "Ο• [α΅’N]", xlabel = "forcing Sβ‚€ [W/mΒ²]") +# lines!(ax_ice, S₀₁, ice_line_current, label = "initial condition: current climate") +# current_figure() +# end + +# ╔═║ 70713834-3246-45a4-a4c8-68513bb853ce +md""" +Let's start from another initial condition + +""" + +# ╔═║ 2b33a8a1-3772-4fb3-a914-a20a7aae91bc +# begin +# low_F = annual_mean_insolation.(Ο•; Sβ‚€ = S₀₁[1]) +# cold_climate_model = DiffusiveModel(ImplicitTimeStep(), length(low_F); ΞΊ, Ξ΅ = varΞ΅, Ξ± = Ξ±_model, Q = low_F) +# evolve_model!(cold_climate_model, Ξ”t = 100, stop_year = 100) + +# new_current_climate_model = DiffusiveModel(ImplicitTimeStep(), length(low_F); ΞΊ, Ξ΅ = varΞ΅, Ξ± = Ξ±_model, Q = F) +# new_current_climate_model.Tβ‚› .= cold_climate_model.Tβ‚› +# new_current_climate_model.Tₐ .= cold_climate_model.Tₐ + +# evolve_model!(new_current_climate_model, Ξ”t = 100, stop_year = 1000) + + +# plot_latitudinal_variables!(Ο•, [current_climate_model.Tβ‚› .- 273, +# cold_climate_model.Tβ‚› .- 273, +# new_current_climate_model.Tβ‚› .- 273], +# ["current climate", +# "cold climate (Sβ‚€ = 1200)", +# "current climate, different initial conditions"], +# [:blue, :blue, :red, :black], +# [:dash, :solid, :solid, :dashdot]; +# ylims = (-100, 70)) +# end + +# ╔═║ b768707a-5077-4662-bcd1-6d38b3e4f929 +html""" + + """ + + +# ╔═║ 419c8c31-6408-489a-a50e-af712cf20b7e +TableOfContents(title="πŸ“š Table of Contents", indent=true, depth=4, aside=true) + +# ╔═║ 00000000-0000-0000-0000-000000000001 +PLUTO_PROJECT_TOML_CONTENTS = """ +[deps] +CairoMakie = "13f3f980-e62b-5c42-98c6-ff1f3baf88f0" +DataDeps = "124859b0-ceae-595e-8997-d05f6a7a8dfe" +JLD2 = "033835bb-8acc-5ee8-8aae-3f567f8a3819" +LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" +Optim = "429524aa-4258-5aef-a3af-852621145aeb" +Pkg = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" +PlutoUI = "7f904dfe-b85e-4ff6-b463-dae2292396a8" +Printf = "de0858da-6303-5e67-8744-51eddeeeb8d7" +SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + +[compat] +CairoMakie = "~0.8.13" +DataDeps = "~0.7.10" +JLD2 = "~0.4.23" +Optim = "~1.7.3" +PlutoUI = "~0.7.40" +""" + +# ╔═║ 00000000-0000-0000-0000-000000000002 +PLUTO_MANIFEST_TOML_CONTENTS = """ +# This file is machine-generated - editing it directly is not advised + +julia_version = "1.8.2" +manifest_format = "2.0" +project_hash = "c8c9f931ec61b36fd507e482034d6aa1f2bc84c3" + +[[deps.AbstractFFTs]] +deps = ["ChainRulesCore", "LinearAlgebra"] +git-tree-sha1 = "69f7020bd72f069c219b5e8c236c1fa90d2cb409" +uuid = "621f4979-c628-5d54-868e-fcf4e3e8185c" +version = "1.2.1" + +[[deps.AbstractPlutoDingetjes]] +deps = ["Pkg"] +git-tree-sha1 = "8eaf9f1b4921132a4cff3f36a1d9ba923b14a481" +uuid = "6e696c72-6542-2067-7265-42206c756150" +version = "1.1.4" + +[[deps.AbstractTrees]] +git-tree-sha1 = "5c0b629df8a5566a06f5fef5100b53ea56e465a0" +uuid = "1520ce14-60c1-5f80-bbc7-55ef81b5835c" +version = "0.4.2" + +[[deps.Adapt]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "195c5505521008abea5aee4f96930717958eac6f" +uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" +version = "3.4.0" + +[[deps.Animations]] +deps = ["Colors"] +git-tree-sha1 = "e81c509d2c8e49592413bfb0bb3b08150056c79d" +uuid = "27a7e980-b3e6-11e9-2bcd-0b925532e340" +version = "0.4.1" + +[[deps.ArgTools]] +uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" +version = "1.1.1" + +[[deps.ArrayInterfaceCore]] +deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"] +git-tree-sha1 = "5bb0f8292405a516880a3809954cb832ae7a31c5" +uuid = "30b0a656-2188-435a-8636-2ec0e6a096e2" +version = "0.1.20" + +[[deps.Artifacts]] +uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" + +[[deps.Automa]] +deps = ["Printf", "ScanByte", "TranscodingStreams"] +git-tree-sha1 = "d50976f217489ce799e366d9561d56a98a30d7fe" +uuid = "67c07d97-cdcb-5c2c-af73-a7f9c32a568b" +version = "0.8.2" + +[[deps.AxisAlgorithms]] +deps = ["LinearAlgebra", "Random", "SparseArrays", "WoodburyMatrices"] +git-tree-sha1 = "66771c8d21c8ff5e3a93379480a2307ac36863f7" +uuid = "13072b0f-2c55-5437-9ae7-d433b7a33950" +version = "1.0.1" + +[[deps.Base64]] +uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" + +[[deps.BitFlags]] +git-tree-sha1 = "84259bb6172806304b9101094a7cc4bc6f56dbc6" +uuid = "d1d4a3ce-64b1-5f1a-9ba4-7e7e69966f35" +version = "0.1.5" + +[[deps.Bzip2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "19a35467a82e236ff51bc17a3a44b69ef35185a2" +uuid = "6e34b625-4abd-537c-b88f-471c36dfa7a0" +version = "1.0.8+0" + +[[deps.CEnum]] +git-tree-sha1 = "eb4cb44a499229b3b8426dcfb5dd85333951ff90" +uuid = "fa961155-64e5-5f13-b03f-caf6b980ea82" +version = "0.4.2" + +[[deps.Cairo]] +deps = ["Cairo_jll", "Colors", "Glib_jll", "Graphics", "Libdl", "Pango_jll"] +git-tree-sha1 = "d0b3f8b4ad16cb0a2988c6788646a5e6a17b6b1b" +uuid = "159f3aea-2a34-519c-b102-8c37f9878175" +version = "1.0.5" + +[[deps.CairoMakie]] +deps = ["Base64", "Cairo", "Colors", "FFTW", "FileIO", "FreeType", "GeometryBasics", "LinearAlgebra", "Makie", "SHA"] +git-tree-sha1 = "387e0102f240244102814cf73fe9fbbad82b9e9e" +uuid = "13f3f980-e62b-5c42-98c6-ff1f3baf88f0" +version = "0.8.13" + +[[deps.Cairo_jll]] +deps = ["Artifacts", "Bzip2_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.ChainRulesCore]] +deps = ["Compat", "LinearAlgebra", "SparseArrays"] +git-tree-sha1 = "dc4405cee4b2fe9e1108caec2d760b7ea758eca2" +uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" +version = "1.15.5" + +[[deps.ChangesOfVariables]] +deps = ["ChainRulesCore", "LinearAlgebra", "Test"] +git-tree-sha1 = "38f7a08f19d8810338d4f5085211c7dfa5d5bdd8" +uuid = "9e997f8a-9a97-42d5-a9f1-ce6bfc15e2c0" +version = "0.1.4" + +[[deps.CodecZlib]] +deps = ["TranscodingStreams", "Zlib_jll"] +git-tree-sha1 = "ded953804d019afa9a3f98981d99b33e3db7b6da" +uuid = "944b1d66-785c-5afd-91f1-9de20f533193" +version = "0.7.0" + +[[deps.ColorBrewer]] +deps = ["Colors", "JSON", "Test"] +git-tree-sha1 = "61c5334f33d91e570e1d0c3eb5465835242582c4" +uuid = "a2cac450-b92f-5266-8821-25eda20663c8" +version = "0.4.0" + +[[deps.ColorSchemes]] +deps = ["ColorTypes", "ColorVectorSpace", "Colors", "FixedPointNumbers", "Random"] +git-tree-sha1 = "1fd869cc3875b57347f7027521f561cf46d1fcd8" +uuid = "35d6a980-a343-548e-a6ea-1d62b119f2f4" +version = "3.19.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", "SpecialFunctions", "Statistics", "TensorCore"] +git-tree-sha1 = "d08c20eef1f2cbc6e60fd3612ac4340b89fea322" +uuid = "c3611d14-8923-5661-9e6a-0046d554d3a4" +version = "0.9.9" + +[[deps.Colors]] +deps = ["ColorTypes", "FixedPointNumbers", "Reexport"] +git-tree-sha1 = "417b0ed7b8b838aa6ca0a87aadf1bb9eb111ce40" +uuid = "5ae59095-9a9b-59fe-a467-6f913c188581" +version = "0.12.8" + +[[deps.CommonSubexpressions]] +deps = ["MacroTools", "Test"] +git-tree-sha1 = "7b8a93dba8af7e3b42fecabf646260105ac373f7" +uuid = "bbf7d656-a473-5ed7-a52c-81e309532950" +version = "0.3.0" + +[[deps.Compat]] +deps = ["Dates", "LinearAlgebra", "UUIDs"] +git-tree-sha1 = "5856d3031cdb1f3b2b6340dfdc66b6d9a149a374" +uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" +version = "4.2.0" + +[[deps.CompilerSupportLibraries_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" +version = "0.5.2+0" + +[[deps.ConstructionBase]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "fb21ddd70a051d882a1686a5a550990bbe371a95" +uuid = "187b0558-2788-49d3-abe0-74a17ed4e7c9" +version = "1.4.1" + +[[deps.Contour]] +git-tree-sha1 = "d05d9e7b7aedff4e5b51a029dced05cfb6125781" +uuid = "d38c429a-6771-53c6-b99e-75d170b6e991" +version = "0.6.2" + +[[deps.DataAPI]] +git-tree-sha1 = "fb5f5316dd3fd4c5e7c30a24d50643b73e37cd40" +uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a" +version = "1.10.0" + +[[deps.DataDeps]] +deps = ["HTTP", "Libdl", "Reexport", "SHA", "p7zip_jll"] +git-tree-sha1 = "bc0a264d3e7b3eeb0b6fc9f6481f970697f29805" +uuid = "124859b0-ceae-595e-8997-d05f6a7a8dfe" +version = "0.7.10" + +[[deps.DataStructures]] +deps = ["Compat", "InteractiveUtils", "OrderedCollections"] +git-tree-sha1 = "d1fff3a548102f48987a52a2e0d114fa97d730f0" +uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" +version = "0.18.13" + +[[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.DensityInterface]] +deps = ["InverseFunctions", "Test"] +git-tree-sha1 = "80c3e8639e3353e5d2912fb3a1916b8455e2494b" +uuid = "b429d917-457f-4dbc-8f4c-0cc954292b1d" +version = "0.4.0" + +[[deps.DiffResults]] +deps = ["StaticArrays"] +git-tree-sha1 = "c18e98cba888c6c25d1c3b048e4b3380ca956805" +uuid = "163ba53b-c6d8-5494-b064-1a9d43ac40c5" +version = "1.0.3" + +[[deps.DiffRules]] +deps = ["IrrationalConstants", "LogExpFunctions", "NaNMath", "Random", "SpecialFunctions"] +git-tree-sha1 = "992a23afdb109d0d2f8802a30cf5ae4b1fe7ea68" +uuid = "b552c78f-8df3-52c6-915a-8e097449b14b" +version = "1.11.1" + +[[deps.Distributed]] +deps = ["Random", "Serialization", "Sockets"] +uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" + +[[deps.Distributions]] +deps = ["ChainRulesCore", "DensityInterface", "FillArrays", "LinearAlgebra", "PDMats", "Printf", "QuadGK", "Random", "SparseArrays", "SpecialFunctions", "Statistics", "StatsBase", "StatsFuns", "Test"] +git-tree-sha1 = "34a557ce10eb2d9142f4ef60726b4f17c1c30941" +uuid = "31c24e10-a181-5473-b8eb-7969acd0382f" +version = "0.25.73" + +[[deps.DocStringExtensions]] +deps = ["LibGit2"] +git-tree-sha1 = "5158c2b41018c5f7eb1470d558127ac274eca0c9" +uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" +version = "0.9.1" + +[[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.EarCut_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "e3290f2d49e661fbd94046d7e3726ffcb2d41053" +uuid = "5ae413db-bbd1-5e63-b57d-d24a61df00f5" +version = "2.2.4+0" + +[[deps.Expat_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "bad72f730e9e91c08d9427d5e8db95478a3c323d" +uuid = "2e619515-83b5-522b-bb60-26c02a35a201" +version = "2.4.8+0" + +[[deps.Extents]] +git-tree-sha1 = "5e1e4c53fa39afe63a7d356e30452249365fba99" +uuid = "411431e0-e8b7-467b-b5e0-f676ba4f2910" +version = "0.1.1" + +[[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", "Pkg", "Zlib_jll", "libaom_jll", "libass_jll", "libfdk_aac_jll", "libvorbis_jll", "x264_jll", "x265_jll"] +git-tree-sha1 = "74faea50c1d007c85837327f6775bea60b5492dd" +uuid = "b22a6f82-2f65-5046-a5b2-351ab43fb4e5" +version = "4.4.2+2" + +[[deps.FFTW]] +deps = ["AbstractFFTs", "FFTW_jll", "LinearAlgebra", "MKL_jll", "Preferences", "Reexport"] +git-tree-sha1 = "90630efff0894f8142308e334473eba54c433549" +uuid = "7a1cc6ca-52ef-59f5-83cd-3a7055c09341" +version = "1.5.0" + +[[deps.FFTW_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "c6033cc3892d0ef5bb9cd29b7f2f0331ea5184ea" +uuid = "f5851436-0d7a-5f13-b9de-f02708fd171a" +version = "3.3.10+0" + +[[deps.FileIO]] +deps = ["Pkg", "Requires", "UUIDs"] +git-tree-sha1 = "94f5101b96d2d968ace56f7f2db19d0a5f592e28" +uuid = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" +version = "1.15.0" + +[[deps.FileWatching]] +uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" + +[[deps.FillArrays]] +deps = ["LinearAlgebra", "Random", "SparseArrays", "Statistics"] +git-tree-sha1 = "87519eb762f85534445f5cda35be12e32759ee14" +uuid = "1a297f60-69ca-5386-bcde-b61e274b549b" +version = "0.13.4" + +[[deps.FiniteDiff]] +deps = ["ArrayInterfaceCore", "LinearAlgebra", "Requires", "Setfield", "SparseArrays", "StaticArrays"] +git-tree-sha1 = "5a2cff9b6b77b33b89f3d97a4d367747adce647e" +uuid = "6a86dc24-6348-571c-b903-95158fe2bd41" +version = "2.15.0" + +[[deps.FixedPointNumbers]] +deps = ["Statistics"] +git-tree-sha1 = "335bfdceacc84c5cdf16aadc768aa5ddfc5383cc" +uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" +version = "0.8.4" + +[[deps.Fontconfig_jll]] +deps = ["Artifacts", "Bzip2_jll", "Expat_jll", "FreeType2_jll", "JLLWrappers", "Libdl", "Libuuid_jll", "Pkg", "Zlib_jll"] +git-tree-sha1 = "21efd19106a55620a188615da6d3d06cd7f6ee03" +uuid = "a3f928ae-7b40-5064-980b-68af3947d34b" +version = "2.13.93+0" + +[[deps.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", "StaticArrays"] +git-tree-sha1 = "187198a4ed8ccd7b5d99c41b69c679269ea2b2d4" +uuid = "f6369f11-7733-5829-9624-2563aa707210" +version = "0.10.32" + +[[deps.FreeType]] +deps = ["CEnum", "FreeType2_jll"] +git-tree-sha1 = "cabd77ab6a6fdff49bfd24af2ebe76e6e018a2b4" +uuid = "b38be410-82b0-50bf-ab77-7b57e271db43" +version = "4.0.0" + +[[deps.FreeType2_jll]] +deps = ["Artifacts", "Bzip2_jll", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] +git-tree-sha1 = "87eb71354d8ec1a96d4a7636bd57a7347dde3ef9" +uuid = "d7e528f0-a631-5988-bf34-fe36492bcfd7" +version = "2.10.4+0" + +[[deps.FreeTypeAbstraction]] +deps = ["ColorVectorSpace", "Colors", "FreeType", "GeometryBasics"] +git-tree-sha1 = "b5c7fe9cea653443736d264b85466bad8c574f4a" +uuid = "663a7486-cb36-511b-a19d-713bb74d65c9" +version = "0.9.9" + +[[deps.FriBidi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "aa31987c2ba8704e23c6c8ba8a4f769d5d7e4f91" +uuid = "559328eb-81f9-559d-9380-de523a88c83c" +version = "1.0.10+0" + +[[deps.Future]] +deps = ["Random"] +uuid = "9fa8497b-333b-5362-9e8d-4d0656e87820" + +[[deps.GeoInterface]] +deps = ["Extents"] +git-tree-sha1 = "fb28b5dc239d0174d7297310ef7b84a11804dfab" +uuid = "cf35fbd7-0cd7-5166-be24-54bfbe79505f" +version = "1.0.1" + +[[deps.GeometryBasics]] +deps = ["EarCut_jll", "GeoInterface", "IterTools", "LinearAlgebra", "StaticArrays", "StructArrays", "Tables"] +git-tree-sha1 = "12a584db96f1d460421d5fb8860822971cdb8455" +uuid = "5c1252a2-5f33-56bf-86c9-59e7332b4326" +version = "0.4.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", "PCRE_jll", "Pkg", "Zlib_jll"] +git-tree-sha1 = "a32d672ac2c967f3deb8a81d828afc739c838a06" +uuid = "7746bdde-850d-59dc-9ae8-88ece973131d" +version = "2.68.3+2" + +[[deps.Graphics]] +deps = ["Colors", "LinearAlgebra", "NaNMath"] +git-tree-sha1 = "d61890399bc535850c4bf08e4e0d3a7ad0f21cbd" +uuid = "a2bd30eb-e257-5431-a919-1863eab51364" +version = "1.1.2" + +[[deps.Graphite2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "344bf40dcab1073aca04aa0df4fb092f920e4011" +uuid = "3b182d85-2403-5c21-9c21-1e1f0cc25472" +version = "1.3.14+0" + +[[deps.GridLayoutBase]] +deps = ["GeometryBasics", "InteractiveUtils", "Observables"] +git-tree-sha1 = "53c7e69a6ffeb26bd594f5a1421b889e7219eeaa" +uuid = "3955a311-db13-416c-9275-1d80ed98e5e9" +version = "0.9.0" + +[[deps.Grisu]] +git-tree-sha1 = "53bb909d1151e57e2484c3d1b53e19552b887fb2" +uuid = "42e2da0e-8278-4e71-bc24-59509adca0fe" +version = "1.0.2" + +[[deps.HTTP]] +deps = ["Base64", "CodecZlib", "Dates", "IniFile", "Logging", "LoggingExtras", "MbedTLS", "NetworkOptions", "OpenSSL", "Random", "SimpleBufferStream", "Sockets", "URIs", "UUIDs"] +git-tree-sha1 = "4abede886fcba15cd5fd041fef776b230d004cee" +uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3" +version = "1.4.0" + +[[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.HypergeometricFunctions]] +deps = ["DualNumbers", "LinearAlgebra", "OpenLibm_jll", "SpecialFunctions", "Test"] +git-tree-sha1 = "709d864e3ed6e3545230601f94e11ebc65994641" +uuid = "34004b35-14d8-5ef3-9330-4cdb6864b03a" +version = "0.3.11" + +[[deps.Hyperscript]] +deps = ["Test"] +git-tree-sha1 = "8d511d5b81240fc8e6802386302675bdf47737b9" +uuid = "47d2ed2b-36de-50cf-bf87-49c2cf4b8b91" +version = "0.0.4" + +[[deps.HypertextLiteral]] +deps = ["Tricks"] +git-tree-sha1 = "c47c5fa4c5308f27ccaac35504858d8914e102f9" +uuid = "ac1192a8-f4b3-4bfe-ba22-af5b92cd3ab2" +version = "0.9.4" + +[[deps.IOCapture]] +deps = ["Logging", "Random"] +git-tree-sha1 = "f7be53659ab06ddc986428d3a9dcc95f6fa6705a" +uuid = "b5f81e59-6552-4d32-b1f0-c071b021bf89" +version = "0.2.2" + +[[deps.ImageCore]] +deps = ["AbstractFFTs", "ColorVectorSpace", "Colors", "FixedPointNumbers", "Graphics", "MappedArrays", "MosaicViews", "OffsetArrays", "PaddedViews", "Reexport"] +git-tree-sha1 = "acf614720ef026d38400b3817614c45882d75500" +uuid = "a09fc81d-aa75-5fe9-8630-4744c3626534" +version = "0.9.4" + +[[deps.ImageIO]] +deps = ["FileIO", "IndirectArrays", "JpegTurbo", "LazyModules", "Netpbm", "OpenEXR", "PNGFiles", "QOI", "Sixel", "TiffImages", "UUIDs"] +git-tree-sha1 = "342f789fd041a55166764c351da1710db97ce0e0" +uuid = "82e4d734-157c-48bb-816b-45c225c6df19" +version = "0.6.6" + +[[deps.Imath_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "87f7662e03a649cffa2e05bf19c303e168732d3e" +uuid = "905a6f67-0a94-5f89-b386-d35d92009cd1" +version = "3.1.2+0" + +[[deps.IndirectArrays]] +git-tree-sha1 = "012e604e1c7458645cb8b436f8fba789a51b257f" +uuid = "9b13fd28-a010-5f03-acff-a1bbcff69959" +version = "1.0.0" + +[[deps.Inflate]] +git-tree-sha1 = "5cd07aab533df5170988219191dfad0519391428" +uuid = "d25df0c9-e2be-5dd7-82c8-3ad0b3e990b9" +version = "0.1.3" + +[[deps.IniFile]] +git-tree-sha1 = "f550e6e32074c939295eb5ea6de31849ac2c9625" +uuid = "83e8ac13-25f8-5344-8a64-a9f2b223428f" +version = "0.5.1" + +[[deps.IntelOpenMP_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "d979e54b71da82f3a65b62553da4fc3d18c9004c" +uuid = "1d5cc7b8-4909-519e-a0f8-d0f5ad9712d0" +version = "2018.0.3+2" + +[[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 = "f67b55b6447d36733596aea445a9f119e83498b6" +uuid = "a98d9a8b-a2ab-59e6-89dd-64a1c18fca59" +version = "0.14.5" + +[[deps.IntervalSets]] +deps = ["Dates", "Random", "Statistics"] +git-tree-sha1 = "076bb0da51a8c8d1229936a1af7bdfacd65037e1" +uuid = "8197267c-284f-5f27-9208-e0e47529a953" +version = "0.7.2" + +[[deps.InverseFunctions]] +deps = ["Test"] +git-tree-sha1 = "b3364212fb5d870f724876ffcd34dd8ec6d98918" +uuid = "3587e190-3f89-42d0-90ee-14403ec27112" +version = "0.1.7" + +[[deps.IrrationalConstants]] +git-tree-sha1 = "7fd44fd4ff43fc60815f8e764c0f352b83c49151" +uuid = "92d709cd-6900-40b7-9082-c6be49f344b6" +version = "0.1.1" + +[[deps.Isoband]] +deps = ["isoband_jll"] +git-tree-sha1 = "f9b6d97355599074dc867318950adaa6f9946137" +uuid = "f1662d9f-8043-43de-a69a-05efc1cc6ff4" +version = "0.1.1" + +[[deps.IterTools]] +git-tree-sha1 = "fa6287a4469f5e048d763df38279ee729fbd44e5" +uuid = "c8e1da08-722c-5040-9ed9-7db0dc04731e" +version = "1.4.0" + +[[deps.IteratorInterfaceExtensions]] +git-tree-sha1 = "a3f24677c21f5bbe9d2a714f95dcd58337fb2856" +uuid = "82899510-4779-5014-852e-03e436cf321d" +version = "1.0.0" + +[[deps.JLD2]] +deps = ["FileIO", "MacroTools", "Mmap", "OrderedCollections", "Pkg", "Printf", "Reexport", "TranscodingStreams", "UUIDs"] +git-tree-sha1 = "6c38bbe47948f74d63434abed68bdfc8d2c46b99" +uuid = "033835bb-8acc-5ee8-8aae-3f567f8a3819" +version = "0.4.23" + +[[deps.JLLWrappers]] +deps = ["Preferences"] +git-tree-sha1 = "abc9885a7ca2052a736a600f7fa66209f96506e1" +uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" +version = "1.4.1" + +[[deps.JSON]] +deps = ["Dates", "Mmap", "Parsers", "Unicode"] +git-tree-sha1 = "3c837543ddb02250ef42f4738347454f95079d4e" +uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" +version = "0.21.3" + +[[deps.JpegTurbo]] +deps = ["CEnum", "FileIO", "ImageCore", "JpegTurbo_jll", "TOML"] +git-tree-sha1 = "a77b273f1ddec645d1b7c4fd5fb98c8f90ad10a5" +uuid = "b835a17e-a41a-41e7-81f0-2f016b05efe0" +version = "0.1.1" + +[[deps.JpegTurbo_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "b53380851c6e6664204efb2e62cd24fa5c47e4ba" +uuid = "aacddb02-875f-59d6-b918-886e6ef4fbf8" +version = "2.1.2+0" + +[[deps.KernelDensity]] +deps = ["Distributions", "DocStringExtensions", "FFTW", "Interpolations", "StatsBase"] +git-tree-sha1 = "9816b296736292a80b9a3200eb7fbb57aaa3917a" +uuid = "5ab0869b-81aa-558d-bb23-cbf5423bbe9b" +version = "0.6.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.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 = "f2355693d6778a178ade15952b7ac47a4ff97996" +uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" +version = "1.3.0" + +[[deps.LazyArtifacts]] +deps = ["Artifacts", "Pkg"] +uuid = "4af54fe1-eca0-43a8-85a7-787d91b784e3" + +[[deps.LazyModules]] +git-tree-sha1 = "a560dd966b386ac9ae60bdd3a3d3a326062d3c3e" +uuid = "8cdb02fc-e678-4876-92c5-9defec4f444e" +version = "0.3.1" + +[[deps.LibCURL]] +deps = ["LibCURL_jll", "MozillaCACerts_jll"] +uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" +version = "0.6.3" + +[[deps.LibCURL_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] +uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" +version = "7.84.0+0" + +[[deps.LibGit2]] +deps = ["Base64", "NetworkOptions", "Printf", "SHA"] +uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" + +[[deps.LibSSH2_jll]] +deps = ["Artifacts", "Libdl", "MbedTLS_jll"] +uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" +version = "1.10.2+0" + +[[deps.Libdl]] +uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" + +[[deps.Libffi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "0b4a5d71f3e5200a7dff793393e09dfc2d874290" +uuid = "e9f186c6-92d2-5b65-8a66-fee21dc1b490" +version = "3.2.2+1" + +[[deps.Libgcrypt_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgpg_error_jll", "Pkg"] +git-tree-sha1 = "64613c82a59c120435c067c2b809fc61cf5166ae" +uuid = "d4300ac3-e22c-5743-9152-c294e39db1e4" +version = "1.8.7+0" + +[[deps.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", "Pkg"] +git-tree-sha1 = "42b62845d70a619f063a7da093d995ec8e15e778" +uuid = "94ce4f54-9a6c-5748-9c1c-f9c7231a4531" +version = "1.16.1+1" + +[[deps.Libmount_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "9c30530bf0effd46e15e0fdcf2b8636e78cbbd73" +uuid = "4b2f31a3-9ecc-558c-b454-b3730dcb73e9" +version = "2.35.0+0" + +[[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", "libblastrampoline_jll"] +uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + +[[deps.LogExpFunctions]] +deps = ["ChainRulesCore", "ChangesOfVariables", "DocStringExtensions", "InverseFunctions", "IrrationalConstants", "LinearAlgebra"] +git-tree-sha1 = "94d9c52ca447e23eac0c0f074effbcd38830deb5" +uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688" +version = "0.3.18" + +[[deps.Logging]] +uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" + +[[deps.LoggingExtras]] +deps = ["Dates", "Logging"] +git-tree-sha1 = "5d4d2d9904227b8bd66386c1138cf4d5ffa826bf" +uuid = "e6f89c97-d47a-5376-807f-9c37f3926c36" +version = "0.4.9" + +[[deps.MKL_jll]] +deps = ["Artifacts", "IntelOpenMP_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "Pkg"] +git-tree-sha1 = "41d162ae9c868218b1f3fe78cba878aa348c2d26" +uuid = "856f044c-d86e-5d09-b602-aeab76dc8ba7" +version = "2022.1.0+0" + +[[deps.MacroTools]] +deps = ["Markdown", "Random"] +git-tree-sha1 = "3d3e902b31198a27340d0bf00d6ac452866021cf" +uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" +version = "0.5.9" + +[[deps.Makie]] +deps = ["Animations", "Base64", "ColorBrewer", "ColorSchemes", "ColorTypes", "Colors", "Contour", "Distributions", "DocStringExtensions", "FFMPEG", "FileIO", "FixedPointNumbers", "Formatting", "FreeType", "FreeTypeAbstraction", "GeometryBasics", "GridLayoutBase", "ImageIO", "IntervalSets", "Isoband", "KernelDensity", "LaTeXStrings", "LinearAlgebra", "MakieCore", "Markdown", "Match", "MathTeXEngine", "Observables", "OffsetArrays", "Packing", "PlotUtils", "PolygonOps", "Printf", "Random", "RelocatableFolders", "Serialization", "Showoff", "SignedDistanceFields", "SparseArrays", "Statistics", "StatsBase", "StatsFuns", "StructArrays", "UnicodeFun"] +git-tree-sha1 = "b0323393a7190c9bf5b03af442fc115756df8e59" +uuid = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a" +version = "0.17.13" + +[[deps.MakieCore]] +deps = ["Observables"] +git-tree-sha1 = "fbf705d2bdea8fc93f1ae8ca2965d8e03d4ca98c" +uuid = "20f20a25-4f0e-4fdf-b5d1-57303727442b" +version = "0.4.0" + +[[deps.MappedArrays]] +git-tree-sha1 = "e8b359ef06ec72e8c030463fe02efe5527ee5142" +uuid = "dbb5928d-eab1-5f90-85c2-b9b0edb7c900" +version = "0.4.1" + +[[deps.Markdown]] +deps = ["Base64"] +uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" + +[[deps.Match]] +git-tree-sha1 = "1d9bc5c1a6e7ee24effb93f175c9342f9154d97f" +uuid = "7eb4fadd-790c-5f42-8a69-bfa0b872bfbf" +version = "1.2.0" + +[[deps.MathTeXEngine]] +deps = ["AbstractTrees", "Automa", "DataStructures", "FreeTypeAbstraction", "GeometryBasics", "LaTeXStrings", "REPL", "RelocatableFolders", "Test"] +git-tree-sha1 = "114ef48a73aea632b8aebcb84f796afcc510ac7c" +uuid = "0a4f8689-d25c-4efe-a92b-7142dfc1aa53" +version = "0.4.3" + +[[deps.MbedTLS]] +deps = ["Dates", "MbedTLS_jll", "MozillaCACerts_jll", "Random", "Sockets"] +git-tree-sha1 = "6872f9594ff273da6d13c7c1a1545d5a8c7d0c1c" +uuid = "739be429-bea8-5141-9913-cc70e7f3736d" +version = "1.1.6" + +[[deps.MbedTLS_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" +version = "2.28.0+0" + +[[deps.Missings]] +deps = ["DataAPI"] +git-tree-sha1 = "bf210ce90b6c9eed32d25dbcae1ebc565df2687f" +uuid = "e1d29d7a-bbdc-5cf2-9ac0-f12de2c33e28" +version = "1.0.2" + +[[deps.Mmap]] +uuid = "a63ad114-7e13-5084-954f-fe012c677804" + +[[deps.MosaicViews]] +deps = ["MappedArrays", "OffsetArrays", "PaddedViews", "StackViews"] +git-tree-sha1 = "b34e3bc3ca7c94914418637cb10cc4d1d80d877d" +uuid = "e94cdb99-869f-56ef-bcf0-1ae2bcbe0389" +version = "0.3.3" + +[[deps.MozillaCACerts_jll]] +uuid = "14a3606d-f60d-562e-9121-12d972cd8159" +version = "2022.2.1" + +[[deps.NLSolversBase]] +deps = ["DiffResults", "Distributed", "FiniteDiff", "ForwardDiff"] +git-tree-sha1 = "50310f934e55e5ca3912fb941dec199b49ca9b68" +uuid = "d41bc354-129a-5804-8e4c-c37616107c6c" +version = "7.8.2" + +[[deps.NaNMath]] +deps = ["OpenLibm_jll"] +git-tree-sha1 = "a7c3d1da1189a1c2fe843a3bfa04d18d20eb3211" +uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" +version = "1.0.1" + +[[deps.Netpbm]] +deps = ["FileIO", "ImageCore"] +git-tree-sha1 = "18efc06f6ec36a8b801b23f076e3c6ac7c3bf153" +uuid = "f09324ee-3d7c-5217-9330-fc30815ba969" +version = "1.0.2" + +[[deps.NetworkOptions]] +uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" +version = "1.2.0" + +[[deps.Observables]] +git-tree-sha1 = "dfd8d34871bc3ad08cd16026c1828e271d554db9" +uuid = "510215fc-4207-5dde-b226-833fc4488ee2" +version = "0.5.1" + +[[deps.OffsetArrays]] +deps = ["Adapt"] +git-tree-sha1 = "1ea784113a6aa054c5ebd95945fa5e52c2f378e7" +uuid = "6fe1bfb0-de20-5000-8ca7-80f57d26f881" +version = "1.12.7" + +[[deps.Ogg_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "887579a3eb005446d514ab7aeac5d1d027658b8f" +uuid = "e7412a2a-1a6e-54c0-be00-318e2571c051" +version = "1.3.5+1" + +[[deps.OpenBLAS_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] +uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" +version = "0.3.20+0" + +[[deps.OpenEXR]] +deps = ["Colors", "FileIO", "OpenEXR_jll"] +git-tree-sha1 = "327f53360fdb54df7ecd01e96ef1983536d1e633" +uuid = "52e1d378-f018-4a11-a4be-720524705ac7" +version = "0.3.2" + +[[deps.OpenEXR_jll]] +deps = ["Artifacts", "Imath_jll", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] +git-tree-sha1 = "923319661e9a22712f24596ce81c54fc0366f304" +uuid = "18a262bb-aa17-5467-a713-aee519bc75cb" +version = "3.1.1+0" + +[[deps.OpenLibm_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "05823500-19ac-5b8b-9628-191a04bc5112" +version = "0.8.1+0" + +[[deps.OpenSSL]] +deps = ["BitFlags", "Dates", "MozillaCACerts_jll", "OpenSSL_jll", "Sockets"] +git-tree-sha1 = "02be9f845cb58c2d6029a6d5f67f4e0af3237814" +uuid = "4d8831e6-92b7-49fb-bdf8-b643e874388c" +version = "1.1.3" + +[[deps.OpenSSL_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "e60321e3f2616584ff98f0a4f18d98ae6f89bbb3" +uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95" +version = "1.1.17+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 = "b9fe76d1a39807fdcf790b991981a922de0c3050" +uuid = "429524aa-4258-5aef-a3af-852621145aeb" +version = "1.7.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 = "85f8e6578bf1f9ee0d11e7bb1b1456435479d47c" +uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" +version = "1.4.1" + +[[deps.PCRE2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "efcefdf7-47ab-520b-bdef-62a2eaa19f15" +version = "10.40.0+0" + +[[deps.PCRE_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "b2a7af664e098055a7529ad1a900ded962bca488" +uuid = "2f80f16e-611a-54ab-bc61-aa92de5b98fc" +version = "8.44.0+0" + +[[deps.PDMats]] +deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"] +git-tree-sha1 = "cf494dca75a69712a72b80bc48f59dcf3dea63ec" +uuid = "90014a1f-27ba-587c-ab20-58faa44d9150" +version = "0.11.16" + +[[deps.PNGFiles]] +deps = ["Base64", "CEnum", "ImageCore", "IndirectArrays", "OffsetArrays", "libpng_jll"] +git-tree-sha1 = "e925a64b8585aa9f4e3047b8d2cdc3f0e79fd4e4" +uuid = "f57f5aa1-a3ce-4bc8-8ab9-96f992907883" +version = "0.3.16" + +[[deps.Packing]] +deps = ["GeometryBasics"] +git-tree-sha1 = "1155f6f937fa2b94104162f01fa400e192e4272f" +uuid = "19eb6ba3-879d-56ad-ad62-d5c202156566" +version = "0.4.2" + +[[deps.PaddedViews]] +deps = ["OffsetArrays"] +git-tree-sha1 = "03a7a85b76381a3d04c7a1656039197e70eda03d" +uuid = "5432bcbf-9aad-5242-b902-cca2824c8663" +version = "0.5.11" + +[[deps.Pango_jll]] +deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "FriBidi_jll", "Glib_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "3a121dfbba67c94a5bec9dde613c3d0cbcf3a12b" +uuid = "36c8627f-9965-5494-a995-c6b170f724f3" +version = "1.50.3+0" + +[[deps.Parameters]] +deps = ["OrderedCollections", "UnPack"] +git-tree-sha1 = "34c0e9ad262e5f7fc75b10a9952ca7692cfc5fbe" +uuid = "d96e819e-fc66-5662-9728-84c9c7592b0a" +version = "0.12.3" + +[[deps.Parsers]] +deps = ["Dates"] +git-tree-sha1 = "3d5bf43e3e8b412656404ed9466f1dcbf7c50269" +uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" +version = "2.4.0" + +[[deps.Pixman_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "b4f5d02549a10e20780a24fce72bea96b6329e29" +uuid = "30392449-352a-5448-841d-b1acce4e97dc" +version = "0.40.1+0" + +[[deps.Pkg]] +deps = ["Artifacts", "Dates", "Downloads", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] +uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" +version = "1.8.0" + +[[deps.PkgVersion]] +deps = ["Pkg"] +git-tree-sha1 = "f6cf8e7944e50901594838951729a1861e668cb8" +uuid = "eebad327-c553-4316-9ea0-9fa01ccd7688" +version = "0.3.2" + +[[deps.PlotUtils]] +deps = ["ColorSchemes", "Colors", "Dates", "Printf", "Random", "Reexport", "SnoopPrecompile", "Statistics"] +git-tree-sha1 = "21303256d239f6b484977314674aef4bb1fe4420" +uuid = "995b91a9-d308-5afd-9ec6-746e21dbc043" +version = "1.3.1" + +[[deps.PlutoUI]] +deps = ["AbstractPlutoDingetjes", "Base64", "ColorTypes", "Dates", "Hyperscript", "HypertextLiteral", "IOCapture", "InteractiveUtils", "JSON", "Logging", "Markdown", "Random", "Reexport", "UUIDs"] +git-tree-sha1 = "a602d7b0babfca89005da04d89223b867b55319f" +uuid = "7f904dfe-b85e-4ff6-b463-dae2292396a8" +version = "0.7.40" + +[[deps.PolygonOps]] +git-tree-sha1 = "77b3d3605fc1cd0b42d95eba87dfcd2bf67d5ff6" +uuid = "647866c9-e3ac-4575-94e7-e3d426903924" +version = "0.1.2" + +[[deps.PositiveFactorizations]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "17275485f373e6673f7e7f97051f703ed5b15b20" +uuid = "85a6dd25-e78a-55b7-8502-1745935b8125" +version = "0.2.4" + +[[deps.Preferences]] +deps = ["TOML"] +git-tree-sha1 = "47e5f437cc0e7ef2ce8406ce1e7e24d44915f88d" +uuid = "21216c6a-2e73-6563-6e65-726566657250" +version = "1.3.0" + +[[deps.Printf]] +deps = ["Unicode"] +uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" + +[[deps.ProgressMeter]] +deps = ["Distributed", "Printf"] +git-tree-sha1 = "d7a7aef8f8f2d537104f170139553b14dfe39fe9" +uuid = "92933f4c-e287-5a05-a399-4b506db050ca" +version = "1.7.2" + +[[deps.QOI]] +deps = ["ColorTypes", "FileIO", "FixedPointNumbers"] +git-tree-sha1 = "18e8f4d1426e965c7b532ddd260599e1510d26ce" +uuid = "4b34888f-f399-49d4-9bb3-47ed5cae4e65" +version = "1.0.0" + +[[deps.QuadGK]] +deps = ["DataStructures", "LinearAlgebra"] +git-tree-sha1 = "3c009334f45dfd546a16a57960a821a1a023d241" +uuid = "1fd47b50-473d-5c70-9696-f719f8f3bcdc" +version = "2.5.0" + +[[deps.REPL]] +deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] +uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" + +[[deps.Random]] +deps = ["SHA", "Serialization"] +uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" + +[[deps.Ratios]] +deps = ["Requires"] +git-tree-sha1 = "dc84268fe0e3335a62e315a3a7cf2afa7178a734" +uuid = "c84ed2f1-dad5-54f0-aa8e-dbefe2724439" +version = "0.4.3" + +[[deps.Reexport]] +git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" +uuid = "189a3867-3050-52da-a836-e630ba90ab69" +version = "1.2.2" + +[[deps.RelocatableFolders]] +deps = ["SHA", "Scratch"] +git-tree-sha1 = "22c5201127d7b243b9ee1de3b43c408879dff60f" +uuid = "05181044-ff0b-4ac5-8273-598c1e38db00" +version = "0.3.0" + +[[deps.Requires]] +deps = ["UUIDs"] +git-tree-sha1 = "838a3a4188e2ded87a4f9f184b4b0d78a1e91cb7" +uuid = "ae029012-a4dd-5104-9daa-d747884805df" +version = "1.3.0" + +[[deps.Rmath]] +deps = ["Random", "Rmath_jll"] +git-tree-sha1 = "bf3188feca147ce108c76ad82c2792c57abe7b1f" +uuid = "79098fc4-a85e-5d69-aa6a-4863f24498fa" +version = "0.7.0" + +[[deps.Rmath_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "68db32dff12bb6127bac73c209881191bf0efbb7" +uuid = "f50d1b31-88e8-58de-be2c-1cc44531875f" +version = "0.3.0+0" + +[[deps.SHA]] +uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" +version = "0.7.0" + +[[deps.SIMD]] +git-tree-sha1 = "7dbc15af7ed5f751a82bf3ed37757adf76c32402" +uuid = "fdea26ae-647d-5447-a871-4b548cad5224" +version = "3.4.1" + +[[deps.ScanByte]] +deps = ["Libdl", "SIMD"] +git-tree-sha1 = "2436b15f376005e8790e318329560dcc67188e84" +uuid = "7b38b023-a4d7-4c5e-8d43-3f3097f304eb" +version = "0.3.3" + +[[deps.Scratch]] +deps = ["Dates"] +git-tree-sha1 = "f94f779c94e58bf9ea243e77a37e16d9de9126bd" +uuid = "6c6a2e73-6563-6170-7368-637461726353" +version = "1.1.1" + +[[deps.Serialization]] +uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" + +[[deps.Setfield]] +deps = ["ConstructionBase", "Future", "MacroTools", "StaticArraysCore"] +git-tree-sha1 = "e2cc6d8c88613c05e1defb55170bf5ff211fbeac" +uuid = "efcf1570-3423-57d1-acb7-fd33fddbac46" +version = "1.1.1" + +[[deps.SharedArrays]] +deps = ["Distributed", "Mmap", "Random", "Serialization"] +uuid = "1a1011a3-84de-559e-8e89-a11a2f7dc383" + +[[deps.Showoff]] +deps = ["Dates", "Grisu"] +git-tree-sha1 = "91eddf657aca81df9ae6ceb20b959ae5653ad1de" +uuid = "992d4aef-0814-514b-bc4d-f2e9a6c4116f" +version = "1.0.3" + +[[deps.SignedDistanceFields]] +deps = ["Random", "Statistics", "Test"] +git-tree-sha1 = "d263a08ec505853a5ff1c1ebde2070419e3f28e9" +uuid = "73760f76-fbc4-59ce-8f25-708e95d2df96" +version = "0.4.0" + +[[deps.SimpleBufferStream]] +git-tree-sha1 = "874e8867b33a00e784c8a7e4b60afe9e037b74e1" +uuid = "777ac1f9-54b0-4bf8-805c-2214025038e7" +version = "1.1.0" + +[[deps.Sixel]] +deps = ["Dates", "FileIO", "ImageCore", "IndirectArrays", "OffsetArrays", "REPL", "libsixel_jll"] +git-tree-sha1 = "8fb59825be681d451c246a795117f317ecbcaa28" +uuid = "45858cf5-a6b0-47a3-bbea-62219f50df47" +version = "0.1.2" + +[[deps.SnoopPrecompile]] +git-tree-sha1 = "f604441450a3c0569830946e5b33b78c928e1a85" +uuid = "66db9d55-30c0-4569-8b51-7e840670fc0c" +version = "1.0.1" + +[[deps.Sockets]] +uuid = "6462fe0b-24de-5631-8697-dd941f90decc" + +[[deps.SortingAlgorithms]] +deps = ["DataStructures"] +git-tree-sha1 = "b3363d7460f7d098ca0912c69b082f75625d7508" +uuid = "a2af1166-a08f-5f64-846c-94a0d3cef48c" +version = "1.0.1" + +[[deps.SparseArrays]] +deps = ["LinearAlgebra", "Random"] +uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + +[[deps.SpecialFunctions]] +deps = ["ChainRulesCore", "IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"] +git-tree-sha1 = "d75bda01f8c31ebb72df80a46c88b25d1c79c56d" +uuid = "276daf66-3868-5448-9aa4-cd146d93841b" +version = "2.1.7" + +[[deps.StackViews]] +deps = ["OffsetArrays"] +git-tree-sha1 = "46e589465204cd0c08b4bd97385e4fa79a0c770c" +uuid = "cae243ae-269e-4f55-b966-ac2d0dc13c15" +version = "0.1.1" + +[[deps.StaticArrays]] +deps = ["LinearAlgebra", "Random", "StaticArraysCore", "Statistics"] +git-tree-sha1 = "efa8acd030667776248eabb054b1836ac81d92f0" +uuid = "90137ffa-7385-5640-81b9-e52037218182" +version = "1.5.7" + +[[deps.StaticArraysCore]] +git-tree-sha1 = "ec2bd695e905a3c755b33026954b119ea17f2d22" +uuid = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" +version = "1.3.0" + +[[deps.Statistics]] +deps = ["LinearAlgebra", "SparseArrays"] +uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" + +[[deps.StatsAPI]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "f9af7f195fb13589dd2e2d57fdb401717d2eb1f6" +uuid = "82ae8749-77ed-4fe6-ae5f-f523153014b0" +version = "1.5.0" + +[[deps.StatsBase]] +deps = ["DataAPI", "DataStructures", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"] +git-tree-sha1 = "d1bf48bfcc554a3761a133fe3a9bb01488e06916" +uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" +version = "0.33.21" + +[[deps.StatsFuns]] +deps = ["ChainRulesCore", "HypergeometricFunctions", "InverseFunctions", "IrrationalConstants", "LogExpFunctions", "Reexport", "Rmath", "SpecialFunctions"] +git-tree-sha1 = "5783b877201a82fc0014cbf381e7e6eb130473a4" +uuid = "4c63d2b9-4356-54db-8cca-17b64c39e42c" +version = "1.0.1" + +[[deps.StructArrays]] +deps = ["Adapt", "DataAPI", "StaticArraysCore", "Tables"] +git-tree-sha1 = "8c6ac65ec9ab781af05b08ff305ddc727c25f680" +uuid = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" +version = "0.6.12" + +[[deps.SuiteSparse]] +deps = ["Libdl", "LinearAlgebra", "Serialization", "SparseArrays"] +uuid = "4607b0f0-06f3-5cda-b6b1-a6196a1729e9" + +[[deps.TOML]] +deps = ["Dates"] +uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" +version = "1.0.0" + +[[deps.TableTraits]] +deps = ["IteratorInterfaceExtensions"] +git-tree-sha1 = "c06b2f539df1c6efa794486abfb6ed2022561a39" +uuid = "3783bdb8-4a98-5b6b-af9a-565f29a5fe9c" +version = "1.0.1" + +[[deps.Tables]] +deps = ["DataAPI", "DataValueInterfaces", "IteratorInterfaceExtensions", "LinearAlgebra", "OrderedCollections", "TableTraits", "Test"] +git-tree-sha1 = "7149a60b01bf58787a1b83dad93f90d4b9afbe5d" +uuid = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" +version = "1.8.1" + +[[deps.Tar]] +deps = ["ArgTools", "SHA"] +uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" +version = "1.10.1" + +[[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.TiffImages]] +deps = ["ColorTypes", "DataStructures", "DocStringExtensions", "FileIO", "FixedPointNumbers", "IndirectArrays", "Inflate", "Mmap", "OffsetArrays", "PkgVersion", "ProgressMeter", "UUIDs"] +git-tree-sha1 = "70e6d2da9210371c927176cb7a56d41ef1260db7" +uuid = "731e570b-9d59-4bfa-96dc-6df516fadf69" +version = "0.6.1" + +[[deps.TranscodingStreams]] +deps = ["Random", "Test"] +git-tree-sha1 = "8a75929dcd3c38611db2f8d08546decb514fcadf" +uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa" +version = "0.9.9" + +[[deps.Tricks]] +git-tree-sha1 = "6bac775f2d42a611cdfcd1fb217ee719630c4175" +uuid = "410a4b4d-49e4-4fbc-ab6d-cb71b17b3775" +version = "0.1.6" + +[[deps.URIs]] +git-tree-sha1 = "e59ecc5a41b000fa94423a578d29290c7266fc10" +uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" +version = "1.4.0" + +[[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.WoodburyMatrices]] +deps = ["LinearAlgebra", "SparseArrays"] +git-tree-sha1 = "de67fa59e33ad156a590055375a30b23c40299d3" +uuid = "efce3f68-66dc-5838-9240-27a6d6f5f9b6" +version = "0.5.5" + +[[deps.XML2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Pkg", "Zlib_jll"] +git-tree-sha1 = "58443b63fb7e465a8a7210828c91c08b92132dff" +uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a" +version = "2.9.14+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.Xorg_libX11_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libxcb_jll", "Xorg_xtrans_jll"] +git-tree-sha1 = "5be649d550f3f4b95308bf0183b82e2582876527" +uuid = "4f6342f7-b3d2-589e-9d20-edeb45f2b2bc" +version = "1.6.9+4" + +[[deps.Xorg_libXau_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "4e490d5c960c314f33885790ed410ff3a94ce67e" +uuid = "0c0b7dd1-d40b-584c-a123-a41640f87eec" +version = "1.0.9+4" + +[[deps.Xorg_libXdmcp_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "4fe47bd2247248125c428978740e18a681372dd4" +uuid = "a3789734-cfe1-5b06-b2d0-1dd0d9d62d05" +version = "1.1.3+4" + +[[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_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", "Pkg"] +git-tree-sha1 = "6783737e45d3c59a4a4c4091f5f88cdcf0908cbb" +uuid = "14d82f49-176c-5ed1-bb49-ad3f5cbd8c74" +version = "0.1.0+3" + +[[deps.Xorg_libxcb_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "XSLT_jll", "Xorg_libXau_jll", "Xorg_libXdmcp_jll", "Xorg_libpthread_stubs_jll"] +git-tree-sha1 = "daf17f441228e7a3833846cd048892861cff16d6" +uuid = "c7cfdc94-dc32-55de-ac96-5a1b8d977c5b" +version = "1.13.0+3" + +[[deps.Xorg_xtrans_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "79c31e7844f6ecf779705fbc12146eb190b7d845" +uuid = "c5fb5394-a638-5e4d-96e5-b29de1b5cf10" +version = "1.4.0+3" + +[[deps.Zlib_jll]] +deps = ["Libdl"] +uuid = "83775a58-1f1d-513f-b197-d71354ab007a" +version = "1.2.12+3" + +[[deps.isoband_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "51b5eeb3f98367157a7a12a1fb0aa5328946c03c" +uuid = "9a68df92-36a6-505f-a73e-abb412b6bfb4" +version = "0.2.3+0" + +[[deps.libaom_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "3a2ea60308f0996d26f1e5354e10c24e9ef905d4" +uuid = "a4ae2306-e953-59d6-aa16-d00cac43593b" +version = "3.4.0+0" + +[[deps.libass_jll]] +deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] +git-tree-sha1 = "5982a94fcba20f02f42ace44b9894ee2b140fe47" +uuid = "0ac62f75-1d6f-5e53-bd7c-93b484bb37c0" +version = "0.15.1+0" + +[[deps.libblastrampoline_jll]] +deps = ["Artifacts", "Libdl", "OpenBLAS_jll"] +uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" +version = "5.1.1+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.libpng_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] +git-tree-sha1 = "94d180a6d2b5e55e447e2d27a29ed04fe79eb30c" +uuid = "b53b4c65-9356-5827-b1ea-8c7a1a84506f" +version = "1.6.38+0" + +[[deps.libsixel_jll]] +deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Pkg", "libpng_jll"] +git-tree-sha1 = "d4f63314c8aa1e48cd22aa0c17ed76cd1ae48c3c" +uuid = "075b6546-f08a-558a-be8f-8157d0f608a5" +version = "1.10.3+0" + +[[deps.libvorbis_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Ogg_jll", "Pkg"] +git-tree-sha1 = "b910cb81ef3fe6e78bf6acee440bda86fd6ae00c" +uuid = "f27f6e37-5d2b-51aa-960f-b287f2bc3b7a" +version = "1.3.7+1" + +[[deps.nghttp2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" +version = "1.48.0+0" + +[[deps.p7zip_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" +version = "17.4.0+0" + +[[deps.x264_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "4fea590b89e6ec504593146bf8b988b2c00922b2" +uuid = "1270edf5-f2f9-52d2-97e9-ab00b5d0237a" +version = "2021.5.5+0" + +[[deps.x265_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "ee567a171cce03570d77ad3a43e90218e38937a9" +uuid = "dfaa095f-4041-5dcd-9319-2fabd8486b76" +version = "3.5.0+0" +""" + +# ╔═║ Cell order: +# β•Ÿβ”€d8e3d937-bcda-4c84-b543-e1324f696bbc +# β•Ÿβ”€8ef88534-dac4-4a62-b623-dcaf63482a96 +# β•Ÿβ”€cfb8f979-37ca-40ab-8d3c-0053911717e7 +# β•Ÿβ”€eb95e773-b12a-40a4-a4f1-9dced86fc8a2 +# β•Ÿβ”€75cacd05-c9f8-44ba-a0ce-8cde93fc8b85 +# ╠═18ddf155-f9bc-4e5b-97dc-762fa83c9931 +# β•Ÿβ”€87fdc7c2-536e-4aa1-9f68-8aec4bc7069d +# β•Ÿβ”€8d4d8b93-ebfe-41ff-8b9e-f8931a9e83c2 +# β•Ÿβ”€25223f7b-22f7-46c2-9270-4430eb6c186e +# β•Ÿβ”€034fc483-b188-4b2a-891a-61b76c74072d +# ╠═039ec632-d238-4e63-81fc-a3225ccd2aee +# β•Ÿβ”€5d31e2a8-e357-4479-bc48-de1a1b8bc4d4 +# β•Ÿβ”€724901e9-a19a-4d5f-aa6a-79ec0f230f24 +# ╠═1431b11f-7838-41da-92e3-bcca9f4215b3 +# ╠═de5d415f-8216-473d-8e0b-a73139540e1e +# β•Ÿβ”€15dee5d8-e995-4e5a-aceb-48bcce42e76d +# ╠═a93c36c9-b687-44b9-b0b6-5fe636ab061c +# β•Ÿβ”€2287bff1-6fb0-4431-8e15-aff3d7b6e005 +# ╠═c0ff6c61-c4be-462b-a91c-0ee1395ef584 +# β•Ÿβ”€e24e54a7-804e-40e8-818e-8766e5e3732b +# ╠═97e1ce89-f796-4bd1-8e82-94fc838829a6 +# β•Ÿβ”€049e2164-24ac-467c-9d96-77510ac6ff57 +# ╠═f07006ac-c773-4829-9a38-6f9991403386 +# β•Ÿβ”€b85fdf41-ef8f-4314-bc3c-383947b9f02c +# ╠═00776863-2260-48a8-83c1-3f2696f11d96 +# β•Ÿβ”€16ca594c-c9db-4528-aa65-bab12cb6e22a +# β•Ÿβ”€ea517bbf-eb14-4d72-a4f4-9bb823e02f88 +# β•Ÿβ”€b65e2af0-9a08-4915-834b-1a20b2440891 +# ╠═dfde2f6a-f612-4013-8d42-5590221167c9 +# ╠═91dec8b7-a9da-4c62-973e-2fd8e0a92e58 +# β•Ÿβ”€140bcdac-4145-47b3-952f-bfe50f6ed41c +# β•Ÿβ”€849775fa-4990-47d3-afe0-d0a049bb90af +# ╠═4d517df8-0496-40a2-8e44-5beda6cd7226 +# β•Ÿβ”€6932b969-0760-4f09-935a-478ac56de262 +# ╠═1d8a69b7-52db-4865-8bf2-712c2b6442f5 +# β•Ÿβ”€5884999f-f136-4ae7-8831-cc3a36f50a98 +# ╠═f2510e0a-23f2-4a40-a7db-7b59898facfa +# ╠═6ce47d90-d5a2-43c0-ad64-27c13aa0f5db +# β•Ÿβ”€4640a179-3373-4901-ac31-31022e8c7eb2 +# β•Ÿβ”€d13c319d-345a-40b8-b90d-b0b226225434 +# β•Ÿβ”€8f21fc70-e369-4938-b0c2-5a4fbae71713 +# β•Ÿβ”€901548f8-a6c9-48f8-9c8f-887500081316 +# β•Ÿβ”€567fa8d3-35b4-40d7-8404-ae78d2874380 +# β•Ÿβ”€0d8fffdc-a9f5-4d82-84ec-0f27acc04c21 +# ╠═930935f8-832a-45b4-8e5e-b194afa917c6 +# ╠═abdbbcaa-3a76-4a47-824d-6da73bc71c31 +# β•Ÿβ”€1cef338d-5c4a-4ea5-98d7-9ac4f11922f3 +# ╠═71cff056-a36c-4fd4-babb-53018894ac5c +# β•Ÿβ”€83be4f9d-6c85-4e5b-9379-00618c9e39be +# ╠═7c7439f0-d678-4b68-a5e5-bee650fa17e2 +# β•Ÿβ”€57dde8ad-f7de-4ca6-bfab-235bc13131c0 +# ╠═9a5ac384-f5e6-41b0-8bc4-44e2ed6be472 +# β•Ÿβ”€d1a741ad-f28d-48c7-9f15-d55d0801573d +# β•Ÿβ”€a046b625-b046-4ca0-adde-be5249a420f4 +# ╠═514ee86b-0aeb-42cd-b4cd-a795ed23b3de +# β•Ÿβ”€c98fcf26-d715-47c2-84ac-63bffe02d813 +# ╠═6534f98d-1270-4e7c-8ce8-66a6b1ee48f7 +# β•Ÿβ”€77a73a9d-9d78-4cf5-ae19-f1107fa5b4c2 +# ╠═80c72898-139e-44af-bab0-ca638f282188 +# β•Ÿβ”€b0ca64b8-0211-4d1c-b007-7583bf8ac908 +# β•Ÿβ”€51f3fd00-508b-4b42-bd95-ae19cb19b4db +# ╠═65dedef2-03e5-4e0f-8022-53168952e7a8 +# ╠═8afe64e3-d19a-4801-b7b8-56d886f7a59a +# β•Ÿβ”€ebcf224f-c006-4098-abf0-5c3644e2ee97 +# ╠═73238f6c-b8d3-4f92-bdfe-1c657e239903 +# ╠═247b4c3a-2777-47ed-8cc9-e90a5cdb640b +# ╠═0353c906-55d9-4419-a55d-8fcd374004d7 +# ╠═1c33dc21-04af-4139-9061-696db73c3249 +# β•Ÿβ”€70713834-3246-45a4-a4c8-68513bb853ce +# ╠═2b33a8a1-3772-4fb3-a914-a20a7aae91bc +# β•Ÿβ”€b768707a-5077-4662-bcd1-6d38b3e4f929 +# β•Ÿβ”€419c8c31-6408-489a-a50e-af712cf20b7e +# β•Ÿβ”€00000000-0000-0000-0000-000000000001 +# β•Ÿβ”€00000000-0000-0000-0000-000000000002 diff --git a/notebooks_old/2_finite_differences.jl b/notebooks_old/2_finite_differences.jl new file mode 100644 index 0000000..e3bb882 --- /dev/null +++ b/notebooks_old/2_finite_differences.jl @@ -0,0 +1,370 @@ +### A Pluto.jl notebook ### +# v0.19.11 + +using Markdown +using InteractiveUtils + +# ╔═║ 1e8197f6-3355-11ed-3e7c-e5184ff0442c +using PlutoUI, LinearAlgebra + +# ╔═║ 9835214d-cc0d-45cc-8894-2487b943566a +TableOfContents(title="πŸ“š Table of Contents", indent=true, depth=4, aside=true) + +# ╔═║ d5a3aa08-9f8a-4cb6-8407-7942faf08f4c +md""" +The purpose of this notebook is to help understand the concept of gradients +through finite differences, but not to suggest that this is a modern method to compute gradients. (Though finite differences can still serve nicely as a way of checking) +""" + +# ╔═║ 9a65a337-77e5-45c5-a11f-dd3b95a1407c +md"# Simple Neural Network" + +# ╔═║ 964c7bcb-98df-4955-8751-d1815fcf1ca5 +x₃(W₁,Wβ‚‚,b₁,bβ‚‚,xβ‚€,h::Function) = Wβ‚‚ * h.(W₁*xβ‚€ .+ b₁) .+ bβ‚‚ + +# ╔═║ a8e7902b-2ad4-4599-9d81-3f28e0c6c5dc +loss(x₃,y) = norm(x₃ .- y) + +# ╔═║ c87a3ffa-774c-401f-8845-93c502363b14 +NN(xβ‚€,y,W₁,Wβ‚‚,b₁,bβ‚‚,h) = loss(x₃(W₁,Wβ‚‚,b₁,bβ‚‚,xβ‚€,h) , y ) + +# ╔═║ 91477641-d4c7-48c9-ada9-b7576558ae86 +sizes = 3, 5, 7 + +# ╔═║ 87d01d74-ab2f-4634-a2c1-b11a8b674de3 +begin + xβ‚€ = rand( sizes[1]) + W₁ = rand( sizes[2], sizes[1]) + Wβ‚‚ = rand( sizes[3], sizes[2]) + b₁ = rand( sizes[2]) + bβ‚‚ = rand( sizes[3]) + h = sin + y = rand( sizes[3] ) +end + +# ╔═║ 2d0d42b4-0a43-4aa3-a089-4343f2864abf +NN(xβ‚€,y,W₁,Wβ‚‚,b₁,bβ‚‚,h) + +# ╔═║ d5ab569c-f498-41db-b85c-1829bd046399 +begin + md"""## Old Fashioned Gradient Computation + (We don't want to do this anymore) + """ +end + +# ╔═║ 006de347-5f29-4b5a-baac-a13df0848943 +begin # Create storage for the gradient + βˆ‡W₁ = zeros( size(W₁)) + βˆ‡Wβ‚‚ = zeros( size(Wβ‚‚)) + βˆ‡b₁ = zeros( size(b₁)) + βˆ‡bβ‚‚ = zeros( size(bβ‚‚)) +end + +# ╔═║ 221bb602-77f5-4ecf-95c4-3f9fba654eff +function computeβˆ‡(W₁,Wβ‚‚,b₁,bβ‚‚,xβ‚€,h,y ) + Ο΅ = .001 + # W₁ gradient + for i=1:size(W₁,1), j=1:size(W₁,2) + dW₁ = zeros( size(W₁)) + dW₁[i,j] = Ο΅ + βˆ‡W₁[i,j] = (NN(xβ‚€,y, W₁.+dW₁ ,Wβ‚‚,b₁,bβ‚‚,h) - NN(xβ‚€,y, W₁, Wβ‚‚,b₁,bβ‚‚,h))/Ο΅ + end + # Wβ‚‚ gradient + for i=1:size(Wβ‚‚,1), j=1:size(Wβ‚‚,2) + dWβ‚‚ = zeros( size(Wβ‚‚)) + dWβ‚‚[i,j] = Ο΅ + βˆ‡Wβ‚‚[i,j] = (NN(xβ‚€,y, W₁ ,Wβ‚‚.+dWβ‚‚,b₁,bβ‚‚,h) - NN(xβ‚€,y, W₁, Wβ‚‚,b₁,bβ‚‚,h))/Ο΅ + end + # b₁ gradient + for i=1:size(b₁,1) + db₁ = zeros( size(b₁)) + db₁[i] = Ο΅ + βˆ‡b₁[i] = (NN(xβ‚€,y, W₁ ,Wβ‚‚,b₁.+db₁,bβ‚‚,h) - NN(xβ‚€,y, W₁, Wβ‚‚,b₁,bβ‚‚,h))/Ο΅ + end + # bβ‚‚ gradient + for i=1:size(b₁,1) + dbβ‚‚ = zeros( size(bβ‚‚)) + dbβ‚‚[i] = Ο΅ + βˆ‡bβ‚‚[i] = (NN(xβ‚€,y, W₁ ,Wβ‚‚,b₁,bβ‚‚.+dbβ‚‚,h) - NN(xβ‚€,y, W₁, Wβ‚‚,b₁,bβ‚‚,h))/Ο΅ + end + return βˆ‡W₁,βˆ‡Wβ‚‚,βˆ‡b₁,βˆ‡bβ‚‚ +end + +# ╔═║ 0acbaeed-3f9c-4a35-b178-8a443a5882e9 +computeβˆ‡(W₁,Wβ‚‚,b₁,bβ‚‚,xβ‚€,h,y ) + +# ╔═║ 13750938-b1b7-4914-867b-a77895389a10 +md""" +## What about dx₃/d(W₁,Wβ‚‚,b₁,bβ‚‚) ??? +(When the output function is not a scalar we call this a Jacobian) +(Sometimes when it's too klunky to put in the form of a matrix, it is called a linearization but also Jacobian can be used) +""" + +# ╔═║ 586b13fa-d7b7-4d2e-b27d-46f744ebeccb +md""" +## For starters think about the matrix Square Function Aβ†’AΒ² +""" + +# ╔═║ 00000000-0000-0000-0000-000000000001 +PLUTO_PROJECT_TOML_CONTENTS = """ +[deps] +LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" +PlutoUI = "7f904dfe-b85e-4ff6-b463-dae2292396a8" + +[compat] +PlutoUI = "~0.7.40" +""" + +# ╔═║ 00000000-0000-0000-0000-000000000002 +PLUTO_MANIFEST_TOML_CONTENTS = """ +# This file is machine-generated - editing it directly is not advised + +julia_version = "1.8.0-rc4" +manifest_format = "2.0" +project_hash = "3731524a0be8981c0b3969f8e7511b0d5e2849dc" + +[[deps.AbstractPlutoDingetjes]] +deps = ["Pkg"] +git-tree-sha1 = "8eaf9f1b4921132a4cff3f36a1d9ba923b14a481" +uuid = "6e696c72-6542-2067-7265-42206c756150" +version = "1.1.4" + +[[deps.ArgTools]] +uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" +version = "1.1.1" + +[[deps.Artifacts]] +uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" + +[[deps.Base64]] +uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" + +[[deps.ColorTypes]] +deps = ["FixedPointNumbers", "Random"] +git-tree-sha1 = "eb7f0f8307f71fac7c606984ea5fb2817275d6e4" +uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f" +version = "0.11.4" + +[[deps.CompilerSupportLibraries_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" +version = "0.5.2+0" + +[[deps.Dates]] +deps = ["Printf"] +uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" + +[[deps.Downloads]] +deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] +uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" +version = "1.6.0" + +[[deps.FileWatching]] +uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" + +[[deps.FixedPointNumbers]] +deps = ["Statistics"] +git-tree-sha1 = "335bfdceacc84c5cdf16aadc768aa5ddfc5383cc" +uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" +version = "0.8.4" + +[[deps.Hyperscript]] +deps = ["Test"] +git-tree-sha1 = "8d511d5b81240fc8e6802386302675bdf47737b9" +uuid = "47d2ed2b-36de-50cf-bf87-49c2cf4b8b91" +version = "0.0.4" + +[[deps.HypertextLiteral]] +deps = ["Tricks"] +git-tree-sha1 = "c47c5fa4c5308f27ccaac35504858d8914e102f9" +uuid = "ac1192a8-f4b3-4bfe-ba22-af5b92cd3ab2" +version = "0.9.4" + +[[deps.IOCapture]] +deps = ["Logging", "Random"] +git-tree-sha1 = "f7be53659ab06ddc986428d3a9dcc95f6fa6705a" +uuid = "b5f81e59-6552-4d32-b1f0-c071b021bf89" +version = "0.2.2" + +[[deps.InteractiveUtils]] +deps = ["Markdown"] +uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" + +[[deps.JSON]] +deps = ["Dates", "Mmap", "Parsers", "Unicode"] +git-tree-sha1 = "3c837543ddb02250ef42f4738347454f95079d4e" +uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" +version = "0.21.3" + +[[deps.LibCURL]] +deps = ["LibCURL_jll", "MozillaCACerts_jll"] +uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" +version = "0.6.3" + +[[deps.LibCURL_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] +uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" +version = "7.84.0+0" + +[[deps.LibGit2]] +deps = ["Base64", "NetworkOptions", "Printf", "SHA"] +uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" + +[[deps.LibSSH2_jll]] +deps = ["Artifacts", "Libdl", "MbedTLS_jll"] +uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" +version = "1.10.2+0" + +[[deps.Libdl]] +uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" + +[[deps.LinearAlgebra]] +deps = ["Libdl", "libblastrampoline_jll"] +uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + +[[deps.Logging]] +uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" + +[[deps.Markdown]] +deps = ["Base64"] +uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" + +[[deps.MbedTLS_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" +version = "2.28.0+0" + +[[deps.Mmap]] +uuid = "a63ad114-7e13-5084-954f-fe012c677804" + +[[deps.MozillaCACerts_jll]] +uuid = "14a3606d-f60d-562e-9121-12d972cd8159" +version = "2022.2.1" + +[[deps.NetworkOptions]] +uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" +version = "1.2.0" + +[[deps.OpenBLAS_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] +uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" +version = "0.3.20+0" + +[[deps.Parsers]] +deps = ["Dates"] +git-tree-sha1 = "3d5bf43e3e8b412656404ed9466f1dcbf7c50269" +uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" +version = "2.4.0" + +[[deps.Pkg]] +deps = ["Artifacts", "Dates", "Downloads", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] +uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" +version = "1.8.0" + +[[deps.PlutoUI]] +deps = ["AbstractPlutoDingetjes", "Base64", "ColorTypes", "Dates", "Hyperscript", "HypertextLiteral", "IOCapture", "InteractiveUtils", "JSON", "Logging", "Markdown", "Random", "Reexport", "UUIDs"] +git-tree-sha1 = "a602d7b0babfca89005da04d89223b867b55319f" +uuid = "7f904dfe-b85e-4ff6-b463-dae2292396a8" +version = "0.7.40" + +[[deps.Printf]] +deps = ["Unicode"] +uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" + +[[deps.REPL]] +deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] +uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" + +[[deps.Random]] +deps = ["SHA", "Serialization"] +uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" + +[[deps.Reexport]] +git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" +uuid = "189a3867-3050-52da-a836-e630ba90ab69" +version = "1.2.2" + +[[deps.SHA]] +uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" +version = "0.7.0" + +[[deps.Serialization]] +uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" + +[[deps.Sockets]] +uuid = "6462fe0b-24de-5631-8697-dd941f90decc" + +[[deps.SparseArrays]] +deps = ["LinearAlgebra", "Random"] +uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + +[[deps.Statistics]] +deps = ["LinearAlgebra", "SparseArrays"] +uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" + +[[deps.TOML]] +deps = ["Dates"] +uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" +version = "1.0.0" + +[[deps.Tar]] +deps = ["ArgTools", "SHA"] +uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" +version = "1.10.0" + +[[deps.Test]] +deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] +uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[[deps.Tricks]] +git-tree-sha1 = "6bac775f2d42a611cdfcd1fb217ee719630c4175" +uuid = "410a4b4d-49e4-4fbc-ab6d-cb71b17b3775" +version = "0.1.6" + +[[deps.UUIDs]] +deps = ["Random", "SHA"] +uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" + +[[deps.Unicode]] +uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" + +[[deps.Zlib_jll]] +deps = ["Libdl"] +uuid = "83775a58-1f1d-513f-b197-d71354ab007a" +version = "1.2.12+3" + +[[deps.libblastrampoline_jll]] +deps = ["Artifacts", "Libdl", "OpenBLAS_jll"] +uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" +version = "5.1.1+0" + +[[deps.nghttp2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" +version = "1.48.0+0" + +[[deps.p7zip_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" +version = "17.4.0+0" +""" + +# ╔═║ Cell order: +# ╠═1e8197f6-3355-11ed-3e7c-e5184ff0442c +# ╠═9835214d-cc0d-45cc-8894-2487b943566a +# β•Ÿβ”€d5a3aa08-9f8a-4cb6-8407-7942faf08f4c +# ╠═9a65a337-77e5-45c5-a11f-dd3b95a1407c +# ╠═964c7bcb-98df-4955-8751-d1815fcf1ca5 +# ╠═a8e7902b-2ad4-4599-9d81-3f28e0c6c5dc +# ╠═c87a3ffa-774c-401f-8845-93c502363b14 +# ╠═91477641-d4c7-48c9-ada9-b7576558ae86 +# ╠═87d01d74-ab2f-4634-a2c1-b11a8b674de3 +# ╠═2d0d42b4-0a43-4aa3-a089-4343f2864abf +# β•Ÿβ”€d5ab569c-f498-41db-b85c-1829bd046399 +# ╠═006de347-5f29-4b5a-baac-a13df0848943 +# ╠═221bb602-77f5-4ecf-95c4-3f9fba654eff +# ╠═0acbaeed-3f9c-4a35-b178-8a443a5882e9 +# β•Ÿβ”€13750938-b1b7-4914-867b-a77895389a10 +# β•Ÿβ”€586b13fa-d7b7-4d2e-b27d-46f744ebeccb +# β•Ÿβ”€00000000-0000-0000-0000-000000000001 +# β•Ÿβ”€00000000-0000-0000-0000-000000000002 diff --git a/notebooks_old/2_matrix_jacobians.jl b/notebooks_old/2_matrix_jacobians.jl new file mode 100644 index 0000000..81acd44 --- /dev/null +++ b/notebooks_old/2_matrix_jacobians.jl @@ -0,0 +1,1281 @@ +### A Pluto.jl notebook ### +# v0.19.11 + +using Markdown +using InteractiveUtils + +# ╔═║ 2b24bf38-7398-11ec-2375-3360ec3a2b76 +using Symbolics, LinearAlgebra, PlutoUI + +# ╔═║ af4081dd-b957-4c5d-b05f-76b2dc45f982 +using ForwardDiff + +# ╔═║ bdbdb5e1-aa07-4724-9bb8-b2472dcf754d +md""" +# Two by Two Matrix Jacobians +""" + +# ╔═║ 01e3eafb-969a-4d86-ae72-9b8451d910ee +md""" +This notebook emphasizes the multiple views of Jacobians with examples of 2x2 matrix functions. + +In particular we will see the +* Symbolic "vec" format producing 4x4 matrices (generally nΒ² by nΒ² or mn by mn) +* Numerical formats +* The important Linear Transformation view +* Kronecker notation +* An example using ForwardDiff automatic differentiation + +We also emphasize that matrix factorizations are also matrix functions, just as much as the square and the cube. +""" + +# ╔═║ 473e7843-2c5c-4602-b0d2-022edc5cb317 +TableOfContents(title="Two by Two Matrix Jacobians", indent=true,aside=true) + +# ╔═║ 15626238-97a6-4a9b-8e62-694c75255e18 +md""" +# Symbolic Matrices +""" + +# ╔═║ f3df5702-881d-41f2-9788-25cdab6863fb +@variables p,q,r,s,ΞΈ + +# ╔═║ df4b65fb-c061-4ff1-bef8-7df3b6dc8cbc +X = [p r;q s] + +# ╔═║ d3682699-c9f3-43d0-a0e6-42500a36a0fe +md""" +## vec +The `vec` command in Julia and in standard mathematics flattens a matrix column by column. +""" + +# ╔═║ a052db18-1aef-4bd2-8f4a-64ee9fe0d93a +vec(X) + +# ╔═║ 22b9fb13-bbb8-4b41-adde-a70969f4b176 +md""" +# 1) The matrix square function +""" + +# ╔═║ c8eb1613-1be3-4334-a025-e102d8a0b45a +X^2 + +# ╔═║ ade5eaaf-0b53-4230-9264-6c0c7faa3486 +vec(X^2) + +# ╔═║ 2e886e5d-b23d-4d72-a14f-c069c6ce416b +md""" + ## Symbolic Jacobian +The Jacobian of the (flattened) matrix function XΒ² symbolically +""" + +# ╔═║ 2a93a2f0-a846-4c7c-91ab-7da411902022 +jac(Y,X) = Symbolics.jacobian(vec(Y),vec(X)) + +# ╔═║ f4789b01-101d-47f3-9dd2-b48fa845d271 +J = jac(X^2, X) + +# ╔═║ b647c2d0-07b6-48ef-a3cb-c09e95da2e1f +md""" +## Numerical Jacobian +""" + +# ╔═║ 2507be58-29b5-4b65-b093-c1ba5b1161f3 +begin + M = [1 2;3 4] + E = [.0001 .0002;.0003 .0004] + substitute(J,Dict(p=>1,q=>3,r=>2,s=>4)) +end + +# ╔═║ f5d34fa1-f673-440d-a6f2-1c978ba77230 +substitute(J,Dict(p=>1,q=>3,r=>2,s=>4)) * vec(E) + +# ╔═║ 8d66e0f8-c739-44cf-a280-f03945098eb9 +(M+E)^2 - M^2 + +# ╔═║ fdb5bb9b-1491-48f6-aa5f-c74835b2e947 +md""" +## Linear Transformation Jacobian +Notice: there is no flattening; this is just matrix to matrix. +""" + +# ╔═║ 82dc6ca6-b232-4721-8132-52628acf2996 +linear_transformation(E) = M*E + E*M + +# ╔═║ b217a000-8fbd-4497-a7cb-5172378442bc +linear_transformation(E) + +# ╔═║ 2a373129-5ea1-4345-b55f-2d11c441b929 +md""" +## Kronecker product or βŠ— notation +Notation that kind of lets you think "flattened" or "not flattened" at the same time +""" + +# ╔═║ f7942604-85e6-4220-8473-1f0a78e1648e +@variables a,b,c,d + +# ╔═║ d8b6487f-9349-4bc8-a121-6b908ce03b3b +[p r;q s],[a c;b d] + +# ╔═║ 400adebe-26cd-4174-a797-f64d6bc24aa3 +md""" +Notice all possible products with the first matrix and the second +""" + +# ╔═║ f1590695-e3ef-4473-b61b-2081401ff05c +kron([a;b],[p q;r s]) + +# ╔═║ ee91570e-9668-4da5-9b3d-9dc4407dad32 +kron([a c;b d],[p q;r s] ) + +# ╔═║ 8ab37951-7f07-4d0e-bd02-b89069807062 +@variables e f g h πŸ• πŸ‘½ 🐼 😸 + +# ╔═║ 8e16e22b-8a01-4c67-8314-fec376b4d59d +kron([a b c;d e f],[πŸ• πŸ‘½; 🐼 😸]) + +# ╔═║ d0192d30-28ca-451e-9d6b-2026fbef757a +md""" +It is very reasonable to express the Jacobian of the matrix square function as $(br) +``I_2 \otimes X + X^T \otimes I_2`` +""" + +# ╔═║ df8abae6-14ef-45f9-9545-a5e6ef27e56c +begin + I2 = [1 0; 0 1] + kron(I2,X) + kron(X',I2) , J +end + +# ╔═║ 4567d87e-6234-4c46-8b9b-ad3cf7c86150 +kron([πŸ• πŸ‘½; 🐼 😸],I2) + +# ╔═║ 1a455f8e-1b43-4037-a8fe-829c23fdb05b +kron(I2,[πŸ• πŸ‘½; 🐼 😸]) + +# ╔═║ e0beb540-8e6b-4ed1-86ff-c9460b032b13 +kron(I2,X) + +# ╔═║ 056e4b31-b070-492b-9165-3f2a79693184 +kron(X',I2) + +# ╔═║ 35139dda-d446-4213-a13e-66a21332beae +md""" +### Key Kronecker identity + (A βŠ— B) * vec(C) = vec(BCAα΅€) +""" + +# ╔═║ 0a78fe1c-e613-48b9-8e3b-2fe162c4b238 +begin + A = rand(5,7) + B = rand(4,3) + C = rand(3,7) + kron(A,B) * vec(C) β‰ˆ vec(B*C*A') +end + +# ╔═║ ccccb3c3-a4c8-4600-af5b-62eaff769079 +kron( rand(5,5) , rand(5,5) ) + +# ╔═║ 12b2e304-a25c-4dfb-882b-5d77b029438f +md""" + Useful Krockecker identities + + +* $(A\otimes B)^T=A^T\otimes B^T$ +* $(A\otimes B)^{-1}=A^{-1}\otimes B^{-1}$ +* $\det(A\otimes B)=\det(A)^m\det(B)^n$, $A\in\Re^{n,n}, B\in\Re^{m,m}$ +* $trace(A\otimes B)=trace(A)trace(B)$ +* $A\otimes B$ is orthogonal if $A$ and $B$ are orthogonal +* $(A \otimes B)(C \otimes D)=(AC) \otimes (BD)$ +* If $Au = \lambda u$, and $Bv=\mu v$, then if $X=vu^T$, then + $BXA^T =\lambda \mu X$, and also $AX^T B^T = + \lambda \mu X^T$. Therefore $A \otimes B$ and $B \otimes A$ + have the same eigenvalues, and transposed eigenvectors. + +(See [Wikipedia](https://en.wikipedia.org/wiki/Kronecker_product#Properties) for more properties. ) +""" + +# ╔═║ 3173f5ad-88bb-48dc-b247-e3f33fbd6f56 +md""" +## The Jacobian in Kronecker notation +""" + +# ╔═║ 45864dac-896a-483c-8b8a-c040fb99cebb +md""" +You see (IβŠ—X + X'βŠ—I) vec(dX) = vec(XdX + dX X) = vec( d(XΒ²)) $(br) +showing that d(XΒ²) = (IβŠ—X + X'βŠ—I) dX. + +(I feel it's okay to drop the "vec" and think of the kronecker notation +as defining the linear operator from matrices to matrices) + +Do look this over. $(br) +""" + +# ╔═║ 678f07c2-bb5d-4464-ba7b-044dc97719dc +md""" +## Automatic Differentiation (is not finite differences nor symbolic) +It comes in forward and reverse modes. Let's try forward. +""" + +# ╔═║ 4b10b0a3-f47b-493a-a47f-2e30c24847a2 +J + +# ╔═║ e9186f6d-485e-446e-b412-1f3de9a9473f +ForwardDiff.jacobian(X->X^2,M) + +# ╔═║ 70fa3888-4fd8-4dae-993f-e9defd565d19 +#Check +substitute(J, Dict(X.=>[1 3;2 4] )) + +# ╔═║ 21030b50-6484-4d9b-a58f-5655f769e367 +ForwardDiff.jacobian(X->X^2,X) + +# ╔═║ 0fe3ac0b-fa39-4210-b442-2255314b2ea2 +md""" +# 2) The matrix cube Function +""" + +# ╔═║ 5f86f7b0-5165-496a-8951-8306825efb5c +expand.(X^3) + +# ╔═║ 5fe9ab2a-9988-4773-bb8d-c2182eafd0d6 +md""" + ## Symbolic Jacobian +The Jacobian of the (flattened) matrix function XΒ² symbolically +""" + +# ╔═║ 9ca4d018-bfd6-4b91-8e98-a4485dae90c0 +expand.(jac(X^3, X)) + +# ╔═║ c1ec4ac7-7185-4d8e-b6b3-2652912cb3a7 +expand.(ForwardDiff.jacobian(X->X^3,X)) + +# ╔═║ 6d3f1227-1b9f-4dfd-9c3e-99531a45d8ad +md""" +## LinearTransformation Jacobian +""" + +# ╔═║ 0f5bc339-d325-4ab4-be75-93f3d7aba92a +md""" + dX XΒ² + X dX X + dX XΒ² +""" + +# ╔═║ 00514808-b660-4ccb-b3f6-4bfadbde6db0 +md""" +with numerical data: +""" + +# ╔═║ 30d07b76-0361-4d47-b8ab-a8c281163683 +E -> E*M*M + M*E*M + E*M*M + +# ╔═║ 0612d07e-3752-4e3e-b5ad-a88ba464a25f +(E+M)^3 - M^3 + +# ╔═║ 8dcf84c3-20ce-4e7a-976c-c17fe273e118 +(E -> E*M*M + M*E*M + E*M*M)(E) + +# ╔═║ d2f3dcd4-cdb0-451c-b5cf-13e68ed79c19 +md""" +check against the symbolic answer +""" + +# ╔═║ fd77efc7-fde0-4c40-bba8-6bb2e0e1e3c2 +substitute( Symbolics.jacobian(vec(X^3), vec(X)) , Dict(p=>M[1,1],q=>M[2,1],r=>M[1,2],s=>M[2,2])) + +# ╔═║ bc61a209-88f1-437f-a16c-ca3deab4cd38 +substitute( Symbolics.jacobian(vec(X^3), vec(X)) , Dict(p=>M[1,1],q=>M[2,1],r=>M[1,2],s=>M[2,2])) * vec(E) + +# ╔═║ a7ea01b6-3347-4bd7-ad27-e067ee103426 +md""" +## The Jacobian in Kronecker Notation +""" + +# ╔═║ 5aa421ca-a6a6-447f-8af1-d724cea626ae +expand.( kron(I2,X^2) + kron(X',X) + kron(X'^2,I2) ) + +# ╔═║ 3acd6aaf-e40c-4748-8180-57a53368eac6 +md""" +# 3) The LU Decomposition + +Recall the LU Decomposition factors a matrix into unit lower-triangular and upper triangular: +""" + +# ╔═║ c28d1043-259f-4045-8148-031da91dc818 +begin + L,U = lu(X); + L,U +end + +# ╔═║ c621d2fc-9808-4035-9674-21d984043b8e +simplify_fractions.(L*U) + +# ╔═║ e322f5a8-93b4-4d6e-ab93-c98d56cf853e +md""" +The four entries of X: p,q,r,s are transformed into these four entries in LU: +""" + +# ╔═║ 4695b82d-2f06-42e5-b446-da8a7a23046b +[L[2,1],U[1,1],U[1,2],U[2,2]] + +# ╔═║ bf000d5a-ccdb-4fbe-a13f-6277758e9c99 +jac([L[2,1],U[1,1],U[1,2],U[2,2]], X) + +# ╔═║ aed69d60-dfc3-421c-900f-20fe4450a64e +md""" +Exercise: Relate this to d(LU) = dL U + L dU +""" + +# ╔═║ 261c7aef-0fad-4e38-ab5d-3a28eda8061a +md""" +# 4) Traceless symmetric eigenproblem: an example with two parameters not four +""" + +# ╔═║ 27b84eb1-54ce-4ad2-9481-0303360ad252 +S = [p s; s -p] + +# ╔═║ df2247ff-8748-403f-bb31-87c97a937f3b +md""" +We know that the eigenvalues add to 0 (from the trace) and the eigenvectors are orthogonal (from being symmetric), so we can represent the eigenvectors and eigenvalues: +""" + +# ╔═║ 52cf1b9f-6536-451a-9bec-e7a049773d97 +Q = [cos(ΞΈ/2) -sin(ΞΈ/2); sin(ΞΈ/2) cos(ΞΈ/2)] # Eigenvector matrix + +# ╔═║ 00ad9b68-54da-4a47-a149-9505e25afee1 +simplify.( Q*[r 0 ; 0 -r]*Q' ) + +# ╔═║ bce0919f-5951-4f52-96ee-a71fa49c5228 +Ξ› = [r 0;0 -r] # Eigenvalue matrix + +# ╔═║ f14811a4-8e89-4613-b543-e5b85ebd6389 +Q + +# ╔═║ e804c01e-d83b-41a4-94ae-8c515b985b1f +Ξ› + +# ╔═║ 407e8403-6d9f-442c-985a-04e578c3ed0d +Symbolics.simplify.(Q * Ξ› * Q') + +# ╔═║ c5022a6a-8991-42c0-95b2-fbe0ef1f5773 +md""" +The relationship between ΞΈ,r to p,s: +""" + +# ╔═║ b25dc0d2-c533-435d-ad43-748b94a8da22 +S, simplify.(Q*Ξ›*Q'), [r*cos(ΞΈ) r*sin(ΞΈ) ; r*sin(ΞΈ) -r*cos(ΞΈ)] + +# ╔═║ 58de51b7-6ae3-4fc0-98b5-5e9eba8a0876 +simplify.(jac( (Q*Ξ›*Q')[1:2] , [r,ΞΈ])) + +# ╔═║ 1281cb63-afd9-419f-bb39-4807def53309 +md""" +Interesting mathematical observation: these are the formulas you may remember +from other classes that relate cartesian coordinates to polar coordinates in the plane. +""" + +# ╔═║ 426c7518-150c-4b3a-9fdc-1eb59c48c9cb +jacobian_det = simplify(det(simplify.(jac( (Q*Ξ›*Q')[1:2] , [r,ΞΈ])))) + +# ╔═║ e312cf5c-7c05-4cf8-9d63-639cd614e564 +md""" +Mathematical aside det J=r , this is the change of variables from x,y to r,ΞΈ that you may have seen in 18.02. This eigenvalue problem is the same as the cartesian coordinates to polar representations of the plane. Often written dx dy = r dr dΞΈ +""" + +# ╔═║ a67c807d-2d65-43fa-944a-7a8e6df031b9 +md""" +# 5) The full 2x2 symmetric eigenproblem +""" + +# ╔═║ ad3b7548-8822-4304-a24d-d3e49e79a09f +@variables λ₁ Ξ»β‚‚ + +# ╔═║ 1f67e9f6-23ce-43ae-9280-84a5747fa577 +md""" +We think of + +``\left( \begin{array}{cc} +p & s \\ s & r +\end{array} \right) = +\left( \begin{array}{rr} \cos(\theta) & -\sin(\theta) \\ \sin(\theta) & \cos(\theta) +\end{array} \right) +\left( \begin{array}{cc} +\lambda_1 & 0 \\ 0 & \lambda_2 +\end{array} \right) +\left( \begin{array}{rr} \cos(\theta) & -\sin(\theta) \\ \sin(\theta) & \cos(\theta) +\end{array} \right)^T +`` +$(br) +as the function from $(br) +``\lambda_1,\lambda_2,ΞΈ \rightarrow p,r,s`` + +""" + +# ╔═║ 1b9912e2-3d35-43a6-9d52-6aef7c780873 +md""" + S = QΞ›Q': +""" + +# ╔═║ 1b640642-920e-4ec3-80e9-9001e96e1634 +let + Q = [cos(ΞΈ) -sin(ΞΈ); sin(ΞΈ) cos(ΞΈ)] + S = Q*[λ₁ 0;0 Ξ»β‚‚]*Q' + [p s;s r], S + J = jac([S[1,1],S[2,2],S[1,2]] , [λ₁,Ξ»β‚‚,ΞΈ]) +end + +# ╔═║ 03a0fb73-a3f3-4c6f-9483-369beeac85ba +md""" +The determinant of this transformation simplifies to ``\lambda_1 - \lambda_2`` +which some people interpret as a kind of repulsion between the two eigenvalues: +that is there is a tendency for the two eigenvalues to not want to be too close +together. (If both are equal, when n=2, the matrix is ``\alpha I``, one condition +takes three parameters down to 1) +""" + +# ╔═║ 00000000-0000-0000-0000-000000000001 +PLUTO_PROJECT_TOML_CONTENTS = """ +[deps] +ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" +LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" +PlutoUI = "7f904dfe-b85e-4ff6-b463-dae2292396a8" +Symbolics = "0c5d862f-8b57-4792-8d23-62f2024744c7" + +[compat] +ForwardDiff = "~0.10.24" +PlutoUI = "~0.7.29" +Symbolics = "~4.3.0" +""" + +# ╔═║ 00000000-0000-0000-0000-000000000002 +PLUTO_MANIFEST_TOML_CONTENTS = """ +# This file is machine-generated - editing it directly is not advised + +julia_version = "1.8.0-rc4" +manifest_format = "2.0" +project_hash = "966c575027181f6f85fc66852aa1872a19e142a0" + +[[deps.AbstractPlutoDingetjes]] +deps = ["Pkg"] +git-tree-sha1 = "8eaf9f1b4921132a4cff3f36a1d9ba923b14a481" +uuid = "6e696c72-6542-2067-7265-42206c756150" +version = "1.1.4" + +[[deps.AbstractTrees]] +git-tree-sha1 = "03e0550477d86222521d254b741d470ba17ea0b5" +uuid = "1520ce14-60c1-5f80-bbc7-55ef81b5835c" +version = "0.3.4" + +[[deps.Adapt]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "af92965fb30777147966f58acb05da51c5616b5f" +uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" +version = "3.3.3" + +[[deps.ArgCheck]] +git-tree-sha1 = "dedbbb2ddb876f899585c4ec4433265e3017215a" +uuid = "dce04be8-c92d-5529-be00-80e4d2c0e197" +version = "2.1.0" + +[[deps.ArgTools]] +uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" +version = "1.1.1" + +[[deps.ArrayInterface]] +deps = ["Compat", "IfElse", "LinearAlgebra", "Requires", "SparseArrays", "Static"] +git-tree-sha1 = "ffc6588e17bcfcaa79dfa5b4f417025e755f83fc" +uuid = "4fba245c-0d91-5ea0-9b3e-6abc04ee57a9" +version = "4.0.1" + +[[deps.Artifacts]] +uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" + +[[deps.AutoHashEquals]] +git-tree-sha1 = "45bb6705d93be619b81451bb2006b7ee5d4e4453" +uuid = "15f4f7f2-30c1-5605-9d31-71845cf9641f" +version = "0.2.0" + +[[deps.BangBang]] +deps = ["Compat", "ConstructionBase", "Future", "InitialValues", "LinearAlgebra", "Requires", "Setfield", "Tables", "ZygoteRules"] +git-tree-sha1 = "a33794b483965bf49deaeec110378640609062b1" +uuid = "198e06fe-97b7-11e9-32a5-e1d131e6ad66" +version = "0.3.34" + +[[deps.Base64]] +uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" + +[[deps.Baselet]] +git-tree-sha1 = "aebf55e6d7795e02ca500a689d326ac979aaf89e" +uuid = "9718e550-a3fa-408a-8086-8db961cd8217" +version = "0.1.1" + +[[deps.Bijections]] +git-tree-sha1 = "705e7822597b432ebe152baa844b49f8026df090" +uuid = "e2ed5e7c-b2de-5872-ae92-c73ca462fb04" +version = "0.1.3" + +[[deps.ChainRulesCore]] +deps = ["Compat", "LinearAlgebra", "SparseArrays"] +git-tree-sha1 = "926870acb6cbcf029396f2f2de030282b6bc1941" +uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" +version = "1.11.4" + +[[deps.ChangesOfVariables]] +deps = ["ChainRulesCore", "LinearAlgebra", "Test"] +git-tree-sha1 = "bf98fa45a0a4cee295de98d4c1462be26345b9a1" +uuid = "9e997f8a-9a97-42d5-a9f1-ce6bfc15e2c0" +version = "0.1.2" + +[[deps.ColorTypes]] +deps = ["FixedPointNumbers", "Random"] +git-tree-sha1 = "024fe24d83e4a5bf5fc80501a314ce0d1aa35597" +uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f" +version = "0.11.0" + +[[deps.Combinatorics]] +git-tree-sha1 = "08c8b6831dc00bfea825826be0bc8336fc369860" +uuid = "861a8166-3701-5b0c-9a16-15d98fcdc6aa" +version = "1.0.2" + +[[deps.CommonSolve]] +git-tree-sha1 = "68a0743f578349ada8bc911a5cbd5a2ef6ed6d1f" +uuid = "38540f10-b2f7-11e9-35d8-d573e4eb0ff2" +version = "0.2.0" + +[[deps.CommonSubexpressions]] +deps = ["MacroTools", "Test"] +git-tree-sha1 = "7b8a93dba8af7e3b42fecabf646260105ac373f7" +uuid = "bbf7d656-a473-5ed7-a52c-81e309532950" +version = "0.3.0" + +[[deps.Compat]] +deps = ["Base64", "Dates", "DelimitedFiles", "Distributed", "InteractiveUtils", "LibGit2", "Libdl", "LinearAlgebra", "Markdown", "Mmap", "Pkg", "Printf", "REPL", "Random", "SHA", "Serialization", "SharedArrays", "Sockets", "SparseArrays", "Statistics", "Test", "UUIDs", "Unicode"] +git-tree-sha1 = "44c37b4636bc54afac5c574d2d02b625349d6582" +uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" +version = "3.41.0" + +[[deps.CompilerSupportLibraries_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" +version = "0.5.2+0" + +[[deps.CompositeTypes]] +git-tree-sha1 = "d5b014b216dc891e81fea299638e4c10c657b582" +uuid = "b152e2b5-7a66-4b01-a709-34e65c35f657" +version = "0.1.2" + +[[deps.CompositionsBase]] +git-tree-sha1 = "455419f7e328a1a2493cabc6428d79e951349769" +uuid = "a33af91c-f02d-484b-be07-31d278c5ca2b" +version = "0.1.1" + +[[deps.ConstructionBase]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "f74e9d5388b8620b4cee35d4c5a618dd4dc547f4" +uuid = "187b0558-2788-49d3-abe0-74a17ed4e7c9" +version = "1.3.0" + +[[deps.DataAPI]] +git-tree-sha1 = "cc70b17275652eb47bc9e5f81635981f13cea5c8" +uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a" +version = "1.9.0" + +[[deps.DataStructures]] +deps = ["Compat", "InteractiveUtils", "OrderedCollections"] +git-tree-sha1 = "3daef5523dd2e769dad2365274f760ff5f282c7d" +uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" +version = "0.18.11" + +[[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.DelimitedFiles]] +deps = ["Mmap"] +uuid = "8bb1440f-4735-579b-a4ab-409b98df4dab" + +[[deps.DensityInterface]] +deps = ["InverseFunctions", "Test"] +git-tree-sha1 = "80c3e8639e3353e5d2912fb3a1916b8455e2494b" +uuid = "b429d917-457f-4dbc-8f4c-0cc954292b1d" +version = "0.4.0" + +[[deps.DiffResults]] +deps = ["StaticArrays"] +git-tree-sha1 = "c18e98cba888c6c25d1c3b048e4b3380ca956805" +uuid = "163ba53b-c6d8-5494-b064-1a9d43ac40c5" +version = "1.0.3" + +[[deps.DiffRules]] +deps = ["LogExpFunctions", "NaNMath", "Random", "SpecialFunctions"] +git-tree-sha1 = "9bc5dac3c8b6706b58ad5ce24cffd9861f07c94f" +uuid = "b552c78f-8df3-52c6-915a-8e097449b14b" +version = "1.9.0" + +[[deps.Distributed]] +deps = ["Random", "Serialization", "Sockets"] +uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" + +[[deps.Distributions]] +deps = ["ChainRulesCore", "DensityInterface", "FillArrays", "LinearAlgebra", "PDMats", "Printf", "QuadGK", "Random", "SparseArrays", "SpecialFunctions", "Statistics", "StatsBase", "StatsFuns", "Test"] +git-tree-sha1 = "97e9e9d0b8303bae296f3bdd1c2b0065dcb7e7ef" +uuid = "31c24e10-a181-5473-b8eb-7969acd0382f" +version = "0.25.38" + +[[deps.DocStringExtensions]] +deps = ["LibGit2"] +git-tree-sha1 = "b19534d1895d702889b219c382a6e18010797f0b" +uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" +version = "0.8.6" + +[[deps.DomainSets]] +deps = ["CompositeTypes", "IntervalSets", "LinearAlgebra", "StaticArrays", "Statistics"] +git-tree-sha1 = "5f5f0b750ac576bcf2ab1d7782959894b304923e" +uuid = "5b8099bc-c8ec-5219-889f-1d9e522a28bf" +version = "0.5.9" + +[[deps.Downloads]] +deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] +uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" +version = "1.6.0" + +[[deps.DynamicPolynomials]] +deps = ["DataStructures", "Future", "LinearAlgebra", "MultivariatePolynomials", "MutableArithmetics", "Pkg", "Reexport", "Test"] +git-tree-sha1 = "585de0d658506cf0fe5808026edff662bef5bf03" +uuid = "7c1d4256-1411-5781-91ec-d7bc3513ac07" +version = "0.4.1" + +[[deps.EllipsisNotation]] +deps = ["ArrayInterface"] +git-tree-sha1 = "d7ab55febfd0907b285fbf8dc0c73c0825d9d6aa" +uuid = "da5c29d0-fa7d-589e-88eb-ea29b0a81949" +version = "1.3.0" + +[[deps.ExprTools]] +git-tree-sha1 = "24565044e60bc48a7562e75bcf14f084901dc0b6" +uuid = "e2ba6199-217a-4e67-a87a-7c52f15ade04" +version = "0.1.7" + +[[deps.FileWatching]] +uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" + +[[deps.FillArrays]] +deps = ["LinearAlgebra", "Random", "SparseArrays", "Statistics"] +git-tree-sha1 = "8756f9935b7ccc9064c6eef0bff0ad643df733a3" +uuid = "1a297f60-69ca-5386-bcde-b61e274b549b" +version = "0.12.7" + +[[deps.FixedPointNumbers]] +deps = ["Statistics"] +git-tree-sha1 = "335bfdceacc84c5cdf16aadc768aa5ddfc5383cc" +uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" +version = "0.8.4" + +[[deps.Formatting]] +deps = ["Printf"] +git-tree-sha1 = "8339d61043228fdd3eb658d86c926cb282ae72a8" +uuid = "59287772-0a20-5a39-b81b-1366585eb4c0" +version = "0.4.2" + +[[deps.ForwardDiff]] +deps = ["CommonSubexpressions", "DiffResults", "DiffRules", "LinearAlgebra", "LogExpFunctions", "NaNMath", "Preferences", "Printf", "Random", "SpecialFunctions", "StaticArrays"] +git-tree-sha1 = "2b72a5624e289ee18256111657663721d59c143e" +uuid = "f6369f11-7733-5829-9624-2563aa707210" +version = "0.10.24" + +[[deps.Future]] +deps = ["Random"] +uuid = "9fa8497b-333b-5362-9e8d-4d0656e87820" + +[[deps.Hyperscript]] +deps = ["Test"] +git-tree-sha1 = "8d511d5b81240fc8e6802386302675bdf47737b9" +uuid = "47d2ed2b-36de-50cf-bf87-49c2cf4b8b91" +version = "0.0.4" + +[[deps.HypertextLiteral]] +git-tree-sha1 = "2b078b5a615c6c0396c77810d92ee8c6f470d238" +uuid = "ac1192a8-f4b3-4bfe-ba22-af5b92cd3ab2" +version = "0.9.3" + +[[deps.IOCapture]] +deps = ["Logging", "Random"] +git-tree-sha1 = "f7be53659ab06ddc986428d3a9dcc95f6fa6705a" +uuid = "b5f81e59-6552-4d32-b1f0-c071b021bf89" +version = "0.2.2" + +[[deps.IfElse]] +git-tree-sha1 = "debdd00ffef04665ccbb3e150747a77560e8fad1" +uuid = "615f187c-cbe4-4ef1-ba3b-2fcf58d6d173" +version = "0.1.1" + +[[deps.InitialValues]] +git-tree-sha1 = "4da0f88e9a39111c2fa3add390ab15f3a44f3ca3" +uuid = "22cec73e-a1b8-11e9-2c92-598750a2cf9c" +version = "0.3.1" + +[[deps.InteractiveUtils]] +deps = ["Markdown"] +uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" + +[[deps.IntervalSets]] +deps = ["Dates", "EllipsisNotation", "Statistics"] +git-tree-sha1 = "3cc368af3f110a767ac786560045dceddfc16758" +uuid = "8197267c-284f-5f27-9208-e0e47529a953" +version = "0.5.3" + +[[deps.InverseFunctions]] +deps = ["Test"] +git-tree-sha1 = "a7254c0acd8e62f1ac75ad24d5db43f5f19f3c65" +uuid = "3587e190-3f89-42d0-90ee-14403ec27112" +version = "0.1.2" + +[[deps.IrrationalConstants]] +git-tree-sha1 = "7fd44fd4ff43fc60815f8e764c0f352b83c49151" +uuid = "92d709cd-6900-40b7-9082-c6be49f344b6" +version = "0.1.1" + +[[deps.IteratorInterfaceExtensions]] +git-tree-sha1 = "a3f24677c21f5bbe9d2a714f95dcd58337fb2856" +uuid = "82899510-4779-5014-852e-03e436cf321d" +version = "1.0.0" + +[[deps.JLLWrappers]] +deps = ["Preferences"] +git-tree-sha1 = "22df5b96feef82434b07327e2d3c770a9b21e023" +uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" +version = "1.4.0" + +[[deps.JSON]] +deps = ["Dates", "Mmap", "Parsers", "Unicode"] +git-tree-sha1 = "8076680b162ada2a031f707ac7b4953e30667a37" +uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" +version = "0.21.2" + +[[deps.LaTeXStrings]] +git-tree-sha1 = "f2355693d6778a178ade15952b7ac47a4ff97996" +uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" +version = "1.3.0" + +[[deps.LabelledArrays]] +deps = ["ArrayInterface", "ChainRulesCore", "LinearAlgebra", "MacroTools", "StaticArrays"] +git-tree-sha1 = "41158dee1d434944570b02547d404e075da15690" +uuid = "2ee39098-c373-598a-b85f-a56591580800" +version = "1.7.0" + +[[deps.Latexify]] +deps = ["Formatting", "InteractiveUtils", "LaTeXStrings", "MacroTools", "Markdown", "Printf", "Requires"] +git-tree-sha1 = "a8f4f279b6fa3c3c4f1adadd78a621b13a506bce" +uuid = "23fbe1c1-3f47-55db-b15f-69d7ec21a316" +version = "0.15.9" + +[[deps.LibCURL]] +deps = ["LibCURL_jll", "MozillaCACerts_jll"] +uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" +version = "0.6.3" + +[[deps.LibCURL_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] +uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" +version = "7.84.0+0" + +[[deps.LibGit2]] +deps = ["Base64", "NetworkOptions", "Printf", "SHA"] +uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" + +[[deps.LibSSH2_jll]] +deps = ["Artifacts", "Libdl", "MbedTLS_jll"] +uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" +version = "1.10.2+0" + +[[deps.Libdl]] +uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" + +[[deps.LinearAlgebra]] +deps = ["Libdl", "libblastrampoline_jll"] +uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + +[[deps.LogExpFunctions]] +deps = ["ChainRulesCore", "ChangesOfVariables", "DocStringExtensions", "InverseFunctions", "IrrationalConstants", "LinearAlgebra"] +git-tree-sha1 = "e5718a00af0ab9756305a0392832c8952c7426c1" +uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688" +version = "0.3.6" + +[[deps.Logging]] +uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" + +[[deps.MacroTools]] +deps = ["Markdown", "Random"] +git-tree-sha1 = "3d3e902b31198a27340d0bf00d6ac452866021cf" +uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" +version = "0.5.9" + +[[deps.Markdown]] +deps = ["Base64"] +uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" + +[[deps.MbedTLS_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" +version = "2.28.0+0" + +[[deps.Metatheory]] +deps = ["AutoHashEquals", "DataStructures", "Dates", "DocStringExtensions", "Parameters", "Reexport", "TermInterface", "ThreadsX", "TimerOutputs"] +git-tree-sha1 = "0886d229caaa09e9f56bcf1991470bd49758a69f" +uuid = "e9d8d322-4543-424a-9be4-0cc815abe26c" +version = "1.3.3" + +[[deps.MicroCollections]] +deps = ["BangBang", "InitialValues", "Setfield"] +git-tree-sha1 = "6bb7786e4f24d44b4e29df03c69add1b63d88f01" +uuid = "128add7d-3638-4c79-886c-908ea0c25c34" +version = "0.1.2" + +[[deps.Missings]] +deps = ["DataAPI"] +git-tree-sha1 = "bf210ce90b6c9eed32d25dbcae1ebc565df2687f" +uuid = "e1d29d7a-bbdc-5cf2-9ac0-f12de2c33e28" +version = "1.0.2" + +[[deps.Mmap]] +uuid = "a63ad114-7e13-5084-954f-fe012c677804" + +[[deps.MozillaCACerts_jll]] +uuid = "14a3606d-f60d-562e-9121-12d972cd8159" +version = "2022.2.1" + +[[deps.MultivariatePolynomials]] +deps = ["DataStructures", "LinearAlgebra", "MutableArithmetics"] +git-tree-sha1 = "fa6ce8c91445e7cd54de662064090b14b1089a6d" +uuid = "102ac46a-7ee4-5c85-9060-abc95bfdeaa3" +version = "0.4.2" + +[[deps.MutableArithmetics]] +deps = ["LinearAlgebra", "SparseArrays", "Test"] +git-tree-sha1 = "73deac2cbae0820f43971fad6c08f6c4f2784ff2" +uuid = "d8a4904e-b15c-11e9-3269-09a3773c0cb0" +version = "0.3.2" + +[[deps.NaNMath]] +git-tree-sha1 = "f755f36b19a5116bb580de457cda0c140153f283" +uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" +version = "0.3.6" + +[[deps.NetworkOptions]] +uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" +version = "1.2.0" + +[[deps.OpenBLAS_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] +uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" +version = "0.3.20+0" + +[[deps.OpenLibm_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "05823500-19ac-5b8b-9628-191a04bc5112" +version = "0.8.1+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.OrderedCollections]] +git-tree-sha1 = "85f8e6578bf1f9ee0d11e7bb1b1456435479d47c" +uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" +version = "1.4.1" + +[[deps.PDMats]] +deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"] +git-tree-sha1 = "ee26b350276c51697c9c2d88a072b339f9f03d73" +uuid = "90014a1f-27ba-587c-ab20-58faa44d9150" +version = "0.11.5" + +[[deps.Parameters]] +deps = ["OrderedCollections", "UnPack"] +git-tree-sha1 = "34c0e9ad262e5f7fc75b10a9952ca7692cfc5fbe" +uuid = "d96e819e-fc66-5662-9728-84c9c7592b0a" +version = "0.12.3" + +[[deps.Parsers]] +deps = ["Dates"] +git-tree-sha1 = "92f91ba9e5941fc781fecf5494ac1da87bdac775" +uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" +version = "2.2.0" + +[[deps.Pkg]] +deps = ["Artifacts", "Dates", "Downloads", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] +uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" +version = "1.8.0" + +[[deps.PlutoUI]] +deps = ["AbstractPlutoDingetjes", "Base64", "ColorTypes", "Dates", "Hyperscript", "HypertextLiteral", "IOCapture", "InteractiveUtils", "JSON", "Logging", "Markdown", "Random", "Reexport", "UUIDs"] +git-tree-sha1 = "5c0eb9099596090bb3215260ceca687b888a1575" +uuid = "7f904dfe-b85e-4ff6-b463-dae2292396a8" +version = "0.7.30" + +[[deps.Preferences]] +deps = ["TOML"] +git-tree-sha1 = "2cf929d64681236a2e074ffafb8d568733d2e6af" +uuid = "21216c6a-2e73-6563-6e65-726566657250" +version = "1.2.3" + +[[deps.Printf]] +deps = ["Unicode"] +uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" + +[[deps.QuadGK]] +deps = ["DataStructures", "LinearAlgebra"] +git-tree-sha1 = "78aadffb3efd2155af139781b8a8df1ef279ea39" +uuid = "1fd47b50-473d-5c70-9696-f719f8f3bcdc" +version = "2.4.2" + +[[deps.REPL]] +deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] +uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" + +[[deps.Random]] +deps = ["SHA", "Serialization"] +uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" + +[[deps.RecipesBase]] +git-tree-sha1 = "6bf3f380ff52ce0832ddd3a2a7b9538ed1bcca7d" +uuid = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" +version = "1.2.1" + +[[deps.RecursiveArrayTools]] +deps = ["Adapt", "ArrayInterface", "ChainRulesCore", "DocStringExtensions", "FillArrays", "LinearAlgebra", "RecipesBase", "Requires", "StaticArrays", "Statistics", "ZygoteRules"] +git-tree-sha1 = "6b96eb51a22af7e927d9618eaaf135a3520f8e2f" +uuid = "731186ca-8d62-57ce-b412-fbd966d074cd" +version = "2.24.0" + +[[deps.Reexport]] +git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" +uuid = "189a3867-3050-52da-a836-e630ba90ab69" +version = "1.2.2" + +[[deps.Referenceables]] +deps = ["Adapt"] +git-tree-sha1 = "e681d3bfa49cd46c3c161505caddf20f0e62aaa9" +uuid = "42d2dcc6-99eb-4e98-b66c-637b7d73030e" +version = "0.1.2" + +[[deps.Requires]] +deps = ["UUIDs"] +git-tree-sha1 = "838a3a4188e2ded87a4f9f184b4b0d78a1e91cb7" +uuid = "ae029012-a4dd-5104-9daa-d747884805df" +version = "1.3.0" + +[[deps.Rmath]] +deps = ["Random", "Rmath_jll"] +git-tree-sha1 = "bf3188feca147ce108c76ad82c2792c57abe7b1f" +uuid = "79098fc4-a85e-5d69-aa6a-4863f24498fa" +version = "0.7.0" + +[[deps.Rmath_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "68db32dff12bb6127bac73c209881191bf0efbb7" +uuid = "f50d1b31-88e8-58de-be2c-1cc44531875f" +version = "0.3.0+0" + +[[deps.RuntimeGeneratedFunctions]] +deps = ["ExprTools", "SHA", "Serialization"] +git-tree-sha1 = "cdc1e4278e91a6ad530770ebb327f9ed83cf10c4" +uuid = "7e49a35a-f44a-4d26-94aa-eba1b4ca6b47" +version = "0.5.3" + +[[deps.SHA]] +uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" +version = "0.7.0" + +[[deps.SciMLBase]] +deps = ["ArrayInterface", "CommonSolve", "ConstructionBase", "Distributed", "DocStringExtensions", "IteratorInterfaceExtensions", "LinearAlgebra", "Logging", "RecipesBase", "RecursiveArrayTools", "StaticArrays", "Statistics", "Tables", "TreeViews"] +git-tree-sha1 = "40c1c606543c0130cd3673f0dd9e11f2b5d76cd0" +uuid = "0bca4576-84f4-4d90-8ffe-ffa030f20462" +version = "1.26.0" + +[[deps.Serialization]] +uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" + +[[deps.Setfield]] +deps = ["ConstructionBase", "Future", "MacroTools", "Requires"] +git-tree-sha1 = "0afd9e6c623e379f593da01f20590bacc26d1d14" +uuid = "efcf1570-3423-57d1-acb7-fd33fddbac46" +version = "0.8.1" + +[[deps.SharedArrays]] +deps = ["Distributed", "Mmap", "Random", "Serialization"] +uuid = "1a1011a3-84de-559e-8e89-a11a2f7dc383" + +[[deps.Sockets]] +uuid = "6462fe0b-24de-5631-8697-dd941f90decc" + +[[deps.SortingAlgorithms]] +deps = ["DataStructures"] +git-tree-sha1 = "b3363d7460f7d098ca0912c69b082f75625d7508" +uuid = "a2af1166-a08f-5f64-846c-94a0d3cef48c" +version = "1.0.1" + +[[deps.SparseArrays]] +deps = ["LinearAlgebra", "Random"] +uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + +[[deps.SpecialFunctions]] +deps = ["ChainRulesCore", "IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"] +git-tree-sha1 = "e08890d19787ec25029113e88c34ec20cac1c91e" +uuid = "276daf66-3868-5448-9aa4-cd146d93841b" +version = "2.0.0" + +[[deps.SplittablesBase]] +deps = ["Setfield", "Test"] +git-tree-sha1 = "39c9f91521de844bad65049efd4f9223e7ed43f9" +uuid = "171d559e-b47b-412a-8079-5efa626c420e" +version = "0.1.14" + +[[deps.Static]] +deps = ["IfElse"] +git-tree-sha1 = "b4912cd034cdf968e06ca5f943bb54b17b97793a" +uuid = "aedffcd0-7271-4cad-89d0-dc628f76c6d3" +version = "0.5.1" + +[[deps.StaticArrays]] +deps = ["LinearAlgebra", "Random", "Statistics"] +git-tree-sha1 = "2ae4fe21e97cd13efd857462c1869b73c9f61be3" +uuid = "90137ffa-7385-5640-81b9-e52037218182" +version = "1.3.2" + +[[deps.Statistics]] +deps = ["LinearAlgebra", "SparseArrays"] +uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" + +[[deps.StatsAPI]] +git-tree-sha1 = "d88665adc9bcf45903013af0982e2fd05ae3d0a6" +uuid = "82ae8749-77ed-4fe6-ae5f-f523153014b0" +version = "1.2.0" + +[[deps.StatsBase]] +deps = ["DataAPI", "DataStructures", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"] +git-tree-sha1 = "51383f2d367eb3b444c961d485c565e4c0cf4ba0" +uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" +version = "0.33.14" + +[[deps.StatsFuns]] +deps = ["ChainRulesCore", "InverseFunctions", "IrrationalConstants", "LogExpFunctions", "Reexport", "Rmath", "SpecialFunctions"] +git-tree-sha1 = "bedb3e17cc1d94ce0e6e66d3afa47157978ba404" +uuid = "4c63d2b9-4356-54db-8cca-17b64c39e42c" +version = "0.9.14" + +[[deps.SuiteSparse]] +deps = ["Libdl", "LinearAlgebra", "Serialization", "SparseArrays"] +uuid = "4607b0f0-06f3-5cda-b6b1-a6196a1729e9" + +[[deps.SymbolicUtils]] +deps = ["AbstractTrees", "Bijections", "ChainRulesCore", "Combinatorics", "ConstructionBase", "DataStructures", "DocStringExtensions", "DynamicPolynomials", "IfElse", "LabelledArrays", "LinearAlgebra", "Metatheory", "MultivariatePolynomials", "NaNMath", "Setfield", "SparseArrays", "SpecialFunctions", "StaticArrays", "TermInterface", "TimerOutputs"] +git-tree-sha1 = "3f8f28a4d36f224bb3f79ddc5b675b78cec2e16b" +uuid = "d1185830-fcd6-423d-90d6-eec64667417b" +version = "0.19.2" + +[[deps.Symbolics]] +deps = ["ArrayInterface", "ConstructionBase", "DataStructures", "DiffRules", "Distributions", "DocStringExtensions", "DomainSets", "IfElse", "Latexify", "Libdl", "LinearAlgebra", "MacroTools", "Metatheory", "NaNMath", "RecipesBase", "Reexport", "Requires", "RuntimeGeneratedFunctions", "SciMLBase", "Setfield", "SparseArrays", "SpecialFunctions", "StaticArrays", "SymbolicUtils", "TermInterface", "TreeViews"] +git-tree-sha1 = "074e08aea1c745664da5c4b266f50b840e528b1c" +uuid = "0c5d862f-8b57-4792-8d23-62f2024744c7" +version = "4.3.0" + +[[deps.TOML]] +deps = ["Dates"] +uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" +version = "1.0.0" + +[[deps.TableTraits]] +deps = ["IteratorInterfaceExtensions"] +git-tree-sha1 = "c06b2f539df1c6efa794486abfb6ed2022561a39" +uuid = "3783bdb8-4a98-5b6b-af9a-565f29a5fe9c" +version = "1.0.1" + +[[deps.Tables]] +deps = ["DataAPI", "DataValueInterfaces", "IteratorInterfaceExtensions", "LinearAlgebra", "TableTraits", "Test"] +git-tree-sha1 = "bb1064c9a84c52e277f1096cf41434b675cd368b" +uuid = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" +version = "1.6.1" + +[[deps.Tar]] +deps = ["ArgTools", "SHA"] +uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" +version = "1.10.0" + +[[deps.TermInterface]] +git-tree-sha1 = "7aa601f12708243987b88d1b453541a75e3d8c7a" +uuid = "8ea1fca8-c5ef-4a55-8b96-4e9afe9c9a3c" +version = "0.2.3" + +[[deps.Test]] +deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] +uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[[deps.ThreadsX]] +deps = ["ArgCheck", "BangBang", "ConstructionBase", "InitialValues", "MicroCollections", "Referenceables", "Setfield", "SplittablesBase", "Transducers"] +git-tree-sha1 = "6dad289fe5fc1d8e907fa855135f85fb03c8fa7a" +uuid = "ac1d9e8a-700a-412c-b207-f0111f4b6c0d" +version = "0.1.9" + +[[deps.TimerOutputs]] +deps = ["ExprTools", "Printf"] +git-tree-sha1 = "a5aed757f65c8a1c64503bc4035f704d24c749bf" +uuid = "a759f4b9-e2f1-59dc-863e-4aeb61b1ea8f" +version = "0.5.14" + +[[deps.Transducers]] +deps = ["Adapt", "ArgCheck", "BangBang", "Baselet", "CompositionsBase", "DefineSingletons", "Distributed", "InitialValues", "Logging", "Markdown", "MicroCollections", "Requires", "Setfield", "SplittablesBase", "Tables"] +git-tree-sha1 = "3f0945b47207a41946baee6d1385e4ca738c25f7" +uuid = "28d57a85-8fef-5791-bfe6-a80928e7c999" +version = "0.4.68" + +[[deps.TreeViews]] +deps = ["Test"] +git-tree-sha1 = "8d0d7a3fe2f30d6a7f833a5f19f7c7a5b396eae6" +uuid = "a2a6695c-b41b-5b7d-aed9-dbfdeacea5d7" +version = "0.3.0" + +[[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.Zlib_jll]] +deps = ["Libdl"] +uuid = "83775a58-1f1d-513f-b197-d71354ab007a" +version = "1.2.12+3" + +[[deps.ZygoteRules]] +deps = ["MacroTools"] +git-tree-sha1 = "8c1a8e4dfacb1fd631745552c8db35d0deb09ea0" +uuid = "700de1a5-db45-46bc-99cf-38207098b444" +version = "0.2.2" + +[[deps.libblastrampoline_jll]] +deps = ["Artifacts", "Libdl", "OpenBLAS_jll"] +uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" +version = "5.1.1+0" + +[[deps.nghttp2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" +version = "1.48.0+0" + +[[deps.p7zip_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" +version = "17.4.0+0" +""" + +# ╔═║ Cell order: +# β•Ÿβ”€bdbdb5e1-aa07-4724-9bb8-b2472dcf754d +# β•Ÿβ”€01e3eafb-969a-4d86-ae72-9b8451d910ee +# ╠═2b24bf38-7398-11ec-2375-3360ec3a2b76 +# ╠═473e7843-2c5c-4602-b0d2-022edc5cb317 +# β•Ÿβ”€15626238-97a6-4a9b-8e62-694c75255e18 +# ╠═f3df5702-881d-41f2-9788-25cdab6863fb +# ╠═00ad9b68-54da-4a47-a149-9505e25afee1 +# ╠═df4b65fb-c061-4ff1-bef8-7df3b6dc8cbc +# β•Ÿβ”€d3682699-c9f3-43d0-a0e6-42500a36a0fe +# ╠═a052db18-1aef-4bd2-8f4a-64ee9fe0d93a +# β•Ÿβ”€22b9fb13-bbb8-4b41-adde-a70969f4b176 +# ╠═c8eb1613-1be3-4334-a025-e102d8a0b45a +# ╠═ade5eaaf-0b53-4230-9264-6c0c7faa3486 +# β•Ÿβ”€2e886e5d-b23d-4d72-a14f-c069c6ce416b +# ╠═2a93a2f0-a846-4c7c-91ab-7da411902022 +# ╠═f4789b01-101d-47f3-9dd2-b48fa845d271 +# β•Ÿβ”€b647c2d0-07b6-48ef-a3cb-c09e95da2e1f +# ╠═2507be58-29b5-4b65-b093-c1ba5b1161f3 +# ╠═f5d34fa1-f673-440d-a6f2-1c978ba77230 +# ╠═8d66e0f8-c739-44cf-a280-f03945098eb9 +# β•Ÿβ”€fdb5bb9b-1491-48f6-aa5f-c74835b2e947 +# ╠═82dc6ca6-b232-4721-8132-52628acf2996 +# ╠═b217a000-8fbd-4497-a7cb-5172378442bc +# β•Ÿβ”€2a373129-5ea1-4345-b55f-2d11c441b929 +# ╠═f7942604-85e6-4220-8473-1f0a78e1648e +# ╠═d8b6487f-9349-4bc8-a121-6b908ce03b3b +# β•Ÿβ”€400adebe-26cd-4174-a797-f64d6bc24aa3 +# ╠═f1590695-e3ef-4473-b61b-2081401ff05c +# ╠═ee91570e-9668-4da5-9b3d-9dc4407dad32 +# ╠═8ab37951-7f07-4d0e-bd02-b89069807062 +# ╠═8e16e22b-8a01-4c67-8314-fec376b4d59d +# ╠═4567d87e-6234-4c46-8b9b-ad3cf7c86150 +# ╠═1a455f8e-1b43-4037-a8fe-829c23fdb05b +# ╠═e0beb540-8e6b-4ed1-86ff-c9460b032b13 +# ╠═056e4b31-b070-492b-9165-3f2a79693184 +# β•Ÿβ”€d0192d30-28ca-451e-9d6b-2026fbef757a +# ╠═df8abae6-14ef-45f9-9545-a5e6ef27e56c +# β•Ÿβ”€35139dda-d446-4213-a13e-66a21332beae +# ╠═0a78fe1c-e613-48b9-8e3b-2fe162c4b238 +# ╠═ccccb3c3-a4c8-4600-af5b-62eaff769079 +# β•Ÿβ”€12b2e304-a25c-4dfb-882b-5d77b029438f +# β•Ÿβ”€3173f5ad-88bb-48dc-b247-e3f33fbd6f56 +# β•Ÿβ”€45864dac-896a-483c-8b8a-c040fb99cebb +# β•Ÿβ”€678f07c2-bb5d-4464-ba7b-044dc97719dc +# ╠═af4081dd-b957-4c5d-b05f-76b2dc45f982 +# ╠═4b10b0a3-f47b-493a-a47f-2e30c24847a2 +# ╠═e9186f6d-485e-446e-b412-1f3de9a9473f +# ╠═70fa3888-4fd8-4dae-993f-e9defd565d19 +# ╠═21030b50-6484-4d9b-a58f-5655f769e367 +# β•Ÿβ”€0fe3ac0b-fa39-4210-b442-2255314b2ea2 +# ╠═5f86f7b0-5165-496a-8951-8306825efb5c +# β•Ÿβ”€5fe9ab2a-9988-4773-bb8d-c2182eafd0d6 +# ╠═9ca4d018-bfd6-4b91-8e98-a4485dae90c0 +# ╠═c1ec4ac7-7185-4d8e-b6b3-2652912cb3a7 +# β•Ÿβ”€6d3f1227-1b9f-4dfd-9c3e-99531a45d8ad +# β•Ÿβ”€0f5bc339-d325-4ab4-be75-93f3d7aba92a +# β•Ÿβ”€00514808-b660-4ccb-b3f6-4bfadbde6db0 +# ╠═30d07b76-0361-4d47-b8ab-a8c281163683 +# ╠═0612d07e-3752-4e3e-b5ad-a88ba464a25f +# ╠═8dcf84c3-20ce-4e7a-976c-c17fe273e118 +# β•Ÿβ”€d2f3dcd4-cdb0-451c-b5cf-13e68ed79c19 +# ╠═fd77efc7-fde0-4c40-bba8-6bb2e0e1e3c2 +# ╠═bc61a209-88f1-437f-a16c-ca3deab4cd38 +# β•Ÿβ”€a7ea01b6-3347-4bd7-ad27-e067ee103426 +# ╠═5aa421ca-a6a6-447f-8af1-d724cea626ae +# β•Ÿβ”€3acd6aaf-e40c-4748-8180-57a53368eac6 +# ╠═c28d1043-259f-4045-8148-031da91dc818 +# ╠═c621d2fc-9808-4035-9674-21d984043b8e +# β•Ÿβ”€e322f5a8-93b4-4d6e-ab93-c98d56cf853e +# ╠═4695b82d-2f06-42e5-b446-da8a7a23046b +# ╠═bf000d5a-ccdb-4fbe-a13f-6277758e9c99 +# ╠═aed69d60-dfc3-421c-900f-20fe4450a64e +# β•Ÿβ”€261c7aef-0fad-4e38-ab5d-3a28eda8061a +# ╠═27b84eb1-54ce-4ad2-9481-0303360ad252 +# β•Ÿβ”€df2247ff-8748-403f-bb31-87c97a937f3b +# ╠═52cf1b9f-6536-451a-9bec-e7a049773d97 +# ╠═bce0919f-5951-4f52-96ee-a71fa49c5228 +# ╠═f14811a4-8e89-4613-b543-e5b85ebd6389 +# ╠═e804c01e-d83b-41a4-94ae-8c515b985b1f +# ╠═407e8403-6d9f-442c-985a-04e578c3ed0d +# β•Ÿβ”€c5022a6a-8991-42c0-95b2-fbe0ef1f5773 +# ╠═b25dc0d2-c533-435d-ad43-748b94a8da22 +# ╠═58de51b7-6ae3-4fc0-98b5-5e9eba8a0876 +# β•Ÿβ”€1281cb63-afd9-419f-bb39-4807def53309 +# ╠═426c7518-150c-4b3a-9fdc-1eb59c48c9cb +# β•Ÿβ”€e312cf5c-7c05-4cf8-9d63-639cd614e564 +# β•Ÿβ”€a67c807d-2d65-43fa-944a-7a8e6df031b9 +# ╠═ad3b7548-8822-4304-a24d-d3e49e79a09f +# β•Ÿβ”€1f67e9f6-23ce-43ae-9280-84a5747fa577 +# β•Ÿβ”€1b9912e2-3d35-43a6-9d52-6aef7c780873 +# ╠═1b640642-920e-4ec3-80e9-9001e96e1634 +# β•Ÿβ”€03a0fb73-a3f3-4c6f-9483-369beeac85ba +# β•Ÿβ”€00000000-0000-0000-0000-000000000001 +# β•Ÿβ”€00000000-0000-0000-0000-000000000002 diff --git a/notebooks_old/2layerocean.png b/notebooks_old/2layerocean.png new file mode 100644 index 0000000..e1d473b Binary files /dev/null and b/notebooks_old/2layerocean.png differ diff --git a/notebooks_old/3_linear_transformations.jl b/notebooks_old/3_linear_transformations.jl new file mode 100644 index 0000000..63a7d11 --- /dev/null +++ b/notebooks_old/3_linear_transformations.jl @@ -0,0 +1,61 @@ +### A Pluto.jl notebook ### +# v0.19.11 + +using Markdown +using InteractiveUtils + +# ╔═║ 095fe061-b141-4329-a598-89987e69ddb9 + + +# ╔═║ 41f2ea0a-34ea-11ed-0bad-b90a0169251a +T(c::Number) = x -> c * x + +# ╔═║ 8054ab1a-e6ef-41db-951d-faa101364986 +T(w::Vector) = x::Vector -> w'x # could write w β‹… x "cdot" with linalg + +# ╔═║ 3267a067-0613-42fc-9304-d4370c01fff9 +T(A::Matrix) = x::Vector -> A*x + +# ╔═║ 2837c741-ca74-436e-9065-6b86f4e3fd9b +T(10)(1) + +# ╔═║ bfbe6a47-61d9-436c-8c42-323ff7966c3b +T(10)([1,2,3,4]) + +# ╔═║ 3a501d1b-4a19-40c4-925d-0e20bd892904 +T(10)([1 2;3 4]) + +# ╔═║ b25fe8e8-dff6-4c38-9e23-e3b7ff00f42b +T([1,2,3,4])([5,6,7,8]) + +# ╔═║ dde18f54-b212-4792-bf08-83b6c82b1ed6 + + +# ╔═║ 00000000-0000-0000-0000-000000000001 +PLUTO_PROJECT_TOML_CONTENTS = """ +[deps] +""" + +# ╔═║ 00000000-0000-0000-0000-000000000002 +PLUTO_MANIFEST_TOML_CONTENTS = """ +# This file is machine-generated - editing it directly is not advised + +julia_version = "1.8.0-rc4" +manifest_format = "2.0" +project_hash = "da39a3ee5e6b4b0d3255bfef95601890afd80709" + +[deps] +""" + +# ╔═║ Cell order: +# ╠═095fe061-b141-4329-a598-89987e69ddb9 +# ╠═41f2ea0a-34ea-11ed-0bad-b90a0169251a +# ╠═2837c741-ca74-436e-9065-6b86f4e3fd9b +# ╠═bfbe6a47-61d9-436c-8c42-323ff7966c3b +# ╠═3a501d1b-4a19-40c4-925d-0e20bd892904 +# ╠═8054ab1a-e6ef-41db-951d-faa101364986 +# ╠═b25fe8e8-dff6-4c38-9e23-e3b7ff00f42b +# ╠═3267a067-0613-42fc-9304-d4370c01fff9 +# ╠═dde18f54-b212-4792-bf08-83b6c82b1ed6 +# β•Ÿβ”€00000000-0000-0000-0000-000000000001 +# β•Ÿβ”€00000000-0000-0000-0000-000000000002 diff --git a/notebooks_old/3_symmetric_eigenvalue_derivatives.jl b/notebooks_old/3_symmetric_eigenvalue_derivatives.jl new file mode 100644 index 0000000..aa25e55 --- /dev/null +++ b/notebooks_old/3_symmetric_eigenvalue_derivatives.jl @@ -0,0 +1,489 @@ +### A Pluto.jl notebook ### +# v0.19.11 + +using Markdown +using InteractiveUtils + +# ╔═║ 7f7e5188-7c86-11ec-34ca-3347d6c19595 +using LinearAlgebra, PlutoUI + +# ╔═║ c6386d30-fc92-4d12-922c-3fe14d59ad68 +TableOfContents(title="Symmetric Eigenvalue Derivatives", indent=true, depth=4, aside=true) + +# ╔═║ fd24a55b-d4d4-4bfe-a485-552c69c2c7f7 +md""" +## Warmup:Differentiating on the unit sphere in n dimensions + +Geometrically, we all know that velocity vectors (equivalently tangents) on the sphere are orthogonal to radii. Our differentials say this algebraically: + +""" + +# ╔═║ 71ca8eac-0864-4beb-9f1a-b12ef4e6cf7b +begin + x = randn(5) + dx= .000001 * randn(5) + + q = normalize(x) # make x a unit vector x/norm(x) + dq = normalize(x+dx)-q # make (x+dx) a unit vector and subtract from q + + q'dq +end + +# ╔═║ 63df3a83-cd11-4d48-a24a-28d97deea00f +md""" +Since ``x^Tx=1``, we have that $(br) +``2x^Tdx=d(1)=0``, which says that at the point ``x`` on the sphere (a radius, if you will), ``dx``, +the linearization of the constraint of moving along the sphere satisfies ``dx \perp x`` +(dot product is 0). + +This is our first example where we have seen the infinitesimal perturbation ``dx`` being constrained. +""" + +# ╔═║ 38f7d4de-1072-4127-bbce-4e80da9273a8 +md""" +## Special case: a circle +Let us consider simply the circle in the plane. + +``x = (\cos \theta, \sin \theta)`` $(br) +``x^T dx = (\cos \theta, \sin \theta) \cdot (-\sin \theta, \cos \theta) d\theta= 0`` + +We can think of ``x`` as "extrinsic" coordinates, in that it is a vector in ``R^2.`` +On the other hand ``\theta`` is an "intrinsic" coordinate, every point on the circle is specified by one ``\theta``. +""" + +# ╔═║ 44471684-8f86-43b3-8d79-660a48912dc0 + + +# ╔═║ 5c83619a-3983-4c0a-ac2a-3f88fa6366c5 +md""" +Suppose ``A`` is symmetric. We then know that if we allow general ``dx`` then +$(br) ``d(\frac{1}{2}x^TAx)= (Ax)^Tdx `` and we would conclude ``Ax`` is the gradient. +$(br) Now we wish to restrict to the sphere. $(br) + +### On the sphere + +You may remember that ``I-xx^T`` is a *Projection Matrix* ( meaning that its equal to its square and it is symmetric). Geometrically the matrix removes components in the ``x`` direction. $(br) In particular if ``x^Tdx=0``, ``(I-xx^T)dx=dx``. + +It follows that if ``x^Tdx=0`` then ``x^TA(dx) = x^TA(I-xx^T)dx = ((I-xx^T)Ax)^T dx`` +so that $(I-xx^T)Ax$ is the gradient of ``\frac{1}{2}x^TAx`` on the sphere. + +### What did we just do? + +To get the gradient we needed two things: +* A linearization of the function that is correct on tangents and +* A direction that is tangent (satisfies the linearized constraint) + +### Gradient of a general scalar function on the sphere: + +``df= g(x)^T dx = ((I-xx^T)g(x))^Tdx`` + +Project the unconstrained gradient to the sphere to get the constrained gradient. It is the direction of maximal increase on the sphere. + + +""" + +# ╔═║ ac64ea62-e6f5-4b0b-8a21-4a0d84c9ed7b +md""" +# Differentiating nxn orthogonal matrices (the orthogonal group) +""" + +# ╔═║ 6f687dd6-78fb-4e5f-9bf8-e41f4a7665f4 +begin + A = randn(5,5) + dA = .00001 * randn(5,5) + Q = qr(A).Q + dQ = qr(A+dA).Q - Q + (Q'dQ)/.00001 +end + +# ╔═║ c9ccb3f3-70c6-4f99-92f4-a8529705b237 +md""" +Do you see the structure? + +Q^TdQ is anti-symmetric (sometimes called skew-symmetric). + +(If ``M=-M^T``, we say that ``M`` is anti-symmetric. Note all anti-symmetric +have 0 diagonally) + +Proof: The constraint of being orthogonal is ``Q^TQ=I`` +so differentiating, ``Q^TdQ + dQ^TQ=0`` which is the same as +saying `` (Q^TdQ) + (Q^TdQ)^T = 0``, but this is the equation +for being antisymmetric. +""" + +# ╔═║ dd659a37-3235-4f56-921a-b348e233ce73 +md""" +## What is the dimension of the "surface" of orthogonal matrices in the ``n^2`` dimensional , n by n matrix space? + +For example when n=2 we have rotations (and reflections). Rotations have the form +$(br) +``Q = \begin{pmatrix} \cos \theta & \sin \theta \\ -\sin \theta & \cos \theta \end{pmatrix} `` + +When n=2 we have one parameter. + +When n=3, airplane pilots know about "roll, pitch, and yaw" and these are three parameters. + +For general ``n`` the answer is ``n(n-1)/2.`` + +A few ways to see that: + +* n^2 free parameters, orthogonality ``Q^TQ=I`` imposes n(n+1)/2 constraints leaving +``n(n-1)/2`` free parameters. + +* When we do QR, the R "eats" up n(n+1)/2 parameters leaving n(n-1)/2 for Q. + +* Think about the symmetric eigenvalue problem: S = QΞ›Qα΅€. +S has n(n+1)/2 and Ξ› has n, leaving n(n-1)/2 for Q. + +* Think about the singular value decomposition. A = UΞ£Vα΅€ +A has n^2, and Ξ£ has n, leaving n(n-1) to be split evenly for the +orthogonal matrices U and V. + +""" + +# ╔═║ acaccf1f-cc17-47d8-ad6d-49108f067e17 +md""" +## Differentiating the Symmetric Eigendecomposition +""" + +# ╔═║ 1023e972-bd69-45ae-974a-1a093a57ece4 +md""" +`` S = Q \Lambda Q^T`` is the eigendecomposition of a symmetric ``S`` with ``\Lambda`` diagonal containing eigenvalues, and ``Q`` orthogonal with columns as eigenvectors. +$(br) + +``dS = dQ \Lambda Q^T + Q d\Lambda Q^T + Q Ξ› dQ^T`` which may be written +``Q^T dS Q = Q^T dQ \Lambda - \Lambda Q^T dQ + d\Lambda`` + +$(br) + +Exercise: Check that the left and right side of the above are both symmetric. +""" + +# ╔═║ 7f566eab-a296-4666-8b5b-e94cf2debf68 +let + A = randn(5,5) + dA = .00001 * randn(5,5) + S = A+A' # symmetrize A + dS = dA + dA' # symmetrize dA + Ξ›,Q = eigen(Symmetric(S)) + Λ₁,Q₁ = eigen(Symmetric(S+dS)) + dQ = Q₁-Q + dΞ› = Λ₁-Ξ› + + + [Q'*dS*Q ; diagm(dΞ›) + Q'dQ*diagm(Ξ›)-diagm(Ξ›)*Q'dQ] + + + + +end + +# ╔═║ 049e54a1-ee97-4fda-a9c6-2865ffe938a2 +md""" + Maybe easier if one looks at the diagonal entries on their own: $(br) + +``(Q^T dS Q)_{ii} = q_i^T dS q_i,`` where ``q_i`` is the ith eigenvector. $(br) +Hence ``q_i^T dS q_i = d\lambda_i.`` + +Sometimes we think of a curve of matrices ``S(t)`` depending on a parameter such as time. If we ask for ``\frac{d\lambda_i}{dt}`` we have that it equals ``q_i^T \frac{dS(t)}{dt} q_i``. + +How do we get the gradient ``\nabla \lambda_i`` of one eigenvalue ``\lambda_i``? + +trace(``(q_i q_i^T)^T dS``) ``= d\lambda_i``, thus we instantly see +that ``\nabla \lambda_i = q_i q_i^T`` +""" + +# ╔═║ 769d7ff6-bae1-423e-890b-69e0a0a9a79b +md""" +What about the eigenvectors? Those come from the off-diagonal elements: +$(br) +``(Q^T dS Q)_{ij} = (Q^T \frac{dQ}{dt})_{ij}(\lambda_j-\lambda_i),`` if ``(i\ne j)``, +so we can form the elements of `` Q^T \frac{dQ}{dt}`` (remember the diagonal is 0), +and left multiply by ``Q`` to obtain ``\frac{dQ}{dt}.`` +""" + +# ╔═║ c9c7011a-8eca-4169-b890-97d6bb4a8244 +md""" +It is interesting to get the second derivative of eigenvalues when moving along a line in symmetric matrix space. For simplicity we'll start at a diagonal matrix ``\Lambda``. + +Let ``S(t)= \Lambda + t E``. + +Differentiating ``\frac{d\Lambda}{dt} = diag( Q^T \frac{dS}{dt} Q)`` we get +``\frac{d^2\Lambda}{dt^2} = diag( Q^T \frac{d^2S}{dt^2} Q) + 2 diag(Q^T \frac{dS}{dt} \frac{dQ}{dt}).`` +""" + +# ╔═║ c3ae2756-5a33-4ec1-8323-262d65f018c6 +md""" +Evaluating at ``Q=I`` and recognizing that the first term is $0$ since we are on a line, we have $(br) + +``\frac{d^2\Lambda}{dt^2} = 2 diag( E \frac{dQ}{dt} )`` + +or + +``\frac{d^2\lambda_i}{dt^2} = 2 \sum_{k \ne i} E_{ik}^2/(\lambda_i-\lambda_k).`` +""" + +# ╔═║ 81be4b3e-b7b8-4814-8239-11f949561868 +md""" +We can write this as a Taylor series. + +``\lambda_i(\epsilon) = \lambda_i + \epsilon E_{ii} + \epsilon^2 \sum_{k \ne i} E_{ik}^2/(\lambda_i-\lambda_k) + \ldots `` +""" + +# ╔═║ 00000000-0000-0000-0000-000000000001 +PLUTO_PROJECT_TOML_CONTENTS = """ +[deps] +LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" +PlutoUI = "7f904dfe-b85e-4ff6-b463-dae2292396a8" + +[compat] +PlutoUI = "~0.7.30" +""" + +# ╔═║ 00000000-0000-0000-0000-000000000002 +PLUTO_MANIFEST_TOML_CONTENTS = """ +# This file is machine-generated - editing it directly is not advised + +[[AbstractPlutoDingetjes]] +deps = ["Pkg"] +git-tree-sha1 = "8eaf9f1b4921132a4cff3f36a1d9ba923b14a481" +uuid = "6e696c72-6542-2067-7265-42206c756150" +version = "1.1.4" + +[[ArgTools]] +uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" +version = "1.1.1" + +[[Artifacts]] +uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" + +[[Base64]] +uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" + +[[ColorTypes]] +deps = ["FixedPointNumbers", "Random"] +git-tree-sha1 = "024fe24d83e4a5bf5fc80501a314ce0d1aa35597" +uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f" +version = "0.11.0" + +[[CompilerSupportLibraries_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" +version = "0.5.2+0" + +[[Dates]] +deps = ["Printf"] +uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" + +[[Downloads]] +deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] +uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" +version = "1.6.0" + +[[FileWatching]] +uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" + +[[FixedPointNumbers]] +deps = ["Statistics"] +git-tree-sha1 = "335bfdceacc84c5cdf16aadc768aa5ddfc5383cc" +uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" +version = "0.8.4" + +[[Hyperscript]] +deps = ["Test"] +git-tree-sha1 = "8d511d5b81240fc8e6802386302675bdf47737b9" +uuid = "47d2ed2b-36de-50cf-bf87-49c2cf4b8b91" +version = "0.0.4" + +[[HypertextLiteral]] +git-tree-sha1 = "2b078b5a615c6c0396c77810d92ee8c6f470d238" +uuid = "ac1192a8-f4b3-4bfe-ba22-af5b92cd3ab2" +version = "0.9.3" + +[[IOCapture]] +deps = ["Logging", "Random"] +git-tree-sha1 = "f7be53659ab06ddc986428d3a9dcc95f6fa6705a" +uuid = "b5f81e59-6552-4d32-b1f0-c071b021bf89" +version = "0.2.2" + +[[InteractiveUtils]] +deps = ["Markdown"] +uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" + +[[JSON]] +deps = ["Dates", "Mmap", "Parsers", "Unicode"] +git-tree-sha1 = "8076680b162ada2a031f707ac7b4953e30667a37" +uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" +version = "0.21.2" + +[[LibCURL]] +deps = ["LibCURL_jll", "MozillaCACerts_jll"] +uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" +version = "0.6.3" + +[[LibCURL_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] +uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" +version = "7.84.0+0" + +[[LibGit2]] +deps = ["Base64", "NetworkOptions", "Printf", "SHA"] +uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" + +[[LibSSH2_jll]] +deps = ["Artifacts", "Libdl", "MbedTLS_jll"] +uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" +version = "1.10.2+0" + +[[Libdl]] +uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" + +[[LinearAlgebra]] +deps = ["Libdl", "libblastrampoline_jll"] +uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + +[[Logging]] +uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" + +[[Markdown]] +deps = ["Base64"] +uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" + +[[MbedTLS_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" +version = "2.28.0+0" + +[[Mmap]] +uuid = "a63ad114-7e13-5084-954f-fe012c677804" + +[[MozillaCACerts_jll]] +uuid = "14a3606d-f60d-562e-9121-12d972cd8159" +version = "2022.2.1" + +[[NetworkOptions]] +uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" +version = "1.2.0" + +[[OpenBLAS_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] +uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" +version = "0.3.20+0" + +[[Parsers]] +deps = ["Dates"] +git-tree-sha1 = "92f91ba9e5941fc781fecf5494ac1da87bdac775" +uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" +version = "2.2.0" + +[[Pkg]] +deps = ["Artifacts", "Dates", "Downloads", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] +uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" +version = "1.8.0" + +[[PlutoUI]] +deps = ["AbstractPlutoDingetjes", "Base64", "ColorTypes", "Dates", "Hyperscript", "HypertextLiteral", "IOCapture", "InteractiveUtils", "JSON", "Logging", "Markdown", "Random", "Reexport", "UUIDs"] +git-tree-sha1 = "5c0eb9099596090bb3215260ceca687b888a1575" +uuid = "7f904dfe-b85e-4ff6-b463-dae2292396a8" +version = "0.7.30" + +[[Printf]] +deps = ["Unicode"] +uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" + +[[REPL]] +deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] +uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" + +[[Random]] +deps = ["SHA", "Serialization"] +uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" + +[[Reexport]] +git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" +uuid = "189a3867-3050-52da-a836-e630ba90ab69" +version = "1.2.2" + +[[SHA]] +uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" +version = "0.7.0" + +[[Serialization]] +uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" + +[[Sockets]] +uuid = "6462fe0b-24de-5631-8697-dd941f90decc" + +[[SparseArrays]] +deps = ["LinearAlgebra", "Random"] +uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + +[[Statistics]] +deps = ["LinearAlgebra", "SparseArrays"] +uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" + +[[TOML]] +deps = ["Dates"] +uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" +version = "1.0.0" + +[[Tar]] +deps = ["ArgTools", "SHA"] +uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" +version = "1.10.0" + +[[Test]] +deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] +uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[[UUIDs]] +deps = ["Random", "SHA"] +uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" + +[[Unicode]] +uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" + +[[Zlib_jll]] +deps = ["Libdl"] +uuid = "83775a58-1f1d-513f-b197-d71354ab007a" +version = "1.2.12+3" + +[[libblastrampoline_jll]] +deps = ["Artifacts", "Libdl", "OpenBLAS_jll"] +uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" +version = "5.1.1+0" + +[[nghttp2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" +version = "1.48.0+0" + +[[p7zip_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" +version = "17.4.0+0" +""" + +# ╔═║ Cell order: +# ╠═7f7e5188-7c86-11ec-34ca-3347d6c19595 +# ╠═c6386d30-fc92-4d12-922c-3fe14d59ad68 +# β•Ÿβ”€fd24a55b-d4d4-4bfe-a485-552c69c2c7f7 +# ╠═71ca8eac-0864-4beb-9f1a-b12ef4e6cf7b +# β•Ÿβ”€63df3a83-cd11-4d48-a24a-28d97deea00f +# β•Ÿβ”€38f7d4de-1072-4127-bbce-4e80da9273a8 +# ╠═44471684-8f86-43b3-8d79-660a48912dc0 +# β•Ÿβ”€5c83619a-3983-4c0a-ac2a-3f88fa6366c5 +# β•Ÿβ”€ac64ea62-e6f5-4b0b-8a21-4a0d84c9ed7b +# ╠═6f687dd6-78fb-4e5f-9bf8-e41f4a7665f4 +# β•Ÿβ”€c9ccb3f3-70c6-4f99-92f4-a8529705b237 +# β•Ÿβ”€dd659a37-3235-4f56-921a-b348e233ce73 +# β•Ÿβ”€acaccf1f-cc17-47d8-ad6d-49108f067e17 +# β•Ÿβ”€1023e972-bd69-45ae-974a-1a093a57ece4 +# ╠═7f566eab-a296-4666-8b5b-e94cf2debf68 +# β•Ÿβ”€049e54a1-ee97-4fda-a9c6-2865ffe938a2 +# β•Ÿβ”€769d7ff6-bae1-423e-890b-69e0a0a9a79b +# β•Ÿβ”€c9c7011a-8eca-4169-b890-97d6bb4a8244 +# β•Ÿβ”€c3ae2756-5a33-4ec1-8323-262d65f018c6 +# β•Ÿβ”€81be4b3e-b7b8-4814-8239-11f949561868 +# β•Ÿβ”€00000000-0000-0000-0000-000000000001 +# β•Ÿβ”€00000000-0000-0000-0000-000000000002 diff --git a/notebooks_old/4_computational_geometry.jl b/notebooks_old/4_computational_geometry.jl new file mode 100644 index 0000000..7907413 --- /dev/null +++ b/notebooks_old/4_computational_geometry.jl @@ -0,0 +1,1242 @@ +### A Pluto.jl notebook ### +# v0.19.12 + +using Markdown +using InteractiveUtils + +# ╔═║ c6d69c19-92a6-466c-81a2-6a2c78d255ad +using Plots, LinearAlgebra, Triangulate + +# ╔═║ 2030f9ac-3e09-11ed-35be-eb75d09dea91 +md""" +# Computational Geometry + +Computational geometry is divided into two main branches: + +1. *Combinatorial computational geometry*, which considers problems stated in terms of basic geometrical objects: points, line segments, polygons, polyhedra, etc. Examples of problems in this field include: + * *Line segment intersection*: Find the intersections between a given set of line segments. + * *Convex hull*: Given a set of points, find the smallest convex polyhedron/polygon containing all the points. + * *Polygon triangulation*: Given a polygon, partition its interior into triangles + * *Point in polygon*: Decide whether a point is inside or outside a given polygon. + * *Mesh generation*: Generate a polygonal mesh that approximates a geometric domain +2. *Numerical computational geometry*, closely related to *Computer-aided design (CAD)*, considers problems involving curves and surfaces, represented e.g. in BΓ©zier or spline form. These are extensively used in various engineering disciplines, and important problems include the efficient representation of general shapes, and operations such as intersection of surfaces and other objects. +""" + +# ╔═║ 878d69c6-7b10-48ca-b726-50224ad2086d +md""" +# Convex Hull +""" + +# ╔═║ e6284251-8f38-4fd5-bb21-13ee20776c07 +md""" +## Point representation + +The first geometric entity to consider is a point. Here we will consider planar problems, so a point can be represented by its $(x,y)$ coordinates, as two `Float64` numbers in Julia. Here we will simply use a vector with 2 elements. + +To store a *collection of points*, we could store the $(x,y)$ coordinates as the columns or the rows of a 2D array. However, we will instead use an *array of arrays*, that is, a 1D array of all the points as 1D arrays $(x,y)$. This simplifies some of the algorithms. +""" + +# ╔═║ 666bfda8-283b-4756-aedb-4066c2074646 +ten_nodes = [ randn(2) for i = 1:10 ] # 10 random points - note array-of-array + +# ╔═║ 9a0eb5bc-9b26-45ad-99b6-8689f4345543 +# Plot the points as dots +# The functions first and last simply collects the corresponding x,y indices +scatter(first.(ten_nodes), last.(ten_nodes), + aspect_ratio=:equal) + +# ╔═║ 574c5144-a65b-45aa-b587-5e81a7ffc2d9 +md""" +## Convex hull + +The *convex hull* of a set $X$ of points is the smallest convex set that contains $X$. In the plane, this is a polygon through a subset of the points. Many algorithms have been proposed for computing the convex hull, and here we will focus on the *Jarvis march* algorithm, also called the *gift wrapping algorithm*. + +The method is illustrated below. The main steps are as follows: + +1. Find the leftmost point $p_0$ (smallest $x$-coordinate) +2. Find the next point $p_1$ such that all other points are to the right of the line $p_0p_1$ +3. Repeat until $p_n=p_0$ + +![Jarvis_march_convex_hull](https://upload.wikimedia.org/wikipedia/commons/thumb/d/de/Jarvis_march_convex_hull_algorithm_diagram.svg/800px-Jarvis_march_convex_hull_algorithm_diagram.svg.png) +(from ) +""" + +# ╔═║ df10c580-30b2-4a23-8bd6-75e658da2b9e +md""" +The main utility function needed in the algorithm is to decide if a point $p_2$ is to the right of the line $p_1p_3$. We do this by computing the $z$-coordinate of the cross product of the vectors $p_2-p_1$ and $p_3-p_1$, which is $>0$ if the line $p_1p_2$ is clockwise oriented to the line $p_1p_3$. *Note*: If the lines are parallel this cross product is zero, which is a special case that we for simplicity do not handle here. +""" + +# ╔═║ 3f15bc42-4bc1-4502-a11d-a40d9f81e0b9 +function clockwise_oriented(p1, p2, p3) + # Return true if the line-segment between points p1,p2 is clockwise + # oriented to the line-segment between points p1,p3 + cross = (p3[2] - p1[2]) * (p2[1] - p1[1]) - (p3[1] - p1[1]) * (p2[2] - p1[2]) + return cross > 0 +end + +# ╔═║ a90cc361-046a-4e0f-bfd5-64827df550a9 +clockwise_oriented([0,0], [1,1], [2,3]) # Should be true + +# ╔═║ 0e6004e8-66c4-4d65-8c07-f34d0d442281 +clockwise_oriented([0,0], [1,1], [3,2]) # Should be false + +# ╔═║ 4178854c-6d10-4424-9e10-d036afc2ea43 +md""" +The method can now be implemented as follows. Note the two loops: + +1. The outer loop considers each point $p_0,p_1,\ldots$ on the convex hull. This is a `while` loop, since we do not know beforehand how many points it will include. +2. The inner loop finds the next point such that all other points are to the right of the corresponding line segment. This is done by computing orientations to all other points. + +From this, it is clear that the computational complexity of the algorithm is $\mathcal{O}(nh)$, where $n$ is the number of points and $h$ is the number of points on the convex hull. +""" + +# ╔═║ fe0930f5-04e5-40da-9ab5-fafed633ce1a +function convex_hull(p) + # Find the nodes on the convex hull of the point array p using + # the Jarvis march (gift wrapping) algorithm + + _, pointOnHull = findmin(first.(p)) # Start at left-most point + hull = [pointOnHull] # Output: Vector of node indices on the convex hull + + while length(hull) ≀ 1 || hull[1] != hull[end] # Loop until closed polygon + # First candidate, any point except current + nextPoint = hull[end] % length(p) + 1 + for j = 1:length(p) # Consider all other points + # If "more to the left", switch + if clockwise_oriented(p[hull[end]], p[nextPoint], p[j]) + nextPoint = j + end + end + push!(hull, nextPoint) # Update current point + end + return hull +end + +# ╔═║ e01530c0-fb3e-490c-8470-1045f4093e1b +begin + # Example: 100 random points, compute and draw the convex hull + local nodes = [ randn(2) for i = 1:100 ] + hull = convex_hull(nodes) + scatter(first.(nodes), last.(nodes), + aspect_ratio=:equal) + plot!(first.(nodes[hull]), last.(nodes[hull])) +end + +# ╔═║ 0008135f-350f-4cd3-9865-6f23c1880ac0 +md""" +# Line-segment Intersections + +A *line-segment* can be described by its two endpoints, $p_1$ and $p_2$, and denoted by $p_1p_2$. Note that the set of points on this segments can be expressed as $p_1 + s(p_2-p_1)$ for a parameter value $s\in[0,1]$. + +To determine if $p_1p_2$ intersects another line-segment $q_1q_2$, we express the points on both segments in this way (with different parameters $s,t$), and set the points equal. This leads to the problem: Find $s,t\in[0,1]$ s.t. + +$$\begin{aligned} +p_1 + s(p_2 - p_1) = q_1 + t(q_2 - q_1) +\end{aligned}$$ + + +which can be reorganized as a 2-by-2 linear system of equations for $s,t$: + +$$\begin{pmatrix} +p_2 - p_1 & q_1 - q_2 +\end{pmatrix} +\begin{pmatrix} +s \\ t +\end{pmatrix} = +\begin{pmatrix} +q_1 - p_1 +\end{pmatrix}$$ + +If the line-segments are parallel, the matrix is singular. For simplicity we simply say that they do not intersect in this case, but a better implementation would determine if they actually overlap. +""" + +# ╔═║ 20b0af3a-9447-4b3c-82fa-26b69c995d0f +md""" +We implement the method in the function below, where we have also included a tolerance $\delta$. This is useful to handle the case when the intersection is close to one of the endpoints, then $\delta>0$ would allow for a small positive overlap and $\delta<0$ a small negative overlap. +""" + +# ╔═║ 6ffbfc8c-fe6f-49e9-b1a2-aace751c5c62 +function linesegment_intersect(p1, p2, q1, q2, Ξ΄) + A = [p2-p1 q1-q2] + b = q1-p1 + if rank(A) == 2 + st = A \ b + if all(-Ξ΄ .≀ st .≀ 1 + Ξ΄) + pintersect = p1 + st[1] * (p2 - p1) + return true, pintersect + else + return false, nothing + end + else + # Warning: parallel lines, should check if they actually overlap + return false, nothing + end +end + +# ╔═║ bc45e8a9-81dd-4983-aac9-6aed2ba3db23 +begin + # Example: n random lines, find and plot all intersections + n = 10 + lines = [ [rand(2), rand(2)] for i = 1:n ] + + # Plot all lines + h = plot(aspect_ratio=:equal, legend=:none) + for line in lines + plot!([line[1][1], line[2][1]], [line[1][2], line[2][2]], + apsect_ratio=:equal) + end + + # Find all intersections - note that we only consider j>i to avoid checking + # the same 2 line-segments twice + for i = 1:n + for j = i+1:n + isect, pq = linesegment_intersect(lines[i][1], lines[i][2], + lines[j][1], lines[j][2], 0) + if isect + scatter!([pq[1]], [pq[2]]) + end + end + end + h +end + +# ╔═║ 99a20616-d186-4723-b38a-a695e584bf7b +md""" +# Triangulations + +A triangulation of a polygon is a subdivision into triangles. This has numerous applications, for example in computer graphics, visualization, numerical solution of PDEs, and interpolation. + +First let us define a function to plot a triangulation. The function below is based on Plots, and it takes an array of points `nodes` and an array of triangle indices `triangles`. +""" + +# ╔═║ fa5738a1-2a62-4d0b-b67d-71e13b3b72cf +function tplot(nodes,triangles) + allpv = Vector{Float64}[] + for tri in triangles + pv = nodes[tri] + append!(allpv, pv, [pv[1],[NaN,NaN]]) + end + h = plot(first.(allpv), last.(allpv), + seriestype=:shape, aspect_ratio=:equal, + leg=false, fillcolor=RGB(0.8,1,0.8)) +end + +# ╔═║ 24c4f210-9eca-4315-b85c-0e7645184500 +md""" +We can test the function using a simple set of points and a triangulation: +""" + +# ╔═║ 5c0efb32-e365-49eb-aee5-e18491304d00 +begin + nodes = [[0,0], [1,0], [0,1], [1,2], [2,1]] + triangles = [[1,2,5], [1,5,3], [3,5,4]] + tplot(nodes,triangles) +end + +# ╔═║ c1738f8a-a544-49ee-85d1-51f8bd3263a2 +md""" +#### Delaunay triangulation + +A *Delaunay triangulation* for a given set of discrete points in a plane is a triangulation such that no point is inside the circumcircle of any triangle. It can be shown that Delaunay triangulations maximize the minimum angle of all the angles of the triangles in the triangulation, which makes them very useful e.g. in finite element methods for numerical solution of PDEs. + +Many algorithms have been developed for computing a Delaunay triangulation from a set of points, and here we will simply use an existing implementation from the Matplotlib python library: +""" + +# ╔═║ 6601528a-e058-4ba3-b9d9-6c4d7f24caa1 +function delaunay(nodes) + triin = Triangulate.TriangulateIO() + triin.pointlist = hcat(nodes...) + (triout, vorout)=triangulate("Q", triin) + triangles = [tri for tri in eachcol(triout.trianglelist)] +end + +# ╔═║ 36530462-fc87-49a3-a4b2-c777f1cf41df +md""" +First, let us compute and plot the Deluanay triangulation of the same points as before: +""" + +# ╔═║ 0aafbbda-99b0-4341-a4b8-f1509fbfb708 +triangles_delaunay = delaunay(nodes) + +# ╔═║ aa2966bc-f663-4f20-b325-9052d8e6513e +tplot(nodes, triangles_delaunay) + +# ╔═║ c500b176-c2d5-4c10-826a-4312a5aaf81c +md""" +Note that this triangulation is different than our previous one - it satisfies the properties mentioned above. +""" + +# ╔═║ 1397dff9-c109-43f9-a71d-8547e5ec526e +md""" +Next let us compute and plot the delaunay triangulation of a random set of points: +""" + +# ╔═║ 33e23c8e-8320-4833-a0d1-6bfc6c8d2ac5 +begin + local nodes = [ randn(2) for i = 1:50 ] + local triangles = delaunay(nodes) + tplot(nodes, triangles) +end + +# ╔═║ 00000000-0000-0000-0000-000000000001 +PLUTO_PROJECT_TOML_CONTENTS = """ +[deps] +LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" +Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" +Triangulate = "f7e6ffb2-c36d-4f8f-a77e-16e897189344" + +[compat] +Plots = "~1.34.0" +Triangulate = "~2.1.3" +""" + +# ╔═║ 00000000-0000-0000-0000-000000000002 +PLUTO_MANIFEST_TOML_CONTENTS = """ +# This file is machine-generated - editing it directly is not advised + +julia_version = "1.7.3" +manifest_format = "2.0" + +[[deps.ArgTools]] +uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" + +[[deps.Artifacts]] +uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" + +[[deps.Base64]] +uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" + +[[deps.BitFlags]] +git-tree-sha1 = "84259bb6172806304b9101094a7cc4bc6f56dbc6" +uuid = "d1d4a3ce-64b1-5f1a-9ba4-7e7e69966f35" +version = "0.1.5" + +[[deps.Bzip2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "19a35467a82e236ff51bc17a3a44b69ef35185a2" +uuid = "6e34b625-4abd-537c-b88f-471c36dfa7a0" +version = "1.0.8+0" + +[[deps.Cairo_jll]] +deps = ["Artifacts", "Bzip2_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.ChainRulesCore]] +deps = ["Compat", "LinearAlgebra", "SparseArrays"] +git-tree-sha1 = "e7ff6cadf743c098e08fca25c91103ee4303c9bb" +uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" +version = "1.15.6" + +[[deps.ChangesOfVariables]] +deps = ["ChainRulesCore", "LinearAlgebra", "Test"] +git-tree-sha1 = "38f7a08f19d8810338d4f5085211c7dfa5d5bdd8" +uuid = "9e997f8a-9a97-42d5-a9f1-ce6bfc15e2c0" +version = "0.1.4" + +[[deps.CodecZlib]] +deps = ["TranscodingStreams", "Zlib_jll"] +git-tree-sha1 = "ded953804d019afa9a3f98981d99b33e3db7b6da" +uuid = "944b1d66-785c-5afd-91f1-9de20f533193" +version = "0.7.0" + +[[deps.ColorSchemes]] +deps = ["ColorTypes", "ColorVectorSpace", "Colors", "FixedPointNumbers", "Random"] +git-tree-sha1 = "1fd869cc3875b57347f7027521f561cf46d1fcd8" +uuid = "35d6a980-a343-548e-a6ea-1d62b119f2f4" +version = "3.19.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", "SpecialFunctions", "Statistics", "TensorCore"] +git-tree-sha1 = "d08c20eef1f2cbc6e60fd3612ac4340b89fea322" +uuid = "c3611d14-8923-5661-9e6a-0046d554d3a4" +version = "0.9.9" + +[[deps.Colors]] +deps = ["ColorTypes", "FixedPointNumbers", "Reexport"] +git-tree-sha1 = "417b0ed7b8b838aa6ca0a87aadf1bb9eb111ce40" +uuid = "5ae59095-9a9b-59fe-a467-6f913c188581" +version = "0.12.8" + +[[deps.Compat]] +deps = ["Dates", "LinearAlgebra", "UUIDs"] +git-tree-sha1 = "5856d3031cdb1f3b2b6340dfdc66b6d9a149a374" +uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" +version = "4.2.0" + +[[deps.CompilerSupportLibraries_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" + +[[deps.Contour]] +git-tree-sha1 = "d05d9e7b7aedff4e5b51a029dced05cfb6125781" +uuid = "d38c429a-6771-53c6-b99e-75d170b6e991" +version = "0.6.2" + +[[deps.DataAPI]] +git-tree-sha1 = "1106fa7e1256b402a86a8e7b15c00c85036fef49" +uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a" +version = "1.11.0" + +[[deps.DataStructures]] +deps = ["Compat", "InteractiveUtils", "OrderedCollections"] +git-tree-sha1 = "d1fff3a548102f48987a52a2e0d114fa97d730f0" +uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" +version = "0.18.13" + +[[deps.Dates]] +deps = ["Printf"] +uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" + +[[deps.DelimitedFiles]] +deps = ["Mmap"] +uuid = "8bb1440f-4735-579b-a4ab-409b98df4dab" + +[[deps.DocStringExtensions]] +deps = ["LibGit2"] +git-tree-sha1 = "b19534d1895d702889b219c382a6e18010797f0b" +uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" +version = "0.8.6" + +[[deps.Downloads]] +deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] +uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" + +[[deps.Expat_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "bad72f730e9e91c08d9427d5e8db95478a3c323d" +uuid = "2e619515-83b5-522b-bb60-26c02a35a201" +version = "2.4.8+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", "Pkg", "Zlib_jll", "libaom_jll", "libass_jll", "libfdk_aac_jll", "libvorbis_jll", "x264_jll", "x265_jll"] +git-tree-sha1 = "ccd479984c7838684b3ac204b716c89955c76623" +uuid = "b22a6f82-2f65-5046-a5b2-351ab43fb4e5" +version = "4.4.2+0" + +[[deps.FileWatching]] +uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" + +[[deps.FixedPointNumbers]] +deps = ["Statistics"] +git-tree-sha1 = "335bfdceacc84c5cdf16aadc768aa5ddfc5383cc" +uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" +version = "0.8.4" + +[[deps.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.FreeType2_jll]] +deps = ["Artifacts", "Bzip2_jll", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] +git-tree-sha1 = "87eb71354d8ec1a96d4a7636bd57a7347dde3ef9" +uuid = "d7e528f0-a631-5988-bf34-fe36492bcfd7" +version = "2.10.4+0" + +[[deps.FriBidi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "aa31987c2ba8704e23c6c8ba8a4f769d5d7e4f91" +uuid = "559328eb-81f9-559d-9380-de523a88c83c" +version = "1.0.10+0" + +[[deps.GLFW_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libglvnd_jll", "Pkg", "Xorg_libXcursor_jll", "Xorg_libXi_jll", "Xorg_libXinerama_jll", "Xorg_libXrandr_jll"] +git-tree-sha1 = "d972031d28c8c8d9d7b41a536ad7bb0c2579caca" +uuid = "0656b61e-2033-5cc2-a64a-77c0f6c09b89" +version = "3.3.8+0" + +[[deps.GR]] +deps = ["Base64", "DelimitedFiles", "GR_jll", "HTTP", "JSON", "Libdl", "LinearAlgebra", "Pkg", "Printf", "Random", "RelocatableFolders", "Serialization", "Sockets", "Test", "UUIDs"] +git-tree-sha1 = "0ac6f27e784059c68b987f42b909ade0bcfabe69" +uuid = "28b8d3ca-fb5f-59d9-8090-bfdbd6d07a71" +version = "0.68.0" + +[[deps.GR_jll]] +deps = ["Artifacts", "Bzip2_jll", "Cairo_jll", "FFMPEG_jll", "Fontconfig_jll", "GLFW_jll", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Libtiff_jll", "Pixman_jll", "Pkg", "Qt5Base_jll", "Zlib_jll", "libpng_jll"] +git-tree-sha1 = "ad86229227847772bb985cc1dd3b842ff61317a7" +uuid = "d2c73de3-f751-5644-a686-071e5b155ba9" +version = "0.69.0+0" + +[[deps.Gettext_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Libiconv_jll", "Pkg", "XML2_jll"] +git-tree-sha1 = "9b02998aba7bf074d14de89f9d37ca24a1a0b046" +uuid = "78b55507-aeef-58d4-861c-77aaff3498b1" +version = "0.21.0+0" + +[[deps.Glib_jll]] +deps = ["Artifacts", "Gettext_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Libiconv_jll", "Libmount_jll", "PCRE_jll", "Pkg", "Zlib_jll"] +git-tree-sha1 = "a32d672ac2c967f3deb8a81d828afc739c838a06" +uuid = "7746bdde-850d-59dc-9ae8-88ece973131d" +version = "2.68.3+2" + +[[deps.Graphite2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "344bf40dcab1073aca04aa0df4fb092f920e4011" +uuid = "3b182d85-2403-5c21-9c21-1e1f0cc25472" +version = "1.3.14+0" + +[[deps.Grisu]] +git-tree-sha1 = "53bb909d1151e57e2484c3d1b53e19552b887fb2" +uuid = "42e2da0e-8278-4e71-bc24-59509adca0fe" +version = "1.0.2" + +[[deps.HTTP]] +deps = ["Base64", "CodecZlib", "Dates", "IniFile", "Logging", "LoggingExtras", "MbedTLS", "NetworkOptions", "OpenSSL", "Random", "SimpleBufferStream", "Sockets", "URIs", "UUIDs"] +git-tree-sha1 = "4abede886fcba15cd5fd041fef776b230d004cee" +uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3" +version = "1.4.0" + +[[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.IniFile]] +git-tree-sha1 = "f550e6e32074c939295eb5ea6de31849ac2c9625" +uuid = "83e8ac13-25f8-5344-8a64-a9f2b223428f" +version = "0.5.1" + +[[deps.InteractiveUtils]] +deps = ["Markdown"] +uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" + +[[deps.InverseFunctions]] +deps = ["Test"] +git-tree-sha1 = "b3364212fb5d870f724876ffcd34dd8ec6d98918" +uuid = "3587e190-3f89-42d0-90ee-14403ec27112" +version = "0.1.7" + +[[deps.IrrationalConstants]] +git-tree-sha1 = "7fd44fd4ff43fc60815f8e764c0f352b83c49151" +uuid = "92d709cd-6900-40b7-9082-c6be49f344b6" +version = "0.1.1" + +[[deps.JLFzf]] +deps = ["Pipe", "REPL", "Random", "fzf_jll"] +git-tree-sha1 = "f377670cda23b6b7c1c0b3893e37451c5c1a2185" +uuid = "1019f520-868f-41f5-a6de-eb00f4b6a39c" +version = "0.1.5" + +[[deps.JLLWrappers]] +deps = ["Preferences"] +git-tree-sha1 = "abc9885a7ca2052a736a600f7fa66209f96506e1" +uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" +version = "1.4.1" + +[[deps.JSON]] +deps = ["Dates", "Mmap", "Parsers", "Unicode"] +git-tree-sha1 = "3c837543ddb02250ef42f4738347454f95079d4e" +uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" +version = "0.21.3" + +[[deps.JpegTurbo_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "b53380851c6e6664204efb2e62cd24fa5c47e4ba" +uuid = "aacddb02-875f-59d6-b918-886e6ef4fbf8" +version = "2.1.2+0" + +[[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.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 = "f2355693d6778a178ade15952b7ac47a4ff97996" +uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" +version = "1.3.0" + +[[deps.Latexify]] +deps = ["Formatting", "InteractiveUtils", "LaTeXStrings", "MacroTools", "Markdown", "OrderedCollections", "Printf", "Requires"] +git-tree-sha1 = "ab9aa169d2160129beb241cb2750ca499b4e90e9" +uuid = "23fbe1c1-3f47-55db-b15f-69d7ec21a316" +version = "0.15.17" + +[[deps.LibCURL]] +deps = ["LibCURL_jll", "MozillaCACerts_jll"] +uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" + +[[deps.LibCURL_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] +uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" + +[[deps.LibGit2]] +deps = ["Base64", "NetworkOptions", "Printf", "SHA"] +uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" + +[[deps.LibSSH2_jll]] +deps = ["Artifacts", "Libdl", "MbedTLS_jll"] +uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" + +[[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 = "7739f837d6447403596a75d19ed01fd08d6f56bf" +uuid = "7e76a0d4-f3c7-5321-8279-8d96eeed0f29" +version = "1.3.0+3" + +[[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", "Pkg"] +git-tree-sha1 = "42b62845d70a619f063a7da093d995ec8e15e778" +uuid = "94ce4f54-9a6c-5748-9c1c-f9c7231a4531" +version = "1.16.1+1" + +[[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", "Pkg", "Zlib_jll", "Zstd_jll"] +git-tree-sha1 = "3eb79b0ca5764d4799c06699573fd8f533259713" +uuid = "89763e89-9b03-5906-acba-b20f662cd828" +version = "4.4.0+0" + +[[deps.Libuuid_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "7f3efec06033682db852f8b3bc3c1d2b0a0ab066" +uuid = "38a345b3-de98-5d2b-a5d3-14cd9215e700" +version = "2.36.0+0" + +[[deps.LinearAlgebra]] +deps = ["Libdl", "libblastrampoline_jll"] +uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + +[[deps.LogExpFunctions]] +deps = ["ChainRulesCore", "ChangesOfVariables", "DocStringExtensions", "InverseFunctions", "IrrationalConstants", "LinearAlgebra"] +git-tree-sha1 = "94d9c52ca447e23eac0c0f074effbcd38830deb5" +uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688" +version = "0.3.18" + +[[deps.Logging]] +uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" + +[[deps.LoggingExtras]] +deps = ["Dates", "Logging"] +git-tree-sha1 = "5d4d2d9904227b8bd66386c1138cf4d5ffa826bf" +uuid = "e6f89c97-d47a-5376-807f-9c37f3926c36" +version = "0.4.9" + +[[deps.MacroTools]] +deps = ["Markdown", "Random"] +git-tree-sha1 = "3d3e902b31198a27340d0bf00d6ac452866021cf" +uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" +version = "0.5.9" + +[[deps.Markdown]] +deps = ["Base64"] +uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" + +[[deps.MbedTLS]] +deps = ["Dates", "MbedTLS_jll", "MozillaCACerts_jll", "Random", "Sockets"] +git-tree-sha1 = "6872f9594ff273da6d13c7c1a1545d5a8c7d0c1c" +uuid = "739be429-bea8-5141-9913-cc70e7f3736d" +version = "1.1.6" + +[[deps.MbedTLS_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" + +[[deps.Measures]] +git-tree-sha1 = "e498ddeee6f9fdb4551ce855a46f54dbd900245f" +uuid = "442fdcdd-2543-5da2-b0f3-8c86c306513e" +version = "0.3.1" + +[[deps.Missings]] +deps = ["DataAPI"] +git-tree-sha1 = "bf210ce90b6c9eed32d25dbcae1ebc565df2687f" +uuid = "e1d29d7a-bbdc-5cf2-9ac0-f12de2c33e28" +version = "1.0.2" + +[[deps.Mmap]] +uuid = "a63ad114-7e13-5084-954f-fe012c677804" + +[[deps.MozillaCACerts_jll]] +uuid = "14a3606d-f60d-562e-9121-12d972cd8159" + +[[deps.NaNMath]] +deps = ["OpenLibm_jll"] +git-tree-sha1 = "a7c3d1da1189a1c2fe843a3bfa04d18d20eb3211" +uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" +version = "1.0.1" + +[[deps.NetworkOptions]] +uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" + +[[deps.Ogg_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "887579a3eb005446d514ab7aeac5d1d027658b8f" +uuid = "e7412a2a-1a6e-54c0-be00-318e2571c051" +version = "1.3.5+1" + +[[deps.OpenBLAS_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] +uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" + +[[deps.OpenLibm_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "05823500-19ac-5b8b-9628-191a04bc5112" + +[[deps.OpenSSL]] +deps = ["BitFlags", "Dates", "MozillaCACerts_jll", "OpenSSL_jll", "Sockets"] +git-tree-sha1 = "fa44e6aa7dfb963746999ca8129c1ef2cf1c816b" +uuid = "4d8831e6-92b7-49fb-bdf8-b643e874388c" +version = "1.1.1" + +[[deps.OpenSSL_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "e60321e3f2616584ff98f0a4f18d98ae6f89bbb3" +uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95" +version = "1.1.17+0" + +[[deps.OpenSpecFun_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "13652491f6856acfd2db29360e1bbcd4565d04f1" +uuid = "efe28fd5-8261-553b-a9e1-b2916fc3738e" +version = "0.5.5+0" + +[[deps.Opus_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "51a08fb14ec28da2ec7a927c4337e4332c2a4720" +uuid = "91d4177d-7536-5919-b921-800302f37372" +version = "1.3.2+0" + +[[deps.OrderedCollections]] +git-tree-sha1 = "85f8e6578bf1f9ee0d11e7bb1b1456435479d47c" +uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" +version = "1.4.1" + +[[deps.PCRE_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "b2a7af664e098055a7529ad1a900ded962bca488" +uuid = "2f80f16e-611a-54ab-bc61-aa92de5b98fc" +version = "8.44.0+0" + +[[deps.Parsers]] +deps = ["Dates"] +git-tree-sha1 = "3d5bf43e3e8b412656404ed9466f1dcbf7c50269" +uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" +version = "2.4.0" + +[[deps.Pipe]] +git-tree-sha1 = "6842804e7867b115ca9de748a0cf6b364523c16d" +uuid = "b98c9c47-44ae-5843-9183-064241ee97a0" +version = "1.3.0" + +[[deps.Pixman_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "b4f5d02549a10e20780a24fce72bea96b6329e29" +uuid = "30392449-352a-5448-841d-b1acce4e97dc" +version = "0.40.1+0" + +[[deps.Pkg]] +deps = ["Artifacts", "Dates", "Downloads", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] +uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" + +[[deps.PlotThemes]] +deps = ["PlotUtils", "Statistics"] +git-tree-sha1 = "8162b2f8547bc23876edd0c5181b27702ae58dce" +uuid = "ccf2f8ad-2431-5c83-bf29-c5338b663b6a" +version = "3.0.0" + +[[deps.PlotUtils]] +deps = ["ColorSchemes", "Colors", "Dates", "Printf", "Random", "Reexport", "SnoopPrecompile", "Statistics"] +git-tree-sha1 = "21303256d239f6b484977314674aef4bb1fe4420" +uuid = "995b91a9-d308-5afd-9ec6-746e21dbc043" +version = "1.3.1" + +[[deps.Plots]] +deps = ["Base64", "Contour", "Dates", "Downloads", "FFMPEG", "FixedPointNumbers", "GR", "JLFzf", "JSON", "LaTeXStrings", "Latexify", "LinearAlgebra", "Measures", "NaNMath", "Pkg", "PlotThemes", "PlotUtils", "Printf", "REPL", "Random", "RecipesBase", "RecipesPipeline", "Reexport", "RelocatableFolders", "Requires", "Scratch", "Showoff", "SnoopPrecompile", "SparseArrays", "Statistics", "StatsBase", "UUIDs", "UnicodeFun", "Unzip"] +git-tree-sha1 = "6fae75c2178132582ea261d39f6da50cdd09c3c6" +uuid = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" +version = "1.34.0" + +[[deps.Preferences]] +deps = ["TOML"] +git-tree-sha1 = "47e5f437cc0e7ef2ce8406ce1e7e24d44915f88d" +uuid = "21216c6a-2e73-6563-6e65-726566657250" +version = "1.3.0" + +[[deps.Printf]] +deps = ["Unicode"] +uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" + +[[deps.Qt5Base_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Fontconfig_jll", "Glib_jll", "JLLWrappers", "Libdl", "Libglvnd_jll", "OpenSSL_jll", "Pkg", "Xorg_libXext_jll", "Xorg_libxcb_jll", "Xorg_xcb_util_image_jll", "Xorg_xcb_util_keysyms_jll", "Xorg_xcb_util_renderutil_jll", "Xorg_xcb_util_wm_jll", "Zlib_jll", "xkbcommon_jll"] +git-tree-sha1 = "c6c0f690d0cc7caddb74cef7aa847b824a16b256" +uuid = "ea2cea3b-5b76-57ae-a6ef-0a8af62496e1" +version = "5.15.3+1" + +[[deps.REPL]] +deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] +uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" + +[[deps.Random]] +deps = ["SHA", "Serialization"] +uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" + +[[deps.RecipesBase]] +git-tree-sha1 = "6bf3f380ff52ce0832ddd3a2a7b9538ed1bcca7d" +uuid = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" +version = "1.2.1" + +[[deps.RecipesPipeline]] +deps = ["Dates", "NaNMath", "PlotUtils", "RecipesBase"] +git-tree-sha1 = "e7eac76a958f8664f2718508435d058168c7953d" +uuid = "01d81517-befc-4cb6-b9ec-a95719d0359c" +version = "0.6.3" + +[[deps.Reexport]] +git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" +uuid = "189a3867-3050-52da-a836-e630ba90ab69" +version = "1.2.2" + +[[deps.RelocatableFolders]] +deps = ["SHA", "Scratch"] +git-tree-sha1 = "90bc7a7c96410424509e4263e277e43250c05691" +uuid = "05181044-ff0b-4ac5-8273-598c1e38db00" +version = "1.0.0" + +[[deps.Requires]] +deps = ["UUIDs"] +git-tree-sha1 = "838a3a4188e2ded87a4f9f184b4b0d78a1e91cb7" +uuid = "ae029012-a4dd-5104-9daa-d747884805df" +version = "1.3.0" + +[[deps.SHA]] +uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" + +[[deps.Scratch]] +deps = ["Dates"] +git-tree-sha1 = "f94f779c94e58bf9ea243e77a37e16d9de9126bd" +uuid = "6c6a2e73-6563-6170-7368-637461726353" +version = "1.1.1" + +[[deps.Serialization]] +uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" + +[[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.SnoopPrecompile]] +git-tree-sha1 = "f604441450a3c0569830946e5b33b78c928e1a85" +uuid = "66db9d55-30c0-4569-8b51-7e840670fc0c" +version = "1.0.1" + +[[deps.Sockets]] +uuid = "6462fe0b-24de-5631-8697-dd941f90decc" + +[[deps.SortingAlgorithms]] +deps = ["DataStructures"] +git-tree-sha1 = "b3363d7460f7d098ca0912c69b082f75625d7508" +uuid = "a2af1166-a08f-5f64-846c-94a0d3cef48c" +version = "1.0.1" + +[[deps.SparseArrays]] +deps = ["LinearAlgebra", "Random"] +uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + +[[deps.SpecialFunctions]] +deps = ["ChainRulesCore", "IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"] +git-tree-sha1 = "d75bda01f8c31ebb72df80a46c88b25d1c79c56d" +uuid = "276daf66-3868-5448-9aa4-cd146d93841b" +version = "2.1.7" + +[[deps.Statistics]] +deps = ["LinearAlgebra", "SparseArrays"] +uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" + +[[deps.StatsAPI]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "f9af7f195fb13589dd2e2d57fdb401717d2eb1f6" +uuid = "82ae8749-77ed-4fe6-ae5f-f523153014b0" +version = "1.5.0" + +[[deps.StatsBase]] +deps = ["DataAPI", "DataStructures", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"] +git-tree-sha1 = "d1bf48bfcc554a3761a133fe3a9bb01488e06916" +uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" +version = "0.33.21" + +[[deps.TOML]] +deps = ["Dates"] +uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" + +[[deps.Tar]] +deps = ["ArgTools", "SHA"] +uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" + +[[deps.TensorCore]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "1feb45f88d133a655e001435632f019a9a1bcdb6" +uuid = "62fd8b95-f654-4bbd-a8a5-9c27f68ccd50" +version = "0.1.1" + +[[deps.Test]] +deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] +uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[[deps.TranscodingStreams]] +deps = ["Random", "Test"] +git-tree-sha1 = "8a75929dcd3c38611db2f8d08546decb514fcadf" +uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa" +version = "0.9.9" + +[[deps.Triangle_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "bfdd9ef1004eb9d407af935a6f36a4e0af711369" +uuid = "5639c1d2-226c-5e70-8d55-b3095415a16a" +version = "1.6.1+0" + +[[deps.Triangulate]] +deps = ["DocStringExtensions", "Libdl", "Printf", "Test", "Triangle_jll"] +git-tree-sha1 = "796a9c0b02a3414af6065098bb7cf0e88dfa450e" +uuid = "f7e6ffb2-c36d-4f8f-a77e-16e897189344" +version = "2.1.3" + +[[deps.URIs]] +git-tree-sha1 = "e59ecc5a41b000fa94423a578d29290c7266fc10" +uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" +version = "1.4.0" + +[[deps.UUIDs]] +deps = ["Random", "SHA"] +uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" + +[[deps.Unicode]] +uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" + +[[deps.UnicodeFun]] +deps = ["REPL"] +git-tree-sha1 = "53915e50200959667e78a92a418594b428dffddf" +uuid = "1cfade01-22cf-5700-b092-accc4b62d6e1" +version = "0.4.1" + +[[deps.Unzip]] +git-tree-sha1 = "ca0969166a028236229f63514992fc073799bb78" +uuid = "41fe7b60-77ed-43a1-b4f0-825fd5a5650d" +version = "0.2.0" + +[[deps.Wayland_jll]] +deps = ["Artifacts", "Expat_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Pkg", "XML2_jll"] +git-tree-sha1 = "3e61f0b86f90dacb0bc0e73a0c5a83f6a8636e23" +uuid = "a2964d1f-97da-50d4-b82a-358c7fce9d89" +version = "1.19.0+0" + +[[deps.Wayland_protocols_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "4528479aa01ee1b3b4cd0e6faef0e04cf16466da" +uuid = "2381bf8a-dfd0-557d-9999-79630e7b1b91" +version = "1.25.0+0" + +[[deps.XML2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Pkg", "Zlib_jll"] +git-tree-sha1 = "58443b63fb7e465a8a7210828c91c08b92132dff" +uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a" +version = "2.9.14+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.Xorg_libX11_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libxcb_jll", "Xorg_xtrans_jll"] +git-tree-sha1 = "5be649d550f3f4b95308bf0183b82e2582876527" +uuid = "4f6342f7-b3d2-589e-9d20-edeb45f2b2bc" +version = "1.6.9+4" + +[[deps.Xorg_libXau_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "4e490d5c960c314f33885790ed410ff3a94ce67e" +uuid = "0c0b7dd1-d40b-584c-a123-a41640f87eec" +version = "1.0.9+4" + +[[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", "Pkg"] +git-tree-sha1 = "4fe47bd2247248125c428978740e18a681372dd4" +uuid = "a3789734-cfe1-5b06-b2d0-1dd0d9d62d05" +version = "1.1.3+4" + +[[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", "Pkg"] +git-tree-sha1 = "6783737e45d3c59a4a4c4091f5f88cdcf0908cbb" +uuid = "14d82f49-176c-5ed1-bb49-ad3f5cbd8c74" +version = "0.1.0+3" + +[[deps.Xorg_libxcb_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "XSLT_jll", "Xorg_libXau_jll", "Xorg_libXdmcp_jll", "Xorg_libpthread_stubs_jll"] +git-tree-sha1 = "daf17f441228e7a3833846cd048892861cff16d6" +uuid = "c7cfdc94-dc32-55de-ac96-5a1b8d977c5b" +version = "1.13.0+3" + +[[deps.Xorg_libxkbfile_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll"] +git-tree-sha1 = "926af861744212db0eb001d9e40b5d16292080b2" +uuid = "cc61e674-0454-545c-8b26-ed2c68acab7a" +version = "1.1.0+4" + +[[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", "Pkg", "Xorg_libxkbfile_jll"] +git-tree-sha1 = "4bcbf660f6c2e714f87e960a171b119d06ee163b" +uuid = "35661453-b289-5fab-8a00-3d9160c6a3a4" +version = "1.4.2+4" + +[[deps.Xorg_xkeyboard_config_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xkbcomp_jll"] +git-tree-sha1 = "5c8424f8a67c3f2209646d4425f3d415fee5931d" +uuid = "33bec58e-1273-512f-9401-5d533626f822" +version = "2.27.0+4" + +[[deps.Xorg_xtrans_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "79c31e7844f6ecf779705fbc12146eb190b7d845" +uuid = "c5fb5394-a638-5e4d-96e5-b29de1b5cf10" +version = "1.4.0+3" + +[[deps.Zlib_jll]] +deps = ["Libdl"] +uuid = "83775a58-1f1d-513f-b197-d71354ab007a" + +[[deps.Zstd_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "e45044cd873ded54b6a5bac0eb5c971392cf1927" +uuid = "3161d3a3-bdf6-5164-811a-617609db77b4" +version = "1.5.2+0" + +[[deps.fzf_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "868e669ccb12ba16eaf50cb2957ee2ff61261c56" +uuid = "214eeab7-80f7-51ab-84ad-2988db7cef09" +version = "0.29.0+0" + +[[deps.libaom_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "3a2ea60308f0996d26f1e5354e10c24e9ef905d4" +uuid = "a4ae2306-e953-59d6-aa16-d00cac43593b" +version = "3.4.0+0" + +[[deps.libass_jll]] +deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] +git-tree-sha1 = "5982a94fcba20f02f42ace44b9894ee2b140fe47" +uuid = "0ac62f75-1d6f-5e53-bd7c-93b484bb37c0" +version = "0.15.1+0" + +[[deps.libblastrampoline_jll]] +deps = ["Artifacts", "Libdl", "OpenBLAS_jll"] +uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" + +[[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.libpng_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] +git-tree-sha1 = "94d180a6d2b5e55e447e2d27a29ed04fe79eb30c" +uuid = "b53b4c65-9356-5827-b1ea-8c7a1a84506f" +version = "1.6.38+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.nghttp2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" + +[[deps.p7zip_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" + +[[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 = "9ebfc140cc56e8c2156a15ceac2f0302e327ac0a" +uuid = "d8fb68d0-12a3-5cfd-a85a-d49703b185fd" +version = "1.4.1+0" +""" + +# ╔═║ Cell order: +# ╠═c6d69c19-92a6-466c-81a2-6a2c78d255ad +# β•Ÿβ”€2030f9ac-3e09-11ed-35be-eb75d09dea91 +# β•Ÿβ”€878d69c6-7b10-48ca-b726-50224ad2086d +# β•Ÿβ”€e6284251-8f38-4fd5-bb21-13ee20776c07 +# ╠═666bfda8-283b-4756-aedb-4066c2074646 +# ╠═9a0eb5bc-9b26-45ad-99b6-8689f4345543 +# β•Ÿβ”€574c5144-a65b-45aa-b587-5e81a7ffc2d9 +# β•Ÿβ”€df10c580-30b2-4a23-8bd6-75e658da2b9e +# ╠═3f15bc42-4bc1-4502-a11d-a40d9f81e0b9 +# ╠═a90cc361-046a-4e0f-bfd5-64827df550a9 +# ╠═0e6004e8-66c4-4d65-8c07-f34d0d442281 +# β•Ÿβ”€4178854c-6d10-4424-9e10-d036afc2ea43 +# ╠═fe0930f5-04e5-40da-9ab5-fafed633ce1a +# ╠═e01530c0-fb3e-490c-8470-1045f4093e1b +# β•Ÿβ”€0008135f-350f-4cd3-9865-6f23c1880ac0 +# β•Ÿβ”€20b0af3a-9447-4b3c-82fa-26b69c995d0f +# ╠═6ffbfc8c-fe6f-49e9-b1a2-aace751c5c62 +# ╠═bc45e8a9-81dd-4983-aac9-6aed2ba3db23 +# β•Ÿβ”€99a20616-d186-4723-b38a-a695e584bf7b +# ╠═fa5738a1-2a62-4d0b-b67d-71e13b3b72cf +# β•Ÿβ”€24c4f210-9eca-4315-b85c-0e7645184500 +# ╠═5c0efb32-e365-49eb-aee5-e18491304d00 +# β•Ÿβ”€c1738f8a-a544-49ee-85d1-51f8bd3263a2 +# ╠═6601528a-e058-4ba3-b9d9-6c4d7f24caa1 +# β•Ÿβ”€36530462-fc87-49a3-a4b2-c777f1cf41df +# ╠═0aafbbda-99b0-4341-a4b8-f1509fbfb708 +# ╠═aa2966bc-f663-4f20-b325-9052d8e6513e +# β•Ÿβ”€c500b176-c2d5-4c10-826a-4312a5aaf81c +# β•Ÿβ”€1397dff9-c109-43f9-a71d-8547e5ec526e +# ╠═33e23c8e-8320-4833-a0d1-6bfc6c8d2ac5 +# β•Ÿβ”€00000000-0000-0000-0000-000000000001 +# β•Ÿβ”€00000000-0000-0000-0000-000000000002 diff --git a/notebooks_old/8_greenhouse_effect.jl b/notebooks_old/8_greenhouse_effect.jl new file mode 100644 index 0000000..8ca3dbc --- /dev/null +++ b/notebooks_old/8_greenhouse_effect.jl @@ -0,0 +1,2847 @@ +### A Pluto.jl notebook ### +# v0.19.12 + +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 + +# ╔═║ 3e60b013-98cf-4057-9c96-b627662c85a4 +begin + using DifferentialEquations, Plots, PlutoUI, LinearAlgebra, CSV, DataFrames, Images +end + +# ╔═║ 42085492-ac8c-11eb-0620-adcb307077f1 +html""" +
+ +
+

Section 2.1

+

+ Climate models: greenhouse effect +

+ +""" + +# ╔═║ 14195fc4-40e1-4576-973a-69d649fddc02 +TableOfContents(title="πŸ“š Table of Contents", indent=true, depth=4, aside=true) + +# ╔═║ 92883ed9-5572-41fd-96c7-190279f90804 +md""" +This lecture is based on the fall 2020 "Introduction to Climate Modeling" lecture by Henri Drake. [Henri's video](https://computationalthinking.mit.edu/Fall20/lecture20/), +[Henri's original notebook](https://github.com/mitmath/18S191/blob/Fall20/lecture_notebooks/week11/01_energy_balance_model.jl) where he describes the Energy Balance Model. +""" + +# ╔═║ 2ab34e6f-9059-4f33-8abd-df15b0c00b6b +md""" +## Surface temperature and atmospheric $CO_2$ +""" + +# ╔═║ 8d2fd4f0-f2f6-4bc8-b753-f34f2abfcc7e +html""" + +""" + +# ╔═║ 041caa91-5449-4de1-8786-56ae3db74bfe +html"""""" + +# ╔═║ 21b71237-bfdf-47d1-beb3-eac924c52f6a +md""" +--- +--- +""" + +# ╔═║ b6c511c8-918d-432c-9756-9641176ff652 +md""" +## Computational thinking and climate modeling +""" + +# ╔═║ e8a5cf48-f647-4fb3-8c0a-4eae97d03e02 +md""" + +The goal is to predict the evolution of the average surface temperature of the Earth as a function of external forcing, like the atmospheric concentration of $CO_2$. Let us start by introducing some notation: + +``T=T(t)`` is the Earth's average surface temperature as a function of time $t$ + +Initially $t=0$, $T(0)=T_0$ + +We write ``T'`` for ``dT/dt`` and look for an equation of the form: + +``T' = f(t)`` + +where ``f(t)`` represents the external forcing which acts to change the Earth's temperature `T(t) +""" + +# ╔═║ ebfeb0b0-d29e-4244-a0e3-a7185f3c8124 +md""" +--- +#### 1) Start with constant forcing +\ +``T' = a`` +$(html"
") Solution: ``T(t) = at + T_0`` + +--- +""" + +# ╔═║ 4bf60f27-8db5-42c1-83d8-750bec2060e5 +md""" + +#### 2) Add linear damping in temperature +\ +``T' = a - bT``$(html"
") Solution: ``T(t) =(\frac{a}{b})(1-e^{-bt}) + T_0 e^{-bt}`` + +Comment: Equilibrium obtained (if $b\ne0$) by solving ``T'=0`` for T giving equilibrium $T=a/b$. Also +can be obtained by letting $t\rightarrow \infty$ in the solution killing the exponential terms. + +--- +""" + +# ╔═║ e2799d05-36a7-4547-8663-90708ce01ce8 +md""" +#### 3) Add time dependent forcing ``f(t)`` +\ +``T' = a - bT + f(t)``$(html"
") Solution: ``T(t) = e^{-bt} \left( T_0 + \int_0^t e^{bu}(a+f(u))\,\, {\rm d}u \right)`` + +Comment: No equilibrium solution as long as the forcing keeps changing in time. + +--- +""" + +# ╔═║ 279b4748-829f-44a3-94da-da3abf32ff13 +md""" +#### Solving an ODEs of the form ``T'=f(T,p,t)`` in Julia + +0. Define f(T,p,t) +1. ODEProblem( f, f(0), time_span, parameters) +2. solve +3. plot etc +""" + +# ╔═║ adb59adc-b30a-4dc4-bc3f-2804b7e02876 +forcing(c) = t->c*t + +# ╔═║ c1d87c42-e1e0-4e52-8023-6cc176266e86 +f(T,(a, b, forcing(c)),t) = a - b*T + forcing(c)(t) + +# ╔═║ 7bee45a5-fa62-455b-813a-3e5dcf430289 +md""" +a = $(@bind a Slider(0:.01:10, show_value=true, default=0) ) + +b = $(@bind b Slider(0:.1:5, show_value=true, default=0) ) + +Tβ‚€ = $(@bind Tβ‚€ Slider(-5:.1:15, show_value=true, default=2.0) ) + +c = $(@bind c Slider(0:.1:5, show_value=true, default=0.0) ) +""" + +# ╔═║ 578a80ad-fcf1-4d5c-81e5-205113bbf78d +sol = solve( ODEProblem( f, Tβ‚€, (0, 10.0), (a, b, forcing(c)) ) ); + +# ╔═║ bda41881-75c7-4732-9a66-d7947607b1b6 +begin + p = plot( sol , legend=false, background_color_inside=:black , ylims=(-5, 10), lw=3, c=:red) + # plot direction field: + xs = Float64[] + ys = Float64[] + + lrx = LinRange( xlims(p)..., 30) + for x in lrx + for y in LinRange( ylims(p)..., 30) + v = [1, a - b*y + forcing(c)(x) ] + v ./= (20* (lrx[2]-lrx[1])) + # plot!([x, x + v[1]], [y, y + v[2]], alpha=0.5, c=:gray) + + push!(xs, x - v[1], x + v[1], NaN) + push!(ys, y - v[2], y + v[2], NaN) + + end + end + hline!( [b==0 ? 0 : a/b],c=:white,ls=:dash) + #plot!(xs, ys, alpha=0.7, c=:yellow) + ylabel!("T") + annotate!(-.5,Tβ‚€,text("Tβ‚€",color=:red)) + title!("Solution to T'(t) = a - bT + forcing(c)(t)") +end + +# ╔═║ 2ca14de2-2f6f-4e0c-a324-ad850c9132e5 +md""" +--- +--- +""" + +# ╔═║ e31693a1-70e1-48f2-93ba-c2ec13ea72ee +md""" +## Earth energy budget + +""" + +# ╔═║ b6bb81f9-0ca2-4da6-909d-3d64bf22fde1 +md""" + +The energy (heat) budget of a planet without atmosphere is given by the simple equation: + +$\begin{align} +\text{\color{brown}{change in heat content}} = & + \text{\color{red}{incoming solar radiation (energy from the Sun's rays)}} \newline +& - \text{\color{red}{reflected solar radiation}}\newline +& - \text{\color{blue}{outgoing thermal radiation (i.e. blackbody cooling to space)}} +\end{align}$ + +where each of these is interpreted as an average over the entire globe (hence "zero-dimensional"). +""" + +# ╔═║ 9d491fa0-dfdc-4940-954c-2e3a9caf5e5a +html"""""" + +# ╔═║ df57eded-963e-4178-a14c-3c012b265a4c +md""" +--- +#### 1) Change in heat content + +The heat content of the Earth per unit area is given by $C T$, where $C$ is the heat capacity per unit area and $T$ the planet's temperature in Kelvin degrees. The heat capacity is the amount of heat a body needs to absorb to increase its temperature by one degree Kelvin. We take $C$ to be the heat capacity of the ocean which is 4000 m depth on average, but covers only 70% of the Earth surface. Given that the heat capacity of water per unit volume is $4 \times 10^6$ J K$^{-1}$ m$^{-3}$, we estimate $C= 4000 m \times 70\% \times 4\times 10^6 J K^{-1} m^{-3} = 11 \times 10^9$ J K$^{-1}$ m$^{-2}$ or $C= 355$ Wyr K$^{-1}$ m$^{-2}$. + +The total heat content of the Earth's is therefore $CT$ multiplied by the Earths surface area $4 \pi R^2$. The rate of change in heat content in the time interval $dt$ is given by: + +$$\text{\color{brown}{change in heat content}} +\color{brown}{=\frac {d (4 \pi R^2 C T)}{dt}}$$ + +Both the heat capacity per unit area (which depends on the Earth's composition) and the area of the earth do not change in time. We can thus write: + +$$\text{\color{brown}{change in heat content}} +\color{brown}{= 4 \pi R^2 C \frac{d T}{dt}}$$ +""" + +# ╔═║ 95085dc9-fd7b-4e48-a75c-0167137ddb64 +C = 355.; # atmosphere and upper-ocean heat capacity [Wyr/m^2/Β°K] + +# ╔═║ 35225212-6110-4e7b-9abc-ad0bac208dd0 +md""" +--- +#### 2) Blackbody radiation + +A blackbody is any object that is a perfect emitter and a perfect absorber of radiation. Its emission at each wavelength depends only on temperature. +""" + +# ╔═║ b7317177-27d7-46c9-bc45-e608ad7a85c0 +html"""""" + +# ╔═║ c995d675-b6a3-48dc-a0a9-911960e73993 +md""" +Electromagnetic radiation is composed of a "spectrum" of different wavelengths. +""" + +# ╔═║ 6deac3f1-e2c6-40a5-b764-33c0b4004d91 +html"""""" + +# ╔═║ bf774878-28b5-4e9b-b5d8-f7e9be4c8787 +md""" + +The energy emitted by a blackbody per unit time and unit area at wavelength Ξ» is given by the formula: + +$$P(\lambda,T) = \frac{2hc^2}{\lambda^5}\frac{1}{e^{h c / \kappa T \lambda}-1}$$ + +where $c$ is the speed of light, $h$ is Planck constant, $\kappa$ is Boltzmann constant, and $T$ is the body's temperature in Kelvin degrees. + +""" + +# ╔═║ bee4395c-3e55-443e-831f-c50d6b88c1a3 +begin + clight = 299792458 + h = 6.63e-34 + ΞΊ = 1.38e-23 + BlackBody(Tb) = Ξ» -> (2*h*clight^2)/Ξ»^5/(exp(h*clight/Ξ»/ΞΊ/Tb)-1) +end + +# ╔═║ c2b34a2d-7271-43a1-a60d-9f0a0bee6f6b +md""" +Tb = $(@bind Tb Slider(200:100:1000, show_value=true, default=200) ) +""" + +# ╔═║ 46ef400d-6001-4c6f-9925-49ab751a51e6 +begin + plot( BlackBody(Tb), 5e-7, 5e-5 , legend=false, background_color_inside=:black , ylims=(1e5, 1e10), lw=3, c=:red, yaxis=:log) + ylabel!("Power [W/mΒ²/sr/m]") + xlabel!("Ξ» [m]") + title!("Power emitted per unit area by a blackbody") +end + +# ╔═║ d19effc6-82ee-486d-8635-ede036c82462 +md""" + +Area under the curve is blackbody energy emitted per per unit area and unit time and is given by Stefan-Boltzmann's law: + +$$E = \sigma T^4$$ +where $\sigma$ is the Stefan-Boltzmann constant and $T$ is absolute temperature in Kelvin degrees. + +The peak in the curve indicates the wavelength of maximum blackbody energy emission and it is given by Wienz's displacement law: + +$\lambda_{max} T = constant.$ + +""" + +# ╔═║ 1f2ab21d-bd7f-4dab-8cd1-33b96d85ed08 +Οƒ = 5.670374419*10^(βˆ’8) # [W/m^2/K^4] + +# ╔═║ 3a355c17-770d-4ce4-a8bf-117ce6616788 +md"""The Sun has a mean surface temperature of ~6000K and emits radiation in the visible range $0.4 ΞΌm < \lambda < 0.7 ΞΌm$. The Earth has a mean surface temperature of 300K and emits radiation in the infrared range: $4 ΞΌm < \lambda < 40 ΞΌm$.""" + +# ╔═║ 8c930e06-8f58-49be-9724-5536d3156067 +html"""""" + +# ╔═║ bddce5ec-8f5c-4025-96fb-1443d4e347aa +md""" +#### 3) Incoming solar radiation (shortwave) + +At Earth's orbital distance from the Sun, the power of the Sun's rays that intercept the Earth per unit area is equal to +""" + +# ╔═║ add2a5e8-4a28-4395-9d61-2077fd31e0f4 +S = 1366; # solar insolation [W/m^2] (energy per unit time per unit area) + +# ╔═║ b517c441-b068-4778-9af0-6ce82c5bbfc7 +html"""""" + +# ╔═║ ca5b41d2-b511-486a-91fe-cceb8f7282c3 +md"A small fraction" + +# ╔═║ 875e146c-d72f-46b4-9d82-21110e81ca9b +Ξ± = 0.3; # albedo, or planetary reflectivity [unitless] + +# ╔═║ f1df983a-9d70-48c8-a7ee-7ba3bd9c0fa5 +md""" +of this incoming solar radiation is reflected back out to space (by reflective surfaces like white clouds, snow, and ice), with the remaining fraction $(1-\alpha)$ being absorbed. + +Since the incoming solar rays are all approximately parallel this far from the Sun, the cross-sectional area of the Earth that intercepts them is just a disc of area $\pi R^{2}$. + +![](https://www.e-education.psu.edu/earth103/sites/www.e-education.psu.edu.earth103/files/module03/fig6sol.png) + +The total solar radiation absorbed by the Earth per unit time is thus: + +$\textcolor{black}{\text{absorbed solar radiation} \equiv S(1-\alpha)\pi R^2}$ +""" + +# ╔═║ bb34869a-4bb6-4fcd-b841-c6b49cf02155 +md""" +The The heat budget of the Earth due to the incoming solar radiation is thus given by: + +$$\color{brown}{4 \pi R^2 C \frac{d T}{dt}} \color{black}= \color{red} \pi R^2 (1-\alpha)S_0$$ + +which can be simplified to: + +$$\color{brown}{C \frac{d T}{dt}} \color{black}= \color{red} \frac{(1-\alpha)S_0}{4}$$ + +""" + +# ╔═║ 717a83a5-70d2-453b-b7da-f05c366545fd +md""" + +The solar energy absorbed per unit time and unit area by the Earth is therefore: + +$$\color{red}\text{solar energy absorbed} = \frac{(1-\alpha) S_0}{4}$$ + +""" + +# ╔═║ 0e4dedc5-0b1e-4e46-b943-284bfb2de57f +absorbed_solar_radiation = S*(1 - Ξ±)/4; # [W/m^2] + +# ╔═║ 91329865-f593-4388-a5d0-01af4be6e01d +begin + tempβ‚€ = 0 #absolute zero [K] + timespan = 1000. +end + +# ╔═║ 7187ae25-239d-4752-898e-6674009b5de6 + p1 = ODEProblem( (temp, p, t)-> (1/C) * absorbed_solar_radiation, tempβ‚€, (0, timespan) ) + +# ╔═║ fb61866f-c3f9-40d2-848b-f7c54ad6d447 +begin + solution1=solve(p1) + solution1.u.-=273.15 + plot(solution1, legend = false, + background_color_inside = :black, + xlabel = "years", + ylabel = "Temperature Β°C", + ylim = (-273.15,400)) + hline!( [tempβ‚€,tempβ‚€] ,c=:white,ls=:dash) + annotate!( 700, 35+tempβ‚€-273.15, text("Initial Temperature = $(tempβ‚€) K",color=:white)) + title!("Earth's heat budget absorbing solar radiation only") +end + +# ╔═║ 03ccad3d-09ed-4621-9845-ceb605072ebf +md""" +The Earth's temperature would reach 400Β°C, above boiling point of water, after 1000 years. +""" + +# ╔═║ 2b66ffaf-a9a3-4ca2-a6e9-732912c9d48e +md""" +--- +#### 4) Earth's energy budget without an atmosphere +""" + +# ╔═║ d76af110-ae17-4e74-b0f9-870d05bedb87 +md""" + +In the absence of an atmosphere, the Earth's would behave as a perfect blackbody in the infrared range. The incoming solar radiation is re-emitted as thermal radiation: + + +$$\color{brown}{C \frac{d T}{dt}} \color{black}{=} \color{red}{\frac{(1-\alpha)S_0}{4}} \color{black}{\,-\,} \color{blue}{\sigma \,T^4}$$ + +""" + +# ╔═║ b12209a8-2f34-4daa-8288-d91339a940f9 + p2 = ODEProblem( (temp, p, t)-> (1/C) * (absorbed_solar_radiation-Οƒ*temp^4), tempβ‚€, (0, timespan) ) + +# ╔═║ 5eb54ebb-0ebd-47a7-b5c0-a3059f82aa9e +begin + solution2=solve(p2) + solution2.u.-=273.15 + plot(solution2, legend = false, + background_color_inside = :black, + xlabel = "years", + ylabel = "Temperature Β°C", + ylim = (-273.15,100)) + hline!( [tempβ‚€,tempβ‚€] ,c=:white,ls=:dash) + annotate!( 700, 25+tempβ‚€-273.15, text("Initial Temperature = $(tempβ‚€) K",color=:white)) + title!("Earth's heat budget without an atmosphere") +end + +# ╔═║ b186d026-d02c-4f06-8097-aa54b363f4fb +md""" + +The equilibrium temperature is: + +$$\color{blue}{T} ={\sqrt[4]{\frac{(1-\alpha)S_0}{4 \sigma}} = 255K = -18^{\circ}C}$$ + +This is clearly too cold, because the Earth's is not solid frozen as we know. What's the problem with our calculation? + +""" + +# ╔═║ 46fea650-c729-4698-8627-36ffdb6cf78f +md""" +--- +#### 5) Earth's energy budget with a thick atmosphere +""" + +# ╔═║ 6b860e7a-6e7d-48ac-addb-03e6115a037d +md""" + +##### Greenhouse effect + +The next step in our climate model hierarchy is to add an atmosphere. For simplicity we start by considering an atmosphere filled with a perfect greenhouse gas, i.e. a gas that behaves like a blackbody in the the infrared (longwave) radiation spectrum, but is completely transparent in the visible (shortwave) radiation spectrum. This introduces an important asymmetry in the energy budget. (Earth's atmosphere does not behave like a blackbody in the infrared and we will consider this correction below.) + +When greenhouse gas molecules absorb thermal infrared energy, their temperature rises. Those gases then radiate an increased amount of thermal infrared energy in all directions. Heat radiated upward continues to encounter greenhouse gas molecules; those molecules also absorb the heat, and their temperature rises and the amount of heat they radiate increases. The atmosphere thins with altitude, and at some height (roughly 5–6 kilometres in Earth's atmosphere), the concentration of greenhouse gases in the overlying atmosphere is so thin that heat can escape to space. + +Because greenhouse gas molecules radiate infrared energy in all directions, some of it spreads downward and ultimately returns to the Earth's surface, where it is absorbed. Earth's in-situ surface temperatures are thus higher than they would be if governed only by direct solar heating. This supplemental heating is the natural greenhouse effect. It is as if the Earth is covered by a blanket that allows shortwave solar radiation to enter, but slows the rate at which the longwave infrared radiation leaves. + +""" + +# ╔═║ af893e1e-3bd7-4d05-83b6-f5f7e751b5e3 +md""" + +We can easily add a perfect greenhouse gas atmosphere to our Earth's heat budget, by adding a heat budget equation for the atmosphere. The atmosphere receives thermal radiation from the ocean and radiates it back downward toward the ocean and upward towards space. The ocean receives solar radiation, reflects a fraction $\alpha$ and radiates the rest back toward the atmosphere. This system is captured by two coupled equations: +```math +\begin{align} +&\color{brown}{C_a \frac{d T_a}{dt}} \color{black}{=} \color{blue}{\sigma \,T_o^4} \color{black}{-} \color{blue}{2 \sigma T_a^4}\\ +&\color{brown}{C_o \frac{d T_o}{dt}} \color{black}{=} \color{red}{\frac{(1-\alpha)S_0}{4}} \color{black}{\,+\,} \color{blue}{\sigma T_a^4} \color{black}{\,-\,}\color{blue}{\sigma \,T_o^4} +\end{align} +```where $C_a$ is the heat capacity of the atmosphere. +""" + +# ╔═║ b42cb878-c5af-4a6e-99cd-1da436d1bdf7 +md""" +![GHGmodel.png] +(https://raw.githubusercontent.com/mitmath/JuliaComputation/main/notebooks/GHGmodel.png) +""" + +# ╔═║ ca5954aa-eece-4797-939d-75fdef10a2a1 +begin + md""" + Consistent with the assumption that both the Earth and atmosphere behave as blackbodies in the infrared range, we have that $S=\sigma T_o^4$ and $A=\sigma T_a^4$. (Figure from Atmosphere, Ocean and Climate Dynamics by Marshall and Plumb) + """ +end + +# ╔═║ efe73a33-02a8-4957-8a1a-2298dbefcb56 +begin + C_o = C; #Heat capacity of a 500 m deep ocean column + C_a = C_o/1000; # Heat capacity of an atmospheric column + Toβ‚€ = tempβ‚€; + Taβ‚€ = Toβ‚€; +end + +# ╔═║ 0c1b96af-73b3-441d-93f7-e38e6e01da2f + +function ghgmodel!(du, u, p, t) + + T_a = u[1] + T_o = u[2] + + du[1] = (1/C_a) * (Οƒ*T_o^4-2*Οƒ*T_a^4) + du[2] = (1/C_o) * (absorbed_solar_radiation+Οƒ*T_a^4-Οƒ*T_o^4) + +end + +# ╔═║ 3aa13ecd-9d4a-4b41-b15f-f85e2b8f8bf6 +begin + p3 = ODEProblem(ghgmodel!, [Taβ‚€; Toβ‚€], (0.,timespan)) +end + +# ╔═║ 6613b68f-9997-4230-b757-a5ac46e908ad +begin + solutioneq3=solve(p3) + for i in eachindex(solutioneq3.u) + solutioneq3.u[i] .-= [273.15, 273.15] + end + plot(solutioneq3, label = ["Tₐ" "Tβ‚’" "Tβ‚’"], + background_color_inside = :black, + linecolor = [:red :blue], + xlabel = "years", + ylabel = "Temperature Β°C", + ylim = (-273.15,100)) + hline!( [tempβ‚€,tempβ‚€] ,c=:white,ls=:dash,label=false) + annotate!( 700, 25+tempβ‚€-273.15, text("Initial Temperature = $(tempβ‚€) K",color=:white)) + title!("Earth's heat budget with a thick atmosphere") +end + +# ╔═║ 3c3f7997-ca76-4536-8331-634fff7fbcb7 + md""" + + ##### Equilibrium temperature + + The presence of an atmosphere has raised the equilibrium Earth's surface temperature (actually the ocean temperature in our model) to: + + $$\color{blue}{T_o} ={\sqrt[4]{\frac{(1-\alpha)S_0}{4 \sigma}} = 255K = +30^{\circ}C}$$ + + The presence of an atmosphere increases the mean surface temperature by $30^{\circ}C$! This is (somewhat inaccurately) called the $\text{\color{green}{greenhouse effect}}$. The predicted Earth's mean surface temperature, however, is now too high. This is because we assumed our atmosphere is a perfect blackbody in the infrared. + + The atmospheric temperature is instead given by the value we calculated without an atmosphere, because this thick atmosphere absorbs all the energy it receives from the ocean and is the only emitter towards space. So the top of the atmosphere is this model acts like the ocean in the model without an atmosphere, + + $$\color{blue}{T_a} ={\sqrt[4]{\frac{(1-\alpha)S_0}{4 \sigma}} = 303K = -18^{\circ}C}$$ + + """ + +# ╔═║ d536ffda-117a-4434-9191-8a2c12df825e +md""" + +##### Timescale to reach equilibrium + +The atmosphere has a much smaller heat capacity than the ocean: 1000 times smaller! As a result it reaches equilibrium much faster. Indeed we can assume that the atmosphere is always in equilibrium and get essentially the same solution for the ocean temperature, i.e we start with the problem: + +```math +\begin{align} +&\color{brown}{0} \color{black}{=} \color{blue}{\sigma \,T_o^4} \color{black}{-} \color{blue}{2 \sigma \bar T_a^4}\\ +&\color{brown}{C_o \frac{d T_o}{dt}} \color{black}{=} \color{red}{\frac{(1-\alpha)S_0}{4}} \color{black}{\,+\,} \color{blue}{\sigma \bar T_a^4} \color{black}{\,-\,}\color{blue}{\sigma \,T_o^4} +\end{align} +``` + +Where $\bar T_a$ denotes the atmospheric temperature assuming it is in equilibrium with the ocean. using the relationship between atmospheric and ocean temperature from the first equation, we eliminate $\bar T_a$ from the second equation and write an ODE for the evolution of the ocean temperature Tβ‚’ which no longer depends on the atmospheric temperature: + +```math +\begin{align} +\color{brown}{C_o \frac{d T_o}{dt}} \color{black}{=} \color{red}{\frac{(1-\alpha)S_0}{4}} \color{black} \color{black}{\,-\,}\color{blue}{\frac{1}{2}\sigma \,T_o^4} +\end{align} +``` + + """ + +# ╔═║ de60ddf6-b77d-4960-b3d1-7018abf3b178 +function ghgeqmodel!(du, u, p, t) + + T_a = u[1] + Teq_a = u[2] + T_o = u[3] + Teq_o = u[4] + + du[1] = (1/C_a) * (Οƒ*T_o^4-2*Οƒ*T_a^4) + du[2] = (1/C_o/2^(1/4)) * (absorbed_solar_radiation-0.5*Οƒ*Teq_o^4) + du[3] = (1/C_o) * (absorbed_solar_radiation+Οƒ*T_a^4-Οƒ*T_o^4) + du[4] = (1/C_o) * (absorbed_solar_radiation-0.5*Οƒ*Teq_o^4) + +end + +# ╔═║ 8da81688-e1d7-4d8d-8e2d-76ac7b17cdbe +begin + peq3 = ODEProblem(ghgeqmodel!, [Taβ‚€; Toβ‚€; Taβ‚€; Toβ‚€], (0.,timespan)) +end + +# ╔═║ 20915df5-5385-4b82-b3e5-8637171f0b0b +begin + solution3=solve(peq3) + for i in eachindex(solution3.u) + solution3.u[i] .-= [273.15, 273.15, 273.15, 273.15] + end + plot(solution3, label = ["Tₐ" "Μ…Μ…Tₐ: atm in equilibrium" "Tβ‚’" "Tβ‚’: atm in equilibrium"], + legend = :topleft, + background_color_inside = :black, + linecolor = [:blue :blue :red :red], + linestyle = [:solid :dot :solid :dot], + linewidth = [1 5 1 5], + xlabel = "years", + ylabel = "Temperature Β°C", + ylim = (-273.15,100)) + hline!( [tempβ‚€,tempβ‚€] ,c=:white,ls=:dash,label=false) + annotate!( 700, 25+tempβ‚€-273.15, text("Initial Temperature = $(tempβ‚€) K",color=:white)) + title!("Earth's heat budget with a thick atmosphere") +end + +# ╔═║ 4733e6c8-acb3-4ed8-8aa5-ee0cbec1a484 +md""" +--- +#### 6) Earth's energy budget with a leaky atmosphere + +Earth's atmosphere does not behave like a perfect blackbody. At every wavelength the gases that compose the atmosphere absorb a fraction $\alpha <1$ less than a blackbody and emit a fraction $\epsilon<1$ than a blackbody. Kirchhoff’s law of thermal radiation states that the emissivity and the absorptivity of a surface in thermal equilibrium at a given temperature and wavelength are equal. If we ignore the wavelength dependence of $\epsilon=\alpha$, which depends on the gases properties that compose earth's atmosphere, then we can write the heat budget for a "leaky" atmosphere, + +```math +\begin{align} +&\color{brown}{C_a \frac{d T_a}{dt}} \color{black}{=} \color{blue}{\epsilon\sigma \,T^4} \color{black}{-} \color{blue}{2 \epsilon\sigma T_a^4}\\ +&\color{brown}{C_o \frac{d T_o}{dt}} \color{black}{=} \color{red}{\frac{(1-\alpha)S_0}{4}} \color{black}{\,+\,} \color{blue}{\epsilon\sigma \,T_a^4} \color{black}{\,-\,} \color{blue}{\sigma \,T_o^4} +\end{align} +``` + +""" + +# ╔═║ 23922b09-2277-4713-8271-a60e9fb16026 +md""" +![LeakyGreenhouse.png] +(https://raw.githubusercontent.com/mitmath/JuliaComputation/main/notebooks/LeakyGreenhouse.png) +""" + +# ╔═║ 0b2883eb-a074-44bc-9d5c-9c78d8b46f43 +md""" + +Since the atmospheric heat capacity is so much smaller than the ocean heat capacity, we can once again assume that the atmospheric temperature is always at equilibrium and reduce the budget to an equation for the ocean temperature only: + +```math +\begin{align} +&\color{brown}{C_o \frac{d T_o}{dt}} \color{black}{=} \color{red}{\frac{(1-\alpha)S_0}{4}} \color{black}{\,-\,} \color{blue}{\frac{2-\epsilon}{2}\sigma \,T_o^4} +\end{align} +``` + +The emissivity is a function of the water vapor, CO$_2$ concentrations, among other things, and can be set for preindustrial climate to $\epsilon = 0.75$. +""" + +# ╔═║ ee9724f1-5414-4c3d-85b9-e394afea2e72 +epsilon = 0.75; # Earth's emissivty nin preindustrial climate + +# ╔═║ af69dae3-48c4-4327-a0e4-d29734b3c7e1 +pleaky3 = ODEProblem( (temp, p, t)-> (1/C) * (absorbed_solar_radiation - (2-epsilon)/2*Οƒ*temp^4), tempβ‚€, (0, timespan) ) + +# ╔═║ 185321ec-c7b3-4deb-883c-fdac3e3193ff +begin + solutionleaky3=solve(pleaky3) + solutionleaky3.u .-= 273.15 + plot(solutionleaky3, label = ["Tₐ"], + background_color_inside = :black, + xlabel = "years", + ylabel = "Temperature Β°C", + ylim = (-273.15,100)) + hline!( [tempβ‚€,tempβ‚€] ,c=:white,ls=:dash,label=false) + annotate!( 700, 25+tempβ‚€-273.15, text("Initial Temperature = $(tempβ‚€) K",color=:white)) + title!("Earth's heat budget with a leaky atmosphere") +end + +# ╔═║ 1b692c88-d7e2-4d37-a81f-3b5cbfaf187e +md""" + +The equilibrium temperature of the ocean is now a much more reasonable + +$$\color{blue}{T_o} ={\sqrt[4]{\frac{2}{2-\epsilon}\frac{(1-\alpha)S_0}{4 \sigma}} = 287K = 13^{\circ}C}$$ + +""" + +# ╔═║ 00000000-0000-0000-0000-000000000001 +PLUTO_PROJECT_TOML_CONTENTS = """ +[deps] +CSV = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b" +DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" +DifferentialEquations = "0c46a032-eb83-5123-abaf-570d42b7fbaa" +Images = "916415d5-f1e6-5110-898d-aaa5f9f070e0" +LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" +Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" +PlutoUI = "7f904dfe-b85e-4ff6-b463-dae2292396a8" + +[compat] +CSV = "~0.10.4" +DataFrames = "~1.3.4" +DifferentialEquations = "~7.1.0" +Images = "~0.25.2" +Plots = "~1.29.0" +PlutoUI = "~0.7.38" +""" + +# ╔═║ 00000000-0000-0000-0000-000000000002 +PLUTO_MANIFEST_TOML_CONTENTS = """ +# This file is machine-generated - editing it directly is not advised + +julia_version = "1.8.0-rc4" +manifest_format = "2.0" +project_hash = "e18ff72c1fe0ad91e83872f0859e84e1468f3527" + +[[deps.AbstractFFTs]] +deps = ["ChainRulesCore", "LinearAlgebra"] +git-tree-sha1 = "69f7020bd72f069c219b5e8c236c1fa90d2cb409" +uuid = "621f4979-c628-5d54-868e-fcf4e3e8185c" +version = "1.2.1" + +[[deps.AbstractPlutoDingetjes]] +deps = ["Pkg"] +git-tree-sha1 = "8eaf9f1b4921132a4cff3f36a1d9ba923b14a481" +uuid = "6e696c72-6542-2067-7265-42206c756150" +version = "1.1.4" + +[[deps.Adapt]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "195c5505521008abea5aee4f96930717958eac6f" +uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" +version = "3.4.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 = ["ArrayInterfaceCore", "Compat", "IfElse", "LinearAlgebra", "Static"] +git-tree-sha1 = "0582b5976fc76523f77056e888e454f0f7732596" +uuid = "4fba245c-0d91-5ea0-9b3e-6abc04ee57a9" +version = "6.0.22" + +[[deps.ArrayInterfaceCore]] +deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"] +git-tree-sha1 = "40debc9f72d0511e12d817c7ca06a721b6423ba3" +uuid = "30b0a656-2188-435a-8636-2ec0e6a096e2" +version = "0.1.17" + +[[deps.ArrayInterfaceGPUArrays]] +deps = ["Adapt", "ArrayInterfaceCore", "GPUArraysCore", "LinearAlgebra"] +git-tree-sha1 = "febba7add2873aecc0b6620b55969e73ec875bce" +uuid = "6ba088a2-8465-4c0a-af30-387133b534db" +version = "0.2.1" + +[[deps.ArrayInterfaceOffsetArrays]] +deps = ["ArrayInterface", "OffsetArrays", "Static"] +git-tree-sha1 = "c49f6bad95a30defff7c637731f00934c7289c50" +uuid = "015c0d05-e682-4f19-8f0a-679ce4c54826" +version = "0.1.6" + +[[deps.ArrayInterfaceStaticArrays]] +deps = ["Adapt", "ArrayInterface", "ArrayInterfaceStaticArraysCore", "LinearAlgebra", "Static", "StaticArrays"] +git-tree-sha1 = "efb000a9f643f018d5154e56814e338b5746c560" +uuid = "b0d46f97-bff5-4637-a19a-dd75974142cd" +version = "0.1.4" + +[[deps.ArrayInterfaceStaticArraysCore]] +deps = ["Adapt", "ArrayInterfaceCore", "LinearAlgebra", "StaticArraysCore"] +git-tree-sha1 = "a1e2cf6ced6505cbad2490532388683f1e88c3ed" +uuid = "dd5226c6-a4d4-4bc7-8575-46859f9c95b9" +version = "0.1.0" + +[[deps.ArrayLayouts]] +deps = ["FillArrays", "LinearAlgebra", "SparseArrays"] +git-tree-sha1 = "ac5cc6021f32a272ee572dd2a325049a1fa0d034" +uuid = "4c555306-a7a7-4459-81d9-ec55ddd5c99a" +version = "0.8.11" + +[[deps.Artifacts]] +uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" + +[[deps.AxisAlgorithms]] +deps = ["LinearAlgebra", "Random", "SparseArrays", "WoodburyMatrices"] +git-tree-sha1 = "66771c8d21c8ff5e3a93379480a2307ac36863f7" +uuid = "13072b0f-2c55-5437-9ae7-d433b7a33950" +version = "1.0.1" + +[[deps.AxisArrays]] +deps = ["Dates", "IntervalSets", "IterTools", "RangeArrays"] +git-tree-sha1 = "1dd4d9f5beebac0c03446918741b1a03dc5e5788" +uuid = "39de3d68-74b9-583c-8d2d-e117c070f3a9" +version = "0.4.6" + +[[deps.BandedMatrices]] +deps = ["ArrayLayouts", "FillArrays", "LinearAlgebra", "Random", "SparseArrays"] +git-tree-sha1 = "d8da9afb97ad4a1a06650db11c8b72d9dd2f1ace" +uuid = "aae01518-5342-5314-be14-df237901396f" +version = "0.17.5" + +[[deps.Base64]] +uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" + +[[deps.BitTwiddlingConvenienceFunctions]] +deps = ["Static"] +git-tree-sha1 = "eaee37f76339077f86679787a71990c4e465477f" +uuid = "62783981-4cbd-42fc-bca8-16325de8dc4b" +version = "0.1.4" + +[[deps.BoundaryValueDiffEq]] +deps = ["BandedMatrices", "DiffEqBase", "FiniteDiff", "ForwardDiff", "LinearAlgebra", "NLsolve", "Reexport", "SciMLBase", "SparseArrays"] +git-tree-sha1 = "2f80b70bd3ddd9aa3ec2d77604c1121bd115650e" +uuid = "764a87c0-6b3e-53db-9096-fe964310641d" +version = "2.9.0" + +[[deps.Bzip2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "19a35467a82e236ff51bc17a3a44b69ef35185a2" +uuid = "6e34b625-4abd-537c-b88f-471c36dfa7a0" +version = "1.0.8+0" + +[[deps.CEnum]] +git-tree-sha1 = "eb4cb44a499229b3b8426dcfb5dd85333951ff90" +uuid = "fa961155-64e5-5f13-b03f-caf6b980ea82" +version = "0.4.2" + +[[deps.CPUSummary]] +deps = ["CpuId", "IfElse", "Static"] +git-tree-sha1 = "8a43595f7b3f7d6dd1e07ad9b94081e1975df4af" +uuid = "2a0fbf3d-bb9c-48f3-b0a9-814d99fd7ab9" +version = "0.1.25" + +[[deps.CSV]] +deps = ["CodecZlib", "Dates", "FilePathsBase", "InlineStrings", "Mmap", "Parsers", "PooledArrays", "SentinelArrays", "Tables", "Unicode", "WeakRefStrings"] +git-tree-sha1 = "873fb188a4b9d76549b81465b1f75c82aaf59238" +uuid = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b" +version = "0.10.4" + +[[deps.Cairo_jll]] +deps = ["Artifacts", "Bzip2_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.CatIndices]] +deps = ["CustomUnitRanges", "OffsetArrays"] +git-tree-sha1 = "a0f80a09780eed9b1d106a1bf62041c2efc995bc" +uuid = "aafaddc9-749c-510e-ac4f-586e18779b91" +version = "0.2.2" + +[[deps.ChainRulesCore]] +deps = ["Compat", "LinearAlgebra", "SparseArrays"] +git-tree-sha1 = "80ca332f6dcb2508adba68f22f551adb2d00a624" +uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" +version = "1.15.3" + +[[deps.ChangesOfVariables]] +deps = ["ChainRulesCore", "LinearAlgebra", "Test"] +git-tree-sha1 = "38f7a08f19d8810338d4f5085211c7dfa5d5bdd8" +uuid = "9e997f8a-9a97-42d5-a9f1-ce6bfc15e2c0" +version = "0.1.4" + +[[deps.CloseOpenIntervals]] +deps = ["ArrayInterface", "Static"] +git-tree-sha1 = "5522c338564580adf5d58d91e43a55db0fa5fb39" +uuid = "fb6a15b2-703c-40df-9091-08a04967cfa9" +version = "0.1.10" + +[[deps.Clustering]] +deps = ["Distances", "LinearAlgebra", "NearestNeighbors", "Printf", "SparseArrays", "Statistics", "StatsBase"] +git-tree-sha1 = "75479b7df4167267d75294d14b58244695beb2ac" +uuid = "aaaa29a8-35af-508c-8bc3-b662a17a0fe5" +version = "0.14.2" + +[[deps.CodecZlib]] +deps = ["TranscodingStreams", "Zlib_jll"] +git-tree-sha1 = "ded953804d019afa9a3f98981d99b33e3db7b6da" +uuid = "944b1d66-785c-5afd-91f1-9de20f533193" +version = "0.7.0" + +[[deps.ColorSchemes]] +deps = ["ColorTypes", "ColorVectorSpace", "Colors", "FixedPointNumbers", "Random"] +git-tree-sha1 = "1fd869cc3875b57347f7027521f561cf46d1fcd8" +uuid = "35d6a980-a343-548e-a6ea-1d62b119f2f4" +version = "3.19.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", "SpecialFunctions", "Statistics", "TensorCore"] +git-tree-sha1 = "d08c20eef1f2cbc6e60fd3612ac4340b89fea322" +uuid = "c3611d14-8923-5661-9e6a-0046d554d3a4" +version = "0.9.9" + +[[deps.Colors]] +deps = ["ColorTypes", "FixedPointNumbers", "Reexport"] +git-tree-sha1 = "417b0ed7b8b838aa6ca0a87aadf1bb9eb111ce40" +uuid = "5ae59095-9a9b-59fe-a467-6f913c188581" +version = "0.12.8" + +[[deps.CommonSolve]] +git-tree-sha1 = "332a332c97c7071600984b3c31d9067e1a4e6e25" +uuid = "38540f10-b2f7-11e9-35d8-d573e4eb0ff2" +version = "0.2.1" + +[[deps.CommonSubexpressions]] +deps = ["MacroTools", "Test"] +git-tree-sha1 = "7b8a93dba8af7e3b42fecabf646260105ac373f7" +uuid = "bbf7d656-a473-5ed7-a52c-81e309532950" +version = "0.3.0" + +[[deps.Compat]] +deps = ["Base64", "Dates", "DelimitedFiles", "Distributed", "InteractiveUtils", "LibGit2", "Libdl", "LinearAlgebra", "Markdown", "Mmap", "Pkg", "Printf", "REPL", "Random", "SHA", "Serialization", "SharedArrays", "Sockets", "SparseArrays", "Statistics", "Test", "UUIDs", "Unicode"] +git-tree-sha1 = "78bee250c6826e1cf805a88b7f1e86025275d208" +uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" +version = "3.46.0" + +[[deps.CompilerSupportLibraries_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" +version = "0.5.2+0" + +[[deps.ComputationalResources]] +git-tree-sha1 = "52cb3ec90e8a8bea0e62e275ba577ad0f74821f7" +uuid = "ed09eef8-17a6-5b46-8889-db040fac31e3" +version = "0.3.2" + +[[deps.ConstructionBase]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "fb21ddd70a051d882a1686a5a550990bbe371a95" +uuid = "187b0558-2788-49d3-abe0-74a17ed4e7c9" +version = "1.4.1" + +[[deps.Contour]] +deps = ["StaticArrays"] +git-tree-sha1 = "9f02045d934dc030edad45944ea80dbd1f0ebea7" +uuid = "d38c429a-6771-53c6-b99e-75d170b6e991" +version = "0.5.7" + +[[deps.CoordinateTransformations]] +deps = ["LinearAlgebra", "StaticArrays"] +git-tree-sha1 = "681ea870b918e7cff7111da58791d7f718067a19" +uuid = "150eb455-5306-5404-9cee-2592286d6298" +version = "0.6.2" + +[[deps.CpuId]] +deps = ["Markdown"] +git-tree-sha1 = "fcbb72b032692610bfbdb15018ac16a36cf2e406" +uuid = "adafc99b-e345-5852-983c-f28acb93d879" +version = "0.3.1" + +[[deps.Crayons]] +git-tree-sha1 = "249fe38abf76d48563e2f4556bebd215aa317e15" +uuid = "a8cc5b0e-0ffa-5ad4-8c14-923d3ee1735f" +version = "4.1.1" + +[[deps.CustomUnitRanges]] +git-tree-sha1 = "1a3f97f907e6dd8983b744d2642651bb162a3f7a" +uuid = "dc8bdbbb-1ca9-579f-8c36-e416f6a65cce" +version = "1.0.2" + +[[deps.DataAPI]] +git-tree-sha1 = "fb5f5316dd3fd4c5e7c30a24d50643b73e37cd40" +uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a" +version = "1.10.0" + +[[deps.DataFrames]] +deps = ["Compat", "DataAPI", "Future", "InvertedIndices", "IteratorInterfaceExtensions", "LinearAlgebra", "Markdown", "Missings", "PooledArrays", "PrettyTables", "Printf", "REPL", "Reexport", "SortingAlgorithms", "Statistics", "TableTraits", "Tables", "Unicode"] +git-tree-sha1 = "daa21eb85147f72e41f6352a57fccea377e310a9" +uuid = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" +version = "1.3.4" + +[[deps.DataStructures]] +deps = ["Compat", "InteractiveUtils", "OrderedCollections"] +git-tree-sha1 = "d1fff3a548102f48987a52a2e0d114fa97d730f0" +uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" +version = "0.18.13" + +[[deps.DataValueInterfaces]] +git-tree-sha1 = "bfc1187b79289637fa0ef6d4436ebdfe6905cbd6" +uuid = "e2d170a0-9d28-54be-80f0-106bbe20a464" +version = "1.0.0" + +[[deps.Dates]] +deps = ["Printf"] +uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" + +[[deps.DelayDiffEq]] +deps = ["ArrayInterface", "DataStructures", "DiffEqBase", "LinearAlgebra", "Logging", "NonlinearSolve", "OrdinaryDiffEq", "Printf", "RecursiveArrayTools", "Reexport", "SciMLBase", "UnPack"] +git-tree-sha1 = "65445e47be74d38ea9317995400f004bbbb1dd32" +uuid = "bcd4f6db-9728-5f36-b5f7-82caef46ccdb" +version = "5.37.1" + +[[deps.DelimitedFiles]] +deps = ["Mmap"] +uuid = "8bb1440f-4735-579b-a4ab-409b98df4dab" + +[[deps.DensityInterface]] +deps = ["InverseFunctions", "Test"] +git-tree-sha1 = "80c3e8639e3353e5d2912fb3a1916b8455e2494b" +uuid = "b429d917-457f-4dbc-8f4c-0cc954292b1d" +version = "0.4.0" + +[[deps.DiffEqBase]] +deps = ["ArrayInterfaceCore", "ChainRulesCore", "DataStructures", "Distributions", "DocStringExtensions", "FastBroadcast", "ForwardDiff", "FunctionWrappers", "FunctionWrappersWrappers", "LinearAlgebra", "Logging", "MuladdMacro", "NonlinearSolve", "Parameters", "Printf", "RecursiveArrayTools", "Reexport", "Requires", "SciMLBase", "Setfield", "SparseArrays", "Static", "StaticArrays", "Statistics", "ZygoteRules"] +git-tree-sha1 = "7ba58a5d9b4aeb7981dba2d68e6224f4809bb5d5" +uuid = "2b5f629d-d688-5b77-993f-72d75c75574e" +version = "6.97.1" + +[[deps.DiffEqCallbacks]] +deps = ["DataStructures", "DiffEqBase", "ForwardDiff", "LinearAlgebra", "Markdown", "NLsolve", "Parameters", "RecipesBase", "RecursiveArrayTools", "SciMLBase", "StaticArrays"] +git-tree-sha1 = "f8cc1ad62a87988225a07524ef84c7df7264c232" +uuid = "459566f4-90b8-5000-8ac3-15dfb0a30def" +version = "2.24.1" + +[[deps.DiffEqJump]] +deps = ["ArrayInterfaceCore", "DataStructures", "DiffEqBase", "DocStringExtensions", "FunctionWrappers", "Graphs", "LinearAlgebra", "Markdown", "PoissonRandom", "Random", "RandomNumbers", "RecursiveArrayTools", "Reexport", "SciMLBase", "StaticArrays", "TreeViews", "UnPack"] +git-tree-sha1 = "de3014a7c8b4f84d22715a43fe6c58e1c35dc998" +uuid = "c894b116-72e5-5b58-be3c-e6d8d4ac2b12" +version = "8.6.3" + +[[deps.DiffEqNoiseProcess]] +deps = ["DiffEqBase", "Distributions", "GPUArraysCore", "LinearAlgebra", "Markdown", "Optim", "PoissonRandom", "QuadGK", "Random", "Random123", "RandomNumbers", "RecipesBase", "RecursiveArrayTools", "ResettableStacks", "SciMLBase", "StaticArrays", "Statistics"] +git-tree-sha1 = "70590eb0a968cb0a801945c4c26dacca162bbbd3" +uuid = "77a26b50-5914-5dd7-bc55-306e6241c503" +version = "5.12.3" + +[[deps.DiffResults]] +deps = ["StaticArrays"] +git-tree-sha1 = "c18e98cba888c6c25d1c3b048e4b3380ca956805" +uuid = "163ba53b-c6d8-5494-b064-1a9d43ac40c5" +version = "1.0.3" + +[[deps.DiffRules]] +deps = ["IrrationalConstants", "LogExpFunctions", "NaNMath", "Random", "SpecialFunctions"] +git-tree-sha1 = "28d605d9a0ac17118fe2c5e9ce0fbb76c3ceb120" +uuid = "b552c78f-8df3-52c6-915a-8e097449b14b" +version = "1.11.0" + +[[deps.DifferentialEquations]] +deps = ["BoundaryValueDiffEq", "DelayDiffEq", "DiffEqBase", "DiffEqCallbacks", "DiffEqJump", "DiffEqNoiseProcess", "LinearAlgebra", "LinearSolve", "OrdinaryDiffEq", "Random", "RecursiveArrayTools", "Reexport", "SteadyStateDiffEq", "StochasticDiffEq", "Sundials"] +git-tree-sha1 = "3f3db9365fedd5fdbecebc3cce86dfdfe5c43c50" +uuid = "0c46a032-eb83-5123-abaf-570d42b7fbaa" +version = "7.1.0" + +[[deps.Distances]] +deps = ["LinearAlgebra", "SparseArrays", "Statistics", "StatsAPI"] +git-tree-sha1 = "3258d0659f812acde79e8a74b11f17ac06d0ca04" +uuid = "b4f34e82-e78d-54a5-968a-f98e89d6e8f7" +version = "0.10.7" + +[[deps.Distributed]] +deps = ["Random", "Serialization", "Sockets"] +uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" + +[[deps.Distributions]] +deps = ["ChainRulesCore", "DensityInterface", "FillArrays", "LinearAlgebra", "PDMats", "Printf", "QuadGK", "Random", "SparseArrays", "SpecialFunctions", "Statistics", "StatsBase", "StatsFuns", "Test"] +git-tree-sha1 = "334a5896c1534bb1aa7aa2a642d30ba7707357ef" +uuid = "31c24e10-a181-5473-b8eb-7969acd0382f" +version = "0.25.68" + +[[deps.DocStringExtensions]] +deps = ["LibGit2"] +git-tree-sha1 = "5158c2b41018c5f7eb1470d558127ac274eca0c9" +uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" +version = "0.9.1" + +[[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.EarCut_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "3f3a2501fa7236e9b911e0f7a588c657e822bb6d" +uuid = "5ae413db-bbd1-5e63-b57d-d24a61df00f5" +version = "2.2.3+0" + +[[deps.Expat_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "bad72f730e9e91c08d9427d5e8db95478a3c323d" +uuid = "2e619515-83b5-522b-bb60-26c02a35a201" +version = "2.4.8+0" + +[[deps.ExponentialUtilities]] +deps = ["ArrayInterfaceCore", "GPUArraysCore", "GenericSchur", "LinearAlgebra", "Printf", "SparseArrays", "libblastrampoline_jll"] +git-tree-sha1 = "b40c9037e1a33990466bc5d224ced34b34eebdb0" +uuid = "d4d017d3-3776-5f7e-afef-a10c40355c18" +version = "1.18.0" + +[[deps.Extents]] +git-tree-sha1 = "5e1e4c53fa39afe63a7d356e30452249365fba99" +uuid = "411431e0-e8b7-467b-b5e0-f676ba4f2910" +version = "0.1.1" + +[[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", "Pkg", "Zlib_jll", "libaom_jll", "libass_jll", "libfdk_aac_jll", "libvorbis_jll", "x264_jll", "x265_jll"] +git-tree-sha1 = "74faea50c1d007c85837327f6775bea60b5492dd" +uuid = "b22a6f82-2f65-5046-a5b2-351ab43fb4e5" +version = "4.4.2+2" + +[[deps.FFTViews]] +deps = ["CustomUnitRanges", "FFTW"] +git-tree-sha1 = "cbdf14d1e8c7c8aacbe8b19862e0179fd08321c2" +uuid = "4f61f5a4-77b1-5117-aa51-3ab5ef4ef0cd" +version = "0.3.2" + +[[deps.FFTW]] +deps = ["AbstractFFTs", "FFTW_jll", "LinearAlgebra", "MKL_jll", "Preferences", "Reexport"] +git-tree-sha1 = "90630efff0894f8142308e334473eba54c433549" +uuid = "7a1cc6ca-52ef-59f5-83cd-3a7055c09341" +version = "1.5.0" + +[[deps.FFTW_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "c6033cc3892d0ef5bb9cd29b7f2f0331ea5184ea" +uuid = "f5851436-0d7a-5f13-b9de-f02708fd171a" +version = "3.3.10+0" + +[[deps.FastBroadcast]] +deps = ["ArrayInterface", "ArrayInterfaceCore", "LinearAlgebra", "Polyester", "Static", "StrideArraysCore"] +git-tree-sha1 = "21cdeff41e5a1822c2acd7fc7934c5f450588e00" +uuid = "7034ab61-46d4-4ed7-9d0f-46aef9175898" +version = "0.2.1" + +[[deps.FastClosures]] +git-tree-sha1 = "acebe244d53ee1b461970f8910c235b259e772ef" +uuid = "9aa1b823-49e4-5ca5-8b0f-3971ec8bab6a" +version = "0.3.2" + +[[deps.FastLapackInterface]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "25ff6094a718c5dd0996c04d9e52eb2def86c4e3" +uuid = "29a986be-02c6-4525-aec4-84b980013641" +version = "1.2.5" + +[[deps.FileIO]] +deps = ["Pkg", "Requires", "UUIDs"] +git-tree-sha1 = "94f5101b96d2d968ace56f7f2db19d0a5f592e28" +uuid = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" +version = "1.15.0" + +[[deps.FilePathsBase]] +deps = ["Compat", "Dates", "Mmap", "Printf", "Test", "UUIDs"] +git-tree-sha1 = "129b104185df66e408edd6625d480b7f9e9823a0" +uuid = "48062228-2e41-5def-b9a4-89aafe57970f" +version = "0.9.18" + +[[deps.FileWatching]] +uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" + +[[deps.FillArrays]] +deps = ["LinearAlgebra", "Random", "SparseArrays", "Statistics"] +git-tree-sha1 = "246621d23d1f43e3b9c368bf3b72b2331a27c286" +uuid = "1a297f60-69ca-5386-bcde-b61e274b549b" +version = "0.13.2" + +[[deps.FiniteDiff]] +deps = ["ArrayInterfaceCore", "LinearAlgebra", "Requires", "Setfield", "SparseArrays", "StaticArrays"] +git-tree-sha1 = "5a2cff9b6b77b33b89f3d97a4d367747adce647e" +uuid = "6a86dc24-6348-571c-b903-95158fe2bd41" +version = "2.15.0" + +[[deps.FixedPointNumbers]] +deps = ["Statistics"] +git-tree-sha1 = "335bfdceacc84c5cdf16aadc768aa5ddfc5383cc" +uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" +version = "0.8.4" + +[[deps.Fontconfig_jll]] +deps = ["Artifacts", "Bzip2_jll", "Expat_jll", "FreeType2_jll", "JLLWrappers", "Libdl", "Libuuid_jll", "Pkg", "Zlib_jll"] +git-tree-sha1 = "21efd19106a55620a188615da6d3d06cd7f6ee03" +uuid = "a3f928ae-7b40-5064-980b-68af3947d34b" +version = "2.13.93+0" + +[[deps.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", "StaticArrays"] +git-tree-sha1 = "187198a4ed8ccd7b5d99c41b69c679269ea2b2d4" +uuid = "f6369f11-7733-5829-9624-2563aa707210" +version = "0.10.32" + +[[deps.FreeType2_jll]] +deps = ["Artifacts", "Bzip2_jll", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] +git-tree-sha1 = "87eb71354d8ec1a96d4a7636bd57a7347dde3ef9" +uuid = "d7e528f0-a631-5988-bf34-fe36492bcfd7" +version = "2.10.4+0" + +[[deps.FriBidi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "aa31987c2ba8704e23c6c8ba8a4f769d5d7e4f91" +uuid = "559328eb-81f9-559d-9380-de523a88c83c" +version = "1.0.10+0" + +[[deps.FunctionWrappers]] +git-tree-sha1 = "241552bc2209f0fa068b6415b1942cc0aa486bcc" +uuid = "069b7b12-0de2-55c6-9aab-29f3d0a68a2e" +version = "1.1.2" + +[[deps.FunctionWrappersWrappers]] +deps = ["FunctionWrappers"] +git-tree-sha1 = "2da4f223fbc4328b389bcce5f3e93dbe71678590" +uuid = "77dc65aa-8811-40c2-897b-53d922fa7daf" +version = "0.1.0" + +[[deps.Future]] +deps = ["Random"] +uuid = "9fa8497b-333b-5362-9e8d-4d0656e87820" + +[[deps.GLFW_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libglvnd_jll", "Pkg", "Xorg_libXcursor_jll", "Xorg_libXi_jll", "Xorg_libXinerama_jll", "Xorg_libXrandr_jll"] +git-tree-sha1 = "d972031d28c8c8d9d7b41a536ad7bb0c2579caca" +uuid = "0656b61e-2033-5cc2-a64a-77c0f6c09b89" +version = "3.3.8+0" + +[[deps.GPUArraysCore]] +deps = ["Adapt"] +git-tree-sha1 = "6872f5ec8fd1a38880f027a26739d42dcda6691f" +uuid = "46192b85-c4d5-4398-a991-12ede77f4527" +version = "0.1.2" + +[[deps.GR]] +deps = ["Base64", "DelimitedFiles", "GR_jll", "HTTP", "JSON", "Libdl", "LinearAlgebra", "Pkg", "Printf", "Random", "RelocatableFolders", "Serialization", "Sockets", "Test", "UUIDs"] +git-tree-sha1 = "c98aea696662d09e215ef7cda5296024a9646c75" +uuid = "28b8d3ca-fb5f-59d9-8090-bfdbd6d07a71" +version = "0.64.4" + +[[deps.GR_jll]] +deps = ["Artifacts", "Bzip2_jll", "Cairo_jll", "FFMPEG_jll", "Fontconfig_jll", "GLFW_jll", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Libtiff_jll", "Pixman_jll", "Pkg", "Qt5Base_jll", "Zlib_jll", "libpng_jll"] +git-tree-sha1 = "2d908286d120c584abbe7621756c341707096ba4" +uuid = "d2c73de3-f751-5644-a686-071e5b155ba9" +version = "0.66.2+0" + +[[deps.GenericSchur]] +deps = ["LinearAlgebra", "Printf"] +git-tree-sha1 = "fb69b2a645fa69ba5f474af09221b9308b160ce6" +uuid = "c145ed77-6b09-5dd9-b285-bf645a82121e" +version = "0.5.3" + +[[deps.GeoInterface]] +deps = ["Extents"] +git-tree-sha1 = "fb28b5dc239d0174d7297310ef7b84a11804dfab" +uuid = "cf35fbd7-0cd7-5166-be24-54bfbe79505f" +version = "1.0.1" + +[[deps.GeometryBasics]] +deps = ["EarCut_jll", "GeoInterface", "IterTools", "LinearAlgebra", "StaticArrays", "StructArrays", "Tables"] +git-tree-sha1 = "a7a97895780dab1085a97769316aa348830dc991" +uuid = "5c1252a2-5f33-56bf-86c9-59e7332b4326" +version = "0.4.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.Ghostscript_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "78e2c69783c9753a91cdae88a8d432be85a2ab5e" +uuid = "61579ee1-b43e-5ca0-a5da-69d92c66a64b" +version = "9.55.0+0" + +[[deps.Glib_jll]] +deps = ["Artifacts", "Gettext_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Libiconv_jll", "Libmount_jll", "PCRE_jll", "Pkg", "Zlib_jll"] +git-tree-sha1 = "a32d672ac2c967f3deb8a81d828afc739c838a06" +uuid = "7746bdde-850d-59dc-9ae8-88ece973131d" +version = "2.68.3+2" + +[[deps.Graphics]] +deps = ["Colors", "LinearAlgebra", "NaNMath"] +git-tree-sha1 = "d61890399bc535850c4bf08e4e0d3a7ad0f21cbd" +uuid = "a2bd30eb-e257-5431-a919-1863eab51364" +version = "1.1.2" + +[[deps.Graphite2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "344bf40dcab1073aca04aa0df4fb092f920e4011" +uuid = "3b182d85-2403-5c21-9c21-1e1f0cc25472" +version = "1.3.14+0" + +[[deps.Graphs]] +deps = ["ArnoldiMethod", "Compat", "DataStructures", "Distributed", "Inflate", "LinearAlgebra", "Random", "SharedArrays", "SimpleTraits", "SparseArrays", "Statistics"] +git-tree-sha1 = "a6d30bdc378d340912f48abf01281aab68c0dec8" +uuid = "86223c79-3864-5bf0-83f7-82e725a168b6" +version = "1.7.2" + +[[deps.Grisu]] +git-tree-sha1 = "53bb909d1151e57e2484c3d1b53e19552b887fb2" +uuid = "42e2da0e-8278-4e71-bc24-59509adca0fe" +version = "1.0.2" + +[[deps.HTTP]] +deps = ["Base64", "Dates", "IniFile", "Logging", "MbedTLS", "NetworkOptions", "Sockets", "URIs"] +git-tree-sha1 = "0fa77022fe4b511826b39c894c90daf5fce3334a" +uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3" +version = "0.9.17" + +[[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 = "b7b88a4716ac33fe31d6556c02fc60017594343c" +uuid = "3e5b6fbb-0976-4d2c-9146-d79de83f2fb0" +version = "0.1.8" + +[[deps.HypergeometricFunctions]] +deps = ["DualNumbers", "LinearAlgebra", "OpenLibm_jll", "SpecialFunctions", "Test"] +git-tree-sha1 = "709d864e3ed6e3545230601f94e11ebc65994641" +uuid = "34004b35-14d8-5ef3-9330-4cdb6864b03a" +version = "0.3.11" + +[[deps.Hyperscript]] +deps = ["Test"] +git-tree-sha1 = "8d511d5b81240fc8e6802386302675bdf47737b9" +uuid = "47d2ed2b-36de-50cf-bf87-49c2cf4b8b91" +version = "0.0.4" + +[[deps.HypertextLiteral]] +deps = ["Tricks"] +git-tree-sha1 = "c47c5fa4c5308f27ccaac35504858d8914e102f9" +uuid = "ac1192a8-f4b3-4bfe-ba22-af5b92cd3ab2" +version = "0.9.4" + +[[deps.IOCapture]] +deps = ["Logging", "Random"] +git-tree-sha1 = "f7be53659ab06ddc986428d3a9dcc95f6fa6705a" +uuid = "b5f81e59-6552-4d32-b1f0-c071b021bf89" +version = "0.2.2" + +[[deps.IfElse]] +git-tree-sha1 = "debdd00ffef04665ccbb3e150747a77560e8fad1" +uuid = "615f187c-cbe4-4ef1-ba3b-2fcf58d6d173" +version = "0.1.1" + +[[deps.ImageAxes]] +deps = ["AxisArrays", "ImageBase", "ImageCore", "Reexport", "SimpleTraits"] +git-tree-sha1 = "c54b581a83008dc7f292e205f4c409ab5caa0f04" +uuid = "2803e5a7-5153-5ecf-9a86-9b4c37f5f5ac" +version = "0.6.10" + +[[deps.ImageBase]] +deps = ["ImageCore", "Reexport"] +git-tree-sha1 = "b51bb8cae22c66d0f6357e3bcb6363145ef20835" +uuid = "c817782e-172a-44cc-b673-b171935fbb9e" +version = "0.1.5" + +[[deps.ImageContrastAdjustment]] +deps = ["ImageCore", "ImageTransformations", "Parameters"] +git-tree-sha1 = "0d75cafa80cf22026cea21a8e6cf965295003edc" +uuid = "f332f351-ec65-5f6a-b3d1-319c6670881a" +version = "0.3.10" + +[[deps.ImageCore]] +deps = ["AbstractFFTs", "ColorVectorSpace", "Colors", "FixedPointNumbers", "Graphics", "MappedArrays", "MosaicViews", "OffsetArrays", "PaddedViews", "Reexport"] +git-tree-sha1 = "acf614720ef026d38400b3817614c45882d75500" +uuid = "a09fc81d-aa75-5fe9-8630-4744c3626534" +version = "0.9.4" + +[[deps.ImageDistances]] +deps = ["Distances", "ImageCore", "ImageMorphology", "LinearAlgebra", "Statistics"] +git-tree-sha1 = "b1798a4a6b9aafb530f8f0c4a7b2eb5501e2f2a3" +uuid = "51556ac3-7006-55f5-8cb3-34580c88182d" +version = "0.2.16" + +[[deps.ImageFiltering]] +deps = ["CatIndices", "ComputationalResources", "DataStructures", "FFTViews", "FFTW", "ImageBase", "ImageCore", "LinearAlgebra", "OffsetArrays", "Reexport", "SparseArrays", "StaticArrays", "Statistics", "TiledIteration"] +git-tree-sha1 = "15bd05c1c0d5dbb32a9a3d7e0ad2d50dd6167189" +uuid = "6a3955dd-da59-5b1f-98d4-e7296123deb5" +version = "0.7.1" + +[[deps.ImageIO]] +deps = ["FileIO", "IndirectArrays", "JpegTurbo", "LazyModules", "Netpbm", "OpenEXR", "PNGFiles", "QOI", "Sixel", "TiffImages", "UUIDs"] +git-tree-sha1 = "342f789fd041a55166764c351da1710db97ce0e0" +uuid = "82e4d734-157c-48bb-816b-45c225c6df19" +version = "0.6.6" + +[[deps.ImageMagick]] +deps = ["FileIO", "ImageCore", "ImageMagick_jll", "InteractiveUtils", "Libdl", "Pkg", "Random"] +git-tree-sha1 = "5bc1cb62e0c5f1005868358db0692c994c3a13c6" +uuid = "6218d12a-5da1-5696-b52f-db25d2ecc6d1" +version = "1.2.1" + +[[deps.ImageMagick_jll]] +deps = ["Artifacts", "Ghostscript_jll", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Libtiff_jll", "Pkg", "Zlib_jll", "libpng_jll"] +git-tree-sha1 = "124626988534986113cfd876e3093e4a03890f58" +uuid = "c73af94c-d91f-53ed-93a7-00f77d67a9d7" +version = "6.9.12+3" + +[[deps.ImageMetadata]] +deps = ["AxisArrays", "ImageAxes", "ImageBase", "ImageCore"] +git-tree-sha1 = "36cbaebed194b292590cba2593da27b34763804a" +uuid = "bc367c6b-8a6b-528e-b4bd-a4b897500b49" +version = "0.9.8" + +[[deps.ImageMorphology]] +deps = ["ImageCore", "LinearAlgebra", "Requires", "TiledIteration"] +git-tree-sha1 = "e7c68ab3df4a75511ba33fc5d8d9098007b579a8" +uuid = "787d08f9-d448-5407-9aad-5290dd7ab264" +version = "0.3.2" + +[[deps.ImageQualityIndexes]] +deps = ["ImageContrastAdjustment", "ImageCore", "ImageDistances", "ImageFiltering", "LazyModules", "OffsetArrays", "Statistics"] +git-tree-sha1 = "0c703732335a75e683aec7fdfc6d5d1ebd7c596f" +uuid = "2996bd0c-7a13-11e9-2da2-2f5ce47296a9" +version = "0.3.3" + +[[deps.ImageSegmentation]] +deps = ["Clustering", "DataStructures", "Distances", "Graphs", "ImageCore", "ImageFiltering", "ImageMorphology", "LinearAlgebra", "MetaGraphs", "RegionTrees", "SimpleWeightedGraphs", "StaticArrays", "Statistics"] +git-tree-sha1 = "36832067ea220818d105d718527d6ed02385bf22" +uuid = "80713f31-8817-5129-9cf8-209ff8fb23e1" +version = "1.7.0" + +[[deps.ImageShow]] +deps = ["Base64", "FileIO", "ImageBase", "ImageCore", "OffsetArrays", "StackViews"] +git-tree-sha1 = "b563cf9ae75a635592fc73d3eb78b86220e55bd8" +uuid = "4e3cecfd-b093-5904-9786-8bbb286a6a31" +version = "0.3.6" + +[[deps.ImageTransformations]] +deps = ["AxisAlgorithms", "ColorVectorSpace", "CoordinateTransformations", "ImageBase", "ImageCore", "Interpolations", "OffsetArrays", "Rotations", "StaticArrays"] +git-tree-sha1 = "8717482f4a2108c9358e5c3ca903d3a6113badc9" +uuid = "02fcd773-0e25-5acc-982a-7f6622650795" +version = "0.9.5" + +[[deps.Images]] +deps = ["Base64", "FileIO", "Graphics", "ImageAxes", "ImageBase", "ImageContrastAdjustment", "ImageCore", "ImageDistances", "ImageFiltering", "ImageIO", "ImageMagick", "ImageMetadata", "ImageMorphology", "ImageQualityIndexes", "ImageSegmentation", "ImageShow", "ImageTransformations", "IndirectArrays", "IntegralArrays", "Random", "Reexport", "SparseArrays", "StaticArrays", "Statistics", "StatsBase", "TiledIteration"] +git-tree-sha1 = "03d1301b7ec885b266c0f816f338368c6c0b81bd" +uuid = "916415d5-f1e6-5110-898d-aaa5f9f070e0" +version = "0.25.2" + +[[deps.Imath_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "87f7662e03a649cffa2e05bf19c303e168732d3e" +uuid = "905a6f67-0a94-5f89-b386-d35d92009cd1" +version = "3.1.2+0" + +[[deps.IndirectArrays]] +git-tree-sha1 = "012e604e1c7458645cb8b436f8fba789a51b257f" +uuid = "9b13fd28-a010-5f03-acff-a1bbcff69959" +version = "1.0.0" + +[[deps.Inflate]] +git-tree-sha1 = "5cd07aab533df5170988219191dfad0519391428" +uuid = "d25df0c9-e2be-5dd7-82c8-3ad0b3e990b9" +version = "0.1.3" + +[[deps.IniFile]] +git-tree-sha1 = "f550e6e32074c939295eb5ea6de31849ac2c9625" +uuid = "83e8ac13-25f8-5344-8a64-a9f2b223428f" +version = "0.5.1" + +[[deps.InlineStrings]] +deps = ["Parsers"] +git-tree-sha1 = "d19f9edd8c34760dca2de2b503f969d8700ed288" +uuid = "842dd82b-1e85-43dc-bf29-5d0ee9dffc48" +version = "1.1.4" + +[[deps.IntegralArrays]] +deps = ["ColorTypes", "FixedPointNumbers", "IntervalSets"] +git-tree-sha1 = "be8e690c3973443bec584db3346ddc904d4884eb" +uuid = "1d092043-8f09-5a30-832f-7509e371ab51" +version = "0.1.5" + +[[deps.IntelOpenMP_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "d979e54b71da82f3a65b62553da4fc3d18c9004c" +uuid = "1d5cc7b8-4909-519e-a0f8-d0f5ad9712d0" +version = "2018.0.3+2" + +[[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 = "64f138f9453a018c8f3562e7bae54edc059af249" +uuid = "a98d9a8b-a2ab-59e6-89dd-64a1c18fca59" +version = "0.14.4" + +[[deps.IntervalSets]] +deps = ["Dates", "Random", "Statistics"] +git-tree-sha1 = "076bb0da51a8c8d1229936a1af7bdfacd65037e1" +uuid = "8197267c-284f-5f27-9208-e0e47529a953" +version = "0.7.2" + +[[deps.InverseFunctions]] +deps = ["Test"] +git-tree-sha1 = "b3364212fb5d870f724876ffcd34dd8ec6d98918" +uuid = "3587e190-3f89-42d0-90ee-14403ec27112" +version = "0.1.7" + +[[deps.InvertedIndices]] +git-tree-sha1 = "bee5f1ef5bf65df56bdd2e40447590b272a5471f" +uuid = "41ab1584-1d38-5bbf-9106-f11c6c58b48f" +version = "1.1.0" + +[[deps.IrrationalConstants]] +git-tree-sha1 = "7fd44fd4ff43fc60815f8e764c0f352b83c49151" +uuid = "92d709cd-6900-40b7-9082-c6be49f344b6" +version = "0.1.1" + +[[deps.IterTools]] +git-tree-sha1 = "fa6287a4469f5e048d763df38279ee729fbd44e5" +uuid = "c8e1da08-722c-5040-9ed9-7db0dc04731e" +version = "1.4.0" + +[[deps.IterativeSolvers]] +deps = ["LinearAlgebra", "Printf", "Random", "RecipesBase", "SparseArrays"] +git-tree-sha1 = "1169632f425f79429f245113b775a0e3d121457c" +uuid = "42fd0dbc-a981-5370-80f2-aaf504508153" +version = "0.9.2" + +[[deps.IteratorInterfaceExtensions]] +git-tree-sha1 = "a3f24677c21f5bbe9d2a714f95dcd58337fb2856" +uuid = "82899510-4779-5014-852e-03e436cf321d" +version = "1.0.0" + +[[deps.JLD2]] +deps = ["FileIO", "MacroTools", "Mmap", "OrderedCollections", "Pkg", "Printf", "Reexport", "TranscodingStreams", "UUIDs"] +git-tree-sha1 = "81b9477b49402b47fbe7f7ae0b252077f53e4a08" +uuid = "033835bb-8acc-5ee8-8aae-3f567f8a3819" +version = "0.4.22" + +[[deps.JLLWrappers]] +deps = ["Preferences"] +git-tree-sha1 = "abc9885a7ca2052a736a600f7fa66209f96506e1" +uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" +version = "1.4.1" + +[[deps.JSON]] +deps = ["Dates", "Mmap", "Parsers", "Unicode"] +git-tree-sha1 = "3c837543ddb02250ef42f4738347454f95079d4e" +uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" +version = "0.21.3" + +[[deps.JpegTurbo]] +deps = ["CEnum", "FileIO", "ImageCore", "JpegTurbo_jll", "TOML"] +git-tree-sha1 = "a77b273f1ddec645d1b7c4fd5fb98c8f90ad10a5" +uuid = "b835a17e-a41a-41e7-81f0-2f016b05efe0" +version = "0.1.1" + +[[deps.JpegTurbo_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "b53380851c6e6664204efb2e62cd24fa5c47e4ba" +uuid = "aacddb02-875f-59d6-b918-886e6ef4fbf8" +version = "2.1.2+0" + +[[deps.JumpProcesses]] +deps = ["ArrayInterfaceCore", "DataStructures", "DiffEqBase", "DocStringExtensions", "FunctionWrappers", "Graphs", "LinearAlgebra", "Markdown", "PoissonRandom", "Random", "RandomNumbers", "RecursiveArrayTools", "Reexport", "SciMLBase", "StaticArrays", "TreeViews", "UnPack"] +git-tree-sha1 = "516d2041c7d95b14bc845888daa02ee8aa97550b" +uuid = "ccbc3e58-028d-4f4c-8cd5-9ae44345cda5" +version = "9.1.3" + +[[deps.KLU]] +deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse_jll"] +git-tree-sha1 = "cae5e3dfd89b209e01bcd65b3a25e74462c67ee0" +uuid = "ef3ab10e-7fda-4108-b977-705223b18434" +version = "0.3.0" + +[[deps.Krylov]] +deps = ["LinearAlgebra", "Printf", "SparseArrays"] +git-tree-sha1 = "a2327039e1c84615e22d662adb3df113caf44b70" +uuid = "ba0b0d4f-ebba-5204-a429-3ac8c609bfb7" +version = "0.8.3" + +[[deps.KrylovKit]] +deps = ["LinearAlgebra", "Printf"] +git-tree-sha1 = "49b0c1dd5c292870577b8f58c51072bd558febb9" +uuid = "0b1a1467-8014-51b9-945f-bf0ae24f4b77" +version = "0.5.4" + +[[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.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 = "f2355693d6778a178ade15952b7ac47a4ff97996" +uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" +version = "1.3.0" + +[[deps.Latexify]] +deps = ["Formatting", "InteractiveUtils", "LaTeXStrings", "MacroTools", "Markdown", "Printf", "Requires"] +git-tree-sha1 = "1a43be956d433b5d0321197150c2f94e16c0aaa0" +uuid = "23fbe1c1-3f47-55db-b15f-69d7ec21a316" +version = "0.15.16" + +[[deps.LayoutPointers]] +deps = ["ArrayInterface", "ArrayInterfaceOffsetArrays", "ArrayInterfaceStaticArrays", "LinearAlgebra", "ManualMemory", "SIMDTypes", "Static"] +git-tree-sha1 = "b67e749fb35530979839e7b4b606a97105fe4f1c" +uuid = "10f19ff3-798f-405d-979b-55457f8fc047" +version = "0.1.10" + +[[deps.LazyArtifacts]] +deps = ["Artifacts", "Pkg"] +uuid = "4af54fe1-eca0-43a8-85a7-787d91b784e3" + +[[deps.LazyModules]] +git-tree-sha1 = "a560dd966b386ac9ae60bdd3a3d3a326062d3c3e" +uuid = "8cdb02fc-e678-4876-92c5-9defec4f444e" +version = "0.3.1" + +[[deps.LevyArea]] +deps = ["LinearAlgebra", "Random", "SpecialFunctions"] +git-tree-sha1 = "56513a09b8e0ae6485f34401ea9e2f31357958ec" +uuid = "2d8b4e74-eb68-11e8-0fb9-d5eb67b50637" +version = "1.0.0" + +[[deps.LibCURL]] +deps = ["LibCURL_jll", "MozillaCACerts_jll"] +uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" +version = "0.6.3" + +[[deps.LibCURL_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] +uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" +version = "7.84.0+0" + +[[deps.LibGit2]] +deps = ["Base64", "NetworkOptions", "Printf", "SHA"] +uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" + +[[deps.LibSSH2_jll]] +deps = ["Artifacts", "Libdl", "MbedTLS_jll"] +uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" +version = "1.10.2+0" + +[[deps.Libdl]] +uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" + +[[deps.Libffi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "0b4a5d71f3e5200a7dff793393e09dfc2d874290" +uuid = "e9f186c6-92d2-5b65-8a66-fee21dc1b490" +version = "3.2.2+1" + +[[deps.Libgcrypt_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgpg_error_jll", "Pkg"] +git-tree-sha1 = "64613c82a59c120435c067c2b809fc61cf5166ae" +uuid = "d4300ac3-e22c-5743-9152-c294e39db1e4" +version = "1.8.7+0" + +[[deps.Libglvnd_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll", "Xorg_libXext_jll"] +git-tree-sha1 = "7739f837d6447403596a75d19ed01fd08d6f56bf" +uuid = "7e76a0d4-f3c7-5321-8279-8d96eeed0f29" +version = "1.3.0+3" + +[[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", "Pkg"] +git-tree-sha1 = "42b62845d70a619f063a7da093d995ec8e15e778" +uuid = "94ce4f54-9a6c-5748-9c1c-f9c7231a4531" +version = "1.16.1+1" + +[[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", "Pkg", "Zlib_jll", "Zstd_jll"] +git-tree-sha1 = "3eb79b0ca5764d4799c06699573fd8f533259713" +uuid = "89763e89-9b03-5906-acba-b20f662cd828" +version = "4.4.0+0" + +[[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", "libblastrampoline_jll"] +uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + +[[deps.LinearSolve]] +deps = ["ArrayInterfaceCore", "DocStringExtensions", "FastLapackInterface", "GPUArraysCore", "IterativeSolvers", "KLU", "Krylov", "KrylovKit", "LinearAlgebra", "RecursiveFactorization", "Reexport", "SciMLBase", "Setfield", "SparseArrays", "SuiteSparse", "UnPack"] +git-tree-sha1 = "c48c190442b22c94499a446b8b452f16d04a258c" +uuid = "7ed4a6bd-45f5-4d41-b270-4a48e9bafcae" +version = "1.23.3" + +[[deps.LogExpFunctions]] +deps = ["ChainRulesCore", "ChangesOfVariables", "DocStringExtensions", "InverseFunctions", "IrrationalConstants", "LinearAlgebra"] +git-tree-sha1 = "94d9c52ca447e23eac0c0f074effbcd38830deb5" +uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688" +version = "0.3.18" + +[[deps.Logging]] +uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" + +[[deps.LoopVectorization]] +deps = ["ArrayInterface", "ArrayInterfaceCore", "ArrayInterfaceOffsetArrays", "ArrayInterfaceStaticArrays", "CPUSummary", "ChainRulesCore", "CloseOpenIntervals", "DocStringExtensions", "ForwardDiff", "HostCPUFeatures", "IfElse", "LayoutPointers", "LinearAlgebra", "OffsetArrays", "PolyesterWeave", "SIMDDualNumbers", "SIMDTypes", "SLEEFPirates", "SnoopPrecompile", "SpecialFunctions", "Static", "ThreadingUtilities", "UnPack", "VectorizationBase"] +git-tree-sha1 = "60613258cc56b6c7c909f3e960e8b3b4e86dc2f2" +uuid = "bdcacae8-1622-11e9-2a5c-532679323890" +version = "0.12.124" + +[[deps.MKL_jll]] +deps = ["Artifacts", "IntelOpenMP_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "Pkg"] +git-tree-sha1 = "e595b205efd49508358f7dc670a940c790204629" +uuid = "856f044c-d86e-5d09-b602-aeab76dc8ba7" +version = "2022.0.0+0" + +[[deps.MacroTools]] +deps = ["Markdown", "Random"] +git-tree-sha1 = "3d3e902b31198a27340d0bf00d6ac452866021cf" +uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" +version = "0.5.9" + +[[deps.ManualMemory]] +git-tree-sha1 = "bcaef4fc7a0cfe2cba636d84cda54b5e4e4ca3cd" +uuid = "d125e4d3-2237-4719-b19c-fa641b8a4667" +version = "0.1.8" + +[[deps.MappedArrays]] +git-tree-sha1 = "e8b359ef06ec72e8c030463fe02efe5527ee5142" +uuid = "dbb5928d-eab1-5f90-85c2-b9b0edb7c900" +version = "0.4.1" + +[[deps.Markdown]] +deps = ["Base64"] +uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" + +[[deps.MbedTLS]] +deps = ["Dates", "MbedTLS_jll", "MozillaCACerts_jll", "Random", "Sockets"] +git-tree-sha1 = "d9ab10da9de748859a7780338e1d6566993d1f25" +uuid = "739be429-bea8-5141-9913-cc70e7f3736d" +version = "1.1.3" + +[[deps.MbedTLS_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" +version = "2.28.0+0" + +[[deps.Measures]] +git-tree-sha1 = "e498ddeee6f9fdb4551ce855a46f54dbd900245f" +uuid = "442fdcdd-2543-5da2-b0f3-8c86c306513e" +version = "0.3.1" + +[[deps.MetaGraphs]] +deps = ["Graphs", "JLD2", "Random"] +git-tree-sha1 = "2af69ff3c024d13bde52b34a2a7d6887d4e7b438" +uuid = "626554b9-1ddb-594c-aa3c-2596fe9399a5" +version = "0.7.1" + +[[deps.Missings]] +deps = ["DataAPI"] +git-tree-sha1 = "bf210ce90b6c9eed32d25dbcae1ebc565df2687f" +uuid = "e1d29d7a-bbdc-5cf2-9ac0-f12de2c33e28" +version = "1.0.2" + +[[deps.Mmap]] +uuid = "a63ad114-7e13-5084-954f-fe012c677804" + +[[deps.MosaicViews]] +deps = ["MappedArrays", "OffsetArrays", "PaddedViews", "StackViews"] +git-tree-sha1 = "b34e3bc3ca7c94914418637cb10cc4d1d80d877d" +uuid = "e94cdb99-869f-56ef-bcf0-1ae2bcbe0389" +version = "0.3.3" + +[[deps.MozillaCACerts_jll]] +uuid = "14a3606d-f60d-562e-9121-12d972cd8159" +version = "2022.2.1" + +[[deps.MuladdMacro]] +git-tree-sha1 = "c6190f9a7fc5d9d5915ab29f2134421b12d24a68" +uuid = "46d2c3a1-f734-5fdb-9937-b9b9aeba4221" +version = "0.2.2" + +[[deps.NLSolversBase]] +deps = ["DiffResults", "Distributed", "FiniteDiff", "ForwardDiff"] +git-tree-sha1 = "50310f934e55e5ca3912fb941dec199b49ca9b68" +uuid = "d41bc354-129a-5804-8e4c-c37616107c6c" +version = "7.8.2" + +[[deps.NLsolve]] +deps = ["Distances", "LineSearches", "LinearAlgebra", "NLSolversBase", "Printf", "Reexport"] +git-tree-sha1 = "019f12e9a1a7880459d0173c182e6a99365d7ac1" +uuid = "2774e3e8-f4cf-5e23-947b-6d7e65073b56" +version = "4.5.1" + +[[deps.NaNMath]] +deps = ["OpenLibm_jll"] +git-tree-sha1 = "a7c3d1da1189a1c2fe843a3bfa04d18d20eb3211" +uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" +version = "1.0.1" + +[[deps.NearestNeighbors]] +deps = ["Distances", "StaticArrays"] +git-tree-sha1 = "0e353ed734b1747fc20cd4cba0edd9ac027eff6a" +uuid = "b8a86587-4115-5ab1-83bc-aa920d37bbce" +version = "0.4.11" + +[[deps.Netpbm]] +deps = ["FileIO", "ImageCore"] +git-tree-sha1 = "18efc06f6ec36a8b801b23f076e3c6ac7c3bf153" +uuid = "f09324ee-3d7c-5217-9330-fc30815ba969" +version = "1.0.2" + +[[deps.NetworkOptions]] +uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" +version = "1.2.0" + +[[deps.NonlinearSolve]] +deps = ["ArrayInterfaceCore", "FiniteDiff", "ForwardDiff", "IterativeSolvers", "LinearAlgebra", "RecursiveArrayTools", "RecursiveFactorization", "Reexport", "SciMLBase", "Setfield", "StaticArrays", "UnPack"] +git-tree-sha1 = "a754a21521c0ab48d37f44bbac1eefd1387bdcfc" +uuid = "8913a72c-1f9b-4ce2-8d82-65094dcecaec" +version = "0.3.22" + +[[deps.OffsetArrays]] +deps = ["Adapt"] +git-tree-sha1 = "1ea784113a6aa054c5ebd95945fa5e52c2f378e7" +uuid = "6fe1bfb0-de20-5000-8ca7-80f57d26f881" +version = "1.12.7" + +[[deps.Ogg_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "887579a3eb005446d514ab7aeac5d1d027658b8f" +uuid = "e7412a2a-1a6e-54c0-be00-318e2571c051" +version = "1.3.5+1" + +[[deps.OpenBLAS_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] +uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" +version = "0.3.20+0" + +[[deps.OpenEXR]] +deps = ["Colors", "FileIO", "OpenEXR_jll"] +git-tree-sha1 = "327f53360fdb54df7ecd01e96ef1983536d1e633" +uuid = "52e1d378-f018-4a11-a4be-720524705ac7" +version = "0.3.2" + +[[deps.OpenEXR_jll]] +deps = ["Artifacts", "Imath_jll", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] +git-tree-sha1 = "923319661e9a22712f24596ce81c54fc0366f304" +uuid = "18a262bb-aa17-5467-a713-aee519bc75cb" +version = "3.1.1+0" + +[[deps.OpenLibm_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "05823500-19ac-5b8b-9628-191a04bc5112" +version = "0.8.1+0" + +[[deps.OpenSSL_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "e60321e3f2616584ff98f0a4f18d98ae6f89bbb3" +uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95" +version = "1.1.17+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 = "7351d1daa3dad1bcf67c79d1ba34dd3f6136c9aa" +uuid = "429524aa-4258-5aef-a3af-852621145aeb" +version = "1.7.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 = "85f8e6578bf1f9ee0d11e7bb1b1456435479d47c" +uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" +version = "1.4.1" + +[[deps.OrdinaryDiffEq]] +deps = ["Adapt", "ArrayInterface", "ArrayInterfaceGPUArrays", "ArrayInterfaceStaticArrays", "DataStructures", "DiffEqBase", "DocStringExtensions", "ExponentialUtilities", "FastBroadcast", "FastClosures", "FiniteDiff", "ForwardDiff", "FunctionWrappersWrappers", "LinearAlgebra", "LinearSolve", "Logging", "LoopVectorization", "MacroTools", "MuladdMacro", "NLsolve", "NonlinearSolve", "Polyester", "PreallocationTools", "RecursiveArrayTools", "Reexport", "SciMLBase", "SnoopPrecompile", "SparseArrays", "SparseDiffTools", "StaticArrays", "UnPack"] +git-tree-sha1 = "b706c49554e69e4ffcb836e3a9b6e6850691c365" +uuid = "1dea7af3-3e70-54e6-95c3-0bf5283fa5ed" +version = "6.23.0" + +[[deps.PCRE2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "efcefdf7-47ab-520b-bdef-62a2eaa19f15" +version = "10.40.0+0" + +[[deps.PCRE_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "b2a7af664e098055a7529ad1a900ded962bca488" +uuid = "2f80f16e-611a-54ab-bc61-aa92de5b98fc" +version = "8.44.0+0" + +[[deps.PDMats]] +deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"] +git-tree-sha1 = "cf494dca75a69712a72b80bc48f59dcf3dea63ec" +uuid = "90014a1f-27ba-587c-ab20-58faa44d9150" +version = "0.11.16" + +[[deps.PNGFiles]] +deps = ["Base64", "CEnum", "ImageCore", "IndirectArrays", "OffsetArrays", "libpng_jll"] +git-tree-sha1 = "e925a64b8585aa9f4e3047b8d2cdc3f0e79fd4e4" +uuid = "f57f5aa1-a3ce-4bc8-8ab9-96f992907883" +version = "0.3.16" + +[[deps.PaddedViews]] +deps = ["OffsetArrays"] +git-tree-sha1 = "03a7a85b76381a3d04c7a1656039197e70eda03d" +uuid = "5432bcbf-9aad-5242-b902-cca2824c8663" +version = "0.5.11" + +[[deps.Parameters]] +deps = ["OrderedCollections", "UnPack"] +git-tree-sha1 = "34c0e9ad262e5f7fc75b10a9952ca7692cfc5fbe" +uuid = "d96e819e-fc66-5662-9728-84c9c7592b0a" +version = "0.12.3" + +[[deps.Parsers]] +deps = ["Dates"] +git-tree-sha1 = "0044b23da09b5608b4ecacb4e5e6c6332f833a7e" +uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" +version = "2.3.2" + +[[deps.Pixman_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "b4f5d02549a10e20780a24fce72bea96b6329e29" +uuid = "30392449-352a-5448-841d-b1acce4e97dc" +version = "0.40.1+0" + +[[deps.Pkg]] +deps = ["Artifacts", "Dates", "Downloads", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] +uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" +version = "1.8.0" + +[[deps.PkgVersion]] +deps = ["Pkg"] +git-tree-sha1 = "f6cf8e7944e50901594838951729a1861e668cb8" +uuid = "eebad327-c553-4316-9ea0-9fa01ccd7688" +version = "0.3.2" + +[[deps.PlotThemes]] +deps = ["PlotUtils", "Statistics"] +git-tree-sha1 = "8162b2f8547bc23876edd0c5181b27702ae58dce" +uuid = "ccf2f8ad-2431-5c83-bf29-c5338b663b6a" +version = "3.0.0" + +[[deps.PlotUtils]] +deps = ["ColorSchemes", "Colors", "Dates", "Printf", "Random", "Reexport", "Statistics"] +git-tree-sha1 = "9888e59493658e476d3073f1ce24348bdc086660" +uuid = "995b91a9-d308-5afd-9ec6-746e21dbc043" +version = "1.3.0" + +[[deps.Plots]] +deps = ["Base64", "Contour", "Dates", "Downloads", "FFMPEG", "FixedPointNumbers", "GR", "GeometryBasics", "JSON", "Latexify", "LinearAlgebra", "Measures", "NaNMath", "Pkg", "PlotThemes", "PlotUtils", "Printf", "REPL", "Random", "RecipesBase", "RecipesPipeline", "Reexport", "Requires", "Scratch", "Showoff", "SparseArrays", "Statistics", "StatsBase", "UUIDs", "UnicodeFun", "Unzip"] +git-tree-sha1 = "9e42de869561d6bdf8602c57ec557d43538a92f0" +uuid = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" +version = "1.29.1" + +[[deps.PlutoUI]] +deps = ["AbstractPlutoDingetjes", "Base64", "ColorTypes", "Dates", "Hyperscript", "HypertextLiteral", "IOCapture", "InteractiveUtils", "JSON", "Logging", "Markdown", "Random", "Reexport", "UUIDs"] +git-tree-sha1 = "8d1f54886b9037091edf146b517989fc4a09efec" +uuid = "7f904dfe-b85e-4ff6-b463-dae2292396a8" +version = "0.7.39" + +[[deps.PoissonRandom]] +deps = ["Random"] +git-tree-sha1 = "9ac1bb7c15c39620685a3a7babc0651f5c64c35b" +uuid = "e409e4f3-bfea-5376-8464-e040bb5c01ab" +version = "0.4.1" + +[[deps.Polyester]] +deps = ["ArrayInterface", "BitTwiddlingConvenienceFunctions", "CPUSummary", "IfElse", "ManualMemory", "PolyesterWeave", "Requires", "Static", "StrideArraysCore", "ThreadingUtilities"] +git-tree-sha1 = "94e20822bd7427b1b1b843a3980003f5d5e8696b" +uuid = "f517fe37-dbe3-4b94-8317-1923a5111588" +version = "0.6.14" + +[[deps.PolyesterWeave]] +deps = ["BitTwiddlingConvenienceFunctions", "CPUSummary", "IfElse", "Static", "ThreadingUtilities"] +git-tree-sha1 = "233feae14c07cca6b95080f77a7d332612603f6a" +uuid = "1d0040c9-8b98-4ee7-8388-3f51789ca0ad" +version = "0.1.9" + +[[deps.PooledArrays]] +deps = ["DataAPI", "Future"] +git-tree-sha1 = "a6062fe4063cdafe78f4a0a81cfffb89721b30e7" +uuid = "2dfb63ee-cc39-5dd5-95bd-886bf059d720" +version = "1.4.2" + +[[deps.PositiveFactorizations]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "17275485f373e6673f7e7f97051f703ed5b15b20" +uuid = "85a6dd25-e78a-55b7-8502-1745935b8125" +version = "0.2.4" + +[[deps.PreallocationTools]] +deps = ["Adapt", "ArrayInterfaceCore", "ForwardDiff", "ReverseDiff"] +git-tree-sha1 = "5c076a409ec8d2a86d3685a7e4fed330cd489889" +uuid = "d236fae5-4411-538c-8e31-a6e3d9e00b46" +version = "0.4.2" + +[[deps.Preferences]] +deps = ["TOML"] +git-tree-sha1 = "47e5f437cc0e7ef2ce8406ce1e7e24d44915f88d" +uuid = "21216c6a-2e73-6563-6e65-726566657250" +version = "1.3.0" + +[[deps.PrettyTables]] +deps = ["Crayons", "Formatting", "Markdown", "Reexport", "Tables"] +git-tree-sha1 = "dfb54c4e414caa595a1f2ed759b160f5a3ddcba5" +uuid = "08abe8d2-0d0c-5749-adfa-8a2ac140af0d" +version = "1.3.1" + +[[deps.Printf]] +deps = ["Unicode"] +uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" + +[[deps.ProgressMeter]] +deps = ["Distributed", "Printf"] +git-tree-sha1 = "d7a7aef8f8f2d537104f170139553b14dfe39fe9" +uuid = "92933f4c-e287-5a05-a399-4b506db050ca" +version = "1.7.2" + +[[deps.QOI]] +deps = ["ColorTypes", "FileIO", "FixedPointNumbers"] +git-tree-sha1 = "18e8f4d1426e965c7b532ddd260599e1510d26ce" +uuid = "4b34888f-f399-49d4-9bb3-47ed5cae4e65" +version = "1.0.0" + +[[deps.Qt5Base_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Fontconfig_jll", "Glib_jll", "JLLWrappers", "Libdl", "Libglvnd_jll", "OpenSSL_jll", "Pkg", "Xorg_libXext_jll", "Xorg_libxcb_jll", "Xorg_xcb_util_image_jll", "Xorg_xcb_util_keysyms_jll", "Xorg_xcb_util_renderutil_jll", "Xorg_xcb_util_wm_jll", "Zlib_jll", "xkbcommon_jll"] +git-tree-sha1 = "c6c0f690d0cc7caddb74cef7aa847b824a16b256" +uuid = "ea2cea3b-5b76-57ae-a6ef-0a8af62496e1" +version = "5.15.3+1" + +[[deps.QuadGK]] +deps = ["DataStructures", "LinearAlgebra"] +git-tree-sha1 = "78aadffb3efd2155af139781b8a8df1ef279ea39" +uuid = "1fd47b50-473d-5c70-9696-f719f8f3bcdc" +version = "2.4.2" + +[[deps.Quaternions]] +deps = ["DualNumbers", "LinearAlgebra", "Random"] +git-tree-sha1 = "b327e4db3f2202a4efafe7569fcbe409106a1f75" +uuid = "94ee1d12-ae83-5a48-8b1c-48b8ff168ae0" +version = "0.5.6" + +[[deps.REPL]] +deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] +uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" + +[[deps.Random]] +deps = ["SHA", "Serialization"] +uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" + +[[deps.Random123]] +deps = ["Random", "RandomNumbers"] +git-tree-sha1 = "7a1a306b72cfa60634f03a911405f4e64d1b718b" +uuid = "74087812-796a-5b5d-8853-05524746bad3" +version = "1.6.0" + +[[deps.RandomNumbers]] +deps = ["Random", "Requires"] +git-tree-sha1 = "043da614cc7e95c703498a491e2c21f58a2b8111" +uuid = "e6cf234a-135c-5ec9-84dd-332b85af5143" +version = "1.5.3" + +[[deps.RangeArrays]] +git-tree-sha1 = "b9039e93773ddcfc828f12aadf7115b4b4d225f5" +uuid = "b3c3ace0-ae52-54e7-9d0b-2c1406fd6b9d" +version = "0.3.2" + +[[deps.Ratios]] +deps = ["Requires"] +git-tree-sha1 = "dc84268fe0e3335a62e315a3a7cf2afa7178a734" +uuid = "c84ed2f1-dad5-54f0-aa8e-dbefe2724439" +version = "0.4.3" + +[[deps.RecipesBase]] +git-tree-sha1 = "6bf3f380ff52ce0832ddd3a2a7b9538ed1bcca7d" +uuid = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" +version = "1.2.1" + +[[deps.RecipesPipeline]] +deps = ["Dates", "NaNMath", "PlotUtils", "RecipesBase"] +git-tree-sha1 = "dc1e451e15d90347a7decc4221842a022b011714" +uuid = "01d81517-befc-4cb6-b9ec-a95719d0359c" +version = "0.5.2" + +[[deps.RecursiveArrayTools]] +deps = ["Adapt", "ArrayInterfaceCore", "ArrayInterfaceStaticArraysCore", "ChainRulesCore", "DocStringExtensions", "FillArrays", "GPUArraysCore", "IteratorInterfaceExtensions", "LinearAlgebra", "RecipesBase", "StaticArraysCore", "Statistics", "Tables", "ZygoteRules"] +git-tree-sha1 = "3004608dc42101a944e44c1c68b599fa7c669080" +uuid = "731186ca-8d62-57ce-b412-fbd966d074cd" +version = "2.32.0" + +[[deps.RecursiveFactorization]] +deps = ["LinearAlgebra", "LoopVectorization", "Polyester", "StrideArraysCore", "TriangularSolve"] +git-tree-sha1 = "3ee71214057e29a8466f5d70cfe745236aa1d9d7" +uuid = "f2c3362d-daeb-58d1-803e-2bc74f2840b4" +version = "0.2.11" + +[[deps.Reexport]] +git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" +uuid = "189a3867-3050-52da-a836-e630ba90ab69" +version = "1.2.2" + +[[deps.RegionTrees]] +deps = ["IterTools", "LinearAlgebra", "StaticArrays"] +git-tree-sha1 = "4618ed0da7a251c7f92e869ae1a19c74a7d2a7f9" +uuid = "dee08c22-ab7f-5625-9660-a9af2021b33f" +version = "0.3.2" + +[[deps.RelocatableFolders]] +deps = ["SHA", "Scratch"] +git-tree-sha1 = "cdbd3b1338c72ce29d9584fdbe9e9b70eeb5adca" +uuid = "05181044-ff0b-4ac5-8273-598c1e38db00" +version = "0.1.3" + +[[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 = "b8e2eb3d8e1530acb73d8949eab3cedb1d43f840" +uuid = "37e2e3b7-166d-5795-8a7a-e32c996b4267" +version = "1.14.1" + +[[deps.Rmath]] +deps = ["Random", "Rmath_jll"] +git-tree-sha1 = "bf3188feca147ce108c76ad82c2792c57abe7b1f" +uuid = "79098fc4-a85e-5d69-aa6a-4863f24498fa" +version = "0.7.0" + +[[deps.Rmath_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "68db32dff12bb6127bac73c209881191bf0efbb7" +uuid = "f50d1b31-88e8-58de-be2c-1cc44531875f" +version = "0.3.0+0" + +[[deps.Rotations]] +deps = ["LinearAlgebra", "Quaternions", "Random", "StaticArrays", "Statistics"] +git-tree-sha1 = "3177100077c68060d63dd71aec209373c3ec339b" +uuid = "6038ab10-8711-5258-84ad-4b1120ba62dc" +version = "1.3.1" + +[[deps.SHA]] +uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" +version = "0.7.0" + +[[deps.SIMDDualNumbers]] +deps = ["ForwardDiff", "IfElse", "SLEEFPirates", "VectorizationBase"] +git-tree-sha1 = "dd4195d308df24f33fb10dde7c22103ba88887fa" +uuid = "3cdde19b-5bb0-4aaf-8931-af3e248e098b" +version = "0.1.1" + +[[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 = "7ee0e13ac7cd77f2c0e93bff8c40c45f05c77a5a" +uuid = "476501e8-09a2-5ece-8869-fb82de89a1fa" +version = "0.6.33" + +[[deps.SciMLBase]] +deps = ["ArrayInterfaceCore", "CommonSolve", "ConstructionBase", "Distributed", "DocStringExtensions", "FunctionWrappersWrappers", "IteratorInterfaceExtensions", "LinearAlgebra", "Logging", "Markdown", "RecipesBase", "RecursiveArrayTools", "StaticArraysCore", "Statistics", "Tables"] +git-tree-sha1 = "cc9dd4cd31ca81247c5546e185d323f2fe1d2ace" +uuid = "0bca4576-84f4-4d90-8ffe-ffa030f20462" +version = "1.51.0" + +[[deps.Scratch]] +deps = ["Dates"] +git-tree-sha1 = "f94f779c94e58bf9ea243e77a37e16d9de9126bd" +uuid = "6c6a2e73-6563-6170-7368-637461726353" +version = "1.1.1" + +[[deps.SentinelArrays]] +deps = ["Dates", "Random"] +git-tree-sha1 = "db8481cf5d6278a121184809e9eb1628943c7704" +uuid = "91c51154-3ec4-41a3-a24f-3f23e20d615c" +version = "1.3.13" + +[[deps.Serialization]] +uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" + +[[deps.Setfield]] +deps = ["ConstructionBase", "Future", "MacroTools", "StaticArraysCore"] +git-tree-sha1 = "e2cc6d8c88613c05e1defb55170bf5ff211fbeac" +uuid = "efcf1570-3423-57d1-acb7-fd33fddbac46" +version = "1.1.1" + +[[deps.SharedArrays]] +deps = ["Distributed", "Mmap", "Random", "Serialization"] +uuid = "1a1011a3-84de-559e-8e89-a11a2f7dc383" + +[[deps.Showoff]] +deps = ["Dates", "Grisu"] +git-tree-sha1 = "91eddf657aca81df9ae6ceb20b959ae5653ad1de" +uuid = "992d4aef-0814-514b-bc4d-f2e9a6c4116f" +version = "1.0.3" + +[[deps.SimpleTraits]] +deps = ["InteractiveUtils", "MacroTools"] +git-tree-sha1 = "5d7e3f4e11935503d3ecaf7186eac40602e7d231" +uuid = "699a6c99-e7fa-54fc-8d76-47d257e15c1d" +version = "0.9.4" + +[[deps.SimpleWeightedGraphs]] +deps = ["Graphs", "LinearAlgebra", "Markdown", "SparseArrays", "Test"] +git-tree-sha1 = "a6f404cc44d3d3b28c793ec0eb59af709d827e4e" +uuid = "47aef6b3-ad0c-573a-a1e2-d07658019622" +version = "1.2.1" + +[[deps.Sixel]] +deps = ["Dates", "FileIO", "ImageCore", "IndirectArrays", "OffsetArrays", "REPL", "libsixel_jll"] +git-tree-sha1 = "8fb59825be681d451c246a795117f317ecbcaa28" +uuid = "45858cf5-a6b0-47a3-bbea-62219f50df47" +version = "0.1.2" + +[[deps.SnoopPrecompile]] +git-tree-sha1 = "f604441450a3c0569830946e5b33b78c928e1a85" +uuid = "66db9d55-30c0-4569-8b51-7e840670fc0c" +version = "1.0.1" + +[[deps.Sockets]] +uuid = "6462fe0b-24de-5631-8697-dd941f90decc" + +[[deps.SortingAlgorithms]] +deps = ["DataStructures"] +git-tree-sha1 = "b3363d7460f7d098ca0912c69b082f75625d7508" +uuid = "a2af1166-a08f-5f64-846c-94a0d3cef48c" +version = "1.0.1" + +[[deps.SparseArrays]] +deps = ["LinearAlgebra", "Random"] +uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + +[[deps.SparseDiffTools]] +deps = ["Adapt", "ArrayInterfaceCore", "ArrayInterfaceStaticArrays", "Compat", "DataStructures", "FiniteDiff", "ForwardDiff", "Graphs", "LinearAlgebra", "Requires", "SparseArrays", "StaticArrays", "VertexSafeGraphs"] +git-tree-sha1 = "5fb8ba9180f467885e87a2c99cae178b67934be1" +uuid = "47a9eef4-7e08-11e9-0b38-333d64bd3804" +version = "1.26.2" + +[[deps.SpecialFunctions]] +deps = ["ChainRulesCore", "IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"] +git-tree-sha1 = "d75bda01f8c31ebb72df80a46c88b25d1c79c56d" +uuid = "276daf66-3868-5448-9aa4-cd146d93841b" +version = "2.1.7" + +[[deps.StackViews]] +deps = ["OffsetArrays"] +git-tree-sha1 = "46e589465204cd0c08b4bd97385e4fa79a0c770c" +uuid = "cae243ae-269e-4f55-b966-ac2d0dc13c15" +version = "0.1.1" + +[[deps.Static]] +deps = ["IfElse"] +git-tree-sha1 = "f94f9d627ba3f91e41a815b9f9f977d729e2e06f" +uuid = "aedffcd0-7271-4cad-89d0-dc628f76c6d3" +version = "0.7.6" + +[[deps.StaticArrays]] +deps = ["LinearAlgebra", "Random", "StaticArraysCore", "Statistics"] +git-tree-sha1 = "2d4e51cfad63d2d34acde558027acbc66700349b" +uuid = "90137ffa-7385-5640-81b9-e52037218182" +version = "1.5.3" + +[[deps.StaticArraysCore]] +git-tree-sha1 = "ec2bd695e905a3c755b33026954b119ea17f2d22" +uuid = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" +version = "1.3.0" + +[[deps.Statistics]] +deps = ["LinearAlgebra", "SparseArrays"] +uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" + +[[deps.StatsAPI]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "f9af7f195fb13589dd2e2d57fdb401717d2eb1f6" +uuid = "82ae8749-77ed-4fe6-ae5f-f523153014b0" +version = "1.5.0" + +[[deps.StatsBase]] +deps = ["DataAPI", "DataStructures", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"] +git-tree-sha1 = "d1bf48bfcc554a3761a133fe3a9bb01488e06916" +uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" +version = "0.33.21" + +[[deps.StatsFuns]] +deps = ["ChainRulesCore", "HypergeometricFunctions", "InverseFunctions", "IrrationalConstants", "LogExpFunctions", "Reexport", "Rmath", "SpecialFunctions"] +git-tree-sha1 = "5783b877201a82fc0014cbf381e7e6eb130473a4" +uuid = "4c63d2b9-4356-54db-8cca-17b64c39e42c" +version = "1.0.1" + +[[deps.SteadyStateDiffEq]] +deps = ["DiffEqBase", "DiffEqCallbacks", "LinearAlgebra", "NLsolve", "Reexport", "SciMLBase"] +git-tree-sha1 = "f4492f790434f405139eb3a291fdbb45997857c6" +uuid = "9672c7b4-1e72-59bd-8a11-6ac3964bc41f" +version = "1.9.0" + +[[deps.StochasticDiffEq]] +deps = ["Adapt", "ArrayInterface", "DataStructures", "DiffEqBase", "DiffEqNoiseProcess", "DocStringExtensions", "FillArrays", "FiniteDiff", "ForwardDiff", "JumpProcesses", "LevyArea", "LinearAlgebra", "Logging", "MuladdMacro", "NLsolve", "OrdinaryDiffEq", "Random", "RandomNumbers", "RecursiveArrayTools", "Reexport", "SciMLBase", "SparseArrays", "SparseDiffTools", "StaticArrays", "UnPack"] +git-tree-sha1 = "4fe101021692562e452f0ade897733b0c0282756" +uuid = "789caeaf-c7a9-5a7d-9973-96adeb23e2a0" +version = "6.52.2" + +[[deps.StrideArraysCore]] +deps = ["ArrayInterface", "CloseOpenIntervals", "IfElse", "LayoutPointers", "ManualMemory", "SIMDTypes", "Static", "ThreadingUtilities"] +git-tree-sha1 = "ac730bd978bf35f9fe45daa0bd1f51e493e97eb4" +uuid = "7792a7ef-975c-4747-a70f-980b88e8d1da" +version = "0.3.15" + +[[deps.StructArrays]] +deps = ["Adapt", "DataAPI", "StaticArraysCore", "Tables"] +git-tree-sha1 = "8c6ac65ec9ab781af05b08ff305ddc727c25f680" +uuid = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" +version = "0.6.12" + +[[deps.SuiteSparse]] +deps = ["Libdl", "LinearAlgebra", "Serialization", "SparseArrays"] +uuid = "4607b0f0-06f3-5cda-b6b1-a6196a1729e9" + +[[deps.SuiteSparse_jll]] +deps = ["Artifacts", "Libdl", "Pkg", "libblastrampoline_jll"] +uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c" +version = "5.10.1+0" + +[[deps.Sundials]] +deps = ["CEnum", "DataStructures", "DiffEqBase", "Libdl", "LinearAlgebra", "Logging", "Reexport", "SnoopPrecompile", "SparseArrays", "Sundials_jll"] +git-tree-sha1 = "3903aaf1f4ee8628238a0e56d888c69ba2888444" +uuid = "c3572dad-4567-51f8-b174-8c6c989267f4" +version = "4.10.0" + +[[deps.Sundials_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "OpenBLAS_jll", "Pkg", "SuiteSparse_jll"] +git-tree-sha1 = "04777432d74ec5bc91ca047c9e0e0fd7f81acdb6" +uuid = "fb77eaff-e24c-56d4-86b1-d163f2edb164" +version = "5.2.1+0" + +[[deps.TOML]] +deps = ["Dates"] +uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" +version = "1.0.0" + +[[deps.TableTraits]] +deps = ["IteratorInterfaceExtensions"] +git-tree-sha1 = "c06b2f539df1c6efa794486abfb6ed2022561a39" +uuid = "3783bdb8-4a98-5b6b-af9a-565f29a5fe9c" +version = "1.0.1" + +[[deps.Tables]] +deps = ["DataAPI", "DataValueInterfaces", "IteratorInterfaceExtensions", "LinearAlgebra", "OrderedCollections", "TableTraits", "Test"] +git-tree-sha1 = "5ce79ce186cc678bbb5c5681ca3379d1ddae11a1" +uuid = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" +version = "1.7.0" + +[[deps.Tar]] +deps = ["ArgTools", "SHA"] +uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" +version = "1.10.0" + +[[deps.TensorCore]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "1feb45f88d133a655e001435632f019a9a1bcdb6" +uuid = "62fd8b95-f654-4bbd-a8a5-9c27f68ccd50" +version = "0.1.1" + +[[deps.Test]] +deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] +uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[[deps.ThreadingUtilities]] +deps = ["ManualMemory"] +git-tree-sha1 = "f8629df51cab659d70d2e5618a430b4d3f37f2c3" +uuid = "8290d209-cae3-49c0-8002-c8c24d57dab5" +version = "0.5.0" + +[[deps.TiffImages]] +deps = ["ColorTypes", "DataStructures", "DocStringExtensions", "FileIO", "FixedPointNumbers", "IndirectArrays", "Inflate", "Mmap", "OffsetArrays", "PkgVersion", "ProgressMeter", "UUIDs"] +git-tree-sha1 = "70e6d2da9210371c927176cb7a56d41ef1260db7" +uuid = "731e570b-9d59-4bfa-96dc-6df516fadf69" +version = "0.6.1" + +[[deps.TiledIteration]] +deps = ["OffsetArrays"] +git-tree-sha1 = "5683455224ba92ef59db72d10690690f4a8dc297" +uuid = "06e1c1a7-607b-532d-9fad-de7d9aa2abac" +version = "0.3.1" + +[[deps.TranscodingStreams]] +deps = ["Random", "Test"] +git-tree-sha1 = "ed5d390c7addb70e90fd1eb783dcb9897922cbfa" +uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa" +version = "0.9.8" + +[[deps.TreeViews]] +deps = ["Test"] +git-tree-sha1 = "8d0d7a3fe2f30d6a7f833a5f19f7c7a5b396eae6" +uuid = "a2a6695c-b41b-5b7d-aed9-dbfdeacea5d7" +version = "0.3.0" + +[[deps.TriangularSolve]] +deps = ["CloseOpenIntervals", "IfElse", "LayoutPointers", "LinearAlgebra", "LoopVectorization", "Polyester", "SnoopPrecompile", "Static", "VectorizationBase"] +git-tree-sha1 = "8987cf4a0f8d6c375e4ab1438a048e0a185151e4" +uuid = "d5829a12-d9aa-46ab-831f-fb7c9ab06edf" +version = "0.1.13" + +[[deps.Tricks]] +git-tree-sha1 = "6bac775f2d42a611cdfcd1fb217ee719630c4175" +uuid = "410a4b4d-49e4-4fbc-ab6d-cb71b17b3775" +version = "0.1.6" + +[[deps.URIs]] +git-tree-sha1 = "e59ecc5a41b000fa94423a578d29290c7266fc10" +uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" +version = "1.4.0" + +[[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.Unzip]] +git-tree-sha1 = "34db80951901073501137bdbc3d5a8e7bbd06670" +uuid = "41fe7b60-77ed-43a1-b4f0-825fd5a5650d" +version = "0.1.2" + +[[deps.VectorizationBase]] +deps = ["ArrayInterface", "CPUSummary", "HostCPUFeatures", "IfElse", "LayoutPointers", "Libdl", "LinearAlgebra", "SIMDTypes", "Static"] +git-tree-sha1 = "a0b74e8247f30420ba25c8fcfc1c69cb84ff8cff" +uuid = "3d5dd08c-fd9d-11e8-17fa-ed2836048c2f" +version = "0.21.46" + +[[deps.VertexSafeGraphs]] +deps = ["Graphs"] +git-tree-sha1 = "8351f8d73d7e880bfc042a8b6922684ebeafb35c" +uuid = "19fa3120-7c27-5ec5-8db8-b0b0aa330d6f" +version = "0.2.0" + +[[deps.Wayland_jll]] +deps = ["Artifacts", "Expat_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Pkg", "XML2_jll"] +git-tree-sha1 = "3e61f0b86f90dacb0bc0e73a0c5a83f6a8636e23" +uuid = "a2964d1f-97da-50d4-b82a-358c7fce9d89" +version = "1.19.0+0" + +[[deps.Wayland_protocols_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "4528479aa01ee1b3b4cd0e6faef0e04cf16466da" +uuid = "2381bf8a-dfd0-557d-9999-79630e7b1b91" +version = "1.25.0+0" + +[[deps.WeakRefStrings]] +deps = ["DataAPI", "InlineStrings", "Parsers"] +git-tree-sha1 = "b1be2855ed9ed8eac54e5caff2afcdb442d52c23" +uuid = "ea10d353-3f73-51f8-a26c-33c1cb351aa5" +version = "1.4.2" + +[[deps.WoodburyMatrices]] +deps = ["LinearAlgebra", "SparseArrays"] +git-tree-sha1 = "de67fa59e33ad156a590055375a30b23c40299d3" +uuid = "efce3f68-66dc-5838-9240-27a6d6f5f9b6" +version = "0.5.5" + +[[deps.XML2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Pkg", "Zlib_jll"] +git-tree-sha1 = "58443b63fb7e465a8a7210828c91c08b92132dff" +uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a" +version = "2.9.14+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.Xorg_libX11_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libxcb_jll", "Xorg_xtrans_jll"] +git-tree-sha1 = "5be649d550f3f4b95308bf0183b82e2582876527" +uuid = "4f6342f7-b3d2-589e-9d20-edeb45f2b2bc" +version = "1.6.9+4" + +[[deps.Xorg_libXau_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "4e490d5c960c314f33885790ed410ff3a94ce67e" +uuid = "0c0b7dd1-d40b-584c-a123-a41640f87eec" +version = "1.0.9+4" + +[[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", "Pkg"] +git-tree-sha1 = "4fe47bd2247248125c428978740e18a681372dd4" +uuid = "a3789734-cfe1-5b06-b2d0-1dd0d9d62d05" +version = "1.1.3+4" + +[[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", "Pkg"] +git-tree-sha1 = "6783737e45d3c59a4a4c4091f5f88cdcf0908cbb" +uuid = "14d82f49-176c-5ed1-bb49-ad3f5cbd8c74" +version = "0.1.0+3" + +[[deps.Xorg_libxcb_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "XSLT_jll", "Xorg_libXau_jll", "Xorg_libXdmcp_jll", "Xorg_libpthread_stubs_jll"] +git-tree-sha1 = "daf17f441228e7a3833846cd048892861cff16d6" +uuid = "c7cfdc94-dc32-55de-ac96-5a1b8d977c5b" +version = "1.13.0+3" + +[[deps.Xorg_libxkbfile_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll"] +git-tree-sha1 = "926af861744212db0eb001d9e40b5d16292080b2" +uuid = "cc61e674-0454-545c-8b26-ed2c68acab7a" +version = "1.1.0+4" + +[[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", "Pkg", "Xorg_libxkbfile_jll"] +git-tree-sha1 = "4bcbf660f6c2e714f87e960a171b119d06ee163b" +uuid = "35661453-b289-5fab-8a00-3d9160c6a3a4" +version = "1.4.2+4" + +[[deps.Xorg_xkeyboard_config_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xkbcomp_jll"] +git-tree-sha1 = "5c8424f8a67c3f2209646d4425f3d415fee5931d" +uuid = "33bec58e-1273-512f-9401-5d533626f822" +version = "2.27.0+4" + +[[deps.Xorg_xtrans_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "79c31e7844f6ecf779705fbc12146eb190b7d845" +uuid = "c5fb5394-a638-5e4d-96e5-b29de1b5cf10" +version = "1.4.0+3" + +[[deps.Zlib_jll]] +deps = ["Libdl"] +uuid = "83775a58-1f1d-513f-b197-d71354ab007a" +version = "1.2.12+3" + +[[deps.Zstd_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "e45044cd873ded54b6a5bac0eb5c971392cf1927" +uuid = "3161d3a3-bdf6-5164-811a-617609db77b4" +version = "1.5.2+0" + +[[deps.ZygoteRules]] +deps = ["MacroTools"] +git-tree-sha1 = "8c1a8e4dfacb1fd631745552c8db35d0deb09ea0" +uuid = "700de1a5-db45-46bc-99cf-38207098b444" +version = "0.2.2" + +[[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", "OpenBLAS_jll"] +uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" +version = "5.1.1+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.libpng_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] +git-tree-sha1 = "94d180a6d2b5e55e447e2d27a29ed04fe79eb30c" +uuid = "b53b4c65-9356-5827-b1ea-8c7a1a84506f" +version = "1.6.38+0" + +[[deps.libsixel_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "78736dab31ae7a53540a6b752efc61f77b304c5b" +uuid = "075b6546-f08a-558a-be8f-8157d0f608a5" +version = "1.8.6+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.nghttp2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" +version = "1.48.0+0" + +[[deps.p7zip_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" +version = "17.4.0+0" + +[[deps.x264_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "4fea590b89e6ec504593146bf8b988b2c00922b2" +uuid = "1270edf5-f2f9-52d2-97e9-ab00b5d0237a" +version = "2021.5.5+0" + +[[deps.x265_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "ee567a171cce03570d77ad3a43e90218e38937a9" +uuid = "dfaa095f-4041-5dcd-9319-2fabd8486b76" +version = "3.5.0+0" + +[[deps.xkbcommon_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Wayland_jll", "Wayland_protocols_jll", "Xorg_libxcb_jll", "Xorg_xkeyboard_config_jll"] +git-tree-sha1 = "9ebfc140cc56e8c2156a15ceac2f0302e327ac0a" +uuid = "d8fb68d0-12a3-5cfd-a85a-d49703b185fd" +version = "1.4.1+0" +""" + +# ╔═║ Cell order: +# β•Ÿβ”€42085492-ac8c-11eb-0620-adcb307077f1 +# β•Ÿβ”€3e60b013-98cf-4057-9c96-b627662c85a4 +# β•Ÿβ”€14195fc4-40e1-4576-973a-69d649fddc02 +# β•Ÿβ”€92883ed9-5572-41fd-96c7-190279f90804 +# β•Ÿβ”€2ab34e6f-9059-4f33-8abd-df15b0c00b6b +# β•Ÿβ”€8d2fd4f0-f2f6-4bc8-b753-f34f2abfcc7e +# β•Ÿβ”€041caa91-5449-4de1-8786-56ae3db74bfe +# β•Ÿβ”€21b71237-bfdf-47d1-beb3-eac924c52f6a +# β•Ÿβ”€b6c511c8-918d-432c-9756-9641176ff652 +# β•Ÿβ”€e8a5cf48-f647-4fb3-8c0a-4eae97d03e02 +# β•Ÿβ”€ebfeb0b0-d29e-4244-a0e3-a7185f3c8124 +# β•Ÿβ”€4bf60f27-8db5-42c1-83d8-750bec2060e5 +# β•Ÿβ”€e2799d05-36a7-4547-8663-90708ce01ce8 +# β•Ÿβ”€279b4748-829f-44a3-94da-da3abf32ff13 +# ╠═adb59adc-b30a-4dc4-bc3f-2804b7e02876 +# ╠═c1d87c42-e1e0-4e52-8023-6cc176266e86 +# ╠═578a80ad-fcf1-4d5c-81e5-205113bbf78d +# β•Ÿβ”€7bee45a5-fa62-455b-813a-3e5dcf430289 +# β•Ÿβ”€bda41881-75c7-4732-9a66-d7947607b1b6 +# β•Ÿβ”€2ca14de2-2f6f-4e0c-a324-ad850c9132e5 +# β•Ÿβ”€e31693a1-70e1-48f2-93ba-c2ec13ea72ee +# β•Ÿβ”€b6bb81f9-0ca2-4da6-909d-3d64bf22fde1 +# β•Ÿβ”€9d491fa0-dfdc-4940-954c-2e3a9caf5e5a +# β•Ÿβ”€df57eded-963e-4178-a14c-3c012b265a4c +# ╠═95085dc9-fd7b-4e48-a75c-0167137ddb64 +# β•Ÿβ”€35225212-6110-4e7b-9abc-ad0bac208dd0 +# β•Ÿβ”€b7317177-27d7-46c9-bc45-e608ad7a85c0 +# β•Ÿβ”€c995d675-b6a3-48dc-a0a9-911960e73993 +# β•Ÿβ”€6deac3f1-e2c6-40a5-b764-33c0b4004d91 +# β•Ÿβ”€bf774878-28b5-4e9b-b5d8-f7e9be4c8787 +# ╠═bee4395c-3e55-443e-831f-c50d6b88c1a3 +# β•Ÿβ”€c2b34a2d-7271-43a1-a60d-9f0a0bee6f6b +# β•Ÿβ”€46ef400d-6001-4c6f-9925-49ab751a51e6 +# β•Ÿβ”€d19effc6-82ee-486d-8635-ede036c82462 +# ╠═1f2ab21d-bd7f-4dab-8cd1-33b96d85ed08 +# β•Ÿβ”€3a355c17-770d-4ce4-a8bf-117ce6616788 +# β•Ÿβ”€8c930e06-8f58-49be-9724-5536d3156067 +# β•Ÿβ”€bddce5ec-8f5c-4025-96fb-1443d4e347aa +# ╠═add2a5e8-4a28-4395-9d61-2077fd31e0f4 +# β•Ÿβ”€b517c441-b068-4778-9af0-6ce82c5bbfc7 +# β•Ÿβ”€ca5b41d2-b511-486a-91fe-cceb8f7282c3 +# ╠═875e146c-d72f-46b4-9d82-21110e81ca9b +# β•Ÿβ”€f1df983a-9d70-48c8-a7ee-7ba3bd9c0fa5 +# β•Ÿβ”€bb34869a-4bb6-4fcd-b841-c6b49cf02155 +# β•Ÿβ”€717a83a5-70d2-453b-b7da-f05c366545fd +# ╠═0e4dedc5-0b1e-4e46-b943-284bfb2de57f +# ╠═91329865-f593-4388-a5d0-01af4be6e01d +# ╠═7187ae25-239d-4752-898e-6674009b5de6 +# β•Ÿβ”€fb61866f-c3f9-40d2-848b-f7c54ad6d447 +# β•Ÿβ”€03ccad3d-09ed-4621-9845-ceb605072ebf +# β•Ÿβ”€2b66ffaf-a9a3-4ca2-a6e9-732912c9d48e +# β•Ÿβ”€d76af110-ae17-4e74-b0f9-870d05bedb87 +# ╠═b12209a8-2f34-4daa-8288-d91339a940f9 +# β•Ÿβ”€5eb54ebb-0ebd-47a7-b5c0-a3059f82aa9e +# β•Ÿβ”€b186d026-d02c-4f06-8097-aa54b363f4fb +# β•Ÿβ”€46fea650-c729-4698-8627-36ffdb6cf78f +# β•Ÿβ”€6b860e7a-6e7d-48ac-addb-03e6115a037d +# β•Ÿβ”€af893e1e-3bd7-4d05-83b6-f5f7e751b5e3 +# β•Ÿβ”€b42cb878-c5af-4a6e-99cd-1da436d1bdf7 +# β•Ÿβ”€ca5954aa-eece-4797-939d-75fdef10a2a1 +# ╠═efe73a33-02a8-4957-8a1a-2298dbefcb56 +# ╠═0c1b96af-73b3-441d-93f7-e38e6e01da2f +# ╠═3aa13ecd-9d4a-4b41-b15f-f85e2b8f8bf6 +# β•Ÿβ”€6613b68f-9997-4230-b757-a5ac46e908ad +# β•Ÿβ”€3c3f7997-ca76-4536-8331-634fff7fbcb7 +# β•Ÿβ”€d536ffda-117a-4434-9191-8a2c12df825e +# ╠═de60ddf6-b77d-4960-b3d1-7018abf3b178 +# ╠═8da81688-e1d7-4d8d-8e2d-76ac7b17cdbe +# β•Ÿβ”€20915df5-5385-4b82-b3e5-8637171f0b0b +# β•Ÿβ”€4733e6c8-acb3-4ed8-8aa5-ee0cbec1a484 +# β•Ÿβ”€23922b09-2277-4713-8271-a60e9fb16026 +# β•Ÿβ”€0b2883eb-a074-44bc-9d5c-9c78d8b46f43 +# ╠═ee9724f1-5414-4c3d-85b9-e394afea2e72 +# ╠═af69dae3-48c4-4327-a0e4-d29734b3c7e1 +# β•Ÿβ”€185321ec-c7b3-4deb-883c-fdac3e3193ff +# β•Ÿβ”€1b692c88-d7e2-4d37-a81f-3b5cbfaf187e +# β•Ÿβ”€00000000-0000-0000-0000-000000000001 +# β•Ÿβ”€00000000-0000-0000-0000-000000000002 diff --git a/notebooks_old/9_climate_sensitivity.jl b/notebooks_old/9_climate_sensitivity.jl new file mode 100644 index 0000000..68b1fc3 --- /dev/null +++ b/notebooks_old/9_climate_sensitivity.jl @@ -0,0 +1,2847 @@ +### A Pluto.jl notebook ### +# v0.19.12 + +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 + +# ╔═║ 3e60b013-98cf-4057-9c96-b627662c85a4 +begin + using DifferentialEquations, Plots, PlutoUI, LinearAlgebra, CSV, DataFrames, Images +end + +# ╔═║ 42085492-ac8c-11eb-0620-adcb307077f1 +html""" +
+ +
+

Section 2.2

+

+ Climate models: climate sensitivity +

+ +""" + + +# ╔═║ 14195fc4-40e1-4576-973a-69d649fddc02 +TableOfContents(title="πŸ“š Table of Contents", indent=true, depth=4, aside=true) + +# ╔═║ dd6ba348-d0d7-46b7-a77f-351c00dc9c36 +html""" + +""" + +# ╔═║ 2ab34e6f-9059-4f33-8abd-df15b0c00b6b +md""" +## Climate sensitivity + +""" + +# ╔═║ a24c2177-5fee-4930-ab78-524085f65ed9 +md""" +### Greenhouse gases +--- +--- + +The energy budget of the atmosphere is quite remarkable in that most of the radiation received at the surface (mostly oceans) comes from the atmosphere as thermal energy, not from the Sun as shortwave energy. This brings to the fore the importance of greenhouse gases that regulate the radiation emitted from the atmosphere. + +""" + +# ╔═║ b9eca29e-9028-4fd7-8c62-718a2dcf87d1 +html"""""" + +# ╔═║ 231e4c3b-6998-4f3d-9cc3-14fa17941f7d +md""" +#### Energy levels and absorption of energy +--- +Here we revisit our discussion of why greenhouse gases like water vapor and carbon dioxide play a key role in regulating the thermal radiation of the atmosphere, even though they make up for a paltry amount of the atmosphere by mass. The permanent gases that compose the atmosphere are : nitrogen (78%), oxygen (21%) and argon (0.9%). Carbon dioxide makes up barely 0.4%. Water vapor concentration varies from 0-4% of the atmosphere depending on where you are and what time of the day it is. Why are we concerned about small increases in carbon dioxide concentrations then? + +Let us begin by reviewing how gases absorb radiation. This requires a review of quantum theory, a field that may not be the forte of some climate skeptics. Any given molecule of a gas can be at different energy levels, depending on the levels occupied by its electrons, but also on the vibration and rotation modes of the molecular bonds. Radiation arrives to a molecule in the form of a photon of energy $h/\lambda$ where $h$ is Planck's constant and $\lambda$ the photon wavelength. The photon can be absorbed by the molecule only if its energy (and hence its wavelength) matches the amount of energy needed to cause the molecule to transition between its energy level and a higher one. Moving electrons to higher orbitals typically requires very energetic photons in the ultraviolet range (shortwaves). Exciting vibrations and rotations requires photons with weaker energies. In particular vibrations where the dipole moment of the molecule changes are excited by photons in the thermal energy range (longwaves) and hence play a crucial role in the Earth's greenhouse effect. + +""" + +# ╔═║ 482dd428-74f0-4c7c-afc9-db547777e79f +md""" + +##### Vibration modes of $H_2O$ molecule +""" + +# ╔═║ f8868c0a-d0ec-45dc-844f-c053981277d9 +html"""""" + +# ╔═║ 2ecbad61-0f94-4e0a-9b35-0a5a60d4405c +md""" + +##### Vibration modes of $CO_2$ molecule +""" + +# ╔═║ 2b7eeede-83ef-45ca-929b-19a3c369b105 +html"""""" + +# ╔═║ a8b9d935-d951-493f-9e91-45743a471249 +md""" + +##### Absorption of radiation by the atmosphere +""" + +# ╔═║ 87c272a7-66bb-4c91-a8ee-30c74ce60461 +html"""""" + +# ╔═║ 82e4f960-da7e-41ca-ab16-4d49636041a2 +md""" + +Figure: (a) The normalized blackbody emission spectra, T-4XBX, for the Sun (T = 6000 K) and Earth (T = 255 K) as a function of ln X (top), where Bx is the blackbody function (see Eq. A-2) and X is the wavelength (see Appendix A.1.1 for further discussion). (b) The fraction of radiation absorbed while passing from the ground to the top of the atmosphere as a function of wavelength. (c) The fraction of radiation absorbed from the tropopause (typically at a height of 11km) to the top of the atmosphere as a function of wavelength. The atmospheric molecules contributing the important absorption features at each frequency are also indicated. After Goody and Yung (1989). + +""" + +# ╔═║ 54d73952-c016-48f5-9fb5-83aaea4363de +md""" + +##### Emission of radiation by the atmosphere + + +You may often read that energy is absorbed and re-emitted by greenhouse gas molecules. This is not correct. Molecules absorb according to incident intensity, +collide to distribute the energy, and emit according to their temperature. EAPS Prof. Tim Cronin has sketched a nice schematic of the two descriptions and why they are fundamentally different. + +""" + +# ╔═║ 05c9f594-1005-4662-ab1d-49f218012add + md""" + ![WrongPicture_TC.png] + (https://raw.githubusercontent.com/mitmath/JuliaComputation/main/notebooks/WrongPicture_TC.png) + """ + +# ╔═║ 1147a6ad-e528-4b41-bca6-63caa02f3a68 + + md""" + ![RightPicture_TC.png] + (https://raw.githubusercontent.com/mitmath/JuliaComputation/main/notebooks/RightPicture_TC.png) + """ + + + +# ╔═║ 37535223-1fce-402f-ab24-53d9609b2b9c +md""" + +The emission spectrum in the thermal infrared range can therefore be used to infer the temperature at which radiation is emitted. The colder the emission temperature, the more efficient is the atmosphere to absorb and emit energy at that wavelength. + +""" + +# ╔═║ 487c6447-7d47-457f-8d0e-8ad25240a4d2 + md""" + ![Emission_TS.png] + (https://raw.githubusercontent.com/mitmath/JuliaComputation/main/notebooks/Emission_TS.png) + """ + +# ╔═║ c665a43c-5020-4cc9-8209-1a786e4c98ab +md""" + +Figure: Terrestrial spectral radiative energy flux emanating from the top of Earth’s atmosphere. The spectrum is calculated with a radiative transfer model for the U.S. standard atmosphere, which is representative of midlatitudes. Effects of clouds are ignored in this spectrum, so it represents clear-sky conditions. Absorption bands of a few atmospheric trace constituents are identified: water vapor (H2O), methane (CH4), ozone (O3), and carbon dioxide (CO2). The emission temperature of the spectrum shown is 260 K, which is close to Earth’s emission temperature of 255 K. The blue lines show blackbody spectra for temperatures of 255 K (Earth’s emission temperature) and 288 K (Earth’s global-mean surface temperature). From Tapio Schneider online textbook "Physics of Earth's Climate". + + +""" + +# ╔═║ ab4039d5-c564-4fcc-84b7-58fba714d735 +md""" +#### Collisional broadening +--- + +The atmosphere is saturated with respect to CO$_2$ absorption--that is, longwave photons emitted from the surface at the wavelengths of the CO$_2$ individual absorption lines are already fully absorbed by the atmosphere at preindustiral CO$_2$ concentrations. Why do we worry about increasing CO$_2$ concentrations then? + +It turns out that molecules can absorb photons with energy on a broader range around the precise energies corresponding to transitions between pairs of molecule energy levels (specifically the vibration modes for CO$_2$ in the infrared range). This is due to one major effect: collisional broadening of the absorption lines. If the arriving photon has slightly more energy than needed for energy level transition, the excess energy can be transferred to the colliding molecule, allowing to absorb photons that are not exactly at the right wavelength/energy. + +As the concentration of CO$_2$ increases so does the number of collisions and the broadening of the absorption lines. And voila', the absorptivity/emissivity of the atmosphere increases in the CO$_2$ absorption wavelengths range. +""" + +# ╔═║ bb36eda4-91a2-4fd0-bce3-12891b610fb7 + md""" + ![Broadening.svg] + (https://raw.githubusercontent.com/mitmath/JuliaComputation/main/notebooks/Broadening.svg) + """ + +# ╔═║ 44515eae-805e-445a-ac35-f5d9c40df83e +md""" +Figure from slides accompanying "Global Warming Science" by Eli Tziperman. +""" + +# ╔═║ 37b5cafd-1147-4677-94d1-1a265736f794 +md""" +#### Radiative forcing and logarithmic dependence on $CO_2$ +--- +The width of the absorption bands for each individual vibrational mode increases as a function of wavelengths due to the increased collisions. This increase results in a logarithmic dependence of the emissivity on the CO$_2$ concentration well described by the formula: + +$\epsilon(CO_2) = Ο΅β‚€ + ϡ₁ \,\,\log_2 \left(\frac{[CO_2]}{[CO_2]_{PI}}\right)$ + +with $CO_2$ measured in ppmv and $[CO_2]_{PI}$ is the Pre-Industrial CO$_2$ concentration of 280 ppmv. + +""" + +# ╔═║ e372b079-53fc-4f6e-9365-e43ad8281f3c +md""" +#### Radiative forcing and water vapor feedback +--- + +Although water vapor accounts for more than half of the Earth’s greenhouse warming effect, it does not control the Earth’s temperature. Instead, the amount of water vapor is controlled by the temperature. This is because the temperature of the atmosphere limits the maximum amount of water vapor the atmosphere can hold. If the temperature decreases any water vapor in excess of its saturation value will condense to form liquid water. This is why clouds form as warm air containing water vapor rises and cools at higher altitudes where the water condenses to the tiny droplets that make up clouds. According to Clausius-Clapeyron's relation the saturation specific humidity $q^*$--the mass (in kg) of moisture in 1 kg of mosit air at saturation--increases nearly exponentially with temperature $T$ in Kelvin: + +$$q^*(T) \simeq 1.58 \times 10^6 \,e^{-5415/T} \quad\text{ kg of moisture per kg of moist air}$$ + +Model calculations and physical arguments further show that the relative humidity--the ratio of the specific humidity and the saturation specific humidity--remains roughly unchanged as climate warms, implying that the water vapor in the atmosphere follows the Clausius-Clapeyron quasi-exponential relation. An increase in temperature due, for example, by an increase in another greenhouses gas CO$_2$ is therefore amplified by water vapor as illustrated in the loop below. In climate jargon we refer to water vapor as a positive feedback. + +We can finally capture the combined effects of CO$_2$ and water vapor on the emissivity and write: + +```math +\begin{align} +Ο΅(CO_2, T) &= Ο΅β‚€ + ϡ₁\,\,\log_2\left(\frac{[COβ‚‚]}{[COβ‚‚]_{PI}}\right) + \hat Ο΅β‚‚\,\, \log_2\left(\frac{q^*(T)}{q^*(T_{PI})}\right)\\ +&= Ο΅β‚€ + ϡ₁\,\,\log_2\left(\frac{[COβ‚‚]}{[COβ‚‚]_{PI}}\right) + Ο΅β‚‚\,\, (T-T_{PI}) +\end{align} +``` + + +""" + +# ╔═║ 75a31c18-37c0-41db-afba-5d92f818be73 +md""" +![WaterVapor.svg] +(https://raw.githubusercontent.com/mitmath/JuliaComputation/main/notebooks/WaterVapor.svg) +""" + +# ╔═║ 91441230-1b1c-4702-b3a7-2f9adf2ddaaa +begin + COβ‚‚_PI = 280.; # preindustrial CO2 concentration [parts per million; ppm]; + Ο΅β‚€ = 0.75 # Pre Industrial emissivity + ϡ₁ = 0.02 # Parameter setting emissivity dependence on CO_2 + Ο΅β‚‚ = 0.01 # Parameter setting emissivity dependence on water vapor [1/K] + Ο΅(COβ‚‚,Ξ΄T) = Ο΅β‚€ + ϡ₁*log(COβ‚‚/COβ‚‚_PreIndust)/log(2) + Ο΅β‚‚*Ξ΄T +end + +# ╔═║ 576a94c7-64e7-41a8-b8cc-dc1b2e2380e2 +md""" +### Climate sensitivity and the role of the ocean +--- +--- + +The $\text{\color{red}{climate sensitivity}}$ is defined as the increase in surface temperature in response to a change in radiative forcing, for example due to an increase in greenhouse gases, once the climate has adjusted to the new radiative forcing. It has units of K divided by W/m^2. This is more properly called the equilibrium climate sensitivity. In this section we discuss how the ocean affects the evolution of Earth's climate towards equilibrium and introduce the concepts of $\text{\color{red}{equilibrium climate sensitivity}}$ and $\text{\color{red}{transient climate sensitivity}}$. + +# ╔═║ 353e3341-5957-40e7-b2b9-800ba7a80063 +begin + Οƒ = 5.670374419*10^(βˆ’8) # Stefan-Boltzman constant [W/m^2/K^4] + Ξ± = 0.3 # Earth's mean albedo, or planetary reflectivity [unitless] + S = 1366 # solar insolation [W/m^2] (energy per unit time per unit area) +end + +# ╔═║ 4c9e7ec6-64e9-4146-8558-f78f865df195 +md""" +#### Equilibrium climate sensitivity +--- + +The concept of climate sensitivity is introduced to quantify the response of the Earth's climate to perturbations in greenhouse gas concentrations. We start with the evolution of a temperature perturbations of the ocean temperature, $\delta T_o$, that evolves according to the model we derived in the last lecture, assuming that the emissivity is the only parameter that can changes (we do not consider changes in solar forcing and albedo but is is a straightforward extension). Substituting $T_o = T_{PI}+\delta T_o$, where $T_{PI}$ is the equilibrium temperature before the change in radiative forcing, we get: + +```math +\begin{align} +&C_o \frac{d \delta T_o}{dt} = \frac{(1-\alpha)S_0}{4} - \frac{2-\epsilon_0 - \delta\epsilon}{2}\sigma \,\left( T_{PI}^4 + 4 T_{PI}^3 \,\,\delta T_0 +O(\delta T_o^2) \right) +\end{align} +``` +where $\delta \epsilon$ is the change in emissivity due to changes in Co$_2$, water vapor, etcetera. + +Remembering that $(1-\alpha)S_0/4 =(2-\epsilon_0)\sigma T_{PI}^4/2$, and dropping terms quadratic in perturbations ($\delta T_o^2, \,\,\delta T_o \delta \epsilon$), we have, + +$$C_o \frac{d \delta T_o}{dt} = \delta F - \lambda \,\, \delta T_o.$$ + +where $\delta F$ is the radiative forcing in W/m$^2$: + +$$\delta F = \frac{1}{2} \sigma T_{PI}^4 \epsilon_1 \log_2\left(\frac{[COβ‚‚]}{[COβ‚‚]_{PI}}\right)$$ + +and $\lambda$ is the equilibrium climate feedback parameter which encapsulates how the temperature changes in response to the radiative perturbation: + +$$\lambda = \underbrace{4 \frac{2-\epsilon_0}{2} T_{PI}^3}_{\text{Planck feedback}} \quad - \underbrace{\frac{1}{2} T_{PI}^4 \epsilon_2}_{\text{water vapor feedback}}$$ + +""" + +# ╔═║ 2e91945b-6239-41df-83d1-cfed67081cf7 +md""" +Using our parameters we can compute the radiative forcing parameter: +""" + +# ╔═║ 69fa38d3-2411-496c-bf0a-af4e3531b2ae +begin + T_PI = ( 2/(2-Ο΅β‚€) * S*(1-Ξ±)/4/Οƒ )^(1/4) # Equilibrium Pre Industrial temperature [K]] + Ξ΄F(COβ‚‚) = 1/2 * Οƒ *T_PI^4 * ϡ₁ * log(COβ‚‚/COβ‚‚_PI)/log(2) # Radiative forcing [W/m^2] +end + +# ╔═║ 212d6995-d04b-4c8c-b0ed-b8b591c683e5 +md""" +which for a doubling of CO$_2$ above Pre Industrial values implies a radiative forcing of: +""" + +# ╔═║ 3a443524-834c-44fc-a3dd-c72839adba1f +Ξ΄Fβ‚‚β‚“ = Ξ΄F(560) + +# ╔═║ b96b4e7c-1350-4c1a-a716-3623dae87574 +md""" +and a climate feedback parameter of: +""" + +# ╔═║ 7f232e27-e2bb-4474-aadf-bebcd2e61e45 +Ξ» = 2 * (2-Ο΅β‚€) * Οƒ * T_PI^3 - 1/2 * Οƒ * T_PI^4 * Ο΅β‚‚ + +# ╔═║ 6c2998d7-ec51-446a-a5f9-7dcef8f97454 +md""" +The $\text{\color{red}{equilibrium climate sensitivity}}$ is defined as the temperature change for a doubling of CO$_2$ once the climate reaches a new equilibrium. According to our model it is thus predicted to be: +""" + +# ╔═║ a71e2174-0a01-4b77-a1c8-bce3663f5485 +Ξ”Tβ‚‚β‚“ = Ξ΄Fβ‚‚β‚“ / Ξ» + +# ╔═║ 660aad5a-4fc3-4e0f-8d40-5884c7dde2fd +md""" +This value is twice as large as that predicted without water vapor feedback: +""" + +# ╔═║ 553084e1-863d-4d01-9670-a0909732278b +Ξ”Tβ‚‚β‚“Κ·β±α΅—Κ°α΅’α΅˜α΅— = Ξ΄Fβ‚‚β‚“ / (2 * (2-Ο΅β‚€) * Οƒ * T_PI^3) + +# ╔═║ 3fbc0b72-8228-4d2a-ae8e-9ca73393664b +md""" +but still on the very low end of estimates from comprehensive climate models which include the full vertical structure of the atmosphere and ocean and the motions of air and water. These aspects will be introduced in the next two lecture and add numerous additional feedbacks which affect the climate feedback parameter. +""" + +# ╔═║ cd69218a-b7fb-4e70-8b17-3dadd0838d62 +md""" +#### Transient climate sensitivity +--- +In the last lecture we assumed that the whole ocean warms in response to incoming solar radiation, but this is not the case. The ocean is a stratified fluid with warmer waters at the top. Once solar radiation hits its surface, warming affects only the surface mixed layer, the ocean upper layer where strong turbulence, driven by winds and heat loss, mixes heat in the vertical and keeps the vertical temperature profile constant. This upper layer has a depth of approximately h=100 m on average. Heat then diffuses in the deeper layers of the ocean at a much slower pace. A simple extension of the model for perturbations of the ocean temperature $\delta T_o$ in response to radiative forcing $\delta F$ is one in which the ocean is divided into an upper and a deep layer: + +```math +\begin{align} +&{C_u \frac{d Ξ΄T_u}{dt}} = \delta F - \lambda \delta T_u - \mu (\delta T_u -\delta T_d) \\ +&{C_d \frac{d Ξ΄T_d}{dt}} = \mu (\delta T_u -\delta T_d) +\end{align} +``` + +where $\delta T_u$ and $\delta T_o$ are the temperature perturbations of the upper and deep layers with the associated heat capacities. +""" + +# ╔═║ 296e339f-296f-475c-884a-02ca5606fd36 +md""" +![2layerocean.png](https://raw.githubusercontent.com/mitmath/JuliaComputation/main/notebooks/2layerocean.png) +""" + + +# ╔═║ 59e682aa-0ccd-46eb-91cf-0c18bcf79575 +md""" +The term $\mu (\delta T_u - \delta T_d)$ represents the exchange of heat between the upper layer and the deeper layer. We will use ΞΌ = 1.0 W/m^2 as a representative value. + +Much like in the problem of coupling an ocean and an atmosphere, we once again have two timescales associated with the different heat capacities of the upper ocean (smaller) and the deep ocean (larger). +""" + +# ╔═║ 06108680-874d-4eed-8524-8adb668095b4 +begin + year = 365 * 86400 + C_u = 4000 * 1000 * 100 * 0.7 / year # Heat capaicy of ocean mixed layer [Wyr/m^2/Β°K] + C_d = 4000 * 1000 * 3900 * 0.7/ year # Heat capacity of deep ocean [Wyr/m^2/Β°K] + Ξ΄Tβ‚€ = 0 # Initial temperature peturbation + ΞΌ = 1 # Rate of heat exchange between surface and deep ocean [W/m^2/K] +end + +# ╔═║ fc8f0d12-c4c1-4686-8fe6-e8c1c51640e6 +function oceanmodel!(du, u, p, t) + + Ξ΄T_u = u[1] + Ξ΄T_d = u[2] + + du[1] = (1/C_u) * (Ξ΄F(430) - Ξ» * Ξ΄T_u - ΞΌ * (Ξ΄T_u-Ξ΄T_d)) + du[2] = (1/C_d) * ( ΞΌ * (Ξ΄T_u-Ξ΄T_d)) + +end + +# ╔═║ b43a8ff7-284d-41cd-aadc-8f684fc9705e +md""" +Ξ”t = $(@bind Ξ”t Slider(0:5:2000, show_value=true, default=100) ) +""" + +# ╔═║ fd887ed0-0248-4849-b4a6-4d428650938f +begin + p2l = ODEProblem(oceanmodel!, [Ξ΄Tβ‚€; Ξ΄Tβ‚€], (0.,Ξ”t)) +end + +# ╔═║ d13613d2-7907-4374-ab53-b42362fb0fee +begin + sol2l=solve(p2l) + plot(sol2l, label = ["T_u" "T_d"], + background_color_inside = :black, + xlabel = "years", + ylabel = "Temperature increase K", + ylim = (0,2), + xlim = (0,Ξ”t)) + hline!([Ξ΄F(430)/Ξ»,Ξ΄F(430)/Ξ»], c=:red, ls=:dash, label=false) + hline!([Ξ΄F(430)/(Ξ»+ΞΌ),Ξ΄F(430)/(Ξ»+ΞΌ)], c=:blue, ls=:dash, label=false) + # annotate!(0.6*timespan, 0.5+Ξ΄Tβ‚€, text("Initial Temperature = $(Ξ΄Tβ‚€) K",color=:white)) + title!("Ocean response to radiative forcing") +end + +# ╔═║ 845a8226-a6ff-4549-8954-051f124ffc52 +md""" +##### Short timescale (transient climate sensitivity) + +On short timescales the deep ocean temperature hardly changes and thus $\delta T_d \simeq 0$. The evolution of the upper ocean reduces to: + +```math +\begin{align} +&{C_u \frac{d Ξ΄T_u}{dt}} = \delta F - (\lambda + \mu ) \delta T_u \\ +\end{align} +``` +Thus the transient climate sensitivity parameter which is relevant for short timesacles is given by (Ξ» + ΞΌ). The addition of ΞΌ to the parameters represents the negative feedback of the deep ocean that takes heat out of the upper ocean and thus of the atmosphere, thereby slowly the warming for the time being. The transient equilibrium temperature is given by: + +$$ +\delta T_u^{tr} = \frac{\delta F}{\lambda + \mu} +$$ + +where the superscript $tr$ stands for transient equilibrium. This transient equilibrium temperature perturbation is achieved on a timescale of order: + +$$ +\tau^{tr} \simeq \frac{C_u}{\lambda + \mu} +$$ + +This is the value plotted as a dashed blue line in the graph. + +The trasnient climate sensitivity is consistently defined as: + +$$\Delta T_{2x} = \frac{\Delta F_{2x}}{\lambda + \mu}$$ + +and it is about half of the equilibrium climate sensitivity. + +""" + +# ╔═║ be01be6f-c51c-493c-8306-bc4526c2c57a +Ξ”Tβ‚‚β‚“α΅—Κ³ = Ξ΄Fβ‚‚β‚“ / (Ξ» + ΞΌ) + +# ╔═║ 8b99c85a-478b-4ffb-848d-2812bcf3a95d +Ο„α΅—Κ³= C_u / (Ξ» + ΞΌ ) # Timescale to reach transient equilibrium in upper ocean [years] + +# ╔═║ f59c6208-2911-406d-b5b4-88c13af21f04 +md""" +##### Long timescale (equilibrium climate sensitivity) + +On timescales much loonger than Ο„α΅—Κ³, the upper ocean can be assumed to be in equilibrium and the system of equations reduces to: + +```math +\begin{align} +&0 = \delta F - \lambda \delta T_u - \mu (\delta T_u -\delta T_d) \\ +&{C_d \frac{d Ξ΄T_d}{dt}} = \mu (\delta T_u -\delta T_d) +\end{align} +``` + +which can be comined into a single equation for $\delta T_d$: + +```math +\begin{align} +&{C_d \frac{d Ξ΄T_d}{dt}} = \frac{\mu}{\lambda +\mu} \delta F - \frac{\lambda \mu}{\lambda +\mu}\delta T_d +\end{align} +``` + +At equilibrium the deep ocean must have the same temperature perturbation as the deep ocean and thus it is no surprise that the equilibrium sensitivity parameter for the two layer model is the same as the one layer model, because the two layers end up having the same temperature: + +```math +\delta T_d^{eq} = \delta T_u^{eq} = \frac{\delta F}{\lambda} +``` + + +This equilibrium temperature is achieved on the much longer timescale: + +```math +\tau^{eq} = \frac{\lambda + \mu}{\lambda \mu} C_d = \frac{(\lambda + \mu)^2}{\lambda \mu} \frac{C_d}{C_u} \tau^{tr} \gg \tau^{tr} +``` + + +""" + +# ╔═║ 683ad1f3-45bc-40a0-9f7d-49d9929dd783 +Ο„eq = (Ξ» + ΞΌ) / (Ξ» * ΞΌ) * C_d # Timescale to reach equilibrium in deep ocean [years] + +# ╔═║ 96459714-eb2a-4b6f-9b64-7b1935ff2acc +md""" + +Kostov and collaborators (Geophysical Research Letters, 2014) find that this two layer ocean model describes quite accurately the sea surface temperature response to quadrupling CO$_2$ perturbation experiments simulated with full climate models. + +""" + +# ╔═║ f3f4733a-b962-43a7-8471-83db5a3b24be +html"""""" + +# ╔═║ 2870c288-1d32-435c-85d4-9f9a96887686 +md""" +Figure. (a) Area-averaged SST anomaly in CMIP5 4 Γ— CO2 simulations ; (b) Vertical distribution of the ocean heat anomaly in CMIP5 models, averaged over the World Ocean, 100 years after the CO2 quadrupling; (c) SST response under model-specific feedback and forcing (urn:x-wiley:grl:media:grl51455:grl51455-math-0001), but ensemble-mean ocean properties (q, h2, Ο΅), as simulated by the two-layer ocean energy balance model (EBM) (see section 3); (d) SST response under model-specific ocean properties (q, h2, Ο΅) but ensemble-mean feedback and forcing (urn:x-wiley:grl:media:grl51455:grl51455-math-0002), as simulated by the two-layer ocean EBM (see section 3). The eight CMIP5 models included here are those for which sufficient output was accessible at the time of our analysis (ocean temperature, sea surface heat flux, and AMOC data). +""" + +# ╔═║ b3f47df2-0575-4338-b10b-41a644fe6307 +md""" +A major implication of our simple two layer ocean model is that the heat we have experience is the last century is probably only half of what we have already committed to, because the deep ocean will keep warming up. +""" + +# ╔═║ 393225c6-d748-45e3-951d-dc4f207b612c +md""" +### Applications to present climate +--- +--- + +We now apply our simple model to see if it can predict the observed mean surface temperature increase in the last seventy years as a a function of CO$_2$ concentrations measured in the atmosphere over the same period. + +""" + +# ╔═║ b426d86c-301f-469b-a515-e24f61c4581c +md""" +#### COβ‚‚ concentrations measurements from Mauna Loa Volcano +--- +![Mauna Loa Volcano](https://i.pinimg.com/originals/df/1a/e7/df1ae72cfd5e6d0d535c0ec99e708f6f.jpg) +""" + +# ╔═║ df4e8359-af8b-4bd5-aca0-7f6dd84859d4 +CO2_historical_data_url = "https://scrippsco2.ucsd.edu/assets/data/atmospheric/stations/in_situ_co2/monthly/monthly_in_situ_co2_mlo.csv" + +# ╔═║ 4996492f-f1ed-43bf-8997-ebbe898369fb +CO2_historical_filename = download(CO2_historical_data_url) + +# ╔═║ c3b0b7fc-19be-4f04-8787-6349ab9bff7f +begin + + offset = findfirst(!startswith("\""), readlines(CO2_historical_filename)) + + CO2_historical_data_raw = CSV.read( + CO2_historical_filename, DataFrame; + header=offset, + skipto=offset + 3, + ); + + + first(CO2_historical_data_raw, 11) +end + +# ╔═║ 81eba9ae-2801-4dad-9aae-e49d9472c022 +validrowsmask = CO2_historical_data_raw[:, " CO2"] .> 0 + +# ╔═║ 382c2042-bd5c-4b85-9e41-ce49417c7199 +CO2_historical_data = CO2_historical_data_raw[validrowsmask,:]; + +# ╔═║ 0d9ef95a-c7c4-4053-b0bc-385d94c25da9 +begin + begin + plot( CO2_historical_data[:, " Date"] , CO2_historical_data[:, " CO2"], label="Mauna Loa COβ‚‚ data (Keeling curve)") +# plot!( years, COβ‚‚.(years.-1850), lw=3 , label="Cubic Fit", legend=:topleft) + xlabel!("year") + ylabel!("COβ‚‚ (ppm)") + title!("COβ‚‚ observations") + + end +end + +# ╔═║ d3c9d49f-dccd-42eb-85f4-c81456eb3290 +md""" +#### Global temperature measurements from NASA +--- +![NASA](https://earthobservatory.nasa.gov/ContentWOC/images/globaltemp/global_gis_2021.jpg) +""" + +# ╔═║ 525c5d42-e0f8-439c-9b45-2f320833e81a +begin + T_url = "https://data.giss.nasa.gov/gistemp/graphs/graph_data/Global_Mean_Estimates_based_on_Land_and_Ocean_Data/graph.txt"; + T_df = CSV.read(download(T_url),DataFrame, header=false, skipto=6,delim=" "); + # T_df = T_df[:,[1,6]] +end + +# ╔═║ 1d73652e-b5e9-4a0b-8f51-3a8a0047df62 +begin + plot( parse.(Float64, T_df[:,1]), parse.(Float64, T_df[:,2]) .+ 14.15, color=:red, label="NASA Observations", legend=:topleft) + xlabel!("year") + ylabel!("Temp Β°C") +end + +# ╔═║ 6c14ae3b-cc82-49ad-90b3-d312eb4cd1ee +md""" +#### Modeling temperature increase +--- +""" + +# ╔═║ e9fa9953-715a-4531-93bb-2332c90322e4 +md""" +Let's make a fit to the COβ‚‚ data from Mouna Loa to extrapolate back in time and cover the same temporal range as the temp[erature data +""" + +# ╔═║ 9ce7348b-761a-4dd0-8523-08aaa9a78aa9 +begin + # COβ‚‚(t) = COβ‚‚_PreIndust # no emissions + # COβ‚‚(t) = COβ‚‚_PreIndust * 1.01^t # test model + years = 1850:2020 + modelCOβ‚‚(t) = COβ‚‚_PI * (1+ (t/220)^3 ) +end + +# ╔═║ 692a6928-c7a2-4b61-a794-16bef5d4e919 +begin + begin + plot( CO2_historical_data[:, " Date"] , CO2_historical_data[:, " CO2"], label="Mauna Loa COβ‚‚ data (Keeling curve)") + plot!( years, modelCOβ‚‚.(years.-1850), lw=3 , label="Cubic Fit", legend=:topleft) + xlabel!("year") + ylabel!("COβ‚‚ (ppm)") + title!("COβ‚‚ observations and fit") + + end +end + +# ╔═║ e45e36f6-6d45-42e7-b8d9-aff28bc57345 +md""" +For simplicity we will consider only the transient response (i.e. we will assume the temperature of the deep ocean does not change), because it has little effect on the timescales over which we have a record. +""" + +# ╔═║ e174edd3-4c43-4fb0-9a6a-4ca53ad4aded +md""" +Climate feedback Ξ»β‚› = $(@bind Ξ»β‚› Slider(0:.1:4, show_value=true, default=Ξ»+ΞΌ)) + +Upper ocean Heat Capacity C =$(@bind C Slider(0.1:.1:200, show_value=true, default=C_u)) + +Starting temperature Tβ‚€ = $(@bind Tβ‚€ Slider(12:.05:16; show_value=true, default=14)) +""" + +# ╔═║ 1eea5e69-1380-485c-b67e-589f707cf315 +pshort = ODEProblem( (temp, p, t)-> (1/C) * (Ξ»β‚›*(Tβ‚€-temp) + Ξ΄F(modelCOβ‚‚(t)) ) , Tβ‚€, (0.0, 170) ) + +# ╔═║ d250f09d-3678-4093-bec6-6b7b17260fe8 +solpshort = solve(pshort); + +# ╔═║ 352c81df-7bdd-4671-834e-fb875a78bdcc +begin + plot(years,solpshort.(years.-1850),lw=2,label="Predicted Temperature from model", legend=:topleft) + xlabel!("year") + ylabel!("Temp Β°C") + + plot!( parse.(Float64, T_df[:,1]), parse.(Float64, T_df[:,2]) .+ 14.15, color=:black, label="NASA Observations", legend=:topleft) +end + +# ╔═║ e7ae1922-6327-40a5-995e-aeb6a2d10fa1 +md""" #### Best- and worst-case projections of future global warming +--- + +""" + +# ╔═║ 9fcb25f4-397b-4f1d-8b50-250f64bf44d2 +md"""Consider two divergent hypothetical futures: +1. a **low-emissions** world in which emissions decrease such that CO2 concentrations stay below 500 ppm by 2100 (known in climate circles as "RCP2.6") and +2. a **high-emissions** world in which emissions continue increasing and CO2 concentrations soar upwards of 1200 ppm ("RCP8.5"). +""" + +# ╔═║ 9014add9-262d-403b-b9de-5ba5b78ebb77 +md""" +![](https://raw.githubusercontent.com/mitmath/18S191/Spring21/notebooks/week12/predictthefuture.svg) +""" + +# ╔═║ 00d30375-cbc4-4d6e-b353-5d20adbe0743 +md""" +In the low-emissions scenario, the temperature increase stays below $Ξ”T = 2$ Β°C by 2100, while in the high-emissions scenario temperatures soar upwards of 3.5ΒΊC above pre-industrial levels. +""" + +# ╔═║ 414f42ac-2d03-451c-8d45-7458726c7345 +md"Although the greenhouse effect due to human-caused COβ‚‚ emissions is the dominant forcing behind historical and future-projected warming, modern climate modelling considers a fairly exhaustive list of other forcing factors (aerosols, other greenhouse gases, ozone, land-use changes, etc.). The video below shows a breakdown of these forcing factors in a state-of-the-art climate model simulation of the historical period." + +# ╔═║ 00000000-0000-0000-0000-000000000001 +PLUTO_PROJECT_TOML_CONTENTS = """ +[deps] +CSV = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b" +DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" +DifferentialEquations = "0c46a032-eb83-5123-abaf-570d42b7fbaa" +Images = "916415d5-f1e6-5110-898d-aaa5f9f070e0" +LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" +Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" +PlutoUI = "7f904dfe-b85e-4ff6-b463-dae2292396a8" + +[compat] +CSV = "~0.10.4" +DataFrames = "~1.4.1" +DifferentialEquations = "~7.5.0" +Images = "~0.25.2" +Plots = "~1.35.3" +PlutoUI = "~0.7.44" +""" + +# ╔═║ 00000000-0000-0000-0000-000000000002 +PLUTO_MANIFEST_TOML_CONTENTS = """ +# This file is machine-generated - editing it directly is not advised + +julia_version = "1.8.0-rc4" +manifest_format = "2.0" +project_hash = "fe49a22112c468a48cc85d97323f94703adf3fff" + +[[deps.AbstractFFTs]] +deps = ["ChainRulesCore", "LinearAlgebra"] +git-tree-sha1 = "69f7020bd72f069c219b5e8c236c1fa90d2cb409" +uuid = "621f4979-c628-5d54-868e-fcf4e3e8185c" +version = "1.2.1" + +[[deps.AbstractPlutoDingetjes]] +deps = ["Pkg"] +git-tree-sha1 = "8eaf9f1b4921132a4cff3f36a1d9ba923b14a481" +uuid = "6e696c72-6542-2067-7265-42206c756150" +version = "1.1.4" + +[[deps.Adapt]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "195c5505521008abea5aee4f96930717958eac6f" +uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" +version = "3.4.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 = ["ArrayInterfaceCore", "Compat", "IfElse", "LinearAlgebra", "Static"] +git-tree-sha1 = "d6173480145eb632d6571c148d94b9d3d773820e" +uuid = "4fba245c-0d91-5ea0-9b3e-6abc04ee57a9" +version = "6.0.23" + +[[deps.ArrayInterfaceCore]] +deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"] +git-tree-sha1 = "5bb0f8292405a516880a3809954cb832ae7a31c5" +uuid = "30b0a656-2188-435a-8636-2ec0e6a096e2" +version = "0.1.20" + +[[deps.ArrayInterfaceGPUArrays]] +deps = ["Adapt", "ArrayInterfaceCore", "GPUArraysCore", "LinearAlgebra"] +git-tree-sha1 = "fc114f550b93d4c79632c2ada2924635aabfa5ed" +uuid = "6ba088a2-8465-4c0a-af30-387133b534db" +version = "0.2.2" + +[[deps.ArrayInterfaceOffsetArrays]] +deps = ["ArrayInterface", "OffsetArrays", "Static"] +git-tree-sha1 = "c49f6bad95a30defff7c637731f00934c7289c50" +uuid = "015c0d05-e682-4f19-8f0a-679ce4c54826" +version = "0.1.6" + +[[deps.ArrayInterfaceStaticArrays]] +deps = ["Adapt", "ArrayInterface", "ArrayInterfaceStaticArraysCore", "LinearAlgebra", "Static", "StaticArrays"] +git-tree-sha1 = "efb000a9f643f018d5154e56814e338b5746c560" +uuid = "b0d46f97-bff5-4637-a19a-dd75974142cd" +version = "0.1.4" + +[[deps.ArrayInterfaceStaticArraysCore]] +deps = ["Adapt", "ArrayInterfaceCore", "LinearAlgebra", "StaticArraysCore"] +git-tree-sha1 = "a1e2cf6ced6505cbad2490532388683f1e88c3ed" +uuid = "dd5226c6-a4d4-4bc7-8575-46859f9c95b9" +version = "0.1.0" + +[[deps.ArrayLayouts]] +deps = ["FillArrays", "LinearAlgebra", "SparseArrays"] +git-tree-sha1 = "9a8017694c92ca097b23b3b43806be560af4c2ce" +uuid = "4c555306-a7a7-4459-81d9-ec55ddd5c99a" +version = "0.8.12" + +[[deps.Artifacts]] +uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" + +[[deps.AxisAlgorithms]] +deps = ["LinearAlgebra", "Random", "SparseArrays", "WoodburyMatrices"] +git-tree-sha1 = "66771c8d21c8ff5e3a93379480a2307ac36863f7" +uuid = "13072b0f-2c55-5437-9ae7-d433b7a33950" +version = "1.0.1" + +[[deps.AxisArrays]] +deps = ["Dates", "IntervalSets", "IterTools", "RangeArrays"] +git-tree-sha1 = "1dd4d9f5beebac0c03446918741b1a03dc5e5788" +uuid = "39de3d68-74b9-583c-8d2d-e117c070f3a9" +version = "0.4.6" + +[[deps.BandedMatrices]] +deps = ["ArrayLayouts", "FillArrays", "LinearAlgebra", "Random", "SparseArrays"] +git-tree-sha1 = "d37d493a1fc680257f424e656da06f4704c4444b" +uuid = "aae01518-5342-5314-be14-df237901396f" +version = "0.17.7" + +[[deps.Base64]] +uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" + +[[deps.BitFlags]] +git-tree-sha1 = "84259bb6172806304b9101094a7cc4bc6f56dbc6" +uuid = "d1d4a3ce-64b1-5f1a-9ba4-7e7e69966f35" +version = "0.1.5" + +[[deps.BitTwiddlingConvenienceFunctions]] +deps = ["Static"] +git-tree-sha1 = "eaee37f76339077f86679787a71990c4e465477f" +uuid = "62783981-4cbd-42fc-bca8-16325de8dc4b" +version = "0.1.4" + +[[deps.BoundaryValueDiffEq]] +deps = ["BandedMatrices", "DiffEqBase", "FiniteDiff", "ForwardDiff", "LinearAlgebra", "NLsolve", "Reexport", "SciMLBase", "SparseArrays"] +git-tree-sha1 = "2f80b70bd3ddd9aa3ec2d77604c1121bd115650e" +uuid = "764a87c0-6b3e-53db-9096-fe964310641d" +version = "2.9.0" + +[[deps.Bzip2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "19a35467a82e236ff51bc17a3a44b69ef35185a2" +uuid = "6e34b625-4abd-537c-b88f-471c36dfa7a0" +version = "1.0.8+0" + +[[deps.CEnum]] +git-tree-sha1 = "eb4cb44a499229b3b8426dcfb5dd85333951ff90" +uuid = "fa961155-64e5-5f13-b03f-caf6b980ea82" +version = "0.4.2" + +[[deps.CPUSummary]] +deps = ["CpuId", "IfElse", "Static"] +git-tree-sha1 = "9bdd5aceea9fa109073ace6b430a24839d79315e" +uuid = "2a0fbf3d-bb9c-48f3-b0a9-814d99fd7ab9" +version = "0.1.27" + +[[deps.CSV]] +deps = ["CodecZlib", "Dates", "FilePathsBase", "InlineStrings", "Mmap", "Parsers", "PooledArrays", "SentinelArrays", "Tables", "Unicode", "WeakRefStrings"] +git-tree-sha1 = "873fb188a4b9d76549b81465b1f75c82aaf59238" +uuid = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b" +version = "0.10.4" + +[[deps.Cairo_jll]] +deps = ["Artifacts", "Bzip2_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.CatIndices]] +deps = ["CustomUnitRanges", "OffsetArrays"] +git-tree-sha1 = "a0f80a09780eed9b1d106a1bf62041c2efc995bc" +uuid = "aafaddc9-749c-510e-ac4f-586e18779b91" +version = "0.2.2" + +[[deps.ChainRulesCore]] +deps = ["Compat", "LinearAlgebra", "SparseArrays"] +git-tree-sha1 = "e7ff6cadf743c098e08fca25c91103ee4303c9bb" +uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" +version = "1.15.6" + +[[deps.ChangesOfVariables]] +deps = ["ChainRulesCore", "LinearAlgebra", "Test"] +git-tree-sha1 = "38f7a08f19d8810338d4f5085211c7dfa5d5bdd8" +uuid = "9e997f8a-9a97-42d5-a9f1-ce6bfc15e2c0" +version = "0.1.4" + +[[deps.CloseOpenIntervals]] +deps = ["ArrayInterface", "Static"] +git-tree-sha1 = "5522c338564580adf5d58d91e43a55db0fa5fb39" +uuid = "fb6a15b2-703c-40df-9091-08a04967cfa9" +version = "0.1.10" + +[[deps.Clustering]] +deps = ["Distances", "LinearAlgebra", "NearestNeighbors", "Printf", "Random", "SparseArrays", "Statistics", "StatsBase"] +git-tree-sha1 = "64df3da1d2a26f4de23871cd1b6482bb68092bd5" +uuid = "aaaa29a8-35af-508c-8bc3-b662a17a0fe5" +version = "0.14.3" + +[[deps.CodecZlib]] +deps = ["TranscodingStreams", "Zlib_jll"] +git-tree-sha1 = "ded953804d019afa9a3f98981d99b33e3db7b6da" +uuid = "944b1d66-785c-5afd-91f1-9de20f533193" +version = "0.7.0" + +[[deps.ColorSchemes]] +deps = ["ColorTypes", "ColorVectorSpace", "Colors", "FixedPointNumbers", "Random"] +git-tree-sha1 = "1fd869cc3875b57347f7027521f561cf46d1fcd8" +uuid = "35d6a980-a343-548e-a6ea-1d62b119f2f4" +version = "3.19.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", "SpecialFunctions", "Statistics", "TensorCore"] +git-tree-sha1 = "d08c20eef1f2cbc6e60fd3612ac4340b89fea322" +uuid = "c3611d14-8923-5661-9e6a-0046d554d3a4" +version = "0.9.9" + +[[deps.Colors]] +deps = ["ColorTypes", "FixedPointNumbers", "Reexport"] +git-tree-sha1 = "417b0ed7b8b838aa6ca0a87aadf1bb9eb111ce40" +uuid = "5ae59095-9a9b-59fe-a467-6f913c188581" +version = "0.12.8" + +[[deps.CommonSolve]] +git-tree-sha1 = "332a332c97c7071600984b3c31d9067e1a4e6e25" +uuid = "38540f10-b2f7-11e9-35d8-d573e4eb0ff2" +version = "0.2.1" + +[[deps.CommonSubexpressions]] +deps = ["MacroTools", "Test"] +git-tree-sha1 = "7b8a93dba8af7e3b42fecabf646260105ac373f7" +uuid = "bbf7d656-a473-5ed7-a52c-81e309532950" +version = "0.3.0" + +[[deps.Compat]] +deps = ["Dates", "LinearAlgebra", "UUIDs"] +git-tree-sha1 = "3ca828fe1b75fa84b021a7860bd039eaea84d2f2" +uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" +version = "4.3.0" + +[[deps.CompilerSupportLibraries_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" +version = "0.5.2+0" + +[[deps.ComputationalResources]] +git-tree-sha1 = "52cb3ec90e8a8bea0e62e275ba577ad0f74821f7" +uuid = "ed09eef8-17a6-5b46-8889-db040fac31e3" +version = "0.3.2" + +[[deps.ConstructionBase]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "fb21ddd70a051d882a1686a5a550990bbe371a95" +uuid = "187b0558-2788-49d3-abe0-74a17ed4e7c9" +version = "1.4.1" + +[[deps.Contour]] +git-tree-sha1 = "d05d9e7b7aedff4e5b51a029dced05cfb6125781" +uuid = "d38c429a-6771-53c6-b99e-75d170b6e991" +version = "0.6.2" + +[[deps.CoordinateTransformations]] +deps = ["LinearAlgebra", "StaticArrays"] +git-tree-sha1 = "681ea870b918e7cff7111da58791d7f718067a19" +uuid = "150eb455-5306-5404-9cee-2592286d6298" +version = "0.6.2" + +[[deps.CpuId]] +deps = ["Markdown"] +git-tree-sha1 = "fcbb72b032692610bfbdb15018ac16a36cf2e406" +uuid = "adafc99b-e345-5852-983c-f28acb93d879" +version = "0.3.1" + +[[deps.Crayons]] +git-tree-sha1 = "249fe38abf76d48563e2f4556bebd215aa317e15" +uuid = "a8cc5b0e-0ffa-5ad4-8c14-923d3ee1735f" +version = "4.1.1" + +[[deps.CustomUnitRanges]] +git-tree-sha1 = "1a3f97f907e6dd8983b744d2642651bb162a3f7a" +uuid = "dc8bdbbb-1ca9-579f-8c36-e416f6a65cce" +version = "1.0.2" + +[[deps.DataAPI]] +git-tree-sha1 = "46d2680e618f8abd007bce0c3026cb0c4a8f2032" +uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a" +version = "1.12.0" + +[[deps.DataFrames]] +deps = ["Compat", "DataAPI", "Future", "InvertedIndices", "IteratorInterfaceExtensions", "LinearAlgebra", "Markdown", "Missings", "PooledArrays", "PrettyTables", "Printf", "REPL", "Random", "Reexport", "SnoopPrecompile", "SortingAlgorithms", "Statistics", "TableTraits", "Tables", "Unicode"] +git-tree-sha1 = "558078b0b78278683a7445c626ee78c86b9bb000" +uuid = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" +version = "1.4.1" + +[[deps.DataStructures]] +deps = ["Compat", "InteractiveUtils", "OrderedCollections"] +git-tree-sha1 = "d1fff3a548102f48987a52a2e0d114fa97d730f0" +uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" +version = "0.18.13" + +[[deps.DataValueInterfaces]] +git-tree-sha1 = "bfc1187b79289637fa0ef6d4436ebdfe6905cbd6" +uuid = "e2d170a0-9d28-54be-80f0-106bbe20a464" +version = "1.0.0" + +[[deps.Dates]] +deps = ["Printf"] +uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" + +[[deps.DelayDiffEq]] +deps = ["ArrayInterface", "DataStructures", "DiffEqBase", "LinearAlgebra", "Logging", "NonlinearSolve", "OrdinaryDiffEq", "Printf", "RecursiveArrayTools", "Reexport", "SciMLBase", "UnPack"] +git-tree-sha1 = "044928c20c9f8f61b6d8de5d879987a271f86220" +uuid = "bcd4f6db-9728-5f36-b5f7-82caef46ccdb" +version = "5.38.1" + +[[deps.DelimitedFiles]] +deps = ["Mmap"] +uuid = "8bb1440f-4735-579b-a4ab-409b98df4dab" + +[[deps.DensityInterface]] +deps = ["InverseFunctions", "Test"] +git-tree-sha1 = "80c3e8639e3353e5d2912fb3a1916b8455e2494b" +uuid = "b429d917-457f-4dbc-8f4c-0cc954292b1d" +version = "0.4.0" + +[[deps.DiffEqBase]] +deps = ["ArrayInterfaceCore", "ChainRulesCore", "DataStructures", "Distributions", "DocStringExtensions", "FastBroadcast", "ForwardDiff", "FunctionWrappers", "FunctionWrappersWrappers", "LinearAlgebra", "Logging", "MuladdMacro", "NonlinearSolve", "Parameters", "Printf", "RecursiveArrayTools", "Reexport", "Requires", "SciMLBase", "Setfield", "SparseArrays", "Static", "StaticArrays", "Statistics", "Tricks", "ZygoteRules"] +git-tree-sha1 = "c272e6fb3c3558d807886d5247ed2a0b9c6f3823" +uuid = "2b5f629d-d688-5b77-993f-72d75c75574e" +version = "6.105.1" + +[[deps.DiffEqCallbacks]] +deps = ["DataStructures", "DiffEqBase", "ForwardDiff", "LinearAlgebra", "Markdown", "NLsolve", "Parameters", "RecipesBase", "RecursiveArrayTools", "SciMLBase", "StaticArrays"] +git-tree-sha1 = "16cecaff5228c6cb22cda8e81aa96442395cdfc5" +uuid = "459566f4-90b8-5000-8ac3-15dfb0a30def" +version = "2.24.2" + +[[deps.DiffEqNoiseProcess]] +deps = ["DiffEqBase", "Distributions", "GPUArraysCore", "LinearAlgebra", "Markdown", "Optim", "PoissonRandom", "QuadGK", "Random", "Random123", "RandomNumbers", "RecipesBase", "RecursiveArrayTools", "ResettableStacks", "SciMLBase", "StaticArrays", "Statistics"] +git-tree-sha1 = "8ba7a8913dc57c087d3cdc9b67eb1c9d760125bc" +uuid = "77a26b50-5914-5dd7-bc55-306e6241c503" +version = "5.13.0" + +[[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 = "992a23afdb109d0d2f8802a30cf5ae4b1fe7ea68" +uuid = "b552c78f-8df3-52c6-915a-8e097449b14b" +version = "1.11.1" + +[[deps.DifferentialEquations]] +deps = ["BoundaryValueDiffEq", "DelayDiffEq", "DiffEqBase", "DiffEqCallbacks", "DiffEqNoiseProcess", "JumpProcesses", "LinearAlgebra", "LinearSolve", "OrdinaryDiffEq", "Random", "RecursiveArrayTools", "Reexport", "SciMLBase", "SteadyStateDiffEq", "StochasticDiffEq", "Sundials"] +git-tree-sha1 = "f6b75cc940e8791b5cef04d29eb88731955e759c" +uuid = "0c46a032-eb83-5123-abaf-570d42b7fbaa" +version = "7.5.0" + +[[deps.Distances]] +deps = ["LinearAlgebra", "SparseArrays", "Statistics", "StatsAPI"] +git-tree-sha1 = "3258d0659f812acde79e8a74b11f17ac06d0ca04" +uuid = "b4f34e82-e78d-54a5-968a-f98e89d6e8f7" +version = "0.10.7" + +[[deps.Distributed]] +deps = ["Random", "Serialization", "Sockets"] +uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" + +[[deps.Distributions]] +deps = ["ChainRulesCore", "DensityInterface", "FillArrays", "LinearAlgebra", "PDMats", "Printf", "QuadGK", "Random", "SparseArrays", "SpecialFunctions", "Statistics", "StatsBase", "StatsFuns", "Test"] +git-tree-sha1 = "04db820ebcfc1e053bd8cbb8d8bccf0ff3ead3f7" +uuid = "31c24e10-a181-5473-b8eb-7969acd0382f" +version = "0.25.76" + +[[deps.DocStringExtensions]] +deps = ["LibGit2"] +git-tree-sha1 = "5158c2b41018c5f7eb1470d558127ac274eca0c9" +uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" +version = "0.9.1" + +[[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.Expat_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "bad72f730e9e91c08d9427d5e8db95478a3c323d" +uuid = "2e619515-83b5-522b-bb60-26c02a35a201" +version = "2.4.8+0" + +[[deps.ExponentialUtilities]] +deps = ["ArrayInterfaceCore", "GPUArraysCore", "GenericSchur", "LinearAlgebra", "Printf", "SparseArrays", "libblastrampoline_jll"] +git-tree-sha1 = "b19c3f5001b11b71d0f970f354677d604f3a1a97" +uuid = "d4d017d3-3776-5f7e-afef-a10c40355c18" +version = "1.19.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", "Pkg", "Zlib_jll", "libaom_jll", "libass_jll", "libfdk_aac_jll", "libvorbis_jll", "x264_jll", "x265_jll"] +git-tree-sha1 = "74faea50c1d007c85837327f6775bea60b5492dd" +uuid = "b22a6f82-2f65-5046-a5b2-351ab43fb4e5" +version = "4.4.2+2" + +[[deps.FFTViews]] +deps = ["CustomUnitRanges", "FFTW"] +git-tree-sha1 = "cbdf14d1e8c7c8aacbe8b19862e0179fd08321c2" +uuid = "4f61f5a4-77b1-5117-aa51-3ab5ef4ef0cd" +version = "0.3.2" + +[[deps.FFTW]] +deps = ["AbstractFFTs", "FFTW_jll", "LinearAlgebra", "MKL_jll", "Preferences", "Reexport"] +git-tree-sha1 = "90630efff0894f8142308e334473eba54c433549" +uuid = "7a1cc6ca-52ef-59f5-83cd-3a7055c09341" +version = "1.5.0" + +[[deps.FFTW_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "c6033cc3892d0ef5bb9cd29b7f2f0331ea5184ea" +uuid = "f5851436-0d7a-5f13-b9de-f02708fd171a" +version = "3.3.10+0" + +[[deps.FastBroadcast]] +deps = ["ArrayInterface", "ArrayInterfaceCore", "LinearAlgebra", "Polyester", "Static", "StrideArraysCore"] +git-tree-sha1 = "21cdeff41e5a1822c2acd7fc7934c5f450588e00" +uuid = "7034ab61-46d4-4ed7-9d0f-46aef9175898" +version = "0.2.1" + +[[deps.FastClosures]] +git-tree-sha1 = "acebe244d53ee1b461970f8910c235b259e772ef" +uuid = "9aa1b823-49e4-5ca5-8b0f-3971ec8bab6a" +version = "0.3.2" + +[[deps.FastLapackInterface]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "14a6f7a21125f715d935fe8f83560ee833f7d79d" +uuid = "29a986be-02c6-4525-aec4-84b980013641" +version = "1.2.7" + +[[deps.FileIO]] +deps = ["Pkg", "Requires", "UUIDs"] +git-tree-sha1 = "94f5101b96d2d968ace56f7f2db19d0a5f592e28" +uuid = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" +version = "1.15.0" + +[[deps.FilePathsBase]] +deps = ["Compat", "Dates", "Mmap", "Printf", "Test", "UUIDs"] +git-tree-sha1 = "e27c4ebe80e8699540f2d6c805cc12203b614f12" +uuid = "48062228-2e41-5def-b9a4-89aafe57970f" +version = "0.9.20" + +[[deps.FileWatching]] +uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" + +[[deps.FillArrays]] +deps = ["LinearAlgebra", "Random", "SparseArrays", "Statistics"] +git-tree-sha1 = "87519eb762f85534445f5cda35be12e32759ee14" +uuid = "1a297f60-69ca-5386-bcde-b61e274b549b" +version = "0.13.4" + +[[deps.FiniteDiff]] +deps = ["ArrayInterfaceCore", "LinearAlgebra", "Requires", "Setfield", "SparseArrays", "StaticArrays"] +git-tree-sha1 = "5a2cff9b6b77b33b89f3d97a4d367747adce647e" +uuid = "6a86dc24-6348-571c-b903-95158fe2bd41" +version = "2.15.0" + +[[deps.FixedPointNumbers]] +deps = ["Statistics"] +git-tree-sha1 = "335bfdceacc84c5cdf16aadc768aa5ddfc5383cc" +uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" +version = "0.8.4" + +[[deps.Fontconfig_jll]] +deps = ["Artifacts", "Bzip2_jll", "Expat_jll", "FreeType2_jll", "JLLWrappers", "Libdl", "Libuuid_jll", "Pkg", "Zlib_jll"] +git-tree-sha1 = "21efd19106a55620a188615da6d3d06cd7f6ee03" +uuid = "a3f928ae-7b40-5064-980b-68af3947d34b" +version = "2.13.93+0" + +[[deps.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", "StaticArrays"] +git-tree-sha1 = "187198a4ed8ccd7b5d99c41b69c679269ea2b2d4" +uuid = "f6369f11-7733-5829-9624-2563aa707210" +version = "0.10.32" + +[[deps.FreeType2_jll]] +deps = ["Artifacts", "Bzip2_jll", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] +git-tree-sha1 = "87eb71354d8ec1a96d4a7636bd57a7347dde3ef9" +uuid = "d7e528f0-a631-5988-bf34-fe36492bcfd7" +version = "2.10.4+0" + +[[deps.FriBidi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "aa31987c2ba8704e23c6c8ba8a4f769d5d7e4f91" +uuid = "559328eb-81f9-559d-9380-de523a88c83c" +version = "1.0.10+0" + +[[deps.FunctionWrappers]] +git-tree-sha1 = "d62485945ce5ae9c0c48f124a84998d755bae00e" +uuid = "069b7b12-0de2-55c6-9aab-29f3d0a68a2e" +version = "1.1.3" + +[[deps.FunctionWrappersWrappers]] +deps = ["FunctionWrappers"] +git-tree-sha1 = "a5e6e7f12607e90d71b09e6ce2c965e41b337968" +uuid = "77dc65aa-8811-40c2-897b-53d922fa7daf" +version = "0.1.1" + +[[deps.Future]] +deps = ["Random"] +uuid = "9fa8497b-333b-5362-9e8d-4d0656e87820" + +[[deps.GLFW_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libglvnd_jll", "Pkg", "Xorg_libXcursor_jll", "Xorg_libXi_jll", "Xorg_libXinerama_jll", "Xorg_libXrandr_jll"] +git-tree-sha1 = "d972031d28c8c8d9d7b41a536ad7bb0c2579caca" +uuid = "0656b61e-2033-5cc2-a64a-77c0f6c09b89" +version = "3.3.8+0" + +[[deps.GPUArraysCore]] +deps = ["Adapt"] +git-tree-sha1 = "6872f5ec8fd1a38880f027a26739d42dcda6691f" +uuid = "46192b85-c4d5-4398-a991-12ede77f4527" +version = "0.1.2" + +[[deps.GR]] +deps = ["Base64", "DelimitedFiles", "GR_jll", "HTTP", "JSON", "Libdl", "LinearAlgebra", "Pkg", "Preferences", "Printf", "Random", "Serialization", "Sockets", "Test", "UUIDs"] +git-tree-sha1 = "00a9d4abadc05b9476e937a5557fcce476b9e547" +uuid = "28b8d3ca-fb5f-59d9-8090-bfdbd6d07a71" +version = "0.69.5" + +[[deps.GR_jll]] +deps = ["Artifacts", "Bzip2_jll", "Cairo_jll", "FFMPEG_jll", "Fontconfig_jll", "GLFW_jll", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Libtiff_jll", "Pixman_jll", "Pkg", "Qt5Base_jll", "Zlib_jll", "libpng_jll"] +git-tree-sha1 = "bc9f7725571ddb4ab2c4bc74fa397c1c5ad08943" +uuid = "d2c73de3-f751-5644-a686-071e5b155ba9" +version = "0.69.1+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.Ghostscript_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "78e2c69783c9753a91cdae88a8d432be85a2ab5e" +uuid = "61579ee1-b43e-5ca0-a5da-69d92c66a64b" +version = "9.55.0+0" + +[[deps.Glib_jll]] +deps = ["Artifacts", "Gettext_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Libiconv_jll", "Libmount_jll", "PCRE2_jll", "Pkg", "Zlib_jll"] +git-tree-sha1 = "fb83fbe02fe57f2c068013aa94bcdf6760d3a7a7" +uuid = "7746bdde-850d-59dc-9ae8-88ece973131d" +version = "2.74.0+1" + +[[deps.Graphics]] +deps = ["Colors", "LinearAlgebra", "NaNMath"] +git-tree-sha1 = "d61890399bc535850c4bf08e4e0d3a7ad0f21cbd" +uuid = "a2bd30eb-e257-5431-a919-1863eab51364" +version = "1.1.2" + +[[deps.Graphite2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "344bf40dcab1073aca04aa0df4fb092f920e4011" +uuid = "3b182d85-2403-5c21-9c21-1e1f0cc25472" +version = "1.3.14+0" + +[[deps.Graphs]] +deps = ["ArnoldiMethod", "Compat", "DataStructures", "Distributed", "Inflate", "LinearAlgebra", "Random", "SharedArrays", "SimpleTraits", "SparseArrays", "Statistics"] +git-tree-sha1 = "ba2d094a88b6b287bd25cfa86f301e7693ffae2f" +uuid = "86223c79-3864-5bf0-83f7-82e725a168b6" +version = "1.7.4" + +[[deps.Grisu]] +git-tree-sha1 = "53bb909d1151e57e2484c3d1b53e19552b887fb2" +uuid = "42e2da0e-8278-4e71-bc24-59509adca0fe" +version = "1.0.2" + +[[deps.HTTP]] +deps = ["Base64", "CodecZlib", "Dates", "IniFile", "Logging", "LoggingExtras", "MbedTLS", "NetworkOptions", "OpenSSL", "Random", "SimpleBufferStream", "Sockets", "URIs", "UUIDs"] +git-tree-sha1 = "e8c58d5f03b9d9eb9ed7067a2f34c7c371ab130b" +uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3" +version = "1.4.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 = "b7b88a4716ac33fe31d6556c02fc60017594343c" +uuid = "3e5b6fbb-0976-4d2c-9146-d79de83f2fb0" +version = "0.1.8" + +[[deps.HypergeometricFunctions]] +deps = ["DualNumbers", "LinearAlgebra", "OpenLibm_jll", "SpecialFunctions", "Test"] +git-tree-sha1 = "709d864e3ed6e3545230601f94e11ebc65994641" +uuid = "34004b35-14d8-5ef3-9330-4cdb6864b03a" +version = "0.3.11" + +[[deps.Hyperscript]] +deps = ["Test"] +git-tree-sha1 = "8d511d5b81240fc8e6802386302675bdf47737b9" +uuid = "47d2ed2b-36de-50cf-bf87-49c2cf4b8b91" +version = "0.0.4" + +[[deps.HypertextLiteral]] +deps = ["Tricks"] +git-tree-sha1 = "c47c5fa4c5308f27ccaac35504858d8914e102f9" +uuid = "ac1192a8-f4b3-4bfe-ba22-af5b92cd3ab2" +version = "0.9.4" + +[[deps.IOCapture]] +deps = ["Logging", "Random"] +git-tree-sha1 = "f7be53659ab06ddc986428d3a9dcc95f6fa6705a" +uuid = "b5f81e59-6552-4d32-b1f0-c071b021bf89" +version = "0.2.2" + +[[deps.IfElse]] +git-tree-sha1 = "debdd00ffef04665ccbb3e150747a77560e8fad1" +uuid = "615f187c-cbe4-4ef1-ba3b-2fcf58d6d173" +version = "0.1.1" + +[[deps.ImageAxes]] +deps = ["AxisArrays", "ImageBase", "ImageCore", "Reexport", "SimpleTraits"] +git-tree-sha1 = "c54b581a83008dc7f292e205f4c409ab5caa0f04" +uuid = "2803e5a7-5153-5ecf-9a86-9b4c37f5f5ac" +version = "0.6.10" + +[[deps.ImageBase]] +deps = ["ImageCore", "Reexport"] +git-tree-sha1 = "b51bb8cae22c66d0f6357e3bcb6363145ef20835" +uuid = "c817782e-172a-44cc-b673-b171935fbb9e" +version = "0.1.5" + +[[deps.ImageContrastAdjustment]] +deps = ["ImageCore", "ImageTransformations", "Parameters"] +git-tree-sha1 = "0d75cafa80cf22026cea21a8e6cf965295003edc" +uuid = "f332f351-ec65-5f6a-b3d1-319c6670881a" +version = "0.3.10" + +[[deps.ImageCore]] +deps = ["AbstractFFTs", "ColorVectorSpace", "Colors", "FixedPointNumbers", "Graphics", "MappedArrays", "MosaicViews", "OffsetArrays", "PaddedViews", "Reexport"] +git-tree-sha1 = "acf614720ef026d38400b3817614c45882d75500" +uuid = "a09fc81d-aa75-5fe9-8630-4744c3626534" +version = "0.9.4" + +[[deps.ImageDistances]] +deps = ["Distances", "ImageCore", "ImageMorphology", "LinearAlgebra", "Statistics"] +git-tree-sha1 = "b1798a4a6b9aafb530f8f0c4a7b2eb5501e2f2a3" +uuid = "51556ac3-7006-55f5-8cb3-34580c88182d" +version = "0.2.16" + +[[deps.ImageFiltering]] +deps = ["CatIndices", "ComputationalResources", "DataStructures", "FFTViews", "FFTW", "ImageBase", "ImageCore", "LinearAlgebra", "OffsetArrays", "Reexport", "SparseArrays", "StaticArrays", "Statistics", "TiledIteration"] +git-tree-sha1 = "8b251ec0582187eff1ee5c0220501ef30a59d2f7" +uuid = "6a3955dd-da59-5b1f-98d4-e7296123deb5" +version = "0.7.2" + +[[deps.ImageIO]] +deps = ["FileIO", "IndirectArrays", "JpegTurbo", "LazyModules", "Netpbm", "OpenEXR", "PNGFiles", "QOI", "Sixel", "TiffImages", "UUIDs"] +git-tree-sha1 = "342f789fd041a55166764c351da1710db97ce0e0" +uuid = "82e4d734-157c-48bb-816b-45c225c6df19" +version = "0.6.6" + +[[deps.ImageMagick]] +deps = ["FileIO", "ImageCore", "ImageMagick_jll", "InteractiveUtils", "Libdl", "Pkg", "Random"] +git-tree-sha1 = "5bc1cb62e0c5f1005868358db0692c994c3a13c6" +uuid = "6218d12a-5da1-5696-b52f-db25d2ecc6d1" +version = "1.2.1" + +[[deps.ImageMagick_jll]] +deps = ["Artifacts", "Ghostscript_jll", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Libtiff_jll", "Pkg", "Zlib_jll", "libpng_jll"] +git-tree-sha1 = "124626988534986113cfd876e3093e4a03890f58" +uuid = "c73af94c-d91f-53ed-93a7-00f77d67a9d7" +version = "6.9.12+3" + +[[deps.ImageMetadata]] +deps = ["AxisArrays", "ImageAxes", "ImageBase", "ImageCore"] +git-tree-sha1 = "36cbaebed194b292590cba2593da27b34763804a" +uuid = "bc367c6b-8a6b-528e-b4bd-a4b897500b49" +version = "0.9.8" + +[[deps.ImageMorphology]] +deps = ["ImageCore", "LinearAlgebra", "Requires", "TiledIteration"] +git-tree-sha1 = "e7c68ab3df4a75511ba33fc5d8d9098007b579a8" +uuid = "787d08f9-d448-5407-9aad-5290dd7ab264" +version = "0.3.2" + +[[deps.ImageQualityIndexes]] +deps = ["ImageContrastAdjustment", "ImageCore", "ImageDistances", "ImageFiltering", "LazyModules", "OffsetArrays", "Statistics"] +git-tree-sha1 = "0c703732335a75e683aec7fdfc6d5d1ebd7c596f" +uuid = "2996bd0c-7a13-11e9-2da2-2f5ce47296a9" +version = "0.3.3" + +[[deps.ImageSegmentation]] +deps = ["Clustering", "DataStructures", "Distances", "Graphs", "ImageCore", "ImageFiltering", "ImageMorphology", "LinearAlgebra", "MetaGraphs", "RegionTrees", "SimpleWeightedGraphs", "StaticArrays", "Statistics"] +git-tree-sha1 = "36832067ea220818d105d718527d6ed02385bf22" +uuid = "80713f31-8817-5129-9cf8-209ff8fb23e1" +version = "1.7.0" + +[[deps.ImageShow]] +deps = ["Base64", "FileIO", "ImageBase", "ImageCore", "OffsetArrays", "StackViews"] +git-tree-sha1 = "b563cf9ae75a635592fc73d3eb78b86220e55bd8" +uuid = "4e3cecfd-b093-5904-9786-8bbb286a6a31" +version = "0.3.6" + +[[deps.ImageTransformations]] +deps = ["AxisAlgorithms", "ColorVectorSpace", "CoordinateTransformations", "ImageBase", "ImageCore", "Interpolations", "OffsetArrays", "Rotations", "StaticArrays"] +git-tree-sha1 = "8717482f4a2108c9358e5c3ca903d3a6113badc9" +uuid = "02fcd773-0e25-5acc-982a-7f6622650795" +version = "0.9.5" + +[[deps.Images]] +deps = ["Base64", "FileIO", "Graphics", "ImageAxes", "ImageBase", "ImageContrastAdjustment", "ImageCore", "ImageDistances", "ImageFiltering", "ImageIO", "ImageMagick", "ImageMetadata", "ImageMorphology", "ImageQualityIndexes", "ImageSegmentation", "ImageShow", "ImageTransformations", "IndirectArrays", "IntegralArrays", "Random", "Reexport", "SparseArrays", "StaticArrays", "Statistics", "StatsBase", "TiledIteration"] +git-tree-sha1 = "03d1301b7ec885b266c0f816f338368c6c0b81bd" +uuid = "916415d5-f1e6-5110-898d-aaa5f9f070e0" +version = "0.25.2" + +[[deps.Imath_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "87f7662e03a649cffa2e05bf19c303e168732d3e" +uuid = "905a6f67-0a94-5f89-b386-d35d92009cd1" +version = "3.1.2+0" + +[[deps.IndirectArrays]] +git-tree-sha1 = "012e604e1c7458645cb8b436f8fba789a51b257f" +uuid = "9b13fd28-a010-5f03-acff-a1bbcff69959" +version = "1.0.0" + +[[deps.Inflate]] +git-tree-sha1 = "5cd07aab533df5170988219191dfad0519391428" +uuid = "d25df0c9-e2be-5dd7-82c8-3ad0b3e990b9" +version = "0.1.3" + +[[deps.IniFile]] +git-tree-sha1 = "f550e6e32074c939295eb5ea6de31849ac2c9625" +uuid = "83e8ac13-25f8-5344-8a64-a9f2b223428f" +version = "0.5.1" + +[[deps.InlineStrings]] +deps = ["Parsers"] +git-tree-sha1 = "d0ca109edbae6b4cc00e751a29dcb15a124053d6" +uuid = "842dd82b-1e85-43dc-bf29-5d0ee9dffc48" +version = "1.2.0" + +[[deps.IntegralArrays]] +deps = ["ColorTypes", "FixedPointNumbers", "IntervalSets"] +git-tree-sha1 = "be8e690c3973443bec584db3346ddc904d4884eb" +uuid = "1d092043-8f09-5a30-832f-7509e371ab51" +version = "0.1.5" + +[[deps.IntelOpenMP_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "d979e54b71da82f3a65b62553da4fc3d18c9004c" +uuid = "1d5cc7b8-4909-519e-a0f8-d0f5ad9712d0" +version = "2018.0.3+2" + +[[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 = "842dd89a6cb75e02e85fdd75c760cdc43f5d6863" +uuid = "a98d9a8b-a2ab-59e6-89dd-64a1c18fca59" +version = "0.14.6" + +[[deps.IntervalSets]] +deps = ["Dates", "Random", "Statistics"] +git-tree-sha1 = "3f91cd3f56ea48d4d2a75c2a65455c5fc74fa347" +uuid = "8197267c-284f-5f27-9208-e0e47529a953" +version = "0.7.3" + +[[deps.InverseFunctions]] +deps = ["Test"] +git-tree-sha1 = "49510dfcb407e572524ba94aeae2fced1f3feb0f" +uuid = "3587e190-3f89-42d0-90ee-14403ec27112" +version = "0.1.8" + +[[deps.InvertedIndices]] +git-tree-sha1 = "bee5f1ef5bf65df56bdd2e40447590b272a5471f" +uuid = "41ab1584-1d38-5bbf-9106-f11c6c58b48f" +version = "1.1.0" + +[[deps.IrrationalConstants]] +git-tree-sha1 = "7fd44fd4ff43fc60815f8e764c0f352b83c49151" +uuid = "92d709cd-6900-40b7-9082-c6be49f344b6" +version = "0.1.1" + +[[deps.IterTools]] +git-tree-sha1 = "fa6287a4469f5e048d763df38279ee729fbd44e5" +uuid = "c8e1da08-722c-5040-9ed9-7db0dc04731e" +version = "1.4.0" + +[[deps.IterativeSolvers]] +deps = ["LinearAlgebra", "Printf", "Random", "RecipesBase", "SparseArrays"] +git-tree-sha1 = "1169632f425f79429f245113b775a0e3d121457c" +uuid = "42fd0dbc-a981-5370-80f2-aaf504508153" +version = "0.9.2" + +[[deps.IteratorInterfaceExtensions]] +git-tree-sha1 = "a3f24677c21f5bbe9d2a714f95dcd58337fb2856" +uuid = "82899510-4779-5014-852e-03e436cf321d" +version = "1.0.0" + +[[deps.JLD2]] +deps = ["FileIO", "MacroTools", "Mmap", "OrderedCollections", "Pkg", "Printf", "Reexport", "TranscodingStreams", "UUIDs"] +git-tree-sha1 = "1c3ff7416cb727ebf4bab0491a56a296d7b8cf1d" +uuid = "033835bb-8acc-5ee8-8aae-3f567f8a3819" +version = "0.4.25" + +[[deps.JLFzf]] +deps = ["Pipe", "REPL", "Random", "fzf_jll"] +git-tree-sha1 = "f377670cda23b6b7c1c0b3893e37451c5c1a2185" +uuid = "1019f520-868f-41f5-a6de-eb00f4b6a39c" +version = "0.1.5" + +[[deps.JLLWrappers]] +deps = ["Preferences"] +git-tree-sha1 = "abc9885a7ca2052a736a600f7fa66209f96506e1" +uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" +version = "1.4.1" + +[[deps.JSON]] +deps = ["Dates", "Mmap", "Parsers", "Unicode"] +git-tree-sha1 = "3c837543ddb02250ef42f4738347454f95079d4e" +uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" +version = "0.21.3" + +[[deps.JpegTurbo]] +deps = ["CEnum", "FileIO", "ImageCore", "JpegTurbo_jll", "TOML"] +git-tree-sha1 = "a77b273f1ddec645d1b7c4fd5fb98c8f90ad10a5" +uuid = "b835a17e-a41a-41e7-81f0-2f016b05efe0" +version = "0.1.1" + +[[deps.JpegTurbo_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "b53380851c6e6664204efb2e62cd24fa5c47e4ba" +uuid = "aacddb02-875f-59d6-b918-886e6ef4fbf8" +version = "2.1.2+0" + +[[deps.JumpProcesses]] +deps = ["ArrayInterfaceCore", "DataStructures", "DiffEqBase", "DocStringExtensions", "FunctionWrappers", "Graphs", "LinearAlgebra", "Markdown", "PoissonRandom", "Random", "RandomNumbers", "RecursiveArrayTools", "Reexport", "SciMLBase", "StaticArrays", "TreeViews", "UnPack"] +git-tree-sha1 = "5a6e6c522e8a7b39b24be8eebcc13cc7885c6f2c" +uuid = "ccbc3e58-028d-4f4c-8cd5-9ae44345cda5" +version = "9.2.0" + +[[deps.KLU]] +deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse_jll"] +git-tree-sha1 = "cae5e3dfd89b209e01bcd65b3a25e74462c67ee0" +uuid = "ef3ab10e-7fda-4108-b977-705223b18434" +version = "0.3.0" + +[[deps.Krylov]] +deps = ["LinearAlgebra", "Printf", "SparseArrays"] +git-tree-sha1 = "92256444f81fb094ff5aa742ed10835a621aef75" +uuid = "ba0b0d4f-ebba-5204-a429-3ac8c609bfb7" +version = "0.8.4" + +[[deps.KrylovKit]] +deps = ["LinearAlgebra", "Printf"] +git-tree-sha1 = "49b0c1dd5c292870577b8f58c51072bd558febb9" +uuid = "0b1a1467-8014-51b9-945f-bf0ae24f4b77" +version = "0.5.4" + +[[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.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 = "f2355693d6778a178ade15952b7ac47a4ff97996" +uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" +version = "1.3.0" + +[[deps.Latexify]] +deps = ["Formatting", "InteractiveUtils", "LaTeXStrings", "MacroTools", "Markdown", "OrderedCollections", "Printf", "Requires"] +git-tree-sha1 = "ab9aa169d2160129beb241cb2750ca499b4e90e9" +uuid = "23fbe1c1-3f47-55db-b15f-69d7ec21a316" +version = "0.15.17" + +[[deps.LayoutPointers]] +deps = ["ArrayInterface", "ArrayInterfaceOffsetArrays", "ArrayInterfaceStaticArrays", "LinearAlgebra", "ManualMemory", "SIMDTypes", "Static"] +git-tree-sha1 = "b67e749fb35530979839e7b4b606a97105fe4f1c" +uuid = "10f19ff3-798f-405d-979b-55457f8fc047" +version = "0.1.10" + +[[deps.LazyArtifacts]] +deps = ["Artifacts", "Pkg"] +uuid = "4af54fe1-eca0-43a8-85a7-787d91b784e3" + +[[deps.LazyModules]] +git-tree-sha1 = "a560dd966b386ac9ae60bdd3a3d3a326062d3c3e" +uuid = "8cdb02fc-e678-4876-92c5-9defec4f444e" +version = "0.3.1" + +[[deps.LevyArea]] +deps = ["LinearAlgebra", "Random", "SpecialFunctions"] +git-tree-sha1 = "56513a09b8e0ae6485f34401ea9e2f31357958ec" +uuid = "2d8b4e74-eb68-11e8-0fb9-d5eb67b50637" +version = "1.0.0" + +[[deps.LibCURL]] +deps = ["LibCURL_jll", "MozillaCACerts_jll"] +uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" +version = "0.6.3" + +[[deps.LibCURL_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] +uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" +version = "7.84.0+0" + +[[deps.LibGit2]] +deps = ["Base64", "NetworkOptions", "Printf", "SHA"] +uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" + +[[deps.LibSSH2_jll]] +deps = ["Artifacts", "Libdl", "MbedTLS_jll"] +uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" +version = "1.10.2+0" + +[[deps.Libdl]] +uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" + +[[deps.Libffi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "0b4a5d71f3e5200a7dff793393e09dfc2d874290" +uuid = "e9f186c6-92d2-5b65-8a66-fee21dc1b490" +version = "3.2.2+1" + +[[deps.Libgcrypt_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgpg_error_jll", "Pkg"] +git-tree-sha1 = "64613c82a59c120435c067c2b809fc61cf5166ae" +uuid = "d4300ac3-e22c-5743-9152-c294e39db1e4" +version = "1.8.7+0" + +[[deps.Libglvnd_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll", "Xorg_libXext_jll"] +git-tree-sha1 = "7739f837d6447403596a75d19ed01fd08d6f56bf" +uuid = "7e76a0d4-f3c7-5321-8279-8d96eeed0f29" +version = "1.3.0+3" + +[[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", "Pkg"] +git-tree-sha1 = "42b62845d70a619f063a7da093d995ec8e15e778" +uuid = "94ce4f54-9a6c-5748-9c1c-f9c7231a4531" +version = "1.16.1+1" + +[[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", "Pkg", "Zlib_jll", "Zstd_jll"] +git-tree-sha1 = "3eb79b0ca5764d4799c06699573fd8f533259713" +uuid = "89763e89-9b03-5906-acba-b20f662cd828" +version = "4.4.0+0" + +[[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", "libblastrampoline_jll"] +uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + +[[deps.LinearSolve]] +deps = ["ArrayInterfaceCore", "DocStringExtensions", "FastLapackInterface", "GPUArraysCore", "IterativeSolvers", "KLU", "Krylov", "KrylovKit", "LinearAlgebra", "RecursiveFactorization", "Reexport", "SciMLBase", "Setfield", "SnoopPrecompile", "SparseArrays", "SuiteSparse", "UnPack"] +git-tree-sha1 = "d1a5a61fa3728fcf63c5798458bce6ec57129065" +uuid = "7ed4a6bd-45f5-4d41-b270-4a48e9bafcae" +version = "1.26.1" + +[[deps.LogExpFunctions]] +deps = ["ChainRulesCore", "ChangesOfVariables", "DocStringExtensions", "InverseFunctions", "IrrationalConstants", "LinearAlgebra"] +git-tree-sha1 = "94d9c52ca447e23eac0c0f074effbcd38830deb5" +uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688" +version = "0.3.18" + +[[deps.Logging]] +uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" + +[[deps.LoggingExtras]] +deps = ["Dates", "Logging"] +git-tree-sha1 = "5d4d2d9904227b8bd66386c1138cf4d5ffa826bf" +uuid = "e6f89c97-d47a-5376-807f-9c37f3926c36" +version = "0.4.9" + +[[deps.LoopVectorization]] +deps = ["ArrayInterface", "ArrayInterfaceCore", "ArrayInterfaceOffsetArrays", "ArrayInterfaceStaticArrays", "CPUSummary", "ChainRulesCore", "CloseOpenIntervals", "DocStringExtensions", "ForwardDiff", "HostCPUFeatures", "IfElse", "LayoutPointers", "LinearAlgebra", "OffsetArrays", "PolyesterWeave", "SIMDDualNumbers", "SIMDTypes", "SLEEFPirates", "SnoopPrecompile", "SpecialFunctions", "Static", "ThreadingUtilities", "UnPack", "VectorizationBase"] +git-tree-sha1 = "39af6a1e398a29f568dc9fe469f459ad3aacb03b" +uuid = "bdcacae8-1622-11e9-2a5c-532679323890" +version = "0.12.133" + +[[deps.MKL_jll]] +deps = ["Artifacts", "IntelOpenMP_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "Pkg"] +git-tree-sha1 = "41d162ae9c868218b1f3fe78cba878aa348c2d26" +uuid = "856f044c-d86e-5d09-b602-aeab76dc8ba7" +version = "2022.1.0+0" + +[[deps.MacroTools]] +deps = ["Markdown", "Random"] +git-tree-sha1 = "42324d08725e200c23d4dfb549e0d5d89dede2d2" +uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" +version = "0.5.10" + +[[deps.ManualMemory]] +git-tree-sha1 = "bcaef4fc7a0cfe2cba636d84cda54b5e4e4ca3cd" +uuid = "d125e4d3-2237-4719-b19c-fa641b8a4667" +version = "0.1.8" + +[[deps.MappedArrays]] +git-tree-sha1 = "e8b359ef06ec72e8c030463fe02efe5527ee5142" +uuid = "dbb5928d-eab1-5f90-85c2-b9b0edb7c900" +version = "0.4.1" + +[[deps.Markdown]] +deps = ["Base64"] +uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" + +[[deps.MbedTLS]] +deps = ["Dates", "MbedTLS_jll", "MozillaCACerts_jll", "Random", "Sockets"] +git-tree-sha1 = "6872f9594ff273da6d13c7c1a1545d5a8c7d0c1c" +uuid = "739be429-bea8-5141-9913-cc70e7f3736d" +version = "1.1.6" + +[[deps.MbedTLS_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" +version = "2.28.0+0" + +[[deps.Measures]] +git-tree-sha1 = "e498ddeee6f9fdb4551ce855a46f54dbd900245f" +uuid = "442fdcdd-2543-5da2-b0f3-8c86c306513e" +version = "0.3.1" + +[[deps.MetaGraphs]] +deps = ["Graphs", "JLD2", "Random"] +git-tree-sha1 = "2af69ff3c024d13bde52b34a2a7d6887d4e7b438" +uuid = "626554b9-1ddb-594c-aa3c-2596fe9399a5" +version = "0.7.1" + +[[deps.Missings]] +deps = ["DataAPI"] +git-tree-sha1 = "bf210ce90b6c9eed32d25dbcae1ebc565df2687f" +uuid = "e1d29d7a-bbdc-5cf2-9ac0-f12de2c33e28" +version = "1.0.2" + +[[deps.Mmap]] +uuid = "a63ad114-7e13-5084-954f-fe012c677804" + +[[deps.MosaicViews]] +deps = ["MappedArrays", "OffsetArrays", "PaddedViews", "StackViews"] +git-tree-sha1 = "b34e3bc3ca7c94914418637cb10cc4d1d80d877d" +uuid = "e94cdb99-869f-56ef-bcf0-1ae2bcbe0389" +version = "0.3.3" + +[[deps.MozillaCACerts_jll]] +uuid = "14a3606d-f60d-562e-9121-12d972cd8159" +version = "2022.2.1" + +[[deps.MuladdMacro]] +git-tree-sha1 = "c6190f9a7fc5d9d5915ab29f2134421b12d24a68" +uuid = "46d2c3a1-f734-5fdb-9937-b9b9aeba4221" +version = "0.2.2" + +[[deps.NLSolversBase]] +deps = ["DiffResults", "Distributed", "FiniteDiff", "ForwardDiff"] +git-tree-sha1 = "50310f934e55e5ca3912fb941dec199b49ca9b68" +uuid = "d41bc354-129a-5804-8e4c-c37616107c6c" +version = "7.8.2" + +[[deps.NLsolve]] +deps = ["Distances", "LineSearches", "LinearAlgebra", "NLSolversBase", "Printf", "Reexport"] +git-tree-sha1 = "019f12e9a1a7880459d0173c182e6a99365d7ac1" +uuid = "2774e3e8-f4cf-5e23-947b-6d7e65073b56" +version = "4.5.1" + +[[deps.NaNMath]] +deps = ["OpenLibm_jll"] +git-tree-sha1 = "a7c3d1da1189a1c2fe843a3bfa04d18d20eb3211" +uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" +version = "1.0.1" + +[[deps.NearestNeighbors]] +deps = ["Distances", "StaticArrays"] +git-tree-sha1 = "440165bf08bc500b8fe4a7be2dc83271a00c0716" +uuid = "b8a86587-4115-5ab1-83bc-aa920d37bbce" +version = "0.4.12" + +[[deps.Netpbm]] +deps = ["FileIO", "ImageCore"] +git-tree-sha1 = "18efc06f6ec36a8b801b23f076e3c6ac7c3bf153" +uuid = "f09324ee-3d7c-5217-9330-fc30815ba969" +version = "1.0.2" + +[[deps.NetworkOptions]] +uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" +version = "1.2.0" + +[[deps.NonlinearSolve]] +deps = ["ArrayInterfaceCore", "FiniteDiff", "ForwardDiff", "IterativeSolvers", "LinearAlgebra", "RecursiveArrayTools", "RecursiveFactorization", "Reexport", "SciMLBase", "Setfield", "StaticArrays", "UnPack"] +git-tree-sha1 = "a754a21521c0ab48d37f44bbac1eefd1387bdcfc" +uuid = "8913a72c-1f9b-4ce2-8d82-65094dcecaec" +version = "0.3.22" + +[[deps.OffsetArrays]] +deps = ["Adapt"] +git-tree-sha1 = "f71d8950b724e9ff6110fc948dff5a329f901d64" +uuid = "6fe1bfb0-de20-5000-8ca7-80f57d26f881" +version = "1.12.8" + +[[deps.Ogg_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "887579a3eb005446d514ab7aeac5d1d027658b8f" +uuid = "e7412a2a-1a6e-54c0-be00-318e2571c051" +version = "1.3.5+1" + +[[deps.OpenBLAS_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] +uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" +version = "0.3.20+0" + +[[deps.OpenEXR]] +deps = ["Colors", "FileIO", "OpenEXR_jll"] +git-tree-sha1 = "327f53360fdb54df7ecd01e96ef1983536d1e633" +uuid = "52e1d378-f018-4a11-a4be-720524705ac7" +version = "0.3.2" + +[[deps.OpenEXR_jll]] +deps = ["Artifacts", "Imath_jll", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] +git-tree-sha1 = "923319661e9a22712f24596ce81c54fc0366f304" +uuid = "18a262bb-aa17-5467-a713-aee519bc75cb" +version = "3.1.1+0" + +[[deps.OpenLibm_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "05823500-19ac-5b8b-9628-191a04bc5112" +version = "0.8.1+0" + +[[deps.OpenSSL]] +deps = ["BitFlags", "Dates", "MozillaCACerts_jll", "OpenSSL_jll", "Sockets"] +git-tree-sha1 = "ebe81469e9d7b471d7ddb611d9e147ea16de0add" +uuid = "4d8831e6-92b7-49fb-bdf8-b643e874388c" +version = "1.2.1" + +[[deps.OpenSSL_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "a94dc0169bffbf7e5250fb7e1efb1a85b09105c7" +uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95" +version = "1.1.18+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 = "b9fe76d1a39807fdcf790b991981a922de0c3050" +uuid = "429524aa-4258-5aef-a3af-852621145aeb" +version = "1.7.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 = "85f8e6578bf1f9ee0d11e7bb1b1456435479d47c" +uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" +version = "1.4.1" + +[[deps.OrdinaryDiffEq]] +deps = ["Adapt", "ArrayInterface", "ArrayInterfaceGPUArrays", "ArrayInterfaceStaticArrays", "DataStructures", "DiffEqBase", "DocStringExtensions", "ExponentialUtilities", "FastBroadcast", "FastClosures", "FiniteDiff", "ForwardDiff", "FunctionWrappersWrappers", "LinearAlgebra", "LinearSolve", "Logging", "LoopVectorization", "MacroTools", "MuladdMacro", "NLsolve", "NonlinearSolve", "Polyester", "PreallocationTools", "Preferences", "RecursiveArrayTools", "Reexport", "SciMLBase", "SnoopPrecompile", "SparseArrays", "SparseDiffTools", "StaticArrays", "UnPack"] +git-tree-sha1 = "33a819c1355faeccc68d57a3c7d7c871680d49f2" +uuid = "1dea7af3-3e70-54e6-95c3-0bf5283fa5ed" +version = "6.28.1" + +[[deps.PCRE2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "efcefdf7-47ab-520b-bdef-62a2eaa19f15" +version = "10.40.0+0" + +[[deps.PDMats]] +deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"] +git-tree-sha1 = "cf494dca75a69712a72b80bc48f59dcf3dea63ec" +uuid = "90014a1f-27ba-587c-ab20-58faa44d9150" +version = "0.11.16" + +[[deps.PNGFiles]] +deps = ["Base64", "CEnum", "ImageCore", "IndirectArrays", "OffsetArrays", "libpng_jll"] +git-tree-sha1 = "f809158b27eba0c18c269cf2a2be6ed751d3e81d" +uuid = "f57f5aa1-a3ce-4bc8-8ab9-96f992907883" +version = "0.3.17" + +[[deps.PaddedViews]] +deps = ["OffsetArrays"] +git-tree-sha1 = "03a7a85b76381a3d04c7a1656039197e70eda03d" +uuid = "5432bcbf-9aad-5242-b902-cca2824c8663" +version = "0.5.11" + +[[deps.Parameters]] +deps = ["OrderedCollections", "UnPack"] +git-tree-sha1 = "34c0e9ad262e5f7fc75b10a9952ca7692cfc5fbe" +uuid = "d96e819e-fc66-5662-9728-84c9c7592b0a" +version = "0.12.3" + +[[deps.Parsers]] +deps = ["Dates"] +git-tree-sha1 = "595c0b811cf2bab8b0849a70d9bd6379cc1cfb52" +uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" +version = "2.4.1" + +[[deps.Pipe]] +git-tree-sha1 = "6842804e7867b115ca9de748a0cf6b364523c16d" +uuid = "b98c9c47-44ae-5843-9183-064241ee97a0" +version = "1.3.0" + +[[deps.Pixman_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "b4f5d02549a10e20780a24fce72bea96b6329e29" +uuid = "30392449-352a-5448-841d-b1acce4e97dc" +version = "0.40.1+0" + +[[deps.Pkg]] +deps = ["Artifacts", "Dates", "Downloads", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] +uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" +version = "1.8.0" + +[[deps.PkgVersion]] +deps = ["Pkg"] +git-tree-sha1 = "f6cf8e7944e50901594838951729a1861e668cb8" +uuid = "eebad327-c553-4316-9ea0-9fa01ccd7688" +version = "0.3.2" + +[[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", "Printf", "Random", "Reexport", "SnoopPrecompile", "Statistics"] +git-tree-sha1 = "21303256d239f6b484977314674aef4bb1fe4420" +uuid = "995b91a9-d308-5afd-9ec6-746e21dbc043" +version = "1.3.1" + +[[deps.Plots]] +deps = ["Base64", "Contour", "Dates", "Downloads", "FFMPEG", "FixedPointNumbers", "GR", "JLFzf", "JSON", "LaTeXStrings", "Latexify", "LinearAlgebra", "Measures", "NaNMath", "Pkg", "PlotThemes", "PlotUtils", "Printf", "REPL", "Random", "RecipesBase", "RecipesPipeline", "Reexport", "RelocatableFolders", "Requires", "Scratch", "Showoff", "SnoopPrecompile", "SparseArrays", "Statistics", "StatsBase", "UUIDs", "UnicodeFun", "Unzip"] +git-tree-sha1 = "524d9ff1b2f4473fef59678c06f9f77160a204b1" +uuid = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" +version = "1.35.3" + +[[deps.PlutoUI]] +deps = ["AbstractPlutoDingetjes", "Base64", "ColorTypes", "Dates", "Hyperscript", "HypertextLiteral", "IOCapture", "InteractiveUtils", "JSON", "Logging", "Markdown", "Random", "Reexport", "UUIDs"] +git-tree-sha1 = "6e33d318cf8843dade925e35162992145b4eb12f" +uuid = "7f904dfe-b85e-4ff6-b463-dae2292396a8" +version = "0.7.44" + +[[deps.PoissonRandom]] +deps = ["Random"] +git-tree-sha1 = "9ac1bb7c15c39620685a3a7babc0651f5c64c35b" +uuid = "e409e4f3-bfea-5376-8464-e040bb5c01ab" +version = "0.4.1" + +[[deps.Polyester]] +deps = ["ArrayInterface", "BitTwiddlingConvenienceFunctions", "CPUSummary", "IfElse", "ManualMemory", "PolyesterWeave", "Requires", "Static", "StrideArraysCore", "ThreadingUtilities"] +git-tree-sha1 = "cb2ede4b9cc432c1cba4d4452a62ae1d2a4141bb" +uuid = "f517fe37-dbe3-4b94-8317-1923a5111588" +version = "0.6.16" + +[[deps.PolyesterWeave]] +deps = ["BitTwiddlingConvenienceFunctions", "CPUSummary", "IfElse", "Static", "ThreadingUtilities"] +git-tree-sha1 = "b42fb2292fbbaed36f25d33a15c8cc0b4f287fcf" +uuid = "1d0040c9-8b98-4ee7-8388-3f51789ca0ad" +version = "0.1.10" + +[[deps.PooledArrays]] +deps = ["DataAPI", "Future"] +git-tree-sha1 = "a6062fe4063cdafe78f4a0a81cfffb89721b30e7" +uuid = "2dfb63ee-cc39-5dd5-95bd-886bf059d720" +version = "1.4.2" + +[[deps.PositiveFactorizations]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "17275485f373e6673f7e7f97051f703ed5b15b20" +uuid = "85a6dd25-e78a-55b7-8502-1745935b8125" +version = "0.2.4" + +[[deps.PreallocationTools]] +deps = ["Adapt", "ArrayInterfaceCore", "ForwardDiff"] +git-tree-sha1 = "3953d18698157e1d27a51678c89c88d53e071a42" +uuid = "d236fae5-4411-538c-8e31-a6e3d9e00b46" +version = "0.4.4" + +[[deps.Preferences]] +deps = ["TOML"] +git-tree-sha1 = "47e5f437cc0e7ef2ce8406ce1e7e24d44915f88d" +uuid = "21216c6a-2e73-6563-6e65-726566657250" +version = "1.3.0" + +[[deps.PrettyTables]] +deps = ["Crayons", "Formatting", "Markdown", "Reexport", "StringManipulation", "Tables"] +git-tree-sha1 = "460d9e154365e058c4d886f6f7d6df5ffa1ea80e" +uuid = "08abe8d2-0d0c-5749-adfa-8a2ac140af0d" +version = "2.1.2" + +[[deps.Printf]] +deps = ["Unicode"] +uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" + +[[deps.ProgressMeter]] +deps = ["Distributed", "Printf"] +git-tree-sha1 = "d7a7aef8f8f2d537104f170139553b14dfe39fe9" +uuid = "92933f4c-e287-5a05-a399-4b506db050ca" +version = "1.7.2" + +[[deps.QOI]] +deps = ["ColorTypes", "FileIO", "FixedPointNumbers"] +git-tree-sha1 = "18e8f4d1426e965c7b532ddd260599e1510d26ce" +uuid = "4b34888f-f399-49d4-9bb3-47ed5cae4e65" +version = "1.0.0" + +[[deps.Qt5Base_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Fontconfig_jll", "Glib_jll", "JLLWrappers", "Libdl", "Libglvnd_jll", "OpenSSL_jll", "Pkg", "Xorg_libXext_jll", "Xorg_libxcb_jll", "Xorg_xcb_util_image_jll", "Xorg_xcb_util_keysyms_jll", "Xorg_xcb_util_renderutil_jll", "Xorg_xcb_util_wm_jll", "Zlib_jll", "xkbcommon_jll"] +git-tree-sha1 = "c6c0f690d0cc7caddb74cef7aa847b824a16b256" +uuid = "ea2cea3b-5b76-57ae-a6ef-0a8af62496e1" +version = "5.15.3+1" + +[[deps.QuadGK]] +deps = ["DataStructures", "LinearAlgebra"] +git-tree-sha1 = "3c009334f45dfd546a16a57960a821a1a023d241" +uuid = "1fd47b50-473d-5c70-9696-f719f8f3bcdc" +version = "2.5.0" + +[[deps.Quaternions]] +deps = ["DualNumbers", "LinearAlgebra", "Random"] +git-tree-sha1 = "4ab19353944c46d65a10a75289d426ef57b0a40c" +uuid = "94ee1d12-ae83-5a48-8b1c-48b8ff168ae0" +version = "0.5.7" + +[[deps.REPL]] +deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] +uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" + +[[deps.Random]] +deps = ["SHA", "Serialization"] +uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" + +[[deps.Random123]] +deps = ["Random", "RandomNumbers"] +git-tree-sha1 = "7a1a306b72cfa60634f03a911405f4e64d1b718b" +uuid = "74087812-796a-5b5d-8853-05524746bad3" +version = "1.6.0" + +[[deps.RandomNumbers]] +deps = ["Random", "Requires"] +git-tree-sha1 = "043da614cc7e95c703498a491e2c21f58a2b8111" +uuid = "e6cf234a-135c-5ec9-84dd-332b85af5143" +version = "1.5.3" + +[[deps.RangeArrays]] +git-tree-sha1 = "b9039e93773ddcfc828f12aadf7115b4b4d225f5" +uuid = "b3c3ace0-ae52-54e7-9d0b-2c1406fd6b9d" +version = "0.3.2" + +[[deps.Ratios]] +deps = ["Requires"] +git-tree-sha1 = "dc84268fe0e3335a62e315a3a7cf2afa7178a734" +uuid = "c84ed2f1-dad5-54f0-aa8e-dbefe2724439" +version = "0.4.3" + +[[deps.RecipesBase]] +deps = ["SnoopPrecompile"] +git-tree-sha1 = "612a4d76ad98e9722c8ba387614539155a59e30c" +uuid = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" +version = "1.3.0" + +[[deps.RecipesPipeline]] +deps = ["Dates", "NaNMath", "PlotUtils", "RecipesBase", "SnoopPrecompile"] +git-tree-sha1 = "9b1c0c8e9188950e66fc28f40bfe0f8aac311fe0" +uuid = "01d81517-befc-4cb6-b9ec-a95719d0359c" +version = "0.6.7" + +[[deps.RecursiveArrayTools]] +deps = ["Adapt", "ArrayInterfaceCore", "ArrayInterfaceStaticArraysCore", "ChainRulesCore", "DocStringExtensions", "FillArrays", "GPUArraysCore", "IteratorInterfaceExtensions", "LinearAlgebra", "RecipesBase", "StaticArraysCore", "Statistics", "Tables", "ZygoteRules"] +git-tree-sha1 = "3004608dc42101a944e44c1c68b599fa7c669080" +uuid = "731186ca-8d62-57ce-b412-fbd966d074cd" +version = "2.32.0" + +[[deps.RecursiveFactorization]] +deps = ["LinearAlgebra", "LoopVectorization", "Polyester", "SnoopPrecompile", "StrideArraysCore", "TriangularSolve"] +git-tree-sha1 = "0a2dfb3358fcde3676beb75405e782faa8c9aded" +uuid = "f2c3362d-daeb-58d1-803e-2bc74f2840b4" +version = "0.2.12" + +[[deps.Reexport]] +git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" +uuid = "189a3867-3050-52da-a836-e630ba90ab69" +version = "1.2.2" + +[[deps.RegionTrees]] +deps = ["IterTools", "LinearAlgebra", "StaticArrays"] +git-tree-sha1 = "4618ed0da7a251c7f92e869ae1a19c74a7d2a7f9" +uuid = "dee08c22-ab7f-5625-9660-a9af2021b33f" +version = "0.3.2" + +[[deps.RelocatableFolders]] +deps = ["SHA", "Scratch"] +git-tree-sha1 = "90bc7a7c96410424509e4263e277e43250c05691" +uuid = "05181044-ff0b-4ac5-8273-598c1e38db00" +version = "1.0.0" + +[[deps.Requires]] +deps = ["UUIDs"] +git-tree-sha1 = "838a3a4188e2ded87a4f9f184b4b0d78a1e91cb7" +uuid = "ae029012-a4dd-5104-9daa-d747884805df" +version = "1.3.0" + +[[deps.ResettableStacks]] +deps = ["StaticArrays"] +git-tree-sha1 = "256eeeec186fa7f26f2801732774ccf277f05db9" +uuid = "ae5879a3-cd67-5da8-be7f-38c6eb64a37b" +version = "1.1.1" + +[[deps.Rmath]] +deps = ["Random", "Rmath_jll"] +git-tree-sha1 = "bf3188feca147ce108c76ad82c2792c57abe7b1f" +uuid = "79098fc4-a85e-5d69-aa6a-4863f24498fa" +version = "0.7.0" + +[[deps.Rmath_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "68db32dff12bb6127bac73c209881191bf0efbb7" +uuid = "f50d1b31-88e8-58de-be2c-1cc44531875f" +version = "0.3.0+0" + +[[deps.Rotations]] +deps = ["LinearAlgebra", "Quaternions", "Random", "StaticArrays", "Statistics"] +git-tree-sha1 = "3d52be96f2ff8a4591a9e2440036d4339ac9a2f7" +uuid = "6038ab10-8711-5258-84ad-4b1120ba62dc" +version = "1.3.2" + +[[deps.SHA]] +uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" +version = "0.7.0" + +[[deps.SIMDDualNumbers]] +deps = ["ForwardDiff", "IfElse", "SLEEFPirates", "VectorizationBase"] +git-tree-sha1 = "dd4195d308df24f33fb10dde7c22103ba88887fa" +uuid = "3cdde19b-5bb0-4aaf-8931-af3e248e098b" +version = "0.1.1" + +[[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 = "938c9ecffb28338a6b8b970bda0f3806a65e7906" +uuid = "476501e8-09a2-5ece-8869-fb82de89a1fa" +version = "0.6.36" + +[[deps.SciMLBase]] +deps = ["ArrayInterfaceCore", "CommonSolve", "ConstructionBase", "Distributed", "DocStringExtensions", "FunctionWrappersWrappers", "IteratorInterfaceExtensions", "LinearAlgebra", "Logging", "Markdown", "Preferences", "RecipesBase", "RecursiveArrayTools", "StaticArraysCore", "Statistics", "Tables"] +git-tree-sha1 = "5227af27f04ad30a68e2bb48300bf1b1a965d145" +uuid = "0bca4576-84f4-4d90-8ffe-ffa030f20462" +version = "1.61.2" + +[[deps.Scratch]] +deps = ["Dates"] +git-tree-sha1 = "f94f779c94e58bf9ea243e77a37e16d9de9126bd" +uuid = "6c6a2e73-6563-6170-7368-637461726353" +version = "1.1.1" + +[[deps.SentinelArrays]] +deps = ["Dates", "Random"] +git-tree-sha1 = "efd23b378ea5f2db53a55ae53d3133de4e080aa9" +uuid = "91c51154-3ec4-41a3-a24f-3f23e20d615c" +version = "1.3.16" + +[[deps.Serialization]] +uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" + +[[deps.Setfield]] +deps = ["ConstructionBase", "Future", "MacroTools", "StaticArraysCore"] +git-tree-sha1 = "e2cc6d8c88613c05e1defb55170bf5ff211fbeac" +uuid = "efcf1570-3423-57d1-acb7-fd33fddbac46" +version = "1.1.1" + +[[deps.SharedArrays]] +deps = ["Distributed", "Mmap", "Random", "Serialization"] +uuid = "1a1011a3-84de-559e-8e89-a11a2f7dc383" + +[[deps.Showoff]] +deps = ["Dates", "Grisu"] +git-tree-sha1 = "91eddf657aca81df9ae6ceb20b959ae5653ad1de" +uuid = "992d4aef-0814-514b-bc4d-f2e9a6c4116f" +version = "1.0.3" + +[[deps.SimpleBufferStream]] +git-tree-sha1 = "874e8867b33a00e784c8a7e4b60afe9e037b74e1" +uuid = "777ac1f9-54b0-4bf8-805c-2214025038e7" +version = "1.1.0" + +[[deps.SimpleTraits]] +deps = ["InteractiveUtils", "MacroTools"] +git-tree-sha1 = "5d7e3f4e11935503d3ecaf7186eac40602e7d231" +uuid = "699a6c99-e7fa-54fc-8d76-47d257e15c1d" +version = "0.9.4" + +[[deps.SimpleWeightedGraphs]] +deps = ["Graphs", "LinearAlgebra", "Markdown", "SparseArrays", "Test"] +git-tree-sha1 = "a6f404cc44d3d3b28c793ec0eb59af709d827e4e" +uuid = "47aef6b3-ad0c-573a-a1e2-d07658019622" +version = "1.2.1" + +[[deps.Sixel]] +deps = ["Dates", "FileIO", "ImageCore", "IndirectArrays", "OffsetArrays", "REPL", "libsixel_jll"] +git-tree-sha1 = "8fb59825be681d451c246a795117f317ecbcaa28" +uuid = "45858cf5-a6b0-47a3-bbea-62219f50df47" +version = "0.1.2" + +[[deps.SnoopPrecompile]] +git-tree-sha1 = "f604441450a3c0569830946e5b33b78c928e1a85" +uuid = "66db9d55-30c0-4569-8b51-7e840670fc0c" +version = "1.0.1" + +[[deps.Sockets]] +uuid = "6462fe0b-24de-5631-8697-dd941f90decc" + +[[deps.SortingAlgorithms]] +deps = ["DataStructures"] +git-tree-sha1 = "b3363d7460f7d098ca0912c69b082f75625d7508" +uuid = "a2af1166-a08f-5f64-846c-94a0d3cef48c" +version = "1.0.1" + +[[deps.SparseArrays]] +deps = ["LinearAlgebra", "Random"] +uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + +[[deps.SparseDiffTools]] +deps = ["Adapt", "ArrayInterfaceCore", "ArrayInterfaceStaticArrays", "Compat", "DataStructures", "FiniteDiff", "ForwardDiff", "Graphs", "LinearAlgebra", "Requires", "SparseArrays", "StaticArrays", "VertexSafeGraphs"] +git-tree-sha1 = "a434a4a3a5757440cb3b6500eb9690ff5a516cf6" +uuid = "47a9eef4-7e08-11e9-0b38-333d64bd3804" +version = "1.27.0" + +[[deps.SpecialFunctions]] +deps = ["ChainRulesCore", "IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"] +git-tree-sha1 = "d75bda01f8c31ebb72df80a46c88b25d1c79c56d" +uuid = "276daf66-3868-5448-9aa4-cd146d93841b" +version = "2.1.7" + +[[deps.StackViews]] +deps = ["OffsetArrays"] +git-tree-sha1 = "46e589465204cd0c08b4bd97385e4fa79a0c770c" +uuid = "cae243ae-269e-4f55-b966-ac2d0dc13c15" +version = "0.1.1" + +[[deps.Static]] +deps = ["IfElse"] +git-tree-sha1 = "de4f0a4f049a4c87e4948c04acff37baf1be01a6" +uuid = "aedffcd0-7271-4cad-89d0-dc628f76c6d3" +version = "0.7.7" + +[[deps.StaticArrays]] +deps = ["LinearAlgebra", "Random", "StaticArraysCore", "Statistics"] +git-tree-sha1 = "f86b3a049e5d05227b10e15dbb315c5b90f14988" +uuid = "90137ffa-7385-5640-81b9-e52037218182" +version = "1.5.9" + +[[deps.StaticArraysCore]] +git-tree-sha1 = "6b7ba252635a5eff6a0b0664a41ee140a1c9e72a" +uuid = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" +version = "1.4.0" + +[[deps.Statistics]] +deps = ["LinearAlgebra", "SparseArrays"] +uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" + +[[deps.StatsAPI]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "f9af7f195fb13589dd2e2d57fdb401717d2eb1f6" +uuid = "82ae8749-77ed-4fe6-ae5f-f523153014b0" +version = "1.5.0" + +[[deps.StatsBase]] +deps = ["DataAPI", "DataStructures", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"] +git-tree-sha1 = "d1bf48bfcc554a3761a133fe3a9bb01488e06916" +uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" +version = "0.33.21" + +[[deps.StatsFuns]] +deps = ["ChainRulesCore", "HypergeometricFunctions", "InverseFunctions", "IrrationalConstants", "LogExpFunctions", "Reexport", "Rmath", "SpecialFunctions"] +git-tree-sha1 = "5783b877201a82fc0014cbf381e7e6eb130473a4" +uuid = "4c63d2b9-4356-54db-8cca-17b64c39e42c" +version = "1.0.1" + +[[deps.SteadyStateDiffEq]] +deps = ["DiffEqBase", "DiffEqCallbacks", "LinearAlgebra", "NLsolve", "Reexport", "SciMLBase"] +git-tree-sha1 = "f4492f790434f405139eb3a291fdbb45997857c6" +uuid = "9672c7b4-1e72-59bd-8a11-6ac3964bc41f" +version = "1.9.0" + +[[deps.StochasticDiffEq]] +deps = ["Adapt", "ArrayInterface", "DataStructures", "DiffEqBase", "DiffEqNoiseProcess", "DocStringExtensions", "FillArrays", "FiniteDiff", "ForwardDiff", "JumpProcesses", "LevyArea", "LinearAlgebra", "Logging", "MuladdMacro", "NLsolve", "OrdinaryDiffEq", "Random", "RandomNumbers", "RecursiveArrayTools", "Reexport", "SciMLBase", "SparseArrays", "SparseDiffTools", "StaticArrays", "UnPack"] +git-tree-sha1 = "8062351f645bb23725c494be74619ef802a2ffa8" +uuid = "789caeaf-c7a9-5a7d-9973-96adeb23e2a0" +version = "6.54.0" + +[[deps.StrideArraysCore]] +deps = ["ArrayInterface", "CloseOpenIntervals", "IfElse", "LayoutPointers", "ManualMemory", "SIMDTypes", "Static", "ThreadingUtilities"] +git-tree-sha1 = "ac730bd978bf35f9fe45daa0bd1f51e493e97eb4" +uuid = "7792a7ef-975c-4747-a70f-980b88e8d1da" +version = "0.3.15" + +[[deps.StringManipulation]] +git-tree-sha1 = "46da2434b41f41ac3594ee9816ce5541c6096123" +uuid = "892a3eda-7b42-436c-8928-eab12a02cf0e" +version = "0.3.0" + +[[deps.SuiteSparse]] +deps = ["Libdl", "LinearAlgebra", "Serialization", "SparseArrays"] +uuid = "4607b0f0-06f3-5cda-b6b1-a6196a1729e9" + +[[deps.SuiteSparse_jll]] +deps = ["Artifacts", "Libdl", "Pkg", "libblastrampoline_jll"] +uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c" +version = "5.10.1+0" + +[[deps.Sundials]] +deps = ["CEnum", "DataStructures", "DiffEqBase", "Libdl", "LinearAlgebra", "Logging", "Reexport", "SnoopPrecompile", "SparseArrays", "Sundials_jll"] +git-tree-sha1 = "5717b2c13ddc167d7db931bfdd1a94133ee1d4f0" +uuid = "c3572dad-4567-51f8-b174-8c6c989267f4" +version = "4.10.1" + +[[deps.Sundials_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "OpenBLAS_jll", "Pkg", "SuiteSparse_jll"] +git-tree-sha1 = "04777432d74ec5bc91ca047c9e0e0fd7f81acdb6" +uuid = "fb77eaff-e24c-56d4-86b1-d163f2edb164" +version = "5.2.1+0" + +[[deps.TOML]] +deps = ["Dates"] +uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" +version = "1.0.0" + +[[deps.TableTraits]] +deps = ["IteratorInterfaceExtensions"] +git-tree-sha1 = "c06b2f539df1c6efa794486abfb6ed2022561a39" +uuid = "3783bdb8-4a98-5b6b-af9a-565f29a5fe9c" +version = "1.0.1" + +[[deps.Tables]] +deps = ["DataAPI", "DataValueInterfaces", "IteratorInterfaceExtensions", "LinearAlgebra", "OrderedCollections", "TableTraits", "Test"] +git-tree-sha1 = "c79322d36826aa2f4fd8ecfa96ddb47b174ac78d" +uuid = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" +version = "1.10.0" + +[[deps.Tar]] +deps = ["ArgTools", "SHA"] +uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" +version = "1.10.0" + +[[deps.TensorCore]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "1feb45f88d133a655e001435632f019a9a1bcdb6" +uuid = "62fd8b95-f654-4bbd-a8a5-9c27f68ccd50" +version = "0.1.1" + +[[deps.Test]] +deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] +uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[[deps.ThreadingUtilities]] +deps = ["ManualMemory"] +git-tree-sha1 = "f8629df51cab659d70d2e5618a430b4d3f37f2c3" +uuid = "8290d209-cae3-49c0-8002-c8c24d57dab5" +version = "0.5.0" + +[[deps.TiffImages]] +deps = ["ColorTypes", "DataStructures", "DocStringExtensions", "FileIO", "FixedPointNumbers", "IndirectArrays", "Inflate", "Mmap", "OffsetArrays", "PkgVersion", "ProgressMeter", "UUIDs"] +git-tree-sha1 = "70e6d2da9210371c927176cb7a56d41ef1260db7" +uuid = "731e570b-9d59-4bfa-96dc-6df516fadf69" +version = "0.6.1" + +[[deps.TiledIteration]] +deps = ["OffsetArrays"] +git-tree-sha1 = "5683455224ba92ef59db72d10690690f4a8dc297" +uuid = "06e1c1a7-607b-532d-9fad-de7d9aa2abac" +version = "0.3.1" + +[[deps.TranscodingStreams]] +deps = ["Random", "Test"] +git-tree-sha1 = "8a75929dcd3c38611db2f8d08546decb514fcadf" +uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa" +version = "0.9.9" + +[[deps.TreeViews]] +deps = ["Test"] +git-tree-sha1 = "8d0d7a3fe2f30d6a7f833a5f19f7c7a5b396eae6" +uuid = "a2a6695c-b41b-5b7d-aed9-dbfdeacea5d7" +version = "0.3.0" + +[[deps.TriangularSolve]] +deps = ["CloseOpenIntervals", "IfElse", "LayoutPointers", "LinearAlgebra", "LoopVectorization", "Polyester", "SnoopPrecompile", "Static", "VectorizationBase"] +git-tree-sha1 = "fdddcf6b2c7751cd97de69c18157aacc18fbc660" +uuid = "d5829a12-d9aa-46ab-831f-fb7c9ab06edf" +version = "0.1.14" + +[[deps.Tricks]] +git-tree-sha1 = "6bac775f2d42a611cdfcd1fb217ee719630c4175" +uuid = "410a4b4d-49e4-4fbc-ab6d-cb71b17b3775" +version = "0.1.6" + +[[deps.URIs]] +git-tree-sha1 = "e59ecc5a41b000fa94423a578d29290c7266fc10" +uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" +version = "1.4.0" + +[[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.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"] +git-tree-sha1 = "3bc5ea8fbf25f233c4c49c0a75f14b276d2f9a69" +uuid = "3d5dd08c-fd9d-11e8-17fa-ed2836048c2f" +version = "0.21.51" + +[[deps.VertexSafeGraphs]] +deps = ["Graphs"] +git-tree-sha1 = "8351f8d73d7e880bfc042a8b6922684ebeafb35c" +uuid = "19fa3120-7c27-5ec5-8db8-b0b0aa330d6f" +version = "0.2.0" + +[[deps.Wayland_jll]] +deps = ["Artifacts", "Expat_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Pkg", "XML2_jll"] +git-tree-sha1 = "3e61f0b86f90dacb0bc0e73a0c5a83f6a8636e23" +uuid = "a2964d1f-97da-50d4-b82a-358c7fce9d89" +version = "1.19.0+0" + +[[deps.Wayland_protocols_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "4528479aa01ee1b3b4cd0e6faef0e04cf16466da" +uuid = "2381bf8a-dfd0-557d-9999-79630e7b1b91" +version = "1.25.0+0" + +[[deps.WeakRefStrings]] +deps = ["DataAPI", "InlineStrings", "Parsers"] +git-tree-sha1 = "b1be2855ed9ed8eac54e5caff2afcdb442d52c23" +uuid = "ea10d353-3f73-51f8-a26c-33c1cb351aa5" +version = "1.4.2" + +[[deps.WoodburyMatrices]] +deps = ["LinearAlgebra", "SparseArrays"] +git-tree-sha1 = "de67fa59e33ad156a590055375a30b23c40299d3" +uuid = "efce3f68-66dc-5838-9240-27a6d6f5f9b6" +version = "0.5.5" + +[[deps.XML2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Pkg", "Zlib_jll"] +git-tree-sha1 = "58443b63fb7e465a8a7210828c91c08b92132dff" +uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a" +version = "2.9.14+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.Xorg_libX11_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libxcb_jll", "Xorg_xtrans_jll"] +git-tree-sha1 = "5be649d550f3f4b95308bf0183b82e2582876527" +uuid = "4f6342f7-b3d2-589e-9d20-edeb45f2b2bc" +version = "1.6.9+4" + +[[deps.Xorg_libXau_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "4e490d5c960c314f33885790ed410ff3a94ce67e" +uuid = "0c0b7dd1-d40b-584c-a123-a41640f87eec" +version = "1.0.9+4" + +[[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", "Pkg"] +git-tree-sha1 = "4fe47bd2247248125c428978740e18a681372dd4" +uuid = "a3789734-cfe1-5b06-b2d0-1dd0d9d62d05" +version = "1.1.3+4" + +[[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", "Pkg"] +git-tree-sha1 = "6783737e45d3c59a4a4c4091f5f88cdcf0908cbb" +uuid = "14d82f49-176c-5ed1-bb49-ad3f5cbd8c74" +version = "0.1.0+3" + +[[deps.Xorg_libxcb_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "XSLT_jll", "Xorg_libXau_jll", "Xorg_libXdmcp_jll", "Xorg_libpthread_stubs_jll"] +git-tree-sha1 = "daf17f441228e7a3833846cd048892861cff16d6" +uuid = "c7cfdc94-dc32-55de-ac96-5a1b8d977c5b" +version = "1.13.0+3" + +[[deps.Xorg_libxkbfile_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll"] +git-tree-sha1 = "926af861744212db0eb001d9e40b5d16292080b2" +uuid = "cc61e674-0454-545c-8b26-ed2c68acab7a" +version = "1.1.0+4" + +[[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", "Pkg", "Xorg_libxkbfile_jll"] +git-tree-sha1 = "4bcbf660f6c2e714f87e960a171b119d06ee163b" +uuid = "35661453-b289-5fab-8a00-3d9160c6a3a4" +version = "1.4.2+4" + +[[deps.Xorg_xkeyboard_config_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xkbcomp_jll"] +git-tree-sha1 = "5c8424f8a67c3f2209646d4425f3d415fee5931d" +uuid = "33bec58e-1273-512f-9401-5d533626f822" +version = "2.27.0+4" + +[[deps.Xorg_xtrans_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "79c31e7844f6ecf779705fbc12146eb190b7d845" +uuid = "c5fb5394-a638-5e4d-96e5-b29de1b5cf10" +version = "1.4.0+3" + +[[deps.Zlib_jll]] +deps = ["Libdl"] +uuid = "83775a58-1f1d-513f-b197-d71354ab007a" +version = "1.2.12+3" + +[[deps.Zstd_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "e45044cd873ded54b6a5bac0eb5c971392cf1927" +uuid = "3161d3a3-bdf6-5164-811a-617609db77b4" +version = "1.5.2+0" + +[[deps.ZygoteRules]] +deps = ["MacroTools"] +git-tree-sha1 = "8c1a8e4dfacb1fd631745552c8db35d0deb09ea0" +uuid = "700de1a5-db45-46bc-99cf-38207098b444" +version = "0.2.2" + +[[deps.fzf_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "868e669ccb12ba16eaf50cb2957ee2ff61261c56" +uuid = "214eeab7-80f7-51ab-84ad-2988db7cef09" +version = "0.29.0+0" + +[[deps.libaom_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "3a2ea60308f0996d26f1e5354e10c24e9ef905d4" +uuid = "a4ae2306-e953-59d6-aa16-d00cac43593b" +version = "3.4.0+0" + +[[deps.libass_jll]] +deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] +git-tree-sha1 = "5982a94fcba20f02f42ace44b9894ee2b140fe47" +uuid = "0ac62f75-1d6f-5e53-bd7c-93b484bb37c0" +version = "0.15.1+0" + +[[deps.libblastrampoline_jll]] +deps = ["Artifacts", "Libdl", "OpenBLAS_jll"] +uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" +version = "5.1.1+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.libpng_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] +git-tree-sha1 = "94d180a6d2b5e55e447e2d27a29ed04fe79eb30c" +uuid = "b53b4c65-9356-5827-b1ea-8c7a1a84506f" +version = "1.6.38+0" + +[[deps.libsixel_jll]] +deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Pkg", "libpng_jll"] +git-tree-sha1 = "d4f63314c8aa1e48cd22aa0c17ed76cd1ae48c3c" +uuid = "075b6546-f08a-558a-be8f-8157d0f608a5" +version = "1.10.3+0" + +[[deps.libvorbis_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Ogg_jll", "Pkg"] +git-tree-sha1 = "b910cb81ef3fe6e78bf6acee440bda86fd6ae00c" +uuid = "f27f6e37-5d2b-51aa-960f-b287f2bc3b7a" +version = "1.3.7+1" + +[[deps.nghttp2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" +version = "1.48.0+0" + +[[deps.p7zip_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" +version = "17.4.0+0" + +[[deps.x264_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "4fea590b89e6ec504593146bf8b988b2c00922b2" +uuid = "1270edf5-f2f9-52d2-97e9-ab00b5d0237a" +version = "2021.5.5+0" + +[[deps.x265_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "ee567a171cce03570d77ad3a43e90218e38937a9" +uuid = "dfaa095f-4041-5dcd-9319-2fabd8486b76" +version = "3.5.0+0" + +[[deps.xkbcommon_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Wayland_jll", "Wayland_protocols_jll", "Xorg_libxcb_jll", "Xorg_xkeyboard_config_jll"] +git-tree-sha1 = "9ebfc140cc56e8c2156a15ceac2f0302e327ac0a" +uuid = "d8fb68d0-12a3-5cfd-a85a-d49703b185fd" +version = "1.4.1+0" +""" + +# ╔═║ Cell order: +# β•Ÿβ”€42085492-ac8c-11eb-0620-adcb307077f1 +# β•Ÿβ”€3e60b013-98cf-4057-9c96-b627662c85a4 +# β•Ÿβ”€14195fc4-40e1-4576-973a-69d649fddc02 +# β•Ÿβ”€dd6ba348-d0d7-46b7-a77f-351c00dc9c36 +# β•Ÿβ”€2ab34e6f-9059-4f33-8abd-df15b0c00b6b +# β•Ÿβ”€a24c2177-5fee-4930-ab78-524085f65ed9 +# β•Ÿβ”€b9eca29e-9028-4fd7-8c62-718a2dcf87d1 +# β•Ÿβ”€231e4c3b-6998-4f3d-9cc3-14fa17941f7d +# β•Ÿβ”€482dd428-74f0-4c7c-afc9-db547777e79f +# ╠═f8868c0a-d0ec-45dc-844f-c053981277d9 +# β•Ÿβ”€2ecbad61-0f94-4e0a-9b35-0a5a60d4405c +# β•Ÿβ”€2b7eeede-83ef-45ca-929b-19a3c369b105 +# β•Ÿβ”€a8b9d935-d951-493f-9e91-45743a471249 +# ╠═87c272a7-66bb-4c91-a8ee-30c74ce60461 +# β•Ÿβ”€82e4f960-da7e-41ca-ab16-4d49636041a2 +# β•Ÿβ”€54d73952-c016-48f5-9fb5-83aaea4363de +# β•Ÿβ”€05c9f594-1005-4662-ab1d-49f218012add +# β•Ÿβ”€1147a6ad-e528-4b41-bca6-63caa02f3a68 +# β•Ÿβ”€37535223-1fce-402f-ab24-53d9609b2b9c +# ╠═487c6447-7d47-457f-8d0e-8ad25240a4d2 +# β•Ÿβ”€c665a43c-5020-4cc9-8209-1a786e4c98ab +# β•Ÿβ”€ab4039d5-c564-4fcc-84b7-58fba714d735 +# β•Ÿβ”€bb36eda4-91a2-4fd0-bce3-12891b610fb7 +# β•Ÿβ”€44515eae-805e-445a-ac35-f5d9c40df83e +# β•Ÿβ”€37b5cafd-1147-4677-94d1-1a265736f794 +# β•Ÿβ”€e372b079-53fc-4f6e-9365-e43ad8281f3c +# β•Ÿβ”€75a31c18-37c0-41db-afba-5d92f818be73 +# ╠═91441230-1b1c-4702-b3a7-2f9adf2ddaaa +# β•Ÿβ”€576a94c7-64e7-41a8-b8cc-dc1b2e2380e2 +# ╠═353e3341-5957-40e7-b2b9-800ba7a80063 +# ╠═4c9e7ec6-64e9-4146-8558-f78f865df195 +# β•Ÿβ”€2e91945b-6239-41df-83d1-cfed67081cf7 +# ╠═69fa38d3-2411-496c-bf0a-af4e3531b2ae +# β•Ÿβ”€212d6995-d04b-4c8c-b0ed-b8b591c683e5 +# ╠═3a443524-834c-44fc-a3dd-c72839adba1f +# β•Ÿβ”€b96b4e7c-1350-4c1a-a716-3623dae87574 +# ╠═7f232e27-e2bb-4474-aadf-bebcd2e61e45 +# β•Ÿβ”€6c2998d7-ec51-446a-a5f9-7dcef8f97454 +# ╠═a71e2174-0a01-4b77-a1c8-bce3663f5485 +# β•Ÿβ”€660aad5a-4fc3-4e0f-8d40-5884c7dde2fd +# ╠═553084e1-863d-4d01-9670-a0909732278b +# β•Ÿβ”€3fbc0b72-8228-4d2a-ae8e-9ca73393664b +# ╠═cd69218a-b7fb-4e70-8b17-3dadd0838d62 +# ╠═296e339f-296f-475c-884a-02ca5606fd36 +# β•Ÿβ”€59e682aa-0ccd-46eb-91cf-0c18bcf79575 +# ╠═06108680-874d-4eed-8524-8adb668095b4 +# ╠═fc8f0d12-c4c1-4686-8fe6-e8c1c51640e6 +# ╠═fd887ed0-0248-4849-b4a6-4d428650938f +# ╠═b43a8ff7-284d-41cd-aadc-8f684fc9705e +# β•Ÿβ”€d13613d2-7907-4374-ab53-b42362fb0fee +# β•Ÿβ”€845a8226-a6ff-4549-8954-051f124ffc52 +# ╠═be01be6f-c51c-493c-8306-bc4526c2c57a +# ╠═8b99c85a-478b-4ffb-848d-2812bcf3a95d +# β•Ÿβ”€f59c6208-2911-406d-b5b4-88c13af21f04 +# ╠═683ad1f3-45bc-40a0-9f7d-49d9929dd783 +# ╠═96459714-eb2a-4b6f-9b64-7b1935ff2acc +# ╠═f3f4733a-b962-43a7-8471-83db5a3b24be +# β•Ÿβ”€2870c288-1d32-435c-85d4-9f9a96887686 +# β•Ÿβ”€b3f47df2-0575-4338-b10b-41a644fe6307 +# β•Ÿβ”€393225c6-d748-45e3-951d-dc4f207b612c +# ╠═b426d86c-301f-469b-a515-e24f61c4581c +# ╠═df4e8359-af8b-4bd5-aca0-7f6dd84859d4 +# ╠═4996492f-f1ed-43bf-8997-ebbe898369fb +# β•Ÿβ”€c3b0b7fc-19be-4f04-8787-6349ab9bff7f +# ╠═81eba9ae-2801-4dad-9aae-e49d9472c022 +# ╠═382c2042-bd5c-4b85-9e41-ce49417c7199 +# ╠═0d9ef95a-c7c4-4053-b0bc-385d94c25da9 +# ╠═d3c9d49f-dccd-42eb-85f4-c81456eb3290 +# ╠═525c5d42-e0f8-439c-9b45-2f320833e81a +# ╠═1d73652e-b5e9-4a0b-8f51-3a8a0047df62 +# ╠═6c14ae3b-cc82-49ad-90b3-d312eb4cd1ee +# β•Ÿβ”€e9fa9953-715a-4531-93bb-2332c90322e4 +# ╠═9ce7348b-761a-4dd0-8523-08aaa9a78aa9 +# β•Ÿβ”€692a6928-c7a2-4b61-a794-16bef5d4e919 +# ╠═e45e36f6-6d45-42e7-b8d9-aff28bc57345 +# ╠═1eea5e69-1380-485c-b67e-589f707cf315 +# β•Ÿβ”€e174edd3-4c43-4fb0-9a6a-4ca53ad4aded +# ╠═d250f09d-3678-4093-bec6-6b7b17260fe8 +# ╠═352c81df-7bdd-4671-834e-fb875a78bdcc +# β•Ÿβ”€e7ae1922-6327-40a5-995e-aeb6a2d10fa1 +# β•Ÿβ”€9fcb25f4-397b-4f1d-8b50-250f64bf44d2 +# β•Ÿβ”€9014add9-262d-403b-b9de-5ba5b78ebb77 +# β•Ÿβ”€00d30375-cbc4-4d6e-b353-5d20adbe0743 +# β•Ÿβ”€414f42ac-2d03-451c-8d45-7458726c7345 +# β•Ÿβ”€00000000-0000-0000-0000-000000000001 +# β•Ÿβ”€00000000-0000-0000-0000-000000000002 diff --git a/notebooks_old/9_raf2.jl b/notebooks_old/9_raf2.jl new file mode 100644 index 0000000..f7beb7a --- /dev/null +++ b/notebooks_old/9_raf2.jl @@ -0,0 +1,2830 @@ +### A Pluto.jl notebook ### +# v0.19.12 + +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 + +# ╔═║ 3e60b013-98cf-4057-9c96-b627662c85a4 +begin + using DifferentialEquations, Plots, PlutoUI, LinearAlgebra, CSV, DataFrames, Images +end + +# ╔═║ 42085492-ac8c-11eb-0620-adcb307077f1 +html""" +
+ +
+

Section 2.2

+

+ Climate models: climate sensitivity +

+ +""" + + +# ╔═║ 14195fc4-40e1-4576-973a-69d649fddc02 +TableOfContents(title="πŸ“š Table of Contents", indent=true, depth=4, aside=true) + +# ╔═║ dd6ba348-d0d7-46b7-a77f-351c00dc9c36 +html""" + +""" + +# ╔═║ 2ab34e6f-9059-4f33-8abd-df15b0c00b6b +md""" +## Climate sensitivity + +""" + +# ╔═║ a24c2177-5fee-4930-ab78-524085f65ed9 +md""" +### Greenhouse gases +--- +--- + +The energy budget of the atmosphere is quite remarkable in that most of the radiation received at the surface (mostly oceans) comes from the atmosphere as thermal energy, not from the Sun as shortwave energy. This brings to the fore the importance of greenhouse gases that regulate the radiation emitted from the atmosphere. + +""" + +# ╔═║ b9eca29e-9028-4fd7-8c62-718a2dcf87d1 +html"""""" + +# ╔═║ 231e4c3b-6998-4f3d-9cc3-14fa17941f7d +md""" +#### Energy levels and absorption of energy +--- +Here we revisit our discussion of why greenhouse gases like water vapor and carbon dioxide play a key role in regulating the thermal radiation of the atmosphere, even though they make up for a paltry amount of the atmosphere by mass. The permanent gases that compose the atmosphere are : nitrogen (78%), oxygen (21%) and argon (0.9%). Carbon dioxide makes up barely 0.4%. Water vapor concentration varies from 0-4% of the atmosphere depending on where you are and what time of the day it is. Why are we concerned about small increases in carbon dioxide concentrations then? + +Let us begin by reviewing how gases absorb radiation. This requires a review of quantum theory, a field that may not be the forte of some climate skeptics. Any given molecule of a gas can be at different energy levels, depending on the levels occupied by its electrons, but also on the vibration and rotations modes of the molecular bonds. Radiation arrives to a molecule in the form of a photon of energy $h/\lambda$ where $h$ is the Plank constant and $\lambda$ the photon wavelength. The photon can be absorbed by the molecule only if its energy (and hence its wavelength) matches the amount of energy needed to cause the molecule to transition between its energy level and a higher one. Moving electrons to higher orbitals typically requires very energetic photons in the ultraviolet range (shortwaves). Exciting vibrations and rotations requires photons with weaker energies. In particular vibrations where the dipole moment of the molecule changes are excited by photons in the thermal energy range (longwaves) and hence play a crucial role in the Earth's greenhouse effect. + +""" + +# ╔═║ 482dd428-74f0-4c7c-afc9-db547777e79f +md""" + +##### Vibration modes of $H_2O$ molecule +""" + +# ╔═║ f8868c0a-d0ec-45dc-844f-c053981277d9 +html"""""" + +# ╔═║ 2ecbad61-0f94-4e0a-9b35-0a5a60d4405c +md""" + +##### Vibration modes of $CO_2$ molecule +""" + +# ╔═║ 2b7eeede-83ef-45ca-929b-19a3c369b105 +html"""""" + +# ╔═║ a8b9d935-d951-493f-9e91-45743a471249 +md""" + +##### Absorption of radiation by the atmosphere +""" + +# ╔═║ 87c272a7-66bb-4c91-a8ee-30c74ce60461 +html"""""" + +# ╔═║ 82e4f960-da7e-41ca-ab16-4d49636041a2 +md""" + +Figure: (a) The normalized blackbody emission spectra, T-4XBX, for the Sun (T = 6000 K) and Earth (T = 255 K) as a function of ln X (top), where Bx is the blackbody function (see Eq. A-2) and X is the wavelength (see Appendix A.1.1 for further discussion). (b) The fraction of radiation absorbed while passing from the ground to the top of the atmosphere as a function of wavelength. (c) The fraction of radiation absorbed from the tropopause (typically at a height of 11km) to the top of the atmosphere as a function of wavelength. The atmospheric molecules contributing the important absorption features at each frequency are also indicated. After Goody and Yung (1989). + +""" + +# ╔═║ 54d73952-c016-48f5-9fb5-83aaea4363de +md""" + +##### Emission of radiation by the atmosphere + + +You may often read that energy is absorbed and re-emitted by greenhouse gas molecules. This is not correct. Molecules absorb according to incident intensity, +collide to distribute the energy, and emit according to their temperature. EAPS Prof. Tim Cronin has sketched a nice schematic of the two descriptions and why they are fundamentally different. + +""" + +# ╔═║ 05c9f594-1005-4662-ab1d-49f218012add +load("WrongPicture_TC.png") + +# ╔═║ 1147a6ad-e528-4b41-bca6-63caa02f3a68 +load("RightPicture_TC.png") + +# ╔═║ 37535223-1fce-402f-ab24-53d9609b2b9c +md""" + +The emission spectrum in the thermal infrared range can therefore be used to infer the temperature at which radiation is emitted. The colder the emission temperature, the more efficient is the atmosphere to absorb and emit energy at that wavelength. + +""" + +# ╔═║ 487c6447-7d47-457f-8d0e-8ad25240a4d2 +load("Emission_TS.png") + +# ╔═║ c665a43c-5020-4cc9-8209-1a786e4c98ab +md""" + +Figure: Terrestrial spectral radiative energy flux emanating from the top of Earth’s atmosphere. The spectrum is calculated with a radiative transfer model for the U.S. standard atmosphere, which is representative of midlatitudes. Effects of clouds are ignored in this spectrum, so it represents clear-sky conditions. Absorption bands of a few atmospheric trace constituents are identified: water vapor (H2O), methane (CH4), ozone (O3), and carbon dioxide (CO2). The emission temperature of the spectrum shown is 260 K, which is close to Earth’s emission temperature of 255 K. The blue lines show blackbody spectra for temperatures of 255 K (Earth’s emission temperature) and 288 K (Earth’s global-mean surface temperature). From Tapio Schneider online textbook "Physics of Earth's Climate". + + +""" + +# ╔═║ ab4039d5-c564-4fcc-84b7-58fba714d735 +md""" +#### Collisional broadening +--- + +The atmosphere is saturated with respect to CO$_2$ absorption--that is, longwave photons emitted from the surface at the wavelengths of the CO$_2$ individual absorption lines are already fully absorbed by the atmosphere at preindisutral CO$_2$ concentrations. Why do we worry about increasing CO$_2$ concentrations then? + +It turns out that molecules can absorb photons with energy on a broader range around the precise energies corresponding to transitions between pairs of molecule energy levels (specifically the vibration modes for CO$_2$ in the infrared range). This is due to one major effect: collisional broadening of the absorption lines. f the arriving photon has slightly more energy than needed for energy level transition, the excess energy can be transferred to the colliding molecule, allowing to absorb photons that are not exactly at the right wavelength/energy. + +As the concentration of CO$_2$ increases so does the number of collision and the broadening of the absorption lines. And voila', the absorptivity/emissivity of the atmosphere increases in the CO$_2$ absorption wavelengths range. +""" + +# ╔═║ bb36eda4-91a2-4fd0-bce3-12891b610fb7 +load("Broadening.pdf") + +# ╔═║ 44515eae-805e-445a-ac35-f5d9c40df83e +md""" +Figure from slides accompanying "Global Warming Science" by Eli Tziperman. +""" + +# ╔═║ 37b5cafd-1147-4677-94d1-1a265736f794 +md""" +#### Radiative forcing and logarithmic dependence on $CO_2$ +--- +The width of the absorption bands for each individual vibrational mode increases as a function of wavelengths due to the increased collisions. This increase results in a logarithmic dependence of the emissivity on the CO$_2$ concentration well described by the formula: + +$\epsilon(CO_2) = Ο΅β‚€ + ϡ₁ \,\,\log_2 \left(\frac{[CO_2]}{[CO_2]_{PI}}\right)$ + +with $CO_2$ measured in ppmv and $[CO_2]_{PI}$ is the Pre-Industrial CO$_2$ concentration of 280 ppmv. + +""" + +# ╔═║ e372b079-53fc-4f6e-9365-e43ad8281f3c +md""" +#### Radiative forcing and water vapor feedback +--- + +Although water vapor accounts for more than half of the Earth’s greenhouse warming effect, it does not control the Earth’s temperature. Instead, the amount of water vapor is controlled by the temperature. This is because the temperature of the atmosphere limits the maximum amount of water vapor the atmosphere can hold. If the temperature decrease any water vapor in excess of its saturation value will condense to form liquid water. This is why clouds form as warm air containing water vapor rises and cools at higher altitudes where the water condenses to the tiny droplets that make up clouds. According to Clausius-Clapeyron's relation the saturation specific humidity $q^*$--the mass (in kg) of moisture in 1 kg of moist air at saturation--increases nearly exponentially with temperature $T$ in Kelvin: + +$$q^*(T) \simeq 1.58 \times 10^6 \,e^{-5415/T} \quad\text{ kg of moisture per kg of moist air}$$ + +Model calculations and physical arguments further show that the relative humidity--the ratio of the specific humidity and the saturation specific humidity--remains roughly unchanged as climate warms, implying that the water vapor in the atmosphere follows the Clausius-Clapeyron quasi-exponential relation. An increase in temperature due, for example, by an increase in another greenhouses gas CO$_2$ is therefore amplified by water vapor as illustrated in the loop below. In climate jargon we refer to water vapor as a positive feedback. + +We can finally capture the combined effects of CO$_2$ and water vapor on the emissivity and write: + +```math +\begin{align} +Ο΅(CO_2, T) &= Ο΅β‚€ + ϡ₁\,\,\log_2\left(\frac{[COβ‚‚]}{[COβ‚‚]_{PI}}\right) + \hat Ο΅β‚‚\,\, \log_2\left(\frac{q^*(T)}{q^*(T_{PI})}\right)\\ +&= Ο΅β‚€ + ϡ₁\,\,\log_2\left(\frac{[COβ‚‚]}{[COβ‚‚]_{PI}}\right) + Ο΅β‚‚\,\, (T-T_{PI}) +\end{align} +``` + + +""" + +# ╔═║ 75a31c18-37c0-41db-afba-5d92f818be73 +load("WaterVapor.pdf") + +# ╔═║ 91441230-1b1c-4702-b3a7-2f9adf2ddaaa +begin + COβ‚‚_PI = 280.; # preindustrial CO2 concentration [parts per million; ppm]; + Ο΅β‚€ = 0.75 # Pre Industrial emissivity + ϡ₁ = 0.02 # Parameter setting emissivity dependence on CO_2 + Ο΅β‚‚ = 0.01 # Parameter setting emissivity dependence on water vapor [1/K] + Ο΅(COβ‚‚,Ξ΄T) = Ο΅β‚€ + ϡ₁*log(COβ‚‚/COβ‚‚_PreIndust)/log(2) + Ο΅β‚‚*Ξ΄T +end + +# ╔═║ 576a94c7-64e7-41a8-b8cc-dc1b2e2380e2 +md""" +### Climate sensitivity and the role of the ocean +--- +--- + +The $\text{\color{red}{climate sensitivity}}$ is defined as the increase in surface temperature in response to a change in radiative forcing, for example due to an increase in greenhouse gases, once the climate has adjusted to the new radiative forcing. It has units of K divided by W/m^2. This is more properly called the equilibrium climate sensitivity. In this section we discuss how the ocean affects the evolution of Earth's climate towards equilibrium and introduce the concepts of $\text{\color{red}{equilibrium climate sensitivity}}$ and $\text{\color{red}{transient climate sensitivity}}$. +""" + +# ╔═║ 353e3341-5957-40e7-b2b9-800ba7a80063 +begin + Οƒ = 5.670374419*10^(βˆ’8) # Stefan-Boltzman constant [W/m^2/K^4] + Ξ± = 0.3 # Earth's mean albedo, or planetary reflectivity [unitless] + S = 1366 # solar insolation [W/m^2] (energy per unit time per unit area) +end + +# ╔═║ 4c9e7ec6-64e9-4146-8558-f78f865df195 +md""" +#### Equilibrium climate sensitivity +--- + +The concept of climate sensitivity is introduced to quantify the response of the Earth's climate to perturbations inn greenhouse gas concentrations. We start with the evolution of a temperature perturbations of the ocean temperature, $\delta T_o$, that evolves accoring to the model we derived in the last lecture, assuming that the emissivity is the only parameter that can changes (we do not consider changes in solar forcing and albedo but is is a straightforward extension). Substituting $T_o = T_{PI}+\delta T_o$, where $T_{PI}$ is the equilibrium temperature before the change in radiative forcing, we get: + +```math +\begin{align} +&C_o \frac{d \delta T_o}{dt} = \frac{(1-\alpha)S_0}{4} - \frac{2-\epsilon_0 - \delta\epsilon}{2}\sigma \,\left( T_{PI}^4 + 4 T_{PI}^3 \,\,\delta T_0 +O(\delta T_o^2) \right) +\end{align} +``` +where $\delta \epsilon$ is the change in emissivity due to changes in Co$_2$, water vapor, etcetera. + +Remembering that $(1-\alpha)S_0/4 =(2-\epsilon_0)\sigma T_{PI}^4/2$, and dropping terms quadratic in perturbations ($\delta T_o^2, \,\,\delta T_o \delta \epsilon$), we have, + +$$C_o \frac{d \delta T_o}{\delta t} = \delta F - \lambda \,\, \delta T_o.$$ + +where $\delta F$ is the radiative forcing in W/m$^2$: + +$$\delta F = \frac{1}{2} \sigma T_{PI}^4 \epsilon_1 \log_2\left(\frac{[COβ‚‚]}{[COβ‚‚]_{PI}}\right)$$ + +and $\lambda$ is the equilibrium climate feedback parameter which encapsulates how the temperature changes in response to the radiative perturbation: + +$$\lambda = \underbrace{4 \frac{2-\epsilon_0}{2} T_{PI}^3}_{\text{Plank feedback}} \quad - \underbrace{\frac{1}{2} T_{PI}^4 \epsilon_2}_{\text{water vapor feedback}}$$ + +""" + +# ╔═║ 2e91945b-6239-41df-83d1-cfed67081cf7 +md""" +Using our parameters we can compute the radiative forcing parameter: +""" + +# ╔═║ 69fa38d3-2411-496c-bf0a-af4e3531b2ae +begin + T_PI = ( 2/(2-Ο΅β‚€) * S*(1-Ξ±)/4/Οƒ )^(1/4) # Equilibrium Pre Industrial temperature [K]] + Ξ΄F(COβ‚‚) = 1/2 * Οƒ *T_PI^4 * ϡ₁ * log(COβ‚‚/COβ‚‚_PI)/log(2) # Radiative forcing [W/m^2] +end + +# ╔═║ 212d6995-d04b-4c8c-b0ed-b8b591c683e5 +md""" +which for a doubling of C0$_2$ above Pre Industrial values implies a radiative forcing of: +""" + +# ╔═║ 3a443524-834c-44fc-a3dd-c72839adba1f +Ξ΄Fβ‚‚β‚“ = Ξ΄F(560) + +# ╔═║ b96b4e7c-1350-4c1a-a716-3623dae87574 +md""" +and a climate feedack parameter of: +""" + +# ╔═║ 7f232e27-e2bb-4474-aadf-bebcd2e61e45 +Ξ» = 2 * (2-Ο΅β‚€) * Οƒ * T_PI^3 - 1/2 * Οƒ * T_PI^4 * Ο΅β‚‚ + +# ╔═║ 6c2998d7-ec51-446a-a5f9-7dcef8f97454 +md""" +The $\text{\color{red}{equilibrium climate sensitivity}}$ is defined as the temperature change for a doubling of CO$_2$ once the climate reaches a new equilibrium. According to our model it is thus predicted to be: +""" + +# ╔═║ a71e2174-0a01-4b77-a1c8-bce3663f5485 +Ξ”Tβ‚‚β‚“ = Ξ΄Fβ‚‚β‚“ / Ξ» + +# ╔═║ 660aad5a-4fc3-4e0f-8d40-5884c7dde2fd +md""" +This value is twice as large as that predicted without water vapor feedback: +""" + +# ╔═║ 553084e1-863d-4d01-9670-a0909732278b +Ξ”Tβ‚‚β‚“Κ·β±α΅—Κ°α΅’α΅˜α΅— = Ξ΄Fβ‚‚β‚“ / (2 * (2-Ο΅β‚€) * Οƒ * T_PI^3) + +# ╔═║ 3fbc0b72-8228-4d2a-ae8e-9ca73393664b +md""" +but still on the very low end of estimates from comprehensive climate models which include the full vertical structure of the atmosphere and ocean and the motions of air and water. These aspects will be introduced in the next two lecture and add numerous additional feedbacks which affect the climate feedback parameter. +""" + +# ╔═║ cd69218a-b7fb-4e70-8b17-3dadd0838d62 +md""" +#### Transient climate sensitivity +--- +In the last lecture we assumed that the whole ocean warms in response to incoming solar radiation, but this is not the case. The ocean is a stratified fluid with warmer waters at the top. Once solar radiation hits its surface, warming affects only the surface mixed layer, the ocean upper layer where strong turbulence, driven by winds and heat loss, mixes heat in the vertical and keeps the vertical temperature profile constant. This upper layer has a depth of approximately h=100 m on average. Heat then diffuses in the deeper layers of the ocean at a much slower pace. A simple extension of the model for perturbations of the ocean temperature $\delta T_o$ in response to radiative forcing $\delta F$ is one in which the ocean is divided into an upper and a deep layer: + +```math +\begin{align} +&{C_u \frac{d Ξ΄T_u}{dt}} = \delta F - \lambda \delta T_u - \mu (\delta T_u -\delta T_d) \\ +&{C_d \frac{d Ξ΄T_d}{dt}} = \mu (\delta T_u -\delta T_d) +\end{align} +``` + +where $\delta T_u$ and $\delta T_o$ are the temperature perturbations of the upper and deep layers with the associated heat capacities. +""" + +# ╔═║ aba3e804-9fe6-4081-8d7c-b4e4c3adf334 +load("2layerocean.png") + +# ╔═║ 59e682aa-0ccd-46eb-91cf-0c18bcf79575 +md""" +The term $\mu (\delta T_u - \delta T_d)$ represents the exchange of heat between the upper layer and the deeper layer. We will use ΞΌ = 1.0 W/m^2 as a representative value. + +Much like in the problem of coupling an ocean and an atmosphere, we once again have two timescales associated with the different heat capacities of the upper ocean (smaller) and the deep ocean (larger). +""" + +# ╔═║ 06108680-874d-4eed-8524-8adb668095b4 +begin + year = 365 * 86400 + C_u = 4000 * 1000 * 100 * 0.7 / year # Heat capacity of ocean mixed layer [Wyr/m^2/Β°K] + C_d = 4000 * 1000 * 3900 * 0.7/ year # Heat capacity of deep ocean [Wyr/m^2/Β°K] + Ξ΄Tβ‚€ = 0 # Initial temperature perturbation + ΞΌ = 1 # Rate of heat exchange between surface and deep ocean [W/m^2/K] +end + +# ╔═║ fc8f0d12-c4c1-4686-8fe6-e8c1c51640e6 +function oceanmodel!(du, u, p, t) + + Ξ΄T_u = u[1] + Ξ΄T_d = u[2] + + du[1] = (1/C_u) * (Ξ΄F(430) - Ξ» * Ξ΄T_u - ΞΌ * (Ξ΄T_u-Ξ΄T_d)) + du[2] = (1/C_d) * ( ΞΌ * (Ξ΄T_u-Ξ΄T_d)) + +end + +# ╔═║ b43a8ff7-284d-41cd-aadc-8f684fc9705e +md""" +Ξ”t = $(@bind Ξ”t Slider(0:5:2000, show_value=true, default=100) ) +""" + +# ╔═║ fd887ed0-0248-4849-b4a6-4d428650938f +begin + p2l = ODEProblem(oceanmodel!, [Ξ΄Tβ‚€; Ξ΄Tβ‚€], (0.,Ξ”t)) +end + +# ╔═║ d13613d2-7907-4374-ab53-b42362fb0fee +begin + sol2l=solve(p2l) + plot(sol2l, label = ["T_u" "T_d"], + background_color_inside = :black, + xlabel = "years", + ylabel = "Temperature increase K", + ylim = (0,2), + xlim = (0,Ξ”t)) + hline!([Ξ΄F(430)/Ξ»,Ξ΄F(430)/Ξ»], c=:red, ls=:dash, label=false) + hline!([Ξ΄F(430)/(Ξ»+ΞΌ),Ξ΄F(430)/(Ξ»+ΞΌ)], c=:blue, ls=:dash, label=false) + # annotate!(0.6*timespan, 0.5+Ξ΄Tβ‚€, text("Initial Temperature = $(Ξ΄Tβ‚€) K",color=:white)) + title!("Ocean response to radiative forcing") +end + +# ╔═║ 845a8226-a6ff-4549-8954-051f124ffc52 +md""" +##### Short timescale (transient climate sensitivity) + +On short timescales the deep ocean temperature hardly changes and thus $\delta T_d \simeq 0$. The evolution of the upper ocean reduces to: + +```math +\begin{align} +&{C_u \frac{d Ξ΄T_u}{dt}} = \delta F - (\lambda + \mu ) \delta T_u \\ +\end{align} +``` +Thus the transient climate sensitivity parameter which is relevant for short timesacles is given by (Ξ» + ΞΌ). The addition of ΞΌ to the parameters represents the negative feedback of the deep ocean that takes heat out of the upper ocean and thus of the atmosphere, thereby slowly the warming for the time being. The transient equilibrium temperature is given by: + +$$ +\delta T_u^{tr} = \frac{\delta F}{\lambda + \mu} +$$ + +where the superscript $tr$ stands for transient equilibrium. This transient equilibrium temperature perturbation is achieved on a timescale of order: + +$$ +\tau^{tr} \simeq \frac{C_u}{\lambda + \mu} +$$ + +This is the value plotted as a dashed blue line in the graph. + +The trasnient climate sensitivity is consistently defined as: + +$$\Delta T_{2x} = \frac{\Delta F_{2x}}{\lambda + \mu}$$ + +and it is about half of the equilibrium climate sensitivity. + +""" + +# ╔═║ be01be6f-c51c-493c-8306-bc4526c2c57a +Ξ”Tβ‚‚β‚“α΅—Κ³ = Ξ΄Fβ‚‚β‚“ / (Ξ» + ΞΌ) + +# ╔═║ 8b99c85a-478b-4ffb-848d-2812bcf3a95d +Ο„α΅—Κ³= C_u / (Ξ» + ΞΌ ) # Timescale to reach transient equilibrium in upper ocean [years] + +# ╔═║ f59c6208-2911-406d-b5b4-88c13af21f04 +md""" +##### Long timescale (equilibrium climate sensitivity) + +On timescales much longer than Ο„α΅—Κ³, the upper ocean can be assumed to be in equilibrium and the system of equations reduces to: + +```math +\begin{align} +&0 = \delta F - \lambda \delta T_u - \mu (\delta T_u -\delta T_d) \\ +&{C_d \frac{d Ξ΄T_d}{dt}} = \mu (\delta T_u -\delta T_d) +\end{align} +``` + +which can be combined into a single equation for $\delta T_d$: + +```math +\begin{align} +&{C_d \frac{d Ξ΄T_d}{dt}} = \frac{\mu}{\lambda +\mu} \delta F - \frac{\lambda \mu}{\lambda +\mu}\delta T_d +\end{align} +``` + +At equilibrium the deep ocean must have the same temperature perturbation as the deep ocean and thus it is no surprise that the equilibrium sensitivity parameter for the two layer model is the same as the one layer model, because the two layers end up having the same temperature: + +```math +\delta T_d^{eq} = \delta T_u^{eq} = \frac{\delta F}{\lambda} +``` + + +This equilibrium temperature is achieved on the much longer timescale: + +```math +\tau^{eq} = \frac{\lambda + \mu}{\lambda \mu} C_d = \frac{(\lambda + \mu)^2}{\lambda \mu} \frac{C_d}{C_u} \tau^{tr} \gg \tau^{tr} +``` + + +""" + +# ╔═║ 683ad1f3-45bc-40a0-9f7d-49d9929dd783 +Ο„eq = (Ξ» + ΞΌ) / (Ξ» * ΞΌ) * C_d # Timescale to reach equilibrium in deep ocean [years] + +# ╔═║ 96459714-eb2a-4b6f-9b64-7b1935ff2acc +md""" + +Kostov and collaborators (Geophysical Research Letters, 2014) find that this two layer ocean model describes quite accurately the sea surface temperature response to quadrupling CO$_2$ perturbation experiments simulated with full climate models. + +""" + +# ╔═║ f3f4733a-b962-43a7-8471-83db5a3b24be +html"""""" + +# ╔═║ 2870c288-1d32-435c-85d4-9f9a96887686 +md""" +Figure. (a) Area-averaged SST anomaly in CMIP5 4 Γ— CO2 simulations ; (b) Vertical distribution of the ocean heat anomaly in CMIP5 models, averaged over the World Ocean, 100 years after the CO2 quadrupling; (c) SST response under model-specific feedback and forcing (urn:x-wiley:grl:media:grl51455:grl51455-math-0001), but ensemble-mean ocean properties (q, h2, Ο΅), as simulated by the two-layer ocean energy balance model (EBM) (see section 3); (d) SST response under model-specific ocean properties (q, h2, Ο΅) but ensemble-mean feedback and forcing (urn:x-wiley:grl:media:grl51455:grl51455-math-0002), as simulated by the two-layer ocean EBM (see section 3). The eight CMIP5 models included here are those for which sufficient output was accessible at the time of our analysis (ocean temperature, sea surface heat flux, and AMOC data). +""" + +# ╔═║ b3f47df2-0575-4338-b10b-41a644fe6307 +md""" +A major implication of our simple two layer ocean model is that the heat we have experience is the last century is probably only half of what we have already committed to, because the deep ocean will keep warming up. +""" + +# ╔═║ 393225c6-d748-45e3-951d-dc4f207b612c +md""" +### Applications to present climate +--- +--- + +We now apply our simple model to see if it can predict the observed mean surface temperature increase in the last seventy years as a a function of CO$_2$ concentrations measured in the atmosphere over the same period. + +""" + +# ╔═║ b426d86c-301f-469b-a515-e24f61c4581c +md""" +#### COβ‚‚ concentrations measurements from Mauna Loa Volcano +--- +![Mauna Loa Volcano](https://i.pinimg.com/originals/df/1a/e7/df1ae72cfd5e6d0d535c0ec99e708f6f.jpg) +""" + +# ╔═║ df4e8359-af8b-4bd5-aca0-7f6dd84859d4 +CO2_historical_data_url = "https://scrippsco2.ucsd.edu/assets/data/atmospheric/stations/in_situ_co2/monthly/monthly_in_situ_co2_mlo.csv" + +# ╔═║ 4996492f-f1ed-43bf-8997-ebbe898369fb +CO2_historical_filename = download(CO2_historical_data_url) + +# ╔═║ c3b0b7fc-19be-4f04-8787-6349ab9bff7f +begin + + offset = findfirst(!startswith("\""), readlines(CO2_historical_filename)) + + CO2_historical_data_raw = CSV.read( + CO2_historical_filename, DataFrame; + header=offset, + skipto=offset + 3, + ); + + + first(CO2_historical_data_raw, 11) +end + +# ╔═║ 81eba9ae-2801-4dad-9aae-e49d9472c022 +validrowsmask = CO2_historical_data_raw[:, " CO2"] .> 0 + +# ╔═║ 382c2042-bd5c-4b85-9e41-ce49417c7199 +CO2_historical_data = CO2_historical_data_raw[validrowsmask,:]; + +# ╔═║ 0d9ef95a-c7c4-4053-b0bc-385d94c25da9 +begin + begin + plot( CO2_historical_data[:, " Date"] , CO2_historical_data[:, " CO2"], label="Mauna Loa COβ‚‚ data (Keeling curve)") +# plot!( years, COβ‚‚.(years.-1850), lw=3 , label="Cubic Fit", legend=:topleft) + xlabel!("year") + ylabel!("COβ‚‚ (ppm)") + title!("COβ‚‚ observations") + + end +end + +# ╔═║ d3c9d49f-dccd-42eb-85f4-c81456eb3290 +md""" +#### Global temperature measurements from NASA +--- +![NASA](https://earthobservatory.nasa.gov/ContentWOC/images/globaltemp/global_gis_2021.jpg) +""" + +# ╔═║ 525c5d42-e0f8-439c-9b45-2f320833e81a +begin + T_url = "https://data.giss.nasa.gov/gistemp/graphs/graph_data/Global_Mean_Estimates_based_on_Land_and_Ocean_Data/graph.txt"; + T_df = CSV.read(download(T_url),DataFrame, header=false, skipto=6,delim=" "); + # T_df = T_df[:,[1,6]] +end + +# ╔═║ 1d73652e-b5e9-4a0b-8f51-3a8a0047df62 +begin + plot( parse.(Float64, T_df[:,1]), parse.(Float64, T_df[:,2]) .+ 14.15, color=:red, label="NASA Observations", legend=:topleft) + xlabel!("year") + ylabel!("Temp Β°C") +end + +# ╔═║ 6c14ae3b-cc82-49ad-90b3-d312eb4cd1ee +md""" +#### Modeling temperature increase +--- +""" + +# ╔═║ e9fa9953-715a-4531-93bb-2332c90322e4 +md""" +Let's make a fit to the COβ‚‚ data from Mauna Loa to extrapolate back in time and cover the same temporal range as the temperature data +""" + +# ╔═║ 9ce7348b-761a-4dd0-8523-08aaa9a78aa9 +begin + # COβ‚‚(t) = COβ‚‚_PreIndust # no emissions + # COβ‚‚(t) = COβ‚‚_PreIndust * 1.01^t # test model + years = 1850:2020 + modelCOβ‚‚(t) = COβ‚‚_PI * (1+ (t/220)^3 ) +end + +# ╔═║ 692a6928-c7a2-4b61-a794-16bef5d4e919 +begin + begin + plot( CO2_historical_data[:, " Date"] , CO2_historical_data[:, " CO2"], label="Mauna Loa COβ‚‚ data (Keeling curve)") + plot!( years, modelCOβ‚‚.(years.-1850), lw=3 , label="Cubic Fit", legend=:topleft) + xlabel!("year") + ylabel!("COβ‚‚ (ppm)") + title!("COβ‚‚ observations and fit") + + end +end + +# ╔═║ e45e36f6-6d45-42e7-b8d9-aff28bc57345 +md""" +For simplicity we will consider only the transient response (i.e. we will assume the temperature of the deep ocean does not change), because it has little effect on the timescales over which we have a record. +""" + +# ╔═║ e174edd3-4c43-4fb0-9a6a-4ca53ad4aded +md""" +Climate feedback Ξ»β‚› = $(@bind Ξ»β‚› Slider(0:.1:4, show_value=true, default=Ξ»+ΞΌ)) + +Upper ocean Heat Capacity C =$(@bind C Slider(0.1:.1:200, show_value=true, default=C_u)) + +Starting temperature Tβ‚€ = $(@bind Tβ‚€ Slider(12:.05:16; show_value=true, default=14)) +""" + +# ╔═║ 1eea5e69-1380-485c-b67e-589f707cf315 +pshort = ODEProblem( (temp, p, t)-> (1/C) * (Ξ»β‚›*(Tβ‚€-temp) + Ξ΄F(modelCOβ‚‚(t)) ) , Tβ‚€, (0.0, 170) ) + +# ╔═║ d250f09d-3678-4093-bec6-6b7b17260fe8 +solpshort = solve(pshort); + +# ╔═║ 352c81df-7bdd-4671-834e-fb875a78bdcc +begin + plot(years,solpshort.(years.-1850),lw=2,label="Predicted Temperature from model", legend=:topleft) + xlabel!("year") + ylabel!("Temp Β°C") + + plot!( parse.(Float64, T_df[:,1]), parse.(Float64, T_df[:,2]) .+ 14.15, color=:black, label="NASA Observations", legend=:topleft) +end + +# ╔═║ e7ae1922-6327-40a5-995e-aeb6a2d10fa1 +md""" #### Best- and worst-case projections of future global warming +--- + +""" + +# ╔═║ 9fcb25f4-397b-4f1d-8b50-250f64bf44d2 +md"""Consider two divergent hypothetical futures: +1. a **low-emissions** world in which emissions decrease such that CO2 concentrations stay below 500 ppm by 2100 (known in climate circles as "RCP2.6") and +2. a **high-emissions** world in which emissions continue increasing and CO2 concentrations soar upwards of 1200 ppm ("RCP8.5"). +""" + +# ╔═║ 9014add9-262d-403b-b9de-5ba5b78ebb77 +md""" +![](https://raw.githubusercontent.com/mitmath/18S191/Spring21/notebooks/week12/predictthefuture.svg) +""" + +# ╔═║ 00d30375-cbc4-4d6e-b353-5d20adbe0743 +md""" +In the low-emissions scenario, the temperature increase stays below $Ξ”T = 2$ Β°C by 2100, while in the high-emissions scenario temperatures soar upwards of 3.5ΒΊC above pre-industrial levels. +""" + +# ╔═║ 414f42ac-2d03-451c-8d45-7458726c7345 +md"Although the greenhouse effect due to human-caused COβ‚‚ emissions is the dominant forcing behind historical and future-projected warming, modern climate modelling considers a fairly exhaustive list of other forcing factors (aerosols, other greenhouse gases, ozone, land-use changes, etc.). The video below shows a breakdown of these forcing factors in a state-of-the-art climate model simulation of the historical period." + +# ╔═║ 00000000-0000-0000-0000-000000000001 +PLUTO_PROJECT_TOML_CONTENTS = """ +[deps] +CSV = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b" +DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" +DifferentialEquations = "0c46a032-eb83-5123-abaf-570d42b7fbaa" +Images = "916415d5-f1e6-5110-898d-aaa5f9f070e0" +LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" +Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" +PlutoUI = "7f904dfe-b85e-4ff6-b463-dae2292396a8" + +[compat] +CSV = "~0.10.4" +DataFrames = "~1.3.4" +DifferentialEquations = "~7.1.0" +Images = "~0.25.2" +Plots = "~1.29.0" +PlutoUI = "~0.7.38" +""" + +# ╔═║ 00000000-0000-0000-0000-000000000002 +PLUTO_MANIFEST_TOML_CONTENTS = """ +# This file is machine-generated - editing it directly is not advised + +julia_version = "1.8.0-rc4" +manifest_format = "2.0" +project_hash = "e18ff72c1fe0ad91e83872f0859e84e1468f3527" + +[[deps.AbstractFFTs]] +deps = ["ChainRulesCore", "LinearAlgebra"] +git-tree-sha1 = "69f7020bd72f069c219b5e8c236c1fa90d2cb409" +uuid = "621f4979-c628-5d54-868e-fcf4e3e8185c" +version = "1.2.1" + +[[deps.AbstractPlutoDingetjes]] +deps = ["Pkg"] +git-tree-sha1 = "8eaf9f1b4921132a4cff3f36a1d9ba923b14a481" +uuid = "6e696c72-6542-2067-7265-42206c756150" +version = "1.1.4" + +[[deps.Adapt]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "195c5505521008abea5aee4f96930717958eac6f" +uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" +version = "3.4.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 = ["ArrayInterfaceCore", "Compat", "IfElse", "LinearAlgebra", "Static"] +git-tree-sha1 = "0582b5976fc76523f77056e888e454f0f7732596" +uuid = "4fba245c-0d91-5ea0-9b3e-6abc04ee57a9" +version = "6.0.22" + +[[deps.ArrayInterfaceCore]] +deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"] +git-tree-sha1 = "40debc9f72d0511e12d817c7ca06a721b6423ba3" +uuid = "30b0a656-2188-435a-8636-2ec0e6a096e2" +version = "0.1.17" + +[[deps.ArrayInterfaceGPUArrays]] +deps = ["Adapt", "ArrayInterfaceCore", "GPUArraysCore", "LinearAlgebra"] +git-tree-sha1 = "febba7add2873aecc0b6620b55969e73ec875bce" +uuid = "6ba088a2-8465-4c0a-af30-387133b534db" +version = "0.2.1" + +[[deps.ArrayInterfaceOffsetArrays]] +deps = ["ArrayInterface", "OffsetArrays", "Static"] +git-tree-sha1 = "c49f6bad95a30defff7c637731f00934c7289c50" +uuid = "015c0d05-e682-4f19-8f0a-679ce4c54826" +version = "0.1.6" + +[[deps.ArrayInterfaceStaticArrays]] +deps = ["Adapt", "ArrayInterface", "ArrayInterfaceStaticArraysCore", "LinearAlgebra", "Static", "StaticArrays"] +git-tree-sha1 = "efb000a9f643f018d5154e56814e338b5746c560" +uuid = "b0d46f97-bff5-4637-a19a-dd75974142cd" +version = "0.1.4" + +[[deps.ArrayInterfaceStaticArraysCore]] +deps = ["Adapt", "ArrayInterfaceCore", "LinearAlgebra", "StaticArraysCore"] +git-tree-sha1 = "a1e2cf6ced6505cbad2490532388683f1e88c3ed" +uuid = "dd5226c6-a4d4-4bc7-8575-46859f9c95b9" +version = "0.1.0" + +[[deps.ArrayLayouts]] +deps = ["FillArrays", "LinearAlgebra", "SparseArrays"] +git-tree-sha1 = "ac5cc6021f32a272ee572dd2a325049a1fa0d034" +uuid = "4c555306-a7a7-4459-81d9-ec55ddd5c99a" +version = "0.8.11" + +[[deps.Artifacts]] +uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" + +[[deps.AxisAlgorithms]] +deps = ["LinearAlgebra", "Random", "SparseArrays", "WoodburyMatrices"] +git-tree-sha1 = "66771c8d21c8ff5e3a93379480a2307ac36863f7" +uuid = "13072b0f-2c55-5437-9ae7-d433b7a33950" +version = "1.0.1" + +[[deps.AxisArrays]] +deps = ["Dates", "IntervalSets", "IterTools", "RangeArrays"] +git-tree-sha1 = "1dd4d9f5beebac0c03446918741b1a03dc5e5788" +uuid = "39de3d68-74b9-583c-8d2d-e117c070f3a9" +version = "0.4.6" + +[[deps.BandedMatrices]] +deps = ["ArrayLayouts", "FillArrays", "LinearAlgebra", "Random", "SparseArrays"] +git-tree-sha1 = "d8da9afb97ad4a1a06650db11c8b72d9dd2f1ace" +uuid = "aae01518-5342-5314-be14-df237901396f" +version = "0.17.5" + +[[deps.Base64]] +uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" + +[[deps.BitTwiddlingConvenienceFunctions]] +deps = ["Static"] +git-tree-sha1 = "eaee37f76339077f86679787a71990c4e465477f" +uuid = "62783981-4cbd-42fc-bca8-16325de8dc4b" +version = "0.1.4" + +[[deps.BoundaryValueDiffEq]] +deps = ["BandedMatrices", "DiffEqBase", "FiniteDiff", "ForwardDiff", "LinearAlgebra", "NLsolve", "Reexport", "SciMLBase", "SparseArrays"] +git-tree-sha1 = "2f80b70bd3ddd9aa3ec2d77604c1121bd115650e" +uuid = "764a87c0-6b3e-53db-9096-fe964310641d" +version = "2.9.0" + +[[deps.Bzip2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "19a35467a82e236ff51bc17a3a44b69ef35185a2" +uuid = "6e34b625-4abd-537c-b88f-471c36dfa7a0" +version = "1.0.8+0" + +[[deps.CEnum]] +git-tree-sha1 = "eb4cb44a499229b3b8426dcfb5dd85333951ff90" +uuid = "fa961155-64e5-5f13-b03f-caf6b980ea82" +version = "0.4.2" + +[[deps.CPUSummary]] +deps = ["CpuId", "IfElse", "Static"] +git-tree-sha1 = "8a43595f7b3f7d6dd1e07ad9b94081e1975df4af" +uuid = "2a0fbf3d-bb9c-48f3-b0a9-814d99fd7ab9" +version = "0.1.25" + +[[deps.CSV]] +deps = ["CodecZlib", "Dates", "FilePathsBase", "InlineStrings", "Mmap", "Parsers", "PooledArrays", "SentinelArrays", "Tables", "Unicode", "WeakRefStrings"] +git-tree-sha1 = "873fb188a4b9d76549b81465b1f75c82aaf59238" +uuid = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b" +version = "0.10.4" + +[[deps.Cairo_jll]] +deps = ["Artifacts", "Bzip2_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.CatIndices]] +deps = ["CustomUnitRanges", "OffsetArrays"] +git-tree-sha1 = "a0f80a09780eed9b1d106a1bf62041c2efc995bc" +uuid = "aafaddc9-749c-510e-ac4f-586e18779b91" +version = "0.2.2" + +[[deps.ChainRulesCore]] +deps = ["Compat", "LinearAlgebra", "SparseArrays"] +git-tree-sha1 = "80ca332f6dcb2508adba68f22f551adb2d00a624" +uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" +version = "1.15.3" + +[[deps.ChangesOfVariables]] +deps = ["ChainRulesCore", "LinearAlgebra", "Test"] +git-tree-sha1 = "38f7a08f19d8810338d4f5085211c7dfa5d5bdd8" +uuid = "9e997f8a-9a97-42d5-a9f1-ce6bfc15e2c0" +version = "0.1.4" + +[[deps.CloseOpenIntervals]] +deps = ["ArrayInterface", "Static"] +git-tree-sha1 = "5522c338564580adf5d58d91e43a55db0fa5fb39" +uuid = "fb6a15b2-703c-40df-9091-08a04967cfa9" +version = "0.1.10" + +[[deps.Clustering]] +deps = ["Distances", "LinearAlgebra", "NearestNeighbors", "Printf", "SparseArrays", "Statistics", "StatsBase"] +git-tree-sha1 = "75479b7df4167267d75294d14b58244695beb2ac" +uuid = "aaaa29a8-35af-508c-8bc3-b662a17a0fe5" +version = "0.14.2" + +[[deps.CodecZlib]] +deps = ["TranscodingStreams", "Zlib_jll"] +git-tree-sha1 = "ded953804d019afa9a3f98981d99b33e3db7b6da" +uuid = "944b1d66-785c-5afd-91f1-9de20f533193" +version = "0.7.0" + +[[deps.ColorSchemes]] +deps = ["ColorTypes", "ColorVectorSpace", "Colors", "FixedPointNumbers", "Random"] +git-tree-sha1 = "1fd869cc3875b57347f7027521f561cf46d1fcd8" +uuid = "35d6a980-a343-548e-a6ea-1d62b119f2f4" +version = "3.19.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", "SpecialFunctions", "Statistics", "TensorCore"] +git-tree-sha1 = "d08c20eef1f2cbc6e60fd3612ac4340b89fea322" +uuid = "c3611d14-8923-5661-9e6a-0046d554d3a4" +version = "0.9.9" + +[[deps.Colors]] +deps = ["ColorTypes", "FixedPointNumbers", "Reexport"] +git-tree-sha1 = "417b0ed7b8b838aa6ca0a87aadf1bb9eb111ce40" +uuid = "5ae59095-9a9b-59fe-a467-6f913c188581" +version = "0.12.8" + +[[deps.CommonSolve]] +git-tree-sha1 = "332a332c97c7071600984b3c31d9067e1a4e6e25" +uuid = "38540f10-b2f7-11e9-35d8-d573e4eb0ff2" +version = "0.2.1" + +[[deps.CommonSubexpressions]] +deps = ["MacroTools", "Test"] +git-tree-sha1 = "7b8a93dba8af7e3b42fecabf646260105ac373f7" +uuid = "bbf7d656-a473-5ed7-a52c-81e309532950" +version = "0.3.0" + +[[deps.Compat]] +deps = ["Base64", "Dates", "DelimitedFiles", "Distributed", "InteractiveUtils", "LibGit2", "Libdl", "LinearAlgebra", "Markdown", "Mmap", "Pkg", "Printf", "REPL", "Random", "SHA", "Serialization", "SharedArrays", "Sockets", "SparseArrays", "Statistics", "Test", "UUIDs", "Unicode"] +git-tree-sha1 = "78bee250c6826e1cf805a88b7f1e86025275d208" +uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" +version = "3.46.0" + +[[deps.CompilerSupportLibraries_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" +version = "0.5.2+0" + +[[deps.ComputationalResources]] +git-tree-sha1 = "52cb3ec90e8a8bea0e62e275ba577ad0f74821f7" +uuid = "ed09eef8-17a6-5b46-8889-db040fac31e3" +version = "0.3.2" + +[[deps.ConstructionBase]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "fb21ddd70a051d882a1686a5a550990bbe371a95" +uuid = "187b0558-2788-49d3-abe0-74a17ed4e7c9" +version = "1.4.1" + +[[deps.Contour]] +deps = ["StaticArrays"] +git-tree-sha1 = "9f02045d934dc030edad45944ea80dbd1f0ebea7" +uuid = "d38c429a-6771-53c6-b99e-75d170b6e991" +version = "0.5.7" + +[[deps.CoordinateTransformations]] +deps = ["LinearAlgebra", "StaticArrays"] +git-tree-sha1 = "681ea870b918e7cff7111da58791d7f718067a19" +uuid = "150eb455-5306-5404-9cee-2592286d6298" +version = "0.6.2" + +[[deps.CpuId]] +deps = ["Markdown"] +git-tree-sha1 = "fcbb72b032692610bfbdb15018ac16a36cf2e406" +uuid = "adafc99b-e345-5852-983c-f28acb93d879" +version = "0.3.1" + +[[deps.Crayons]] +git-tree-sha1 = "249fe38abf76d48563e2f4556bebd215aa317e15" +uuid = "a8cc5b0e-0ffa-5ad4-8c14-923d3ee1735f" +version = "4.1.1" + +[[deps.CustomUnitRanges]] +git-tree-sha1 = "1a3f97f907e6dd8983b744d2642651bb162a3f7a" +uuid = "dc8bdbbb-1ca9-579f-8c36-e416f6a65cce" +version = "1.0.2" + +[[deps.DataAPI]] +git-tree-sha1 = "fb5f5316dd3fd4c5e7c30a24d50643b73e37cd40" +uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a" +version = "1.10.0" + +[[deps.DataFrames]] +deps = ["Compat", "DataAPI", "Future", "InvertedIndices", "IteratorInterfaceExtensions", "LinearAlgebra", "Markdown", "Missings", "PooledArrays", "PrettyTables", "Printf", "REPL", "Reexport", "SortingAlgorithms", "Statistics", "TableTraits", "Tables", "Unicode"] +git-tree-sha1 = "daa21eb85147f72e41f6352a57fccea377e310a9" +uuid = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" +version = "1.3.4" + +[[deps.DataStructures]] +deps = ["Compat", "InteractiveUtils", "OrderedCollections"] +git-tree-sha1 = "d1fff3a548102f48987a52a2e0d114fa97d730f0" +uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" +version = "0.18.13" + +[[deps.DataValueInterfaces]] +git-tree-sha1 = "bfc1187b79289637fa0ef6d4436ebdfe6905cbd6" +uuid = "e2d170a0-9d28-54be-80f0-106bbe20a464" +version = "1.0.0" + +[[deps.Dates]] +deps = ["Printf"] +uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" + +[[deps.DelayDiffEq]] +deps = ["ArrayInterface", "DataStructures", "DiffEqBase", "LinearAlgebra", "Logging", "NonlinearSolve", "OrdinaryDiffEq", "Printf", "RecursiveArrayTools", "Reexport", "SciMLBase", "UnPack"] +git-tree-sha1 = "65445e47be74d38ea9317995400f004bbbb1dd32" +uuid = "bcd4f6db-9728-5f36-b5f7-82caef46ccdb" +version = "5.37.1" + +[[deps.DelimitedFiles]] +deps = ["Mmap"] +uuid = "8bb1440f-4735-579b-a4ab-409b98df4dab" + +[[deps.DensityInterface]] +deps = ["InverseFunctions", "Test"] +git-tree-sha1 = "80c3e8639e3353e5d2912fb3a1916b8455e2494b" +uuid = "b429d917-457f-4dbc-8f4c-0cc954292b1d" +version = "0.4.0" + +[[deps.DiffEqBase]] +deps = ["ArrayInterfaceCore", "ChainRulesCore", "DataStructures", "Distributions", "DocStringExtensions", "FastBroadcast", "ForwardDiff", "FunctionWrappers", "FunctionWrappersWrappers", "LinearAlgebra", "Logging", "MuladdMacro", "NonlinearSolve", "Parameters", "Printf", "RecursiveArrayTools", "Reexport", "Requires", "SciMLBase", "Setfield", "SparseArrays", "Static", "StaticArrays", "Statistics", "ZygoteRules"] +git-tree-sha1 = "7ba58a5d9b4aeb7981dba2d68e6224f4809bb5d5" +uuid = "2b5f629d-d688-5b77-993f-72d75c75574e" +version = "6.97.1" + +[[deps.DiffEqCallbacks]] +deps = ["DataStructures", "DiffEqBase", "ForwardDiff", "LinearAlgebra", "Markdown", "NLsolve", "Parameters", "RecipesBase", "RecursiveArrayTools", "SciMLBase", "StaticArrays"] +git-tree-sha1 = "f8cc1ad62a87988225a07524ef84c7df7264c232" +uuid = "459566f4-90b8-5000-8ac3-15dfb0a30def" +version = "2.24.1" + +[[deps.DiffEqJump]] +deps = ["ArrayInterfaceCore", "DataStructures", "DiffEqBase", "DocStringExtensions", "FunctionWrappers", "Graphs", "LinearAlgebra", "Markdown", "PoissonRandom", "Random", "RandomNumbers", "RecursiveArrayTools", "Reexport", "SciMLBase", "StaticArrays", "TreeViews", "UnPack"] +git-tree-sha1 = "de3014a7c8b4f84d22715a43fe6c58e1c35dc998" +uuid = "c894b116-72e5-5b58-be3c-e6d8d4ac2b12" +version = "8.6.3" + +[[deps.DiffEqNoiseProcess]] +deps = ["DiffEqBase", "Distributions", "GPUArraysCore", "LinearAlgebra", "Markdown", "Optim", "PoissonRandom", "QuadGK", "Random", "Random123", "RandomNumbers", "RecipesBase", "RecursiveArrayTools", "ResettableStacks", "SciMLBase", "StaticArrays", "Statistics"] +git-tree-sha1 = "70590eb0a968cb0a801945c4c26dacca162bbbd3" +uuid = "77a26b50-5914-5dd7-bc55-306e6241c503" +version = "5.12.3" + +[[deps.DiffResults]] +deps = ["StaticArrays"] +git-tree-sha1 = "c18e98cba888c6c25d1c3b048e4b3380ca956805" +uuid = "163ba53b-c6d8-5494-b064-1a9d43ac40c5" +version = "1.0.3" + +[[deps.DiffRules]] +deps = ["IrrationalConstants", "LogExpFunctions", "NaNMath", "Random", "SpecialFunctions"] +git-tree-sha1 = "28d605d9a0ac17118fe2c5e9ce0fbb76c3ceb120" +uuid = "b552c78f-8df3-52c6-915a-8e097449b14b" +version = "1.11.0" + +[[deps.DifferentialEquations]] +deps = ["BoundaryValueDiffEq", "DelayDiffEq", "DiffEqBase", "DiffEqCallbacks", "DiffEqJump", "DiffEqNoiseProcess", "LinearAlgebra", "LinearSolve", "OrdinaryDiffEq", "Random", "RecursiveArrayTools", "Reexport", "SteadyStateDiffEq", "StochasticDiffEq", "Sundials"] +git-tree-sha1 = "3f3db9365fedd5fdbecebc3cce86dfdfe5c43c50" +uuid = "0c46a032-eb83-5123-abaf-570d42b7fbaa" +version = "7.1.0" + +[[deps.Distances]] +deps = ["LinearAlgebra", "SparseArrays", "Statistics", "StatsAPI"] +git-tree-sha1 = "3258d0659f812acde79e8a74b11f17ac06d0ca04" +uuid = "b4f34e82-e78d-54a5-968a-f98e89d6e8f7" +version = "0.10.7" + +[[deps.Distributed]] +deps = ["Random", "Serialization", "Sockets"] +uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" + +[[deps.Distributions]] +deps = ["ChainRulesCore", "DensityInterface", "FillArrays", "LinearAlgebra", "PDMats", "Printf", "QuadGK", "Random", "SparseArrays", "SpecialFunctions", "Statistics", "StatsBase", "StatsFuns", "Test"] +git-tree-sha1 = "334a5896c1534bb1aa7aa2a642d30ba7707357ef" +uuid = "31c24e10-a181-5473-b8eb-7969acd0382f" +version = "0.25.68" + +[[deps.DocStringExtensions]] +deps = ["LibGit2"] +git-tree-sha1 = "5158c2b41018c5f7eb1470d558127ac274eca0c9" +uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" +version = "0.9.1" + +[[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.EarCut_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "3f3a2501fa7236e9b911e0f7a588c657e822bb6d" +uuid = "5ae413db-bbd1-5e63-b57d-d24a61df00f5" +version = "2.2.3+0" + +[[deps.Expat_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "bad72f730e9e91c08d9427d5e8db95478a3c323d" +uuid = "2e619515-83b5-522b-bb60-26c02a35a201" +version = "2.4.8+0" + +[[deps.ExponentialUtilities]] +deps = ["ArrayInterfaceCore", "GPUArraysCore", "GenericSchur", "LinearAlgebra", "Printf", "SparseArrays", "libblastrampoline_jll"] +git-tree-sha1 = "b40c9037e1a33990466bc5d224ced34b34eebdb0" +uuid = "d4d017d3-3776-5f7e-afef-a10c40355c18" +version = "1.18.0" + +[[deps.Extents]] +git-tree-sha1 = "5e1e4c53fa39afe63a7d356e30452249365fba99" +uuid = "411431e0-e8b7-467b-b5e0-f676ba4f2910" +version = "0.1.1" + +[[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", "Pkg", "Zlib_jll", "libaom_jll", "libass_jll", "libfdk_aac_jll", "libvorbis_jll", "x264_jll", "x265_jll"] +git-tree-sha1 = "74faea50c1d007c85837327f6775bea60b5492dd" +uuid = "b22a6f82-2f65-5046-a5b2-351ab43fb4e5" +version = "4.4.2+2" + +[[deps.FFTViews]] +deps = ["CustomUnitRanges", "FFTW"] +git-tree-sha1 = "cbdf14d1e8c7c8aacbe8b19862e0179fd08321c2" +uuid = "4f61f5a4-77b1-5117-aa51-3ab5ef4ef0cd" +version = "0.3.2" + +[[deps.FFTW]] +deps = ["AbstractFFTs", "FFTW_jll", "LinearAlgebra", "MKL_jll", "Preferences", "Reexport"] +git-tree-sha1 = "90630efff0894f8142308e334473eba54c433549" +uuid = "7a1cc6ca-52ef-59f5-83cd-3a7055c09341" +version = "1.5.0" + +[[deps.FFTW_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "c6033cc3892d0ef5bb9cd29b7f2f0331ea5184ea" +uuid = "f5851436-0d7a-5f13-b9de-f02708fd171a" +version = "3.3.10+0" + +[[deps.FastBroadcast]] +deps = ["ArrayInterface", "ArrayInterfaceCore", "LinearAlgebra", "Polyester", "Static", "StrideArraysCore"] +git-tree-sha1 = "21cdeff41e5a1822c2acd7fc7934c5f450588e00" +uuid = "7034ab61-46d4-4ed7-9d0f-46aef9175898" +version = "0.2.1" + +[[deps.FastClosures]] +git-tree-sha1 = "acebe244d53ee1b461970f8910c235b259e772ef" +uuid = "9aa1b823-49e4-5ca5-8b0f-3971ec8bab6a" +version = "0.3.2" + +[[deps.FastLapackInterface]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "25ff6094a718c5dd0996c04d9e52eb2def86c4e3" +uuid = "29a986be-02c6-4525-aec4-84b980013641" +version = "1.2.5" + +[[deps.FileIO]] +deps = ["Pkg", "Requires", "UUIDs"] +git-tree-sha1 = "94f5101b96d2d968ace56f7f2db19d0a5f592e28" +uuid = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" +version = "1.15.0" + +[[deps.FilePathsBase]] +deps = ["Compat", "Dates", "Mmap", "Printf", "Test", "UUIDs"] +git-tree-sha1 = "129b104185df66e408edd6625d480b7f9e9823a0" +uuid = "48062228-2e41-5def-b9a4-89aafe57970f" +version = "0.9.18" + +[[deps.FileWatching]] +uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" + +[[deps.FillArrays]] +deps = ["LinearAlgebra", "Random", "SparseArrays", "Statistics"] +git-tree-sha1 = "246621d23d1f43e3b9c368bf3b72b2331a27c286" +uuid = "1a297f60-69ca-5386-bcde-b61e274b549b" +version = "0.13.2" + +[[deps.FiniteDiff]] +deps = ["ArrayInterfaceCore", "LinearAlgebra", "Requires", "Setfield", "SparseArrays", "StaticArrays"] +git-tree-sha1 = "5a2cff9b6b77b33b89f3d97a4d367747adce647e" +uuid = "6a86dc24-6348-571c-b903-95158fe2bd41" +version = "2.15.0" + +[[deps.FixedPointNumbers]] +deps = ["Statistics"] +git-tree-sha1 = "335bfdceacc84c5cdf16aadc768aa5ddfc5383cc" +uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" +version = "0.8.4" + +[[deps.Fontconfig_jll]] +deps = ["Artifacts", "Bzip2_jll", "Expat_jll", "FreeType2_jll", "JLLWrappers", "Libdl", "Libuuid_jll", "Pkg", "Zlib_jll"] +git-tree-sha1 = "21efd19106a55620a188615da6d3d06cd7f6ee03" +uuid = "a3f928ae-7b40-5064-980b-68af3947d34b" +version = "2.13.93+0" + +[[deps.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", "StaticArrays"] +git-tree-sha1 = "187198a4ed8ccd7b5d99c41b69c679269ea2b2d4" +uuid = "f6369f11-7733-5829-9624-2563aa707210" +version = "0.10.32" + +[[deps.FreeType2_jll]] +deps = ["Artifacts", "Bzip2_jll", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] +git-tree-sha1 = "87eb71354d8ec1a96d4a7636bd57a7347dde3ef9" +uuid = "d7e528f0-a631-5988-bf34-fe36492bcfd7" +version = "2.10.4+0" + +[[deps.FriBidi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "aa31987c2ba8704e23c6c8ba8a4f769d5d7e4f91" +uuid = "559328eb-81f9-559d-9380-de523a88c83c" +version = "1.0.10+0" + +[[deps.FunctionWrappers]] +git-tree-sha1 = "241552bc2209f0fa068b6415b1942cc0aa486bcc" +uuid = "069b7b12-0de2-55c6-9aab-29f3d0a68a2e" +version = "1.1.2" + +[[deps.FunctionWrappersWrappers]] +deps = ["FunctionWrappers"] +git-tree-sha1 = "2da4f223fbc4328b389bcce5f3e93dbe71678590" +uuid = "77dc65aa-8811-40c2-897b-53d922fa7daf" +version = "0.1.0" + +[[deps.Future]] +deps = ["Random"] +uuid = "9fa8497b-333b-5362-9e8d-4d0656e87820" + +[[deps.GLFW_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libglvnd_jll", "Pkg", "Xorg_libXcursor_jll", "Xorg_libXi_jll", "Xorg_libXinerama_jll", "Xorg_libXrandr_jll"] +git-tree-sha1 = "d972031d28c8c8d9d7b41a536ad7bb0c2579caca" +uuid = "0656b61e-2033-5cc2-a64a-77c0f6c09b89" +version = "3.3.8+0" + +[[deps.GPUArraysCore]] +deps = ["Adapt"] +git-tree-sha1 = "6872f5ec8fd1a38880f027a26739d42dcda6691f" +uuid = "46192b85-c4d5-4398-a991-12ede77f4527" +version = "0.1.2" + +[[deps.GR]] +deps = ["Base64", "DelimitedFiles", "GR_jll", "HTTP", "JSON", "Libdl", "LinearAlgebra", "Pkg", "Printf", "Random", "RelocatableFolders", "Serialization", "Sockets", "Test", "UUIDs"] +git-tree-sha1 = "c98aea696662d09e215ef7cda5296024a9646c75" +uuid = "28b8d3ca-fb5f-59d9-8090-bfdbd6d07a71" +version = "0.64.4" + +[[deps.GR_jll]] +deps = ["Artifacts", "Bzip2_jll", "Cairo_jll", "FFMPEG_jll", "Fontconfig_jll", "GLFW_jll", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Libtiff_jll", "Pixman_jll", "Pkg", "Qt5Base_jll", "Zlib_jll", "libpng_jll"] +git-tree-sha1 = "2d908286d120c584abbe7621756c341707096ba4" +uuid = "d2c73de3-f751-5644-a686-071e5b155ba9" +version = "0.66.2+0" + +[[deps.GenericSchur]] +deps = ["LinearAlgebra", "Printf"] +git-tree-sha1 = "fb69b2a645fa69ba5f474af09221b9308b160ce6" +uuid = "c145ed77-6b09-5dd9-b285-bf645a82121e" +version = "0.5.3" + +[[deps.GeoInterface]] +deps = ["Extents"] +git-tree-sha1 = "fb28b5dc239d0174d7297310ef7b84a11804dfab" +uuid = "cf35fbd7-0cd7-5166-be24-54bfbe79505f" +version = "1.0.1" + +[[deps.GeometryBasics]] +deps = ["EarCut_jll", "GeoInterface", "IterTools", "LinearAlgebra", "StaticArrays", "StructArrays", "Tables"] +git-tree-sha1 = "a7a97895780dab1085a97769316aa348830dc991" +uuid = "5c1252a2-5f33-56bf-86c9-59e7332b4326" +version = "0.4.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.Ghostscript_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "78e2c69783c9753a91cdae88a8d432be85a2ab5e" +uuid = "61579ee1-b43e-5ca0-a5da-69d92c66a64b" +version = "9.55.0+0" + +[[deps.Glib_jll]] +deps = ["Artifacts", "Gettext_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Libiconv_jll", "Libmount_jll", "PCRE_jll", "Pkg", "Zlib_jll"] +git-tree-sha1 = "a32d672ac2c967f3deb8a81d828afc739c838a06" +uuid = "7746bdde-850d-59dc-9ae8-88ece973131d" +version = "2.68.3+2" + +[[deps.Graphics]] +deps = ["Colors", "LinearAlgebra", "NaNMath"] +git-tree-sha1 = "d61890399bc535850c4bf08e4e0d3a7ad0f21cbd" +uuid = "a2bd30eb-e257-5431-a919-1863eab51364" +version = "1.1.2" + +[[deps.Graphite2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "344bf40dcab1073aca04aa0df4fb092f920e4011" +uuid = "3b182d85-2403-5c21-9c21-1e1f0cc25472" +version = "1.3.14+0" + +[[deps.Graphs]] +deps = ["ArnoldiMethod", "Compat", "DataStructures", "Distributed", "Inflate", "LinearAlgebra", "Random", "SharedArrays", "SimpleTraits", "SparseArrays", "Statistics"] +git-tree-sha1 = "a6d30bdc378d340912f48abf01281aab68c0dec8" +uuid = "86223c79-3864-5bf0-83f7-82e725a168b6" +version = "1.7.2" + +[[deps.Grisu]] +git-tree-sha1 = "53bb909d1151e57e2484c3d1b53e19552b887fb2" +uuid = "42e2da0e-8278-4e71-bc24-59509adca0fe" +version = "1.0.2" + +[[deps.HTTP]] +deps = ["Base64", "Dates", "IniFile", "Logging", "MbedTLS", "NetworkOptions", "Sockets", "URIs"] +git-tree-sha1 = "0fa77022fe4b511826b39c894c90daf5fce3334a" +uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3" +version = "0.9.17" + +[[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 = "b7b88a4716ac33fe31d6556c02fc60017594343c" +uuid = "3e5b6fbb-0976-4d2c-9146-d79de83f2fb0" +version = "0.1.8" + +[[deps.HypergeometricFunctions]] +deps = ["DualNumbers", "LinearAlgebra", "OpenLibm_jll", "SpecialFunctions", "Test"] +git-tree-sha1 = "709d864e3ed6e3545230601f94e11ebc65994641" +uuid = "34004b35-14d8-5ef3-9330-4cdb6864b03a" +version = "0.3.11" + +[[deps.Hyperscript]] +deps = ["Test"] +git-tree-sha1 = "8d511d5b81240fc8e6802386302675bdf47737b9" +uuid = "47d2ed2b-36de-50cf-bf87-49c2cf4b8b91" +version = "0.0.4" + +[[deps.HypertextLiteral]] +deps = ["Tricks"] +git-tree-sha1 = "c47c5fa4c5308f27ccaac35504858d8914e102f9" +uuid = "ac1192a8-f4b3-4bfe-ba22-af5b92cd3ab2" +version = "0.9.4" + +[[deps.IOCapture]] +deps = ["Logging", "Random"] +git-tree-sha1 = "f7be53659ab06ddc986428d3a9dcc95f6fa6705a" +uuid = "b5f81e59-6552-4d32-b1f0-c071b021bf89" +version = "0.2.2" + +[[deps.IfElse]] +git-tree-sha1 = "debdd00ffef04665ccbb3e150747a77560e8fad1" +uuid = "615f187c-cbe4-4ef1-ba3b-2fcf58d6d173" +version = "0.1.1" + +[[deps.ImageAxes]] +deps = ["AxisArrays", "ImageBase", "ImageCore", "Reexport", "SimpleTraits"] +git-tree-sha1 = "c54b581a83008dc7f292e205f4c409ab5caa0f04" +uuid = "2803e5a7-5153-5ecf-9a86-9b4c37f5f5ac" +version = "0.6.10" + +[[deps.ImageBase]] +deps = ["ImageCore", "Reexport"] +git-tree-sha1 = "b51bb8cae22c66d0f6357e3bcb6363145ef20835" +uuid = "c817782e-172a-44cc-b673-b171935fbb9e" +version = "0.1.5" + +[[deps.ImageContrastAdjustment]] +deps = ["ImageCore", "ImageTransformations", "Parameters"] +git-tree-sha1 = "0d75cafa80cf22026cea21a8e6cf965295003edc" +uuid = "f332f351-ec65-5f6a-b3d1-319c6670881a" +version = "0.3.10" + +[[deps.ImageCore]] +deps = ["AbstractFFTs", "ColorVectorSpace", "Colors", "FixedPointNumbers", "Graphics", "MappedArrays", "MosaicViews", "OffsetArrays", "PaddedViews", "Reexport"] +git-tree-sha1 = "acf614720ef026d38400b3817614c45882d75500" +uuid = "a09fc81d-aa75-5fe9-8630-4744c3626534" +version = "0.9.4" + +[[deps.ImageDistances]] +deps = ["Distances", "ImageCore", "ImageMorphology", "LinearAlgebra", "Statistics"] +git-tree-sha1 = "b1798a4a6b9aafb530f8f0c4a7b2eb5501e2f2a3" +uuid = "51556ac3-7006-55f5-8cb3-34580c88182d" +version = "0.2.16" + +[[deps.ImageFiltering]] +deps = ["CatIndices", "ComputationalResources", "DataStructures", "FFTViews", "FFTW", "ImageBase", "ImageCore", "LinearAlgebra", "OffsetArrays", "Reexport", "SparseArrays", "StaticArrays", "Statistics", "TiledIteration"] +git-tree-sha1 = "15bd05c1c0d5dbb32a9a3d7e0ad2d50dd6167189" +uuid = "6a3955dd-da59-5b1f-98d4-e7296123deb5" +version = "0.7.1" + +[[deps.ImageIO]] +deps = ["FileIO", "IndirectArrays", "JpegTurbo", "LazyModules", "Netpbm", "OpenEXR", "PNGFiles", "QOI", "Sixel", "TiffImages", "UUIDs"] +git-tree-sha1 = "342f789fd041a55166764c351da1710db97ce0e0" +uuid = "82e4d734-157c-48bb-816b-45c225c6df19" +version = "0.6.6" + +[[deps.ImageMagick]] +deps = ["FileIO", "ImageCore", "ImageMagick_jll", "InteractiveUtils", "Libdl", "Pkg", "Random"] +git-tree-sha1 = "5bc1cb62e0c5f1005868358db0692c994c3a13c6" +uuid = "6218d12a-5da1-5696-b52f-db25d2ecc6d1" +version = "1.2.1" + +[[deps.ImageMagick_jll]] +deps = ["Artifacts", "Ghostscript_jll", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Libtiff_jll", "Pkg", "Zlib_jll", "libpng_jll"] +git-tree-sha1 = "124626988534986113cfd876e3093e4a03890f58" +uuid = "c73af94c-d91f-53ed-93a7-00f77d67a9d7" +version = "6.9.12+3" + +[[deps.ImageMetadata]] +deps = ["AxisArrays", "ImageAxes", "ImageBase", "ImageCore"] +git-tree-sha1 = "36cbaebed194b292590cba2593da27b34763804a" +uuid = "bc367c6b-8a6b-528e-b4bd-a4b897500b49" +version = "0.9.8" + +[[deps.ImageMorphology]] +deps = ["ImageCore", "LinearAlgebra", "Requires", "TiledIteration"] +git-tree-sha1 = "e7c68ab3df4a75511ba33fc5d8d9098007b579a8" +uuid = "787d08f9-d448-5407-9aad-5290dd7ab264" +version = "0.3.2" + +[[deps.ImageQualityIndexes]] +deps = ["ImageContrastAdjustment", "ImageCore", "ImageDistances", "ImageFiltering", "LazyModules", "OffsetArrays", "Statistics"] +git-tree-sha1 = "0c703732335a75e683aec7fdfc6d5d1ebd7c596f" +uuid = "2996bd0c-7a13-11e9-2da2-2f5ce47296a9" +version = "0.3.3" + +[[deps.ImageSegmentation]] +deps = ["Clustering", "DataStructures", "Distances", "Graphs", "ImageCore", "ImageFiltering", "ImageMorphology", "LinearAlgebra", "MetaGraphs", "RegionTrees", "SimpleWeightedGraphs", "StaticArrays", "Statistics"] +git-tree-sha1 = "36832067ea220818d105d718527d6ed02385bf22" +uuid = "80713f31-8817-5129-9cf8-209ff8fb23e1" +version = "1.7.0" + +[[deps.ImageShow]] +deps = ["Base64", "FileIO", "ImageBase", "ImageCore", "OffsetArrays", "StackViews"] +git-tree-sha1 = "b563cf9ae75a635592fc73d3eb78b86220e55bd8" +uuid = "4e3cecfd-b093-5904-9786-8bbb286a6a31" +version = "0.3.6" + +[[deps.ImageTransformations]] +deps = ["AxisAlgorithms", "ColorVectorSpace", "CoordinateTransformations", "ImageBase", "ImageCore", "Interpolations", "OffsetArrays", "Rotations", "StaticArrays"] +git-tree-sha1 = "8717482f4a2108c9358e5c3ca903d3a6113badc9" +uuid = "02fcd773-0e25-5acc-982a-7f6622650795" +version = "0.9.5" + +[[deps.Images]] +deps = ["Base64", "FileIO", "Graphics", "ImageAxes", "ImageBase", "ImageContrastAdjustment", "ImageCore", "ImageDistances", "ImageFiltering", "ImageIO", "ImageMagick", "ImageMetadata", "ImageMorphology", "ImageQualityIndexes", "ImageSegmentation", "ImageShow", "ImageTransformations", "IndirectArrays", "IntegralArrays", "Random", "Reexport", "SparseArrays", "StaticArrays", "Statistics", "StatsBase", "TiledIteration"] +git-tree-sha1 = "03d1301b7ec885b266c0f816f338368c6c0b81bd" +uuid = "916415d5-f1e6-5110-898d-aaa5f9f070e0" +version = "0.25.2" + +[[deps.Imath_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "87f7662e03a649cffa2e05bf19c303e168732d3e" +uuid = "905a6f67-0a94-5f89-b386-d35d92009cd1" +version = "3.1.2+0" + +[[deps.IndirectArrays]] +git-tree-sha1 = "012e604e1c7458645cb8b436f8fba789a51b257f" +uuid = "9b13fd28-a010-5f03-acff-a1bbcff69959" +version = "1.0.0" + +[[deps.Inflate]] +git-tree-sha1 = "5cd07aab533df5170988219191dfad0519391428" +uuid = "d25df0c9-e2be-5dd7-82c8-3ad0b3e990b9" +version = "0.1.3" + +[[deps.IniFile]] +git-tree-sha1 = "f550e6e32074c939295eb5ea6de31849ac2c9625" +uuid = "83e8ac13-25f8-5344-8a64-a9f2b223428f" +version = "0.5.1" + +[[deps.InlineStrings]] +deps = ["Parsers"] +git-tree-sha1 = "d19f9edd8c34760dca2de2b503f969d8700ed288" +uuid = "842dd82b-1e85-43dc-bf29-5d0ee9dffc48" +version = "1.1.4" + +[[deps.IntegralArrays]] +deps = ["ColorTypes", "FixedPointNumbers", "IntervalSets"] +git-tree-sha1 = "be8e690c3973443bec584db3346ddc904d4884eb" +uuid = "1d092043-8f09-5a30-832f-7509e371ab51" +version = "0.1.5" + +[[deps.IntelOpenMP_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "d979e54b71da82f3a65b62553da4fc3d18c9004c" +uuid = "1d5cc7b8-4909-519e-a0f8-d0f5ad9712d0" +version = "2018.0.3+2" + +[[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 = "64f138f9453a018c8f3562e7bae54edc059af249" +uuid = "a98d9a8b-a2ab-59e6-89dd-64a1c18fca59" +version = "0.14.4" + +[[deps.IntervalSets]] +deps = ["Dates", "Random", "Statistics"] +git-tree-sha1 = "076bb0da51a8c8d1229936a1af7bdfacd65037e1" +uuid = "8197267c-284f-5f27-9208-e0e47529a953" +version = "0.7.2" + +[[deps.InverseFunctions]] +deps = ["Test"] +git-tree-sha1 = "b3364212fb5d870f724876ffcd34dd8ec6d98918" +uuid = "3587e190-3f89-42d0-90ee-14403ec27112" +version = "0.1.7" + +[[deps.InvertedIndices]] +git-tree-sha1 = "bee5f1ef5bf65df56bdd2e40447590b272a5471f" +uuid = "41ab1584-1d38-5bbf-9106-f11c6c58b48f" +version = "1.1.0" + +[[deps.IrrationalConstants]] +git-tree-sha1 = "7fd44fd4ff43fc60815f8e764c0f352b83c49151" +uuid = "92d709cd-6900-40b7-9082-c6be49f344b6" +version = "0.1.1" + +[[deps.IterTools]] +git-tree-sha1 = "fa6287a4469f5e048d763df38279ee729fbd44e5" +uuid = "c8e1da08-722c-5040-9ed9-7db0dc04731e" +version = "1.4.0" + +[[deps.IterativeSolvers]] +deps = ["LinearAlgebra", "Printf", "Random", "RecipesBase", "SparseArrays"] +git-tree-sha1 = "1169632f425f79429f245113b775a0e3d121457c" +uuid = "42fd0dbc-a981-5370-80f2-aaf504508153" +version = "0.9.2" + +[[deps.IteratorInterfaceExtensions]] +git-tree-sha1 = "a3f24677c21f5bbe9d2a714f95dcd58337fb2856" +uuid = "82899510-4779-5014-852e-03e436cf321d" +version = "1.0.0" + +[[deps.JLD2]] +deps = ["FileIO", "MacroTools", "Mmap", "OrderedCollections", "Pkg", "Printf", "Reexport", "TranscodingStreams", "UUIDs"] +git-tree-sha1 = "81b9477b49402b47fbe7f7ae0b252077f53e4a08" +uuid = "033835bb-8acc-5ee8-8aae-3f567f8a3819" +version = "0.4.22" + +[[deps.JLLWrappers]] +deps = ["Preferences"] +git-tree-sha1 = "abc9885a7ca2052a736a600f7fa66209f96506e1" +uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" +version = "1.4.1" + +[[deps.JSON]] +deps = ["Dates", "Mmap", "Parsers", "Unicode"] +git-tree-sha1 = "3c837543ddb02250ef42f4738347454f95079d4e" +uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" +version = "0.21.3" + +[[deps.JpegTurbo]] +deps = ["CEnum", "FileIO", "ImageCore", "JpegTurbo_jll", "TOML"] +git-tree-sha1 = "a77b273f1ddec645d1b7c4fd5fb98c8f90ad10a5" +uuid = "b835a17e-a41a-41e7-81f0-2f016b05efe0" +version = "0.1.1" + +[[deps.JpegTurbo_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "b53380851c6e6664204efb2e62cd24fa5c47e4ba" +uuid = "aacddb02-875f-59d6-b918-886e6ef4fbf8" +version = "2.1.2+0" + +[[deps.JumpProcesses]] +deps = ["ArrayInterfaceCore", "DataStructures", "DiffEqBase", "DocStringExtensions", "FunctionWrappers", "Graphs", "LinearAlgebra", "Markdown", "PoissonRandom", "Random", "RandomNumbers", "RecursiveArrayTools", "Reexport", "SciMLBase", "StaticArrays", "TreeViews", "UnPack"] +git-tree-sha1 = "516d2041c7d95b14bc845888daa02ee8aa97550b" +uuid = "ccbc3e58-028d-4f4c-8cd5-9ae44345cda5" +version = "9.1.3" + +[[deps.KLU]] +deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse_jll"] +git-tree-sha1 = "cae5e3dfd89b209e01bcd65b3a25e74462c67ee0" +uuid = "ef3ab10e-7fda-4108-b977-705223b18434" +version = "0.3.0" + +[[deps.Krylov]] +deps = ["LinearAlgebra", "Printf", "SparseArrays"] +git-tree-sha1 = "a2327039e1c84615e22d662adb3df113caf44b70" +uuid = "ba0b0d4f-ebba-5204-a429-3ac8c609bfb7" +version = "0.8.3" + +[[deps.KrylovKit]] +deps = ["LinearAlgebra", "Printf"] +git-tree-sha1 = "49b0c1dd5c292870577b8f58c51072bd558febb9" +uuid = "0b1a1467-8014-51b9-945f-bf0ae24f4b77" +version = "0.5.4" + +[[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.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 = "f2355693d6778a178ade15952b7ac47a4ff97996" +uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" +version = "1.3.0" + +[[deps.Latexify]] +deps = ["Formatting", "InteractiveUtils", "LaTeXStrings", "MacroTools", "Markdown", "Printf", "Requires"] +git-tree-sha1 = "1a43be956d433b5d0321197150c2f94e16c0aaa0" +uuid = "23fbe1c1-3f47-55db-b15f-69d7ec21a316" +version = "0.15.16" + +[[deps.LayoutPointers]] +deps = ["ArrayInterface", "ArrayInterfaceOffsetArrays", "ArrayInterfaceStaticArrays", "LinearAlgebra", "ManualMemory", "SIMDTypes", "Static"] +git-tree-sha1 = "b67e749fb35530979839e7b4b606a97105fe4f1c" +uuid = "10f19ff3-798f-405d-979b-55457f8fc047" +version = "0.1.10" + +[[deps.LazyArtifacts]] +deps = ["Artifacts", "Pkg"] +uuid = "4af54fe1-eca0-43a8-85a7-787d91b784e3" + +[[deps.LazyModules]] +git-tree-sha1 = "a560dd966b386ac9ae60bdd3a3d3a326062d3c3e" +uuid = "8cdb02fc-e678-4876-92c5-9defec4f444e" +version = "0.3.1" + +[[deps.LevyArea]] +deps = ["LinearAlgebra", "Random", "SpecialFunctions"] +git-tree-sha1 = "56513a09b8e0ae6485f34401ea9e2f31357958ec" +uuid = "2d8b4e74-eb68-11e8-0fb9-d5eb67b50637" +version = "1.0.0" + +[[deps.LibCURL]] +deps = ["LibCURL_jll", "MozillaCACerts_jll"] +uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" +version = "0.6.3" + +[[deps.LibCURL_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] +uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" +version = "7.84.0+0" + +[[deps.LibGit2]] +deps = ["Base64", "NetworkOptions", "Printf", "SHA"] +uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" + +[[deps.LibSSH2_jll]] +deps = ["Artifacts", "Libdl", "MbedTLS_jll"] +uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" +version = "1.10.2+0" + +[[deps.Libdl]] +uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" + +[[deps.Libffi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "0b4a5d71f3e5200a7dff793393e09dfc2d874290" +uuid = "e9f186c6-92d2-5b65-8a66-fee21dc1b490" +version = "3.2.2+1" + +[[deps.Libgcrypt_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgpg_error_jll", "Pkg"] +git-tree-sha1 = "64613c82a59c120435c067c2b809fc61cf5166ae" +uuid = "d4300ac3-e22c-5743-9152-c294e39db1e4" +version = "1.8.7+0" + +[[deps.Libglvnd_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll", "Xorg_libXext_jll"] +git-tree-sha1 = "7739f837d6447403596a75d19ed01fd08d6f56bf" +uuid = "7e76a0d4-f3c7-5321-8279-8d96eeed0f29" +version = "1.3.0+3" + +[[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", "Pkg"] +git-tree-sha1 = "42b62845d70a619f063a7da093d995ec8e15e778" +uuid = "94ce4f54-9a6c-5748-9c1c-f9c7231a4531" +version = "1.16.1+1" + +[[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", "Pkg", "Zlib_jll", "Zstd_jll"] +git-tree-sha1 = "3eb79b0ca5764d4799c06699573fd8f533259713" +uuid = "89763e89-9b03-5906-acba-b20f662cd828" +version = "4.4.0+0" + +[[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", "libblastrampoline_jll"] +uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + +[[deps.LinearSolve]] +deps = ["ArrayInterfaceCore", "DocStringExtensions", "FastLapackInterface", "GPUArraysCore", "IterativeSolvers", "KLU", "Krylov", "KrylovKit", "LinearAlgebra", "RecursiveFactorization", "Reexport", "SciMLBase", "Setfield", "SparseArrays", "SuiteSparse", "UnPack"] +git-tree-sha1 = "c48c190442b22c94499a446b8b452f16d04a258c" +uuid = "7ed4a6bd-45f5-4d41-b270-4a48e9bafcae" +version = "1.23.3" + +[[deps.LogExpFunctions]] +deps = ["ChainRulesCore", "ChangesOfVariables", "DocStringExtensions", "InverseFunctions", "IrrationalConstants", "LinearAlgebra"] +git-tree-sha1 = "94d9c52ca447e23eac0c0f074effbcd38830deb5" +uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688" +version = "0.3.18" + +[[deps.Logging]] +uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" + +[[deps.LoopVectorization]] +deps = ["ArrayInterface", "ArrayInterfaceCore", "ArrayInterfaceOffsetArrays", "ArrayInterfaceStaticArrays", "CPUSummary", "ChainRulesCore", "CloseOpenIntervals", "DocStringExtensions", "ForwardDiff", "HostCPUFeatures", "IfElse", "LayoutPointers", "LinearAlgebra", "OffsetArrays", "PolyesterWeave", "SIMDDualNumbers", "SIMDTypes", "SLEEFPirates", "SnoopPrecompile", "SpecialFunctions", "Static", "ThreadingUtilities", "UnPack", "VectorizationBase"] +git-tree-sha1 = "60613258cc56b6c7c909f3e960e8b3b4e86dc2f2" +uuid = "bdcacae8-1622-11e9-2a5c-532679323890" +version = "0.12.124" + +[[deps.MKL_jll]] +deps = ["Artifacts", "IntelOpenMP_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "Pkg"] +git-tree-sha1 = "e595b205efd49508358f7dc670a940c790204629" +uuid = "856f044c-d86e-5d09-b602-aeab76dc8ba7" +version = "2022.0.0+0" + +[[deps.MacroTools]] +deps = ["Markdown", "Random"] +git-tree-sha1 = "3d3e902b31198a27340d0bf00d6ac452866021cf" +uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" +version = "0.5.9" + +[[deps.ManualMemory]] +git-tree-sha1 = "bcaef4fc7a0cfe2cba636d84cda54b5e4e4ca3cd" +uuid = "d125e4d3-2237-4719-b19c-fa641b8a4667" +version = "0.1.8" + +[[deps.MappedArrays]] +git-tree-sha1 = "e8b359ef06ec72e8c030463fe02efe5527ee5142" +uuid = "dbb5928d-eab1-5f90-85c2-b9b0edb7c900" +version = "0.4.1" + +[[deps.Markdown]] +deps = ["Base64"] +uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" + +[[deps.MbedTLS]] +deps = ["Dates", "MbedTLS_jll", "MozillaCACerts_jll", "Random", "Sockets"] +git-tree-sha1 = "d9ab10da9de748859a7780338e1d6566993d1f25" +uuid = "739be429-bea8-5141-9913-cc70e7f3736d" +version = "1.1.3" + +[[deps.MbedTLS_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" +version = "2.28.0+0" + +[[deps.Measures]] +git-tree-sha1 = "e498ddeee6f9fdb4551ce855a46f54dbd900245f" +uuid = "442fdcdd-2543-5da2-b0f3-8c86c306513e" +version = "0.3.1" + +[[deps.MetaGraphs]] +deps = ["Graphs", "JLD2", "Random"] +git-tree-sha1 = "2af69ff3c024d13bde52b34a2a7d6887d4e7b438" +uuid = "626554b9-1ddb-594c-aa3c-2596fe9399a5" +version = "0.7.1" + +[[deps.Missings]] +deps = ["DataAPI"] +git-tree-sha1 = "bf210ce90b6c9eed32d25dbcae1ebc565df2687f" +uuid = "e1d29d7a-bbdc-5cf2-9ac0-f12de2c33e28" +version = "1.0.2" + +[[deps.Mmap]] +uuid = "a63ad114-7e13-5084-954f-fe012c677804" + +[[deps.MosaicViews]] +deps = ["MappedArrays", "OffsetArrays", "PaddedViews", "StackViews"] +git-tree-sha1 = "b34e3bc3ca7c94914418637cb10cc4d1d80d877d" +uuid = "e94cdb99-869f-56ef-bcf0-1ae2bcbe0389" +version = "0.3.3" + +[[deps.MozillaCACerts_jll]] +uuid = "14a3606d-f60d-562e-9121-12d972cd8159" +version = "2022.2.1" + +[[deps.MuladdMacro]] +git-tree-sha1 = "c6190f9a7fc5d9d5915ab29f2134421b12d24a68" +uuid = "46d2c3a1-f734-5fdb-9937-b9b9aeba4221" +version = "0.2.2" + +[[deps.NLSolversBase]] +deps = ["DiffResults", "Distributed", "FiniteDiff", "ForwardDiff"] +git-tree-sha1 = "50310f934e55e5ca3912fb941dec199b49ca9b68" +uuid = "d41bc354-129a-5804-8e4c-c37616107c6c" +version = "7.8.2" + +[[deps.NLsolve]] +deps = ["Distances", "LineSearches", "LinearAlgebra", "NLSolversBase", "Printf", "Reexport"] +git-tree-sha1 = "019f12e9a1a7880459d0173c182e6a99365d7ac1" +uuid = "2774e3e8-f4cf-5e23-947b-6d7e65073b56" +version = "4.5.1" + +[[deps.NaNMath]] +deps = ["OpenLibm_jll"] +git-tree-sha1 = "a7c3d1da1189a1c2fe843a3bfa04d18d20eb3211" +uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" +version = "1.0.1" + +[[deps.NearestNeighbors]] +deps = ["Distances", "StaticArrays"] +git-tree-sha1 = "0e353ed734b1747fc20cd4cba0edd9ac027eff6a" +uuid = "b8a86587-4115-5ab1-83bc-aa920d37bbce" +version = "0.4.11" + +[[deps.Netpbm]] +deps = ["FileIO", "ImageCore"] +git-tree-sha1 = "18efc06f6ec36a8b801b23f076e3c6ac7c3bf153" +uuid = "f09324ee-3d7c-5217-9330-fc30815ba969" +version = "1.0.2" + +[[deps.NetworkOptions]] +uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" +version = "1.2.0" + +[[deps.NonlinearSolve]] +deps = ["ArrayInterfaceCore", "FiniteDiff", "ForwardDiff", "IterativeSolvers", "LinearAlgebra", "RecursiveArrayTools", "RecursiveFactorization", "Reexport", "SciMLBase", "Setfield", "StaticArrays", "UnPack"] +git-tree-sha1 = "a754a21521c0ab48d37f44bbac1eefd1387bdcfc" +uuid = "8913a72c-1f9b-4ce2-8d82-65094dcecaec" +version = "0.3.22" + +[[deps.OffsetArrays]] +deps = ["Adapt"] +git-tree-sha1 = "1ea784113a6aa054c5ebd95945fa5e52c2f378e7" +uuid = "6fe1bfb0-de20-5000-8ca7-80f57d26f881" +version = "1.12.7" + +[[deps.Ogg_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "887579a3eb005446d514ab7aeac5d1d027658b8f" +uuid = "e7412a2a-1a6e-54c0-be00-318e2571c051" +version = "1.3.5+1" + +[[deps.OpenBLAS_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] +uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" +version = "0.3.20+0" + +[[deps.OpenEXR]] +deps = ["Colors", "FileIO", "OpenEXR_jll"] +git-tree-sha1 = "327f53360fdb54df7ecd01e96ef1983536d1e633" +uuid = "52e1d378-f018-4a11-a4be-720524705ac7" +version = "0.3.2" + +[[deps.OpenEXR_jll]] +deps = ["Artifacts", "Imath_jll", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] +git-tree-sha1 = "923319661e9a22712f24596ce81c54fc0366f304" +uuid = "18a262bb-aa17-5467-a713-aee519bc75cb" +version = "3.1.1+0" + +[[deps.OpenLibm_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "05823500-19ac-5b8b-9628-191a04bc5112" +version = "0.8.1+0" + +[[deps.OpenSSL_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "e60321e3f2616584ff98f0a4f18d98ae6f89bbb3" +uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95" +version = "1.1.17+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 = "7351d1daa3dad1bcf67c79d1ba34dd3f6136c9aa" +uuid = "429524aa-4258-5aef-a3af-852621145aeb" +version = "1.7.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 = "85f8e6578bf1f9ee0d11e7bb1b1456435479d47c" +uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" +version = "1.4.1" + +[[deps.OrdinaryDiffEq]] +deps = ["Adapt", "ArrayInterface", "ArrayInterfaceGPUArrays", "ArrayInterfaceStaticArrays", "DataStructures", "DiffEqBase", "DocStringExtensions", "ExponentialUtilities", "FastBroadcast", "FastClosures", "FiniteDiff", "ForwardDiff", "FunctionWrappersWrappers", "LinearAlgebra", "LinearSolve", "Logging", "LoopVectorization", "MacroTools", "MuladdMacro", "NLsolve", "NonlinearSolve", "Polyester", "PreallocationTools", "RecursiveArrayTools", "Reexport", "SciMLBase", "SnoopPrecompile", "SparseArrays", "SparseDiffTools", "StaticArrays", "UnPack"] +git-tree-sha1 = "b706c49554e69e4ffcb836e3a9b6e6850691c365" +uuid = "1dea7af3-3e70-54e6-95c3-0bf5283fa5ed" +version = "6.23.0" + +[[deps.PCRE2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "efcefdf7-47ab-520b-bdef-62a2eaa19f15" +version = "10.40.0+0" + +[[deps.PCRE_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "b2a7af664e098055a7529ad1a900ded962bca488" +uuid = "2f80f16e-611a-54ab-bc61-aa92de5b98fc" +version = "8.44.0+0" + +[[deps.PDMats]] +deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"] +git-tree-sha1 = "cf494dca75a69712a72b80bc48f59dcf3dea63ec" +uuid = "90014a1f-27ba-587c-ab20-58faa44d9150" +version = "0.11.16" + +[[deps.PNGFiles]] +deps = ["Base64", "CEnum", "ImageCore", "IndirectArrays", "OffsetArrays", "libpng_jll"] +git-tree-sha1 = "e925a64b8585aa9f4e3047b8d2cdc3f0e79fd4e4" +uuid = "f57f5aa1-a3ce-4bc8-8ab9-96f992907883" +version = "0.3.16" + +[[deps.PaddedViews]] +deps = ["OffsetArrays"] +git-tree-sha1 = "03a7a85b76381a3d04c7a1656039197e70eda03d" +uuid = "5432bcbf-9aad-5242-b902-cca2824c8663" +version = "0.5.11" + +[[deps.Parameters]] +deps = ["OrderedCollections", "UnPack"] +git-tree-sha1 = "34c0e9ad262e5f7fc75b10a9952ca7692cfc5fbe" +uuid = "d96e819e-fc66-5662-9728-84c9c7592b0a" +version = "0.12.3" + +[[deps.Parsers]] +deps = ["Dates"] +git-tree-sha1 = "0044b23da09b5608b4ecacb4e5e6c6332f833a7e" +uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" +version = "2.3.2" + +[[deps.Pixman_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "b4f5d02549a10e20780a24fce72bea96b6329e29" +uuid = "30392449-352a-5448-841d-b1acce4e97dc" +version = "0.40.1+0" + +[[deps.Pkg]] +deps = ["Artifacts", "Dates", "Downloads", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] +uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" +version = "1.8.0" + +[[deps.PkgVersion]] +deps = ["Pkg"] +git-tree-sha1 = "f6cf8e7944e50901594838951729a1861e668cb8" +uuid = "eebad327-c553-4316-9ea0-9fa01ccd7688" +version = "0.3.2" + +[[deps.PlotThemes]] +deps = ["PlotUtils", "Statistics"] +git-tree-sha1 = "8162b2f8547bc23876edd0c5181b27702ae58dce" +uuid = "ccf2f8ad-2431-5c83-bf29-c5338b663b6a" +version = "3.0.0" + +[[deps.PlotUtils]] +deps = ["ColorSchemes", "Colors", "Dates", "Printf", "Random", "Reexport", "Statistics"] +git-tree-sha1 = "9888e59493658e476d3073f1ce24348bdc086660" +uuid = "995b91a9-d308-5afd-9ec6-746e21dbc043" +version = "1.3.0" + +[[deps.Plots]] +deps = ["Base64", "Contour", "Dates", "Downloads", "FFMPEG", "FixedPointNumbers", "GR", "GeometryBasics", "JSON", "Latexify", "LinearAlgebra", "Measures", "NaNMath", "Pkg", "PlotThemes", "PlotUtils", "Printf", "REPL", "Random", "RecipesBase", "RecipesPipeline", "Reexport", "Requires", "Scratch", "Showoff", "SparseArrays", "Statistics", "StatsBase", "UUIDs", "UnicodeFun", "Unzip"] +git-tree-sha1 = "9e42de869561d6bdf8602c57ec557d43538a92f0" +uuid = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" +version = "1.29.1" + +[[deps.PlutoUI]] +deps = ["AbstractPlutoDingetjes", "Base64", "ColorTypes", "Dates", "Hyperscript", "HypertextLiteral", "IOCapture", "InteractiveUtils", "JSON", "Logging", "Markdown", "Random", "Reexport", "UUIDs"] +git-tree-sha1 = "8d1f54886b9037091edf146b517989fc4a09efec" +uuid = "7f904dfe-b85e-4ff6-b463-dae2292396a8" +version = "0.7.39" + +[[deps.PoissonRandom]] +deps = ["Random"] +git-tree-sha1 = "9ac1bb7c15c39620685a3a7babc0651f5c64c35b" +uuid = "e409e4f3-bfea-5376-8464-e040bb5c01ab" +version = "0.4.1" + +[[deps.Polyester]] +deps = ["ArrayInterface", "BitTwiddlingConvenienceFunctions", "CPUSummary", "IfElse", "ManualMemory", "PolyesterWeave", "Requires", "Static", "StrideArraysCore", "ThreadingUtilities"] +git-tree-sha1 = "94e20822bd7427b1b1b843a3980003f5d5e8696b" +uuid = "f517fe37-dbe3-4b94-8317-1923a5111588" +version = "0.6.14" + +[[deps.PolyesterWeave]] +deps = ["BitTwiddlingConvenienceFunctions", "CPUSummary", "IfElse", "Static", "ThreadingUtilities"] +git-tree-sha1 = "233feae14c07cca6b95080f77a7d332612603f6a" +uuid = "1d0040c9-8b98-4ee7-8388-3f51789ca0ad" +version = "0.1.9" + +[[deps.PooledArrays]] +deps = ["DataAPI", "Future"] +git-tree-sha1 = "a6062fe4063cdafe78f4a0a81cfffb89721b30e7" +uuid = "2dfb63ee-cc39-5dd5-95bd-886bf059d720" +version = "1.4.2" + +[[deps.PositiveFactorizations]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "17275485f373e6673f7e7f97051f703ed5b15b20" +uuid = "85a6dd25-e78a-55b7-8502-1745935b8125" +version = "0.2.4" + +[[deps.PreallocationTools]] +deps = ["Adapt", "ArrayInterfaceCore", "ForwardDiff", "ReverseDiff"] +git-tree-sha1 = "5c076a409ec8d2a86d3685a7e4fed330cd489889" +uuid = "d236fae5-4411-538c-8e31-a6e3d9e00b46" +version = "0.4.2" + +[[deps.Preferences]] +deps = ["TOML"] +git-tree-sha1 = "47e5f437cc0e7ef2ce8406ce1e7e24d44915f88d" +uuid = "21216c6a-2e73-6563-6e65-726566657250" +version = "1.3.0" + +[[deps.PrettyTables]] +deps = ["Crayons", "Formatting", "Markdown", "Reexport", "Tables"] +git-tree-sha1 = "dfb54c4e414caa595a1f2ed759b160f5a3ddcba5" +uuid = "08abe8d2-0d0c-5749-adfa-8a2ac140af0d" +version = "1.3.1" + +[[deps.Printf]] +deps = ["Unicode"] +uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" + +[[deps.ProgressMeter]] +deps = ["Distributed", "Printf"] +git-tree-sha1 = "d7a7aef8f8f2d537104f170139553b14dfe39fe9" +uuid = "92933f4c-e287-5a05-a399-4b506db050ca" +version = "1.7.2" + +[[deps.QOI]] +deps = ["ColorTypes", "FileIO", "FixedPointNumbers"] +git-tree-sha1 = "18e8f4d1426e965c7b532ddd260599e1510d26ce" +uuid = "4b34888f-f399-49d4-9bb3-47ed5cae4e65" +version = "1.0.0" + +[[deps.Qt5Base_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Fontconfig_jll", "Glib_jll", "JLLWrappers", "Libdl", "Libglvnd_jll", "OpenSSL_jll", "Pkg", "Xorg_libXext_jll", "Xorg_libxcb_jll", "Xorg_xcb_util_image_jll", "Xorg_xcb_util_keysyms_jll", "Xorg_xcb_util_renderutil_jll", "Xorg_xcb_util_wm_jll", "Zlib_jll", "xkbcommon_jll"] +git-tree-sha1 = "c6c0f690d0cc7caddb74cef7aa847b824a16b256" +uuid = "ea2cea3b-5b76-57ae-a6ef-0a8af62496e1" +version = "5.15.3+1" + +[[deps.QuadGK]] +deps = ["DataStructures", "LinearAlgebra"] +git-tree-sha1 = "78aadffb3efd2155af139781b8a8df1ef279ea39" +uuid = "1fd47b50-473d-5c70-9696-f719f8f3bcdc" +version = "2.4.2" + +[[deps.Quaternions]] +deps = ["DualNumbers", "LinearAlgebra", "Random"] +git-tree-sha1 = "b327e4db3f2202a4efafe7569fcbe409106a1f75" +uuid = "94ee1d12-ae83-5a48-8b1c-48b8ff168ae0" +version = "0.5.6" + +[[deps.REPL]] +deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] +uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" + +[[deps.Random]] +deps = ["SHA", "Serialization"] +uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" + +[[deps.Random123]] +deps = ["Random", "RandomNumbers"] +git-tree-sha1 = "7a1a306b72cfa60634f03a911405f4e64d1b718b" +uuid = "74087812-796a-5b5d-8853-05524746bad3" +version = "1.6.0" + +[[deps.RandomNumbers]] +deps = ["Random", "Requires"] +git-tree-sha1 = "043da614cc7e95c703498a491e2c21f58a2b8111" +uuid = "e6cf234a-135c-5ec9-84dd-332b85af5143" +version = "1.5.3" + +[[deps.RangeArrays]] +git-tree-sha1 = "b9039e93773ddcfc828f12aadf7115b4b4d225f5" +uuid = "b3c3ace0-ae52-54e7-9d0b-2c1406fd6b9d" +version = "0.3.2" + +[[deps.Ratios]] +deps = ["Requires"] +git-tree-sha1 = "dc84268fe0e3335a62e315a3a7cf2afa7178a734" +uuid = "c84ed2f1-dad5-54f0-aa8e-dbefe2724439" +version = "0.4.3" + +[[deps.RecipesBase]] +git-tree-sha1 = "6bf3f380ff52ce0832ddd3a2a7b9538ed1bcca7d" +uuid = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" +version = "1.2.1" + +[[deps.RecipesPipeline]] +deps = ["Dates", "NaNMath", "PlotUtils", "RecipesBase"] +git-tree-sha1 = "dc1e451e15d90347a7decc4221842a022b011714" +uuid = "01d81517-befc-4cb6-b9ec-a95719d0359c" +version = "0.5.2" + +[[deps.RecursiveArrayTools]] +deps = ["Adapt", "ArrayInterfaceCore", "ArrayInterfaceStaticArraysCore", "ChainRulesCore", "DocStringExtensions", "FillArrays", "GPUArraysCore", "IteratorInterfaceExtensions", "LinearAlgebra", "RecipesBase", "StaticArraysCore", "Statistics", "Tables", "ZygoteRules"] +git-tree-sha1 = "3004608dc42101a944e44c1c68b599fa7c669080" +uuid = "731186ca-8d62-57ce-b412-fbd966d074cd" +version = "2.32.0" + +[[deps.RecursiveFactorization]] +deps = ["LinearAlgebra", "LoopVectorization", "Polyester", "StrideArraysCore", "TriangularSolve"] +git-tree-sha1 = "3ee71214057e29a8466f5d70cfe745236aa1d9d7" +uuid = "f2c3362d-daeb-58d1-803e-2bc74f2840b4" +version = "0.2.11" + +[[deps.Reexport]] +git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" +uuid = "189a3867-3050-52da-a836-e630ba90ab69" +version = "1.2.2" + +[[deps.RegionTrees]] +deps = ["IterTools", "LinearAlgebra", "StaticArrays"] +git-tree-sha1 = "4618ed0da7a251c7f92e869ae1a19c74a7d2a7f9" +uuid = "dee08c22-ab7f-5625-9660-a9af2021b33f" +version = "0.3.2" + +[[deps.RelocatableFolders]] +deps = ["SHA", "Scratch"] +git-tree-sha1 = "cdbd3b1338c72ce29d9584fdbe9e9b70eeb5adca" +uuid = "05181044-ff0b-4ac5-8273-598c1e38db00" +version = "0.1.3" + +[[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 = "b8e2eb3d8e1530acb73d8949eab3cedb1d43f840" +uuid = "37e2e3b7-166d-5795-8a7a-e32c996b4267" +version = "1.14.1" + +[[deps.Rmath]] +deps = ["Random", "Rmath_jll"] +git-tree-sha1 = "bf3188feca147ce108c76ad82c2792c57abe7b1f" +uuid = "79098fc4-a85e-5d69-aa6a-4863f24498fa" +version = "0.7.0" + +[[deps.Rmath_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "68db32dff12bb6127bac73c209881191bf0efbb7" +uuid = "f50d1b31-88e8-58de-be2c-1cc44531875f" +version = "0.3.0+0" + +[[deps.Rotations]] +deps = ["LinearAlgebra", "Quaternions", "Random", "StaticArrays", "Statistics"] +git-tree-sha1 = "3177100077c68060d63dd71aec209373c3ec339b" +uuid = "6038ab10-8711-5258-84ad-4b1120ba62dc" +version = "1.3.1" + +[[deps.SHA]] +uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" +version = "0.7.0" + +[[deps.SIMDDualNumbers]] +deps = ["ForwardDiff", "IfElse", "SLEEFPirates", "VectorizationBase"] +git-tree-sha1 = "dd4195d308df24f33fb10dde7c22103ba88887fa" +uuid = "3cdde19b-5bb0-4aaf-8931-af3e248e098b" +version = "0.1.1" + +[[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 = "7ee0e13ac7cd77f2c0e93bff8c40c45f05c77a5a" +uuid = "476501e8-09a2-5ece-8869-fb82de89a1fa" +version = "0.6.33" + +[[deps.SciMLBase]] +deps = ["ArrayInterfaceCore", "CommonSolve", "ConstructionBase", "Distributed", "DocStringExtensions", "FunctionWrappersWrappers", "IteratorInterfaceExtensions", "LinearAlgebra", "Logging", "Markdown", "RecipesBase", "RecursiveArrayTools", "StaticArraysCore", "Statistics", "Tables"] +git-tree-sha1 = "cc9dd4cd31ca81247c5546e185d323f2fe1d2ace" +uuid = "0bca4576-84f4-4d90-8ffe-ffa030f20462" +version = "1.51.0" + +[[deps.Scratch]] +deps = ["Dates"] +git-tree-sha1 = "f94f779c94e58bf9ea243e77a37e16d9de9126bd" +uuid = "6c6a2e73-6563-6170-7368-637461726353" +version = "1.1.1" + +[[deps.SentinelArrays]] +deps = ["Dates", "Random"] +git-tree-sha1 = "db8481cf5d6278a121184809e9eb1628943c7704" +uuid = "91c51154-3ec4-41a3-a24f-3f23e20d615c" +version = "1.3.13" + +[[deps.Serialization]] +uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" + +[[deps.Setfield]] +deps = ["ConstructionBase", "Future", "MacroTools", "StaticArraysCore"] +git-tree-sha1 = "e2cc6d8c88613c05e1defb55170bf5ff211fbeac" +uuid = "efcf1570-3423-57d1-acb7-fd33fddbac46" +version = "1.1.1" + +[[deps.SharedArrays]] +deps = ["Distributed", "Mmap", "Random", "Serialization"] +uuid = "1a1011a3-84de-559e-8e89-a11a2f7dc383" + +[[deps.Showoff]] +deps = ["Dates", "Grisu"] +git-tree-sha1 = "91eddf657aca81df9ae6ceb20b959ae5653ad1de" +uuid = "992d4aef-0814-514b-bc4d-f2e9a6c4116f" +version = "1.0.3" + +[[deps.SimpleTraits]] +deps = ["InteractiveUtils", "MacroTools"] +git-tree-sha1 = "5d7e3f4e11935503d3ecaf7186eac40602e7d231" +uuid = "699a6c99-e7fa-54fc-8d76-47d257e15c1d" +version = "0.9.4" + +[[deps.SimpleWeightedGraphs]] +deps = ["Graphs", "LinearAlgebra", "Markdown", "SparseArrays", "Test"] +git-tree-sha1 = "a6f404cc44d3d3b28c793ec0eb59af709d827e4e" +uuid = "47aef6b3-ad0c-573a-a1e2-d07658019622" +version = "1.2.1" + +[[deps.Sixel]] +deps = ["Dates", "FileIO", "ImageCore", "IndirectArrays", "OffsetArrays", "REPL", "libsixel_jll"] +git-tree-sha1 = "8fb59825be681d451c246a795117f317ecbcaa28" +uuid = "45858cf5-a6b0-47a3-bbea-62219f50df47" +version = "0.1.2" + +[[deps.SnoopPrecompile]] +git-tree-sha1 = "f604441450a3c0569830946e5b33b78c928e1a85" +uuid = "66db9d55-30c0-4569-8b51-7e840670fc0c" +version = "1.0.1" + +[[deps.Sockets]] +uuid = "6462fe0b-24de-5631-8697-dd941f90decc" + +[[deps.SortingAlgorithms]] +deps = ["DataStructures"] +git-tree-sha1 = "b3363d7460f7d098ca0912c69b082f75625d7508" +uuid = "a2af1166-a08f-5f64-846c-94a0d3cef48c" +version = "1.0.1" + +[[deps.SparseArrays]] +deps = ["LinearAlgebra", "Random"] +uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + +[[deps.SparseDiffTools]] +deps = ["Adapt", "ArrayInterfaceCore", "ArrayInterfaceStaticArrays", "Compat", "DataStructures", "FiniteDiff", "ForwardDiff", "Graphs", "LinearAlgebra", "Requires", "SparseArrays", "StaticArrays", "VertexSafeGraphs"] +git-tree-sha1 = "5fb8ba9180f467885e87a2c99cae178b67934be1" +uuid = "47a9eef4-7e08-11e9-0b38-333d64bd3804" +version = "1.26.2" + +[[deps.SpecialFunctions]] +deps = ["ChainRulesCore", "IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"] +git-tree-sha1 = "d75bda01f8c31ebb72df80a46c88b25d1c79c56d" +uuid = "276daf66-3868-5448-9aa4-cd146d93841b" +version = "2.1.7" + +[[deps.StackViews]] +deps = ["OffsetArrays"] +git-tree-sha1 = "46e589465204cd0c08b4bd97385e4fa79a0c770c" +uuid = "cae243ae-269e-4f55-b966-ac2d0dc13c15" +version = "0.1.1" + +[[deps.Static]] +deps = ["IfElse"] +git-tree-sha1 = "f94f9d627ba3f91e41a815b9f9f977d729e2e06f" +uuid = "aedffcd0-7271-4cad-89d0-dc628f76c6d3" +version = "0.7.6" + +[[deps.StaticArrays]] +deps = ["LinearAlgebra", "Random", "StaticArraysCore", "Statistics"] +git-tree-sha1 = "2d4e51cfad63d2d34acde558027acbc66700349b" +uuid = "90137ffa-7385-5640-81b9-e52037218182" +version = "1.5.3" + +[[deps.StaticArraysCore]] +git-tree-sha1 = "ec2bd695e905a3c755b33026954b119ea17f2d22" +uuid = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" +version = "1.3.0" + +[[deps.Statistics]] +deps = ["LinearAlgebra", "SparseArrays"] +uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" + +[[deps.StatsAPI]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "f9af7f195fb13589dd2e2d57fdb401717d2eb1f6" +uuid = "82ae8749-77ed-4fe6-ae5f-f523153014b0" +version = "1.5.0" + +[[deps.StatsBase]] +deps = ["DataAPI", "DataStructures", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"] +git-tree-sha1 = "d1bf48bfcc554a3761a133fe3a9bb01488e06916" +uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" +version = "0.33.21" + +[[deps.StatsFuns]] +deps = ["ChainRulesCore", "HypergeometricFunctions", "InverseFunctions", "IrrationalConstants", "LogExpFunctions", "Reexport", "Rmath", "SpecialFunctions"] +git-tree-sha1 = "5783b877201a82fc0014cbf381e7e6eb130473a4" +uuid = "4c63d2b9-4356-54db-8cca-17b64c39e42c" +version = "1.0.1" + +[[deps.SteadyStateDiffEq]] +deps = ["DiffEqBase", "DiffEqCallbacks", "LinearAlgebra", "NLsolve", "Reexport", "SciMLBase"] +git-tree-sha1 = "f4492f790434f405139eb3a291fdbb45997857c6" +uuid = "9672c7b4-1e72-59bd-8a11-6ac3964bc41f" +version = "1.9.0" + +[[deps.StochasticDiffEq]] +deps = ["Adapt", "ArrayInterface", "DataStructures", "DiffEqBase", "DiffEqNoiseProcess", "DocStringExtensions", "FillArrays", "FiniteDiff", "ForwardDiff", "JumpProcesses", "LevyArea", "LinearAlgebra", "Logging", "MuladdMacro", "NLsolve", "OrdinaryDiffEq", "Random", "RandomNumbers", "RecursiveArrayTools", "Reexport", "SciMLBase", "SparseArrays", "SparseDiffTools", "StaticArrays", "UnPack"] +git-tree-sha1 = "4fe101021692562e452f0ade897733b0c0282756" +uuid = "789caeaf-c7a9-5a7d-9973-96adeb23e2a0" +version = "6.52.2" + +[[deps.StrideArraysCore]] +deps = ["ArrayInterface", "CloseOpenIntervals", "IfElse", "LayoutPointers", "ManualMemory", "SIMDTypes", "Static", "ThreadingUtilities"] +git-tree-sha1 = "ac730bd978bf35f9fe45daa0bd1f51e493e97eb4" +uuid = "7792a7ef-975c-4747-a70f-980b88e8d1da" +version = "0.3.15" + +[[deps.StructArrays]] +deps = ["Adapt", "DataAPI", "StaticArraysCore", "Tables"] +git-tree-sha1 = "8c6ac65ec9ab781af05b08ff305ddc727c25f680" +uuid = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" +version = "0.6.12" + +[[deps.SuiteSparse]] +deps = ["Libdl", "LinearAlgebra", "Serialization", "SparseArrays"] +uuid = "4607b0f0-06f3-5cda-b6b1-a6196a1729e9" + +[[deps.SuiteSparse_jll]] +deps = ["Artifacts", "Libdl", "Pkg", "libblastrampoline_jll"] +uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c" +version = "5.10.1+0" + +[[deps.Sundials]] +deps = ["CEnum", "DataStructures", "DiffEqBase", "Libdl", "LinearAlgebra", "Logging", "Reexport", "SnoopPrecompile", "SparseArrays", "Sundials_jll"] +git-tree-sha1 = "3903aaf1f4ee8628238a0e56d888c69ba2888444" +uuid = "c3572dad-4567-51f8-b174-8c6c989267f4" +version = "4.10.0" + +[[deps.Sundials_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "OpenBLAS_jll", "Pkg", "SuiteSparse_jll"] +git-tree-sha1 = "04777432d74ec5bc91ca047c9e0e0fd7f81acdb6" +uuid = "fb77eaff-e24c-56d4-86b1-d163f2edb164" +version = "5.2.1+0" + +[[deps.TOML]] +deps = ["Dates"] +uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" +version = "1.0.0" + +[[deps.TableTraits]] +deps = ["IteratorInterfaceExtensions"] +git-tree-sha1 = "c06b2f539df1c6efa794486abfb6ed2022561a39" +uuid = "3783bdb8-4a98-5b6b-af9a-565f29a5fe9c" +version = "1.0.1" + +[[deps.Tables]] +deps = ["DataAPI", "DataValueInterfaces", "IteratorInterfaceExtensions", "LinearAlgebra", "OrderedCollections", "TableTraits", "Test"] +git-tree-sha1 = "5ce79ce186cc678bbb5c5681ca3379d1ddae11a1" +uuid = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" +version = "1.7.0" + +[[deps.Tar]] +deps = ["ArgTools", "SHA"] +uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" +version = "1.10.0" + +[[deps.TensorCore]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "1feb45f88d133a655e001435632f019a9a1bcdb6" +uuid = "62fd8b95-f654-4bbd-a8a5-9c27f68ccd50" +version = "0.1.1" + +[[deps.Test]] +deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] +uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[[deps.ThreadingUtilities]] +deps = ["ManualMemory"] +git-tree-sha1 = "f8629df51cab659d70d2e5618a430b4d3f37f2c3" +uuid = "8290d209-cae3-49c0-8002-c8c24d57dab5" +version = "0.5.0" + +[[deps.TiffImages]] +deps = ["ColorTypes", "DataStructures", "DocStringExtensions", "FileIO", "FixedPointNumbers", "IndirectArrays", "Inflate", "Mmap", "OffsetArrays", "PkgVersion", "ProgressMeter", "UUIDs"] +git-tree-sha1 = "70e6d2da9210371c927176cb7a56d41ef1260db7" +uuid = "731e570b-9d59-4bfa-96dc-6df516fadf69" +version = "0.6.1" + +[[deps.TiledIteration]] +deps = ["OffsetArrays"] +git-tree-sha1 = "5683455224ba92ef59db72d10690690f4a8dc297" +uuid = "06e1c1a7-607b-532d-9fad-de7d9aa2abac" +version = "0.3.1" + +[[deps.TranscodingStreams]] +deps = ["Random", "Test"] +git-tree-sha1 = "ed5d390c7addb70e90fd1eb783dcb9897922cbfa" +uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa" +version = "0.9.8" + +[[deps.TreeViews]] +deps = ["Test"] +git-tree-sha1 = "8d0d7a3fe2f30d6a7f833a5f19f7c7a5b396eae6" +uuid = "a2a6695c-b41b-5b7d-aed9-dbfdeacea5d7" +version = "0.3.0" + +[[deps.TriangularSolve]] +deps = ["CloseOpenIntervals", "IfElse", "LayoutPointers", "LinearAlgebra", "LoopVectorization", "Polyester", "SnoopPrecompile", "Static", "VectorizationBase"] +git-tree-sha1 = "8987cf4a0f8d6c375e4ab1438a048e0a185151e4" +uuid = "d5829a12-d9aa-46ab-831f-fb7c9ab06edf" +version = "0.1.13" + +[[deps.Tricks]] +git-tree-sha1 = "6bac775f2d42a611cdfcd1fb217ee719630c4175" +uuid = "410a4b4d-49e4-4fbc-ab6d-cb71b17b3775" +version = "0.1.6" + +[[deps.URIs]] +git-tree-sha1 = "e59ecc5a41b000fa94423a578d29290c7266fc10" +uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" +version = "1.4.0" + +[[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.Unzip]] +git-tree-sha1 = "34db80951901073501137bdbc3d5a8e7bbd06670" +uuid = "41fe7b60-77ed-43a1-b4f0-825fd5a5650d" +version = "0.1.2" + +[[deps.VectorizationBase]] +deps = ["ArrayInterface", "CPUSummary", "HostCPUFeatures", "IfElse", "LayoutPointers", "Libdl", "LinearAlgebra", "SIMDTypes", "Static"] +git-tree-sha1 = "a0b74e8247f30420ba25c8fcfc1c69cb84ff8cff" +uuid = "3d5dd08c-fd9d-11e8-17fa-ed2836048c2f" +version = "0.21.46" + +[[deps.VertexSafeGraphs]] +deps = ["Graphs"] +git-tree-sha1 = "8351f8d73d7e880bfc042a8b6922684ebeafb35c" +uuid = "19fa3120-7c27-5ec5-8db8-b0b0aa330d6f" +version = "0.2.0" + +[[deps.Wayland_jll]] +deps = ["Artifacts", "Expat_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Pkg", "XML2_jll"] +git-tree-sha1 = "3e61f0b86f90dacb0bc0e73a0c5a83f6a8636e23" +uuid = "a2964d1f-97da-50d4-b82a-358c7fce9d89" +version = "1.19.0+0" + +[[deps.Wayland_protocols_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "4528479aa01ee1b3b4cd0e6faef0e04cf16466da" +uuid = "2381bf8a-dfd0-557d-9999-79630e7b1b91" +version = "1.25.0+0" + +[[deps.WeakRefStrings]] +deps = ["DataAPI", "InlineStrings", "Parsers"] +git-tree-sha1 = "b1be2855ed9ed8eac54e5caff2afcdb442d52c23" +uuid = "ea10d353-3f73-51f8-a26c-33c1cb351aa5" +version = "1.4.2" + +[[deps.WoodburyMatrices]] +deps = ["LinearAlgebra", "SparseArrays"] +git-tree-sha1 = "de67fa59e33ad156a590055375a30b23c40299d3" +uuid = "efce3f68-66dc-5838-9240-27a6d6f5f9b6" +version = "0.5.5" + +[[deps.XML2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Pkg", "Zlib_jll"] +git-tree-sha1 = "58443b63fb7e465a8a7210828c91c08b92132dff" +uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a" +version = "2.9.14+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.Xorg_libX11_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libxcb_jll", "Xorg_xtrans_jll"] +git-tree-sha1 = "5be649d550f3f4b95308bf0183b82e2582876527" +uuid = "4f6342f7-b3d2-589e-9d20-edeb45f2b2bc" +version = "1.6.9+4" + +[[deps.Xorg_libXau_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "4e490d5c960c314f33885790ed410ff3a94ce67e" +uuid = "0c0b7dd1-d40b-584c-a123-a41640f87eec" +version = "1.0.9+4" + +[[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", "Pkg"] +git-tree-sha1 = "4fe47bd2247248125c428978740e18a681372dd4" +uuid = "a3789734-cfe1-5b06-b2d0-1dd0d9d62d05" +version = "1.1.3+4" + +[[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", "Pkg"] +git-tree-sha1 = "6783737e45d3c59a4a4c4091f5f88cdcf0908cbb" +uuid = "14d82f49-176c-5ed1-bb49-ad3f5cbd8c74" +version = "0.1.0+3" + +[[deps.Xorg_libxcb_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "XSLT_jll", "Xorg_libXau_jll", "Xorg_libXdmcp_jll", "Xorg_libpthread_stubs_jll"] +git-tree-sha1 = "daf17f441228e7a3833846cd048892861cff16d6" +uuid = "c7cfdc94-dc32-55de-ac96-5a1b8d977c5b" +version = "1.13.0+3" + +[[deps.Xorg_libxkbfile_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll"] +git-tree-sha1 = "926af861744212db0eb001d9e40b5d16292080b2" +uuid = "cc61e674-0454-545c-8b26-ed2c68acab7a" +version = "1.1.0+4" + +[[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", "Pkg", "Xorg_libxkbfile_jll"] +git-tree-sha1 = "4bcbf660f6c2e714f87e960a171b119d06ee163b" +uuid = "35661453-b289-5fab-8a00-3d9160c6a3a4" +version = "1.4.2+4" + +[[deps.Xorg_xkeyboard_config_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xkbcomp_jll"] +git-tree-sha1 = "5c8424f8a67c3f2209646d4425f3d415fee5931d" +uuid = "33bec58e-1273-512f-9401-5d533626f822" +version = "2.27.0+4" + +[[deps.Xorg_xtrans_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "79c31e7844f6ecf779705fbc12146eb190b7d845" +uuid = "c5fb5394-a638-5e4d-96e5-b29de1b5cf10" +version = "1.4.0+3" + +[[deps.Zlib_jll]] +deps = ["Libdl"] +uuid = "83775a58-1f1d-513f-b197-d71354ab007a" +version = "1.2.12+3" + +[[deps.Zstd_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "e45044cd873ded54b6a5bac0eb5c971392cf1927" +uuid = "3161d3a3-bdf6-5164-811a-617609db77b4" +version = "1.5.2+0" + +[[deps.ZygoteRules]] +deps = ["MacroTools"] +git-tree-sha1 = "8c1a8e4dfacb1fd631745552c8db35d0deb09ea0" +uuid = "700de1a5-db45-46bc-99cf-38207098b444" +version = "0.2.2" + +[[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", "OpenBLAS_jll"] +uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" +version = "5.1.1+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.libpng_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] +git-tree-sha1 = "94d180a6d2b5e55e447e2d27a29ed04fe79eb30c" +uuid = "b53b4c65-9356-5827-b1ea-8c7a1a84506f" +version = "1.6.38+0" + +[[deps.libsixel_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "78736dab31ae7a53540a6b752efc61f77b304c5b" +uuid = "075b6546-f08a-558a-be8f-8157d0f608a5" +version = "1.8.6+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.nghttp2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" +version = "1.48.0+0" + +[[deps.p7zip_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" +version = "17.4.0+0" + +[[deps.x264_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "4fea590b89e6ec504593146bf8b988b2c00922b2" +uuid = "1270edf5-f2f9-52d2-97e9-ab00b5d0237a" +version = "2021.5.5+0" + +[[deps.x265_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "ee567a171cce03570d77ad3a43e90218e38937a9" +uuid = "dfaa095f-4041-5dcd-9319-2fabd8486b76" +version = "3.5.0+0" + +[[deps.xkbcommon_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Wayland_jll", "Wayland_protocols_jll", "Xorg_libxcb_jll", "Xorg_xkeyboard_config_jll"] +git-tree-sha1 = "9ebfc140cc56e8c2156a15ceac2f0302e327ac0a" +uuid = "d8fb68d0-12a3-5cfd-a85a-d49703b185fd" +version = "1.4.1+0" +""" + +# ╔═║ Cell order: +# β•Ÿβ”€42085492-ac8c-11eb-0620-adcb307077f1 +# β•Ÿβ”€3e60b013-98cf-4057-9c96-b627662c85a4 +# β•Ÿβ”€14195fc4-40e1-4576-973a-69d649fddc02 +# β•Ÿβ”€dd6ba348-d0d7-46b7-a77f-351c00dc9c36 +# β•Ÿβ”€2ab34e6f-9059-4f33-8abd-df15b0c00b6b +# β•Ÿβ”€a24c2177-5fee-4930-ab78-524085f65ed9 +# β•Ÿβ”€b9eca29e-9028-4fd7-8c62-718a2dcf87d1 +# β•Ÿβ”€231e4c3b-6998-4f3d-9cc3-14fa17941f7d +# β•Ÿβ”€482dd428-74f0-4c7c-afc9-db547777e79f +# ╠═f8868c0a-d0ec-45dc-844f-c053981277d9 +# β•Ÿβ”€2ecbad61-0f94-4e0a-9b35-0a5a60d4405c +# β•Ÿβ”€2b7eeede-83ef-45ca-929b-19a3c369b105 +# β•Ÿβ”€a8b9d935-d951-493f-9e91-45743a471249 +# β•Ÿβ”€87c272a7-66bb-4c91-a8ee-30c74ce60461 +# β•Ÿβ”€82e4f960-da7e-41ca-ab16-4d49636041a2 +# β•Ÿβ”€54d73952-c016-48f5-9fb5-83aaea4363de +# β•Ÿβ”€05c9f594-1005-4662-ab1d-49f218012add +# β•Ÿβ”€1147a6ad-e528-4b41-bca6-63caa02f3a68 +# β•Ÿβ”€37535223-1fce-402f-ab24-53d9609b2b9c +# β•Ÿβ”€487c6447-7d47-457f-8d0e-8ad25240a4d2 +# β•Ÿβ”€c665a43c-5020-4cc9-8209-1a786e4c98ab +# β•Ÿβ”€ab4039d5-c564-4fcc-84b7-58fba714d735 +# β•Ÿβ”€bb36eda4-91a2-4fd0-bce3-12891b610fb7 +# β•Ÿβ”€44515eae-805e-445a-ac35-f5d9c40df83e +# β•Ÿβ”€37b5cafd-1147-4677-94d1-1a265736f794 +# β•Ÿβ”€e372b079-53fc-4f6e-9365-e43ad8281f3c +# β•Ÿβ”€75a31c18-37c0-41db-afba-5d92f818be73 +# ╠═91441230-1b1c-4702-b3a7-2f9adf2ddaaa +# β•Ÿβ”€576a94c7-64e7-41a8-b8cc-dc1b2e2380e2 +# ╠═353e3341-5957-40e7-b2b9-800ba7a80063 +# β•Ÿβ”€4c9e7ec6-64e9-4146-8558-f78f865df195 +# β•Ÿβ”€2e91945b-6239-41df-83d1-cfed67081cf7 +# ╠═69fa38d3-2411-496c-bf0a-af4e3531b2ae +# β•Ÿβ”€212d6995-d04b-4c8c-b0ed-b8b591c683e5 +# ╠═3a443524-834c-44fc-a3dd-c72839adba1f +# β•Ÿβ”€b96b4e7c-1350-4c1a-a716-3623dae87574 +# ╠═7f232e27-e2bb-4474-aadf-bebcd2e61e45 +# β•Ÿβ”€6c2998d7-ec51-446a-a5f9-7dcef8f97454 +# ╠═a71e2174-0a01-4b77-a1c8-bce3663f5485 +# β•Ÿβ”€660aad5a-4fc3-4e0f-8d40-5884c7dde2fd +# ╠═553084e1-863d-4d01-9670-a0909732278b +# β•Ÿβ”€3fbc0b72-8228-4d2a-ae8e-9ca73393664b +# ╠═cd69218a-b7fb-4e70-8b17-3dadd0838d62 +# β•Ÿβ”€aba3e804-9fe6-4081-8d7c-b4e4c3adf334 +# ╠═59e682aa-0ccd-46eb-91cf-0c18bcf79575 +# ╠═06108680-874d-4eed-8524-8adb668095b4 +# ╠═fc8f0d12-c4c1-4686-8fe6-e8c1c51640e6 +# ╠═fd887ed0-0248-4849-b4a6-4d428650938f +# ╠═b43a8ff7-284d-41cd-aadc-8f684fc9705e +# β•Ÿβ”€d13613d2-7907-4374-ab53-b42362fb0fee +# β•Ÿβ”€845a8226-a6ff-4549-8954-051f124ffc52 +# ╠═be01be6f-c51c-493c-8306-bc4526c2c57a +# ╠═8b99c85a-478b-4ffb-848d-2812bcf3a95d +# β•Ÿβ”€f59c6208-2911-406d-b5b4-88c13af21f04 +# ╠═683ad1f3-45bc-40a0-9f7d-49d9929dd783 +# ╠═96459714-eb2a-4b6f-9b64-7b1935ff2acc +# ╠═f3f4733a-b962-43a7-8471-83db5a3b24be +# β•Ÿβ”€2870c288-1d32-435c-85d4-9f9a96887686 +# ╠═b3f47df2-0575-4338-b10b-41a644fe6307 +# β•Ÿβ”€393225c6-d748-45e3-951d-dc4f207b612c +# ╠═b426d86c-301f-469b-a515-e24f61c4581c +# ╠═df4e8359-af8b-4bd5-aca0-7f6dd84859d4 +# ╠═4996492f-f1ed-43bf-8997-ebbe898369fb +# β•Ÿβ”€c3b0b7fc-19be-4f04-8787-6349ab9bff7f +# ╠═81eba9ae-2801-4dad-9aae-e49d9472c022 +# ╠═382c2042-bd5c-4b85-9e41-ce49417c7199 +# ╠═0d9ef95a-c7c4-4053-b0bc-385d94c25da9 +# ╠═d3c9d49f-dccd-42eb-85f4-c81456eb3290 +# ╠═525c5d42-e0f8-439c-9b45-2f320833e81a +# ╠═1d73652e-b5e9-4a0b-8f51-3a8a0047df62 +# ╠═6c14ae3b-cc82-49ad-90b3-d312eb4cd1ee +# β•Ÿβ”€e9fa9953-715a-4531-93bb-2332c90322e4 +# ╠═9ce7348b-761a-4dd0-8523-08aaa9a78aa9 +# β•Ÿβ”€692a6928-c7a2-4b61-a794-16bef5d4e919 +# ╠═e45e36f6-6d45-42e7-b8d9-aff28bc57345 +# ╠═1eea5e69-1380-485c-b67e-589f707cf315 +# β•Ÿβ”€e174edd3-4c43-4fb0-9a6a-4ca53ad4aded +# ╠═d250f09d-3678-4093-bec6-6b7b17260fe8 +# ╠═352c81df-7bdd-4671-834e-fb875a78bdcc +# β•Ÿβ”€e7ae1922-6327-40a5-995e-aeb6a2d10fa1 +# β•Ÿβ”€9fcb25f4-397b-4f1d-8b50-250f64bf44d2 +# β•Ÿβ”€9014add9-262d-403b-b9de-5ba5b78ebb77 +# β•Ÿβ”€00d30375-cbc4-4d6e-b353-5d20adbe0743 +# β•Ÿβ”€414f42ac-2d03-451c-8d45-7458726c7345 +# β•Ÿβ”€00000000-0000-0000-0000-000000000001 +# β•Ÿβ”€00000000-0000-0000-0000-000000000002 diff --git a/notebooks_old/Broadening.pdf b/notebooks_old/Broadening.pdf new file mode 100644 index 0000000..7904ebc Binary files /dev/null and b/notebooks_old/Broadening.pdf differ diff --git a/notebooks_old/Broadening.svg b/notebooks_old/Broadening.svg new file mode 100644 index 0000000..3d3cddb --- /dev/null +++ b/notebooks_old/Broadening.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/notebooks_old/Emission_TS.png b/notebooks_old/Emission_TS.png new file mode 100644 index 0000000..8f35a5c Binary files /dev/null and b/notebooks_old/Emission_TS.png differ diff --git a/notebooks_old/GHGmodel.png b/notebooks_old/GHGmodel.png new file mode 100644 index 0000000..6262f67 Binary files /dev/null and b/notebooks_old/GHGmodel.png differ diff --git a/notebooks_old/LeakyGreenhouse.png b/notebooks_old/LeakyGreenhouse.png new file mode 100644 index 0000000..5cab7ff Binary files /dev/null and b/notebooks_old/LeakyGreenhouse.png differ diff --git a/notebooks_old/RightPicture_TC.png b/notebooks_old/RightPicture_TC.png new file mode 100644 index 0000000..d34198d Binary files /dev/null and b/notebooks_old/RightPicture_TC.png differ diff --git a/notebooks_old/WaterVapor.pdf b/notebooks_old/WaterVapor.pdf new file mode 100644 index 0000000..27b3956 Binary files /dev/null and b/notebooks_old/WaterVapor.pdf differ diff --git a/notebooks_old/WaterVapor.svg b/notebooks_old/WaterVapor.svg new file mode 100644 index 0000000..fb6b0d8 --- /dev/null +++ b/notebooks_old/WaterVapor.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/notebooks_old/WrongPicture_TC.png b/notebooks_old/WrongPicture_TC.png new file mode 100644 index 0000000..2cb0ab9 Binary files /dev/null and b/notebooks_old/WrongPicture_TC.png differ diff --git a/notebooks_old/cpu_for_class.jl b/notebooks_old/cpu_for_class.jl new file mode 100644 index 0000000..fbda8bb --- /dev/null +++ b/notebooks_old/cpu_for_class.jl @@ -0,0 +1,654 @@ +### A Pluto.jl notebook ### +# v0.19.14 + +using Markdown +using InteractiveUtils + +# ╔═║ 19f74853-2f50-4e89-b8c2-a238f12fbf65 +using PlutoUI + +# ╔═║ 9f23d5e7-5cc3-4ba3-8fae-7c4786d65347 +using KernelAbstractions + +# ╔═║ 569dadd3-c97c-4311-b9c7-1f6df16e4e58 +# Making an object callable + +# ╔═║ 270d7deb-fb38-4dc6-a991-9696aeca5f0b +(A::Array)(i,j) = A[i,j] * 10 + +# ╔═║ 293c977a-97f6-43a6-afaf-b9a1595139c9 +[1 2 3;4 5 6] + +# ╔═║ 7dfefc08-6e10-431b-b393-93403b399e85 +[1 2 3;4 5 6][2,2] + +# ╔═║ 60ed4508-8aaf-4d59-a9b2-859d2318cb83 +[1 2 3;4 5 6](2,2) + +# ╔═║ 086a74b8-d61a-4c93-a3c2-68dfccded570 +md""" + Make sin callable +""" + +# ╔═║ b38218ff-b59a-4fcd-97f9-d5bc09bd3382 +md""" + Wrap functions in a kernel so we can get control over it +""" + +# ╔═║ 087a1ecc-59d1-11ed-1edc-c9d2f1082687 +begin + + struct VectorizeMe{F} + func::F + end + + # Make any f callable on a vector + (f::VectorizeMe)(A::Array) = f.func.(A) + + + +end + +# ╔═║ 955492bf-5e9d-4c3c-92fb-a8f437324b3c +VectorizeMe(x->x^2)([1,2,3]) + + +# ╔═║ 26c44e57-6fa2-44f0-92f1-b2923e630c9b +typeof(VectorizeMe(x->x^2)) + +# ╔═║ 1aba26a0-1add-4c1a-bfc2-0c84efac31c3 +md""" +Suppose I want this behavior for all functions: + f(i,v) = f(v[i]) +""" + +# ╔═║ a65f191d-f6a4-46af-9a89-6c7e3aa16455 +begin + + struct Kernel1{F} + func::F + end + + # Make any f take on both an index + (f::Kernel1)(i,A::Vector) = f.func(A[i]) + + + +end + +# ╔═║ 97c1cde2-7a68-4152-a826-f8de8eab1b25 +atan.([1,2,3],6) + +# ╔═║ 81e236e5-79f2-4bb0-9700-7f54b04c02e4 +Kernel1(atan)(3,[1,2,3],6) + +# ╔═║ 84ee162b-4f3a-4cc8-b7b2-0f54f1942d3b +begin + + struct Kernel2{F} + func::F + end + + # Make any f take on both an index + (f::Kernel2)(i,A::Vector,args...) = f.func(A[i],args...) + + +end + +# ╔═║ a51db5e5-271d-4128-ad72-9c386d10fba0 +Kernel2(atan)(3,[1,2,3],6) + +# ╔═║ 04ad73b2-dd1d-46ea-b2cf-23f68233c716 +begin + + struct Kernel3{F} + func::F + end + + # Make any f take on both an index + (f::Kernel3)(A::Vector,args...) = [ f.func(A[i],args...) for i=1:length(A) ] + + +end + +# ╔═║ 72c0348e-f807-4495-836b-33b4364674ac +Kernel3(atan)([1,2,3],6) + +# ╔═║ 0eb8df71-abb9-4802-8631-61877bb592cf +md""" + now in place +""" + +# ╔═║ 573a73ac-8403-4876-88f4-fb2619148178 +function sin(A,i) + A[i]=i + A +end + +# ╔═║ f1b0a547-fca0-44ad-a6ac-c43a2f719562 +(s::typeof(sin))(x::Vector) = sin.(x) + +# ╔═║ 3730edfa-4c3c-43db-a5f4-9808a37e587d +sin([1,2,3]) + +# ╔═║ 740a224d-6fef-4c49-8d2c-da1dc1d41725 +VectorizeMe(sin)(rand(3)) + +# ╔═║ 8a449e8a-2132-47e6-ab0f-69bd39de9dd6 +typeof(VectorizeMe(sin)) + +# ╔═║ b49f4ba9-bf80-4f84-8a14-de5beefc65e4 +Kernel1(sin)(3,[1,2,3]), sin(3) + +# ╔═║ 80a9d6f9-9401-4a21-b980-d0fc8028d52f +sin([5,6,7],2) + +# ╔═║ b06403f7-dcca-4bee-8eae-ce94671b6294 +function atan!(i,A,args...) + A[i] = atan(A[i],args...) +end + +# ╔═║ 9497351d-1a4f-4eb2-a1b7-7153bfbbdadb +begin + + struct Kernel4{F} + func!::F + end + + # Make any f take on both an index + function (f::Kernel4)(A::Vector,args...) + for i=1:length(A) + f.func!(i,A,args...) + end + end + + +end + +# ╔═║ 4f391154-4333-45f2-908f-3bf6c839e410 +begin + v = [1.0,2,3] + Kernel4(atan!)(v,6) +end + +# ╔═║ a095a1a3-f758-4ac2-a37e-81177b299388 +v + +# ╔═║ def1145d-c455-49a6-9f3d-73794c41c3c7 +atan.([1,2,3],6) + +# ╔═║ 4070b1b7-fd74-4f26-b01b-2922daed406a +begin + n = 5 + #positions = rand(n) +end + +# ╔═║ 972f3f82-560d-469d-9215-069ef4167562 +function myproblem1(x) + y = zero(x) + n = length(x) + for i=1:n ,j=1:n + if jβ‰ i + y[i] += 1. /abs(x[i]-x[j]) + end + end + y +end + +# ╔═║ d8c47d59-a5ce-4c6b-943f-6e73d522b209 +function myproblem2(x) + y = zero(x) + n = length(x) + for i=1:n + y[i] = sum( 1/abs(x[i]-x[j]) for j=1:n if jβ‰ i) + end + + y +end + +# ╔═║ 8286beee-54b6-471d-b27a-ce24dc6a8438 +myproblem1([1.0,2,3]) + +# ╔═║ 80dea46a-ceeb-4b15-8a6e-95232598cb53 +myproblem2([1.0,2,3]) + +# ╔═║ 975346eb-34cd-4457-8cbe-d4150aa039f6 +function myproblem3(x) + + A = 1 ./ abs.(x .- x') + A = ( x-> isinf(x) ? 0 : x).(A) + sum(A, dims=1) +end + +# ╔═║ 65e04649-f79c-4421-97fc-bae6832705a2 +myproblem3([1.0,2,3]) + +# ╔═║ c3a361ae-3714-409e-ab0e-eb19bba53ab2 +isinf(3.5) + +# ╔═║ 9c06aad4-7b94-41dd-baf0-9d8a0bfe0591 +force_law(x,y) = 1/abs(x-y) + +# ╔═║ d33e625a-9c05-4180-9009-4e014d0fd2ec +num_cores = Threads.nthreads() + +# ╔═║ a9161a66-a19c-4a4d-a5e8-0ba120051ad7 +begin + positions = rand(n) + forces = similar(positions) +end + +# ╔═║ e3736993-b7df-48ea-ac8c-2fec24f78537 +@kernel function myproblem!(forces, positions, force_law) + tid = @index(Global, Linear) + forces[tid] = 0.0 + + for j = 1:length(positions) + if j != tid + forces[tid] += force_law(positions[tid], positions[j] ) end + end + +end + +# ╔═║ 349b3418-e9b7-4044-9523-f1cbc9404987 + kernel! = myproblem!(CPU(),num_cores) + +# ╔═║ 07eee79f-f827-4e26-9fa8-5721dece1503 +kernel!(forces, positions, force_law, ndrange=n) + +# ╔═║ 861f0dd3-3bb0-429a-8150-1ef7e3eaab04 +forces + +# ╔═║ 18312733-02c4-44ce-a487-15799ee480e2 +myproblem1(positions) + +# ╔═║ c1276493-ebff-4600-a5d4-728a903cd1ee +myproblem2(positions) + +# ╔═║ 00000000-0000-0000-0000-000000000001 +PLUTO_PROJECT_TOML_CONTENTS = """ +[deps] +KernelAbstractions = "63c18a36-062a-441e-b654-da1e3ab1ce7c" +PlutoUI = "7f904dfe-b85e-4ff6-b463-dae2292396a8" + +[compat] +KernelAbstractions = "~0.8.4" +PlutoUI = "~0.7.48" +""" + +# ╔═║ 00000000-0000-0000-0000-000000000002 +PLUTO_MANIFEST_TOML_CONTENTS = """ +# This file is machine-generated - editing it directly is not advised + +julia_version = "1.8.0-rc4" +manifest_format = "2.0" +project_hash = "ffb6dfa41b7d6ca0e64373f4cd9305ae5eacd441" + +[[deps.AbstractPlutoDingetjes]] +deps = ["Pkg"] +git-tree-sha1 = "8eaf9f1b4921132a4cff3f36a1d9ba923b14a481" +uuid = "6e696c72-6542-2067-7265-42206c756150" +version = "1.1.4" + +[[deps.Adapt]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "195c5505521008abea5aee4f96930717958eac6f" +uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" +version = "3.4.0" + +[[deps.ArgTools]] +uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" +version = "1.1.1" + +[[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.Base64]] +uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" + +[[deps.CEnum]] +git-tree-sha1 = "eb4cb44a499229b3b8426dcfb5dd85333951ff90" +uuid = "fa961155-64e5-5f13-b03f-caf6b980ea82" +version = "0.4.2" + +[[deps.ColorTypes]] +deps = ["FixedPointNumbers", "Random"] +git-tree-sha1 = "eb7f0f8307f71fac7c606984ea5fb2817275d6e4" +uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f" +version = "0.11.4" + +[[deps.CompilerSupportLibraries_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" +version = "0.5.2+0" + +[[deps.Dates]] +deps = ["Printf"] +uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" + +[[deps.Downloads]] +deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] +uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" +version = "1.6.0" + +[[deps.FileWatching]] +uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" + +[[deps.FixedPointNumbers]] +deps = ["Statistics"] +git-tree-sha1 = "335bfdceacc84c5cdf16aadc768aa5ddfc5383cc" +uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" +version = "0.8.4" + +[[deps.Hyperscript]] +deps = ["Test"] +git-tree-sha1 = "8d511d5b81240fc8e6802386302675bdf47737b9" +uuid = "47d2ed2b-36de-50cf-bf87-49c2cf4b8b91" +version = "0.0.4" + +[[deps.HypertextLiteral]] +deps = ["Tricks"] +git-tree-sha1 = "c47c5fa4c5308f27ccaac35504858d8914e102f9" +uuid = "ac1192a8-f4b3-4bfe-ba22-af5b92cd3ab2" +version = "0.9.4" + +[[deps.IOCapture]] +deps = ["Logging", "Random"] +git-tree-sha1 = "f7be53659ab06ddc986428d3a9dcc95f6fa6705a" +uuid = "b5f81e59-6552-4d32-b1f0-c071b021bf89" +version = "0.2.2" + +[[deps.InteractiveUtils]] +deps = ["Markdown"] +uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" + +[[deps.JLLWrappers]] +deps = ["Preferences"] +git-tree-sha1 = "abc9885a7ca2052a736a600f7fa66209f96506e1" +uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" +version = "1.4.1" + +[[deps.JSON]] +deps = ["Dates", "Mmap", "Parsers", "Unicode"] +git-tree-sha1 = "3c837543ddb02250ef42f4738347454f95079d4e" +uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" +version = "0.21.3" + +[[deps.KernelAbstractions]] +deps = ["Adapt", "Atomix", "InteractiveUtils", "LinearAlgebra", "MacroTools", "SparseArrays", "StaticArrays", "UUIDs", "UnsafeAtomics", "UnsafeAtomicsLLVM"] +git-tree-sha1 = "eed4743b01ca88d23be3663bac121374940b475b" +uuid = "63c18a36-062a-441e-b654-da1e3ab1ce7c" +version = "0.8.4" + +[[deps.LLVM]] +deps = ["CEnum", "LLVMExtra_jll", "Libdl", "Printf", "Unicode"] +git-tree-sha1 = "e7e9184b0bf0158ac4e4aa9daf00041b5909bf1a" +uuid = "929cbde3-209d-540e-8aea-75f648917ca0" +version = "4.14.0" + +[[deps.LLVMExtra_jll]] +deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl", "Pkg", "TOML"] +git-tree-sha1 = "771bfe376249626d3ca12bcd58ba243d3f961576" +uuid = "dad2f222-ce93-54a1-a47d-0025e8a3acab" +version = "0.0.16+0" + +[[deps.LazyArtifacts]] +deps = ["Artifacts", "Pkg"] +uuid = "4af54fe1-eca0-43a8-85a7-787d91b784e3" + +[[deps.LibCURL]] +deps = ["LibCURL_jll", "MozillaCACerts_jll"] +uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" +version = "0.6.3" + +[[deps.LibCURL_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] +uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" +version = "7.84.0+0" + +[[deps.LibGit2]] +deps = ["Base64", "NetworkOptions", "Printf", "SHA"] +uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" + +[[deps.LibSSH2_jll]] +deps = ["Artifacts", "Libdl", "MbedTLS_jll"] +uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" +version = "1.10.2+0" + +[[deps.Libdl]] +uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" + +[[deps.LinearAlgebra]] +deps = ["Libdl", "libblastrampoline_jll"] +uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + +[[deps.Logging]] +uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" + +[[deps.MIMEs]] +git-tree-sha1 = "65f28ad4b594aebe22157d6fac869786a255b7eb" +uuid = "6c6e2e6c-3030-632d-7369-2d6c69616d65" +version = "0.1.4" + +[[deps.MacroTools]] +deps = ["Markdown", "Random"] +git-tree-sha1 = "42324d08725e200c23d4dfb549e0d5d89dede2d2" +uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" +version = "0.5.10" + +[[deps.Markdown]] +deps = ["Base64"] +uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" + +[[deps.MbedTLS_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" +version = "2.28.0+0" + +[[deps.Mmap]] +uuid = "a63ad114-7e13-5084-954f-fe012c677804" + +[[deps.MozillaCACerts_jll]] +uuid = "14a3606d-f60d-562e-9121-12d972cd8159" +version = "2022.2.1" + +[[deps.NetworkOptions]] +uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" +version = "1.2.0" + +[[deps.OpenBLAS_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] +uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" +version = "0.3.20+0" + +[[deps.Parsers]] +deps = ["Dates"] +git-tree-sha1 = "6c01a9b494f6d2a9fc180a08b182fcb06f0958a0" +uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" +version = "2.4.2" + +[[deps.Pkg]] +deps = ["Artifacts", "Dates", "Downloads", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] +uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" +version = "1.8.0" + +[[deps.PlutoUI]] +deps = ["AbstractPlutoDingetjes", "Base64", "ColorTypes", "Dates", "FixedPointNumbers", "Hyperscript", "HypertextLiteral", "IOCapture", "InteractiveUtils", "JSON", "Logging", "MIMEs", "Markdown", "Random", "Reexport", "URIs", "UUIDs"] +git-tree-sha1 = "efc140104e6d0ae3e7e30d56c98c4a927154d684" +uuid = "7f904dfe-b85e-4ff6-b463-dae2292396a8" +version = "0.7.48" + +[[deps.Preferences]] +deps = ["TOML"] +git-tree-sha1 = "47e5f437cc0e7ef2ce8406ce1e7e24d44915f88d" +uuid = "21216c6a-2e73-6563-6e65-726566657250" +version = "1.3.0" + +[[deps.Printf]] +deps = ["Unicode"] +uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" + +[[deps.REPL]] +deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] +uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" + +[[deps.Random]] +deps = ["SHA", "Serialization"] +uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" + +[[deps.Reexport]] +git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" +uuid = "189a3867-3050-52da-a836-e630ba90ab69" +version = "1.2.2" + +[[deps.SHA]] +uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" +version = "0.7.0" + +[[deps.Serialization]] +uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" + +[[deps.Sockets]] +uuid = "6462fe0b-24de-5631-8697-dd941f90decc" + +[[deps.SparseArrays]] +deps = ["LinearAlgebra", "Random"] +uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + +[[deps.StaticArrays]] +deps = ["LinearAlgebra", "Random", "StaticArraysCore", "Statistics"] +git-tree-sha1 = "f86b3a049e5d05227b10e15dbb315c5b90f14988" +uuid = "90137ffa-7385-5640-81b9-e52037218182" +version = "1.5.9" + +[[deps.StaticArraysCore]] +git-tree-sha1 = "6b7ba252635a5eff6a0b0664a41ee140a1c9e72a" +uuid = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" +version = "1.4.0" + +[[deps.Statistics]] +deps = ["LinearAlgebra", "SparseArrays"] +uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" + +[[deps.TOML]] +deps = ["Dates"] +uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" +version = "1.0.0" + +[[deps.Tar]] +deps = ["ArgTools", "SHA"] +uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" +version = "1.10.0" + +[[deps.Test]] +deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] +uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[[deps.Tricks]] +git-tree-sha1 = "6bac775f2d42a611cdfcd1fb217ee719630c4175" +uuid = "410a4b4d-49e4-4fbc-ab6d-cb71b17b3775" +version = "0.1.6" + +[[deps.URIs]] +git-tree-sha1 = "e59ecc5a41b000fa94423a578d29290c7266fc10" +uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" +version = "1.4.0" + +[[deps.UUIDs]] +deps = ["Random", "SHA"] +uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" + +[[deps.Unicode]] +uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" + +[[deps.UnsafeAtomics]] +git-tree-sha1 = "6331ac3440856ea1988316b46045303bef658278" +uuid = "013be700-e6cd-48c3-b4a1-df204f14c38f" +version = "0.2.1" + +[[deps.UnsafeAtomicsLLVM]] +deps = ["LLVM", "UnsafeAtomics"] +git-tree-sha1 = "33af9d2031d0dc09e2be9a0d4beefec4466def8e" +uuid = "d80eeb9a-aca5-4d75-85e5-170c8b632249" +version = "0.1.0" + +[[deps.Zlib_jll]] +deps = ["Libdl"] +uuid = "83775a58-1f1d-513f-b197-d71354ab007a" +version = "1.2.12+3" + +[[deps.libblastrampoline_jll]] +deps = ["Artifacts", "Libdl", "OpenBLAS_jll"] +uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" +version = "5.1.1+0" + +[[deps.nghttp2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" +version = "1.48.0+0" + +[[deps.p7zip_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" +version = "17.4.0+0" +""" + +# ╔═║ Cell order: +# ╠═19f74853-2f50-4e89-b8c2-a238f12fbf65 +# ╠═569dadd3-c97c-4311-b9c7-1f6df16e4e58 +# ╠═270d7deb-fb38-4dc6-a991-9696aeca5f0b +# ╠═293c977a-97f6-43a6-afaf-b9a1595139c9 +# ╠═7dfefc08-6e10-431b-b393-93403b399e85 +# ╠═60ed4508-8aaf-4d59-a9b2-859d2318cb83 +# ╠═086a74b8-d61a-4c93-a3c2-68dfccded570 +# ╠═f1b0a547-fca0-44ad-a6ac-c43a2f719562 +# ╠═3730edfa-4c3c-43db-a5f4-9808a37e587d +# ╠═b38218ff-b59a-4fcd-97f9-d5bc09bd3382 +# ╠═087a1ecc-59d1-11ed-1edc-c9d2f1082687 +# ╠═740a224d-6fef-4c49-8d2c-da1dc1d41725 +# ╠═955492bf-5e9d-4c3c-92fb-a8f437324b3c +# ╠═8a449e8a-2132-47e6-ab0f-69bd39de9dd6 +# ╠═26c44e57-6fa2-44f0-92f1-b2923e630c9b +# ╠═1aba26a0-1add-4c1a-bfc2-0c84efac31c3 +# ╠═a65f191d-f6a4-46af-9a89-6c7e3aa16455 +# ╠═b49f4ba9-bf80-4f84-8a14-de5beefc65e4 +# ╠═97c1cde2-7a68-4152-a826-f8de8eab1b25 +# ╠═81e236e5-79f2-4bb0-9700-7f54b04c02e4 +# ╠═84ee162b-4f3a-4cc8-b7b2-0f54f1942d3b +# ╠═a51db5e5-271d-4128-ad72-9c386d10fba0 +# ╠═04ad73b2-dd1d-46ea-b2cf-23f68233c716 +# ╠═72c0348e-f807-4495-836b-33b4364674ac +# ╠═0eb8df71-abb9-4802-8631-61877bb592cf +# ╠═573a73ac-8403-4876-88f4-fb2619148178 +# ╠═80a9d6f9-9401-4a21-b980-d0fc8028d52f +# ╠═b06403f7-dcca-4bee-8eae-ce94671b6294 +# ╠═9497351d-1a4f-4eb2-a1b7-7153bfbbdadb +# ╠═4f391154-4333-45f2-908f-3bf6c839e410 +# ╠═a095a1a3-f758-4ac2-a37e-81177b299388 +# ╠═def1145d-c455-49a6-9f3d-73794c41c3c7 +# ╠═4070b1b7-fd74-4f26-b01b-2922daed406a +# ╠═972f3f82-560d-469d-9215-069ef4167562 +# ╠═d8c47d59-a5ce-4c6b-943f-6e73d522b209 +# ╠═8286beee-54b6-471d-b27a-ce24dc6a8438 +# ╠═80dea46a-ceeb-4b15-8a6e-95232598cb53 +# ╠═975346eb-34cd-4457-8cbe-d4150aa039f6 +# ╠═65e04649-f79c-4421-97fc-bae6832705a2 +# ╠═c3a361ae-3714-409e-ab0e-eb19bba53ab2 +# ╠═9f23d5e7-5cc3-4ba3-8fae-7c4786d65347 +# ╠═9c06aad4-7b94-41dd-baf0-9d8a0bfe0591 +# ╠═d33e625a-9c05-4180-9009-4e014d0fd2ec +# ╠═a9161a66-a19c-4a4d-a5e8-0ba120051ad7 +# ╠═e3736993-b7df-48ea-ac8c-2fec24f78537 +# ╠═349b3418-e9b7-4044-9523-f1cbc9404987 +# ╠═07eee79f-f827-4e26-9fa8-5721dece1503 +# ╠═861f0dd3-3bb0-429a-8150-1ef7e3eaab04 +# ╠═18312733-02c4-44ce-a487-15799ee480e2 +# ╠═c1276493-ebff-4600-a5d4-728a903cd1ee +# β•Ÿβ”€00000000-0000-0000-0000-000000000001 +# β•Ÿβ”€00000000-0000-0000-0000-000000000002 diff --git a/notebooks_old/floop_nbody.jl b/notebooks_old/floop_nbody.jl new file mode 100644 index 0000000..360097d --- /dev/null +++ b/notebooks_old/floop_nbody.jl @@ -0,0 +1,54 @@ +using CUDA +using FLoops +using FoldsCUDA +using StaticArrays + +function nbody(n, num_steps, dt; ArrayType=Array, box_size=1, dims=2) + accelerations = ArrayType([SVector(Tuple(zeros(dims))) for i = 1:n]) + positions = ArrayType([SVector(Tuple(rand(dims) * box_size .- 0.5 * box_size)) for i = 1:n]) + masses = ArrayType(ones(n)) + last_positions = copy(positions) + + trajectories = zeros(eltype(positions), num_steps, 2) # always "CPU" array + + for t in 1:num_steps + # Equivalent: + # @floop for i in 1:n + # pα΅’ = positions[i] + # mα΅’ = masses[i] + # ... + # end + + @floop for (i, pα΅’, mα΅’) in zip(1:n, positions, masses) + a = zero(accelerations[i]) + for (j, pβ±Ό, mβ±Ό) in zip(1:n, positions, masses) + if j != i + rΒ² = sum((pα΅’ .- pβ±Ό) .^ 2) + πŸ™ = (pα΅’ .- pβ±Ό) ./ sqrt(rΒ²) + G = 9.81 + a += (G * mα΅’ * mβ±Ό / rΒ²) * πŸ™ + end + end + accelerations[i] = a + end + + # verlet + positions .= positions * 2 .- last_positions .+ accelerations * dt * dt + + last_positions .= positions + + # "Download" first two position data + @views copy!(trajectories[t, :], positions[1:2]) + end + + return trajectories +end + +# nbody(10, 20, 0.1) +positions = nbody(100, 10000, 0.1; ArrayType = CuArray) + +using Plots +plot( + map(p -> p.x, positions), + map(p -> p.y, positions), +) diff --git a/notebooks_old/gdalle/challenge.jl b/notebooks_old/gdalle/challenge.jl new file mode 100644 index 0000000..a72e36b --- /dev/null +++ b/notebooks_old/gdalle/challenge.jl @@ -0,0 +1,579 @@ +### A Pluto.jl notebook ### +# v0.19.14 + +using Markdown +using InteractiveUtils + +# ╔═║ 35580339-744e-422a-b474-47dda002390a +begin + using PlutoTeachingTools + using PlutoUI +end + +# ╔═║ fcc41a80-b44a-4eb8-ade6-13f075c5b72f +TableOfContents() + +# ╔═║ 51d9bad9-aebd-40bb-8682-688a57c876db +html"" + +# ╔═║ 633fc28a-6138-11ed-2bf2-9fc45fc9a926 +md""" +# Optimization challenge +""" + +# ╔═║ 6fdbc050-ed89-48af-9b21-43aeb5bc103a +md""" +# 1. Overview +""" + +# ╔═║ bf76e4a9-8319-4aca-91fc-93d31952906f +md""" +## Street view routing +""" + +# ╔═║ 5b096f1a-b5b7-4db0-855a-de39ddb5ef4c +md""" +The problem we chose for you is taken from [Google Hash Code](https://codingcompetitions.withgoogle.com/hashcode), an annual team programming competition. +Its 2014 final round was about the routing of [Google Street View](https://www.google.com/streetview/) cars through Paris. +In a nutshell, the goal is to define itineraries that capture as much image data as possible within a limited time frame. +See the official [task description](https://storage.googleapis.com/coding-competitions.appspot.com/HC/2014/hashcode2014_final_task.pdf) and the [data file](https://storage.googleapis.com/coding-competitions.appspot.com/HC/2014/paris_54000.txt). +""" + +# ╔═║ e103f446-d3f9-432d-9fb6-dd0f67ee716b +md""" +We wrote a small package called [HashCode2014.jl](https://github.com/gdalle/HashCode2014.jl) to help you get started. +It is not available on the general registry, so to install it, you need to use the URL: +```julia +pkg> add https://github.com/gdalle/HashCode2014.jl +``` +In addition to basic utilities, it includes a parser for text files, a very simple random walk algorithm, and a visualization function based on [folium](https://python-visualization.github.io/folium/). +Check out the [documentation](https://gdalle.github.io/HashCode2014.jl/dev/) for more details. +""" + +# ╔═║ ed66c4e6-17e8-4706-9cf4-56f4bc1d7b6c +md""" +## Problem statement +""" + +# ╔═║ 9a15943f-5dad-4043-b540-546d0fc2f025 +md""" +Your task is to solve Hash Code 2014 by developing a Julia package. +This package should contain (at least) the following elements: +- New structs for storing problem instances and solutions (the ones from HashCode2014.jl are very dumb) +- Functions that check the feasibility and value of a solution +- One or more functions that compute a good solution +- One or more functions that compute an upper bound on the value of an optimal solution +- Unit tests that verify feasibility of your solutions and coherence of the bounds +- A documentation made with [Documenter.jl](https://github.com/gdalle/HashCode2014.jl) +""" + +# ╔═║ 5aea0b2d-c3da-4496-9a9f-2fbc31fecf19 +md""" +The documentation will serve as a report. +It should not only contain function docstrings, but also present a mathematical description of your algorithms and a discussion of their performance, both in terms of solution quality and speed. + +In this project, a major focus should be code efficiency. +Make use of all the tools that you have discovered in the class. +Don't be afraid to discuss the questions that you faced, and the answers that you found. +""" + +# ╔═║ 3eff3936-4713-43a8-b4c5-ac0245086fab +md""" +## Deliverable +""" + +# ╔═║ a7cd1bb9-44b3-44ce-bf2e-e3575ae73efe +md""" +Your deliverable for the challenge must be a _public_ GitHub repository containing your Julia package and its documentation. +We ask you to make it public because open source development produces code that is accessible, auditable and reusable by everyone. +In addition, GitHub offers many more services for public repositories than for private ones, and they're usually free of charge (one example being unlimited CI). +Finally, this will allow instructors to check in on your work regularly and give you advice if you need it. +""" + +# ╔═║ 3cc76524-62e7-4476-9a62-02ad93915172 +md""" +## Tools +""" + +# ╔═║ 49ce7a51-815b-4d96-b217-e0bf65472828 +md""" +As long as you write your code in Julia, you can use any package from the ecosystem. +We also allow the use of mathematical programming solvers, for instance through JuMP.jl, even when these solvers are not written in Julia. + +In terms of hardware, you should run your code on your personal laptop, and not on an MIT cluster or on JuliaHub. +Multithreading is allowed, but GPU computing probably won't be necessary. +As is often the case in combinatorial optimization, the biggest differences come from clever algorithms and implementations, not from having a bigger computer. + +As a rule of thumb, your entire code should never take more than one hour to run on your laptop, ideally less. +""" + +# ╔═║ b268179b-a2ea-481d-be0d-e1aed35d6a6c +md""" +# 2. Rules and advice +""" + +# ╔═║ cd6d305e-f5fb-46f7-abbc-3b175f42a325 +md""" +## Teams +""" + +# ╔═║ 1e0f6c1a-694c-4802-91b2-45c67baa0305 +md""" +This challenge can be tackled individually, or in teams of up to 3 students. +If you struggle to find teammates, you can check out this [Piazza post](https://piazza.com/class/l6xyasad2hl2z7/post/120). +""" + +# ╔═║ 648389db-8498-4848-b4aa-d3703facc2a7 +md""" +## Leaderboard +""" + +# ╔═║ 0f2d2902-a4d9-4a25-96ac-685e6a1da5dd +md""" +To make this challenge more fun, we encourage teams to compete against each other. +We thus created a [Google Sheets](https://docs.google.com/spreadsheets/d/1aiFdtYymErgXhLLqcXC50fYtiBA16Gzb8NaxFVOqxPo/edit?usp=sharing) where you can enter your team information and your current best performance. +The computation time column is mostly intended for orders of magnitude: since you all have different hardware, precise comparison is impossible. + +To verify solution values, we will set up another Canvas submission that you can keep updated with your best solution sofar. +The challenge instructions provide very clear guidelines to export this solution as a text file, and HashCode2014.jl has a function to do just that. +""" + +# ╔═║ cdb75786-4fc0-491f-bbd7-fdf59d36b668 +md""" +## Ethics +""" + +# ╔═║ 6802a897-1be1-4d93-a432-b783ca648830 +md""" +Since each team is expected to work in a public repository, plagiarism is technically possible, but we will not tolerate it. +If you draw inspiration from the work of others, we demand that you: +1. cite the source explicitly to separate their contributions +2. make their method better / faster in the process, and explain how you did it +""" + +# ╔═║ d3175bdd-74dd-4c83-8540-a32323580d67 +md""" +## Grading +""" + +# ╔═║ d011f5a4-3d5d-4bba-af45-de15efac5f98 +md""" +The grading rubric is not defined yet, but the following items will be taken into account: +- Code quality +- Clarity of the documentation +- Cleverness of the algorithms +- Efficiency considerations +- Actual performance and leaderboard ranking (for a small part) +""" + +# ╔═║ a71422ea-f656-4338-a943-3ecf3e8ecf61 +md""" +## Deadlines +""" + +# ╔═║ 22701912-d47b-4baf-a97c-57d8d4a763be +md""" +| Date | Objective | Assignment | Consequences | +| --- | --- | --- | --- | +| Thursday 11/17 | Package initialized | Submit your team and repository URL | | +| Tuesday 11/22 | Package operational | Submit your first solution file | We will review your repository to give advice | +| Friday 12/09 | Package and documentation complete | Submit your final solution file | We will download and evaluate your repository | + +All dates are to be understood as 11:59 PM +""" + +# ╔═║ 4ad8e4c2-080d-496f-8b54-8a55ebd23923 +md""" +## Troubleshooting +""" + +# ╔═║ cf53067e-dfe4-42a3-b433-27ca7b3dbec8 +md""" +We recommend you initialize your package with [PkgTemplates.jl](https://github.com/JuliaCI/PkgTemplates.jl), as discussed in the tutorial on good coding practices. +Before pushing, try running the tests and building the documentation locally. + +**Ignoring files** + +PkgTemplates.jl generates a file called `.gitignore`, which tells Git to avoid tracking certain files. +You will need to insert a line in this file containing `.CondaPkg`. When you add HashCode2014.jl as a dependency, some Python packages will be stored there, but you don't need to push them to GitHub. + +**Testing** + +You should copy the basic `runtests.jl` structure we suggested in the course on good programming practices. +While doing so, you might find that + +- You need to set up additional test-specific dependencies (see the documentation for Pkg.jl to learn how) +- [Aqua.jl](https://github.com/JuliaTesting/Aqua.jl) is very picky on certain aspects. Read its documentation to understand why and how you can get the tests to pass. +""" + +# ╔═║ 00000000-0000-0000-0000-000000000001 +PLUTO_PROJECT_TOML_CONTENTS = """ +[deps] +PlutoTeachingTools = "661c6b06-c737-4d37-b85c-46df65de6f69" +PlutoUI = "7f904dfe-b85e-4ff6-b463-dae2292396a8" + +[compat] +PlutoTeachingTools = "~0.2.5" +PlutoUI = "~0.7.48" +""" + +# ╔═║ 00000000-0000-0000-0000-000000000002 +PLUTO_MANIFEST_TOML_CONTENTS = """ +# This file is machine-generated - editing it directly is not advised + +julia_version = "1.8.2" +manifest_format = "2.0" +project_hash = "a084e953ecc8d9d6d85465607b1a1d49f1e47fec" + +[[deps.AbstractPlutoDingetjes]] +deps = ["Pkg"] +git-tree-sha1 = "8eaf9f1b4921132a4cff3f36a1d9ba923b14a481" +uuid = "6e696c72-6542-2067-7265-42206c756150" +version = "1.1.4" + +[[deps.ArgTools]] +uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" +version = "1.1.1" + +[[deps.Artifacts]] +uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" + +[[deps.Base64]] +uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" + +[[deps.CodeTracking]] +deps = ["InteractiveUtils", "UUIDs"] +git-tree-sha1 = "cc4bd91eba9cdbbb4df4746124c22c0832a460d6" +uuid = "da1fd8a2-8d9e-5ec2-8556-3022fb5608a2" +version = "1.1.1" + +[[deps.ColorTypes]] +deps = ["FixedPointNumbers", "Random"] +git-tree-sha1 = "eb7f0f8307f71fac7c606984ea5fb2817275d6e4" +uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f" +version = "0.11.4" + +[[deps.CompilerSupportLibraries_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" +version = "0.5.2+0" + +[[deps.Dates]] +deps = ["Printf"] +uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" + +[[deps.Distributed]] +deps = ["Random", "Serialization", "Sockets"] +uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" + +[[deps.Downloads]] +deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] +uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" +version = "1.6.0" + +[[deps.FileWatching]] +uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" + +[[deps.FixedPointNumbers]] +deps = ["Statistics"] +git-tree-sha1 = "335bfdceacc84c5cdf16aadc768aa5ddfc5383cc" +uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" +version = "0.8.4" + +[[deps.Formatting]] +deps = ["Printf"] +git-tree-sha1 = "8339d61043228fdd3eb658d86c926cb282ae72a8" +uuid = "59287772-0a20-5a39-b81b-1366585eb4c0" +version = "0.4.2" + +[[deps.Hyperscript]] +deps = ["Test"] +git-tree-sha1 = "8d511d5b81240fc8e6802386302675bdf47737b9" +uuid = "47d2ed2b-36de-50cf-bf87-49c2cf4b8b91" +version = "0.0.4" + +[[deps.HypertextLiteral]] +deps = ["Tricks"] +git-tree-sha1 = "c47c5fa4c5308f27ccaac35504858d8914e102f9" +uuid = "ac1192a8-f4b3-4bfe-ba22-af5b92cd3ab2" +version = "0.9.4" + +[[deps.IOCapture]] +deps = ["Logging", "Random"] +git-tree-sha1 = "f7be53659ab06ddc986428d3a9dcc95f6fa6705a" +uuid = "b5f81e59-6552-4d32-b1f0-c071b021bf89" +version = "0.2.2" + +[[deps.InteractiveUtils]] +deps = ["Markdown"] +uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" + +[[deps.JSON]] +deps = ["Dates", "Mmap", "Parsers", "Unicode"] +git-tree-sha1 = "3c837543ddb02250ef42f4738347454f95079d4e" +uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" +version = "0.21.3" + +[[deps.JuliaInterpreter]] +deps = ["CodeTracking", "InteractiveUtils", "Random", "UUIDs"] +git-tree-sha1 = "0f960b1404abb0b244c1ece579a0ec78d056a5d1" +uuid = "aa1ae85d-cabe-5617-a682-6adf51b2e16a" +version = "0.9.15" + +[[deps.LaTeXStrings]] +git-tree-sha1 = "f2355693d6778a178ade15952b7ac47a4ff97996" +uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" +version = "1.3.0" + +[[deps.Latexify]] +deps = ["Formatting", "InteractiveUtils", "LaTeXStrings", "MacroTools", "Markdown", "OrderedCollections", "Printf", "Requires"] +git-tree-sha1 = "ab9aa169d2160129beb241cb2750ca499b4e90e9" +uuid = "23fbe1c1-3f47-55db-b15f-69d7ec21a316" +version = "0.15.17" + +[[deps.LibCURL]] +deps = ["LibCURL_jll", "MozillaCACerts_jll"] +uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" +version = "0.6.3" + +[[deps.LibCURL_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] +uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" +version = "7.84.0+0" + +[[deps.LibGit2]] +deps = ["Base64", "NetworkOptions", "Printf", "SHA"] +uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" + +[[deps.LibSSH2_jll]] +deps = ["Artifacts", "Libdl", "MbedTLS_jll"] +uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" +version = "1.10.2+0" + +[[deps.Libdl]] +uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" + +[[deps.LinearAlgebra]] +deps = ["Libdl", "libblastrampoline_jll"] +uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + +[[deps.Logging]] +uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" + +[[deps.LoweredCodeUtils]] +deps = ["JuliaInterpreter"] +git-tree-sha1 = "dedbebe234e06e1ddad435f5c6f4b85cd8ce55f7" +uuid = "6f1432cf-f94c-5a45-995e-cdbf5db27b0b" +version = "2.2.2" + +[[deps.MIMEs]] +git-tree-sha1 = "65f28ad4b594aebe22157d6fac869786a255b7eb" +uuid = "6c6e2e6c-3030-632d-7369-2d6c69616d65" +version = "0.1.4" + +[[deps.MacroTools]] +deps = ["Markdown", "Random"] +git-tree-sha1 = "42324d08725e200c23d4dfb549e0d5d89dede2d2" +uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" +version = "0.5.10" + +[[deps.Markdown]] +deps = ["Base64"] +uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" + +[[deps.MbedTLS_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" +version = "2.28.0+0" + +[[deps.Mmap]] +uuid = "a63ad114-7e13-5084-954f-fe012c677804" + +[[deps.MozillaCACerts_jll]] +uuid = "14a3606d-f60d-562e-9121-12d972cd8159" +version = "2022.2.1" + +[[deps.NetworkOptions]] +uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" +version = "1.2.0" + +[[deps.OpenBLAS_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] +uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" +version = "0.3.20+0" + +[[deps.OrderedCollections]] +git-tree-sha1 = "85f8e6578bf1f9ee0d11e7bb1b1456435479d47c" +uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" +version = "1.4.1" + +[[deps.Parsers]] +deps = ["Dates", "SnoopPrecompile"] +git-tree-sha1 = "cceb0257b662528ecdf0b4b4302eb00e767b38e7" +uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" +version = "2.5.0" + +[[deps.Pkg]] +deps = ["Artifacts", "Dates", "Downloads", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] +uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" +version = "1.8.0" + +[[deps.PlutoHooks]] +deps = ["InteractiveUtils", "Markdown", "UUIDs"] +git-tree-sha1 = "072cdf20c9b0507fdd977d7d246d90030609674b" +uuid = "0ff47ea0-7a50-410d-8455-4348d5de0774" +version = "0.0.5" + +[[deps.PlutoLinks]] +deps = ["FileWatching", "InteractiveUtils", "Markdown", "PlutoHooks", "Revise", "UUIDs"] +git-tree-sha1 = "0e8bcc235ec8367a8e9648d48325ff00e4b0a545" +uuid = "0ff47ea0-7a50-410d-8455-4348d5de0420" +version = "0.1.5" + +[[deps.PlutoTeachingTools]] +deps = ["Downloads", "HypertextLiteral", "LaTeXStrings", "Latexify", "Markdown", "PlutoLinks", "PlutoUI", "Random"] +git-tree-sha1 = "ea3e4ac2e49e3438815f8946fa7673b658e35bdb" +uuid = "661c6b06-c737-4d37-b85c-46df65de6f69" +version = "0.2.5" + +[[deps.PlutoUI]] +deps = ["AbstractPlutoDingetjes", "Base64", "ColorTypes", "Dates", "FixedPointNumbers", "Hyperscript", "HypertextLiteral", "IOCapture", "InteractiveUtils", "JSON", "Logging", "MIMEs", "Markdown", "Random", "Reexport", "URIs", "UUIDs"] +git-tree-sha1 = "efc140104e6d0ae3e7e30d56c98c4a927154d684" +uuid = "7f904dfe-b85e-4ff6-b463-dae2292396a8" +version = "0.7.48" + +[[deps.Printf]] +deps = ["Unicode"] +uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" + +[[deps.REPL]] +deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] +uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" + +[[deps.Random]] +deps = ["SHA", "Serialization"] +uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" + +[[deps.Reexport]] +git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" +uuid = "189a3867-3050-52da-a836-e630ba90ab69" +version = "1.2.2" + +[[deps.Requires]] +deps = ["UUIDs"] +git-tree-sha1 = "838a3a4188e2ded87a4f9f184b4b0d78a1e91cb7" +uuid = "ae029012-a4dd-5104-9daa-d747884805df" +version = "1.3.0" + +[[deps.Revise]] +deps = ["CodeTracking", "Distributed", "FileWatching", "JuliaInterpreter", "LibGit2", "LoweredCodeUtils", "OrderedCollections", "Pkg", "REPL", "Requires", "UUIDs", "Unicode"] +git-tree-sha1 = "dad726963ecea2d8a81e26286f625aee09a91b7c" +uuid = "295af30f-e4ad-537b-8983-00126c2a3abe" +version = "3.4.0" + +[[deps.SHA]] +uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" +version = "0.7.0" + +[[deps.Serialization]] +uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" + +[[deps.SnoopPrecompile]] +git-tree-sha1 = "f604441450a3c0569830946e5b33b78c928e1a85" +uuid = "66db9d55-30c0-4569-8b51-7e840670fc0c" +version = "1.0.1" + +[[deps.Sockets]] +uuid = "6462fe0b-24de-5631-8697-dd941f90decc" + +[[deps.SparseArrays]] +deps = ["LinearAlgebra", "Random"] +uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + +[[deps.Statistics]] +deps = ["LinearAlgebra", "SparseArrays"] +uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" + +[[deps.TOML]] +deps = ["Dates"] +uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" +version = "1.0.0" + +[[deps.Tar]] +deps = ["ArgTools", "SHA"] +uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" +version = "1.10.1" + +[[deps.Test]] +deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] +uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[[deps.Tricks]] +git-tree-sha1 = "6bac775f2d42a611cdfcd1fb217ee719630c4175" +uuid = "410a4b4d-49e4-4fbc-ab6d-cb71b17b3775" +version = "0.1.6" + +[[deps.URIs]] +git-tree-sha1 = "e59ecc5a41b000fa94423a578d29290c7266fc10" +uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" +version = "1.4.0" + +[[deps.UUIDs]] +deps = ["Random", "SHA"] +uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" + +[[deps.Unicode]] +uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" + +[[deps.Zlib_jll]] +deps = ["Libdl"] +uuid = "83775a58-1f1d-513f-b197-d71354ab007a" +version = "1.2.12+3" + +[[deps.libblastrampoline_jll]] +deps = ["Artifacts", "Libdl", "OpenBLAS_jll"] +uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" +version = "5.1.1+0" + +[[deps.nghttp2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" +version = "1.48.0+0" + +[[deps.p7zip_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" +version = "17.4.0+0" +""" + +# ╔═║ Cell order: +# ╠═35580339-744e-422a-b474-47dda002390a +# ╠═fcc41a80-b44a-4eb8-ade6-13f075c5b72f +# β•Ÿβ”€51d9bad9-aebd-40bb-8682-688a57c876db +# β•Ÿβ”€633fc28a-6138-11ed-2bf2-9fc45fc9a926 +# β•Ÿβ”€6fdbc050-ed89-48af-9b21-43aeb5bc103a +# β•Ÿβ”€bf76e4a9-8319-4aca-91fc-93d31952906f +# β•Ÿβ”€5b096f1a-b5b7-4db0-855a-de39ddb5ef4c +# β•Ÿβ”€e103f446-d3f9-432d-9fb6-dd0f67ee716b +# β•Ÿβ”€ed66c4e6-17e8-4706-9cf4-56f4bc1d7b6c +# β•Ÿβ”€9a15943f-5dad-4043-b540-546d0fc2f025 +# β•Ÿβ”€5aea0b2d-c3da-4496-9a9f-2fbc31fecf19 +# β•Ÿβ”€3eff3936-4713-43a8-b4c5-ac0245086fab +# β•Ÿβ”€a7cd1bb9-44b3-44ce-bf2e-e3575ae73efe +# β•Ÿβ”€3cc76524-62e7-4476-9a62-02ad93915172 +# β•Ÿβ”€49ce7a51-815b-4d96-b217-e0bf65472828 +# β•Ÿβ”€b268179b-a2ea-481d-be0d-e1aed35d6a6c +# β•Ÿβ”€cd6d305e-f5fb-46f7-abbc-3b175f42a325 +# β•Ÿβ”€1e0f6c1a-694c-4802-91b2-45c67baa0305 +# β•Ÿβ”€648389db-8498-4848-b4aa-d3703facc2a7 +# β•Ÿβ”€0f2d2902-a4d9-4a25-96ac-685e6a1da5dd +# β•Ÿβ”€cdb75786-4fc0-491f-bbd7-fdf59d36b668 +# β•Ÿβ”€6802a897-1be1-4d93-a432-b783ca648830 +# β•Ÿβ”€d3175bdd-74dd-4c83-8540-a32323580d67 +# β•Ÿβ”€d011f5a4-3d5d-4bba-af45-de15efac5f98 +# β•Ÿβ”€a71422ea-f656-4338-a943-3ecf3e8ecf61 +# β•Ÿβ”€22701912-d47b-4baf-a97c-57d8d4a763be +# β•Ÿβ”€4ad8e4c2-080d-496f-8b54-8a55ebd23923 +# β•Ÿβ”€cf53067e-dfe4-42a3-b433-27ca7b3dbec8 +# β•Ÿβ”€00000000-0000-0000-0000-000000000001 +# β•Ÿβ”€00000000-0000-0000-0000-000000000002 diff --git a/notebooks_old/gdalle/good_practices.jl b/notebooks_old/gdalle/good_practices.jl new file mode 100644 index 0000000..9f1edd1 --- /dev/null +++ b/notebooks_old/gdalle/good_practices.jl @@ -0,0 +1,722 @@ +### A Pluto.jl notebook ### +# v0.19.14 + +using Markdown +using InteractiveUtils + +# ╔═║ 80266caa-6066-11ed-0d4e-a3b81a95bc95 +begin + using PlutoUI + using PlutoTeachingTools +end + +# ╔═║ fc5c6cb2-4d06-4922-90ca-553c562a6e16 +TableOfContents() + +# ╔═║ 9604dcf7-b58e-4af5-9ecd-5bd3199c785d +html"" + +# ╔═║ be066ed7-7bd5-4d46-ae2c-4fca40f1cffb +md""" +# Becoming a Julia developer +""" + +# ╔═║ e1812064-2ef0-46a7-976e-f51c51e72985 +md""" +# 1. Good coding practices +""" + +# ╔═║ 25513b52-d96c-407a-a8a8-746b74eba72b +md""" +## Julia installation +""" + +# ╔═║ 6deb699e-c063-4af5-a67b-8d89397915b3 +md""" +To install Julia, you can [download](https://julialang.org/downloads/) the latest release and follow the [installation instructions](https://julialang.org/downloads/platform/) specific to your platform, but that is not ideal. +If you go down that road, you will have to reinstall it anew for every release (for instance when the version is bumped from 1.8.2 to 1.8.3). +Plus the path manipulations are slightly cumbersome. + +That is why we recommend you use [juliaup](https://github.com/JuliaLang/juliaup) instead, which will soon be the default installer. +It easily takes care of path management and updates without bothering the user. +Of course you should remove any trace of your previous Julia installation before switching to juliaup. +""" + +# ╔═║ 4be9d59e-6e03-43ee-aeb2-5dc2553f9010 +md""" +## Editor +""" + +# ╔═║ febfd7d3-622b-459e-985b-f8ede456673d +md""" +To write code comfortably, you need an Integrated Development Environment (IDE). +We strongly recommend you download [Visual Studio Code](https://code.visualstudio.com/) with the [Julia extension](https://marketplace.visualstudio.com/items?itemName=julialang.language-julia). +There are plenty of other extensions, and you will find one for whatever language you want to use (like [Python](https://marketplace.visualstudio.com/items?itemName=ms-python.python) or [LaTeX](https://marketplace.visualstudio.com/items?itemName=James-Yu.latex-workshop)). +If you don't like Microsoft products, try [VSCodium](https://vscodium.com/) instead. + +Note that other IDEs also have [Julia support](https://github.com/JuliaEditorSupport). +""" + +# ╔═║ 2b6a911b-c33b-4ca6-9ead-767b507ee708 +md""" +## Code storage +""" + +# ╔═║ ccf7a7fa-ba31-48e3-9c40-f5e4aa8b8509 +md""" +To write a complete Julia package, version control is essential. +When developing ambitious projects, you want to be able to reverse some changes or go back to an earlier idea that worked well. + +[Git](https://git-scm.com/) is a cross-platform software that allows you to save various versions of your code. +[GitHub](https://github.com/) is a website that allows you to store and collaborate on your code. +If you're unfamiliar with these tools, the following [tutorial for beginners](https://product.hubspot.com/blog/git-and-github-tutorial-for-beginners) tells you all you need to know. +This [quick recap](https://up1.github.io/git-guide/index.html) is also very handy. +As a student, you are entitled to the [GitHub Student Developer pack](https://education.github.com/pack), which boasts lots of benefits for computer science courses. +""" + +# ╔═║ 0befc3d1-972d-4467-8f86-eafeb80b6754 +md""" +## Package manager +""" + +# ╔═║ 0d7f1cd6-5b95-407f-ae07-8fe6265d4cdc +md""" +Unlike Python, the Julia language comes bundled with its own package and environment manager: [Pkg.jl](https://github.com/JuliaLang/Pkg.jl). +It can be accessed in the REPL by typing `]`. +Like conda for Python, it allows you to create individual environments for each of your projects, and add a particular set of dependencies to each one. +Before you start, please read sections 2 through 5 of the [Pkg.jl documentation](https://pkgdocs.julialang.org/v1/). +""" + +# ╔═║ ef9ca651-e823-4ca6-845a-a0588f79f940 +md""" +## Default environment +""" + +# ╔═║ 9fe6028a-44ae-4b22-9b51-4100e23671fb +md""" +One thing to keep in mind is that packages installed into your default environment (called `@v1.8` and located at `~/.julia/environments/v1.8`) are accessible in every other environment. +That is why `@v1.8` be curated carefully, filled only with lightweight packages that are often useful. +Here is a good starting selection: +- [Aqua.jl](https://github.com/JuliaTesting/Aqua.jl): check code quality +- [BenchmarkTools.jl](https://github.com/JuliaCI/BenchmarkTools.jl): measure time and memory performance +- [Documenter.jl](https://github.com/JuliaDocs/Documenter.jl): generate documentation +- [JET.jl](https://github.com/aviatesk/JET.jl): advanced debugger and performance diagnosis tool +- [JuliaFormatter.jl](https://github.com/domluna/JuliaFormatter.jl): clean up source code in a configurable way +- [OhMyREPL.jl](https://github.com/KristofferC/OhMyREPL.jl): put some color in your REPL +- [PackageCompatUI.jl](https://github.com/GunnarFarneback/PackageCompatUI.jl): browse and define compatibility requirements +- [Revise.jl](https://github.com/timholy/Revise.jl): incorporate source changes without restarting the REPL +- [TestEnv.jl](https://github.com/JuliaTesting/TestEnv.jl): activate the test environment of a package + +You probably want to add the following lines to your `.julia/config/startup.jl` file, to load these packages whenever Julia starts: +```julia +using Revise +using OhMyREPL +``` +""" + +# ╔═║ 7f36a436-1bd6-4b10-8df8-524724966da1 +md""" +## Troubleshooting +""" + +# ╔═║ 4ec033b5-d9b1-4b65-9085-30666bd72d0a +md""" +Here are a few useful reflexes to keep in mind: +- a quick Google search will solve 95% of your problems +- the help mode (`?` in the REPL or Pluto) and this [cheat sheet](https://cheatsheet.juliadocs.org/) will solve 4% +- for the last 1%, don't hesitate to [ask for help](https://julialang.org/about/help/) +""" + +# ╔═║ 9697d7af-b78a-42f1-b562-b0dff837bb1b +md""" +# 2. Your first package +""" + +# ╔═║ 5d4122b4-8795-49fc-b282-d064ab4ae5b5 +md""" +## Git(Hub) boilerplate +""" + +# ╔═║ f2d70b0c-3fdd-483c-9e15-506d90f380b5 +md""" +For the rest of this section, we assume that you have created a GitHub account, and gone through the following very short GitHub tutorials: +1. [Hello World](https://docs.github.com/en/get-started/quickstart/hello-world) +2. [Set up Git](https://docs.github.com/en/get-started/quickstart/set-up-git) + +To get started on a Julia package, create a public repository on your GitHub account. +The following instructions are given with my own GitHub user name (`gdalle`) and an arbitrary repository name (`MyJuliaPackage.jl`). +""" + +# ╔═║ cbbe4adb-7c40-4675-8b8f-e69a771621d9 +md""" +## Package structure +""" + +# ╔═║ c9fece4b-ac3e-4cb0-b83d-4c2603040047 +md""" +[PkgTemplates.jl](https://github.com/JuliaCI/PkgTemplates.jl) enables you to initialize packages in a standardized way. +Open a Julia REPL in the parent folder where you want your package to appear, then run these commands. +```julia +julia> using PkgTemplates + +julia> template = Template(interactive = true) +``` +You will be presented with several questions. +Here is our recommendation of boxes to tick (check out the [PkgTemplates.jl documentation](https://juliaci.github.io/PkgTemplates.jl/stable/) for details on each plugin). +The three dots `...` mean that you shouldn't customize anything (leave the boxes blank). +""" + +# ╔═║ d55d4497-372a-4e3a-9587-07a560a5aad2 +md""" +``` +Template keywords to customize: +[press: d=done, a=all, n=none] + > [X] user + [X] authors + [X] dir + [X] host + [X] julia + [X] plugins +Enter value for 'user' (required): gdalle +Enter value for 'authors' (comma-delimited, default: Guillaume Dalle <99999999+gdalle@users.noreply.github.com> and contributors): +Enter value for 'dir' (default: ~/.julia/dev): . +Select Git repository hosting service: + > github.com +Select minimum Julia version: + > 1.8 +Select plugins: +[press: d=done, a=all, n=none] + [ ] CompatHelper + [X] ProjectFile + [X] SrcDir + [X] Git + [X] License + [X] Readme + [X] Tests + [ ] TagBot + [ ] AppVeyor + [ ] BlueStyleBadge + [ ] CirrusCI + [X] Citation + [X] Codecov + [ ] ColPracBadge + [ ] Coveralls + [ ] Develop + [X] Documenter + [ ] DroneCI + [X] GitHubActions + [ ] GitLabCI + [ ] PkgEvalBadge + [ ] RegisterAction + > [ ] TravisCI +... +Documenter deploy style: + > GitHubActions +... +``` +""" + +# ╔═║ d38c9547-2545-439b-ba2c-0e6573e77776 +md""" +Then, all you need to do is run +```julia +julia> template("MyJuliaPackage") +``` +and a folder called `MyJuliaPackage` will appear in the current directory (which we decided by setting `dir` to `.` above). +If you did the setup correctly, it should automatically be linked to your GitHub repository `gdalle/MyJuliaPackage.jl`, and all you have to do is publish the new branch `main` to see everything appear online. +""" + +# ╔═║ 94b6676d-6a4f-406d-9595-edf5c659c305 +md""" +## Continuous integration +""" + +# ╔═║ 7b8de8d7-36d3-477f-b4cc-ee6951c4fccd +md""" +PkgTemplates.jl is especially useful because it integrates with [GitHub Actions](https://docs.github.com/en/actions) to set up continuous integration (CI). +Basically, every time you push your code to the remote repository, a series of workflows will run automatically on the GitHub servers. +The results will be visible on the repository page, in the Actions tab. +Computation budget for CI workflows is unlimited for public repositories, but limited for private repositories. + +Each workflow is defined by a YAML file located in the `.github/workflows` subfolder. +The most important ones are tests and documentation (see more below), both specified in `.github/workflows/CI.yml`. +""" + +# ╔═║ 245b7576-fb4f-4d1d-aa97-a5f23509ad88 +md""" +## Code style +""" + +# ╔═║ f50e29d2-40ec-4316-91c5-eb1a99bea4f6 +md""" +Julia has no universally agreed-upon style guide like Python. +A few official guidelines can be found [here](https://docs.julialang.org/en/v1/manual/style-guide/). +For an exhaustive style reference, have a look at the [BlueStyle](https://github.com/invenia/BlueStyle) by Invenia, or the new [SciMLStyle](https://github.com/SciML/SciMLStyle). + +If you want to (partially) enforce a given style in your code, [JuliaFormatter.jl](https://github.com/domluna/JuliaFormatter.jl) can do that for you. +Just add a file called `.JuliaFormatter.toml` at the root of your package, and put a single line in it, for example +``` +style = "blue" +``` +Then JuliaFormatter.jl will be able to format all your files in the style that you chose, and the integrated formatting of VSCode will fall back on it for Julia files. +""" + +# ╔═║ c1ebe580-2d37-4de6-b2ff-d30d3a2e7bc9 +md""" +## Documentation +""" + +# ╔═║ 4f9e4dab-6a23-43ff-a40a-376368089aba +md""" +Julia also has built-in support for [documentation](https://docs.julialang.org/en/v1/manual/documentation/), as you might have noticed when querying docstrings in the REPL. +Writing docstrings for your own functions is a good idea, not only for other users but also for yourself. + +If you want to create a nice documentation website, [Documenter.jl](https://github.com/JuliaDocs/Documenter.jl) is the way to go. +The configuration is given by the `docs/make.jl` file, and the page sources are stored in the folder `docs/src/`. +When you run `docs/make.jl`, the folder `docs/build` will be populated with the HTML files of the website (which are ignored by Git). +Check their [guide](https://documenter.juliadocs.org/stable/man/guide/) for details. + +With our PkgTemplates.jl setup, a Documenter.jl website will be automatically generated and updated after every push. +It is stored on a separate branch to avoid cluttering your workspace with HTML files. +To make it accessible, all you need to do is activate GitHub pages (for the repository settings) and select the `gh-pages` branch as a build source. +""" + +# ╔═║ fa40ecc3-b877-467f-b33a-3c3e293907e9 +md""" +## Tests +""" + +# ╔═║ 503e2eaf-3c93-4193-81ab-bb7d8a4facc8 +md""" +Julia has built-in support for [unit testing](https://docs.julialang.org/en/v1/stdlib/Test/), which allows you to check that your code behaves in the way you expect. +Package tests are located in the `test/runtests.jl` file. + +With our PkgTemplates.jl setup, tests are run automatically on each push. +""" + +# ╔═║ 45e6f619-d8f8-4cd8-a2da-1f06f2a83c40 +md""" +Here is a typical `test/runtests.jl` file which performs a few automated checks in addition to your own handwritten ones. +It uses Aqua.jl, Documenter.jl and JuliaFormatter.jl in addition to the base module Test, which means all of these must be specified as [test dependencies](https://pkgdocs.julialang.org/v1/creating-packages/#Test-specific-dependencies-in-Julia-1.2-and-above). +""" + +# ╔═║ 0941a61e-529e-4633-aa69-c43e5648a572 +md""" +```julia +using Aqua +using Documenter +using MyJuliaPackage +using JuliaFormatter +using Test + +DocMeta.setdocmeta!( + MyJuliaPackage, + :DocTestSetup, + :(using MyJuliaPackage); + recursive=true +) + +@testset verbose = true "MyJuliaPackage.jl" begin + @testset verbose = true "Code quality (Aqua.jl)" begin + Aqua.test_all(MyJuliaPackage; ambiguities=false) + end + + @testset verbose = true "Code formatting (JuliaFormatter.jl)" begin + @test format(MyJuliaPackage; verbose=true, overwrite=false) + end + + @testset verbose = true "Doctests (Documenter.jl)" begin + doctest(MyJuliaPackage) + end + + @testset verbose = true "My own tests" begin + @test 1 + 1 == 2 + end +end +``` +""" + +# ╔═║ 8658cc4c-f121-4449-8c46-384deb72727b +md""" +You can also use `JET.report_package(MyJuliaPackage)` to look for possible errors, but I recommend doing it outside of the testing pipeline. +JET.jl is quite picky, including for things that don't matter much (like structs defined with `Base.@kwdef` or unassigned keyword arguments). +""" + +# ╔═║ 00000000-0000-0000-0000-000000000001 +PLUTO_PROJECT_TOML_CONTENTS = """ +[deps] +PlutoTeachingTools = "661c6b06-c737-4d37-b85c-46df65de6f69" +PlutoUI = "7f904dfe-b85e-4ff6-b463-dae2292396a8" + +[compat] +PlutoTeachingTools = "~0.2.5" +PlutoUI = "~0.7.48" +""" + +# ╔═║ 00000000-0000-0000-0000-000000000002 +PLUTO_MANIFEST_TOML_CONTENTS = """ +# This file is machine-generated - editing it directly is not advised + +julia_version = "1.8.2" +manifest_format = "2.0" +project_hash = "a084e953ecc8d9d6d85465607b1a1d49f1e47fec" + +[[deps.AbstractPlutoDingetjes]] +deps = ["Pkg"] +git-tree-sha1 = "8eaf9f1b4921132a4cff3f36a1d9ba923b14a481" +uuid = "6e696c72-6542-2067-7265-42206c756150" +version = "1.1.4" + +[[deps.ArgTools]] +uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" +version = "1.1.1" + +[[deps.Artifacts]] +uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" + +[[deps.Base64]] +uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" + +[[deps.CodeTracking]] +deps = ["InteractiveUtils", "UUIDs"] +git-tree-sha1 = "cc4bd91eba9cdbbb4df4746124c22c0832a460d6" +uuid = "da1fd8a2-8d9e-5ec2-8556-3022fb5608a2" +version = "1.1.1" + +[[deps.ColorTypes]] +deps = ["FixedPointNumbers", "Random"] +git-tree-sha1 = "eb7f0f8307f71fac7c606984ea5fb2817275d6e4" +uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f" +version = "0.11.4" + +[[deps.CompilerSupportLibraries_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" +version = "0.5.2+0" + +[[deps.Dates]] +deps = ["Printf"] +uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" + +[[deps.Distributed]] +deps = ["Random", "Serialization", "Sockets"] +uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" + +[[deps.Downloads]] +deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] +uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" +version = "1.6.0" + +[[deps.FileWatching]] +uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" + +[[deps.FixedPointNumbers]] +deps = ["Statistics"] +git-tree-sha1 = "335bfdceacc84c5cdf16aadc768aa5ddfc5383cc" +uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" +version = "0.8.4" + +[[deps.Formatting]] +deps = ["Printf"] +git-tree-sha1 = "8339d61043228fdd3eb658d86c926cb282ae72a8" +uuid = "59287772-0a20-5a39-b81b-1366585eb4c0" +version = "0.4.2" + +[[deps.Hyperscript]] +deps = ["Test"] +git-tree-sha1 = "8d511d5b81240fc8e6802386302675bdf47737b9" +uuid = "47d2ed2b-36de-50cf-bf87-49c2cf4b8b91" +version = "0.0.4" + +[[deps.HypertextLiteral]] +deps = ["Tricks"] +git-tree-sha1 = "c47c5fa4c5308f27ccaac35504858d8914e102f9" +uuid = "ac1192a8-f4b3-4bfe-ba22-af5b92cd3ab2" +version = "0.9.4" + +[[deps.IOCapture]] +deps = ["Logging", "Random"] +git-tree-sha1 = "f7be53659ab06ddc986428d3a9dcc95f6fa6705a" +uuid = "b5f81e59-6552-4d32-b1f0-c071b021bf89" +version = "0.2.2" + +[[deps.InteractiveUtils]] +deps = ["Markdown"] +uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" + +[[deps.JSON]] +deps = ["Dates", "Mmap", "Parsers", "Unicode"] +git-tree-sha1 = "3c837543ddb02250ef42f4738347454f95079d4e" +uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" +version = "0.21.3" + +[[deps.JuliaInterpreter]] +deps = ["CodeTracking", "InteractiveUtils", "Random", "UUIDs"] +git-tree-sha1 = "0f960b1404abb0b244c1ece579a0ec78d056a5d1" +uuid = "aa1ae85d-cabe-5617-a682-6adf51b2e16a" +version = "0.9.15" + +[[deps.LaTeXStrings]] +git-tree-sha1 = "f2355693d6778a178ade15952b7ac47a4ff97996" +uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" +version = "1.3.0" + +[[deps.Latexify]] +deps = ["Formatting", "InteractiveUtils", "LaTeXStrings", "MacroTools", "Markdown", "OrderedCollections", "Printf", "Requires"] +git-tree-sha1 = "ab9aa169d2160129beb241cb2750ca499b4e90e9" +uuid = "23fbe1c1-3f47-55db-b15f-69d7ec21a316" +version = "0.15.17" + +[[deps.LibCURL]] +deps = ["LibCURL_jll", "MozillaCACerts_jll"] +uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" +version = "0.6.3" + +[[deps.LibCURL_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] +uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" +version = "7.84.0+0" + +[[deps.LibGit2]] +deps = ["Base64", "NetworkOptions", "Printf", "SHA"] +uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" + +[[deps.LibSSH2_jll]] +deps = ["Artifacts", "Libdl", "MbedTLS_jll"] +uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" +version = "1.10.2+0" + +[[deps.Libdl]] +uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" + +[[deps.LinearAlgebra]] +deps = ["Libdl", "libblastrampoline_jll"] +uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + +[[deps.Logging]] +uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" + +[[deps.LoweredCodeUtils]] +deps = ["JuliaInterpreter"] +git-tree-sha1 = "dedbebe234e06e1ddad435f5c6f4b85cd8ce55f7" +uuid = "6f1432cf-f94c-5a45-995e-cdbf5db27b0b" +version = "2.2.2" + +[[deps.MIMEs]] +git-tree-sha1 = "65f28ad4b594aebe22157d6fac869786a255b7eb" +uuid = "6c6e2e6c-3030-632d-7369-2d6c69616d65" +version = "0.1.4" + +[[deps.MacroTools]] +deps = ["Markdown", "Random"] +git-tree-sha1 = "42324d08725e200c23d4dfb549e0d5d89dede2d2" +uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" +version = "0.5.10" + +[[deps.Markdown]] +deps = ["Base64"] +uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" + +[[deps.MbedTLS_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" +version = "2.28.0+0" + +[[deps.Mmap]] +uuid = "a63ad114-7e13-5084-954f-fe012c677804" + +[[deps.MozillaCACerts_jll]] +uuid = "14a3606d-f60d-562e-9121-12d972cd8159" +version = "2022.2.1" + +[[deps.NetworkOptions]] +uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" +version = "1.2.0" + +[[deps.OpenBLAS_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] +uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" +version = "0.3.20+0" + +[[deps.OrderedCollections]] +git-tree-sha1 = "85f8e6578bf1f9ee0d11e7bb1b1456435479d47c" +uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" +version = "1.4.1" + +[[deps.Parsers]] +deps = ["Dates", "SnoopPrecompile"] +git-tree-sha1 = "cceb0257b662528ecdf0b4b4302eb00e767b38e7" +uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" +version = "2.5.0" + +[[deps.Pkg]] +deps = ["Artifacts", "Dates", "Downloads", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] +uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" +version = "1.8.0" + +[[deps.PlutoHooks]] +deps = ["InteractiveUtils", "Markdown", "UUIDs"] +git-tree-sha1 = "072cdf20c9b0507fdd977d7d246d90030609674b" +uuid = "0ff47ea0-7a50-410d-8455-4348d5de0774" +version = "0.0.5" + +[[deps.PlutoLinks]] +deps = ["FileWatching", "InteractiveUtils", "Markdown", "PlutoHooks", "Revise", "UUIDs"] +git-tree-sha1 = "0e8bcc235ec8367a8e9648d48325ff00e4b0a545" +uuid = "0ff47ea0-7a50-410d-8455-4348d5de0420" +version = "0.1.5" + +[[deps.PlutoTeachingTools]] +deps = ["Downloads", "HypertextLiteral", "LaTeXStrings", "Latexify", "Markdown", "PlutoLinks", "PlutoUI", "Random"] +git-tree-sha1 = "ea3e4ac2e49e3438815f8946fa7673b658e35bdb" +uuid = "661c6b06-c737-4d37-b85c-46df65de6f69" +version = "0.2.5" + +[[deps.PlutoUI]] +deps = ["AbstractPlutoDingetjes", "Base64", "ColorTypes", "Dates", "FixedPointNumbers", "Hyperscript", "HypertextLiteral", "IOCapture", "InteractiveUtils", "JSON", "Logging", "MIMEs", "Markdown", "Random", "Reexport", "URIs", "UUIDs"] +git-tree-sha1 = "efc140104e6d0ae3e7e30d56c98c4a927154d684" +uuid = "7f904dfe-b85e-4ff6-b463-dae2292396a8" +version = "0.7.48" + +[[deps.Printf]] +deps = ["Unicode"] +uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" + +[[deps.REPL]] +deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] +uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" + +[[deps.Random]] +deps = ["SHA", "Serialization"] +uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" + +[[deps.Reexport]] +git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" +uuid = "189a3867-3050-52da-a836-e630ba90ab69" +version = "1.2.2" + +[[deps.Requires]] +deps = ["UUIDs"] +git-tree-sha1 = "838a3a4188e2ded87a4f9f184b4b0d78a1e91cb7" +uuid = "ae029012-a4dd-5104-9daa-d747884805df" +version = "1.3.0" + +[[deps.Revise]] +deps = ["CodeTracking", "Distributed", "FileWatching", "JuliaInterpreter", "LibGit2", "LoweredCodeUtils", "OrderedCollections", "Pkg", "REPL", "Requires", "UUIDs", "Unicode"] +git-tree-sha1 = "dad726963ecea2d8a81e26286f625aee09a91b7c" +uuid = "295af30f-e4ad-537b-8983-00126c2a3abe" +version = "3.4.0" + +[[deps.SHA]] +uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" +version = "0.7.0" + +[[deps.Serialization]] +uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" + +[[deps.SnoopPrecompile]] +git-tree-sha1 = "f604441450a3c0569830946e5b33b78c928e1a85" +uuid = "66db9d55-30c0-4569-8b51-7e840670fc0c" +version = "1.0.1" + +[[deps.Sockets]] +uuid = "6462fe0b-24de-5631-8697-dd941f90decc" + +[[deps.SparseArrays]] +deps = ["LinearAlgebra", "Random"] +uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + +[[deps.Statistics]] +deps = ["LinearAlgebra", "SparseArrays"] +uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" + +[[deps.TOML]] +deps = ["Dates"] +uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" +version = "1.0.0" + +[[deps.Tar]] +deps = ["ArgTools", "SHA"] +uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" +version = "1.10.1" + +[[deps.Test]] +deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] +uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[[deps.Tricks]] +git-tree-sha1 = "6bac775f2d42a611cdfcd1fb217ee719630c4175" +uuid = "410a4b4d-49e4-4fbc-ab6d-cb71b17b3775" +version = "0.1.6" + +[[deps.URIs]] +git-tree-sha1 = "e59ecc5a41b000fa94423a578d29290c7266fc10" +uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" +version = "1.4.0" + +[[deps.UUIDs]] +deps = ["Random", "SHA"] +uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" + +[[deps.Unicode]] +uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" + +[[deps.Zlib_jll]] +deps = ["Libdl"] +uuid = "83775a58-1f1d-513f-b197-d71354ab007a" +version = "1.2.12+3" + +[[deps.libblastrampoline_jll]] +deps = ["Artifacts", "Libdl", "OpenBLAS_jll"] +uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" +version = "5.1.1+0" + +[[deps.nghttp2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" +version = "1.48.0+0" + +[[deps.p7zip_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" +version = "17.4.0+0" +""" + +# ╔═║ Cell order: +# ╠═80266caa-6066-11ed-0d4e-a3b81a95bc95 +# ╠═fc5c6cb2-4d06-4922-90ca-553c562a6e16 +# β•Ÿβ”€9604dcf7-b58e-4af5-9ecd-5bd3199c785d +# β•Ÿβ”€be066ed7-7bd5-4d46-ae2c-4fca40f1cffb +# β•Ÿβ”€e1812064-2ef0-46a7-976e-f51c51e72985 +# β•Ÿβ”€25513b52-d96c-407a-a8a8-746b74eba72b +# β•Ÿβ”€6deb699e-c063-4af5-a67b-8d89397915b3 +# β•Ÿβ”€4be9d59e-6e03-43ee-aeb2-5dc2553f9010 +# β•Ÿβ”€febfd7d3-622b-459e-985b-f8ede456673d +# β•Ÿβ”€2b6a911b-c33b-4ca6-9ead-767b507ee708 +# β•Ÿβ”€ccf7a7fa-ba31-48e3-9c40-f5e4aa8b8509 +# β•Ÿβ”€0befc3d1-972d-4467-8f86-eafeb80b6754 +# β•Ÿβ”€0d7f1cd6-5b95-407f-ae07-8fe6265d4cdc +# β•Ÿβ”€ef9ca651-e823-4ca6-845a-a0588f79f940 +# β•Ÿβ”€9fe6028a-44ae-4b22-9b51-4100e23671fb +# β•Ÿβ”€7f36a436-1bd6-4b10-8df8-524724966da1 +# β•Ÿβ”€4ec033b5-d9b1-4b65-9085-30666bd72d0a +# β•Ÿβ”€9697d7af-b78a-42f1-b562-b0dff837bb1b +# β•Ÿβ”€5d4122b4-8795-49fc-b282-d064ab4ae5b5 +# β•Ÿβ”€f2d70b0c-3fdd-483c-9e15-506d90f380b5 +# β•Ÿβ”€cbbe4adb-7c40-4675-8b8f-e69a771621d9 +# β•Ÿβ”€c9fece4b-ac3e-4cb0-b83d-4c2603040047 +# β•Ÿβ”€d55d4497-372a-4e3a-9587-07a560a5aad2 +# β•Ÿβ”€d38c9547-2545-439b-ba2c-0e6573e77776 +# β•Ÿβ”€94b6676d-6a4f-406d-9595-edf5c659c305 +# β•Ÿβ”€7b8de8d7-36d3-477f-b4cc-ee6951c4fccd +# β•Ÿβ”€245b7576-fb4f-4d1d-aa97-a5f23509ad88 +# β•Ÿβ”€f50e29d2-40ec-4316-91c5-eb1a99bea4f6 +# β•Ÿβ”€c1ebe580-2d37-4de6-b2ff-d30d3a2e7bc9 +# β•Ÿβ”€4f9e4dab-6a23-43ff-a40a-376368089aba +# β•Ÿβ”€fa40ecc3-b877-467f-b33a-3c3e293907e9 +# β•Ÿβ”€503e2eaf-3c93-4193-81ab-bb7d8a4facc8 +# β•Ÿβ”€45e6f619-d8f8-4cd8-a2da-1f06f2a83c40 +# β•Ÿβ”€0941a61e-529e-4633-aa69-c43e5648a572 +# β•Ÿβ”€8658cc4c-f121-4449-8c46-384deb72727b +# β•Ÿβ”€00000000-0000-0000-0000-000000000001 +# β•Ÿβ”€00000000-0000-0000-0000-000000000002 diff --git a/notebooks_old/gdalle/graphs.jl b/notebooks_old/gdalle/graphs.jl new file mode 100644 index 0000000..2f18bee --- /dev/null +++ b/notebooks_old/gdalle/graphs.jl @@ -0,0 +1,1055 @@ +### A Pluto.jl notebook ### +# v0.19.14 + +using Markdown +using InteractiveUtils + +# ╔═║ 510bdffa-6367-11ed-23ca-9d49e3f3543f +begin + using BenchmarkTools + using DataStructures + using PlutoTeachingTools + using PlutoUI + using SparseArrays +end + +# ╔═║ 66106324-994f-4751-8a1e-0b307380bd11 +TableOfContents() + +# ╔═║ 683da7e5-2794-4766-a026-cb55bd23690f +html"" + +# ╔═║ 63c6ffc0-17cb-4732-9fae-b7eb233f8fdc +md""" +# Graph theory +""" + +# ╔═║ 4799ca44-7847-41cc-a101-f8ce5c4f255e +md""" +In this notebook, we give an overview of graph optimization problems and explain the fundamental principle behind [Graphs.jl](https://github.com/JuliaGraphs/Graphs.jl), the reference library for graphs in Julia. +""" + +# ╔═║ 823205a4-170a-4b69-bce4-3ce39d17d469 +md""" +# 1. Graphs as an interface +""" + +# ╔═║ bec05993-17de-4121-af30-2ae15956c6e1 +md""" +Most graph algorithms only make use of a few basic subroutines, which can be implemented in lots of different ways depending on our needs. +That is what allows you to [create your own graph format](https://juliagraphs.org/Graphs.jl/dev/ecosystem/interface/) and make it compatible with the entire ecosystem very easily. +""" + +# ╔═║ 86d3573e-5ea3-4fd3-a0a9-32e8dd946cc4 +md""" +## Graph definition +""" + +# ╔═║ c6310180-499a-4dd1-bda3-8d86f791c1b0 +md""" +A weighted graph $G = (V, E, w)$ is composed of: + +- a set $V$ of vertices, often called $u$ or $v$, with $|V|=n$ +- a set $E$ of edges, often denoted by $e = (u, v)$, with $|E|=m$ +- a vector $w$ of weight values $w_e$ + +If the edges are directed ($u \to v$) we speak of "nodes" and "arcs" instead. + +Visualisation: [here](https://visualgo.net/en/graphds) +""" + +# ╔═║ 5230069e-a2aa-40fe-a2e5-aceefe6b6635 +md""" +## Dijkstra's algorithm +""" + +# ╔═║ abc30a8b-b728-4936-a9b3-cdbf210a265d +md""" +A path $P = (v_1, ..., v_k)$ is a sequence of vertices linked by edges. +Many concrete problems boil down to finding the shortest path between two vertices $s$ (source) and $d$ (destination) in a weighted graph. +The most famous algorithm for shortest paths is [Dijkstra's algorithm](https://en.wikipedia.org/wiki/Dijkstra%27s_algorithm), which works on graphs with nonnegative edge weights. + +Visualization: [here](https://visualgo.net/en/sssp) +""" + +# ╔═║ 789c7a0a-870d-4fdb-a11d-4ab314cbbce9 +md""" +## Necessary methods +""" + +# ╔═║ 1c6fd34c-80c7-4b8f-b9fb-9ac1aa74db04 +md""" +For Dijkstra's algorithm, we only need our graph structure to provide a handful of methods. +""" + +# ╔═║ 981d2bc0-3030-4d4a-a2c3-ae6c3819838d +""" + AbstractWeightedGraph + +To satisfy this interface, a concrete type must implement the following methods: +- `nb_vertices(g)` +- `edge_weight(g, u, v)` +- `outneighbors(g, u)` +""" +abstract type AbstractWeightedGraph end + +# ╔═║ 1de57dcb-85c0-44c0-b225-f81194ffea06 +""" + nb_vertices(g) + +Count the vertices in `g`. +""" +function nb_vertices end + +# ╔═║ caa8f63c-ec6c-45c4-9f23-c853bce3a929 +""" + edge_weight(g, u, v) + +Return the weight of the edge `(u, v)` in `g`. +""" +function edge_weight end + +# ╔═║ c4d83106-f940-4c69-bb95-8effe7e8bd50 +""" + outneighbors(g, u) + +Return an iterable of the vertices `v` such that `(u, v)` is an edge of `g`. +""" +function outneighbors end + +# ╔═║ dbeda7e3-ce02-49c2-93b1-1e2e712c9c09 +md""" +# 2. Graph storage types +""" + +# ╔═║ f4fc6854-a44d-4bfd-88bd-a3b9eaf95332 +md""" +For simplicity, we assume that the graph vertices are numbered from $1$ to $n$, i.e. that $V = \{1, ..., n\}$. +""" + +# ╔═║ 055d49e6-8b2e-462d-abe3-bf3c5c97f61c +md""" +Our test graph is a grid of size `(I,J)`. +""" + +# ╔═║ 24722797-ae00-4066-8838-43e9eb4b5ee3 +grid_coord_to_index(i, j; I, J) = (j-1) * I + (i-1) + 1 + +# ╔═║ 95df5658-24d0-440d-b157-e4cf54c11d1a +grid_index_to_coord(v; I, J) = ((v-1) % I + 1, (v-1) Γ· I + 1) + +# ╔═║ 3931bfba-cb35-487d-a798-923e8ee454d2 +function grid_edges(I, J) + edges = Tuple{Int,Int,Float64}[] + for iα΅€ in 1:I, jα΅€ in 1:J + u = grid_coord_to_index(iα΅€, jα΅€; I, J) + for (iα΅₯, jα΅₯) in ((iα΅€+1, jα΅€), (iα΅€-1, jα΅€), (iα΅€, jα΅€+1), (iα΅€, jα΅€-1)) + if 1 <= iα΅₯ <= I && 1 <= jα΅₯ <= J + v = grid_coord_to_index(iα΅₯, jα΅₯; I, J) + wα΅€α΅₯ = rand(Float64) + push!(edges, (u, v, wα΅€α΅₯)) + end + end + end + return edges +end + +# ╔═║ 57f66ed6-b4aa-4ab0-9eaa-02f12983594a +I, J = 50, 100 + +# ╔═║ 570f7368-5464-4817-8040-f95dddf8da05 +edges = grid_edges(I, J) + +# ╔═║ de48b3f3-3cba-45b9-b0ef-eb7cfbb2c7aa +md""" +## Edge list +""" + +# ╔═║ 669c587c-c877-4e9e-a934-2850c4208147 +struct ListGraph <: AbstractWeightedGraph + n::Int + edges::Vector{Tuple{Int,Int,Float64}} +end + +# ╔═║ 55252064-0f58-44ac-a836-981a6cd8227a +nb_vertices(g::ListGraph) = g.n + +# ╔═║ a1bde286-3806-4203-a461-81fb6c595492 +function edge_weight(g::ListGraph, u, v) + for (x, y, w) in g.edges + if (x, y) == (u, v) + return w + end + end +end + +# ╔═║ f775760a-1311-4060-a347-aa2d631be0e4 +function outneighbors(g::ListGraph, u) + out = Int[] + for (x, y, w) in g.edges + if x == u + push!(out, y) + end + end + return out +end + +# ╔═║ db189e71-79af-48d4-bd94-6c30bef943a3 +md""" +## Dense adjacency matrix +""" + +# ╔═║ 971fe1f5-7b9c-477c-9a0e-dd1a574487e5 +md""" +The adjacency matrix $A \in \mathbb{R}^{n \times n}$ of a weighted graph $G = (V, E, w)$ is defined as follows: + +$$A_{u,v} = \begin{cases} w_{(u,v)} & \text{if $(u, v) \in E$} \\ 0 & \text{otherwise} \end{cases}$$ +""" + +# ╔═║ 8ad780bf-0a3c-4fff-8a5c-154a576ee45a +begin + struct DenseMatrixGraph <: AbstractWeightedGraph + A::Matrix{Float64} + end + + function DenseMatrixGraph(n, edges) + A = zeros(Float64, n, n) + for (u, v, wα΅€α΅₯) in edges + A[u, v] = wα΅€α΅₯ + end + return DenseMatrixGraph(A) + end +end + +# ╔═║ 33609b23-0e1d-411d-a950-fbc964727fe7 +nb_vertices(g::DenseMatrixGraph) = size(g.A, 1) + +# ╔═║ 49639fa6-5e65-47ec-ba47-51717e73827c +edge_weight(g::DenseMatrixGraph, u, v) = g.A[u, v] + +# ╔═║ 37c5bb0b-6fca-45fc-9c3d-8806bf1c2ee6 +md""" +**What if we transpose?** +""" + +# ╔═║ 71c5d9e4-2785-406c-8c6d-3d88a541b0f0 +begin + struct TransposedDenseMatrixGraph <: AbstractWeightedGraph + Aα΅€::Matrix{Float64} + end + + function TransposedDenseMatrixGraph(n, edges) + Aα΅€ = zeros(Float64, n, n) + for (u, v, wα΅€α΅₯) in edges + Aα΅€[v, u] = wα΅€α΅₯ + end + return TransposedDenseMatrixGraph(Aα΅€) + end +end + +# ╔═║ 6fb680c3-986c-4fd4-b6b3-5164eb73cc30 +nb_vertices(g::TransposedDenseMatrixGraph) = size(g.Aα΅€, 1) + +# ╔═║ 66f24701-1556-4881-a1fb-6f0e41165adf +edge_weight(g::TransposedDenseMatrixGraph, u, v) = g.Aα΅€[v, u] + +# ╔═║ 778d9984-f09e-4b65-8b6d-07323dc0e39c +md""" +## Sparse adjacency matrix +""" + +# ╔═║ abb0457d-4201-41df-957e-6d1d18fd29a1 +md""" +When the average degree of a vertex is small compared to $n$, the adjacency matrix is sparse. +""" + +# ╔═║ 2c7772f2-e12a-4c9f-aede-19620d6fa03a +begin + struct SparseMatrixGraph <: AbstractWeightedGraph + A::SparseMatrixCSC{Float64,Int} + end + + function SparseMatrixGraph(n, edges) + U, V, W = Int[], Int[], Float64[] + for (u, v, wα΅€α΅₯) in edges + push!(U, u); push!(V, v); push!(W, wα΅€α΅₯) + end + A = sparse(U, V, W, n, n) + return SparseMatrixGraph(A) + end +end + +# ╔═║ 0633e202-4ebf-4fdf-b0e9-581b075510fc +nb_vertices(g::SparseMatrixGraph) = size(g.A, 1) + +# ╔═║ 15cd794b-598c-4066-ae1f-2dd3e40c7eff +edge_weight(g::SparseMatrixGraph, u, v) = g.A[u, v] + +# ╔═║ 44642265-f22f-4b55-ba31-a5979f386b30 +function outneighbors(g::SparseMatrixGraph, u) + return g.A[u, :].nzind +end + +# ╔═║ 232739d5-f984-4679-a7bb-09f9066df9bf +md""" +**What if we transpose?** +""" + +# ╔═║ 8cf9e88b-ad56-4e9e-93b4-61c99f5fe00a +md""" +We can take advantage of the [CSC format](https://docs.julialang.org/en/v1/stdlib/SparseArrays/#man-csc) for sparse matrices by storing the transpose of the adjacency matrix instead. +""" + +# ╔═║ e35d80c1-043b-4152-b005-c579f2c1557d +begin + struct TransposedSparseMatrixGraph <: AbstractWeightedGraph + Aα΅€::SparseMatrixCSC{Float64,Int} + end + + function TransposedSparseMatrixGraph(n, edges) + U, V, W = Int[], Int[], Float64[] + for (u, v, wα΅€α΅₯) in edges + push!(U, u); push!(V, v); push!(W, wα΅€α΅₯) + end + Aα΅€ = sparse(V, U, W, n, n) + return TransposedSparseMatrixGraph(Aα΅€) + end +end + +# ╔═║ 1f8b678c-dbb5-4155-806c-fd072846bf56 +nb_vertices(g::TransposedSparseMatrixGraph) = size(g.Aα΅€, 1) + +# ╔═║ 0e48f9d6-04e9-4d88-9949-43066c31d0c2 +edge_weight(g::TransposedSparseMatrixGraph, u, v) = g.Aα΅€[v, u] + +# ╔═║ 5ca4bfab-13a5-4455-92cf-289ebfbb61a9 +function outneighbors(g::TransposedSparseMatrixGraph, u) + return @view g.Aα΅€.rowval[nzrange(g.Aα΅€, u)] +end + +# ╔═║ d99f2290-bd32-4737-b2c2-e33c679be313 +md""" +## Adjacency lists +""" + +# ╔═║ e9d703a4-de01-4417-a9ef-464d29149937 +begin + struct AdjacencyGraph <: AbstractWeightedGraph + outneighbors::Vector{Vector{Int}} + weights::Vector{Vector{Float64}} + end + + function AdjacencyGraph(n, edges) + outneighbors = [Int[] for v in 1:n] + weights = [Float64[] for v in 1:n] + for (u, v, w) in sort(edges) + push!(outneighbors[u], v) + push!(weights[u], w) + end + return AdjacencyGraph(outneighbors, weights) + end +end + +# ╔═║ 52a26992-2ea7-404b-bf18-299fabfa8038 +nb_vertices(g::AdjacencyGraph) = length(g.outneighbors) + +# ╔═║ 417566e9-b377-4e2a-811c-84b019f7e157 +function edge_weight(g::AdjacencyGraph, u, v) + k = searchsortedfirst(g.outneighbors[u], v) + return g.weights[u][k] +end + +# ╔═║ ae582e38-7b70-4ae2-bb98-ec43a24f4bfd +function outneighbors(g::DenseMatrixGraph, u) + return (v for v in 1:nb_vertices(g) if edge_weight(g, u, v) > 0) +end + +# ╔═║ 03c46a8e-a10a-4754-8136-421927f8d911 +function outneighbors(g::TransposedDenseMatrixGraph, u) + return (v for v in 1:nb_vertices(g) if edge_weight(g, u, v) > 0) +end + +# ╔═║ f8daa411-9ec2-4789-adf9-d3a3017d9a78 +function outneighbors(g::AdjacencyGraph, u) + return g.outneighbors[u] +end + +# ╔═║ 755b8709-4a86-4b79-a61c-605ba8ecdd8b +""" + dijkstra(g, s) + +Return the lengths of shortest paths from `s` to all other vertices in the weighted graph `g`. +""" +function dijkstra(g::AbstractWeightedGraph, s) + dist = fill(Inf, nb_vertices(g)) # here + queue = PriorityQueue{Int,Float64}() + enqueue!(queue, s => 0.0) + while !isempty(queue) + u, dist[u] = dequeue_pair!(queue) + for v in outneighbors(g, u) # here + dist_v = dist[u] + edge_weight(g, u, v) # here + if dist_v < dist[v] + dist[v] = dist_v + queue[v] = dist_v + end + end + end + return dist +end + +# ╔═║ 643c4cd5-6a96-4859-8a91-142946c880e4 +let + g = ListGraph(I*J, edges) + dijkstra(g, 1) +end + +# ╔═║ caba823b-2cb8-4760-9d18-31ab7a065d82 +let + g = ListGraph(I*J, edges) + @benchmark dijkstra($g, 1) +end + +# ╔═║ 04a938be-c786-42c1-bcdd-45d8e714adcd +let + g = DenseMatrixGraph(I*J, edges) + @assert dijkstra(g, 1) β‰ˆ dijkstra(ListGraph(I*J, edges), 1) + @benchmark dijkstra($g, 1) +end + +# ╔═║ 3ac9e1f0-15aa-4d51-8449-130755ce16b1 +let + g = TransposedDenseMatrixGraph(I*J, edges) + @assert dijkstra(g, 1) β‰ˆ dijkstra(ListGraph(I*J, edges), 1) + @benchmark dijkstra($g, 1) +end + +# ╔═║ 47850682-5d83-4cd2-bf9b-4dcbffc999bb +let + g = SparseMatrixGraph(I*J, edges) + @assert dijkstra(g, 1) β‰ˆ dijkstra(ListGraph(I*J, edges), 1) + @benchmark dijkstra($g, 1) +end + +# ╔═║ c4c2597b-08a5-4806-aeb2-a083ce6db5be +let + g = TransposedSparseMatrixGraph(I*J, edges) + @assert dijkstra(g, 1) β‰ˆ dijkstra(ListGraph(I*J, edges), 1) + @benchmark dijkstra($g, 1) +end + +# ╔═║ e8a84b3b-bb63-4aec-9c9d-3e6657d15703 +let + g = AdjacencyGraph(I*J, edges) + @assert dijkstra(g, 1) β‰ˆ dijkstra(ListGraph(I*J, edges), 1) + @benchmark dijkstra($g, 1) +end + +# ╔═║ fd13066b-35f0-4c5c-91fe-fbacbfdb6bb7 +md""" +## The trouble with metadata +""" + +# ╔═║ 652eb695-e549-417d-8085-65d8276dd479 +md""" +There are plenty of concurrent packages for graphs with metadata: +- [SimpleWeightedGraphs.jl](https://github.com/JuliaGraphs/SimpleWeightedGraphs.jl) +- [MetaGraphs.jl](https://github.com/JuliaGraphs/MetaGraphs.jl) +- [MetaGraphsNext.jl](https://github.com/JuliaGraphs/MetaGraphsNext.jl) + +An intense discussion is ongoing regarding the future of the Graphs.jl interface for version 2.0 (see [issue 35](https://github.com/JuliaGraphs/Graphs.jl/issues/35) or [issue 128](https://github.com/JuliaGraphs/Graphs.jl/issues/128)) +""" + +# ╔═║ 0d5d033a-5410-4717-8c15-e9723b39e603 +md""" +# 3. Zoo of graph problems +""" + +# ╔═║ 1ddf887d-1597-46b1-b883-bf7a969d71bd +md""" +Which ones seem related to the course challenge? +""" + +# ╔═║ 9a7f16ba-0c9a-481f-880d-7b34be5b8f3f +md""" +**Coloring** +""" + +# ╔═║ 24a4e090-9a99-4764-bf94-23baca78f9a8 +md""" +**Matching** +""" + +# ╔═║ 42f019c0-6e8b-4f02-91e2-c7d1de6cc822 +md""" +**Shortest path** +""" + +# ╔═║ b663ae74-24b6-47f1-ae59-cb988f7ba796 +md""" +**Network flow** +""" + +# ╔═║ 3d5a8f4b-26de-425c-8f57-365bf87f0393 +md""" +**Eulerian path** +""" + +# ╔═║ e173413a-4f4d-4004-abcd-a662dbd59b37 +md""" +**Hamiltonian path (TSP)** +""" + +# ╔═║ 89b98e6c-9a7d-4bd4-9524-977bb0b91086 +md""" +**Vehicle routing** +""" + +# ╔═║ 7bf9221a-26a8-41f5-8c9e-a3c5de948f3e +md""" +**Arc routing** +""" + +# ╔═║ 4b36ed7c-4fd9-41b2-a87d-48c740c5afa3 +md""" +**Spanning tree** +""" + +# ╔═║ 06f4116d-7032-4822-b52e-2926192c9da8 +md""" +**Steiner tree** +""" + +# ╔═║ 5ad847d0-9968-42a6-9bcc-41064ab0d4e2 +md""" +# 4. Toolbox for hard problems +""" + +# ╔═║ 79372f18-6cd3-4fa8-a847-1d0d676ad29f +md""" +## Greedy algorithms +""" + +# ╔═║ d9eab403-ac57-4dc7-b3eb-75463ad555db +md""" +## Relaxation / simplification +""" + +# ╔═║ f3199889-eb95-44be-ab98-828272f2bb73 +md""" +## Repair +""" + +# ╔═║ 60e444b5-1928-46ae-831b-8408b9a04fd0 +md""" +## Local search (hill climbing) +""" + +# ╔═║ 2336a8cc-43fa-459c-96a5-57878d58b113 +md""" +Once you have a feasible solution, you can improve it iteratively through [local search](https://en.wikipedia.org/wiki/Local_search_(optimization)): at each iteration, + +1. Define a set of neighbor solutions by making small changes to the current one +2. Pick one of the neighbors according to some objective +""" + +# ╔═║ f69050d0-df95-4f29-858e-46bbc7252745 +md""" +## Metaheuristics +""" + +# ╔═║ e7d83aca-2b42-4747-99b9-9648b74d6718 +md""" +In many situations, always picking the best neighbor quickly traps the search at a local optimum. +Several strategies have been designed to enhance exploration, mostly thanks to randomness. +These strategies take a local search heuristic and tweak it, which is why they are called [metaheuristics](https://en.wikipedia.org/wiki/Metaheuristic). +The most famous ones are probably [simulated annealing](https://en.wikipedia.org/wiki/Simulated_annealing) and evolutionary / generic algorithms. +""" + +# ╔═║ 3d2673e1-d1af-44d3-8441-7825504102be +md""" +# References +""" + +# ╔═║ 7eb7606b-2f65-41c8-a510-6e40f4c306cf +md""" +**Books** + +- Korte, B., and Vygen, J. (2006), *[Combinatorial Optimization: Theory and Algorithms](https://www.mathematik.uni-muenchen.de/~kpanagio/KombOpt/book.pdf)* +- Cormen, T. H., Leiserson, C. E., Rivest, R. L., and Stein, C. (2009), *[Introduction to Algorithms](https://edutechlearners.com/download/Introduction_to_algorithms-3rd%20Edition.pdf)* +- Cook, W. J. (2012), *[In Pursuit of the Traveling Salesman: Mathematics at the Limits of Computation](https://viterbik12.usc.edu/wp-content/uploads/2017/06/Carlsson-Pages-from-William_Cook_In_pursuit_of_the_traveling_salesman.pdf)* +- Bona, M. (2016), *[A Walk Through Combinatorics: An Introduction To Enumeration And Graph Theory](https://www.microlinkcolleges.net/elib/files/undergraduate/Mathematics/A%20Walk%20Through%20Combinatorics%20An%20Introduction%20to%20Enumeration%20and%20Graph%20Theory.pdf)* + +**Other** + +- [VisuAlgo](https://visualgo.net/en): Visualize many combinatorial algorithms with pseudocode indications and correctness proofs +- [WilliamFiset](https://www.youtube.com/channel/UCD8yeTczadqdARzQUp29PJw): A YouTube channel with a great series of short videos on graph theory +""" + +# ╔═║ 00000000-0000-0000-0000-000000000001 +PLUTO_PROJECT_TOML_CONTENTS = """ +[deps] +BenchmarkTools = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf" +DataStructures = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" +PlutoTeachingTools = "661c6b06-c737-4d37-b85c-46df65de6f69" +PlutoUI = "7f904dfe-b85e-4ff6-b463-dae2292396a8" +SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + +[compat] +BenchmarkTools = "~1.3.2" +DataStructures = "~0.18.13" +PlutoTeachingTools = "~0.2.5" +PlutoUI = "~0.7.48" +""" + +# ╔═║ 00000000-0000-0000-0000-000000000002 +PLUTO_MANIFEST_TOML_CONTENTS = """ +# This file is machine-generated - editing it directly is not advised + +julia_version = "1.8.2" +manifest_format = "2.0" +project_hash = "e1214ca6559f10c9284c988db8157654cf5b8a62" + +[[deps.AbstractPlutoDingetjes]] +deps = ["Pkg"] +git-tree-sha1 = "8eaf9f1b4921132a4cff3f36a1d9ba923b14a481" +uuid = "6e696c72-6542-2067-7265-42206c756150" +version = "1.1.4" + +[[deps.ArgTools]] +uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" +version = "1.1.1" + +[[deps.Artifacts]] +uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" + +[[deps.Base64]] +uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" + +[[deps.BenchmarkTools]] +deps = ["JSON", "Logging", "Printf", "Profile", "Statistics", "UUIDs"] +git-tree-sha1 = "d9a9701b899b30332bbcb3e1679c41cce81fb0e8" +uuid = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf" +version = "1.3.2" + +[[deps.CodeTracking]] +deps = ["InteractiveUtils", "UUIDs"] +git-tree-sha1 = "cc4bd91eba9cdbbb4df4746124c22c0832a460d6" +uuid = "da1fd8a2-8d9e-5ec2-8556-3022fb5608a2" +version = "1.1.1" + +[[deps.ColorTypes]] +deps = ["FixedPointNumbers", "Random"] +git-tree-sha1 = "eb7f0f8307f71fac7c606984ea5fb2817275d6e4" +uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f" +version = "0.11.4" + +[[deps.Compat]] +deps = ["Base64", "Dates", "DelimitedFiles", "Distributed", "InteractiveUtils", "LibGit2", "Libdl", "LinearAlgebra", "Markdown", "Mmap", "Pkg", "Printf", "REPL", "Random", "SHA", "Serialization", "SharedArrays", "Sockets", "SparseArrays", "Statistics", "Test", "UUIDs", "Unicode"] +git-tree-sha1 = "78bee250c6826e1cf805a88b7f1e86025275d208" +uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" +version = "3.46.0" + +[[deps.CompilerSupportLibraries_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" +version = "0.5.2+0" + +[[deps.DataStructures]] +deps = ["Compat", "InteractiveUtils", "OrderedCollections"] +git-tree-sha1 = "d1fff3a548102f48987a52a2e0d114fa97d730f0" +uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" +version = "0.18.13" + +[[deps.Dates]] +deps = ["Printf"] +uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" + +[[deps.DelimitedFiles]] +deps = ["Mmap"] +uuid = "8bb1440f-4735-579b-a4ab-409b98df4dab" + +[[deps.Distributed]] +deps = ["Random", "Serialization", "Sockets"] +uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" + +[[deps.Downloads]] +deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] +uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" +version = "1.6.0" + +[[deps.FileWatching]] +uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" + +[[deps.FixedPointNumbers]] +deps = ["Statistics"] +git-tree-sha1 = "335bfdceacc84c5cdf16aadc768aa5ddfc5383cc" +uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" +version = "0.8.4" + +[[deps.Formatting]] +deps = ["Printf"] +git-tree-sha1 = "8339d61043228fdd3eb658d86c926cb282ae72a8" +uuid = "59287772-0a20-5a39-b81b-1366585eb4c0" +version = "0.4.2" + +[[deps.Hyperscript]] +deps = ["Test"] +git-tree-sha1 = "8d511d5b81240fc8e6802386302675bdf47737b9" +uuid = "47d2ed2b-36de-50cf-bf87-49c2cf4b8b91" +version = "0.0.4" + +[[deps.HypertextLiteral]] +deps = ["Tricks"] +git-tree-sha1 = "c47c5fa4c5308f27ccaac35504858d8914e102f9" +uuid = "ac1192a8-f4b3-4bfe-ba22-af5b92cd3ab2" +version = "0.9.4" + +[[deps.IOCapture]] +deps = ["Logging", "Random"] +git-tree-sha1 = "f7be53659ab06ddc986428d3a9dcc95f6fa6705a" +uuid = "b5f81e59-6552-4d32-b1f0-c071b021bf89" +version = "0.2.2" + +[[deps.InteractiveUtils]] +deps = ["Markdown"] +uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" + +[[deps.JSON]] +deps = ["Dates", "Mmap", "Parsers", "Unicode"] +git-tree-sha1 = "3c837543ddb02250ef42f4738347454f95079d4e" +uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" +version = "0.21.3" + +[[deps.JuliaInterpreter]] +deps = ["CodeTracking", "InteractiveUtils", "Random", "UUIDs"] +git-tree-sha1 = "0f960b1404abb0b244c1ece579a0ec78d056a5d1" +uuid = "aa1ae85d-cabe-5617-a682-6adf51b2e16a" +version = "0.9.15" + +[[deps.LaTeXStrings]] +git-tree-sha1 = "f2355693d6778a178ade15952b7ac47a4ff97996" +uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" +version = "1.3.0" + +[[deps.Latexify]] +deps = ["Formatting", "InteractiveUtils", "LaTeXStrings", "MacroTools", "Markdown", "OrderedCollections", "Printf", "Requires"] +git-tree-sha1 = "ab9aa169d2160129beb241cb2750ca499b4e90e9" +uuid = "23fbe1c1-3f47-55db-b15f-69d7ec21a316" +version = "0.15.17" + +[[deps.LibCURL]] +deps = ["LibCURL_jll", "MozillaCACerts_jll"] +uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" +version = "0.6.3" + +[[deps.LibCURL_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] +uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" +version = "7.84.0+0" + +[[deps.LibGit2]] +deps = ["Base64", "NetworkOptions", "Printf", "SHA"] +uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" + +[[deps.LibSSH2_jll]] +deps = ["Artifacts", "Libdl", "MbedTLS_jll"] +uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" +version = "1.10.2+0" + +[[deps.Libdl]] +uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" + +[[deps.LinearAlgebra]] +deps = ["Libdl", "libblastrampoline_jll"] +uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + +[[deps.Logging]] +uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" + +[[deps.LoweredCodeUtils]] +deps = ["JuliaInterpreter"] +git-tree-sha1 = "dedbebe234e06e1ddad435f5c6f4b85cd8ce55f7" +uuid = "6f1432cf-f94c-5a45-995e-cdbf5db27b0b" +version = "2.2.2" + +[[deps.MIMEs]] +git-tree-sha1 = "65f28ad4b594aebe22157d6fac869786a255b7eb" +uuid = "6c6e2e6c-3030-632d-7369-2d6c69616d65" +version = "0.1.4" + +[[deps.MacroTools]] +deps = ["Markdown", "Random"] +git-tree-sha1 = "42324d08725e200c23d4dfb549e0d5d89dede2d2" +uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" +version = "0.5.10" + +[[deps.Markdown]] +deps = ["Base64"] +uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" + +[[deps.MbedTLS_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" +version = "2.28.0+0" + +[[deps.Mmap]] +uuid = "a63ad114-7e13-5084-954f-fe012c677804" + +[[deps.MozillaCACerts_jll]] +uuid = "14a3606d-f60d-562e-9121-12d972cd8159" +version = "2022.2.1" + +[[deps.NetworkOptions]] +uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" +version = "1.2.0" + +[[deps.OpenBLAS_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] +uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" +version = "0.3.20+0" + +[[deps.OrderedCollections]] +git-tree-sha1 = "85f8e6578bf1f9ee0d11e7bb1b1456435479d47c" +uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" +version = "1.4.1" + +[[deps.Parsers]] +deps = ["Dates", "SnoopPrecompile"] +git-tree-sha1 = "cceb0257b662528ecdf0b4b4302eb00e767b38e7" +uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" +version = "2.5.0" + +[[deps.Pkg]] +deps = ["Artifacts", "Dates", "Downloads", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] +uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" +version = "1.8.0" + +[[deps.PlutoHooks]] +deps = ["InteractiveUtils", "Markdown", "UUIDs"] +git-tree-sha1 = "072cdf20c9b0507fdd977d7d246d90030609674b" +uuid = "0ff47ea0-7a50-410d-8455-4348d5de0774" +version = "0.0.5" + +[[deps.PlutoLinks]] +deps = ["FileWatching", "InteractiveUtils", "Markdown", "PlutoHooks", "Revise", "UUIDs"] +git-tree-sha1 = "8f5fa7056e6dcfb23ac5211de38e6c03f6367794" +uuid = "0ff47ea0-7a50-410d-8455-4348d5de0420" +version = "0.1.6" + +[[deps.PlutoTeachingTools]] +deps = ["Downloads", "HypertextLiteral", "LaTeXStrings", "Latexify", "Markdown", "PlutoLinks", "PlutoUI", "Random"] +git-tree-sha1 = "ea3e4ac2e49e3438815f8946fa7673b658e35bdb" +uuid = "661c6b06-c737-4d37-b85c-46df65de6f69" +version = "0.2.5" + +[[deps.PlutoUI]] +deps = ["AbstractPlutoDingetjes", "Base64", "ColorTypes", "Dates", "FixedPointNumbers", "Hyperscript", "HypertextLiteral", "IOCapture", "InteractiveUtils", "JSON", "Logging", "MIMEs", "Markdown", "Random", "Reexport", "URIs", "UUIDs"] +git-tree-sha1 = "efc140104e6d0ae3e7e30d56c98c4a927154d684" +uuid = "7f904dfe-b85e-4ff6-b463-dae2292396a8" +version = "0.7.48" + +[[deps.Printf]] +deps = ["Unicode"] +uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" + +[[deps.Profile]] +deps = ["Printf"] +uuid = "9abbd945-dff8-562f-b5e8-e1ebf5ef1b79" + +[[deps.REPL]] +deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] +uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" + +[[deps.Random]] +deps = ["SHA", "Serialization"] +uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" + +[[deps.Reexport]] +git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" +uuid = "189a3867-3050-52da-a836-e630ba90ab69" +version = "1.2.2" + +[[deps.Requires]] +deps = ["UUIDs"] +git-tree-sha1 = "838a3a4188e2ded87a4f9f184b4b0d78a1e91cb7" +uuid = "ae029012-a4dd-5104-9daa-d747884805df" +version = "1.3.0" + +[[deps.Revise]] +deps = ["CodeTracking", "Distributed", "FileWatching", "JuliaInterpreter", "LibGit2", "LoweredCodeUtils", "OrderedCollections", "Pkg", "REPL", "Requires", "UUIDs", "Unicode"] +git-tree-sha1 = "dad726963ecea2d8a81e26286f625aee09a91b7c" +uuid = "295af30f-e4ad-537b-8983-00126c2a3abe" +version = "3.4.0" + +[[deps.SHA]] +uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" +version = "0.7.0" + +[[deps.Serialization]] +uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" + +[[deps.SharedArrays]] +deps = ["Distributed", "Mmap", "Random", "Serialization"] +uuid = "1a1011a3-84de-559e-8e89-a11a2f7dc383" + +[[deps.SnoopPrecompile]] +git-tree-sha1 = "f604441450a3c0569830946e5b33b78c928e1a85" +uuid = "66db9d55-30c0-4569-8b51-7e840670fc0c" +version = "1.0.1" + +[[deps.Sockets]] +uuid = "6462fe0b-24de-5631-8697-dd941f90decc" + +[[deps.SparseArrays]] +deps = ["LinearAlgebra", "Random"] +uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + +[[deps.Statistics]] +deps = ["LinearAlgebra", "SparseArrays"] +uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" + +[[deps.TOML]] +deps = ["Dates"] +uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" +version = "1.0.0" + +[[deps.Tar]] +deps = ["ArgTools", "SHA"] +uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" +version = "1.10.1" + +[[deps.Test]] +deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] +uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[[deps.Tricks]] +git-tree-sha1 = "6bac775f2d42a611cdfcd1fb217ee719630c4175" +uuid = "410a4b4d-49e4-4fbc-ab6d-cb71b17b3775" +version = "0.1.6" + +[[deps.URIs]] +git-tree-sha1 = "e59ecc5a41b000fa94423a578d29290c7266fc10" +uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" +version = "1.4.0" + +[[deps.UUIDs]] +deps = ["Random", "SHA"] +uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" + +[[deps.Unicode]] +uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" + +[[deps.Zlib_jll]] +deps = ["Libdl"] +uuid = "83775a58-1f1d-513f-b197-d71354ab007a" +version = "1.2.12+3" + +[[deps.libblastrampoline_jll]] +deps = ["Artifacts", "Libdl", "OpenBLAS_jll"] +uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" +version = "5.1.1+0" + +[[deps.nghttp2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" +version = "1.48.0+0" + +[[deps.p7zip_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" +version = "17.4.0+0" +""" + +# ╔═║ Cell order: +# ╠═510bdffa-6367-11ed-23ca-9d49e3f3543f +# ╠═66106324-994f-4751-8a1e-0b307380bd11 +# β•Ÿβ”€683da7e5-2794-4766-a026-cb55bd23690f +# β•Ÿβ”€63c6ffc0-17cb-4732-9fae-b7eb233f8fdc +# β•Ÿβ”€4799ca44-7847-41cc-a101-f8ce5c4f255e +# β•Ÿβ”€823205a4-170a-4b69-bce4-3ce39d17d469 +# β•Ÿβ”€bec05993-17de-4121-af30-2ae15956c6e1 +# β•Ÿβ”€86d3573e-5ea3-4fd3-a0a9-32e8dd946cc4 +# β•Ÿβ”€c6310180-499a-4dd1-bda3-8d86f791c1b0 +# β•Ÿβ”€5230069e-a2aa-40fe-a2e5-aceefe6b6635 +# β•Ÿβ”€abc30a8b-b728-4936-a9b3-cdbf210a265d +# ╠═755b8709-4a86-4b79-a61c-605ba8ecdd8b +# β•Ÿβ”€789c7a0a-870d-4fdb-a11d-4ab314cbbce9 +# β•Ÿβ”€1c6fd34c-80c7-4b8f-b9fb-9ac1aa74db04 +# ╠═981d2bc0-3030-4d4a-a2c3-ae6c3819838d +# ╠═1de57dcb-85c0-44c0-b225-f81194ffea06 +# ╠═caa8f63c-ec6c-45c4-9f23-c853bce3a929 +# ╠═c4d83106-f940-4c69-bb95-8effe7e8bd50 +# β•Ÿβ”€dbeda7e3-ce02-49c2-93b1-1e2e712c9c09 +# β•Ÿβ”€f4fc6854-a44d-4bfd-88bd-a3b9eaf95332 +# β•Ÿβ”€055d49e6-8b2e-462d-abe3-bf3c5c97f61c +# ╠═24722797-ae00-4066-8838-43e9eb4b5ee3 +# ╠═95df5658-24d0-440d-b157-e4cf54c11d1a +# ╠═3931bfba-cb35-487d-a798-923e8ee454d2 +# ╠═57f66ed6-b4aa-4ab0-9eaa-02f12983594a +# ╠═570f7368-5464-4817-8040-f95dddf8da05 +# β•Ÿβ”€de48b3f3-3cba-45b9-b0ef-eb7cfbb2c7aa +# ╠═669c587c-c877-4e9e-a934-2850c4208147 +# ╠═55252064-0f58-44ac-a836-981a6cd8227a +# ╠═a1bde286-3806-4203-a461-81fb6c595492 +# ╠═f775760a-1311-4060-a347-aa2d631be0e4 +# ╠═643c4cd5-6a96-4859-8a91-142946c880e4 +# ╠═caba823b-2cb8-4760-9d18-31ab7a065d82 +# β•Ÿβ”€db189e71-79af-48d4-bd94-6c30bef943a3 +# β•Ÿβ”€971fe1f5-7b9c-477c-9a0e-dd1a574487e5 +# ╠═8ad780bf-0a3c-4fff-8a5c-154a576ee45a +# ╠═33609b23-0e1d-411d-a950-fbc964727fe7 +# ╠═49639fa6-5e65-47ec-ba47-51717e73827c +# ╠═ae582e38-7b70-4ae2-bb98-ec43a24f4bfd +# ╠═04a938be-c786-42c1-bcdd-45d8e714adcd +# β•Ÿβ”€37c5bb0b-6fca-45fc-9c3d-8806bf1c2ee6 +# ╠═71c5d9e4-2785-406c-8c6d-3d88a541b0f0 +# ╠═6fb680c3-986c-4fd4-b6b3-5164eb73cc30 +# ╠═66f24701-1556-4881-a1fb-6f0e41165adf +# ╠═03c46a8e-a10a-4754-8136-421927f8d911 +# ╠═3ac9e1f0-15aa-4d51-8449-130755ce16b1 +# β•Ÿβ”€778d9984-f09e-4b65-8b6d-07323dc0e39c +# β•Ÿβ”€abb0457d-4201-41df-957e-6d1d18fd29a1 +# ╠═2c7772f2-e12a-4c9f-aede-19620d6fa03a +# ╠═0633e202-4ebf-4fdf-b0e9-581b075510fc +# ╠═15cd794b-598c-4066-ae1f-2dd3e40c7eff +# ╠═44642265-f22f-4b55-ba31-a5979f386b30 +# ╠═47850682-5d83-4cd2-bf9b-4dcbffc999bb +# β•Ÿβ”€232739d5-f984-4679-a7bb-09f9066df9bf +# β•Ÿβ”€8cf9e88b-ad56-4e9e-93b4-61c99f5fe00a +# ╠═e35d80c1-043b-4152-b005-c579f2c1557d +# ╠═1f8b678c-dbb5-4155-806c-fd072846bf56 +# ╠═0e48f9d6-04e9-4d88-9949-43066c31d0c2 +# ╠═5ca4bfab-13a5-4455-92cf-289ebfbb61a9 +# ╠═c4c2597b-08a5-4806-aeb2-a083ce6db5be +# β•Ÿβ”€d99f2290-bd32-4737-b2c2-e33c679be313 +# ╠═e9d703a4-de01-4417-a9ef-464d29149937 +# ╠═52a26992-2ea7-404b-bf18-299fabfa8038 +# ╠═417566e9-b377-4e2a-811c-84b019f7e157 +# ╠═f8daa411-9ec2-4789-adf9-d3a3017d9a78 +# ╠═e8a84b3b-bb63-4aec-9c9d-3e6657d15703 +# β•Ÿβ”€fd13066b-35f0-4c5c-91fe-fbacbfdb6bb7 +# β•Ÿβ”€652eb695-e549-417d-8085-65d8276dd479 +# β•Ÿβ”€0d5d033a-5410-4717-8c15-e9723b39e603 +# β•Ÿβ”€1ddf887d-1597-46b1-b883-bf7a969d71bd +# β•Ÿβ”€9a7f16ba-0c9a-481f-880d-7b34be5b8f3f +# β•Ÿβ”€24a4e090-9a99-4764-bf94-23baca78f9a8 +# β•Ÿβ”€42f019c0-6e8b-4f02-91e2-c7d1de6cc822 +# β•Ÿβ”€b663ae74-24b6-47f1-ae59-cb988f7ba796 +# β•Ÿβ”€3d5a8f4b-26de-425c-8f57-365bf87f0393 +# β•Ÿβ”€e173413a-4f4d-4004-abcd-a662dbd59b37 +# β•Ÿβ”€89b98e6c-9a7d-4bd4-9524-977bb0b91086 +# β•Ÿβ”€7bf9221a-26a8-41f5-8c9e-a3c5de948f3e +# β•Ÿβ”€4b36ed7c-4fd9-41b2-a87d-48c740c5afa3 +# β•Ÿβ”€06f4116d-7032-4822-b52e-2926192c9da8 +# β•Ÿβ”€5ad847d0-9968-42a6-9bcc-41064ab0d4e2 +# β•Ÿβ”€79372f18-6cd3-4fa8-a847-1d0d676ad29f +# β•Ÿβ”€d9eab403-ac57-4dc7-b3eb-75463ad555db +# β•Ÿβ”€f3199889-eb95-44be-ab98-828272f2bb73 +# β•Ÿβ”€60e444b5-1928-46ae-831b-8408b9a04fd0 +# β•Ÿβ”€2336a8cc-43fa-459c-96a5-57878d58b113 +# β•Ÿβ”€f69050d0-df95-4f29-858e-46bbc7252745 +# β•Ÿβ”€e7d83aca-2b42-4747-99b9-9648b74d6718 +# β•Ÿβ”€3d2673e1-d1af-44d3-8441-7825504102be +# β•Ÿβ”€7eb7606b-2f65-41c8-a510-6e40f4c306cf +# β•Ÿβ”€00000000-0000-0000-0000-000000000001 +# β•Ÿβ”€00000000-0000-0000-0000-000000000002 diff --git a/notebooks_old/gdalle/linear_programming.jl b/notebooks_old/gdalle/linear_programming.jl new file mode 100644 index 0000000..e3d3da9 --- /dev/null +++ b/notebooks_old/gdalle/linear_programming.jl @@ -0,0 +1,1970 @@ +### A Pluto.jl notebook ### +# v0.19.16 + +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 + +# ╔═║ 7b87b7c8-6442-11ed-371a-87f5a11b2fab +begin + using HiGHS + using JuMP + using LaTeXStrings + using LinearAlgebra + using Plots + using PlutoTeachingTools + using PlutoUI + using Polyhedra +end + +# ╔═║ 4249a0c2-a780-4422-9e9b-b6799dd8efa5 +TableOfContents() + +# ╔═║ bea5deba-2a27-4a69-aaf8-400c4dc04675 +html"" + +# ╔═║ c61fcac0-ad63-49b6-8abd-dd274dbda898 +md""" +# Linear Programming +""" + +# ╔═║ 6821789e-761c-4a19-bbb2-42afd0456bc5 +md""" +In this notebook, we present an optimization framework which encompasses numerous questions of huge practical interest. +We also demonstrate the use of [JuMP.jl](https://github.com/jump-dev/JuMP.jl) to model and solve such optimization problems. +""" + +# ╔═║ 7335dcd2-bbef-464f-b88a-ad7d2a3c01da +md""" +# 1. Problem zoo +""" + +# ╔═║ 9e8cb5f5-6def-40db-bfd8-7e4693fcce25 +md""" +## Optimization vocabulary +""" + +# ╔═║ 9cbf2977-a5de-4e4a-b5c8-1e9e1c156704 +md""" +An optimization problem is formulated as +```math +\min_x ~ f(x) \quad \text{s.t.} \quad x \in \mathcal{X} \tag{P} +``` +- "s.t." means "subject to" +- ``x`` is the decision variable +- ``\mathcal{X}`` is the set of feasible solutions +- ``x \in \mathcal{X}`` is the constraint +- ``f(x)`` is the objective / cost function +""" + +# ╔═║ cf5e0bb0-46ab-4d62-b30a-3a1c6b110924 +md""" +Solving the problem means finding + +- the optimal value $\mathrm{val}(P)$ +- an optimal solution $x^* \in \mathrm{argmin}\{f(x): x \in \mathcal{X}\}$ + +Instance of a problem = one particular input with its numerical values. +""" + +# ╔═║ eafd6112-50e1-41ca-a8ef-d70ff9b923a4 +md""" +## Formulating optimization problems +""" + +# ╔═║ d8ddc081-595f-4ffe-8a79-1aca945fe14e +md""" +**Knapsack** +""" + +# ╔═║ 8308c1c0-a1f3-4d2d-a63c-431744e49f81 +md""" +Set of $I$ items with value $v_i$ and a weight $w_i$. Maximize the value while keeping the total weight under $W$ + +- Decision variable: $x_i = 1$ if we put item $i$ in the bag, $0$ otherwise +- Objective function: total value $\sum_{i=1}^{I} v_i x_i$ +- Constraint: total weight bound $\sum_{i=1}^{I} w_i x_i \leq W$ + +This is an Integer Linear Program: + +```math +\min_{x \in \mathbb{R}^I} \sum_{i=1}^{I} v_i x_i \quad \text{s.t.} \quad \begin{cases} x_i \in \{0, 1\} ~ \forall i \in [I] \\ \sum_{i=1}^{I} w_i x_i \leq W \end{cases} +``` +""" + +# ╔═║ 1be613ed-6dbf-4a1f-969c-b18317918cd9 +md""" +**Bin packing** +""" + +# ╔═║ 7acb80e5-52ce-4f4a-8f25-eab05a6bce3f +md""" +**Coloring** +""" + +# ╔═║ a4a4db0c-3b3a-49f0-8358-2dea09957ccd +md""" +Train platforming problem: trains as graph vertices, incompatibilities as edges + +Given a graph $G = (V, E)$, assign a color to each vertex so that no two adjacent vertices share the same color. We have $C$ colors in total + +- Decision variable: + - ``x_v \in [C]`` is the color of the vertex $\implies$ constraint programming model, not linear + - ``x_{v, c} = 1`` if vertex $v$ gets color $c$ + - ``y_c = 1`` if the color $c$ is used, and $0$ otherwise, i.e. $y_c = \max\{x_{v, c}: v \in V\}$ +- Objective function: number of colors... $\sum_{c=1}^{C} y_c$ +- Constraints: + - For all vertices $u$ and $v$ such that $(u, v) \in E$, for all colors $c$, we impose $x_{u, v} + x_{v, c} \leq 1$ + - For all colors $c$, we impose $\frac{1}{\lvert V \rvert} \sum_{v \in V} x_{v, c} \leq y_c$ and for all $v \in V$, $y_c \leq x_{v, c}$ +""" + +# ╔═║ fdeccf04-b336-481e-bde3-c29138f1f824 +md""" +**Shortest path** +""" + +# ╔═║ da436d05-8ba3-410e-a00b-5dbf29795771 +md""" +**Network flow** +""" + +# ╔═║ b408eed8-0533-4e68-82c9-9c037a840b4b +md""" +**Quadratic assignment** +""" + +# ╔═║ 5423ae84-54f7-4685-b130-08cb938c3e56 +md""" +# 2. Theoretical background +""" + +# ╔═║ 560d047c-ae49-43ba-bd82-7bb9cc4504c9 +md""" +## Polyhedra +""" + +# ╔═║ 67dacadf-59be-46bf-9ab0-86f2e193e11e +md""" +A polyhedron $\mathcal{P} = \{x \in \mathbb{R}^d: Ax \leq b\}$ is a finite intersection of closed half-spaces: +```math +\mathcal{P} = \bigcap_{i \in [m]} \{x \in \mathbb{R}^d: a_i x \leq b_i\} +``` +""" + +# ╔═║ 0f8afcba-a835-4c5d-a538-891f3585b2a4 +m_choice = md""" +m = $(@bind m Slider(1:20, default=10, show_value=true)) +""" + +# ╔═║ 130f58cb-86c3-4f56-9f7d-07fe74ef8988 +legend_choice = md""" + legend = $(@bind display_legend CheckBox(true)) + """ + +# ╔═║ 4985e6b2-5def-416e-8616-87e7052834ee +random_A, random_b = randn(m, 2), ones(m); + +# ╔═║ 471d1b01-8bb7-4b4e-aab0-a4b2726c9bf6 +let + half_spaces = [HalfSpace(Vector(aα΅’), bα΅’) for (aα΅’, bα΅’) in zip(eachrow(random_A), random_b)]; + P = polyhedron(intersect(half_spaces...)); + square = polyhedron(convexhull([-2., -2.], [-2., 2.], [2., -2], [2., 2.])) + plot(xlim=(-2, 2), ylim=(-2, 2), aspect_ratio=:equal,) + plot!(Float64[], Float64[], color=:blue, label="hyperplanes") + for (aα΅’, bα΅’) in zip(eachrow(random_A), random_b) + plot!( + [-2, 2], + [-2aα΅’[1]-bα΅’, 2aα΅’[1]-bα΅’] ./ (-aα΅’[2]), + color=:blue, label=nothing + ) + end + plot!(intersect(P, square), ratio=:equal, color=:blue, alpha=0.3, label="polyhedron") + plot!(title="Intersection of $m half-spaces", legend=display_legend) +end + +# ╔═║ f18f72d7-79c8-41ac-ba54-db0021773d70 +md""" +The Minkowski-Weyl theorem gives another possible representation of a polyhedron: every bounded polyhedron can be expressed as the convex hull of its extreme points, or vertices. +""" + +# ╔═║ 9a86b424-5799-418f-98bc-302a3474ebab +n_choice = md""" +``n = `` $(@bind n Slider(1:20, default=10, show_value=true)) +""" + +# ╔═║ 009fd841-932f-4c13-853b-577c04d462c2 +legend_choice + +# ╔═║ 520dabd5-edef-4356-b0c3-0809dcbfe32c +random_points = [randn(2) for k = 1:n]; + +# ╔═║ 5d7d7a26-1ac6-460d-84c7-423d828c8640 +let + P = polyhedron(convexhull(random_points...)); + removevredundancy!(P) + plot(aspect_ratio=:equal) + scatter!( + first.(random_points), + last.(random_points), + ratio=:equal, color=:blue, label="points" + ) + plot!(P, color=:blue, alpha=0.3, label="polyhedron") + plot!(title="Convex hull of $n points", legend=display_legend) +end + +# ╔═║ 911e5476-c6a6-4b9c-887f-cfc86a790c06 +md""" +The second representation is more informative, but unfortunately the number of vertices grows exponentially with the dimension. +""" + +# ╔═║ d8c97227-d897-4b35-83a4-04befa9a9200 +md""" +``d = `` $(@bind nb_dimensions Slider(1:10, default=2, show_value=true)) +""" + +# ╔═║ c0f3355a-b68f-448d-b885-04ba6f9cba06 +let + a_vals, b_vals = [randn(nb_dimensions) for k = 1:20], ones(20) + half_spaces = [HalfSpace(a, b) for (a, b) in zip(a_vals, b_vals)]; + P = polyhedron(intersect(half_spaces...)); + md""" + A random polyhedron with 20 constraints in **dimension $nb_dimensions** has **$(npoints(P)) vertices**. + """ +end + +# ╔═║ 4d6745e1-f61d-4ffe-b637-4cf1e9055ef0 +md""" +## Linear Programs +""" + +# ╔═║ 588c18f2-ee3b-495d-b71c-d9987fcf286f +md""" +The optimization problem $(\mathrm{P})$ is called a Linear Program (LP) if: +1. The objective $f(x) = c^\top x$ is linear +2. The feasible set $\mathcal{X} = \{x \in \mathbb{R}^d: Ax \leq b\}$ is a _polyhedron_ +""" + +# ╔═║ b6eb9f03-d9df-40d2-8dd4-b6818bfcd18f +md""" +### The simplex algorithm +""" + +# ╔═║ 0cc01ce5-3f94-4bc0-9c21-0b78a189d584 +md""" +If an LP has an optimal solution, then at least one of the vertices of the polyhedron is also an optimal solution. +""" + +# ╔═║ f4497538-926b-4469-bb73-01215dcfedd3 +n_choice + +# ╔═║ 18785e7c-79a9-4b2d-914a-f88f93c3e096 +legend_choice + +# ╔═║ 2e0a8059-5021-48e5-91bc-1061ac4692dd +theta_choice = md""" +``\theta = `` $(@bind angle Slider(0:360, default=180, show_value=true)) +""" + +# ╔═║ 6719c6a0-a12b-481a-8698-561d73d5a80d +let + plot(aspect_ratio=:equal) + + P = polyhedron(convexhull(random_points...)); + removevredundancy!(P) + plot!(P, ratio=:equal, color=:blue, alpha=0.3, label="polyhedron") + + c = 0.5 * [cosd(angle), sind(angle)] + plot!([0, c[1]], [0, c[2]], color=:black, lw=2, arrow=true, label=L"objective $-c$") + + real_vertices = collect(points(P)) + scatter!( + first.(real_vertices), + last.(real_vertices), + ratio=:equal, color=:blue, label="vertices" + ) + + optimum = real_vertices[argmax([dot(c, cand) for cand in real_vertices])] + scatter!( + [optimum[1]], [optimum[2]], + color=:red, markershape=:square, markersize=5, label="optimum" + ) + + plot!(title="Solving a Linear Program", legend=display_legend) +end + +# ╔═║ c52707fa-e636-42eb-8374-184783afb310 +md""" +The [simplex algorithm](https://en.wikipedia.org/wiki/Simplex_algorithm) for LPs jumps between neighboring polyhedron vertices until the objective can no longer be improved. +Although its worst-case complexity is exponential, it is extremely fast on average. + +[Interior point methods](https://en.wikipedia.org/wiki/Interior-point_method) are another class of algorithm for LPs with polynomial worst-case complexity. +In other words, LPs are easy to solve both in theory and in practice. +""" + +# ╔═║ 3e1520af-f119-4620-8d28-baa29cc88c6a +md""" +## Integer Linear Programs +""" + +# ╔═║ ddc30da9-2b66-4c66-b32c-f6513134199f +md""" +The optimization problem $(\mathrm{P})$ is called an Integer Linear Program (ILP) if: +1. The objective $f(x) = c^\top x$ is linear +2. The feasible set $\mathcal{X} = \{x \in \mathbb{Z}^d: Ax \leq b\}$ is the intersection of a polyhedron with the integer lattice +""" + +# ╔═║ c2c93acc-3464-448f-a289-fc3459ca654b +n_choice + +# ╔═║ f0bdf06d-41bc-4d60-b773-c6de357dd025 +legend_choice + +# ╔═║ 8032f005-c043-4180-ab58-78e7df9fc85a +theta_choice + +# ╔═║ 7a77dec7-2df3-4ac1-96ff-c7aba714fb60 +scale_choice = md""" +scale = $(@bind scale Slider(1:6; default=3, show_value=true)) +""" + +# ╔═║ 20941d80-614a-40e9-9a90-7931fc076d49 +let + plot(aspect_ratio=:equal) + + P = polyhedron(convexhull(scale .* random_points...)); + removevredundancy!(P) + plot!(P, color=:blue, alpha=0.3, label="polyhedron") + + real_vertices = collect(points(P)) + + xmin = minimum(first, real_vertices) + xmax = maximum(first, real_vertices) + ymin = minimum(last, real_vertices) + ymax = maximum(last, real_vertices) + + c = 0.5 * scale * [cosd(angle), sind(angle)] + plot!([0., c[1]], [0., c[2]], color=:black, lw=2, arrow=true, label=L"objective $-c$") + + integer_points = Vector{Float64}[] + for x in floor(Int, xmin):ceil(Int, xmax) + for y in floor(Int, ymin):ceil(Int, ymax) + point = [x, y] + if point in P + push!(integer_points, point) + end + end + end + + if !isempty(integer_points) + scatter!( + first.(integer_points), + last.(integer_points), + ratio=:equal, color=:blue, label="integer points" + ) + + optimum = integer_points[argmax([dot(c, cand) for cand in integer_points])] + scatter!( + [optimum[1]], [optimum[2]], + color=:red, markershape=:square, markersize=5, label="optimum" + ) + end + + plot!(title="Solving an Integer Linear Program", legend=display_legend) +end + +# ╔═║ 9545e44c-3451-4b98-98fa-22621ab04974 +md""" +Unlike LPs, ILPs are not easy to solve in theory: they are NP-hard, which means it is likely that no polynomial algorithm exists. +""" + +# ╔═║ 2860aec8-77a9-4f50-bb66-88f54615fb63 +md""" +### The notion of relaxation +""" + +# ╔═║ 5da62499-8f00-4424-9fde-e260b551291c +md""" +To every ILP +```math +\min_x c^\top x \quad \text{s.t.} \quad x \in \mathbb{Z}^d \text{ and } Ax \leq b \tag{ILP} +``` +we can associate a continuous relaxation +```math +\min_x c^\top x \quad \text{s.t.} \quad x \in \mathbb{R}^d \text{ and } Ax \leq b \tag{LP} +``` +where the integrality constraints are removed. +It is much faster to solve and provides a lower bound on the value of the original problem: +```math +\mathrm{val}(\mathrm{LP}) \leq \mathrm{val}(\mathrm{ILP}) +``` +""" + +# ╔═║ ad833a42-52ca-4c7a-a79b-a80aac1c4fd1 +md""" +### The Branch & Bound algorithm +""" + +# ╔═║ 9337cc5c-47b2-4429-928c-adc74997aacc +md""" +The [Branch & Bound](https://en.wikipedia.org/wiki/Branch_and_bound) algorithm for ILPs enumerates integer solutions during an arborescent search. +To avoid exploring the full tree, it splits the initial polyhedron into smaller ones, using continuous relaxations to compute bounds and prune useless branches. +Its success depends heavily on the quality of the relaxation (how close it is to the original problem). +""" + +# ╔═║ 3b7279a2-fedb-40f4-88de-360d9ba762ec +md""" +### Total unimodularity +""" + +# ╔═║ d1e89f1c-b76e-4443-876c-4fd162677125 +md""" +For some problem structures, it just happens that the polyhedron vertices all have integer components. +In that case, the ILP and its continuous relaxations are equivalent, which is very good news in terms of complexity. +No need to use Branch & Bound, a simplex will be enough! + +A sufficient condition for this to happen is [total unimodularity](https://en.wikipedia.org/wiki/Unimodular_matrix#Total_unimodularity) of the constraint matrix $A$. +The following types of constraints display this kind of behavior: +- shortest path +- network flow +- matching +- spanning tree +""" + +# ╔═║ 7433d1d8-3c9b-44b8-9d78-4392ea08739f +md""" +## Key takeaways + +!!! danger "In theory" + - Linear Programs are easy to solve + - Most Integer Linear Programs are hard to solve + - Some ILPs are easy to solve thanks to special structure +""" + +# ╔═║ ebb7978d-7e5c-4692-99c1-2df75c8cc301 +md""" +!!! info "In practice" + - Commercial solvers can tackle very large ILPs, out of the box or with some additional work by the user (e.g. decomposition methods). + - Oftentimes an approximate solution (e.g. from a heuristic) is more than enough +""" + +# ╔═║ 1bfb3dd8-4a50-4a89-b9bc-19126de7f095 +md""" +# 3. The JuMP.jl ecosystem +""" + +# ╔═║ 79e62b31-920a-4e3b-af2c-acdf0919a569 +md""" +JuMP.jl is a modeling language that provides a common interface to many different mathematical optimization solvers. +It helps you write models easily by providing a syntax that is close to the mathematical formulation but standard enough for solvers to use it. +The package [documentation](https://jump.dev/) is a very useful read. +""" + +# ╔═║ 7b16eb29-0034-47d9-a5d0-30de5943fbeb +md""" +## A simple example +""" + +# ╔═║ a54b93ca-48f1-49b2-af34-a1d8d7f7c415 +md""" +To tackle an (I)LP using JuMP.jl, we first have to initialize the model and define which solver will be used. +We then add variables, constraints and an objective (in any order). + +Since this is Pluto, we need to create and modify the model in a single cell to avoid confusing its cell dependency tracker. +""" + +# ╔═║ 0afb035d-da9b-4d36-a7db-bedd10a3dbbb +integer_variables_choice = md""" +integer variables = $(@bind integer_variables CheckBox()) +""" + +# ╔═║ f66442b9-18da-4917-8536-8403f13d8b59 +simple_model = let + model = Model() + + @variable(model, x >= 0) + @variable(model, y >= 0) + + @constraint(model, -x + y <= 2) + @constraint(model, 8x + 2y <= 17) + + @objective(model, Max, 5.5x + 2.1y) + + if integer_variables + set_integer(x) + set_integer(y) + end + + set_optimizer(model, HiGHS.Optimizer) + set_silent(model) + optimize!(model) + + model +end; + +# ╔═║ 8b3bcac2-7942-4749-9dd2-d930687cf407 +simple_model + +# ╔═║ dddb8989-7e6b-4e3c-9748-604034d26409 +Print(simple_model) + +# ╔═║ 5f29131d-ba5e-4bbd-af6e-e02eab7f39c4 +termination_status(simple_model) + +# ╔═║ 4a5dad31-466a-4ec6-a2e9-e81f2471aa26 +value(simple_model[:x]), value(simple_model[:y]) + +# ╔═║ a6fd3819-2fd4-4e65-8b48-e01d83baea88 +legend_choice + +# ╔═║ 4f897915-9045-42f3-bbc7-44efbf5d5522 +integer_variables_choice + +# ╔═║ 3092ff36-abc2-4702-8977-06ec23565a44 +let + plot( + polyhedron(simple_model), + aspect_ratio=:equal, + color=:blue, alpha=0.3, label="feasible set" + ) + plot!( + 0.2 .* [0, objective_function(simple_model).terms[simple_model[:x]]], + 0.2 .* [0, objective_function(simple_model).terms[simple_model[:y]]], + arrow=true, color=:black, lw=2, label=L"objective $c$" + ) + scatter!( + [value(simple_model[:x])], + [value(simple_model[:y])], + color=:red, markershape=:square, markersize=5, label="optimum" + ) + plot!(title="Plotting a JuMP model and its solution", legend=display_legend) +end + +# ╔═║ b4082060-e48c-49e4-bf42-8f1d3664afd0 +md""" +## The role of macros +""" + +# ╔═║ 968401ab-7763-4dd0-b45b-1ec916ba2b13 +md""" +In the model above, variables, constraints and objectives are added with macros. +This is an illustration of [metaprogramming](https://docs.julialang.org/en/v1/manual/metaprogramming/): using Julia to interact with your code itself. +This [tutorial](https://en.wikibooks.org/wiki/Introducing_Julia/Metaprogramming) is perhaps clearer than the official docs. +""" + +# ╔═║ ff17fdb2-da29-48dc-9ca3-02d87d7053cb +md""" +### Looking under the hood +""" + +# ╔═║ e0477bbd-c279-4fb9-8420-df4c9a7e74df +md""" +You have already encountered macros before. +Let's take a look at what they do with `@macroexpand`. +""" + +# ╔═║ b42c5e0d-b5f4-4687-8bc8-8a3777a645be +@assert 1 == 2 + +# ╔═║ e937dfae-9506-4684-b3fa-f621a2d72afd +@macroexpand @assert 1 == 2 + +# ╔═║ 1c752a29-c431-4c8f-bafe-a091008e8f40 +@show exp(1) + +# ╔═║ 6f4b8552-9f61-4156-838a-053b53d87725 +@macroexpand @show exp(1) + +# ╔═║ 5b412b36-ff71-4789-b7aa-402581838b92 +@elapsed exp(1) + +# ╔═║ fffb66f7-e917-4747-abcc-9f02a9a98e6d +@macroexpand @elapsed exp(1) + +# ╔═║ a8f80d4f-428f-4a37-97bb-0b0d78afad27 +md""" +### Expressions +""" + +# ╔═║ 06592404-aa03-411f-98f9-c9d4ec521063 +md""" +Expressions are an intermediate representation of Julia syntax that is parsed but not executed. +An expression can be created with `:(...)` or with `quote; ...; end`. +""" + +# ╔═║ 20d68b54-5c6d-4ba3-bd2a-1b71c4c31b66 +let + ex = :(1 + 2) + ex, eval(ex) +end + +# ╔═║ af560292-243e-4bea-907d-e8bb4658093b +md""" +Julia expressions are stored as trees. +""" + +# ╔═║ 6e84c401-2c73-4193-ae2f-27a6530a6aca +let + ex = :(a * b + c / d) + dump(ex) +end + +# ╔═║ 14314c03-3fd7-40bf-9f5e-8c2c640628ee +md""" +### Why macros? +""" + +# ╔═║ 99f141e0-6eec-48b9-9bff-f55a5c77b3d7 +md""" +Macros are nothing but functions that take arguments and generate expressions based on them. +They are necessary because their output is generated before runtime, which gives it the same status as run of the mill code that you could write. + +In the case of JuMP.jl, macros save the user a lot of boilerplate. +""" + +# ╔═║ 76a742b0-842f-441a-bb42-6fbc3f5488d2 +let + model = Model() + @macroexpand @variable(model, x) +end + +# ╔═║ 67337333-4ac9-4708-bf61-80b9fee557d2 +let + model = Model() + @variable(model, x) + @macroexpand @constraint(model, x >= 0) +end + +# ╔═║ 47be698b-c86b-4997-9ce7-8fdec47d49f7 +md""" +But in general macros make it possible to do things that would be impossible with plain functions. +For instance, `@show` displays both the expression and the result of evaluating it, which requires interacting with the code itself (a function cannot do that). +""" + +# ╔═║ 65f2cdb7-80ff-43cf-82cb-9106d26627b1 +md""" +## A more advanced example +""" + +# ╔═║ a7e23cfe-5604-4b29-ac5f-0f8ca750e34b +md""" +### Network flow with JuMP.jl and Graphs.jl +""" + +# ╔═║ 415c49e2-b972-4764-a24b-87856cdf3a6b +md""" +See [GraphsOptim.jl](https://github.com/gdalle/GraphsOptim.jl). +""" + +# ╔═║ 4f12214b-25ff-4947-ba1e-75b768c73c0d +md""" +### The flow polytope +""" + +# ╔═║ e97e0b7e-d95d-430d-b0bb-8fda6b0dcc90 +md""" +# References + +- Boyd, S. and Vandenberghe, L. (2004), *[Convex optimization](https://web.stanford.edu/~boyd/cvxbook/bv_cvxbook.pdf)* +- Matousek, I. and GΓ€rtner, B. (2007), *[Understanding and using Linear Programming](https://blogs.epfl.ch/extrema/documents/Maison%2020.05.10.pdf)* +- Williams, H. P. (2013), *[Model building in mathematical programming](https://www.researchgate.net/file.PostFileLoader.html?id=546b5d0bd685cc9e2b8b45d4&assetKey=AS:273636437495809@1442251418466)* +- Conforti, M., CornuΓ©jols, G. and Zambelli, G. (2014), *[Integer programming](https://solab.kaist.ac.kr/files/IP/IP2017/2014_Integer%20Prog_Conforti-Cornuejols-Zambelli.pdf)* +- Kochenderfer, M. J. and Wheeler, T. A. (2019), *[Algorithms for optimization](https://algorithmsbook.com/optimization/)* +- Kochenderfer, M. J., Wheeler, T. A. and Wray, K. H. (2022), *[Algorithms for decision-making](https://algorithmsbook.com/)* +""" + +# ╔═║ 00000000-0000-0000-0000-000000000001 +PLUTO_PROJECT_TOML_CONTENTS = """ +[deps] +HiGHS = "87dc4568-4c63-4d18-b0c0-bb2238e4078b" +JuMP = "4076af6c-e467-56ae-b986-b466b2749572" +LaTeXStrings = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" +LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" +Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" +PlutoTeachingTools = "661c6b06-c737-4d37-b85c-46df65de6f69" +PlutoUI = "7f904dfe-b85e-4ff6-b463-dae2292396a8" +Polyhedra = "67491407-f73d-577b-9b50-8179a7c68029" + +[compat] +HiGHS = "~1.2.0" +JuMP = "~1.4.0" +LaTeXStrings = "~1.3.0" +Plots = "~1.36.1" +PlutoTeachingTools = "~0.2.5" +PlutoUI = "~0.7.48" +Polyhedra = "~0.7.5" +""" + +# ╔═║ 00000000-0000-0000-0000-000000000002 +PLUTO_MANIFEST_TOML_CONTENTS = """ +# This file is machine-generated - editing it directly is not advised + +julia_version = "1.8.3" +manifest_format = "2.0" +project_hash = "1436da2614f78dc0d3475123a6ef51084c5bb010" + +[[deps.AbstractPlutoDingetjes]] +deps = ["Pkg"] +git-tree-sha1 = "8eaf9f1b4921132a4cff3f36a1d9ba923b14a481" +uuid = "6e696c72-6542-2067-7265-42206c756150" +version = "1.1.4" + +[[deps.Adapt]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "195c5505521008abea5aee4f96930717958eac6f" +uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" +version = "3.4.0" + +[[deps.ArgTools]] +uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" +version = "1.1.1" + +[[deps.Artifacts]] +uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" + +[[deps.Base64]] +uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" + +[[deps.BenchmarkTools]] +deps = ["JSON", "Logging", "Printf", "Profile", "Statistics", "UUIDs"] +git-tree-sha1 = "d9a9701b899b30332bbcb3e1679c41cce81fb0e8" +uuid = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf" +version = "1.3.2" + +[[deps.BitFlags]] +git-tree-sha1 = "629c6e4a7be8f427d268cebef2a5e3de6c50d462" +uuid = "d1d4a3ce-64b1-5f1a-9ba4-7e7e69966f35" +version = "0.1.6" + +[[deps.Bzip2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "19a35467a82e236ff51bc17a3a44b69ef35185a2" +uuid = "6e34b625-4abd-537c-b88f-471c36dfa7a0" +version = "1.0.8+0" + +[[deps.Cairo_jll]] +deps = ["Artifacts", "Bzip2_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.ChainRulesCore]] +deps = ["Compat", "LinearAlgebra", "SparseArrays"] +git-tree-sha1 = "e7ff6cadf743c098e08fca25c91103ee4303c9bb" +uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" +version = "1.15.6" + +[[deps.ChangesOfVariables]] +deps = ["ChainRulesCore", "LinearAlgebra", "Test"] +git-tree-sha1 = "38f7a08f19d8810338d4f5085211c7dfa5d5bdd8" +uuid = "9e997f8a-9a97-42d5-a9f1-ce6bfc15e2c0" +version = "0.1.4" + +[[deps.CodeTracking]] +deps = ["InteractiveUtils", "UUIDs"] +git-tree-sha1 = "cc4bd91eba9cdbbb4df4746124c22c0832a460d6" +uuid = "da1fd8a2-8d9e-5ec2-8556-3022fb5608a2" +version = "1.1.1" + +[[deps.CodecBzip2]] +deps = ["Bzip2_jll", "Libdl", "TranscodingStreams"] +git-tree-sha1 = "2e62a725210ce3c3c2e1a3080190e7ca491f18d7" +uuid = "523fee87-0ab8-5b00-afb7-3ecf72e48cfd" +version = "0.7.2" + +[[deps.CodecZlib]] +deps = ["TranscodingStreams", "Zlib_jll"] +git-tree-sha1 = "ded953804d019afa9a3f98981d99b33e3db7b6da" +uuid = "944b1d66-785c-5afd-91f1-9de20f533193" +version = "0.7.0" + +[[deps.ColorSchemes]] +deps = ["ColorTypes", "ColorVectorSpace", "Colors", "FixedPointNumbers", "Random"] +git-tree-sha1 = "1fd869cc3875b57347f7027521f561cf46d1fcd8" +uuid = "35d6a980-a343-548e-a6ea-1d62b119f2f4" +version = "3.19.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", "SpecialFunctions", "Statistics", "TensorCore"] +git-tree-sha1 = "d08c20eef1f2cbc6e60fd3612ac4340b89fea322" +uuid = "c3611d14-8923-5661-9e6a-0046d554d3a4" +version = "0.9.9" + +[[deps.Colors]] +deps = ["ColorTypes", "FixedPointNumbers", "Reexport"] +git-tree-sha1 = "417b0ed7b8b838aa6ca0a87aadf1bb9eb111ce40" +uuid = "5ae59095-9a9b-59fe-a467-6f913c188581" +version = "0.12.8" + +[[deps.CommonSubexpressions]] +deps = ["MacroTools", "Test"] +git-tree-sha1 = "7b8a93dba8af7e3b42fecabf646260105ac373f7" +uuid = "bbf7d656-a473-5ed7-a52c-81e309532950" +version = "0.3.0" + +[[deps.Compat]] +deps = ["Dates", "LinearAlgebra", "UUIDs"] +git-tree-sha1 = "3ca828fe1b75fa84b021a7860bd039eaea84d2f2" +uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" +version = "4.3.0" + +[[deps.CompilerSupportLibraries_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" +version = "0.5.2+0" + +[[deps.Contour]] +git-tree-sha1 = "d05d9e7b7aedff4e5b51a029dced05cfb6125781" +uuid = "d38c429a-6771-53c6-b99e-75d170b6e991" +version = "0.6.2" + +[[deps.DataAPI]] +git-tree-sha1 = "e08915633fcb3ea83bf9d6126292e5bc5c739922" +uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a" +version = "1.13.0" + +[[deps.DataStructures]] +deps = ["Compat", "InteractiveUtils", "OrderedCollections"] +git-tree-sha1 = "d1fff3a548102f48987a52a2e0d114fa97d730f0" +uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" +version = "0.18.13" + +[[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.DelimitedFiles]] +deps = ["Mmap"] +uuid = "8bb1440f-4735-579b-a4ab-409b98df4dab" + +[[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 = "c5b6685d53f933c11404a3ae9822afe30d522494" +uuid = "b552c78f-8df3-52c6-915a-8e097449b14b" +version = "1.12.2" + +[[deps.Distributed]] +deps = ["Random", "Serialization", "Sockets"] +uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" + +[[deps.DocStringExtensions]] +deps = ["LibGit2"] +git-tree-sha1 = "c36550cb29cbe373e95b3f40486b9a4148f89ffd" +uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" +version = "0.9.2" + +[[deps.Downloads]] +deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] +uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" +version = "1.6.0" + +[[deps.EarCut_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "e3290f2d49e661fbd94046d7e3726ffcb2d41053" +uuid = "5ae413db-bbd1-5e63-b57d-d24a61df00f5" +version = "2.2.4+0" + +[[deps.Expat_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "bad72f730e9e91c08d9427d5e8db95478a3c323d" +uuid = "2e619515-83b5-522b-bb60-26c02a35a201" +version = "2.4.8+0" + +[[deps.Extents]] +git-tree-sha1 = "5e1e4c53fa39afe63a7d356e30452249365fba99" +uuid = "411431e0-e8b7-467b-b5e0-f676ba4f2910" +version = "0.1.1" + +[[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", "Pkg", "Zlib_jll", "libaom_jll", "libass_jll", "libfdk_aac_jll", "libvorbis_jll", "x264_jll", "x265_jll"] +git-tree-sha1 = "74faea50c1d007c85837327f6775bea60b5492dd" +uuid = "b22a6f82-2f65-5046-a5b2-351ab43fb4e5" +version = "4.4.2+2" + +[[deps.FileWatching]] +uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" + +[[deps.FixedPointNumbers]] +deps = ["Statistics"] +git-tree-sha1 = "335bfdceacc84c5cdf16aadc768aa5ddfc5383cc" +uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" +version = "0.8.4" + +[[deps.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", "StaticArrays"] +git-tree-sha1 = "10fa12fe96e4d76acfa738f4df2126589a67374f" +uuid = "f6369f11-7733-5829-9624-2563aa707210" +version = "0.10.33" + +[[deps.FreeType2_jll]] +deps = ["Artifacts", "Bzip2_jll", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] +git-tree-sha1 = "87eb71354d8ec1a96d4a7636bd57a7347dde3ef9" +uuid = "d7e528f0-a631-5988-bf34-fe36492bcfd7" +version = "2.10.4+0" + +[[deps.FriBidi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "aa31987c2ba8704e23c6c8ba8a4f769d5d7e4f91" +uuid = "559328eb-81f9-559d-9380-de523a88c83c" +version = "1.0.10+0" + +[[deps.GLFW_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libglvnd_jll", "Pkg", "Xorg_libXcursor_jll", "Xorg_libXi_jll", "Xorg_libXinerama_jll", "Xorg_libXrandr_jll"] +git-tree-sha1 = "d972031d28c8c8d9d7b41a536ad7bb0c2579caca" +uuid = "0656b61e-2033-5cc2-a64a-77c0f6c09b89" +version = "3.3.8+0" + +[[deps.GR]] +deps = ["Base64", "DelimitedFiles", "GR_jll", "HTTP", "JSON", "Libdl", "LinearAlgebra", "Pkg", "Preferences", "Printf", "Random", "Serialization", "Sockets", "Test", "UUIDs"] +git-tree-sha1 = "00a9d4abadc05b9476e937a5557fcce476b9e547" +uuid = "28b8d3ca-fb5f-59d9-8090-bfdbd6d07a71" +version = "0.69.5" + +[[deps.GR_jll]] +deps = ["Artifacts", "Bzip2_jll", "Cairo_jll", "FFMPEG_jll", "Fontconfig_jll", "GLFW_jll", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Libtiff_jll", "Pixman_jll", "Pkg", "Qt5Base_jll", "Zlib_jll", "libpng_jll"] +git-tree-sha1 = "bc9f7725571ddb4ab2c4bc74fa397c1c5ad08943" +uuid = "d2c73de3-f751-5644-a686-071e5b155ba9" +version = "0.69.1+0" + +[[deps.GenericLinearAlgebra]] +deps = ["LinearAlgebra", "Printf", "Random", "libblastrampoline_jll"] +git-tree-sha1 = "3d58ea2e65e2b3b284e722a5131e4434ca10fa69" +uuid = "14197337-ba66-59df-a3e3-ca00e7dcff7a" +version = "0.3.4" + +[[deps.GeoInterface]] +deps = ["Extents"] +git-tree-sha1 = "fb28b5dc239d0174d7297310ef7b84a11804dfab" +uuid = "cf35fbd7-0cd7-5166-be24-54bfbe79505f" +version = "1.0.1" + +[[deps.GeometryBasics]] +deps = ["EarCut_jll", "GeoInterface", "IterTools", "LinearAlgebra", "StaticArrays", "StructArrays", "Tables"] +git-tree-sha1 = "12a584db96f1d460421d5fb8860822971cdb8455" +uuid = "5c1252a2-5f33-56bf-86c9-59e7332b4326" +version = "0.4.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", "Pkg", "Zlib_jll"] +git-tree-sha1 = "fb83fbe02fe57f2c068013aa94bcdf6760d3a7a7" +uuid = "7746bdde-850d-59dc-9ae8-88ece973131d" +version = "2.74.0+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.Grisu]] +git-tree-sha1 = "53bb909d1151e57e2484c3d1b53e19552b887fb2" +uuid = "42e2da0e-8278-4e71-bc24-59509adca0fe" +version = "1.0.2" + +[[deps.HTTP]] +deps = ["Base64", "CodecZlib", "Dates", "IniFile", "Logging", "LoggingExtras", "MbedTLS", "NetworkOptions", "OpenSSL", "Random", "SimpleBufferStream", "Sockets", "URIs", "UUIDs"] +git-tree-sha1 = "8c7e6b82abd41364b8ffe40ffc63b33e590c8722" +uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3" +version = "1.5.3" + +[[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.HiGHS]] +deps = ["HiGHS_jll", "MathOptInterface", "SparseArrays"] +git-tree-sha1 = "d40a9e8db6438481915261a378fc2c8ca70bb63a" +uuid = "87dc4568-4c63-4d18-b0c0-bb2238e4078b" +version = "1.2.0" + +[[deps.HiGHS_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "b3e24275666fcc2e24d1a58a9f02acd9d2e23d3a" +uuid = "8fd58aa0-07eb-5a78-9b36-339c94fd15ea" +version = "1.3.0+0" + +[[deps.Hyperscript]] +deps = ["Test"] +git-tree-sha1 = "8d511d5b81240fc8e6802386302675bdf47737b9" +uuid = "47d2ed2b-36de-50cf-bf87-49c2cf4b8b91" +version = "0.0.4" + +[[deps.HypertextLiteral]] +deps = ["Tricks"] +git-tree-sha1 = "c47c5fa4c5308f27ccaac35504858d8914e102f9" +uuid = "ac1192a8-f4b3-4bfe-ba22-af5b92cd3ab2" +version = "0.9.4" + +[[deps.IOCapture]] +deps = ["Logging", "Random"] +git-tree-sha1 = "f7be53659ab06ddc986428d3a9dcc95f6fa6705a" +uuid = "b5f81e59-6552-4d32-b1f0-c071b021bf89" +version = "0.2.2" + +[[deps.IniFile]] +git-tree-sha1 = "f550e6e32074c939295eb5ea6de31849ac2c9625" +uuid = "83e8ac13-25f8-5344-8a64-a9f2b223428f" +version = "0.5.1" + +[[deps.InteractiveUtils]] +deps = ["Markdown"] +uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" + +[[deps.InverseFunctions]] +deps = ["Test"] +git-tree-sha1 = "49510dfcb407e572524ba94aeae2fced1f3feb0f" +uuid = "3587e190-3f89-42d0-90ee-14403ec27112" +version = "0.1.8" + +[[deps.IrrationalConstants]] +git-tree-sha1 = "7fd44fd4ff43fc60815f8e764c0f352b83c49151" +uuid = "92d709cd-6900-40b7-9082-c6be49f344b6" +version = "0.1.1" + +[[deps.IterTools]] +git-tree-sha1 = "fa6287a4469f5e048d763df38279ee729fbd44e5" +uuid = "c8e1da08-722c-5040-9ed9-7db0dc04731e" +version = "1.4.0" + +[[deps.IteratorInterfaceExtensions]] +git-tree-sha1 = "a3f24677c21f5bbe9d2a714f95dcd58337fb2856" +uuid = "82899510-4779-5014-852e-03e436cf321d" +version = "1.0.0" + +[[deps.JLFzf]] +deps = ["Pipe", "REPL", "Random", "fzf_jll"] +git-tree-sha1 = "f377670cda23b6b7c1c0b3893e37451c5c1a2185" +uuid = "1019f520-868f-41f5-a6de-eb00f4b6a39c" +version = "0.1.5" + +[[deps.JLLWrappers]] +deps = ["Preferences"] +git-tree-sha1 = "abc9885a7ca2052a736a600f7fa66209f96506e1" +uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" +version = "1.4.1" + +[[deps.JSON]] +deps = ["Dates", "Mmap", "Parsers", "Unicode"] +git-tree-sha1 = "3c837543ddb02250ef42f4738347454f95079d4e" +uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" +version = "0.21.3" + +[[deps.JpegTurbo_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "b53380851c6e6664204efb2e62cd24fa5c47e4ba" +uuid = "aacddb02-875f-59d6-b918-886e6ef4fbf8" +version = "2.1.2+0" + +[[deps.JuMP]] +deps = ["LinearAlgebra", "MathOptInterface", "MutableArithmetics", "OrderedCollections", "Printf", "SparseArrays"] +git-tree-sha1 = "9a57156b97ed7821493c9c0a65f5b72710b38cf7" +uuid = "4076af6c-e467-56ae-b986-b466b2749572" +version = "1.4.0" + +[[deps.JuliaInterpreter]] +deps = ["CodeTracking", "InteractiveUtils", "Random", "UUIDs"] +git-tree-sha1 = "0f960b1404abb0b244c1ece579a0ec78d056a5d1" +uuid = "aa1ae85d-cabe-5617-a682-6adf51b2e16a" +version = "0.9.15" + +[[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.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 = "f2355693d6778a178ade15952b7ac47a4ff97996" +uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" +version = "1.3.0" + +[[deps.Latexify]] +deps = ["Formatting", "InteractiveUtils", "LaTeXStrings", "MacroTools", "Markdown", "OrderedCollections", "Printf", "Requires"] +git-tree-sha1 = "ab9aa169d2160129beb241cb2750ca499b4e90e9" +uuid = "23fbe1c1-3f47-55db-b15f-69d7ec21a316" +version = "0.15.17" + +[[deps.LibCURL]] +deps = ["LibCURL_jll", "MozillaCACerts_jll"] +uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" +version = "0.6.3" + +[[deps.LibCURL_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] +uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" +version = "7.84.0+0" + +[[deps.LibGit2]] +deps = ["Base64", "NetworkOptions", "Printf", "SHA"] +uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" + +[[deps.LibSSH2_jll]] +deps = ["Artifacts", "Libdl", "MbedTLS_jll"] +uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" +version = "1.10.2+0" + +[[deps.Libdl]] +uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" + +[[deps.Libffi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "0b4a5d71f3e5200a7dff793393e09dfc2d874290" +uuid = "e9f186c6-92d2-5b65-8a66-fee21dc1b490" +version = "3.2.2+1" + +[[deps.Libgcrypt_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgpg_error_jll", "Pkg"] +git-tree-sha1 = "64613c82a59c120435c067c2b809fc61cf5166ae" +uuid = "d4300ac3-e22c-5743-9152-c294e39db1e4" +version = "1.8.7+0" + +[[deps.Libglvnd_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll", "Xorg_libXext_jll"] +git-tree-sha1 = "7739f837d6447403596a75d19ed01fd08d6f56bf" +uuid = "7e76a0d4-f3c7-5321-8279-8d96eeed0f29" +version = "1.3.0+3" + +[[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", "Pkg"] +git-tree-sha1 = "42b62845d70a619f063a7da093d995ec8e15e778" +uuid = "94ce4f54-9a6c-5748-9c1c-f9c7231a4531" +version = "1.16.1+1" + +[[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", "Pkg", "Zlib_jll", "Zstd_jll"] +git-tree-sha1 = "3eb79b0ca5764d4799c06699573fd8f533259713" +uuid = "89763e89-9b03-5906-acba-b20f662cd828" +version = "4.4.0+0" + +[[deps.Libuuid_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "7f3efec06033682db852f8b3bc3c1d2b0a0ab066" +uuid = "38a345b3-de98-5d2b-a5d3-14cd9215e700" +version = "2.36.0+0" + +[[deps.LinearAlgebra]] +deps = ["Libdl", "libblastrampoline_jll"] +uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + +[[deps.LogExpFunctions]] +deps = ["ChainRulesCore", "ChangesOfVariables", "DocStringExtensions", "InverseFunctions", "IrrationalConstants", "LinearAlgebra"] +git-tree-sha1 = "94d9c52ca447e23eac0c0f074effbcd38830deb5" +uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688" +version = "0.3.18" + +[[deps.Logging]] +uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" + +[[deps.LoggingExtras]] +deps = ["Dates", "Logging"] +git-tree-sha1 = "5d4d2d9904227b8bd66386c1138cf4d5ffa826bf" +uuid = "e6f89c97-d47a-5376-807f-9c37f3926c36" +version = "0.4.9" + +[[deps.LoweredCodeUtils]] +deps = ["JuliaInterpreter"] +git-tree-sha1 = "dedbebe234e06e1ddad435f5c6f4b85cd8ce55f7" +uuid = "6f1432cf-f94c-5a45-995e-cdbf5db27b0b" +version = "2.2.2" + +[[deps.MIMEs]] +git-tree-sha1 = "65f28ad4b594aebe22157d6fac869786a255b7eb" +uuid = "6c6e2e6c-3030-632d-7369-2d6c69616d65" +version = "0.1.4" + +[[deps.MacroTools]] +deps = ["Markdown", "Random"] +git-tree-sha1 = "42324d08725e200c23d4dfb549e0d5d89dede2d2" +uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" +version = "0.5.10" + +[[deps.Markdown]] +deps = ["Base64"] +uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" + +[[deps.MathOptInterface]] +deps = ["BenchmarkTools", "CodecBzip2", "CodecZlib", "DataStructures", "ForwardDiff", "JSON", "LinearAlgebra", "MutableArithmetics", "NaNMath", "OrderedCollections", "Printf", "SparseArrays", "SpecialFunctions", "Test", "Unicode"] +git-tree-sha1 = "ceed48edffe0325a6e9ea00ecf3607af5089c413" +uuid = "b8f27783-ece8-5eb3-8dc8-9495eed66fee" +version = "1.9.0" + +[[deps.MbedTLS]] +deps = ["Dates", "MbedTLS_jll", "MozillaCACerts_jll", "Random", "Sockets"] +git-tree-sha1 = "03a9b9718f5682ecb107ac9f7308991db4ce395b" +uuid = "739be429-bea8-5141-9913-cc70e7f3736d" +version = "1.1.7" + +[[deps.MbedTLS_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" +version = "2.28.0+0" + +[[deps.Measures]] +git-tree-sha1 = "c13304c81eec1ed3af7fc20e75fb6b26092a1102" +uuid = "442fdcdd-2543-5da2-b0f3-8c86c306513e" +version = "0.3.2" + +[[deps.Missings]] +deps = ["DataAPI"] +git-tree-sha1 = "bf210ce90b6c9eed32d25dbcae1ebc565df2687f" +uuid = "e1d29d7a-bbdc-5cf2-9ac0-f12de2c33e28" +version = "1.0.2" + +[[deps.Mmap]] +uuid = "a63ad114-7e13-5084-954f-fe012c677804" + +[[deps.MozillaCACerts_jll]] +uuid = "14a3606d-f60d-562e-9121-12d972cd8159" +version = "2022.2.1" + +[[deps.MutableArithmetics]] +deps = ["LinearAlgebra", "SparseArrays", "Test"] +git-tree-sha1 = "1d57a7dc42d563ad6b5e95d7a8aebd550e5162c0" +uuid = "d8a4904e-b15c-11e9-3269-09a3773c0cb0" +version = "1.0.5" + +[[deps.NaNMath]] +deps = ["OpenLibm_jll"] +git-tree-sha1 = "a7c3d1da1189a1c2fe843a3bfa04d18d20eb3211" +uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" +version = "1.0.1" + +[[deps.NetworkOptions]] +uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" +version = "1.2.0" + +[[deps.Ogg_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "887579a3eb005446d514ab7aeac5d1d027658b8f" +uuid = "e7412a2a-1a6e-54c0-be00-318e2571c051" +version = "1.3.5+1" + +[[deps.OpenBLAS_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] +uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" +version = "0.3.20+0" + +[[deps.OpenLibm_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "05823500-19ac-5b8b-9628-191a04bc5112" +version = "0.8.1+0" + +[[deps.OpenSSL]] +deps = ["BitFlags", "Dates", "MozillaCACerts_jll", "OpenSSL_jll", "Sockets"] +git-tree-sha1 = "5628f092c6186a80484bfefdf89ff64efdaec552" +uuid = "4d8831e6-92b7-49fb-bdf8-b643e874388c" +version = "1.3.1" + +[[deps.OpenSSL_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "f6e9dba33f9f2c44e08a020b0caf6903be540004" +uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95" +version = "1.1.19+0" + +[[deps.OpenSpecFun_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "13652491f6856acfd2db29360e1bbcd4565d04f1" +uuid = "efe28fd5-8261-553b-a9e1-b2916fc3738e" +version = "0.5.5+0" + +[[deps.Opus_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "51a08fb14ec28da2ec7a927c4337e4332c2a4720" +uuid = "91d4177d-7536-5919-b921-800302f37372" +version = "1.3.2+0" + +[[deps.OrderedCollections]] +git-tree-sha1 = "85f8e6578bf1f9ee0d11e7bb1b1456435479d47c" +uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" +version = "1.4.1" + +[[deps.PCRE2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "efcefdf7-47ab-520b-bdef-62a2eaa19f15" +version = "10.40.0+0" + +[[deps.Parsers]] +deps = ["Dates", "SnoopPrecompile"] +git-tree-sha1 = "cceb0257b662528ecdf0b4b4302eb00e767b38e7" +uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" +version = "2.5.0" + +[[deps.Pipe]] +git-tree-sha1 = "6842804e7867b115ca9de748a0cf6b364523c16d" +uuid = "b98c9c47-44ae-5843-9183-064241ee97a0" +version = "1.3.0" + +[[deps.Pixman_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "b4f5d02549a10e20780a24fce72bea96b6329e29" +uuid = "30392449-352a-5448-841d-b1acce4e97dc" +version = "0.40.1+0" + +[[deps.Pkg]] +deps = ["Artifacts", "Dates", "Downloads", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] +uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" +version = "1.8.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", "Printf", "Random", "Reexport", "SnoopPrecompile", "Statistics"] +git-tree-sha1 = "21303256d239f6b484977314674aef4bb1fe4420" +uuid = "995b91a9-d308-5afd-9ec6-746e21dbc043" +version = "1.3.1" + +[[deps.Plots]] +deps = ["Base64", "Contour", "Dates", "Downloads", "FFMPEG", "FixedPointNumbers", "GR", "JLFzf", "JSON", "LaTeXStrings", "Latexify", "LinearAlgebra", "Measures", "NaNMath", "Pkg", "PlotThemes", "PlotUtils", "Printf", "REPL", "Random", "RecipesBase", "RecipesPipeline", "Reexport", "RelocatableFolders", "Requires", "Scratch", "Showoff", "SnoopPrecompile", "SparseArrays", "Statistics", "StatsBase", "UUIDs", "UnicodeFun", "Unzip"] +git-tree-sha1 = "47e70b391ff314cc36e7c2400f7d2c5455dc9496" +uuid = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" +version = "1.36.1" + +[[deps.PlutoHooks]] +deps = ["InteractiveUtils", "Markdown", "UUIDs"] +git-tree-sha1 = "072cdf20c9b0507fdd977d7d246d90030609674b" +uuid = "0ff47ea0-7a50-410d-8455-4348d5de0774" +version = "0.0.5" + +[[deps.PlutoLinks]] +deps = ["FileWatching", "InteractiveUtils", "Markdown", "PlutoHooks", "Revise", "UUIDs"] +git-tree-sha1 = "8f5fa7056e6dcfb23ac5211de38e6c03f6367794" +uuid = "0ff47ea0-7a50-410d-8455-4348d5de0420" +version = "0.1.6" + +[[deps.PlutoTeachingTools]] +deps = ["Downloads", "HypertextLiteral", "LaTeXStrings", "Latexify", "Markdown", "PlutoLinks", "PlutoUI", "Random"] +git-tree-sha1 = "ea3e4ac2e49e3438815f8946fa7673b658e35bdb" +uuid = "661c6b06-c737-4d37-b85c-46df65de6f69" +version = "0.2.5" + +[[deps.PlutoUI]] +deps = ["AbstractPlutoDingetjes", "Base64", "ColorTypes", "Dates", "FixedPointNumbers", "Hyperscript", "HypertextLiteral", "IOCapture", "InteractiveUtils", "JSON", "Logging", "MIMEs", "Markdown", "Random", "Reexport", "URIs", "UUIDs"] +git-tree-sha1 = "efc140104e6d0ae3e7e30d56c98c4a927154d684" +uuid = "7f904dfe-b85e-4ff6-b463-dae2292396a8" +version = "0.7.48" + +[[deps.Polyhedra]] +deps = ["GenericLinearAlgebra", "GeometryBasics", "JuMP", "LinearAlgebra", "MutableArithmetics", "RecipesBase", "SparseArrays", "StaticArrays"] +git-tree-sha1 = "d6aaf7dd794fdcd7896cfc98301f6ffe84a99f56" +uuid = "67491407-f73d-577b-9b50-8179a7c68029" +version = "0.7.5" + +[[deps.Preferences]] +deps = ["TOML"] +git-tree-sha1 = "47e5f437cc0e7ef2ce8406ce1e7e24d44915f88d" +uuid = "21216c6a-2e73-6563-6e65-726566657250" +version = "1.3.0" + +[[deps.Printf]] +deps = ["Unicode"] +uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" + +[[deps.Profile]] +deps = ["Printf"] +uuid = "9abbd945-dff8-562f-b5e8-e1ebf5ef1b79" + +[[deps.Qt5Base_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Fontconfig_jll", "Glib_jll", "JLLWrappers", "Libdl", "Libglvnd_jll", "OpenSSL_jll", "Pkg", "Xorg_libXext_jll", "Xorg_libxcb_jll", "Xorg_xcb_util_image_jll", "Xorg_xcb_util_keysyms_jll", "Xorg_xcb_util_renderutil_jll", "Xorg_xcb_util_wm_jll", "Zlib_jll", "xkbcommon_jll"] +git-tree-sha1 = "0c03844e2231e12fda4d0086fd7cbe4098ee8dc5" +uuid = "ea2cea3b-5b76-57ae-a6ef-0a8af62496e1" +version = "5.15.3+2" + +[[deps.REPL]] +deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] +uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" + +[[deps.Random]] +deps = ["SHA", "Serialization"] +uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" + +[[deps.RecipesBase]] +deps = ["SnoopPrecompile"] +git-tree-sha1 = "d12e612bba40d189cead6ff857ddb67bd2e6a387" +uuid = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" +version = "1.3.1" + +[[deps.RecipesPipeline]] +deps = ["Dates", "NaNMath", "PlotUtils", "RecipesBase", "SnoopPrecompile"] +git-tree-sha1 = "a030182cccc5c461386c6f055c36ab8449ef1340" +uuid = "01d81517-befc-4cb6-b9ec-a95719d0359c" +version = "0.6.10" + +[[deps.Reexport]] +git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" +uuid = "189a3867-3050-52da-a836-e630ba90ab69" +version = "1.2.2" + +[[deps.RelocatableFolders]] +deps = ["SHA", "Scratch"] +git-tree-sha1 = "90bc7a7c96410424509e4263e277e43250c05691" +uuid = "05181044-ff0b-4ac5-8273-598c1e38db00" +version = "1.0.0" + +[[deps.Requires]] +deps = ["UUIDs"] +git-tree-sha1 = "838a3a4188e2ded87a4f9f184b4b0d78a1e91cb7" +uuid = "ae029012-a4dd-5104-9daa-d747884805df" +version = "1.3.0" + +[[deps.Revise]] +deps = ["CodeTracking", "Distributed", "FileWatching", "JuliaInterpreter", "LibGit2", "LoweredCodeUtils", "OrderedCollections", "Pkg", "REPL", "Requires", "UUIDs", "Unicode"] +git-tree-sha1 = "dad726963ecea2d8a81e26286f625aee09a91b7c" +uuid = "295af30f-e4ad-537b-8983-00126c2a3abe" +version = "3.4.0" + +[[deps.SHA]] +uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" +version = "0.7.0" + +[[deps.Scratch]] +deps = ["Dates"] +git-tree-sha1 = "f94f779c94e58bf9ea243e77a37e16d9de9126bd" +uuid = "6c6a2e73-6563-6170-7368-637461726353" +version = "1.1.1" + +[[deps.Serialization]] +uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" + +[[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.SnoopPrecompile]] +git-tree-sha1 = "f604441450a3c0569830946e5b33b78c928e1a85" +uuid = "66db9d55-30c0-4569-8b51-7e840670fc0c" +version = "1.0.1" + +[[deps.Sockets]] +uuid = "6462fe0b-24de-5631-8697-dd941f90decc" + +[[deps.SortingAlgorithms]] +deps = ["DataStructures"] +git-tree-sha1 = "a4ada03f999bd01b3a25dcaa30b2d929fe537e00" +uuid = "a2af1166-a08f-5f64-846c-94a0d3cef48c" +version = "1.1.0" + +[[deps.SparseArrays]] +deps = ["LinearAlgebra", "Random"] +uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + +[[deps.SpecialFunctions]] +deps = ["ChainRulesCore", "IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"] +git-tree-sha1 = "d75bda01f8c31ebb72df80a46c88b25d1c79c56d" +uuid = "276daf66-3868-5448-9aa4-cd146d93841b" +version = "2.1.7" + +[[deps.StaticArrays]] +deps = ["LinearAlgebra", "Random", "StaticArraysCore", "Statistics"] +git-tree-sha1 = "f86b3a049e5d05227b10e15dbb315c5b90f14988" +uuid = "90137ffa-7385-5640-81b9-e52037218182" +version = "1.5.9" + +[[deps.StaticArraysCore]] +git-tree-sha1 = "6b7ba252635a5eff6a0b0664a41ee140a1c9e72a" +uuid = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" +version = "1.4.0" + +[[deps.Statistics]] +deps = ["LinearAlgebra", "SparseArrays"] +uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" + +[[deps.StatsAPI]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "f9af7f195fb13589dd2e2d57fdb401717d2eb1f6" +uuid = "82ae8749-77ed-4fe6-ae5f-f523153014b0" +version = "1.5.0" + +[[deps.StatsBase]] +deps = ["DataAPI", "DataStructures", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"] +git-tree-sha1 = "d1bf48bfcc554a3761a133fe3a9bb01488e06916" +uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" +version = "0.33.21" + +[[deps.StructArrays]] +deps = ["Adapt", "DataAPI", "StaticArraysCore", "Tables"] +git-tree-sha1 = "13237798b407150a6d2e2bce5d793d7d9576e99e" +uuid = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" +version = "0.6.13" + +[[deps.TOML]] +deps = ["Dates"] +uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" +version = "1.0.0" + +[[deps.TableTraits]] +deps = ["IteratorInterfaceExtensions"] +git-tree-sha1 = "c06b2f539df1c6efa794486abfb6ed2022561a39" +uuid = "3783bdb8-4a98-5b6b-af9a-565f29a5fe9c" +version = "1.0.1" + +[[deps.Tables]] +deps = ["DataAPI", "DataValueInterfaces", "IteratorInterfaceExtensions", "LinearAlgebra", "OrderedCollections", "TableTraits", "Test"] +git-tree-sha1 = "c79322d36826aa2f4fd8ecfa96ddb47b174ac78d" +uuid = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" +version = "1.10.0" + +[[deps.Tar]] +deps = ["ArgTools", "SHA"] +uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" +version = "1.10.1" + +[[deps.TensorCore]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "1feb45f88d133a655e001435632f019a9a1bcdb6" +uuid = "62fd8b95-f654-4bbd-a8a5-9c27f68ccd50" +version = "0.1.1" + +[[deps.Test]] +deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] +uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[[deps.TranscodingStreams]] +deps = ["Random", "Test"] +git-tree-sha1 = "8a75929dcd3c38611db2f8d08546decb514fcadf" +uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa" +version = "0.9.9" + +[[deps.Tricks]] +git-tree-sha1 = "6bac775f2d42a611cdfcd1fb217ee719630c4175" +uuid = "410a4b4d-49e4-4fbc-ab6d-cb71b17b3775" +version = "0.1.6" + +[[deps.URIs]] +git-tree-sha1 = "e59ecc5a41b000fa94423a578d29290c7266fc10" +uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" +version = "1.4.0" + +[[deps.UUIDs]] +deps = ["Random", "SHA"] +uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" + +[[deps.Unicode]] +uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" + +[[deps.UnicodeFun]] +deps = ["REPL"] +git-tree-sha1 = "53915e50200959667e78a92a418594b428dffddf" +uuid = "1cfade01-22cf-5700-b092-accc4b62d6e1" +version = "0.4.1" + +[[deps.Unzip]] +git-tree-sha1 = "ca0969166a028236229f63514992fc073799bb78" +uuid = "41fe7b60-77ed-43a1-b4f0-825fd5a5650d" +version = "0.2.0" + +[[deps.Wayland_jll]] +deps = ["Artifacts", "Expat_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Pkg", "XML2_jll"] +git-tree-sha1 = "3e61f0b86f90dacb0bc0e73a0c5a83f6a8636e23" +uuid = "a2964d1f-97da-50d4-b82a-358c7fce9d89" +version = "1.19.0+0" + +[[deps.Wayland_protocols_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "4528479aa01ee1b3b4cd0e6faef0e04cf16466da" +uuid = "2381bf8a-dfd0-557d-9999-79630e7b1b91" +version = "1.25.0+0" + +[[deps.XML2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Pkg", "Zlib_jll"] +git-tree-sha1 = "58443b63fb7e465a8a7210828c91c08b92132dff" +uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a" +version = "2.9.14+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.Xorg_libX11_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libxcb_jll", "Xorg_xtrans_jll"] +git-tree-sha1 = "5be649d550f3f4b95308bf0183b82e2582876527" +uuid = "4f6342f7-b3d2-589e-9d20-edeb45f2b2bc" +version = "1.6.9+4" + +[[deps.Xorg_libXau_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "4e490d5c960c314f33885790ed410ff3a94ce67e" +uuid = "0c0b7dd1-d40b-584c-a123-a41640f87eec" +version = "1.0.9+4" + +[[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", "Pkg"] +git-tree-sha1 = "4fe47bd2247248125c428978740e18a681372dd4" +uuid = "a3789734-cfe1-5b06-b2d0-1dd0d9d62d05" +version = "1.1.3+4" + +[[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", "Pkg"] +git-tree-sha1 = "6783737e45d3c59a4a4c4091f5f88cdcf0908cbb" +uuid = "14d82f49-176c-5ed1-bb49-ad3f5cbd8c74" +version = "0.1.0+3" + +[[deps.Xorg_libxcb_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "XSLT_jll", "Xorg_libXau_jll", "Xorg_libXdmcp_jll", "Xorg_libpthread_stubs_jll"] +git-tree-sha1 = "daf17f441228e7a3833846cd048892861cff16d6" +uuid = "c7cfdc94-dc32-55de-ac96-5a1b8d977c5b" +version = "1.13.0+3" + +[[deps.Xorg_libxkbfile_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll"] +git-tree-sha1 = "926af861744212db0eb001d9e40b5d16292080b2" +uuid = "cc61e674-0454-545c-8b26-ed2c68acab7a" +version = "1.1.0+4" + +[[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", "Pkg", "Xorg_libxkbfile_jll"] +git-tree-sha1 = "4bcbf660f6c2e714f87e960a171b119d06ee163b" +uuid = "35661453-b289-5fab-8a00-3d9160c6a3a4" +version = "1.4.2+4" + +[[deps.Xorg_xkeyboard_config_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xkbcomp_jll"] +git-tree-sha1 = "5c8424f8a67c3f2209646d4425f3d415fee5931d" +uuid = "33bec58e-1273-512f-9401-5d533626f822" +version = "2.27.0+4" + +[[deps.Xorg_xtrans_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "79c31e7844f6ecf779705fbc12146eb190b7d845" +uuid = "c5fb5394-a638-5e4d-96e5-b29de1b5cf10" +version = "1.4.0+3" + +[[deps.Zlib_jll]] +deps = ["Libdl"] +uuid = "83775a58-1f1d-513f-b197-d71354ab007a" +version = "1.2.12+3" + +[[deps.Zstd_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "e45044cd873ded54b6a5bac0eb5c971392cf1927" +uuid = "3161d3a3-bdf6-5164-811a-617609db77b4" +version = "1.5.2+0" + +[[deps.fzf_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "868e669ccb12ba16eaf50cb2957ee2ff61261c56" +uuid = "214eeab7-80f7-51ab-84ad-2988db7cef09" +version = "0.29.0+0" + +[[deps.libaom_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "3a2ea60308f0996d26f1e5354e10c24e9ef905d4" +uuid = "a4ae2306-e953-59d6-aa16-d00cac43593b" +version = "3.4.0+0" + +[[deps.libass_jll]] +deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] +git-tree-sha1 = "5982a94fcba20f02f42ace44b9894ee2b140fe47" +uuid = "0ac62f75-1d6f-5e53-bd7c-93b484bb37c0" +version = "0.15.1+0" + +[[deps.libblastrampoline_jll]] +deps = ["Artifacts", "Libdl", "OpenBLAS_jll"] +uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" +version = "5.1.1+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.libpng_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] +git-tree-sha1 = "94d180a6d2b5e55e447e2d27a29ed04fe79eb30c" +uuid = "b53b4c65-9356-5827-b1ea-8c7a1a84506f" +version = "1.6.38+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.nghttp2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" +version = "1.48.0+0" + +[[deps.p7zip_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" +version = "17.4.0+0" + +[[deps.x264_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "4fea590b89e6ec504593146bf8b988b2c00922b2" +uuid = "1270edf5-f2f9-52d2-97e9-ab00b5d0237a" +version = "2021.5.5+0" + +[[deps.x265_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "ee567a171cce03570d77ad3a43e90218e38937a9" +uuid = "dfaa095f-4041-5dcd-9319-2fabd8486b76" +version = "3.5.0+0" + +[[deps.xkbcommon_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Wayland_jll", "Wayland_protocols_jll", "Xorg_libxcb_jll", "Xorg_xkeyboard_config_jll"] +git-tree-sha1 = "9ebfc140cc56e8c2156a15ceac2f0302e327ac0a" +uuid = "d8fb68d0-12a3-5cfd-a85a-d49703b185fd" +version = "1.4.1+0" +""" + +# ╔═║ Cell order: +# ╠═7b87b7c8-6442-11ed-371a-87f5a11b2fab +# ╠═4249a0c2-a780-4422-9e9b-b6799dd8efa5 +# β•Ÿβ”€bea5deba-2a27-4a69-aaf8-400c4dc04675 +# β•Ÿβ”€c61fcac0-ad63-49b6-8abd-dd274dbda898 +# β•Ÿβ”€6821789e-761c-4a19-bbb2-42afd0456bc5 +# β•Ÿβ”€7335dcd2-bbef-464f-b88a-ad7d2a3c01da +# β•Ÿβ”€9e8cb5f5-6def-40db-bfd8-7e4693fcce25 +# β•Ÿβ”€9cbf2977-a5de-4e4a-b5c8-1e9e1c156704 +# β•Ÿβ”€cf5e0bb0-46ab-4d62-b30a-3a1c6b110924 +# β•Ÿβ”€eafd6112-50e1-41ca-a8ef-d70ff9b923a4 +# β•Ÿβ”€d8ddc081-595f-4ffe-8a79-1aca945fe14e +# β•Ÿβ”€8308c1c0-a1f3-4d2d-a63c-431744e49f81 +# β•Ÿβ”€1be613ed-6dbf-4a1f-969c-b18317918cd9 +# β•Ÿβ”€7acb80e5-52ce-4f4a-8f25-eab05a6bce3f +# β•Ÿβ”€a4a4db0c-3b3a-49f0-8358-2dea09957ccd +# β•Ÿβ”€fdeccf04-b336-481e-bde3-c29138f1f824 +# β•Ÿβ”€da436d05-8ba3-410e-a00b-5dbf29795771 +# β•Ÿβ”€b408eed8-0533-4e68-82c9-9c037a840b4b +# β•Ÿβ”€5423ae84-54f7-4685-b130-08cb938c3e56 +# β•Ÿβ”€560d047c-ae49-43ba-bd82-7bb9cc4504c9 +# β•Ÿβ”€67dacadf-59be-46bf-9ab0-86f2e193e11e +# β•Ÿβ”€0f8afcba-a835-4c5d-a538-891f3585b2a4 +# β•Ÿβ”€130f58cb-86c3-4f56-9f7d-07fe74ef8988 +# ╠═4985e6b2-5def-416e-8616-87e7052834ee +# β•Ÿβ”€471d1b01-8bb7-4b4e-aab0-a4b2726c9bf6 +# β•Ÿβ”€f18f72d7-79c8-41ac-ba54-db0021773d70 +# β•Ÿβ”€9a86b424-5799-418f-98bc-302a3474ebab +# β•Ÿβ”€009fd841-932f-4c13-853b-577c04d462c2 +# ╠═520dabd5-edef-4356-b0c3-0809dcbfe32c +# β•Ÿβ”€5d7d7a26-1ac6-460d-84c7-423d828c8640 +# β•Ÿβ”€911e5476-c6a6-4b9c-887f-cfc86a790c06 +# β•Ÿβ”€d8c97227-d897-4b35-83a4-04befa9a9200 +# β•Ÿβ”€c0f3355a-b68f-448d-b885-04ba6f9cba06 +# β•Ÿβ”€4d6745e1-f61d-4ffe-b637-4cf1e9055ef0 +# β•Ÿβ”€588c18f2-ee3b-495d-b71c-d9987fcf286f +# β•Ÿβ”€b6eb9f03-d9df-40d2-8dd4-b6818bfcd18f +# β•Ÿβ”€0cc01ce5-3f94-4bc0-9c21-0b78a189d584 +# β•Ÿβ”€f4497538-926b-4469-bb73-01215dcfedd3 +# β•Ÿβ”€18785e7c-79a9-4b2d-914a-f88f93c3e096 +# β•Ÿβ”€2e0a8059-5021-48e5-91bc-1061ac4692dd +# β•Ÿβ”€6719c6a0-a12b-481a-8698-561d73d5a80d +# β•Ÿβ”€c52707fa-e636-42eb-8374-184783afb310 +# β•Ÿβ”€3e1520af-f119-4620-8d28-baa29cc88c6a +# β•Ÿβ”€ddc30da9-2b66-4c66-b32c-f6513134199f +# β•Ÿβ”€c2c93acc-3464-448f-a289-fc3459ca654b +# β•Ÿβ”€f0bdf06d-41bc-4d60-b773-c6de357dd025 +# β•Ÿβ”€8032f005-c043-4180-ab58-78e7df9fc85a +# β•Ÿβ”€7a77dec7-2df3-4ac1-96ff-c7aba714fb60 +# β•Ÿβ”€20941d80-614a-40e9-9a90-7931fc076d49 +# β•Ÿβ”€9545e44c-3451-4b98-98fa-22621ab04974 +# β•Ÿβ”€2860aec8-77a9-4f50-bb66-88f54615fb63 +# β•Ÿβ”€5da62499-8f00-4424-9fde-e260b551291c +# β•Ÿβ”€ad833a42-52ca-4c7a-a79b-a80aac1c4fd1 +# β•Ÿβ”€9337cc5c-47b2-4429-928c-adc74997aacc +# β•Ÿβ”€3b7279a2-fedb-40f4-88de-360d9ba762ec +# β•Ÿβ”€d1e89f1c-b76e-4443-876c-4fd162677125 +# β•Ÿβ”€7433d1d8-3c9b-44b8-9d78-4392ea08739f +# β•Ÿβ”€ebb7978d-7e5c-4692-99c1-2df75c8cc301 +# β•Ÿβ”€1bfb3dd8-4a50-4a89-b9bc-19126de7f095 +# β•Ÿβ”€79e62b31-920a-4e3b-af2c-acdf0919a569 +# β•Ÿβ”€7b16eb29-0034-47d9-a5d0-30de5943fbeb +# β•Ÿβ”€a54b93ca-48f1-49b2-af34-a1d8d7f7c415 +# β•Ÿβ”€0afb035d-da9b-4d36-a7db-bedd10a3dbbb +# ╠═f66442b9-18da-4917-8536-8403f13d8b59 +# ╠═8b3bcac2-7942-4749-9dd2-d930687cf407 +# ╠═dddb8989-7e6b-4e3c-9748-604034d26409 +# ╠═5f29131d-ba5e-4bbd-af6e-e02eab7f39c4 +# ╠═4a5dad31-466a-4ec6-a2e9-e81f2471aa26 +# β•Ÿβ”€a6fd3819-2fd4-4e65-8b48-e01d83baea88 +# β•Ÿβ”€4f897915-9045-42f3-bbc7-44efbf5d5522 +# β•Ÿβ”€3092ff36-abc2-4702-8977-06ec23565a44 +# β•Ÿβ”€b4082060-e48c-49e4-bf42-8f1d3664afd0 +# β•Ÿβ”€968401ab-7763-4dd0-b45b-1ec916ba2b13 +# β•Ÿβ”€ff17fdb2-da29-48dc-9ca3-02d87d7053cb +# β•Ÿβ”€e0477bbd-c279-4fb9-8420-df4c9a7e74df +# ╠═b42c5e0d-b5f4-4687-8bc8-8a3777a645be +# ╠═e937dfae-9506-4684-b3fa-f621a2d72afd +# ╠═1c752a29-c431-4c8f-bafe-a091008e8f40 +# ╠═6f4b8552-9f61-4156-838a-053b53d87725 +# ╠═5b412b36-ff71-4789-b7aa-402581838b92 +# ╠═fffb66f7-e917-4747-abcc-9f02a9a98e6d +# β•Ÿβ”€a8f80d4f-428f-4a37-97bb-0b0d78afad27 +# β•Ÿβ”€06592404-aa03-411f-98f9-c9d4ec521063 +# ╠═20d68b54-5c6d-4ba3-bd2a-1b71c4c31b66 +# β•Ÿβ”€af560292-243e-4bea-907d-e8bb4658093b +# ╠═6e84c401-2c73-4193-ae2f-27a6530a6aca +# β•Ÿβ”€14314c03-3fd7-40bf-9f5e-8c2c640628ee +# β•Ÿβ”€99f141e0-6eec-48b9-9bff-f55a5c77b3d7 +# ╠═76a742b0-842f-441a-bb42-6fbc3f5488d2 +# ╠═67337333-4ac9-4708-bf61-80b9fee557d2 +# β•Ÿβ”€47be698b-c86b-4997-9ce7-8fdec47d49f7 +# β•Ÿβ”€65f2cdb7-80ff-43cf-82cb-9106d26627b1 +# β•Ÿβ”€a7e23cfe-5604-4b29-ac5f-0f8ca750e34b +# β•Ÿβ”€415c49e2-b972-4764-a24b-87856cdf3a6b +# β•Ÿβ”€4f12214b-25ff-4947-ba1e-75b768c73c0d +# β•Ÿβ”€e97e0b7e-d95d-430d-b0bb-8fda6b0dcc90 +# β•Ÿβ”€00000000-0000-0000-0000-000000000001 +# β•Ÿβ”€00000000-0000-0000-0000-000000000002 diff --git a/notebooks_old/gdalle/performance.jl b/notebooks_old/gdalle/performance.jl new file mode 100644 index 0000000..af3b49e --- /dev/null +++ b/notebooks_old/gdalle/performance.jl @@ -0,0 +1,744 @@ +### A Pluto.jl notebook ### +# v0.19.14 + +using Markdown +using InteractiveUtils + +# ╔═║ 80266caa-6066-11ed-0d4e-a3b81a95bc95 +begin + using BenchmarkTools + using JET + using PlutoUI + using PlutoTeachingTools + using ProfileCanvas + using ProgressLogging +end + +# ╔═║ fc5c6cb2-4d06-4922-90ca-553c562a6e16 +TableOfContents() + +# ╔═║ 9604dcf7-b58e-4af5-9ecd-5bd3199c785d +html"" + +# ╔═║ be066ed7-7bd5-4d46-ae2c-4fca40f1cffb +md""" +# Writing fast Julia code +""" + +# ╔═║ 3da3826b-b7bd-4a27-a17a-2a121c51a857 +md""" +# 1. Performance diagnosis +""" + +# ╔═║ 0fc7bece-72ec-4dc2-8205-0c588c4a856c +md""" +## Tracking loops +""" + +# ╔═║ fc67f478-87c0-44f2-8bbc-033ec5da5b3d +md""" +In long-running code, the best way to track loops is not a periodic `println(i)`. There are packages designed for this purpose, such as [ProgressMeter.jl](https://github.com/timholy/ProgressMeter.jl). +For a more high-level approach (that plays nicely with Pluto and VSCode), we can use the `@progress` macro of [ProgressLogging.jl](https://github.com/JuliaLogging/ProgressLogging.jl) instead. +""" + +# ╔═║ 28b66131-e901-4201-a9b7-fa99f203c7ca +@progress for i in 1:10 + sleep(0.2) +end + +# ╔═║ c64ea3e9-9d18-4668-97af-6aa1dd493433 +md""" +Julia also has a built-in [logging system](https://docs.julialang.org/en/v1/stdlib/Logging/). +""" + +# ╔═║ 55fbb2e5-baf9-4102-a709-d6a23606fdb1 +let + x = 2 + @info "It's all good" x + @warn "Be careful" x - 1 + @error "Something went wrong" x - 2 +end + +# ╔═║ 8a5d4d94-efef-4b8c-b505-f3e58df9b654 +md""" +## Benchmarking +""" + +# ╔═║ ced6a5f8-c16c-47ed-adb9-30d17b580e5e +md""" +To evaluate the efficiency of a function, we need to know how long it takes and how much memory it uses. Julia provides built-in macros for these tasks: +- `@elapsed` returns the computation time (in seconds) +- `@allocated` returns the allocated memory (in bytes) +- `@time` prints both (in the REPL!) and returns the function result + +However, the built-in macros have shortcomings: they only run the function once, and their measurements may be biased by the presence of global variables. +We can get a more accurate evaluation thanks to the macros `@belapsed`, `@ballocated` and `@btime` (or `@benchmark` for a graphical summary) from [BenchmarkTools.jl](https://github.com/JuliaCI/BenchmarkTools.jl). +When using BenchmarkTools.jl, it is important to [interpolate](https://juliaci.github.io/BenchmarkTools.jl/stable/manual/#Interpolating-values-into-benchmark-expressions) any external (especially global) variables with a dollar sign, so that they're evaluated at definition time. +""" + +# ╔═║ 0fd5ccd7-ffbb-4a4b-a76a-b7375951e605 +let + x = rand(100, 100) + @benchmark exp($x) +end + +# ╔═║ 553a93f4-0d1a-45db-8b56-83e071e3bb45 +md""" +## Profiling +""" + +# ╔═║ 47a2b694-f5d0-438c-afb2-f757c5ebaf62 +md""" +Profiling is more precise than benchmarking: it tells you how much time you spend _in each nested function call_. +Julia provides a sampling-based [profiler](https://docs.julialang.org/en/v1/manual/profile/), but it is hard to use without a good visualization. +We recommend using the [`@profview` macro](https://www.julia-vscode.org/docs/stable/userguide/profiler/) from the VSCode Julia extension (or from [ProfileCanvas.jl](https://github.com/pfitzseb/ProfileCanvas.jl) when you're working on a notebook). +However, there are many other options: see the [FlameGraphs.jl](https://github.com/timholy/FlameGraphs.jl) README for a list. + +A profiling "flame graph" represents the entire call stack, with each layer corresponding to a call depth. +The width of a tile is proportional to its execution time, but you can click on it to make it fill the whole window. +Note that the first few layers are usually boilerplate code, and we need to scroll down to reach user-defined functions, usually below a tile called `eval`. +""" + +# ╔═║ fa393444-2ea0-4da9-a38d-da2d7a7c045b +md""" +The tile colors in the flame graph have special meanings: +- blue $\implies$ everything is fine +- gray $\implies$ compilation overhead from the first function call (just run the profiling step a second time) +- red $\implies$ "runtime dispatch" flag, a sign of bad type inference (except in the first layers where it is normal) +- yellow $\implies$ "garbage collection" (GC) flag, a sign of excessive allocations +""" + +# ╔═║ c258b419-da92-41d8-a68a-24cebf3f01cd +md""" +## Flame graph examples +""" + +# ╔═║ b3af8f8c-9008-47bd-ae99-9340b02e8e59 +function matmul1(A, B) + m, p = size(A, 1), size(B, 2) + C = Matrix(undef, m, p) + for i = 1:m, j = 1:p + C[i, j] = sum(A[i, :] .* B[:, j]) + end + return C +end + +# ╔═║ 91fdeabc-211f-4e82-9a5b-64155872c530 +let + A, B = rand(200, 100), rand(100, 300) + @btime matmul1($A, $B) + @profview for _ in 1:10; matmul1(A, B); end +end + +# ╔═║ 1b8283b1-c5b7-4d86-a87e-8408d0938eb4 +function matmul2(A, B) + m, n, p = size(A, 1), size(A, 2), size(B, 2) + C = Matrix(undef, m, p) + for i = 1:m, j = 1:p + C[i, j] = 0 + for k in 1:n + C[i, j] += A[i, k] * B[k, j] + end + end + return C +end + +# ╔═║ efd77774-d93d-41b0-8283-1657435bb765 +let + A, B = rand(200, 100), rand(100, 300) + @btime matmul2($A, $B) + @profview for _ in 1:10; matmul2(A, B); end +end + +# ╔═║ 042b783a-a00a-401f-a4e2-e52c577fe384 +function matmul3(A, B) + m, n, p = size(A, 1), size(A, 2), size(B, 2) + T = promote_type(eltype(A), eltype(B)) + C = Matrix{T}(undef, m, p) + for i = 1:m, j = 1:p + C[i, j] = zero(T) + for k in 1:n + C[i, j] += A[i, k] * B[k, j] + end + end + return C +end + +# ╔═║ 969f2427-8089-4f1d-a533-c85c05e51834 +let + A, B = rand(200, 100), rand(100, 300) + @btime matmul3($A, $B) + @profview for _ in 1:10; matmul3(A, B); end +end + +# ╔═║ c838c62e-133c-4a11-93a0-8943abd475c2 +md""" +## Type introspection +""" + +# ╔═║ 43924cc3-ffec-415c-8df9-03f81342fa5e +md""" +The built-in macro [`@code_warntype`](https://docs.julialang.org/en/v1/manual/performance-tips/#man-code-warntype) shows the result of type inference on a function call. +Non-concrete types are displayed in red: they are those for which inference failed. +""" + +# ╔═║ 05f496d7-5970-4408-979b-d4400ee21abc +let + A, B = rand(200, 100), rand(100, 300) + @code_warntype matmul2(A, B) +end + +# ╔═║ c69378e2-9f73-463e-b881-897b859c7741 +md""" +Sometimes `@code_warntype` is not enough, because it only studies the outermost function and doesn't dive deeper into the call stack. +""" + +# ╔═║ 181fe5ea-1da6-41fe-99a7-f32f96cb621f +matmul2_wrapper(args...) = matmul2(args...) + +# ╔═║ 67fead56-530d-4853-860b-ff8645359b9c +let + A, B = rand(200, 100), rand(100, 300) + @code_warntype matmul2_wrapper(A, B) +end + +# ╔═║ 41fa32c8-4cb6-4632-b511-e32f57e795e8 +let + A, B = rand(200, 100), rand(100, 300) + @report_opt matmul2_wrapper(A, B) +end + +# ╔═║ 62a57328-159f-42b3-b76b-0dfb6a245c25 +let + A, B = rand(200, 100), rand(100, 300) + @report_opt matmul3(A, B) +end + +# ╔═║ fe829857-090c-4279-8812-a0c96f9d1d10 +md""" +## Memory introspection +""" + +# ╔═║ a52a7793-6e61-428b-97dc-f8f0cba41ce3 +md""" +A memory profiler was introduced in Julia 1.8, which mimics the behavior of the temporal profiler shown above. +To use it, just replace `@profview` with `@profview_allocs`. +""" + +# ╔═║ eddf2211-bd11-4487-b54f-7e6399507d8c +let + A, B = rand(200, 100), rand(100, 300) + @profview_allocs for _ in 1:10; matmul1(A, B); end +end + +# ╔═║ de4dc4f4-38cd-4e0d-acb3-dd1b2b623dff +let + A, B = rand(200, 100), rand(100, 300) + @profview_allocs for _ in 1:10; matmul3(A, B); end +end + +# ╔═║ d2c7c936-605d-4fe3-b7fa-09eb310407b1 +md""" +Often, excessive memory allocations are also a telltale sign of bad type inference. +""" + +# ╔═║ 7074d2f5-ab4f-4e68-b0af-bc6ea6a223e0 +md""" +# 2. Performance improvement +""" + +# ╔═║ 1b6ec1fa-06bf-47ab-8b83-6e7d5800b87b +md""" +Now that we know how to detect bad performance, we will list a few tips to achieve good performance. +But always remember the golden rule: only optimize code that works, and that needs optimizing! + +The primary source for this section is the Julia manual page on [performance tips](https://docs.julialang.org/en/v1/manual/performance-tips/) (read it after this!). +""" + +# ╔═║ a6b7aec2-e428-442d-b771-4972d71d6413 +md""" +## General advice +""" + +# ╔═║ 4744db37-5c7d-4b6a-bc71-45b7b104ce45 +md""" +- Avoid [global variables](https://docs.julialang.org/en/v1/manual/performance-tips/#Avoid-global-variables), or turn them into constants with the keyword `const` +- Put critical code [inside functions](https://docs.julialang.org/en/v1/manual/performance-tips/#Performance-critical-code-should-be-inside-a-function) +- Vectorized operations (using the [dot syntax](https://docs.julialang.org/en/v1/manual/functions/#man-vectorized)) are not faster than loops, except linear algebra routines +- Beware of [closures](https://docs.julialang.org/en/v1/manual/performance-tips/#man-performance-captured) (i.e. functions that return functions) +""" + +# ╔═║ 76355967-d436-4136-8483-8ef873a045c6 +md""" +## Facilitate type inference +""" + +# ╔═║ bc2fc918-088d-4bdb-b8d3-c7953e3884ee +md""" +Julia is fastest when it can infer the type of each variable during just-in-time compilation: then it can decide ahead of runtime (statically) which method to dispatch where. +When this fails, types have to be inferred at runtime (dynamically), and "runtime dispatch" of methods is much slower. + +The key to successful type inference is simple to express. +In each function, the types of the arguments (*not their values*) should suffice to deduce the type of every other variable, especially the output. +Here are a few ways to make this happen. + +- Always declare concrete or parametric types (no abstract types) in the following places: + - [container initializations](https://docs.julialang.org/en/v1/manual/performance-tips/#man-performance-abstract-container) + - [`struct` field values](https://docs.julialang.org/en/v1/manual/performance-tips/#Avoid-fields-with-abstract-type) + - [`struct` field containers](https://docs.julialang.org/en/v1/manual/performance-tips/#Avoid-fields-with-abstract-containers) +- Never write `if typeof(x) == ...`: exploit [multiple dispatch](https://docs.julialang.org/en/v1/manual/performance-tips/#Break-functions-into-multiple-definitions) or [function barriers](https://docs.julialang.org/en/v1/manual/performance-tips/#kernel-functions) instead +- Define functions that [do not change the type of variables](https://docs.julialang.org/en/v1/manual/performance-tips/#Avoid-changing-the-type-of-a-variable) and [always output the same type](https://docs.julialang.org/en/v1/manual/performance-tips/#Write-%22type-stable%22-functions) +""" + +# ╔═║ 7533366f-0a55-40c6-8754-ed4379658c5b +md""" +## Reduce memory allocations +""" + +# ╔═║ be939baf-f049-4684-805a-d1ac669bf164 +md""" +Allocations and garbage collection are significant performance bottlenecks. Here are some ways to avoid them: + +- Prefer in-place functions that reuse available containers (they name usually [ends with `!`](https://docs.julialang.org/en/v1/manual/style-guide/#bang-convention)) +- [Pre-allocate](https://docs.julialang.org/en/v1/manual/performance-tips/#Pre-allocating-outputs) output memory +- Use [views instead of slices](https://docs.julialang.org/en/v1/manual/performance-tips/#man-performance-views) when you don't need copies: `view(A, :, 1)` instead of `A[:, 1]` +- [Combine vectorized operations](https://docs.julialang.org/en/v1/manual/performance-tips/#More-dots:-Fuse-vectorized-operations) +- Fix type inference bugs (they often lead to increased memory use) +""" + +# ╔═║ db1a3f82-2ef1-432c-a087-175a23b0b11f +md""" +## Hardware considerations +""" + +# ╔═║ ae1e9d84-b605-4fe1-b7f5-be5fe843b4fd +md""" +In order to optimize Julia code to the limit, it quickly becomes useful to know how a modern computer works. +The following blog post is an absolute masterpiece on this topic: [What scientists must know about hardware to write fast code](https://viralinstruction.com/posts/hardware/) (Jakob Nybo Nissen). +""" + +# ╔═║ 00000000-0000-0000-0000-000000000001 +PLUTO_PROJECT_TOML_CONTENTS = """ +[deps] +BenchmarkTools = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf" +JET = "c3a54625-cd67-489e-a8e7-0a5a0ff4e31b" +PlutoTeachingTools = "661c6b06-c737-4d37-b85c-46df65de6f69" +PlutoUI = "7f904dfe-b85e-4ff6-b463-dae2292396a8" +ProfileCanvas = "efd6af41-a80b-495e-886c-e51b0c7d77a3" +ProgressLogging = "33c8b6b6-d38a-422a-b730-caa89a2f386c" + +[compat] +BenchmarkTools = "~1.3.2" +JET = "~0.6.14" +PlutoTeachingTools = "~0.2.5" +PlutoUI = "~0.7.48" +ProfileCanvas = "~0.1.6" +ProgressLogging = "~0.1.4" +""" + +# ╔═║ 00000000-0000-0000-0000-000000000002 +PLUTO_MANIFEST_TOML_CONTENTS = """ +# This file is machine-generated - editing it directly is not advised + +julia_version = "1.8.2" +manifest_format = "2.0" +project_hash = "36399a99bb78e29cd4be7c430c15ba142212a00f" + +[[deps.AbstractPlutoDingetjes]] +deps = ["Pkg"] +git-tree-sha1 = "8eaf9f1b4921132a4cff3f36a1d9ba923b14a481" +uuid = "6e696c72-6542-2067-7265-42206c756150" +version = "1.1.4" + +[[deps.ArgTools]] +uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" +version = "1.1.1" + +[[deps.Artifacts]] +uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" + +[[deps.Base64]] +uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" + +[[deps.BenchmarkTools]] +deps = ["JSON", "Logging", "Printf", "Profile", "Statistics", "UUIDs"] +git-tree-sha1 = "d9a9701b899b30332bbcb3e1679c41cce81fb0e8" +uuid = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf" +version = "1.3.2" + +[[deps.CodeTracking]] +deps = ["InteractiveUtils", "UUIDs"] +git-tree-sha1 = "cc4bd91eba9cdbbb4df4746124c22c0832a460d6" +uuid = "da1fd8a2-8d9e-5ec2-8556-3022fb5608a2" +version = "1.1.1" + +[[deps.ColorTypes]] +deps = ["FixedPointNumbers", "Random"] +git-tree-sha1 = "eb7f0f8307f71fac7c606984ea5fb2817275d6e4" +uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f" +version = "0.11.4" + +[[deps.CompilerSupportLibraries_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" +version = "0.5.2+0" + +[[deps.Dates]] +deps = ["Printf"] +uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" + +[[deps.Distributed]] +deps = ["Random", "Serialization", "Sockets"] +uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" + +[[deps.Downloads]] +deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] +uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" +version = "1.6.0" + +[[deps.FileWatching]] +uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" + +[[deps.FixedPointNumbers]] +deps = ["Statistics"] +git-tree-sha1 = "335bfdceacc84c5cdf16aadc768aa5ddfc5383cc" +uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" +version = "0.8.4" + +[[deps.Formatting]] +deps = ["Printf"] +git-tree-sha1 = "8339d61043228fdd3eb658d86c926cb282ae72a8" +uuid = "59287772-0a20-5a39-b81b-1366585eb4c0" +version = "0.4.2" + +[[deps.Hyperscript]] +deps = ["Test"] +git-tree-sha1 = "8d511d5b81240fc8e6802386302675bdf47737b9" +uuid = "47d2ed2b-36de-50cf-bf87-49c2cf4b8b91" +version = "0.0.4" + +[[deps.HypertextLiteral]] +deps = ["Tricks"] +git-tree-sha1 = "c47c5fa4c5308f27ccaac35504858d8914e102f9" +uuid = "ac1192a8-f4b3-4bfe-ba22-af5b92cd3ab2" +version = "0.9.4" + +[[deps.IOCapture]] +deps = ["Logging", "Random"] +git-tree-sha1 = "f7be53659ab06ddc986428d3a9dcc95f6fa6705a" +uuid = "b5f81e59-6552-4d32-b1f0-c071b021bf89" +version = "0.2.2" + +[[deps.InteractiveUtils]] +deps = ["Markdown"] +uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" + +[[deps.JET]] +deps = ["InteractiveUtils", "JuliaInterpreter", "LoweredCodeUtils", "MacroTools", "Pkg", "Revise", "Test"] +git-tree-sha1 = "d79a04585f9db7e3d5bbe62c7ea1b9aadaf515e4" +uuid = "c3a54625-cd67-489e-a8e7-0a5a0ff4e31b" +version = "0.6.14" + +[[deps.JSON]] +deps = ["Dates", "Mmap", "Parsers", "Unicode"] +git-tree-sha1 = "3c837543ddb02250ef42f4738347454f95079d4e" +uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" +version = "0.21.3" + +[[deps.JuliaInterpreter]] +deps = ["CodeTracking", "InteractiveUtils", "Random", "UUIDs"] +git-tree-sha1 = "0f960b1404abb0b244c1ece579a0ec78d056a5d1" +uuid = "aa1ae85d-cabe-5617-a682-6adf51b2e16a" +version = "0.9.15" + +[[deps.LaTeXStrings]] +git-tree-sha1 = "f2355693d6778a178ade15952b7ac47a4ff97996" +uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" +version = "1.3.0" + +[[deps.Latexify]] +deps = ["Formatting", "InteractiveUtils", "LaTeXStrings", "MacroTools", "Markdown", "OrderedCollections", "Printf", "Requires"] +git-tree-sha1 = "ab9aa169d2160129beb241cb2750ca499b4e90e9" +uuid = "23fbe1c1-3f47-55db-b15f-69d7ec21a316" +version = "0.15.17" + +[[deps.LibCURL]] +deps = ["LibCURL_jll", "MozillaCACerts_jll"] +uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" +version = "0.6.3" + +[[deps.LibCURL_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] +uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" +version = "7.84.0+0" + +[[deps.LibGit2]] +deps = ["Base64", "NetworkOptions", "Printf", "SHA"] +uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" + +[[deps.LibSSH2_jll]] +deps = ["Artifacts", "Libdl", "MbedTLS_jll"] +uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" +version = "1.10.2+0" + +[[deps.Libdl]] +uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" + +[[deps.LinearAlgebra]] +deps = ["Libdl", "libblastrampoline_jll"] +uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + +[[deps.Logging]] +uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" + +[[deps.LoweredCodeUtils]] +deps = ["JuliaInterpreter"] +git-tree-sha1 = "dedbebe234e06e1ddad435f5c6f4b85cd8ce55f7" +uuid = "6f1432cf-f94c-5a45-995e-cdbf5db27b0b" +version = "2.2.2" + +[[deps.MIMEs]] +git-tree-sha1 = "65f28ad4b594aebe22157d6fac869786a255b7eb" +uuid = "6c6e2e6c-3030-632d-7369-2d6c69616d65" +version = "0.1.4" + +[[deps.MacroTools]] +deps = ["Markdown", "Random"] +git-tree-sha1 = "42324d08725e200c23d4dfb549e0d5d89dede2d2" +uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" +version = "0.5.10" + +[[deps.Markdown]] +deps = ["Base64"] +uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" + +[[deps.MbedTLS_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" +version = "2.28.0+0" + +[[deps.Mmap]] +uuid = "a63ad114-7e13-5084-954f-fe012c677804" + +[[deps.MozillaCACerts_jll]] +uuid = "14a3606d-f60d-562e-9121-12d972cd8159" +version = "2022.2.1" + +[[deps.NetworkOptions]] +uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" +version = "1.2.0" + +[[deps.OpenBLAS_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] +uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" +version = "0.3.20+0" + +[[deps.OrderedCollections]] +git-tree-sha1 = "85f8e6578bf1f9ee0d11e7bb1b1456435479d47c" +uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" +version = "1.4.1" + +[[deps.Parsers]] +deps = ["Dates", "SnoopPrecompile"] +git-tree-sha1 = "cceb0257b662528ecdf0b4b4302eb00e767b38e7" +uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" +version = "2.5.0" + +[[deps.Pkg]] +deps = ["Artifacts", "Dates", "Downloads", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] +uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" +version = "1.8.0" + +[[deps.PlutoHooks]] +deps = ["InteractiveUtils", "Markdown", "UUIDs"] +git-tree-sha1 = "072cdf20c9b0507fdd977d7d246d90030609674b" +uuid = "0ff47ea0-7a50-410d-8455-4348d5de0774" +version = "0.0.5" + +[[deps.PlutoLinks]] +deps = ["FileWatching", "InteractiveUtils", "Markdown", "PlutoHooks", "Revise", "UUIDs"] +git-tree-sha1 = "0e8bcc235ec8367a8e9648d48325ff00e4b0a545" +uuid = "0ff47ea0-7a50-410d-8455-4348d5de0420" +version = "0.1.5" + +[[deps.PlutoTeachingTools]] +deps = ["Downloads", "HypertextLiteral", "LaTeXStrings", "Latexify", "Markdown", "PlutoLinks", "PlutoUI", "Random"] +git-tree-sha1 = "ea3e4ac2e49e3438815f8946fa7673b658e35bdb" +uuid = "661c6b06-c737-4d37-b85c-46df65de6f69" +version = "0.2.5" + +[[deps.PlutoUI]] +deps = ["AbstractPlutoDingetjes", "Base64", "ColorTypes", "Dates", "FixedPointNumbers", "Hyperscript", "HypertextLiteral", "IOCapture", "InteractiveUtils", "JSON", "Logging", "MIMEs", "Markdown", "Random", "Reexport", "URIs", "UUIDs"] +git-tree-sha1 = "efc140104e6d0ae3e7e30d56c98c4a927154d684" +uuid = "7f904dfe-b85e-4ff6-b463-dae2292396a8" +version = "0.7.48" + +[[deps.Printf]] +deps = ["Unicode"] +uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" + +[[deps.Profile]] +deps = ["Printf"] +uuid = "9abbd945-dff8-562f-b5e8-e1ebf5ef1b79" + +[[deps.ProfileCanvas]] +deps = ["Base64", "JSON", "Pkg", "Profile", "REPL"] +git-tree-sha1 = "e42571ce9a614c2fbebcaa8aab23bbf8865c624e" +uuid = "efd6af41-a80b-495e-886c-e51b0c7d77a3" +version = "0.1.6" + +[[deps.ProgressLogging]] +deps = ["Logging", "SHA", "UUIDs"] +git-tree-sha1 = "80d919dee55b9c50e8d9e2da5eeafff3fe58b539" +uuid = "33c8b6b6-d38a-422a-b730-caa89a2f386c" +version = "0.1.4" + +[[deps.REPL]] +deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] +uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" + +[[deps.Random]] +deps = ["SHA", "Serialization"] +uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" + +[[deps.Reexport]] +git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" +uuid = "189a3867-3050-52da-a836-e630ba90ab69" +version = "1.2.2" + +[[deps.Requires]] +deps = ["UUIDs"] +git-tree-sha1 = "838a3a4188e2ded87a4f9f184b4b0d78a1e91cb7" +uuid = "ae029012-a4dd-5104-9daa-d747884805df" +version = "1.3.0" + +[[deps.Revise]] +deps = ["CodeTracking", "Distributed", "FileWatching", "JuliaInterpreter", "LibGit2", "LoweredCodeUtils", "OrderedCollections", "Pkg", "REPL", "Requires", "UUIDs", "Unicode"] +git-tree-sha1 = "dad726963ecea2d8a81e26286f625aee09a91b7c" +uuid = "295af30f-e4ad-537b-8983-00126c2a3abe" +version = "3.4.0" + +[[deps.SHA]] +uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" +version = "0.7.0" + +[[deps.Serialization]] +uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" + +[[deps.SnoopPrecompile]] +git-tree-sha1 = "f604441450a3c0569830946e5b33b78c928e1a85" +uuid = "66db9d55-30c0-4569-8b51-7e840670fc0c" +version = "1.0.1" + +[[deps.Sockets]] +uuid = "6462fe0b-24de-5631-8697-dd941f90decc" + +[[deps.SparseArrays]] +deps = ["LinearAlgebra", "Random"] +uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + +[[deps.Statistics]] +deps = ["LinearAlgebra", "SparseArrays"] +uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" + +[[deps.TOML]] +deps = ["Dates"] +uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" +version = "1.0.0" + +[[deps.Tar]] +deps = ["ArgTools", "SHA"] +uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" +version = "1.10.1" + +[[deps.Test]] +deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] +uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[[deps.Tricks]] +git-tree-sha1 = "6bac775f2d42a611cdfcd1fb217ee719630c4175" +uuid = "410a4b4d-49e4-4fbc-ab6d-cb71b17b3775" +version = "0.1.6" + +[[deps.URIs]] +git-tree-sha1 = "e59ecc5a41b000fa94423a578d29290c7266fc10" +uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" +version = "1.4.0" + +[[deps.UUIDs]] +deps = ["Random", "SHA"] +uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" + +[[deps.Unicode]] +uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" + +[[deps.Zlib_jll]] +deps = ["Libdl"] +uuid = "83775a58-1f1d-513f-b197-d71354ab007a" +version = "1.2.12+3" + +[[deps.libblastrampoline_jll]] +deps = ["Artifacts", "Libdl", "OpenBLAS_jll"] +uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" +version = "5.1.1+0" + +[[deps.nghttp2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" +version = "1.48.0+0" + +[[deps.p7zip_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" +version = "17.4.0+0" +""" + +# ╔═║ Cell order: +# ╠═80266caa-6066-11ed-0d4e-a3b81a95bc95 +# ╠═fc5c6cb2-4d06-4922-90ca-553c562a6e16 +# β•Ÿβ”€9604dcf7-b58e-4af5-9ecd-5bd3199c785d +# β•Ÿβ”€be066ed7-7bd5-4d46-ae2c-4fca40f1cffb +# β•Ÿβ”€3da3826b-b7bd-4a27-a17a-2a121c51a857 +# β•Ÿβ”€0fc7bece-72ec-4dc2-8205-0c588c4a856c +# β•Ÿβ”€fc67f478-87c0-44f2-8bbc-033ec5da5b3d +# ╠═28b66131-e901-4201-a9b7-fa99f203c7ca +# β•Ÿβ”€c64ea3e9-9d18-4668-97af-6aa1dd493433 +# ╠═55fbb2e5-baf9-4102-a709-d6a23606fdb1 +# β•Ÿβ”€8a5d4d94-efef-4b8c-b505-f3e58df9b654 +# β•Ÿβ”€ced6a5f8-c16c-47ed-adb9-30d17b580e5e +# ╠═0fd5ccd7-ffbb-4a4b-a76a-b7375951e605 +# β•Ÿβ”€553a93f4-0d1a-45db-8b56-83e071e3bb45 +# β•Ÿβ”€47a2b694-f5d0-438c-afb2-f757c5ebaf62 +# β•Ÿβ”€fa393444-2ea0-4da9-a38d-da2d7a7c045b +# β•Ÿβ”€c258b419-da92-41d8-a68a-24cebf3f01cd +# ╠═b3af8f8c-9008-47bd-ae99-9340b02e8e59 +# ╠═91fdeabc-211f-4e82-9a5b-64155872c530 +# ╠═1b8283b1-c5b7-4d86-a87e-8408d0938eb4 +# ╠═efd77774-d93d-41b0-8283-1657435bb765 +# ╠═042b783a-a00a-401f-a4e2-e52c577fe384 +# ╠═969f2427-8089-4f1d-a533-c85c05e51834 +# β•Ÿβ”€c838c62e-133c-4a11-93a0-8943abd475c2 +# β•Ÿβ”€43924cc3-ffec-415c-8df9-03f81342fa5e +# ╠═05f496d7-5970-4408-979b-d4400ee21abc +# β•Ÿβ”€c69378e2-9f73-463e-b881-897b859c7741 +# ╠═181fe5ea-1da6-41fe-99a7-f32f96cb621f +# ╠═67fead56-530d-4853-860b-ff8645359b9c +# ╠═41fa32c8-4cb6-4632-b511-e32f57e795e8 +# ╠═62a57328-159f-42b3-b76b-0dfb6a245c25 +# β•Ÿβ”€fe829857-090c-4279-8812-a0c96f9d1d10 +# β•Ÿβ”€a52a7793-6e61-428b-97dc-f8f0cba41ce3 +# ╠═eddf2211-bd11-4487-b54f-7e6399507d8c +# ╠═de4dc4f4-38cd-4e0d-acb3-dd1b2b623dff +# β•Ÿβ”€d2c7c936-605d-4fe3-b7fa-09eb310407b1 +# β•Ÿβ”€7074d2f5-ab4f-4e68-b0af-bc6ea6a223e0 +# β•Ÿβ”€1b6ec1fa-06bf-47ab-8b83-6e7d5800b87b +# β•Ÿβ”€a6b7aec2-e428-442d-b771-4972d71d6413 +# β•Ÿβ”€4744db37-5c7d-4b6a-bc71-45b7b104ce45 +# β•Ÿβ”€76355967-d436-4136-8483-8ef873a045c6 +# β•Ÿβ”€bc2fc918-088d-4bdb-b8d3-c7953e3884ee +# β•Ÿβ”€7533366f-0a55-40c6-8754-ed4379658c5b +# β•Ÿβ”€be939baf-f049-4684-805a-d1ac669bf164 +# β•Ÿβ”€db1a3f82-2ef1-432c-a087-175a23b0b11f +# β•Ÿβ”€ae1e9d84-b605-4fe1-b7f5-be5fe843b4fd +# β•Ÿβ”€00000000-0000-0000-0000-000000000001 +# β•Ÿβ”€00000000-0000-0000-0000-000000000002 diff --git a/notebooks_old/juliahub_in_class_110122.jl b/notebooks_old/juliahub_in_class_110122.jl new file mode 100644 index 0000000..aef5308 --- /dev/null +++ b/notebooks_old/juliahub_in_class_110122.jl @@ -0,0 +1,478 @@ +### A Pluto.jl notebook ### +# v0.19.8 + +using Markdown +using InteractiveUtils + +# ╔═║ 9260ed2e-5a0c-11ed-3cd6-0ff639b38f1c +using CUDA, KernelAbstractions, CUDAKernels, BenchmarkTools + +# ╔═║ 6ed42e7e-3bbb-4fc9-95fb-509b08d2d53d +force_law(x,y) = 1/abs(x-y) + +# ╔═║ 76fbcfe3-7962-4f99-b70d-9bcc3bed07e4 +@kernel function myproblem!(forces, positions, force_law) + tid = @index(Global, Linear) + forces[tid] = 0.0 + + for j = 1:length(positions) + if j != tid + forces[tid] += force_law(positions[tid], positions[j] ) end + end + +end + +# ╔═║ 78754f69-56d8-4cce-b500-704656530711 + kernel! = myproblem!(CUDADevice(),256) + +# ╔═║ 700d5233-fee9-415c-b757-322d014a4a23 +# @time myproblem1(Array(positions)) + +# ╔═║ b1d4465d-7d65-411d-ba33-632bb1eb2ace +n = 8_000_000 + +# ╔═║ 6aa011fa-bb3b-4057-bb26-2b898465b359 +begin + positions = rand(n) + forces = similar(positions) +end + +# ╔═║ 2dc55a8e-0837-4f35-8191-e70a54e7ca7e +positionsGPU = CuArray(positions) + +# ╔═║ 6b390849-1959-445b-bc7f-c5352db0890a +forcesGPU = CuArray(forces) + +# ╔═║ 19c602c1-9800-4d74-9c56-deab17e54df7 +begin + @time wait(kernel!(forcesGPU, positionsGPU, force_law, ndrange=n)) + forcesGPU +end + +# ╔═║ 4559bcc6-a8a8-4bd7-a464-5b430258ce43 +(n * 4*8)/2^30 + +# ╔═║ 661d35c0-4d0c-4748-917a-6d599c821de0 +function myproblem1(x) + y = zero(x) + n = length(x) + for i=1:n ,j=1:n + if jβ‰ i + y[i] += 1. /abs(x[i]-x[j]) + end + end + y +end + +# ╔═║ 00000000-0000-0000-0000-000000000001 +PLUTO_PROJECT_TOML_CONTENTS = """ +[deps] +BenchmarkTools = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf" +CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" +CUDAKernels = "72cfdca4-0801-4ab0-bf6a-d52aa10adc57" +KernelAbstractions = "63c18a36-062a-441e-b654-da1e3ab1ce7c" + +[compat] +BenchmarkTools = "~1.3.1" +CUDA = "~3.12.0" +CUDAKernels = "~0.4.3" +KernelAbstractions = "~0.8.3" +""" + +# ╔═║ 00000000-0000-0000-0000-000000000002 +PLUTO_MANIFEST_TOML_CONTENTS = """ +# This file is machine-generated - editing it directly is not advised + +julia_version = "1.7.2" +manifest_format = "2.0" + +[[deps.AbstractFFTs]] +deps = ["ChainRulesCore", "LinearAlgebra"] +git-tree-sha1 = "69f7020bd72f069c219b5e8c236c1fa90d2cb409" +uuid = "621f4979-c628-5d54-868e-fcf4e3e8185c" +version = "1.2.1" + +[[deps.Adapt]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "195c5505521008abea5aee4f96930717958eac6f" +uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" +version = "3.4.0" + +[[deps.ArgTools]] +uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" + +[[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.BFloat16s]] +deps = ["LinearAlgebra", "Printf", "Random", "Test"] +git-tree-sha1 = "a598ecb0d717092b5539dbbe890c98bac842b072" +uuid = "ab4f0b2a-ad5b-11e8-123f-65d77653426b" +version = "0.2.0" + +[[deps.Base64]] +uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" + +[[deps.BenchmarkTools]] +deps = ["JSON", "Logging", "Printf", "Profile", "Statistics", "UUIDs"] +git-tree-sha1 = "4c10eee4af024676200bc7752e536f858c6b8f93" +uuid = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf" +version = "1.3.1" + +[[deps.CEnum]] +git-tree-sha1 = "eb4cb44a499229b3b8426dcfb5dd85333951ff90" +uuid = "fa961155-64e5-5f13-b03f-caf6b980ea82" +version = "0.4.2" + +[[deps.CUDA]] +deps = ["AbstractFFTs", "Adapt", "BFloat16s", "CEnum", "CompilerSupportLibraries_jll", "ExprTools", "GPUArrays", "GPUCompiler", "LLVM", "LazyArtifacts", "Libdl", "LinearAlgebra", "Logging", "Printf", "Random", "Random123", "RandomNumbers", "Reexport", "Requires", "SparseArrays", "SpecialFunctions", "TimerOutputs"] +git-tree-sha1 = "49549e2c28ffb9cc77b3689dc10e46e6271e9452" +uuid = "052768ef-5323-5732-b1bb-66c8b64840ba" +version = "3.12.0" + +[[deps.CUDAKernels]] +deps = ["Adapt", "CUDA", "KernelAbstractions", "StaticArrays", "UnsafeAtomicsLLVM"] +git-tree-sha1 = "bbab4d1a4001ec322c384dfff0889cec4118da93" +uuid = "72cfdca4-0801-4ab0-bf6a-d52aa10adc57" +version = "0.4.3" + +[[deps.ChainRulesCore]] +deps = ["Compat", "LinearAlgebra", "SparseArrays"] +git-tree-sha1 = "8a494fe0c4ae21047f28eb48ac968f0b8a6fcaa7" +uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" +version = "1.15.4" + +[[deps.ChangesOfVariables]] +deps = ["ChainRulesCore", "LinearAlgebra", "Test"] +git-tree-sha1 = "38f7a08f19d8810338d4f5085211c7dfa5d5bdd8" +uuid = "9e997f8a-9a97-42d5-a9f1-ce6bfc15e2c0" +version = "0.1.4" + +[[deps.Compat]] +deps = ["Dates", "LinearAlgebra", "UUIDs"] +git-tree-sha1 = "5856d3031cdb1f3b2b6340dfdc66b6d9a149a374" +uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" +version = "4.2.0" + +[[deps.CompilerSupportLibraries_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" + +[[deps.Dates]] +deps = ["Printf"] +uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" + +[[deps.DocStringExtensions]] +deps = ["LibGit2"] +git-tree-sha1 = "5158c2b41018c5f7eb1470d558127ac274eca0c9" +uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" +version = "0.9.1" + +[[deps.Downloads]] +deps = ["ArgTools", "LibCURL", "NetworkOptions"] +uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" + +[[deps.ExprTools]] +git-tree-sha1 = "56559bbef6ca5ea0c0818fa5c90320398a6fbf8d" +uuid = "e2ba6199-217a-4e67-a87a-7c52f15ade04" +version = "0.1.8" + +[[deps.GPUArrays]] +deps = ["Adapt", "GPUArraysCore", "LLVM", "LinearAlgebra", "Printf", "Random", "Reexport", "Serialization", "Statistics"] +git-tree-sha1 = "45d7deaf05cbb44116ba785d147c518ab46352d7" +uuid = "0c68f7d7-f131-5f86-a1c3-88cf8149b2d7" +version = "8.5.0" + +[[deps.GPUArraysCore]] +deps = ["Adapt"] +git-tree-sha1 = "6872f5ec8fd1a38880f027a26739d42dcda6691f" +uuid = "46192b85-c4d5-4398-a991-12ede77f4527" +version = "0.1.2" + +[[deps.GPUCompiler]] +deps = ["ExprTools", "InteractiveUtils", "LLVM", "Libdl", "Logging", "TimerOutputs", "UUIDs"] +git-tree-sha1 = "122d7bcc92abf94cf1a86281ad7a4d0e838ab9e0" +uuid = "61eb1bfa-7361-4325-ad38-22787b887f55" +version = "0.16.3" + +[[deps.InteractiveUtils]] +deps = ["Markdown"] +uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" + +[[deps.InverseFunctions]] +deps = ["Test"] +git-tree-sha1 = "b3364212fb5d870f724876ffcd34dd8ec6d98918" +uuid = "3587e190-3f89-42d0-90ee-14403ec27112" +version = "0.1.7" + +[[deps.IrrationalConstants]] +git-tree-sha1 = "7fd44fd4ff43fc60815f8e764c0f352b83c49151" +uuid = "92d709cd-6900-40b7-9082-c6be49f344b6" +version = "0.1.1" + +[[deps.JLLWrappers]] +deps = ["Preferences"] +git-tree-sha1 = "abc9885a7ca2052a736a600f7fa66209f96506e1" +uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" +version = "1.4.1" + +[[deps.JSON]] +deps = ["Dates", "Mmap", "Parsers", "Unicode"] +git-tree-sha1 = "3c837543ddb02250ef42f4738347454f95079d4e" +uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" +version = "0.21.3" + +[[deps.KernelAbstractions]] +deps = ["Adapt", "Atomix", "InteractiveUtils", "LinearAlgebra", "MacroTools", "SparseArrays", "StaticArrays", "UUIDs", "UnsafeAtomics", "UnsafeAtomicsLLVM"] +git-tree-sha1 = "02838ecfc5f925ac408ffe6b359ac59ef8865272" +uuid = "63c18a36-062a-441e-b654-da1e3ab1ce7c" +version = "0.8.3" + +[[deps.LLVM]] +deps = ["CEnum", "LLVMExtra_jll", "Libdl", "Printf", "Unicode"] +git-tree-sha1 = "e7e9184b0bf0158ac4e4aa9daf00041b5909bf1a" +uuid = "929cbde3-209d-540e-8aea-75f648917ca0" +version = "4.14.0" + +[[deps.LLVMExtra_jll]] +deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl", "Pkg", "TOML"] +git-tree-sha1 = "771bfe376249626d3ca12bcd58ba243d3f961576" +uuid = "dad2f222-ce93-54a1-a47d-0025e8a3acab" +version = "0.0.16+0" + +[[deps.LazyArtifacts]] +deps = ["Artifacts", "Pkg"] +uuid = "4af54fe1-eca0-43a8-85a7-787d91b784e3" + +[[deps.LibCURL]] +deps = ["LibCURL_jll", "MozillaCACerts_jll"] +uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" + +[[deps.LibCURL_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] +uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" + +[[deps.LibGit2]] +deps = ["Base64", "NetworkOptions", "Printf", "SHA"] +uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" + +[[deps.LibSSH2_jll]] +deps = ["Artifacts", "Libdl", "MbedTLS_jll"] +uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" + +[[deps.Libdl]] +uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" + +[[deps.LinearAlgebra]] +deps = ["Libdl", "libblastrampoline_jll"] +uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + +[[deps.LogExpFunctions]] +deps = ["ChainRulesCore", "ChangesOfVariables", "DocStringExtensions", "InverseFunctions", "IrrationalConstants", "LinearAlgebra"] +git-tree-sha1 = "94d9c52ca447e23eac0c0f074effbcd38830deb5" +uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688" +version = "0.3.18" + +[[deps.Logging]] +uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" + +[[deps.MacroTools]] +deps = ["Markdown", "Random"] +git-tree-sha1 = "3d3e902b31198a27340d0bf00d6ac452866021cf" +uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" +version = "0.5.9" + +[[deps.Markdown]] +deps = ["Base64"] +uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" + +[[deps.MbedTLS_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" + +[[deps.Mmap]] +uuid = "a63ad114-7e13-5084-954f-fe012c677804" + +[[deps.MozillaCACerts_jll]] +uuid = "14a3606d-f60d-562e-9121-12d972cd8159" + +[[deps.NetworkOptions]] +uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" + +[[deps.OpenBLAS_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] +uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" + +[[deps.OpenLibm_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "05823500-19ac-5b8b-9628-191a04bc5112" + +[[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.Parsers]] +deps = ["Dates"] +git-tree-sha1 = "3d5bf43e3e8b412656404ed9466f1dcbf7c50269" +uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" +version = "2.4.0" + +[[deps.Pkg]] +deps = ["Artifacts", "Dates", "Downloads", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] +uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" + +[[deps.Preferences]] +deps = ["TOML"] +git-tree-sha1 = "47e5f437cc0e7ef2ce8406ce1e7e24d44915f88d" +uuid = "21216c6a-2e73-6563-6e65-726566657250" +version = "1.3.0" + +[[deps.Printf]] +deps = ["Unicode"] +uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" + +[[deps.Profile]] +deps = ["Printf"] +uuid = "9abbd945-dff8-562f-b5e8-e1ebf5ef1b79" + +[[deps.REPL]] +deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] +uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" + +[[deps.Random]] +deps = ["SHA", "Serialization"] +uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" + +[[deps.Random123]] +deps = ["Random", "RandomNumbers"] +git-tree-sha1 = "7a1a306b72cfa60634f03a911405f4e64d1b718b" +uuid = "74087812-796a-5b5d-8853-05524746bad3" +version = "1.6.0" + +[[deps.RandomNumbers]] +deps = ["Random", "Requires"] +git-tree-sha1 = "043da614cc7e95c703498a491e2c21f58a2b8111" +uuid = "e6cf234a-135c-5ec9-84dd-332b85af5143" +version = "1.5.3" + +[[deps.Reexport]] +git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" +uuid = "189a3867-3050-52da-a836-e630ba90ab69" +version = "1.2.2" + +[[deps.Requires]] +deps = ["UUIDs"] +git-tree-sha1 = "838a3a4188e2ded87a4f9f184b4b0d78a1e91cb7" +uuid = "ae029012-a4dd-5104-9daa-d747884805df" +version = "1.3.0" + +[[deps.SHA]] +uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" + +[[deps.Serialization]] +uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" + +[[deps.Sockets]] +uuid = "6462fe0b-24de-5631-8697-dd941f90decc" + +[[deps.SparseArrays]] +deps = ["LinearAlgebra", "Random"] +uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + +[[deps.SpecialFunctions]] +deps = ["ChainRulesCore", "IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"] +git-tree-sha1 = "d75bda01f8c31ebb72df80a46c88b25d1c79c56d" +uuid = "276daf66-3868-5448-9aa4-cd146d93841b" +version = "2.1.7" + +[[deps.StaticArrays]] +deps = ["LinearAlgebra", "Random", "StaticArraysCore", "Statistics"] +git-tree-sha1 = "dfec37b90740e3b9aa5dc2613892a3fc155c3b42" +uuid = "90137ffa-7385-5640-81b9-e52037218182" +version = "1.5.6" + +[[deps.StaticArraysCore]] +git-tree-sha1 = "ec2bd695e905a3c755b33026954b119ea17f2d22" +uuid = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" +version = "1.3.0" + +[[deps.Statistics]] +deps = ["LinearAlgebra", "SparseArrays"] +uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" + +[[deps.TOML]] +deps = ["Dates"] +uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" + +[[deps.Tar]] +deps = ["ArgTools", "SHA"] +uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" + +[[deps.Test]] +deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] +uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[[deps.TimerOutputs]] +deps = ["ExprTools", "Printf"] +git-tree-sha1 = "9dfcb767e17b0849d6aaf85997c98a5aea292513" +uuid = "a759f4b9-e2f1-59dc-863e-4aeb61b1ea8f" +version = "0.5.21" + +[[deps.UUIDs]] +deps = ["Random", "SHA"] +uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" + +[[deps.Unicode]] +uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" + +[[deps.UnsafeAtomics]] +git-tree-sha1 = "6331ac3440856ea1988316b46045303bef658278" +uuid = "013be700-e6cd-48c3-b4a1-df204f14c38f" +version = "0.2.1" + +[[deps.UnsafeAtomicsLLVM]] +deps = ["LLVM", "UnsafeAtomics"] +git-tree-sha1 = "33af9d2031d0dc09e2be9a0d4beefec4466def8e" +uuid = "d80eeb9a-aca5-4d75-85e5-170c8b632249" +version = "0.1.0" + +[[deps.Zlib_jll]] +deps = ["Libdl"] +uuid = "83775a58-1f1d-513f-b197-d71354ab007a" + +[[deps.libblastrampoline_jll]] +deps = ["Artifacts", "Libdl", "OpenBLAS_jll"] +uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" + +[[deps.nghttp2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" + +[[deps.p7zip_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" +""" + +# ╔═║ Cell order: +# ╠═9260ed2e-5a0c-11ed-3cd6-0ff639b38f1c +# ╠═6ed42e7e-3bbb-4fc9-95fb-509b08d2d53d +# ╠═76fbcfe3-7962-4f99-b70d-9bcc3bed07e4 +# ╠═6aa011fa-bb3b-4057-bb26-2b898465b359 +# ╠═2dc55a8e-0837-4f35-8191-e70a54e7ca7e +# ╠═6b390849-1959-445b-bc7f-c5352db0890a +# ╠═78754f69-56d8-4cce-b500-704656530711 +# ╠═19c602c1-9800-4d74-9c56-deab17e54df7 +# ╠═700d5233-fee9-415c-b757-322d014a4a23 +# ╠═b1d4465d-7d65-411d-ba33-632bb1eb2ace +# ╠═4559bcc6-a8a8-4bd7-a464-5b430258ce43 +# ╠═661d35c0-4d0c-4748-917a-6d599c821de0 +# β•Ÿβ”€00000000-0000-0000-0000-000000000001 +# β•Ÿβ”€00000000-0000-0000-0000-000000000002 diff --git a/pluto-slider-server-environment/Manifest.toml b/pluto-slider-server-environment/Manifest.toml new file mode 100644 index 0000000..987420f --- /dev/null +++ b/pluto-slider-server-environment/Manifest.toml @@ -0,0 +1,466 @@ +# This file is machine-generated - editing it directly is not advised + +julia_version = "1.9.3" +manifest_format = "2.0" +project_hash = "13a51ad2b377d764861ea553e631182e0e81a599" + +[[deps.AbstractPlutoDingetjes]] +deps = ["Pkg"] +git-tree-sha1 = "91bd53c39b9cbfb5ef4b015e8b582d344532bd0a" +uuid = "6e696c72-6542-2067-7265-42206c756150" +version = "1.2.0" + +[[deps.AbstractTrees]] +git-tree-sha1 = "faa260e4cb5aba097a73fab382dd4b5819d8ec8c" +uuid = "1520ce14-60c1-5f80-bbc7-55ef81b5835c" +version = "0.4.4" + +[[deps.ArgTools]] +uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" +version = "1.1.1" + +[[deps.Artifacts]] +uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" + +[[deps.Base64]] +uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" + +[[deps.BetterFileWatching]] +deps = ["Deno_jll", "JSON"] +git-tree-sha1 = "0d7ee0a1acad90d544fa87cc3d6f463e99abb77a" +uuid = "c9fd44ac-77b5-486c-9482-9798bd063cc6" +version = "0.1.5" + +[[deps.BitFlags]] +git-tree-sha1 = "43b1a4a8f797c1cddadf60499a8a077d4af2cd2d" +uuid = "d1d4a3ce-64b1-5f1a-9ba4-7e7e69966f35" +version = "0.1.7" + +[[deps.CodecZlib]] +deps = ["TranscodingStreams", "Zlib_jll"] +git-tree-sha1 = "02aa26a4cf76381be7f66e020a3eddeb27b0a092" +uuid = "944b1d66-785c-5afd-91f1-9de20f533193" +version = "0.7.2" + +[[deps.CompilerSupportLibraries_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" +version = "1.0.5+0" + +[[deps.ConcurrentUtilities]] +deps = ["Serialization", "Sockets"] +git-tree-sha1 = "5372dbbf8f0bdb8c700db5367132925c0771ef7e" +uuid = "f0e56b4a-5159-44fe-b623-3e5288b988bb" +version = "2.2.1" + +[[deps.Configurations]] +deps = ["ExproniconLite", "OrderedCollections", "TOML"] +git-tree-sha1 = "434f446dbf89d08350e83bf57c0fc86f5d3ffd4e" +uuid = "5218b696-f38b-4ac9-8b61-a12ec717816d" +version = "0.17.5" + +[[deps.DataAPI]] +git-tree-sha1 = "8da84edb865b0b5b0100c0666a9bc9a0b71c553c" +uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a" +version = "1.15.0" + +[[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.Deno_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "cd6756e833c377e0ce9cd63fb97689a255f12323" +uuid = "04572ae6-984a-583e-9378-9577a1c2574d" +version = "1.33.4+0" + +[[deps.Distributed]] +deps = ["Random", "Serialization", "Sockets"] +uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" + +[[deps.Downloads]] +deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] +uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" +version = "1.6.0" + +[[deps.ExceptionUnwrapping]] +deps = ["Test"] +git-tree-sha1 = "e90caa41f5a86296e014e148ee061bd6c3edec96" +uuid = "460bff9d-24e4-43bc-9d9f-a8973cb893f4" +version = "0.1.9" + +[[deps.Expat_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "4558ab818dcceaab612d1bb8c19cee87eda2b83c" +uuid = "2e619515-83b5-522b-bb60-26c02a35a201" +version = "2.5.0+0" + +[[deps.ExproniconLite]] +deps = ["Pkg", "TOML"] +git-tree-sha1 = "d80b5d5990071086edf5de9018c6c69c83937004" +uuid = "55351af7-c7e9-48d6-89ff-24e801d99491" +version = "0.10.3" + +[[deps.FileWatching]] +uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" + +[[deps.FromFile]] +deps = ["Downloads", "Requires"] +git-tree-sha1 = "5df4ca248bed8c35164d6a7ae006073bbf8289ff" +uuid = "ff7dd447-1dcb-4ce3-b8ac-22a812192de7" +version = "0.1.5" + +[[deps.FuzzyCompletions]] +deps = ["REPL"] +git-tree-sha1 = "001bd0eefc8c532660676725bed56b696321dfd2" +uuid = "fb4132e2-a121-4a70-b8a1-d5b831dcdcc2" +version = "0.5.2" + +[[deps.Git]] +deps = ["Git_jll"] +git-tree-sha1 = "51764e6c2e84c37055e846c516e9015b4a291c7d" +uuid = "d7ba0133-e1db-5d97-8f8c-041e4b3a1eb2" +version = "1.3.0" + +[[deps.GitHubActions]] +deps = ["JSON", "Logging"] +git-tree-sha1 = "f544c863d90c82854ac2d3003808de0e4cba4186" +uuid = "6b79fd1a-b13a-48ab-b6b0-aaee1fee41df" +version = "0.1.6" + +[[deps.Git_jll]] +deps = ["Artifacts", "Expat_jll", "JLLWrappers", "LibCURL_jll", "Libdl", "Libiconv_jll", "OpenSSL_jll", "PCRE2_jll", "Zlib_jll"] +git-tree-sha1 = "d8be4aab0f4e043cc40984e9097417307cce4c03" +uuid = "f8c6e375-362e-5223-8a59-34ff63f689eb" +version = "2.36.1+2" + +[[deps.Glob]] +git-tree-sha1 = "97285bbd5230dd766e9ef6749b80fc617126d496" +uuid = "c27321d9-0574-5035-807b-f59d2c89b15c" +version = "1.3.1" + +[[deps.HTTP]] +deps = ["Base64", "CodecZlib", "ConcurrentUtilities", "Dates", "ExceptionUnwrapping", "Logging", "LoggingExtras", "MbedTLS", "NetworkOptions", "OpenSSL", "Random", "SimpleBufferStream", "Sockets", "URIs", "UUIDs"] +git-tree-sha1 = "cb56ccdd481c0dd7f975ad2b3b62d9eda088f7e2" +uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3" +version = "1.9.14" + +[[deps.HypertextLiteral]] +deps = ["Tricks"] +git-tree-sha1 = "c47c5fa4c5308f27ccaac35504858d8914e102f9" +uuid = "ac1192a8-f4b3-4bfe-ba22-af5b92cd3ab2" +version = "0.9.4" + +[[deps.InteractiveUtils]] +deps = ["Markdown"] +uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" + +[[deps.IteratorInterfaceExtensions]] +git-tree-sha1 = "a3f24677c21f5bbe9d2a714f95dcd58337fb2856" +uuid = "82899510-4779-5014-852e-03e436cf321d" +version = "1.0.0" + +[[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.LazilyInitializedFields]] +git-tree-sha1 = "410fe4739a4b092f2ffe36fcb0dcc3ab12648ce1" +uuid = "0e77f7df-68c5-4e49-93ce-4cd80f5598bf" +version = "1.2.1" + +[[deps.LeftChildRightSiblingTrees]] +deps = ["AbstractTrees"] +git-tree-sha1 = "fb6803dafae4a5d62ea5cab204b1e657d9737e7f" +uuid = "1d6d02ad-be62-4b6b-8a6d-2f90e265016e" +version = "0.2.0" + +[[deps.LibCURL]] +deps = ["LibCURL_jll", "MozillaCACerts_jll"] +uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" +version = "0.6.3" + +[[deps.LibCURL_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] +uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" +version = "7.84.0+0" + +[[deps.LibGit2]] +deps = ["Base64", "NetworkOptions", "Printf", "SHA"] +uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" + +[[deps.LibSSH2_jll]] +deps = ["Artifacts", "Libdl", "MbedTLS_jll"] +uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" +version = "1.10.2+0" + +[[deps.Libdl]] +uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" + +[[deps.Libiconv_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "f9557a255370125b405568f9767d6d195822a175" +uuid = "94ce4f54-9a6c-5748-9c1c-f9c7231a4531" +version = "1.17.0+0" + +[[deps.LinearAlgebra]] +deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"] +uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + +[[deps.Logging]] +uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" + +[[deps.LoggingExtras]] +deps = ["Dates", "Logging"] +git-tree-sha1 = "0d097476b6c381ab7906460ef1ef1638fbce1d91" +uuid = "e6f89c97-d47a-5376-807f-9c37f3926c36" +version = "1.0.2" + +[[deps.MIMEs]] +git-tree-sha1 = "65f28ad4b594aebe22157d6fac869786a255b7eb" +uuid = "6c6e2e6c-3030-632d-7369-2d6c69616d65" +version = "0.1.4" + +[[deps.Markdown]] +deps = ["Base64"] +uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" + +[[deps.MbedTLS]] +deps = ["Dates", "MbedTLS_jll", "MozillaCACerts_jll", "Random", "Sockets"] +git-tree-sha1 = "03a9b9718f5682ecb107ac9f7308991db4ce395b" +uuid = "739be429-bea8-5141-9913-cc70e7f3736d" +version = "1.1.7" + +[[deps.MbedTLS_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" +version = "2.28.2+0" + +[[deps.Mmap]] +uuid = "a63ad114-7e13-5084-954f-fe012c677804" + +[[deps.MozillaCACerts_jll]] +uuid = "14a3606d-f60d-562e-9121-12d972cd8159" +version = "2022.10.11" + +[[deps.MsgPack]] +deps = ["Serialization"] +git-tree-sha1 = "fc8c15ca848b902015bd4a745d350f02cf791c2a" +uuid = "99f44e22-a591-53d1-9472-aa23ef4bd671" +version = "1.2.0" + +[[deps.NetworkOptions]] +uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" +version = "1.2.0" + +[[deps.OpenBLAS_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] +uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" +version = "0.3.21+4" + +[[deps.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 = "bbb5c2115d63c2f1451cb70e5ef75e8fe4707019" +uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95" +version = "1.1.22+0" + +[[deps.OrderedCollections]] +git-tree-sha1 = "2e73fe17cac3c62ad1aebe70d44c963c3cfdc3e3" +uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" +version = "1.6.2" + +[[deps.PCRE2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "efcefdf7-47ab-520b-bdef-62a2eaa19f15" +version = "10.42.0+0" + +[[deps.Parsers]] +deps = ["Dates", "PrecompileTools", "UUIDs"] +git-tree-sha1 = "716e24b21538abc91f6205fd1d8363f39b442851" +uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" +version = "2.7.2" + +[[deps.Pkg]] +deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] +uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" +version = "1.9.2" + +[[deps.Pluto]] +deps = ["Base64", "Configurations", "Dates", "Distributed", "FileWatching", "FuzzyCompletions", "HTTP", "HypertextLiteral", "InteractiveUtils", "Logging", "LoggingExtras", "MIMEs", "Markdown", "MsgPack", "Pkg", "PrecompileSignatures", "PrecompileTools", "REPL", "RegistryInstances", "RelocatableFolders", "Sockets", "TOML", "Tables", "URIs", "UUIDs"] +git-tree-sha1 = "06fec2244568a4641e3352d20d0a0a608df6fa92" +uuid = "c3e4b0f8-55cb-11ea-2926-15256bba5781" +version = "0.19.27" + +[[deps.PlutoSliderServer]] +deps = ["AbstractPlutoDingetjes", "Base64", "BetterFileWatching", "Configurations", "Distributed", "FromFile", "Git", "GitHubActions", "Glob", "HTTP", "JSON", "Logging", "Pkg", "Pluto", "SHA", "Sockets", "TOML", "TerminalLoggers", "UUIDs"] +git-tree-sha1 = "0965f4a7feb3f1814bcf67b379ceaa67cdb3beda" +uuid = "2fc8631c-6f24-4c5b-bca7-cbb509c42db4" +version = "0.3.26" + +[[deps.PrecompileSignatures]] +git-tree-sha1 = "18ef344185f25ee9d51d80e179f8dad33dc48eb1" +uuid = "91cefc8d-f054-46dc-8f8c-26e11d7c5411" +version = "3.0.3" + +[[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 = "7eb1686b4f04b82f96ed7a4ea5890a4f0c7a09f1" +uuid = "21216c6a-2e73-6563-6e65-726566657250" +version = "1.4.0" + +[[deps.Printf]] +deps = ["Unicode"] +uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" + +[[deps.ProgressLogging]] +deps = ["Logging", "SHA", "UUIDs"] +git-tree-sha1 = "80d919dee55b9c50e8d9e2da5eeafff3fe58b539" +uuid = "33c8b6b6-d38a-422a-b730-caa89a2f386c" +version = "0.1.4" + +[[deps.REPL]] +deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] +uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" + +[[deps.Random]] +deps = ["SHA", "Serialization"] +uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" + +[[deps.RegistryInstances]] +deps = ["LazilyInitializedFields", "Pkg", "TOML", "Tar"] +git-tree-sha1 = "ffd19052caf598b8653b99404058fce14828be51" +uuid = "2792f1a3-b283-48e8-9a74-f99dce5104f3" +version = "0.1.0" + +[[deps.RelocatableFolders]] +deps = ["SHA", "Scratch"] +git-tree-sha1 = "90bc7a7c96410424509e4263e277e43250c05691" +uuid = "05181044-ff0b-4ac5-8273-598c1e38db00" +version = "1.0.0" + +[[deps.Requires]] +deps = ["UUIDs"] +git-tree-sha1 = "838a3a4188e2ded87a4f9f184b4b0d78a1e91cb7" +uuid = "ae029012-a4dd-5104-9daa-d747884805df" +version = "1.3.0" + +[[deps.SHA]] +uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" +version = "0.7.0" + +[[deps.Scratch]] +deps = ["Dates"] +git-tree-sha1 = "30449ee12237627992a99d5e30ae63e4d78cd24a" +uuid = "6c6a2e73-6563-6170-7368-637461726353" +version = "1.2.0" + +[[deps.Serialization]] +uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" + +[[deps.SimpleBufferStream]] +git-tree-sha1 = "874e8867b33a00e784c8a7e4b60afe9e037b74e1" +uuid = "777ac1f9-54b0-4bf8-805c-2214025038e7" +version = "1.1.0" + +[[deps.Sockets]] +uuid = "6462fe0b-24de-5631-8697-dd941f90decc" + +[[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", "Test"] +git-tree-sha1 = "1544b926975372da01227b382066ab70e574a3ec" +uuid = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" +version = "1.10.1" + +[[deps.Tar]] +deps = ["ArgTools", "SHA"] +uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" +version = "1.10.0" + +[[deps.TerminalLoggers]] +deps = ["LeftChildRightSiblingTrees", "Logging", "Markdown", "Printf", "ProgressLogging", "UUIDs"] +git-tree-sha1 = "f133fab380933d042f6796eda4e130272ba520ca" +uuid = "5d786b92-1e48-4d6f-9151-6b4477ca9bed" +version = "0.1.7" + +[[deps.Test]] +deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] +uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[[deps.TranscodingStreams]] +deps = ["Random", "Test"] +git-tree-sha1 = "9a6ae7ed916312b41236fcef7e0af564ef934769" +uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa" +version = "0.9.13" + +[[deps.Tricks]] +git-tree-sha1 = "aadb748be58b492045b4f56166b5188aa63ce549" +uuid = "410a4b4d-49e4-4fbc-ab6d-cb71b17b3775" +version = "0.1.7" + +[[deps.URIs]] +git-tree-sha1 = "b7a5e99f24892b6824a954199a45e9ffcc1c70f0" +uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" +version = "1.5.0" + +[[deps.UUIDs]] +deps = ["Random", "SHA"] +uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" + +[[deps.Unicode]] +uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" + +[[deps.Zlib_jll]] +deps = ["Libdl"] +uuid = "83775a58-1f1d-513f-b197-d71354ab007a" +version = "1.2.13+0" + +[[deps.libblastrampoline_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" +version = "5.8.0+0" + +[[deps.nghttp2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" +version = "1.48.0+0" + +[[deps.p7zip_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" +version = "17.4.0+0" diff --git a/pluto-slider-server-environment/PlutoDeployment.toml b/pluto-slider-server-environment/PlutoDeployment.toml new file mode 100644 index 0000000..b375626 --- /dev/null +++ b/pluto-slider-server-environment/PlutoDeployment.toml @@ -0,0 +1,18 @@ +[Export] +baked_notebookfile = false +baked_state = false +# slider_server_url="https://computationalthinking-sliderserver-c25.plutojl.org" +exclude = [ + "notebooks_old/*", + "homeworks_old/*", +] + +[SliderServer] +port = 80 +host = "0.0.0.0" +exclude = [ + "notebooks_old/*", + "homeworks_old/*", + # don't run the interactive sliderserver for homeworks + "*/hw*.jl", +] diff --git a/pluto-slider-server-environment/Project.toml b/pluto-slider-server-environment/Project.toml new file mode 100644 index 0000000..ccd0eea --- /dev/null +++ b/pluto-slider-server-environment/Project.toml @@ -0,0 +1,3 @@ +[deps] +Pluto = "c3e4b0f8-55cb-11ea-2926-15256bba5781" +PlutoSliderServer = "2fc8631c-6f24-4c5b-bca7-cbb509c42db4" diff --git a/pluto_export.json b/pluto_export.json new file mode 100644 index 0000000..f0582e7 --- /dev/null +++ b/pluto_export.json @@ -0,0 +1 @@ +{"notebooks":{"notebooks/0_julia_tutorial.jl":{"id":"notebooks/0_julia_tutorial.jl","hash":"K3riJHUMN29JsxJ-rC2yKAzoILy41QpnQITiHq-JT60","html_path":"notebooks/0_julia_tutorial.html","statefile_path":"notebooks/0_julia_tutorial.plutostate","notebookfile_path":"notebooks/0_julia_tutorial.jl","current_hash":"K3riJHUMN29JsxJ-rC2yKAzoILy41QpnQITiHq-JT60","desired_hash":"K3riJHUMN29JsxJ-rC2yKAzoILy41QpnQITiHq-JT60","frontmatter":{"title":"0_julia_tutorial"}},"homeworks/hw0.jl":{"id":"homeworks/hw0.jl","hash":"7F11F3Rsjy_6r0ECB3IkFZkOcGVjlONvlIJSeoA2XH4","html_path":"homeworks/hw0.html","statefile_path":"homeworks/hw0.plutostate","notebookfile_path":"homeworks/hw0.jl","current_hash":"7F11F3Rsjy_6r0ECB3IkFZkOcGVjlONvlIJSeoA2XH4","desired_hash":"7F11F3Rsjy_6r0ECB3IkFZkOcGVjlONvlIJSeoA2XH4","frontmatter":{"title":"hw0"}},"notebooks/1_hyperbolic_corgi.jl":{"id":"notebooks/1_hyperbolic_corgi.jl","hash":"ls-fMHKI8QE46qW52Ays6pASTga-55CxZV2vQHxdn24","html_path":"notebooks/1_hyperbolic_corgi.html","statefile_path":"notebooks/1_hyperbolic_corgi.plutostate","notebookfile_path":"notebooks/1_hyperbolic_corgi.jl","current_hash":"ls-fMHKI8QE46qW52Ays6pASTga-55CxZV2vQHxdn24","desired_hash":"ls-fMHKI8QE46qW52Ays6pASTga-55CxZV2vQHxdn24","frontmatter":{"title":"1_hyperbolic_corgi"}},"notebooks/1_images.jl":{"id":"notebooks/1_images.jl","hash":"1jQMo7hGrs2OK8_kHcrlVGyhudYhNJ_7E3eNhXDgo00","html_path":"notebooks/1_images.html","statefile_path":"notebooks/1_images.plutostate","notebookfile_path":"notebooks/1_images.jl","current_hash":"1jQMo7hGrs2OK8_kHcrlVGyhudYhNJ_7E3eNhXDgo00","desired_hash":"1jQMo7hGrs2OK8_kHcrlVGyhudYhNJ_7E3eNhXDgo00","frontmatter":{"title":"1_images"}},"notebooks/1_abstraction.jl":{"id":"notebooks/1_abstraction.jl","hash":"-sz4aGfozqgOJlzV1QogplVevrFv2-00xN8mVPnUC9c","html_path":"notebooks/1_abstraction.html","statefile_path":"notebooks/1_abstraction.plutostate","notebookfile_path":"notebooks/1_abstraction.jl","current_hash":"-sz4aGfozqgOJlzV1QogplVevrFv2-00xN8mVPnUC9c","desired_hash":"-sz4aGfozqgOJlzV1QogplVevrFv2-00xN8mVPnUC9c","frontmatter":{"title":"1_abstraction"}}},"pluto_version":"0.19.27","julia_version":"1.9.3","format_version":"1","title":null,"description":null,"collections":null} \ No newline at end of file diff --git a/pluto_state_cache/0_19_27-sz4aGfozqgOJlzV1QogplVevrFv2-00xN8mVPnUC9c.plutostate b/pluto_state_cache/0_19_27-sz4aGfozqgOJlzV1QogplVevrFv2-00xN8mVPnUC9c.plutostate new file mode 100644 index 0000000..df211c3 Binary files /dev/null and b/pluto_state_cache/0_19_27-sz4aGfozqgOJlzV1QogplVevrFv2-00xN8mVPnUC9c.plutostate differ diff --git a/pluto_state_cache/0_19_271jQMo7hGrs2OK8_kHcrlVGyhudYhNJ_7E3eNhXDgo00.plutostate b/pluto_state_cache/0_19_271jQMo7hGrs2OK8_kHcrlVGyhudYhNJ_7E3eNhXDgo00.plutostate new file mode 100644 index 0000000..0d85871 Binary files /dev/null and b/pluto_state_cache/0_19_271jQMo7hGrs2OK8_kHcrlVGyhudYhNJ_7E3eNhXDgo00.plutostate differ diff --git a/pluto_state_cache/0_19_277F11F3Rsjy_6r0ECB3IkFZkOcGVjlONvlIJSeoA2XH4.plutostate b/pluto_state_cache/0_19_277F11F3Rsjy_6r0ECB3IkFZkOcGVjlONvlIJSeoA2XH4.plutostate new file mode 100644 index 0000000..e010eb4 Binary files /dev/null and b/pluto_state_cache/0_19_277F11F3Rsjy_6r0ECB3IkFZkOcGVjlONvlIJSeoA2XH4.plutostate differ diff --git a/pluto_state_cache/0_19_27K3riJHUMN29JsxJ-rC2yKAzoILy41QpnQITiHq-JT60.plutostate b/pluto_state_cache/0_19_27K3riJHUMN29JsxJ-rC2yKAzoILy41QpnQITiHq-JT60.plutostate new file mode 100644 index 0000000..3d25a0f Binary files /dev/null and b/pluto_state_cache/0_19_27K3riJHUMN29JsxJ-rC2yKAzoILy41QpnQITiHq-JT60.plutostate differ diff --git a/pluto_state_cache/0_19_27liNc96pdZ4Fncfzebd--CbXmA4MTiMoBrAstI0SkR-8.plutostate b/pluto_state_cache/0_19_27liNc96pdZ4Fncfzebd--CbXmA4MTiMoBrAstI0SkR-8.plutostate new file mode 100644 index 0000000..6f923db Binary files /dev/null and b/pluto_state_cache/0_19_27liNc96pdZ4Fncfzebd--CbXmA4MTiMoBrAstI0SkR-8.plutostate differ diff --git a/pluto_state_cache/0_19_27ls-fMHKI8QE46qW52Ays6pASTga-55CxZV2vQHxdn24.plutostate b/pluto_state_cache/0_19_27ls-fMHKI8QE46qW52Ays6pASTga-55CxZV2vQHxdn24.plutostate new file mode 100644 index 0000000..bbe6162 Binary files /dev/null and b/pluto_state_cache/0_19_27ls-fMHKI8QE46qW52Ays6pASTga-55CxZV2vQHxdn24.plutostate differ diff --git a/pluto_state_cache/0_19_27ssJRqS8wT6M9yeaFh0_7e0zxharNda1m3KBQC2A4nQM.plutostate b/pluto_state_cache/0_19_27ssJRqS8wT6M9yeaFh0_7e0zxharNda1m3KBQC2A4nQM.plutostate new file mode 100644 index 0000000..08985f6 Binary files /dev/null and b/pluto_state_cache/0_19_27ssJRqS8wT6M9yeaFh0_7e0zxharNda1m3KBQC2A4nQM.plutostate differ diff --git a/slides_old/ad_handwritten.pdf b/slides_old/ad_handwritten.pdf new file mode 100644 index 0000000..ff5667a Binary files /dev/null and b/slides_old/ad_handwritten.pdf differ diff --git a/slides_old/mesh_generation.pdf b/slides_old/mesh_generation.pdf new file mode 100644 index 0000000..6fd3733 Binary files /dev/null and b/slides_old/mesh_generation.pdf differ