### A Pluto.jl notebook ### # v0.19.32 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 # ╔═╡ 7ebd06b4-7f35-11ee-1049-ab5af5e8c2c5 using LinearAlgebra, Plots, PlutoUI, LaTeXStrings, Latexify # ╔═╡ 7d8b57c7-368b-4ff2-962c-f3f02b6457a7 md""" # Vektoriteration und inverse Iteration Dieses Notebook ist in folgendem Repository zu finden: [**https://github.com/sloede/vektoriteration**](https://github.com/sloede/vektoriteration) """ # ╔═╡ a7db4654-be69-48e9-b925-8a66695ca7f2 md""" ## Einführung Wir betrachten die folgenden Matrizen ``A_1, \,A_2 \in \mathbb{R}^{2\times 2}`` """ # ╔═╡ 1a02369d-28bd-48f8-a00a-da7fd34e5f10 md""" und einen Vektor ``x_0 \in \mathbb{R}^2`` """ # ╔═╡ cab26236-b0e6-4f93-8be7-f6d378d8c921 md""" Wir untersuchen was passiert, wenn wir eine der Matrizen wiederholt mit ``x_0`` multiplizieren, d.h. wenn wir die Folge ``(x_k)_{k\in\mathbb{N}}`` mit Vorschrift ```math x_k = M x_{k-1} = M^k x_0, \qquad k = 1, 2, 3, \ldots ``` betrachten für ``M \in \{A_1, A_2\}``. Dazu wollen wir im Folgenden die Vektoren ``x_0`` und ``x_k`` in der ``x_1``-``x_2``-Ebene darstellen. Zunächst sind jedoch die Matrizen ``A_1``, ``A_2`` und der Vektor ``x_0`` in Julia zu definieren: """ # ╔═╡ e00d6e21-f491-4a21-9020-f7150eebb8d0 begin A₁ = [1 -3; 2 6] A₂ = [1 2; 4 -1] x₀ = [1, 0] end # ╔═╡ 41b31fc4-9461-4ffc-8c26-b8b9205265df L""" A_1 = %$(latexify(A₁, env=:raw)) \qquad A_2 = %$(latexify(A₂, env=:raw)) """ # ╔═╡ b0e71614-a833-4f40-a1c9-904e5f795d52 L""" x_0 = %$(latexify(x₀, env=:raw)) """ # ╔═╡ d08e5887-07b5-4773-9cd6-d2fdaac9740a md""" Dann definieren wir unsere Iterationsvorschrift und normalisieren das Ergebnis: """ # ╔═╡ bda87819-b3bf-4767-b9c8-a3a8556bcebe md""" Die Variable für die Matrix `M` und die Anzahl der Iterationen `k` können unterhalb des nachfolgenden Plots gewählt werden. Die Normalisierung dient nur der besseren Vergleichbarkeit, d.h. für die Darstellung nutzen wir die normierten Vektoren ``x_0/\lVert x_0 \rVert_2`` und ``x_0/\lVert x_0 \rVert_2``. """ # ╔═╡ 09d55f88-9bce-4a15-a094-be1607ca150c md""" Iterationsmatrix ``M``: $(@bind M Select([A₁ => "A₁", A₂ => "A₂"])) Anzahl der Iterationen `k`: $(@bind k Slider(0:30, default=0, show_value=true)) """ # ╔═╡ b8fb89f2-352b-422f-b347-9caa427197cd xₖ = normalize(M^k * x₀) # ╔═╡ d018cf6e-f05a-426a-8a89-000ba44750af begin x₀_norm = normalize(x₀) p = palette(:default) plot(xlims=(-1.1, 1.1), ylims=(-1.1, 1.1), aspect_ratio=:equal, legend=:bottomright) plot!([0.0, x₀_norm[1]], [0.0, x₀_norm[2]], lw=3, label=L"x_0/||x_0|\!|_2", arrow=true) for j in 1:k xⱼ = normalize(M^j * x₀) plot!([0.0, xⱼ[1]], [0.0, xⱼ[2]], lw=1, label="", arrow=true, style=:dash, color=:grey) end plot!([0.0, xₖ[1]], [0.0, xₖ[2]], lw=3, label=L"x_k/||x_k|\!|_2", arrow=true, color=p[2]) end # ╔═╡ 4a45d6ab-95e3-4d47-aaf2-2b9fbefbdddc md""" Wir betrachten zusätzlich das Verhältnis der Normen von aufeinanderfolgenden Iterationen: ``\frac{\lVert x_k \rVert_2}{\lVert x_{k-1} \rVert_2}`` = $(k > 0 ? round(norm(M^k * x₀)/norm(M^(k-1) * x₀), digits=5) : "n/a") Wie es scheint, konvergieren ``x_k`` und das Verhältnis ``\lVert x_k \rVert_2 / \lVert x_{k-1} \rVert_2`` für $A_1$ nach wenigen Iterationen zu festen Werten, während es für $A_2$ oszilliert. Was ist der Unterschied zwischen den beiden Matrizen? """ # ╔═╡ 53f6f71e-f2db-4823-b93a-6c102f43bb5e md""" ## Vektoriteration """ # ╔═╡ 0477e58b-e9eb-4ce4-af2a-a8d3b1150955 md""" Für die Vektoriteration formulieren folgenden Satz: > **Satz (Vektoriteration)** > > Sei $A \in \mathbb{R}^{n\times n}$ diagonalisierbar mit normierten Eigenvektoren > $v_j \in \mathbb{R}^n$ ($j = 1, \ldots, n$) und Eigenwerten $\lambda_j \in > \mathbb{R}$, $|\lambda_1| > |\lambda_2| > \ldots > |\lambda_n|$. > Mit Startvektor $x_0 \in \mathbb{R}^n$ beliebig (bis auf Lebesgue-Nullmenge) > betrachten wir die **Vektoriteration** mit den Folgen $(x_k)_{k\in\mathbb{N}}$ und $(r_k)_{k\in\mathbb{N}}$, > ```math > x_k = A x_{k-1}, \qquad r_k = \frac{x_k^\intercal \, A \, x_k}{x_k^\intercal \, x_k}. > ``` > Für ``k \to \infty`` konvergiert ``(r_k)_{k\in\mathbb{N}}`` gegen den dominanten > Eigenwert ``\lambda_1`` und ``(x_k)_{k\in\mathbb{N}}`` gegen ein Vielfaches > von ``v_1``. > > Insbesondere liefern $r_k$ und $x_k/\lVert x_k \rVert_2$ (für $k$ ausreichend groß) Näherungen > für den betragsmäßig größten Eigenwert von $A$ und dessen Eigenvektor. """ # ╔═╡ cb81245b-ffe2-479f-a76f-915650055ce5 md""" *Beweis* Wegen Diagonalisierbarkeit lässt sich $x_0$ darstellen als ```math x_0 = \sum\limits_{j=1}^n \alpha_j v_j, \qquad \alpha_j \in \mathbb{R}. ``` Mit $\alpha_1 \neq 0$ (Bedingung) gilt ```math \begin{align} x_k = A x_{k-1} = A^k x_0 = A^k \left(\alpha_1 v_1 + \sum\limits_{j=2}^n \alpha_j v_j\right)&= \alpha_1 \lambda_1^k v_1 + \sum\limits_{j=2}^n \alpha_j \lambda_j^k v_j\nonumber\\ &= \underbrace{\alpha_1 \lambda_1^k}_{\eqqcolon \beta_k} \biggl(v_1 + \underbrace{\sum\limits_{j=2}^n \frac{\alpha_j}{\alpha_1} \left(\frac{\lambda_j}{\lambda_1}\right)^k v_j}_{\eqqcolon \epsilon_k}\biggr)\\ & = \beta_k (v_1 + \epsilon_k)\nonumber. \end{align} ``` Da $\left|\frac{\lambda_j}{\lambda_1}\right| < \left|\frac{\lambda_2}{\lambda_1}\right| < 1$ für $j = 2, \ldots, n$, gilt ```math \begin{equation} \lVert{\epsilon_k}\rVert_2 = \mathcal{O}\left(\left|\frac{\lambda_2}{\lambda_1}\right|^k\right)\qquad (k \to \infty). \end{equation} ``` Somit erhalten wir ```math \begin{equation} \lVert{\beta_k^{-1} x_k - v_1}\rVert_2 = \lVert{\epsilon_k}\rVert_2 = \mathcal{O}\left(\left|\frac{\lambda_2}{\lambda_1}\right|^k\right)\qquad (k \to \infty) \end{equation} ``` und damit ```math \begin{equation} \lim\limits_{k \to \infty} \frac{x_k}{\lVert{x_k}\rVert_2} = \lim\limits_{k \to \infty} \frac{\beta_k (v_1 + \epsilon_k)}{\lVert{\beta_k (v_1 + \epsilon_k)}\rVert_2} = \lim\limits_{k \to \infty} \frac{\beta_k}{|\beta_k|} \frac{v_1}{\lVert{v_1}\rVert_2} = \pm v_1 \end{equation} ``` Weiter gilt ```math \begin{align} r_k &= \frac{x_k^\intercal \, A\, x_k}{x_k^\intercal \, x_k} = \frac{\beta_k (v_1 + \epsilon_k)^\intercal \, A\, \beta_k (v_1 + \epsilon_k)}{\beta_k (v_1 + \epsilon_k)^\intercal \, \beta_k (v_1 + \epsilon_k)} = \lambda_1\frac{(v_1 + \epsilon_k)^\intercal \, (v_1 + \epsilon_{k+1})}{(v_1 + \epsilon_k)^\intercal \, (v_1 + \epsilon_k)} \nonumber \\ &= \lambda_1\frac{1 + \mathcal{O}(|\frac{\lambda_2}{\lambda_1}|^k)}{1 + \mathcal{O}(|\frac{\lambda_2}{\lambda_1}|^k)} = \lambda_1(1 + \mathcal{O}(|\frac{\lambda_2}{\lambda_1}|^k)) \qquad (k \to \infty), \end{align} ``` und damit ```math \begin{align} \lim\limits_{k \to \infty} r_k = \lambda_1.\\ ~\tag*{$\square$} \end{align} ``` """ # ╔═╡ cd220d2e-6c9e-43f1-a02c-2685aa6ad941 md""" **Bemerkungen** 1) ``r_k`` ist auch als _Rayleigh-Koeffizieznt_ bekannt. 2) In der Praxis ist $\alpha_1 \neq 0$ schwierig $\Rightarrow$ durch Rundungsfehler meist $|\alpha_1| \gtrapprox 0$ 3) konvergiert linear $\Rightarrow$ schneller bei größerem Abstand der Eigenwerte 4) Da $\lambda_1^k \to \{\infty, 0\} \text{ für } k \to \infty \Rightarrow$ Normierung in jedem Schritt mit $\tilde{x}_k = x_k / \lVert{x_k}\rVert_2$ 5) alternative Namen: *Von-Mises-Iteration*, *Potenzmethode*, engl. *power method* """ # ╔═╡ de41d679-58ff-43fb-b268-61f5818d53d5 md""" Rückblickend auf das obige Beispiel können wir jetzt das obige Beispiel mit den beiden ``2 \times 2`` Matrizen erklären: Während die Matrix ``A_1`` die Eigenwerte $(sort(eigvals(A₁), rev=true)[1]) und $(sort(eigvals(A₁), rev=true)[2]) hat, sind hat ``A_2`` die Eigenwerte $(sort(eigvals(A₂), rev=true)[1]) und $(sort(eigvals(A₂), rev=true)[2]). Damit ist klar, dass die Vektoriteration für ``A_2`` nicht funktionieren kann, da ``A_2`` keinen dominanten Eigenwert hat! """ # ╔═╡ 2882da9a-f8be-492d-87cb-6c048f41e8b7 md""" **Algorithmus** Wir definieren die Funktion `vector_iteration(A, x₀, kₘₐₓ)`, die mittels Vektoriteration einen Näherung für den größten Eigenwert von `A` und dessen Eigenvektor bestimmt. `x₀` ist der Startvektor und `kₘₐₓ` die Anzahl an Iterationen. """ # ╔═╡ fb56e70d-52d5-4b19-94b4-0fbe186b9002 function vector_iteration(A, x₀, kₘₐₓ) x̃ₖ = x̃ₖ₋₁ = x₀ / norm(x₀) rₖ = 0.0 for k in 1:kₘₐₓ xₖ = A * x̃ₖ₋₁ x̃ₖ = xₖ / norm(xₖ) rₖ = dot(x̃ₖ₋₁, xₖ) x̃ₖ₋₁ = x̃ₖ end return rₖ, x̃ₖ end # ╔═╡ 185b8a6d-bee8-4eb2-8ae4-0f74641d1339 md""" ### Beispiel: PageRank als Eigenvektor der Link-Matrix Wir wollen mit Hilfe der Vektoriteration die Linkpopularität für ein Netzwerk von Webseiten mit Hilfe des [PageRanks](https://de.wikipedia.org/wiki/PageRank) bestimmen, der bei und für Google entwickelt wurde. Der Einfachheit halber beschränken wir uns hier auf das PageRank-Verfahren für stark zusammenhängende Netzwerke, d.h. dass jede Webseite von jeder anderen durch das Folgen einer endliche Anzahl von Links erreichbar ist. Weiterhin verwenden wir das Verfahren ohne Dämpfungswert. Für mehr Informationen sei hier auf den folgenden Artikel verwiesen, dessen Ausführungen wir hier folgen: > Bryan, Leise, *The $25,000,000,000 Eigenvector: The Linear Algebra behind Google*, SIAM Review 48(3), pp. 569-581, 2006. [doi:10.1137/050623280](https://doi.org/10.1137/050623280) Hier werden wir das folgende Netzwerk mit den fünf Webseiten ``k \in \{1, 2, 3, 4, 5\}`` betrachten. Die schwarzen Pfeile zeigen Verweise von einer Webseite auf eine andere an. Ein Doppelpfeil bedeutet, dass die Webseiten sich gegenseitig verlinken. $(Resource("https://raw.githubusercontent.com/sloede/vektoriteration/main/assets/web-unweighted.png", :width => 400, :alt => "web-unweighted.png")) Die Idee hinter dem PageRank-Algorithmus ist wie folgt: * Jede Webseite bekommt einen Wert ``x_k`` für die Linkpopularität zugewiesen. * Der Wert ``x_k`` berechnet sich aus der Summe der Linkpopularitäten derjenigen Webseiten, die auf die Seite ``k`` verlinken. * Jede Webseite bekommt maximal eine "Stimme", d.h. die Linkpopularität ``x_j`` einer Seite ``j`` wird durch die Gesamtanzahl der ausgehenden Links der Webseite ``n_j`` geteilt. Für ein Netz mit ``n`` Seiten wird die Bedeutung einer Webseite ``k`` also durch ```math x_k = \sum\limits_{j \in V_k} \frac{x_{j}}{n_j} ``` beschrieben, wobei ``V_k \subset \{1, 2, \ldots, n\}`` die Menge an Webseiten ist, die auf Webseite ``k`` verweisen, wobei ``k \notin V_k``. Dies führt auf ein lineares Gleichungssystem ```math Lx = x, ``` wobei ``x`` der Vektor der gesuchten Linkpopularitäten ist. Die Link-Matrix ``L`` enthält die Einträge ```math l_{ij} = \begin{cases} \frac{x_{j}}{n_j}, & \text{falls}\ j \in V_i\\ 0, & \text{sonst} \end{cases} ``` Die zugehörige Link-Matrix ``L`` sieht folgendermaßen aus: """ # ╔═╡ 14f241c2-7622-485f-8fed-ac95201ccf6e # A B C D E L = [0.0 0.0 0.0 0.0 1/2; # A 1/4 0.0 0.0 0.0 0.0; # B 1/4 1.0 0.0 0.0 0.0; # C 1/4 0.0 1/2 0.0 1/2; # D 1/4 0.0 1/2 1.0 0.0] # E # ╔═╡ 88597162-b4be-45c1-aadd-f4ee83732b87 md""" Damit ist klar, dass der gesuchte PageRank ``x`` der Eigenwert zu ``L`` mit dem Eigenwert ``1`` ist! Wir nutzen nun die **Vektoriteration** um den größten Eigenwert und den zugehörigen Eigenvektor zu finden. Als Startvektor verwenden wir ``x_0 = (1, 1, 1, 1, 1)^\intercal``. Da ``L`` [spaltenstochastisch](https://de.wikipedia.org/wiki/%C3%9Cbergangsmatrix) ist, erwarten wir den größten Eigenwert bei ``\lambda_1 = 1`` zu finden. """ # ╔═╡ b565b8af-4793-4737-8691-84cf1d36c2df md""" Anzahl der Iterationen `kₘₐₓ`: $(@bind n_pr Slider(1:50, default=1, show_value=true)) """ # ╔═╡ af8b394d-e365-4531-8dc2-e9d9af5caabe begin x₀_pr = ones(size(L, 1)) λ₁_pr = Vector{Float64}(undef, n_pr) v₁_pr = x₀_pr ev_pr = sort(eigvals(L), by=abs, rev=true) err_pr = Vector{Float64}(undef, n_pr) for i in 1:n_pr global λ₁_pr, v₁_pr λ₁_pr[i], v₁_pr = vector_iteration(L, v₁_pr, 1) err_pr[i] = abs(λ₁_pr[i] - ev_pr[1]) end # Latex v₁_pr_latex = round.(normalize(v₁_pr, 1), digits=3) # Plot p1_pr = plot(xlims=(0,50), ylims=(0.9,1.1), legend=:bottomright, xlabel="Anzahl Iterationen", ylabel="Eigenwert") plot!(p1_pr, [0,50], [1,1], lw=2, label="exakt (λ = 1)") plot!(p1_pr, λ₁_pr, lw=2, label="rₖ", color=:black) pr_conv = plot(xlims=(0,50), ylims=(1e-15,10), legend=:bottomright, yaxis=:log, xlabel="Anzahl Iterationen", ylabel=L"|\lambda_1 - r_k|") plot!(pr_conv, 1:100, x->abs(ev_pr[2]/ev_pr[1])^(x), label=L"|\lambda_2/\lambda_1|^{k}") plot!(pr_conv, err_pr, lw=2, label="", color=:black) plot(p1_pr, pr_conv) end # ╔═╡ 7d7aca6f-70af-410b-816d-c5e926a75649 md""" Im Folgenden sieht man die aktualle Näherung für den größten Eigenwert ``r_k \approx \lambda_1`` und dessen normierter Eigenvektor ``\tilde{x}_k \approx v_1/\lVert v_1 \rVert_2``. Wir normieren ``\tilde{x}_k`` hier zusätzlich mit der ``L^1``-Norm um den prozentualen PageRank zu erhalten): """ # ╔═╡ 442d7c96-6fb4-40ce-9809-e28aec61f54d L""" r_k = %$(round(last(λ₁_pr), digits=8)) \qquad \frac{\tilde{x}_k}{\lVert \tilde{x}_k \rVert_1} = %$(latexify(v₁_pr_latex)) """ # ╔═╡ eebb99c8-642c-4505-81a7-9ca8e4baed59 md""" Damit sieht das obige Netzwerk nach PageRank gewichtet folgendermaßen aus (Kreisfläche entspricht dem PageRank): $(Resource("https://raw.githubusercontent.com/sloede/vektoriteration/main/assets/web-pageranked.png", :width => 400, :alt => "web-pageranked")) """ # ╔═╡ 411c8729-8d24-4161-9dc3-f9da870d39ea md""" ## Inverse Iteration """ # ╔═╡ 39648856-a31b-49f4-927a-655cf503c92f md""" Mit der Vektoriteration können wir also den betragsmäßig größten Eigenwert einer Matrix und den zugehörigen Eigenvektor iterativ bestimmen. Was aber, wenn wir an einem _beliebigen_ Eigenwert und dessen Eigenvektor interessiert sind? Hier hilft uns der folgende Satz weiter: """ # ╔═╡ 8070f70f-dde3-4599-be69-298455fcfb20 md""" > **Satz** > > Sei $A$ regulär und diagonalisierbar mit Eigenwerten ``\lambda_j`` (``j = 1, > \ldots, n``) und Eigenvektoren ``v_j``. Weiterhin sei $\mu \approx \lambda_j$ > ein Schätzwert für $\lambda_j$, sodass > ```math > 0 < | \lambda_j - \mu | < | \lambda_i - \mu |, \qquad \forall i \neq j.\tag{$*$} > ``` > Dann ist ``\tilde{\lambda}_j = (\lambda_j - \mu)^{-1}`` der größte Eigenwert > der Matrix ``\tilde{A} = (A - \mu I)^{-1}`` und ``v_1`` der zugehörige Eigenvektor. """ # ╔═╡ 97e7345a-fdbc-4662-8d82-fd34bc373de9 md""" *Beweis* Es gilt ```math \begin{align} & &A v_j &= \lambda_j v_j \\ &\iff &A v_j - \mu v_j &= \lambda_j - \mu v_j \\ &\iff &(A - \mu I) v_j &= (\lambda_j - \mu) v_j\\ &\iff &\frac{(A - \mu I)^{-1}}{\lambda_j - \mu} (A - \mu I) v_j &= \frac{(A - \mu I)^{-1}}{\lambda_j - \mu} (\lambda_j - \mu) v_j\\ &\iff &\frac{1}{\lambda_j - \mu} v_j &= (A - \mu I)^{-1} v_j \\ &\iff &\tilde{\lambda}_j v_j &= \tilde{A} v_j \end{align} ``` Damit ist ``\tilde{\lambda}_j`` ein Eigenwert von ``\tilde{A}`` mit Eigenvektor ``v_j``. Wegen ``(*)`` ist ``|\tilde{\lambda}_j| = |\lambda_j - \mu|^{-1}`` der betragsmäßig größte Eigenwert. ```math ~\tag*{$\square$} ``` """ # ╔═╡ 8bbd0348-4e18-44c0-801a-439f57917eac md""" Aufgrund dieses Satzes kann mit ``\tilde{A}`` als Iterationsmatrix für die *Vektoriteration* der gesuchte Eigenwert ``\lambda_j`` mit ```math \lambda_j = \frac{1}{r_k} + \mu ``` bestimmt werden. Dieses Verfahren ist als **inverse Iteration mit spektraler Verschiebung** bekannt. **Bemerkungen** 1. Den Schätzwert ``\mu`` erhält man z.B. mit Gregorschin-Kreisen oder aus unvollständigem QR-Verfahren. 2. In der Praxis wird eher direkt das QR-Verfahren oder Arnoldi-Iteration eingesetzt. """ # ╔═╡ 7c05afce-9d19-49dc-a450-c91be54203a2 md""" **Algorithmus** Wir definieren die Funktion `inverse_iteration(A, x₀, kₘₐₓ; μ = 0.0)`, die mittels inverser Iteration eine Näherung für denjenigen Eigenwert von `A` bestimmt, der `μ` am nächsten liegt, sowie für dessen Eigenvektor. `x₀` ist wieder der Startvektor und `kₘₐₓ` die Anzahl an Iterationen. Aus [Stabilitäts- und Geschwindigkeitsgründen](https://gregorygundersen.com/blog/2020/12/09/matrix-inversion/) berechnen wir nicht direkt die Inverse von $A - \mu I$, sondern zuächst eine Faktorisierung mittels der Julia-Funktion [`factorize`](https://docs.julialang.org/en/v1/stdlib/LinearAlgebra/#LinearAlgebra.factorize). Dies liefert uns eine passende Faktorisierung der Matrix (z.B. Cholesky oder LR oder QR). Mit dem Operator `\` für die Matrix-Linksdivision wird dann automatisch die richtige Substitution angewandt. """ # ╔═╡ a85c7d4a-8e60-4782-9606-99bf03462b7b function inverse_iteration(A, x₀, kₘₐₓ; μ = 0.0) x̃ₖ = x̃ₖ₋₁ = x₀ / norm(x₀) rₖ = 0.0 fac = factorize(A - μ*I) for k in 1:kₘₐₓ xₖ = fac \ x̃ₖ₋₁ x̃ₖ = xₖ / norm(xₖ) rₖ = dot(x̃ₖ₋₁, xₖ) x̃ₖ₋₁ = x̃ₖ end return 1/rₖ + μ, x̃ₖ end # ╔═╡ 22f00588-4596-4a59-b2c5-5bb3ea2cf45c md""" ### Beispiel: Eigenwerte der Poisson-Matrix #### Stationäre Wärmeleitungsgleichung Wir betrachten die zwei-dimensionale Wärmeleitungsgleichung, ```math \begin{equation} \frac{\partial^2 u}{\partial x^2} + \frac{\partial^2 u}{\partial y^2} = -f, \end{equation} ``` Hier ist ``u(x, y)`` die Temperatur, ``x`` und ``y`` sind die räumlichen Richtungen und ``f(x, y)`` ist eine bekannte Wärmequelle. Die stationäre Wärmeleitungsgleichung ist ein prototypisches Beispiel für die sogenannte *Poisson-Gleichung*. #### Diskretisierung des Rechengebiets Unser Berechnungsgebiet ist $\Omega = [0, 1]^2$, und wir nehmen an, dass $u$ an allen Grenzen null ist, d.h., $u(x,y) = 0$, wenn $x \in \{0,1\}$ oder $y \in \{0, 1\}$. Wir diskretisieren unser Gebiet mit $N + 1$ Knoten in jeder räumlichen Richtung auf einem rechteckigen Gitter. Die Knoten $(x_i, y_j)$ mit $i, j = 0, 1, \ldots, N$ sind äquidistant platziert und ihre Positionen werden wie folgt berechnet: ```math \begin{align} x_i &= ih,\\ y_j &= jh, \end{align} ``` wobei $h = 1/N$ der Abstand zwischen den Knoten in jeder Achsenrichtung ist. #### Diskretisierung der Poisson-Gleichung Für die Diskretisierung der Poisson-Gleichung verwenden wir zentrale Differenzen zweiter Ordnung, um die partielle Ableitung in der $x$-Richtung zu approximieren, ```math \frac{\partial^2 u(x, y)}{\partial x^2} \approx \frac{u(x-h, y) - 2 u(x, y) + u(x+h, y)}{h^2} ``` und ebenso für die Ableitung in der $y$-Richtung. Eingesetzt in die obige Poisson-Gleichung erhalten wir ```math \begin{equation} \frac{u_{i-1,j} - 2 u_{i,j} + u_{i+1,j}}{h^2} + \frac{u_{i,j-1} - 2 u_{i,j} + u_{i,j+1}}{h^2} = -f_{i,j},\quad i,j = 1, \ldots, N-1, \end{equation} ``` wobei $u_{i,j} = u(x_i, y_j)$ der Wert der Temperatur am Knotenpunkt $(i,j$) und $f_{i,j} = f(x_i, y_j)$ ist. Diese Gleichung können wir weiter vereinfachen zu ```math \begin{equation} u_{i-1,j} + u_{i,j-1} - 4 u_{i,j} + u_{i+1,j} + u_{i,j+1} = -h^2 f_{i,j},\quad i,j = 1, \ldots, N-1, \quad (*) \end{equation} ``` Im folgenden Diagramm kann man das Gebiet $\Omega$ und die Knotenpositionen für das gewählte $N$ sehen (violette Kreise für innere Knoten, rote Diamanten für Randknoten). Die grüne Umrandung stellt den Differenzenstern für $(i, j) = (4,2)$ dar, d.h. sie umfasst alle Nachbarknoten, die verwendet werden, um die Lösung am zentralen Knoten zu berechnen. """ # ╔═╡ fc205e85-36af-44aa-acaf-ee4c4d938e49 md""" #### Die Poisson-Matrix Aus der obigen Gleichung ``(*)`` können wir unsere Koeffizientenmatrix ``A`` zusammenstellen, die wir durch die Finite-Differenzen-Diskretisierung des Laplace-Operators erhalten. Für das diskrete Poisson-Problem erhalten wir damit das folgende lineare Gleichungssystem ```math A u = b ``` (siehe z.B. *Schwarz/Köckler, Numerische Mathematik, Springer-Verlag, 2009*). Hier entspricht $u$ dem Vektor mit den unbekannten Temperaturwerten $u_{i,j}$ und $b$ enthält die Werte der rechten Seite der obigen Gleichung, d.h. $-h^2 f_{i,j}$. Das folgende Diagramm zeigt dünnbesetzte Struktur der Poisson-Matrix $A$. """ # ╔═╡ b0b50c67-5cd2-48b8-8bb8-d155f5ef84fe md""" Anzahl der Gitterintervalle `N`: $(@bind N Slider(4:30, default=10, show_value=true)) """ # ╔═╡ 991873a3-5474-41ef-a5ac-318bc63e2b96 begin h = 1 / N plot([0.0, 1.0, 1.0, 0.0, 0.0], [0.0, 0.0, 1.0, 1.0, 0.0], aspect_ratio=:equal, xlims=(-0.1, 1.1), ylims=(-0.1, 1.1), label=L"\partial\Omega", color=:black, lw=3) plot!([0.0, 1.0], [1.0, 1.0], fillrange=0, fillcolor=:black, fillalpha=0.1, label="") scatter!([(x, y) for x in (0.0+h):h:(1.0-h) for y in (0.0+h):h:(1.0-h)], color=:violet, label="Innere Knoten") scatter!([(x, y) for x in 0.0:h:1.0 for y in 0:1], color=:red, label="Randknoten", markershape=:diamond) scatter!([(x, y) for x in 0:1 for y in (0.0+h):h:(1.0-h)], color=:red, label="", markershape=:diamond) cx, cy = (4*h, 2*h) plot!([ (cx-0.2h, cy-1.2h), (cx+0.2h, cy-1.2h), (cx+0.2h, cy-0.2h), (cx+0.2h, cy-0.2h), (cx+1.2h, cy-0.2h), (cx+1.2h, cy+0.2h), (cx+0.2h, cy+0.2h), (cx+0.2h, cy+1.2h), (cx-0.2h, cy+1.2h), (cx-0.2h, cy+0.2h), (cx-1.2h, cy+0.2h), (cx-1.2h, cy-0.2h), (cx-0.2h, cy-0.2h), (cx-0.2h, cy-1.2h), ], lw=2, label="Differenzenstern", color=:green) end # ╔═╡ eb900a1e-0cbe-4815-9907-83465c391b5f begin # N = 10 m = (N - 1)^2 # Matrix size # Banded matrix with full bands A = diagm( 0 => fill( 4, m), 1 => fill(-1, m - 1), N-1 => fill(-1, m - (N - 1)), -1 => fill(-1, m - 1), -(N-1) => fill(-1, m - (N - 1)), ) # Reset values to obtain block structure for i in (N - 1):(N - 1):(m - 1) A[i, i+1] = 0 A[i+1, i] = 0 end markersize = if N == 4 15 elseif N == 5 11 elseif N == 6 7 elseif N == 7 4 elseif N == 8 3 else 2 end markersizes_small = Dict(5=>11, 6=>7, 7=>4, 8=>3) spy(A - UniformScaling(5), markersize=markersize, markershape=:square) end # ╔═╡ 28b2df59-4771-4ebb-b7b9-a968b8e7609e md""" Die numerischen Werte von ``A`` sind wie folgt: """ # ╔═╡ 267f209c-d5c7-4a99-81dd-986c324e9536 A # ╔═╡ 311715b5-c9e3-472a-a367-9197d4d2c4bf md""" #### Bestimmung der Eigenwerte Wir verwenden zunächst die **Vektoriteration** um den **größten** Eigenwert zu finden: """ # ╔═╡ 10606746-08a0-4a33-a9fc-2729085bf81e md""" Anzahl der Iterationen `kₘₐₓ`: $(@bind n_po Slider(1:100, default=1, show_value=true)) Zufälliger Startvektor x₀: $(@bind v0_po_random CheckBox()) $(@bind go_po1 Button("Neuer Wert")) """ # ╔═╡ 48aafe7c-f732-48b6-91ad-9d1d88099c69 md""" Als Startvektor wird hier ``x_0 = (1, 1, \ldots, 1)^\intercal`` gewählt. Man kann aber auch mit zufälligen Startvektoren experimentieren. """ # ╔═╡ f1685b3e-a053-4426-a095-dd67b30b506b md""" Mit der **inversen Vektoriteration** lassen sich **beliebige** Eigenwerte und deren Eigenvektoren von $A$ ermitteln. Da $A$ auch mehrfache Eigenwerte hat, findet die inverse Iteration in diesem Fall einen Vektor aus dem zugehörigen Eigenraum. """ # ╔═╡ dea60eea-61ce-4c83-84cd-1529b2f122d8 md""" Anzahl der Iterationen `kₘₐₓ`: $(@bind n1_po Slider(1:100, default=1, show_value=true)) Zufälliger Startvektor x₀: $(@bind v0_po1_random CheckBox()) $(@bind go_po2 Button("Neuer Wert")) Schätzwert `μ`: $(@bind mu_po Slider(0.0:0.01:8, default=0, show_value=true)) """ # ╔═╡ a2dff9e4-b5a5-44ed-886e-b7f1caa6d9e6 md""" ## Verwendete Julia Pakete Lade die notwendigen Julia Pakete: * `LinearAlgebra` für Funktionen wie `norm`, `eigvals` etc. * `Plots` für alle dynamisch erzeugten Visualiserungen * `PlutoUI` für alle aktiven Steuerungselemente wie Slider, Checkbox etc. * `LaTeXStrings` und `Latexify` zur Darstellung von mathematischen Symbolen """ # ╔═╡ cb3e8dce-f0e2-4dbf-8fae-0316c9cd2087 md""" ## Hilfsfunktionen """ # ╔═╡ a59808d1-d04e-4489-bc67-5be2a891828c md""" Die folgende Funktion `inverse_iteration` erlaubt einem eine vor-faktorisierte Matrix zu verwenden um ggf. Rechenzeit zu sparen: """ # ╔═╡ 3519382a-7805-47c5-aba9-f4c0c47e8779 function inverse_iteration(A::Factorization, x₀, kₘₐₓ; μ = 0.0) x̃ₖ = x̃ₖ₋₁ = x₀ / norm(x₀) rₖ = 0.0 for k in 1:kₘₐₓ xₖ = A \ x̃ₖ₋₁ x̃ₖ = xₖ / norm(xₖ) rₖ = dot(x̃ₖ₋₁, xₖ) x̃ₖ₋₁ = x̃ₖ end return 1/rₖ + μ, x̃ₖ end # ╔═╡ 4437e45e-eee7-4b06-8b69-8ae79b070c8e begin x₀_po = v0_po1_random ? rand(size(A, 1)) : ones(size(A, 1)) λ_po = Vector{Float64}(undef, n1_po) v_po = x₀_po fac = factorize(A - mu_po*I) for i in 1:n1_po global λ_po, v_po λ_po[i], v_po = inverse_iteration(fac, v_po, 1; μ = mu_po) end go_po2 # trigger for recomputation # Latex v_po_latex = round.(normalize(v_po, 1), digits=3) # Actual ev = reverse(eigvals(A)) # Plot p2_po = plot(xlims=(0,100), ylims=(0,8.1), legend=:bottomright, xlabel="Anzahl Iterationen", ylabel="Eigenwert") for i in [1, 2, 3, 4, 5, 6, 7, 8, length(ev)] plot!(p2_po, [0,100], [ev[i], ev[i]], lw=2, label=L"\lambda_{%$(i)}") end plot!(p2_po, λ_po, lw=2, label="rₖ", color=:black) plot!(p2_po, [0,100], [mu_po, mu_po], lw=2, label="μ", color=:grey, ls=:dash) plot(p2_po) end # ╔═╡ 8240e920-c264-4aa7-b068-0dfff2c10152 begin λ₁_po = Vector{Float64}(undef, n_po) v₁_po = v0_po_random ? rand(size(A, 1)) : ones(size(A, 1)) err_po = Vector{Float64}(undef, n_po) for i in 1:n_po global λ₁_po, v₁_po λ₁_po[i], v₁_po = vector_iteration(A, v₁_po, 1) err_po[i] = abs(λ₁_po[i] - ev[1]) end go_po1 # Trigger to recompute # Plot p1_po = plot(xlims=(0,100), ylims=(0,8.1), legend=:bottomright, xlabel="Anzahl Iterationen", ylabel="Eigenwert") plot!(p1_po, [0,100], [ev[1], ev[1]], lw=2, label="λ₁") plot!(p1_po, λ₁_po, lw=2, label="rₖ", color=:black) p1_conv = plot(xlims=(0,100), ylims=(1e-6,10), legend=:bottomright, yaxis=:log, xlabel="Anzahl Iterationen", ylabel=L"|\lambda_1 - r_k|") plot!(p1_conv, 1:100, x->abs(ev[2]/ev[1])^(x), label=L"|\lambda_2/\lambda_1|^{k}") plot!(p1_conv, err_po, lw=2, label="", color=:black) plot(p1_po, p1_conv) end # ╔═╡ eee2a835-be16-4f43-8c98-51f81c4008d2 md""" Aktuelle Nährung für den Eigenwert: ``r_k = `` $(round(last(λ₁_po), digits=8)) """ # ╔═╡ ec5638dc-f886-4d45-a40b-8ddb827b98b7 md""" Aktuelle Nährung für den Eigenwert: ``r_k = `` $(round(last(λ_po), digits=8)) """ # ╔═╡ 00000000-0000-0000-0000-000000000001 PLUTO_PROJECT_TOML_CONTENTS = """ [deps] LaTeXStrings = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" Latexify = "23fbe1c1-3f47-55db-b15f-69d7ec21a316" LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" PlutoUI = "7f904dfe-b85e-4ff6-b463-dae2292396a8" [compat] LaTeXStrings = "~1.3.1" Latexify = "~0.16.1" Plots = "~1.39.0" PlutoUI = "~0.7.53" """ # ╔═╡ 00000000-0000-0000-0000-000000000002 PLUTO_MANIFEST_TOML_CONTENTS = """ # This file is machine-generated - editing it directly is not advised julia_version = "1.9.4" manifest_format = "2.0" project_hash = "e707d60a9cc699285c161b648400f7e80d8e17b9" [[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.BitFlags]] git-tree-sha1 = "2dc09997850d68179b69dafb58ae806167a32b1b" uuid = "d1d4a3ce-64b1-5f1a-9ba4-7e7e69966f35" version = "0.1.8" [[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 = "cd67fc487743b2f0fd4380d4cbd3a24660d0eec8" uuid = "944b1d66-785c-5afd-91f1-9de20f533193" version = "0.7.3" [[deps.ColorSchemes]] deps = ["ColorTypes", "ColorVectorSpace", "Colors", "FixedPointNumbers", "PrecompileTools", "Random"] git-tree-sha1 = "67c1f244b991cad9b0aa4b7540fb758c2488b129" uuid = "35d6a980-a343-548e-a6ea-1d62b119f2f4" version = "3.24.0" [[deps.ColorTypes]] deps = ["FixedPointNumbers", "Random"] git-tree-sha1 = "eb7f0f8307f71fac7c606984ea5fb2817275d6e4" uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f" version = "0.11.4" [[deps.ColorVectorSpace]] deps = ["ColorTypes", "FixedPointNumbers", "LinearAlgebra", "Requires", "Statistics", "TensorCore"] git-tree-sha1 = "a1f44953f2382ebb937d60dafbe2deea4bd23249" uuid = "c3611d14-8923-5661-9e6a-0046d554d3a4" version = "0.10.0" [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 = "8a62af3e248a8c4bad6b32cbbe663ae02275e32c" uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" version = "4.10.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 = "8cfa272e8bdedfa88b6aefbbca7c19f1befac519" uuid = "f0e56b4a-5159-44fe-b623-3e5288b988bb" version = "2.3.0" [[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.EpollShim_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] git-tree-sha1 = "8e9441ee83492030ace98f9789a654a6d0b1f643" uuid = "2702e6a9-849d-5ed8-8c21-79e8b8f9ee43" version = "0.0.20230411+0" [[deps.ExceptionUnwrapping]] deps = ["Test"] git-tree-sha1 = "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", "Zlib_jll", "libaom_jll", "libass_jll", "libfdk_aac_jll", "libvorbis_jll", "x264_jll", "x265_jll"] git-tree-sha1 = "466d45dc38e15794ec7d5d63ec03d776a9aff36e" uuid = "b22a6f82-2f65-5046-a5b2-351ab43fb4e5" version = "4.4.4+1" [[deps.FileWatching]] uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" [[deps.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 = "27442171f28c952804dede8ff72828a96f2bfc1f" uuid = "28b8d3ca-fb5f-59d9-8090-bfdbd6d07a71" version = "0.72.10" [[deps.GR_jll]] deps = ["Artifacts", "Bzip2_jll", "Cairo_jll", "FFMPEG_jll", "Fontconfig_jll", "FreeType2_jll", "GLFW_jll", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Libtiff_jll", "Pixman_jll", "Qt6Base_jll", "Zlib_jll", "libpng_jll"] git-tree-sha1 = "025d171a2847f616becc0f84c8dc62fe18f0f6dd" uuid = "d2c73de3-f751-5644-a686-071e5b155ba9" version = "0.72.10+0" [[deps.Gettext_jll]] deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Libiconv_jll", "Pkg", "XML2_jll"] git-tree-sha1 = "9b02998aba7bf074d14de89f9d37ca24a1a0b046" uuid = "78b55507-aeef-58d4-861c-77aaff3498b1" version = "0.21.0+0" [[deps.Glib_jll]] deps = ["Artifacts", "Gettext_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Libiconv_jll", "Libmount_jll", "PCRE2_jll", "Zlib_jll"] git-tree-sha1 = "e94c92c7bf4819685eb80186d51c43e71d4afa17" uuid = "7746bdde-850d-59dc-9ae8-88ece973131d" version = "2.76.5+0" [[deps.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 = "5eab648309e2e060198b45820af1a37182de3cce" uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3" version = "1.10.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 = "7134810b1afce04bbc1045ca1985fbe81ce17653" uuid = "ac1192a8-f4b3-4bfe-ba22-af5b92cd3ab2" version = "0.9.5" [[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 = "9fb0b890adab1c0a4a475d4210d51f228bfc250d" uuid = "1019f520-868f-41f5-a6de-eb00f4b6a39c" version = "0.1.6" [[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 = "50901ebc375ed41dbf8058da26f9de442febbbec" uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" version = "1.3.1" [[deps.Latexify]] deps = ["Formatting", "InteractiveUtils", "LaTeXStrings", "MacroTools", "Markdown", "OrderedCollections", "Printf", "Requires"] git-tree-sha1 = "f428ae552340899a935973270b8d98e5a31c49fe" uuid = "23fbe1c1-3f47-55db-b15f-69d7ec21a316" version = "0.16.1" [deps.Latexify.extensions] DataFramesExt = "DataFrames" SymEngineExt = "SymEngine" [deps.Latexify.weakdeps] DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" SymEngine = "123dc426-2d89-5057-bbad-38513e3affd8" [[deps.LibCURL]] deps = ["LibCURL_jll", "MozillaCACerts_jll"] uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" version = "0.6.4" [[deps.LibCURL_jll]] deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" version = "8.4.0+0" [[deps.LibGit2]] deps = ["Base64", "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.11.0+1" [[deps.Libdl]] uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" [[deps.Libffi_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] git-tree-sha1 = "0b4a5d71f3e5200a7dff793393e09dfc2d874290" uuid = "e9f186c6-92d2-5b65-8a66-fee21dc1b490" version = "3.2.2+1" [[deps.Libgcrypt_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgpg_error_jll", "Pkg"] git-tree-sha1 = "64613c82a59c120435c067c2b809fc61cf5166ae" uuid = "d4300ac3-e22c-5743-9152-c294e39db1e4" version = "1.8.7+0" [[deps.Libglvnd_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll", "Xorg_libXext_jll"] git-tree-sha1 = "6f73d1dd803986947b2c750138528a999a6c7733" uuid = "7e76a0d4-f3c7-5321-8279-8d96eeed0f29" version = "1.6.0+0" [[deps.Libgpg_error_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] git-tree-sha1 = "c333716e46366857753e273ce6a69ee0945a6db9" uuid = "7add5ba3-2f88-524e-9cd5-f83b8a55f7b8" version = "1.42.0+0" [[deps.Libiconv_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] git-tree-sha1 = "f9557a255370125b405568f9767d6d195822a175" uuid = "94ce4f54-9a6c-5748-9c1c-f9c7231a4531" version = "1.17.0+0" [[deps.Libmount_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] git-tree-sha1 = "9c30530bf0effd46e15e0fdcf2b8636e78cbbd73" uuid = "4b2f31a3-9ecc-558c-b454-b3730dcb73e9" version = "2.35.0+0" [[deps.Libtiff_jll]] deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "LERC_jll", "Libdl", "XZ_jll", "Zlib_jll", "Zstd_jll"] git-tree-sha1 = "2da088d113af58221c52828a80378e16be7d037a" uuid = "89763e89-9b03-5906-acba-b20f662cd828" version = "4.5.1+1" [[deps.Libuuid_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] git-tree-sha1 = "7f3efec06033682db852f8b3bc3c1d2b0a0ab066" uuid = "38a345b3-de98-5d2b-a5d3-14cd9215e700" version = "2.36.0+0" [[deps.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 = "c1dd6d7978c12545b4179fb6153b9250c96b0075" uuid = "e6f89c97-d47a-5376-807f-9c37f3926c36" version = "1.0.3" [[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", "NetworkOptions", "Random", "Sockets"] git-tree-sha1 = "f512dc13e64e96f703fd92ce617755ee6b5adf0f" uuid = "739be429-bea8-5141-9913-cc70e7f3736d" version = "1.1.8" [[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 = "cc6e1927ac521b659af340e0ca45828a3ffc748f" uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95" version = "3.0.12+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 = "a935806434c9d4c506ba941871b327b96d41f2bf" uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" version = "2.8.0" [[deps.Pipe]] git-tree-sha1 = "6842804e7867b115ca9de748a0cf6b364523c16d" uuid = "b98c9c47-44ae-5843-9183-064241ee97a0" version = "1.3.0" [[deps.Pixman_jll]] deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LLVMOpenMP_jll", "Libdl"] git-tree-sha1 = "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 = "db8ec28846dbf846228a32de5a6912c63e2052e3" uuid = "7f904dfe-b85e-4ff6-b463-dae2292396a8" version = "0.7.53" [[deps.PrecompileTools]] deps = ["Preferences"] git-tree-sha1 = "03b4c25b43cb84cee5c90aa9b5ea0a78fd848d2f" uuid = "aea7be01-6a6a-4083-8856-8a6e6704d82a" version = "1.2.0" [[deps.Preferences]] deps = ["TOML"] git-tree-sha1 = "00805cd429dcb4870060ff49ef443486c262e38e" uuid = "21216c6a-2e73-6563-6e65-726566657250" version = "1.4.1" [[deps.Printf]] deps = ["Unicode"] uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" [[deps.Qt6Base_jll]] deps = ["Artifacts", "CompilerSupportLibraries_jll", "Fontconfig_jll", "Glib_jll", "JLLWrappers", "Libdl", "Libglvnd_jll", "OpenSSL_jll", "Vulkan_Loader_jll", "Xorg_libSM_jll", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Xorg_libxcb_jll", "Xorg_xcb_util_cursor_jll", "Xorg_xcb_util_image_jll", "Xorg_xcb_util_keysyms_jll", "Xorg_xcb_util_renderutil_jll", "Xorg_xcb_util_wm_jll", "Zlib_jll", "libinput_jll", "xkbcommon_jll"] git-tree-sha1 = "37b7bb7aabf9a085e0044307e1717436117f2b3b" uuid = "c0090381-4147-56d7-9ebc-da0b1113ec56" version = "6.5.3+1" [[deps.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 = "ffdaf70d81cf6ff22c2b6e733c900c3321cab864" uuid = "05181044-ff0b-4ac5-8273-598c1e38db00" version = "1.0.1" [[deps.Requires]] deps = ["UUIDs"] git-tree-sha1 = "838a3a4188e2ded87a4f9f184b4b0d78a1e91cb7" uuid = "ae029012-a4dd-5104-9daa-d747884805df" version = "1.3.0" [[deps.SHA]] uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" version = "0.7.0" [[deps.Scratch]] deps = ["Dates"] git-tree-sha1 = "3bac05bc7e74a75fd9cba4295cde4045d9fe2386" uuid = "6c6a2e73-6563-6170-7368-637461726353" version = "1.2.1" [[deps.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 = "5165dfb9fd131cf0c6957a3a7605dede376e7b63" uuid = "a2af1166-a08f-5f64-846c-94a0d3cef48c" version = "1.2.0" [[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 = "1ff449ad350c9c4cbc756624d6f8a8c3ef56d3ed" uuid = "82ae8749-77ed-4fe6-ae5f-f523153014b0" version = "1.7.0" [[deps.StatsBase]] deps = ["DataAPI", "DataStructures", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"] git-tree-sha1 = "1d77abd07f617c4868c33d4f5b9e1dbb2643c9cf" uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" version = "0.34.2" [[deps.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]] git-tree-sha1 = "1fbeaaca45801b4ba17c251dd8603ef24801dd84" uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa" version = "0.10.2" weakdeps = ["Random", "Test"] [deps.TranscodingStreams.extensions] TestExt = ["Test", "Random"] [[deps.Tricks]] git-tree-sha1 = "eae1bb484cd63b36999ee58be2de6c178105112f" uuid = "410a4b4d-49e4-4fbc-ab6d-cb71b17b3775" version = "0.1.8" [[deps.URIs]] git-tree-sha1 = "67db6cc7b3821e19ebe75791a9dd19c9b1188f2b" uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" version = "1.5.1" [[deps.UUIDs]] deps = ["Random", "SHA"] uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" [[deps.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 = "242982d62ff0d1671e9029b52743062739255c7e" uuid = "1986cc42-f94f-5a68-af5c-568840ba703d" version = "1.18.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.Vulkan_Loader_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Wayland_jll", "Xorg_libX11_jll", "Xorg_libXrandr_jll", "xkbcommon_jll"] git-tree-sha1 = "2f0486047a07670caad3a81a075d2e518acc5c59" uuid = "a44049a8-05dd-5a78-86c9-5fde0876e88c" version = "1.3.243+0" [[deps.Wayland_jll]] deps = ["Artifacts", "EpollShim_jll", "Expat_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Pkg", "XML2_jll"] git-tree-sha1 = "7558e29847e99bc3f04d6569e82d0f5c54460703" uuid = "a2964d1f-97da-50d4-b82a-358c7fce9d89" version = "1.21.0+1" [[deps.Wayland_protocols_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] git-tree-sha1 = "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 = "24b81b59bd35b3c42ab84fa589086e19be919916" uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a" version = "2.11.5+0" [[deps.XSLT_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgcrypt_jll", "Libgpg_error_jll", "Libiconv_jll", "Pkg", "XML2_jll", "Zlib_jll"] git-tree-sha1 = "91844873c4085240b95e795f692c4cec4d805f8a" uuid = "aed1982a-8fda-507f-9586-7b0439959a61" version = "1.1.34+0" [[deps.XZ_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] git-tree-sha1 = "522b8414d40c4cbbab8dee346ac3a09f9768f25d" uuid = "ffd25f8a-64ca-5728-b0f7-c24cf3aae800" version = "5.4.5+0" [[deps.Xorg_libICE_jll]] deps = ["Libdl", "Pkg"] git-tree-sha1 = "e5becd4411063bdcac16be8b66fc2f9f6f1e8fe5" uuid = "f67eecfb-183a-506d-b269-f58e52b52d7c" version = "1.0.10+1" [[deps.Xorg_libSM_jll]] deps = ["Libdl", "Pkg", "Xorg_libICE_jll"] git-tree-sha1 = "4a9d9e4c180e1e8119b5ffc224a7b59d3a7f7e18" uuid = "c834827a-8449-5923-a945-d239c165b7dd" version = "1.2.3+0" [[deps.Xorg_libX11_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxcb_jll", "Xorg_xtrans_jll"] git-tree-sha1 = "afead5aba5aa507ad5a3bf01f58f82c8d1403495" uuid = "4f6342f7-b3d2-589e-9d20-edeb45f2b2bc" version = "1.8.6+0" [[deps.Xorg_libXau_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] git-tree-sha1 = "6035850dcc70518ca32f012e46015b9beeda49d8" uuid = "0c0b7dd1-d40b-584c-a123-a41640f87eec" version = "1.0.11+0" [[deps.Xorg_libXcursor_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXfixes_jll", "Xorg_libXrender_jll"] git-tree-sha1 = "12e0eb3bc634fa2080c1c37fccf56f7c22989afd" uuid = "935fb764-8cf2-53bf-bb30-45bb1f8bf724" version = "1.2.0+4" [[deps.Xorg_libXdmcp_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] git-tree-sha1 = "34d526d318358a859d7de23da945578e8e8727b7" uuid = "a3789734-cfe1-5b06-b2d0-1dd0d9d62d05" version = "1.1.4+0" [[deps.Xorg_libXext_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll"] git-tree-sha1 = "b7c0aa8c376b31e4852b360222848637f481f8c3" uuid = "1082639a-0dae-5f34-9b06-72781eeb8cb3" version = "1.3.4+4" [[deps.Xorg_libXfixes_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll"] git-tree-sha1 = "0e0dc7431e7a0587559f9294aeec269471c991a4" uuid = "d091e8ba-531a-589c-9de9-94069b037ed8" version = "5.0.3+4" [[deps.Xorg_libXi_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXext_jll", "Xorg_libXfixes_jll"] git-tree-sha1 = "89b52bc2160aadc84d707093930ef0bffa641246" uuid = "a51aa0fd-4e3c-5386-b890-e753decda492" version = "1.7.10+4" [[deps.Xorg_libXinerama_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXext_jll"] git-tree-sha1 = "26be8b1c342929259317d8b9f7b53bf2bb73b123" uuid = "d1454406-59df-5ea1-beac-c340f2130bc3" version = "1.1.4+4" [[deps.Xorg_libXrandr_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXext_jll", "Xorg_libXrender_jll"] git-tree-sha1 = "34cea83cb726fb58f325887bf0612c6b3fb17631" uuid = "ec84b674-ba8e-5d96-8ba1-2a689ba10484" version = "1.5.2+4" [[deps.Xorg_libXrender_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll"] git-tree-sha1 = "19560f30fd49f4d4efbe7002a1037f8c43d43b96" uuid = "ea2f1a96-1ddc-540d-b46f-429655e07cfa" version = "0.9.10+4" [[deps.Xorg_libpthread_stubs_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] git-tree-sha1 = "8fdda4c692503d44d04a0603d9ac0982054635f9" uuid = "14d82f49-176c-5ed1-bb49-ad3f5cbd8c74" version = "0.1.1+0" [[deps.Xorg_libxcb_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "XSLT_jll", "Xorg_libXau_jll", "Xorg_libXdmcp_jll", "Xorg_libpthread_stubs_jll"] git-tree-sha1 = "b4bfde5d5b652e22b9c790ad00af08b6d042b97d" uuid = "c7cfdc94-dc32-55de-ac96-5a1b8d977c5b" version = "1.15.0+0" [[deps.Xorg_libxkbfile_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] git-tree-sha1 = "730eeca102434283c50ccf7d1ecdadf521a765a4" uuid = "cc61e674-0454-545c-8b26-ed2c68acab7a" version = "1.1.2+0" [[deps.Xorg_xcb_util_cursor_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_xcb_util_image_jll", "Xorg_xcb_util_jll", "Xorg_xcb_util_renderutil_jll"] git-tree-sha1 = "04341cb870f29dcd5e39055f895c39d016e18ccd" uuid = "e920d4aa-a673-5f3a-b3d7-f755a4d47c43" version = "0.1.4+0" [[deps.Xorg_xcb_util_image_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] git-tree-sha1 = "0fab0a40349ba1cba2c1da699243396ff8e94b97" uuid = "12413925-8142-5f55-bb0e-6d7ca50bb09b" version = "0.4.0+1" [[deps.Xorg_xcb_util_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libxcb_jll"] git-tree-sha1 = "e7fd7b2881fa2eaa72717420894d3938177862d1" uuid = "2def613f-5ad1-5310-b15b-b15d46f528f5" version = "0.4.0+1" [[deps.Xorg_xcb_util_keysyms_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] git-tree-sha1 = "d1151e2c45a544f32441a567d1690e701ec89b00" uuid = "975044d2-76e6-5fbe-bf08-97ce7c6574c7" version = "0.4.0+1" [[deps.Xorg_xcb_util_renderutil_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] git-tree-sha1 = "dfd7a8f38d4613b6a575253b3174dd991ca6183e" uuid = "0d47668e-0667-5a69-a72c-f761630bfb7e" version = "0.3.9+1" [[deps.Xorg_xcb_util_wm_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] git-tree-sha1 = "e78d10aab01a4a154142c5006ed44fd9e8e31b67" uuid = "c22f9ab0-d5fe-5066-847c-f4bb1cd4e361" version = "0.4.1+1" [[deps.Xorg_xkbcomp_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxkbfile_jll"] git-tree-sha1 = "330f955bc41bb8f5270a369c473fc4a5a4e4d3cb" uuid = "35661453-b289-5fab-8a00-3d9160c6a3a4" version = "1.4.6+0" [[deps.Xorg_xkeyboard_config_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_xkbcomp_jll"] git-tree-sha1 = "691634e5453ad362044e2ad653e79f3ee3bb98c3" uuid = "33bec58e-1273-512f-9401-5d533626f822" version = "2.39.0+0" [[deps.Xorg_xtrans_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] git-tree-sha1 = "e92a1a012a10506618f10b7047e478403a046c77" uuid = "c5fb5394-a638-5e4d-96e5-b29de1b5cf10" version = "1.5.0+0" [[deps.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.eudev_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "gperf_jll"] git-tree-sha1 = "431b678a28ebb559d224c0b6b6d01afce87c51ba" uuid = "35ca27e7-8b34-5b7f-bca9-bdc33f59eb06" version = "3.2.9+0" [[deps.fzf_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] git-tree-sha1 = "47cf33e62e138b920039e8ff9f9841aafe1b733e" uuid = "214eeab7-80f7-51ab-84ad-2988db7cef09" version = "0.35.1+0" [[deps.gperf_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] git-tree-sha1 = "3516a5630f741c9eecb3720b1ec9d8edc3ecc033" uuid = "1a1c6b14-54f6-533d-8383-74cd7377aa70" version = "3.1.1+0" [[deps.libaom_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] git-tree-sha1 = "3a2ea60308f0996d26f1e5354e10c24e9ef905d4" uuid = "a4ae2306-e953-59d6-aa16-d00cac43593b" version = "3.4.0+0" [[deps.libass_jll]] deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] git-tree-sha1 = "5982a94fcba20f02f42ace44b9894ee2b140fe47" uuid = "0ac62f75-1d6f-5e53-bd7c-93b484bb37c0" version = "0.15.1+0" [[deps.libblastrampoline_jll]] deps = ["Artifacts", "Libdl"] uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" version = "5.8.0+0" [[deps.libevdev_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] git-tree-sha1 = "141fe65dc3efabb0b1d5ba74e91f6ad26f84cc22" uuid = "2db6ffa8-e38f-5e21-84af-90c45d0032cc" version = "1.11.0+0" [[deps.libfdk_aac_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] git-tree-sha1 = "daacc84a041563f965be61859a36e17c4e4fcd55" uuid = "f638f0a6-7fb0-5443-88ba-1cc74229b280" version = "2.0.2+0" [[deps.libinput_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "eudev_jll", "libevdev_jll", "mtdev_jll"] git-tree-sha1 = "ad50e5b90f222cfe78aa3d5183a20a12de1322ce" uuid = "36db933b-70db-51c0-b978-0f229ee0e533" version = "1.18.0+0" [[deps.libpng_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "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.mtdev_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] git-tree-sha1 = "814e154bdb7be91d78b6802843f76b6ece642f11" uuid = "009596ad-96f7-51b1-9f1b-5ce2d5e8a71e" version = "1.1.6+0" [[deps.nghttp2_jll]] deps = ["Artifacts", "Libdl"] uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" version = "1.52.0+1" [[deps.p7zip_jll]] deps = ["Artifacts", "Libdl"] uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" version = "17.4.0+0" [[deps.x264_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] git-tree-sha1 = "4fea590b89e6ec504593146bf8b988b2c00922b2" uuid = "1270edf5-f2f9-52d2-97e9-ab00b5d0237a" version = "2021.5.5+0" [[deps.x265_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] git-tree-sha1 = "ee567a171cce03570d77ad3a43e90218e38937a9" uuid = "dfaa095f-4041-5dcd-9319-2fabd8486b76" version = "3.5.0+0" [[deps.xkbcommon_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Wayland_jll", "Wayland_protocols_jll", "Xorg_libxcb_jll", "Xorg_xkeyboard_config_jll"] git-tree-sha1 = "9c304562909ab2bab0262639bd4f444d7bc2be37" uuid = "d8fb68d0-12a3-5cfd-a85a-d49703b185fd" version = "1.4.1+1" """ # ╔═╡ Cell order: # ╟─7d8b57c7-368b-4ff2-962c-f3f02b6457a7 # ╟─a7db4654-be69-48e9-b925-8a66695ca7f2 # ╟─41b31fc4-9461-4ffc-8c26-b8b9205265df # ╟─1a02369d-28bd-48f8-a00a-da7fd34e5f10 # ╟─b0e71614-a833-4f40-a1c9-904e5f795d52 # ╟─cab26236-b0e6-4f93-8be7-f6d378d8c921 # ╠═e00d6e21-f491-4a21-9020-f7150eebb8d0 # ╟─d08e5887-07b5-4773-9cd6-d2fdaac9740a # ╠═b8fb89f2-352b-422f-b347-9caa427197cd # ╟─bda87819-b3bf-4767-b9c8-a3a8556bcebe # ╟─d018cf6e-f05a-426a-8a89-000ba44750af # ╟─09d55f88-9bce-4a15-a094-be1607ca150c # ╟─4a45d6ab-95e3-4d47-aaf2-2b9fbefbdddc # ╟─53f6f71e-f2db-4823-b93a-6c102f43bb5e # ╟─0477e58b-e9eb-4ce4-af2a-a8d3b1150955 # ╟─cb81245b-ffe2-479f-a76f-915650055ce5 # ╟─cd220d2e-6c9e-43f1-a02c-2685aa6ad941 # ╟─de41d679-58ff-43fb-b268-61f5818d53d5 # ╟─2882da9a-f8be-492d-87cb-6c048f41e8b7 # ╠═fb56e70d-52d5-4b19-94b4-0fbe186b9002 # ╟─185b8a6d-bee8-4eb2-8ae4-0f74641d1339 # ╟─14f241c2-7622-485f-8fed-ac95201ccf6e # ╟─88597162-b4be-45c1-aadd-f4ee83732b87 # ╟─af8b394d-e365-4531-8dc2-e9d9af5caabe # ╟─b565b8af-4793-4737-8691-84cf1d36c2df # ╟─7d7aca6f-70af-410b-816d-c5e926a75649 # ╟─442d7c96-6fb4-40ce-9809-e28aec61f54d # ╟─eebb99c8-642c-4505-81a7-9ca8e4baed59 # ╟─411c8729-8d24-4161-9dc3-f9da870d39ea # ╟─39648856-a31b-49f4-927a-655cf503c92f # ╟─8070f70f-dde3-4599-be69-298455fcfb20 # ╟─97e7345a-fdbc-4662-8d82-fd34bc373de9 # ╟─8bbd0348-4e18-44c0-801a-439f57917eac # ╟─7c05afce-9d19-49dc-a450-c91be54203a2 # ╠═a85c7d4a-8e60-4782-9606-99bf03462b7b # ╟─22f00588-4596-4a59-b2c5-5bb3ea2cf45c # ╟─991873a3-5474-41ef-a5ac-318bc63e2b96 # ╟─fc205e85-36af-44aa-acaf-ee4c4d938e49 # ╟─eb900a1e-0cbe-4815-9907-83465c391b5f # ╟─b0b50c67-5cd2-48b8-8bb8-d155f5ef84fe # ╟─28b2df59-4771-4ebb-b7b9-a968b8e7609e # ╟─267f209c-d5c7-4a99-81dd-986c324e9536 # ╟─311715b5-c9e3-472a-a367-9197d4d2c4bf # ╟─8240e920-c264-4aa7-b068-0dfff2c10152 # ╟─10606746-08a0-4a33-a9fc-2729085bf81e # ╟─eee2a835-be16-4f43-8c98-51f81c4008d2 # ╟─48aafe7c-f732-48b6-91ad-9d1d88099c69 # ╟─f1685b3e-a053-4426-a095-dd67b30b506b # ╟─4437e45e-eee7-4b06-8b69-8ae79b070c8e # ╟─dea60eea-61ce-4c83-84cd-1529b2f122d8 # ╟─ec5638dc-f886-4d45-a40b-8ddb827b98b7 # ╟─a2dff9e4-b5a5-44ed-886e-b7f1caa6d9e6 # ╠═7ebd06b4-7f35-11ee-1049-ab5af5e8c2c5 # ╟─cb3e8dce-f0e2-4dbf-8fae-0316c9cd2087 # ╟─a59808d1-d04e-4489-bc67-5be2a891828c # ╠═3519382a-7805-47c5-aba9-f4c0c47e8779 # ╟─00000000-0000-0000-0000-000000000001 # ╟─00000000-0000-0000-0000-000000000002