Skip to content
Extraits de code Groupes Projets

Comparer les révisions

Les modifications sont affichées comme si la révision source était fusionnée avec la révision cible. En savoir plus sur la comparaison des révisions.

Source

Sélectionner le projet cible
No results found

Cible

Sélectionner le projet cible
  • NoahMoussaoui/lsinc-1113-noah
  • NoahMoussaoui/lsinc1113
  • blegat/lsinc1113
3 résultats
Afficher les modifications
Validations sur la source (2)
......@@ -4,8 +4,18 @@
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
# ╔═╡ f83fdf0a-a2f5-4d72-9297-a409cf4e2bbb
using PlutoUI, Graphs, GraphPlot
using PlutoUI, Graphs, GraphPlot, Colors, DataStructures, SimpleWeightedGraphs
# ╔═╡ bd9ab2c4-b098-11ef-3c1e-7fe1458a8556
include("utils.jl")
......@@ -16,15 +26,465 @@ section("Graph Theory")
# ╔═╡ 15f7cc14-7663-4ad2-9cfe-9ee8aada601c
frametitle("Seven Bridges of Königsberg")
# ╔═╡ b65dd471-10da-4b3a-a14b-cfbb70e70050
frametitle("Définition")
# ╔═╡ d7bbc61f-5cc6-4090-8cc4-313187f28bab
let
g = Graph(4)
add_edge!(g, 1, 2)
add_edge!(g, 1, 4)
add_edge!(g, 2, 3)
add_edge!(g, 2, 4)
add_edge!(g, 3, 4)
gplot(g, edgelabel = [1, 2, 1, 1, 2])
end
# ╔═╡ b52b2192-df63-4095-aa15-6d3ccafc92ba
frametitle("Graphes et polyhèdres")
# ╔═╡ e41498fa-8fed-4354-bb3b-a2fc8afeacd9
frametitle("Terminologie des parcours")
# ╔═╡ c41901fb-6570-487d-bd77-4708d1f0b627
frametitle("Degré d'un noeud")
# ╔═╡ fe642397-9ae1-42b5-9d0e-d2b96cfb178b
let
g = Graph(4)
add_edge!(g, 1, 2)
add_edge!(g, 1, 4)
add_edge!(g, 2, 3)
add_edge!(g, 2, 4)
add_edge!(g, 3, 4)
gplot(g, nodelabel = [3, 3, 3, 5], edgelabel = [1, 2, 1, 1, 2])
end
# ╔═╡ 043ff87b-41e4-49c2-aaee-bee39f088b58
frametitle("Composante connexe")
# ╔═╡ 9e065cf0-7483-4ec2-809c-cdd7d22a5564
let
g = Graph(7)
add_edge!(g, 1, 2)
add_edge!(g, 1, 4)
add_edge!(g, 2, 3)
add_edge!(g, 2, 4)
add_edge!(g, 3, 4)
add_edge!(g, 5, 6)
add_edge!(g, 5, 7)
add_edge!(g, 6, 7)
gplot(g)
end
# ╔═╡ cbc8da76-9adf-4670-b07c-0f5366b55547
frametitle("Calcul de composantes connexes")
# ╔═╡ b184882e-f2ed-4e9c-b763-0173711d6fac
frametitle("Disjoint-Set datastructure")
# ╔═╡ 8e7b6a51-1f8e-43d7-846b-a9e7596052b9
frametitle("Piste Eulérienne")
# ╔═╡ d884c51e-9ddd-4dc4-9f9c-e461f0455a17
frametitle("Arbres et forêts")
# ╔═╡ ceb5aea4-5a69-47cf-bedd-17d47a6e07a8
gplot(uniform_tree(10))
# ╔═╡ b94745d7-ffda-4190-82af-8ee2fe9ea165
frametitle("Spanning tree")
# ╔═╡ 944b6ad9-731b-4479-94bd-e61876987917
function spanning_forest(g, edges_it = edges(g))
component = IntDisjointSets(nv(g))
function create_loop!(edge)
loop = in_same_set(component, src(edge), dst(edge))
union!(component, src(edge), dst(edge))
return loop
end
return [edge for edge in edges_it if !create_loop!(edge)]
end
# ╔═╡ 3c09769f-13b2-4713-8d2e-06abd7735c33
frametitle("Minimum spanning tree")
# ╔═╡ 3eb8d016-d1a1-4e4f-a307-e2c439c502e4
kruskal(g) = spanning_forest(g, sort(collect(edges(g)), by = weight))
# ╔═╡ 8c384e86-18d4-419b-977b-c5d5bfd1318f
frametitle("Graphes dirigés")
# ╔═╡ 49092fe9-7c24-4564-9d2a-aa313d54ed8a
gplot(random_regular_digraph(16, 2))
# ╔═╡ 264eb1b6-0e3f-4d67-b8b0-5f0831d18b95
frametitle("Strongly connected components")
# ╔═╡ 66c7051b-c377-4376-a472-b2bd5c788267
frametitle("Directed Acyclic Graph (DAG)")
# ╔═╡ 71566570-7d26-4fba-8f9a-8726fb97f2d8
frametitle("Suite de Fibonacci")
# ╔═╡ 2f905018-1d7b-43dc-b576-e4080dc946ee
function fib(n)
if n <= 2
return 1
else
return fib(n - 1) + fib(n - 2)
end
end
# ╔═╡ a95116d6-614a-4a8a-b3a6-5a96e9b3c439
frametitle("Visualisation des appels récursifs")
# ╔═╡ 3c82aba6-0539-4578-ad04-648eb3bcf400
frametitle("Nombre d'appels")
# ╔═╡ a9379cc3-6ca8-4aed-81f7-992f3664ceb3
frametitle("Mémoïzation")
# ╔═╡ c395343c-3f7c-4dfe-bc0f-8950afc115bf
function fib!(cache, n)
if cache[n] == 0
cache[n] = fib!(cache, n - 1) + fib!(cache, n - 2)
end
return cache[n]
end
# ╔═╡ 73c0c135-f070-422e-ab1d-20c6faa160d8
function cached_fib(n)
cache = zeros(Int, n)
cache[1] = cache[2] = 1
return fib!(cache, n)
end
# ╔═╡ 16c5f723-77d4-4bee-86c6-90a1b597e7d9
frametitle("Une IA pour le jeu Puissance 4")
# ╔═╡ 54d0cbaf-4bf7-4508-b706-b5042dda1644
frametitle("Puissance 2 de 2 colonnes de hauteur 2")
# ╔═╡ 73d104ac-7aff-46cc-95b5-a67b6811f64d
frametitle("Puissance 2 de 2 colonnes de hauteur 3")
# ╔═╡ 3de604e8-20b6-4ef5-9952-b8f27c28fef1
begin
slider_longueur = @bind longueur Slider(2:4, default = 2, show_value = true);
slider_nrows = @bind nrows Slider(2:6, default = 3, show_value = true);
slider_ncols = @bind ncols Slider(2:6, default = 3, show_value = true);
checkbox_patient = @bind patient CheckBox()
nothing
end
# ╔═╡ 1308d56a-f91a-4fe2-8f5d-7d7a15b8f040
frametitle("Puissance $longueur")
# ╔═╡ a7530e0a-a3b5-46c8-9666-fb0219d7ba04
frametitle("Mémoïsation pour Puissance 4")
# ╔═╡ 0a7e65f5-da36-4331-8463-221051286728
begin
slider_wooclap_nrows = @bind wooclap_nrows Slider(2:6, default = 3, show_value = true);
slider_wooclap_ncols = @bind wooclap_ncols Slider(2:6, default = 3, show_value = true);
nothing
end;
# ╔═╡ 3b82fa0a-65b1-46dd-b81a-d1fa117893d5
begin
slider_mem_longueur = @bind mem_longueur Slider(2:4, default = 2, show_value = true);
slider_mem_nrows = @bind mem_nrows Slider(2:6, default = 3, show_value = true);
slider_mem_ncols = @bind mem_ncols Slider(2:7, default = 3, show_value = true);
checkbox_mem_patient = @bind mem_patient CheckBox()
nothing
end
# ╔═╡ 3f813480-726b-42e0-a648-e3ad76abcf9d
frametitle("Mémoïsation pour Puissance $mem_longueur")
# ╔═╡ 75bb5e30-76b8-486b-b3fa-9979aaf830a5
section("Utils")
# ╔═╡ b01e3f5a-ad9f-4557-ba62-30e9c57b8532
begin
slider_n = @bind n Slider(1:42, default = 10, show_value = true);
slider_k = @bind k Slider(1:42, default = 10, show_value = true);
nothing
end
# ╔═╡ b53e5719-cc0e-4169-9c8d-3eb5a50570b0
@time fib(n)
# ╔═╡ 6183e415-898a-4d1f-a5db-9c09503affff
called = let
called = zeros(Int, n)
function fib(k)
called[k] += 1
if n > 42
error("Don't use `n` higher than 42")
elseif k <= 2
return 1
else
return fib(k - 1) + fib(k - 2)
end
end
fib(n)
called
end;
# ╔═╡ 9eeaca05-9e6e-4881-85aa-d81ad5460e8c
@time cached_fib(n)
# ╔═╡ 3c9dd530-8a25-4c1b-b1ff-3b5a3748b74a
function random_weighted(n, k, weights)
g = random_regular_graph(n, k)
wg = SimpleWeightedGraph(n)
for e in edges(g)
add_edge!(wg, src(e), dst(e), rand(weights))
end
return wg
end
# ╔═╡ 33ac9568-a83d-47b0-a17c-6e30df0dbaa4
colors = Colors.JULIA_LOGO_COLORS
# ╔═╡ d1329a48-5bed-428f-8554-854a5d51488e
let
g = random_regular_graph(10, 5)
cols = [colors.red, colors.green]
tree = Set(spanning_forest(g))
gplot(g, edgestrokec = [cols[(edge in tree) + 1] for edge in edges(g)], nodefillc = colors.blue)
end
# ╔═╡ accdf77c-fc4b-4777-bebf-9d69ebb36526
import DocumenterCitations, Polyhedra, Makie, WGLMakie, StaticArrays, Bonito, Luxor, Formatting, Random
# ╔═╡ ecf6a7d0-3279-4bff-b0f4-73327f60b702
let
Random.seed!(0)
g = random_weighted(10, 3, 1:9)
cols = [colors.red, colors.green]
tree = Set(kruskal(g))
gplot(g, edgelabel=string.(Int.(weight.(edges(g)))), edgestrokec = [cols[(edge in tree) + 1] for edge in edges(g)], nodefillc = colors.blue)
end
# ╔═╡ 730e5e09-e818-49c5-8fa1-495b39b4267e
let
Random.seed!(32)
g = random_regular_digraph(32, 2)
c = Set.(strongly_connected_components(g))
cols = distinguishable_colors(length(c))
tree = Set(spanning_forest(g))
gplot(g, nodefillc = [cols[findfirst(comp -> v in comp, c)] for v in vertices(g)])
end
# ╔═╡ 46977b09-a43a-427c-8974-a1fd5f2d7da2
Makie.barplot(1:n, called)
# ╔═╡ fdd9318e-ee09-4eab-9322-ad97b03da002
function draw_fib(n, depth)
if n < 3
return 0
end
dy = 140
δ = round(Int, dy * 0.9^depth) * 1.2
w = fib(n - 2)
Δy = 30
if depth != 1
Luxor.translate(δ * w/2, 0)
end
if n == 3
Luxor.setdash("dashed")
Luxor.circle(Luxor.Point(6, -6), 20, :stroke)
end
Luxor.sethue("black")
Luxor.text(string(n))
Luxor.translate(-δ * w/2, 0)
cur = 0
for m in [n - 1, n - 2]
if m < 3
continue
end
dx = cur * δ
Luxor.translate(dx, dy)
dw = draw_fib(m, depth + 1)
Luxor.sethue("black")
Luxor.setdash("solid")
Luxor.setline(δ/40)
Luxor.line(Luxor.Point(-dx+δ * w/2, -dy+Δy), Luxor.Point(δ*dw/2, -Δy), :stroke)
Luxor.translate(-dx, -dy)
cur += dw
end
return w
end
# ╔═╡ 039d5065-4ab2-4787-86e2-5612cfcd01b4
function draw_fibo(n)
Luxor.@draw begin
Luxor.translate(0, -350)
Luxor.fontsize(30)
Luxor.fontface("Alegreya Sans SC")
draw_fib(n, 1)
end 1200 800
end
# ╔═╡ d35df21e-2dd5-478f-b0c1-17cbd96a9cc6
draw_fibo(8)
# ╔═╡ 1b748b69-5262-46c9-aeff-01696c585e6f
biblio = load_biblio!()
# ╔═╡ d57a6a11-0387-4693-a50e-9eba62605a49
polyhedron = Polyhedra.polyhedron(Polyhedra.vrep(Float64[
0 1 2 3;0 2 1 3; 1 0 2 3; 1 2 0 3; 2 0 1 3; 2 1 0 3;
0 1 3 2;0 3 1 2; 1 0 3 2; 1 3 0 2; 3 0 1 2; 3 1 0 2;
0 3 2 1;0 2 3 1; 3 0 2 1; 3 2 0 1; 2 0 3 1; 2 3 0 1;
3 1 2 0;3 2 1 0; 1 3 2 0; 1 2 3 0; 2 3 1 0; 2 1 3 0
]))
# ╔═╡ 2fedb811-6f34-424f-a46b-806bb0c6b9c0
projected = Polyhedra.project(polyhedron, [1 1 1; -1 1 1; 0 -2 1; 0 0 -3])
# ╔═╡ 12fa3c11-c5d3-4c81-a92f-174f09ec10ff
struct Config{N}
libre::StaticArrays.SVector{N,UInt8}
player::StaticArrays.SVector{N,UInt8}
max::UInt8
end
# ╔═╡ 6c3b02ad-5048-427f-8433-f030c96d0036
function _init(nrows, ncols)
z = StaticArrays.SVector{ncols}(ntuple(_ -> zero(UInt8), Val(ncols)))
Config(z, z, (0b1 << nrows))
end;
# ╔═╡ b107f529-f47f-4252-b06a-6e53302be860
begin
_no_winner(::AbstractMatrix) = 0
_no_winner(::Config) = (false, false)
_has_winner(x::Int) = !iszero(x)
_has_winner(x::Tuple{Bool,Bool}) = x[1]
end
# ╔═╡ e2f5854a-c6ce-4600-8e96-62ac8ffc6b6e
const Δs = [(-1, 0), (0, 1), (0, -1), (1, 1), (-1, 1), (1, -1), (-1, -1)]
# ╔═╡ 938e0359-0a86-4755-a92b-f1a7a892961d
function winner(config, longueur, pos)
for Δ in Δs
win = winner(config, pos, Δ, longueur)
if _has_winner(win)
return win, Δ
end
end
return _no_winner(config), (0, 0)
end
# ╔═╡ 1c762a4a-4ee1-46ee-93ee-7b566376d5a4
begin
_first_row(::AbstractMatrix) = 1
_next_row(row::Int) = row + 1
_done(m::AbstractMatrix, row) = row > size(m, 1)
_first_row(::Config) = 0b1
_next_row(row::UInt8) = row << 1
_done(c::Config, row) = row == c.max
end
# ╔═╡ 8dea1779-e432-4fe3-baf0-5b0d8d3dd97b
begin
_shift(x::Int, y::Int) = x + y
_shift(x::UInt8, y::Int) = x << y
_inrows(m::AbstractMatrix, x::Int, y::Int) = in(x + y, axes(m, 1))
function _inrows(config::Config, x::UInt8, y::Int)
if y == 0
return true
elseif y < 0
return x >= (0b1 << (UInt8(-y)))
else
return (config.max >> UInt8(y)) > x
end
end
end
# ╔═╡ efbdb43d-3c6b-48d6-be40-51369f3158de
begin
_shift_bit(x::Int) = x
function _shift_bit(x::UInt8)
y = findfirst(i -> (0b1 << (i-1)) == x, 1:7)
return y
end
end
# ╔═╡ 3ca057ef-1367-4fef-8e18-bdef855bc35e
begin
_num_rows(mat::AbstractMatrix) = size(mat, 1)
_num_rows(config::Config) = _shift_bit(config.max) - 1
_reverse(config::Config) = Config(reverse(config.libre), reverse(config.player), config.max)
Base.getindex(c::Config, i::UInt8, j::Int) = (!iszero(c.libre[j] & i), !iszero(c.player[j] & i))
_compare(player::Int, a, b) = player * a > player * b
_compare(player::Bool, a, b) = player ? a < b : a > b
_sign(player::Int, a) = player * a
_sign(w::Tuple{Bool,Bool}, a) = w[2] ? -a : a
_first_player(::AbstractMatrix) = 1
_first_player(::Config) = false
_next_player(player::Int) = -player
_next_player(player::Bool) = !player
_columns(m::AbstractMatrix) = axes(m, 2)
_columns(config::Config) = eachindex(config.libre)
function _next(mat::AbstractMatrix, col)
for r in axes(config, 1)
if iszero(config[r, col])
return r
end
end
return 0
end
function _next(config::Config, col)
mask = config.libre[col] + 0b1
if mask == config.max
return 0b0
end
return mask
end
function _assign(mat::StaticArrays.SMatrix{I,J}, r, c, value) where {I,J}
target = r + (c - 1) * I
return StaticArrays.SMatrix{I,J}(ntuple(i -> i == target ? value : mat[i], Val(I * J)))
#return @SMatrix [(row, col) == (r, c) ? value : mat[row, col] for row in 1:nrows, col in 1:ncols]
end
function _assign(v::StaticArrays.SVector{N}, mask, col) where {N}
StaticArrays.SVector{N}(ntuple(c -> c == col ? (v[c] | mask) : v[c], Val(N)))
end
function _assign(config::Config, mask, col, value::Bool)
libre = _assign(config.libre, mask, col)
if value
player = _assign(config.player, mask, col)
else
player = config.player
end
return Config(libre, player, config.max)
end
function _assign(mat::Matrix, row, col, value)
mat[row, col] = value
return mat
end
_unassign(::StaticArrays.SMatrix, _, _) = nothing
_unassign(::Config, _, _) = nothing
function _unassign(mat::Matrix, row, col)
mat[row, col] = 0
return
end
_copy(m::StaticArrays.SMatrix) = m
_copy(m::Config) = m
_copy(m::Matrix) = copy(m)
end
# ╔═╡ faca26cb-14a3-4a45-ba0b-ec3cd57d8d29
HAlign(md"""
Est-il possible de prendre tous les ponts de la ville une et une seule fois (le point de départ est au choix) ?
""",
img("Konigsberg_bridges"))
# ╔═╡ b65dd471-10da-4b3a-a14b-cfbb70e70050
frametitle("Définition")
# ╔═╡ 8bec0324-274c-4ae6-99f9-08b613460064
md"""
Un graph a un ensemble ``V`` de noeuds (nodes) / sommets (vertices) et ``E`` d'arêtes (edges) / arcs.
......@@ -37,20 +497,6 @@ Un graph a un ensemble ``V`` de noeuds (nodes) / sommets (vertices) et ``E`` d'a
Le graphe du problème de Königsberg test:
"""
# ╔═╡ d7bbc61f-5cc6-4090-8cc4-313187f28bab
let
g = Graph(4)
add_edge!(g, 1, 2)
add_edge!(g, 1, 4)
add_edge!(g, 2, 3)
add_edge!(g, 2, 4)
add_edge!(g, 3, 4)
gplot(g, edgelabel = [1, 2, 1, 1, 2])
end
# ╔═╡ b52b2192-df63-4095-aa15-6d3ccafc92ba
frametitle("Graphes et polyhèdres")
# ╔═╡ c87e1a66-62e6-41aa-bcc0-fb1704d7e259
md"""
Prenons un polyhèdre, où se cache le graphe ?
......@@ -69,9 +515,6 @@ md"""
``.
"""
# ╔═╡ e41498fa-8fed-4354-bb3b-a2fc8afeacd9
frametitle("Terminologie des parcours")
# ╔═╡ 27ee39a0-0eb2-42dc-bf90-eb2fa0d7497e
md"""
Un parcours / walk de longueur ``k`` d'un graphe ``G = (V, E)`` est une suite de ``k+1`` noeuds ``v_0, v_1, \ldots, v_k \in V`` et ``k`` arêtes ``(v_0, v_1), (v_1, v_2), \ldots, (v_{k-1}, v_k) \in E``.
......@@ -85,50 +528,16 @@ Si ``v_0 = v_k``, le parcours est fermé.
Piste (resp. circuit) *Eulérienne* : Une piste (resp. circuit) qui visite **toutes** les arêtes.
"""
# ╔═╡ c41901fb-6570-487d-bd77-4708d1f0b627
frametitle("Degré d'un noeud")
# ╔═╡ ff87b1bb-7903-4954-8e7a-f377aef97b2d
md"""
Le degré d'un noeud ``v`` est le nombre d'arête qui lui sont incidentes.
"""
# ╔═╡ fe642397-9ae1-42b5-9d0e-d2b96cfb178b
let
g = Graph(4)
add_edge!(g, 1, 2)
add_edge!(g, 1, 4)
add_edge!(g, 2, 3)
add_edge!(g, 2, 4)
add_edge!(g, 3, 4)
gplot(g, nodelabel = [3, 3, 3, 5], edgelabel = [1, 2, 1, 1, 2])
end
# ╔═╡ 043ff87b-41e4-49c2-aaee-bee39f088b58
frametitle("Composante connexe")
# ╔═╡ 2ebc96d9-e526-408a-a264-a87771b96258
md"""
Une composante connexe ``C`` est un ensemble de noeuds tels que toutes paires de noeuds est connectée par un chemin.
"""
# ╔═╡ 9e065cf0-7483-4ec2-809c-cdd7d22a5564
let
g = Graph(7)
add_edge!(g, 1, 2)
add_edge!(g, 1, 4)
add_edge!(g, 2, 3)
add_edge!(g, 2, 4)
add_edge!(g, 3, 4)
add_edge!(g, 5, 6)
add_edge!(g, 5, 7)
add_edge!(g, 6, 7)
gplot(g)
end
# ╔═╡ cbc8da76-9adf-4670-b07c-0f5366b55547
frametitle("Calcul de composantes connexes")
# ╔═╡ 338527b3-ec32-4794-8b92-63cce6ce4285
md"""
On démarre en assignant une composant connexe différente pour chaque noeud.
......@@ -147,9 +556,6 @@ qa(md"Quelle est la complexité de cet algorithm ?", md"""
Comme on a ``|E|`` fusion, la complexité de l'algorithm est ``O(|V|\cdot |E|)``.
""")
# ╔═╡ b184882e-f2ed-4e9c-b763-0173711d6fac
frametitle("Disjoint-Set datastructure")
# ╔═╡ caa3a9dd-e7d6-493b-9586-8d08d9c8b9e5
md"""
Pour améliorer l'algorithme, pour la fusion de l'algorithm ``(1, 3)``, on peut updater le tableau à ``(1, 1, 1, 3)``.
......@@ -166,31 +572,374 @@ md"""
De façon surprenante, si on met à jour le valeur dans le tableau pour mettre directement le root après l'avoir calculé, la complexité passe à ``O(|V| \alpha(|V|))`` où ``\alpha`` est la réciproque de la [fonction d'Ackermann](https://fr.wikipedia.org/wiki/Fonction_d%27Ackermann), une fonction qui augmente extrèmement lentement donc en pratique, c'est presque ``O(|V|)``.
"""
# ╔═╡ 8e7b6a51-1f8e-43d7-846b-a9e7596052b9
frametitle("Piste Eulérienne")
# ╔═╡ 0d914458-7ab1-4d0e-afc6-1bd0db52076a
qa(md"Proof", md"Pour chaque noeud de degré pair, quand on arrive à ce noeud, on saura le quitter par une arête non-utilisé. Son degré d'arête non-utilisé va être diminué par deux et donc rester pair. On va alors s'arêter sur le noeud de départ si tous les degrés sont pairs. Si 2 degrés sont impairs, on doit partir d'un noeud à degré impair et on arrivera à l'autre noeud à degré impair. Ceci construit un circuit ou piste et laisse le graphe avec un degré pair d'arêtes non-utilisées à chaque noeud. On peut alors trouver un autre circuit avec la même approche et continuer à construire de nouveaux circuit jusqu'à ce que tous les degrés soient zero. Si le graphe a une seule composante connecté, on sait ensuite fusionner tous ces circuits en un seul circuit.")
# ╔═╡ 75bb5e30-76b8-486b-b3fa-9979aaf830a5
section("Utils")
# ╔═╡ 4253daed-b737-49bf-9927-6b9db39d43c1
md"""
**Définition**
# ╔═╡ accdf77c-fc4b-4777-bebf-9d69ebb36526
import DocumenterCitations, Polyhedra, Makie, WGLMakie, Bonito
* Une *forêt* (forest) est un graphe qui n'a **pas** de **cycle**.
* Un *arbre* (tree) est une forêt avec **une** seule **composante** connexe.
# ╔═╡ 1b748b69-5262-46c9-aeff-01696c585e6f
biblio = load_biblio!()
Par abus de language, on parle souvent d'arbre sans se soucier de si le graphe est connecté ou pas.
"""
# ╔═╡ d57a6a11-0387-4693-a50e-9eba62605a49
polyhedron = Polyhedra.polyhedron(Polyhedra.vrep(Float64[
0 1 2 3;0 2 1 3; 1 0 2 3; 1 2 0 3; 2 0 1 3; 2 1 0 3;
0 1 3 2;0 3 1 2; 1 0 3 2; 1 3 0 2; 3 0 1 2; 3 1 0 2;
0 3 2 1;0 2 3 1; 3 0 2 1; 3 2 0 1; 2 0 3 1; 2 3 0 1;
3 1 2 0;3 2 1 0; 1 3 2 0; 1 2 3 0; 2 3 1 0; 2 1 3 0
]))
# ╔═╡ 60e42a23-9acc-4df0-8a9d-4c5f87a74a90
md"""
Étant donné un graphe ``G(V, E)``, sa *forêt sous-tendante* (spanning forest) est une forêt ``G'(V, E')`` où ``E' \subseteq E``. Comment la trouver ?
"""
# ╔═╡ 2fedb811-6f34-424f-a46b-806bb0c6b9c0
projected = Polyhedra.project(polyhedron, [1 1 1; -1 1 1; 0 -2 1; 0 0 -3])
# ╔═╡ b5088341-c171-45bc-ab93-c49059da6c6a
qa(md"Quelle est la complexité de Kruskal ?", md"??")
# ╔═╡ dc4766e9-e4a7-4b8b-a6db-360df927cc5d
md"""
Dans un graphe dirigé, une arête ``(i, j)`` a un **sens**. Intuitivement, on peut aller de ``i`` vers ``j`` mais on ne peut qu'aller de ``j`` vers ``i`` si il y a aussi une autre arête de ``(j, i)``.
Que deviennent les notions de **connected components**, **spanning tree**, etc...
"""
# ╔═╡ ea6fabad-d23a-46b7-ba8c-e4822216cd4e
md"""
**Définition** Une **composante fortement connexe** d'un graphe dirigé ``G(V, E)`` est un ensemble ``V' \subseteq V`` tel qu'il existe un chemin de ``u`` vers ``v`` pour tous ``u, v \in V'``.
"""
# ╔═╡ d4cb08b6-7829-45fe-ab61-b45b39b6c3ec
md"""
```math
F_n = F_{n-1} + F_{n-2} \qquad F_2 = F_1 = 1
```
"""
# ╔═╡ 8eca3dcf-e69f-40b6-b1cd-65785af1d2c4
md"n = $slider_n"
# ╔═╡ 0a2f66ad-bff3-42e5-9f91-2f8c46ab41a7
md"Combien de **fois** `fib(3)` est appelé quand l'utilisateur appelle `fib(8)` ?"
# ╔═╡ ae970602-a2f0-472f-8e77-35b6bfd4cb39
md"n = $slider_n"
# ╔═╡ cf1fd0a7-0512-4b0f-800a-912be0c6138a
md"Nombre d'appels de `fib(k)` venant de `fib(n)`"
# ╔═╡ 09192bc0-ac3e-47fe-8307-67f9c66d4f8e
md"n = $slider_n"
# ╔═╡ 28cfa917-cf00-4790-b71d-e629a18e4e10
md"""
* Le Puissance 4 de 7 colonnes de hauteur 6 est résolu par ordinateur en 1988
* Utilisation de l'algorithme **minimax** vu au cours S4...
* ...mais avec l'aide de la programmation dynamique!
"""
# ╔═╡ beb44e5f-2677-448e-8a23-6611ad0dd65d
function minimax(nrows::Integer, ncols, longueur; vert = -200, w = 1200, h = 600, dy = 140, damping = 0.9, Δy = 55, scaling)
config = _init(nrows, ncols)
Luxor.@draw minimax(config, _first_player(config), longueur, 1; dy, damping, vert, Δy, scaling) w h
end;
# ╔═╡ 877e5e67-b8a2-4d42-8043-47057a6df1ad
HAlign(md"Colonnes = $slider_ncols", md"Hauteur = $slider_nrows")
# ╔═╡ a252ae16-783c-4e8f-a467-1bcbf1e12565
md"Longueur = $slider_longueur" # Cols(md"Longueur = $slider_longueur", md"Gagnant patient ? $checkbox_patient")
# ╔═╡ 9e45076a-a26d-4964-a31f-da58f40f9d50
HAlign(md"Colonnes = $slider_wooclap_ncols", md"Hauteur = $slider_wooclap_nrows")
# ╔═╡ 9e3a4cb5-5ed9-42ac-b0d1-11aa5189089c
md"Quelle **structure de donnée** utiliser pour la mémoïsation : état du jeu → action optimale ?"
# ╔═╡ 7613cf26-b429-4483-bf55-bb110e49f45e
HAlign(md"Colonnes = $slider_mem_ncols", md"Hauteur = $slider_mem_nrows")
# ╔═╡ ff30250c-8844-45c5-b5fb-2f09bf05ac4e
md"Longueur = $slider_mem_longueur" # Cols(md"Longueur = $slider_mem_longueur", md"Gagnant patient ? $checkbox_mem_patient")
# ╔═╡ f0ba7d64-a360-450b-a9bb-ee6d5751e9ec
function winner(config, longueur)
for col in _columns(config)
row = _first_row(config)
while true
pos = (row, col)
win, Δ = winner(config, longueur, pos)
if _has_winner(win)
return win, pos, Δ
end
row = _next_row(row)
if _done(config, row)
break
end
end
end
return _no_winner(config), (0, 0), (0, 0)
end
# ╔═╡ 92956d94-f128-46fd-9bc5-f96d6ad265fd
function winner(config, x, Δ::Tuple{Int,Int}, longueur)
if !_inrows(config, x[1], (longueur::Int - 1) * Δ[1]) ||
!in(x[2] + (longueur::Int - 1) * Δ[2], _columns(config))
#if !all(in.(x .+ (longueur - 1) .* Δ, axes(config)))
return _no_winner(config)
end
cur = config[x[1], x[2]]
if iszero(cur[1])
return _no_winner(config)
end
for i in 1:(longueur::Int - 1)
if config[_shift(x[1], i * Δ[1]), _shift(x[2], i * Δ[2])] != cur
#if config[(x .+ i .* Δ)...] != cur
return _no_winner(config)
end
end
return cur
end
# ╔═╡ 3b494bea-74b1-43c8-9ab8-6ad744294c2f
function play!(config, col::Int, player)
row = _next(config, col)
#row = @time findfirst(row -> iszero(config[row, col]), axes(config, 1))
#if !isnothing(row)
if !iszero(row)
config = _assign(config, row, col, player)
end
return row, config
end
# ╔═╡ 3f48d345-1535-4568-becd-d8d79b3fa95c
function width(config, player, longueur, damping, depth)
if _has_winner(winner(config, longueur)[1])
return damping^depth
end
w = 0
for col in _columns(config)
row, new_config = play!(config, col, player)
if !iszero(row)
w += width(new_config, _next_player(player), longueur, damping, depth + 1)
end
end
return max(w, 1)
end;
# ╔═╡ 2ef98325-0497-4a76-b2b4-161e663575c4
function _draw(config, longueur, δ = 50)
colors = Dict(
(false, false) => "white", (true, true) => "red", (true, false) => "palegreen",
0 => "white", 1 => "palegreen", -1 => "red",
)
sz = (length(_columns(config)), _num_rows(config))
c = (sz .+ 1) ./ 2 .* δ
screen = sz .* δ
pos(row, col) = Luxor.Point(δ * col, δ * (sz[2] - _shift_bit(row) + 1))
Luxor.translate(-Luxor.Point(c...))
Luxor.sethue("royalblue")
Luxor.polysmooth(Luxor.box(Luxor.Point(c...), screen..., vertices=true), δ * 0.2, :fill)
for col in _columns(config)
row = _first_row(config)
while true
Luxor.sethue(colors[config[row, col]])
Luxor.circle(pos(row, col), δ / 3, :fill)
row = _next_row(row)
if _done(config, row)
break
end
end
end
win, x, Δ = winner(config, longueur)
if _has_winner(win)
Luxor.sethue(colors[win])
#polysmooth(Luxor.box(pos((x .+ Δ .* (longueur - 1) ./ 2)...), reverse((Δ .* δ .* (longueur - 0.4)) .+ δ/5)...), 4, :fill)
Luxor.setline(δ/10)
Luxor.line(pos(x...), pos((_shift_bit.(x) .+ Δ .* (longueur-1))...), :stroke)
end
Luxor.translate(Luxor.Point(c...))
end
# ╔═╡ 74e93e11-f07d-4f8d-a5aa-7b6e38825270
function best_move_rec(config, player, longueur, depth, cache; patient, maxturn)
if depth > maxturn + 1
error("$depth > $maxturn + 1")
end
if cache !== nothing
if haskey(cache, config)
return convert(Tuple{Int,Int}, cache[config])
end
reversed = _reverse(config)
if haskey(cache, reversed)
return convert(Tuple{Int,Int}, cache[reversed])
end
end
config = _copy(config)
best = 0
best_col = 0
for col in _columns(config)
row, new_config = play!(config, col, player)
if !iszero(row)
win, _ = winner(new_config, longueur, (row, col))
if _has_winner(win)
best = _sign(win, 2maxturn - depth)
best_col = col
end
end
end
if iszero(best)
for col in _columns(config)
row, new_config = play!(config, col, player)
if !iszero(row)
cur, _ = best_move_rec(new_config, _next_player(player), longueur, depth + 1, cache; patient, maxturn)
if best_col == 0 || _compare(player, cur, best)
best = cur
best_col = col
if patient && _compare(player, best, 0)
break
end
end
_unassign(config, row, col)
end
end
end
if cache !== nothing
cache[config] = (best, best_col)
end
return best, best_col
end
# ╔═╡ df7c6179-7541-4b38-8317-1aeccbd04868
function minimax(config, player, longueur, depth; dy, damping, vert, Δy, scaling)
δ = round(Int, dy * damping^depth) * scaling
w = width(config, player, longueur, damping, depth)
if all(iszero(config.libre))
Luxor.translate(0, vert)
else
Luxor.translate(δ * w/2, 0)
end
_draw(config, longueur)
Luxor.translate(-δ * w/2, 0)
if _has_winner(winner(config, longueur)[1])
return w
end
cur = 0
for col in _columns(config)
row, new_config = play!(config, col, player)
if !iszero(row)
dx = cur * δ
Luxor.translate(dx, dy)
win, _, _ = winner(new_config, longueur)
score, _ = best_move_rec(new_config, _next_player(player), longueur, depth + 1, nothing, patient = true, maxturn = 30)
dw = minimax(new_config, _next_player(player), longueur, depth + 1; dy, damping, vert, Δy, scaling)
if _has_winner(win)
if player
Luxor.sethue("red")
else
Luxor.sethue("palegreen")
end
elseif score == 0
Luxor.sethue("black")
elseif score > 0
Luxor.sethue("palegreen")
else
Luxor.sethue("red")
end
Luxor.setline(δ/20)
Luxor.line(Luxor.Point(-dx+δ * w/2, -dy+Δy), Luxor.Point(δ*dw/2, -Δy), :stroke)
Luxor.translate(-dx, -dy)
cur += dw
end
end
return w
end;
# ╔═╡ 005b2830-0510-4ef2-bb06-5a63ea5c372d
minimax(2, 2, 2, scaling = 1.7)
# ╔═╡ 9e9f07dd-edcb-471c-9fb4-613553e10353
minimax(3, 2, 2; vert = -350, w = 1400, h = 900, dy = 170, Δy = 70, scaling = 0.8, damping = 1)
# ╔═╡ 2429f085-20f2-4941-820e-c49499331874
function game!(config, cols, longueur, memoization; patient, maxturn)
if memoization
cache = Dict{typeof(config),Tuple{Int8,Int8}}()
else
cache = nothing
end
player = _first_player(config)
for i in 1:maxturn
_, col = best_move_rec(config, player, longueur, 1, cache; patient, maxturn)
if col == 0
break
end
push!(cols, col)
_, config = play!(config, col, player)
w = winner(config, longueur)
if _has_winner(w[1])
break
end
player = _next_player(player)
end
return cols
end
# ╔═╡ fa7956f3-822a-4d34-bb64-f94104b3d03e
game(nrows, ncols, longueur; memoization = false, patient = true) = game!(_init(nrows, ncols), Int[], longueur, memoization; patient, maxturn = nrows * ncols)
# ╔═╡ 17dc0577-35dd-4580-b2d1-958f2d3336e5
cols = @time game(nrows, ncols, longueur)
# ╔═╡ 797a4c59-6978-482e-b085-9924ea5f63bc
slider_tour = @bind tour Slider(1:length(cols), default = length(cols), show_value = true);
# ╔═╡ a2596069-63c1-4950-b9be-bf10a402b5bb
mem_cols = @time game(mem_nrows, mem_ncols, mem_longueur, memoization = true)
# ╔═╡ f0f1539a-0a11-4c81-95d8-b6375fbc9160
slider_mem_tour = @bind mem_tour Slider(1:length(mem_cols), default = length(mem_cols), show_value = true);
# ╔═╡ 2766c3d6-6a48-4b30-bf4e-56ac9a341145
function draw(config, longueur, δ = 50)
sz = (length(_columns(config)), _num_rows(config))
screen = sz .* δ
Luxor.@draw begin
_draw(config, longueur, δ)
end screen[1] screen[2]
end
# ╔═╡ 103f4378-34f6-46ae-9ff0-1ffd1fe4d8dd
md"""
Observations clés:
* Arbre de recherche:
- ``\text{colonnes} = `` $wooclap_ncols sous-branches par noeuds
- profondeur : ``\text{colonnes} \times \text{hauteur}`` donc ...
- ... $wooclap_ncols``{}^{\text{colonnes} \times \text{hauteur}} = `` $(replace(Formatting.format(wooclap_ncols^(wooclap_nrows * wooclap_ncols), commas=true), "," => " ")) feuilles !
* Stratégie optimale dépend de la **grille** mais **pas du passé**
* Chaque case a 3 états possibles: $(draw(zeros(Int, 1, 1), 1, 20)), $(draw(ones(Int, 1, 1), 1, 20)) et $(draw(-ones(Int, 1, 1), 1, 20))
* ``3^{\text{colonnes} \times \text{hauteur}} = `` $(replace(Formatting.format(3^(wooclap_nrows * wooclap_ncols), commas=true), "," => " ")) grilles différentes...
* ... mais beaucoup de ces grilles sont invalides ou **pas explorées**
"""
# ╔═╡ 5b9132b5-6638-413f-83f3-2bf1f2f9e3e6
function play(nrows, ncols, cols)
config = _init(nrows, ncols)
player = _first_player(config)
for col in cols
_, config = play!(config, col, player)
player = _next_player(player)
end
return config
end
# ╔═╡ 9e114f3b-77f2-4b06-bff2-35e36c806b56
HAlign(
md"tour = $slider_tour",
HTML(html(draw(play(nrows, ncols, cols[1:tour]), longueur)))
)
# ╔═╡ 35cffe19-61e3-4eb1-9ec1-aeb36f91c93b
HAlign(
md"tour = $slider_mem_tour",
HTML(html(draw(play(mem_nrows, mem_ncols, mem_cols[1:mem_tour]), mem_longueur)))
)
# ╔═╡ f1af8644-4daf-464f-aba1-b306541508bc
mesh = Polyhedra.Mesh(projected)
......@@ -225,23 +974,36 @@ refs(["west2022Introduction", "cormen2022Introduction"])
PLUTO_PROJECT_TOML_CONTENTS = """
[deps]
Bonito = "824d6782-a2ef-11e9-3a09-e5662e0c26f8"
Colors = "5ae59095-9a9b-59fe-a467-6f913c188581"
DataStructures = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8"
DocumenterCitations = "daee34ce-89f3-4625-b898-19384cb65244"
Formatting = "59287772-0a20-5a39-b81b-1366585eb4c0"
GraphPlot = "a2cc645c-3eea-5389-862e-a155d0052231"
Graphs = "86223c79-3864-5bf0-83f7-82e725a168b6"
Luxor = "ae8d54c2-7ccd-5906-9d76-62fc9837b5bc"
Makie = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a"
PlutoUI = "7f904dfe-b85e-4ff6-b463-dae2292396a8"
Polyhedra = "67491407-f73d-577b-9b50-8179a7c68029"
Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"
SimpleWeightedGraphs = "47aef6b3-ad0c-573a-a1e2-d07658019622"
StaticArrays = "90137ffa-7385-5640-81b9-e52037218182"
WGLMakie = "276b4fcb-3e11-5398-bf8b-a0c2d153d008"
[compat]
Bonito = "~3.2.2"
Bonito = "~4.0.0"
Colors = "~0.12.11"
DataStructures = "~0.18.20"
DocumenterCitations = "~1.3.5"
Formatting = "~0.4.3"
GraphPlot = "~0.6.0"
Graphs = "~1.9.0"
Makie = "~0.21.13"
Luxor = "~4.1.0"
Makie = "~0.21.17"
PlutoUI = "~0.7.60"
Polyhedra = "~0.7.8"
WGLMakie = "~0.10.13"
SimpleWeightedGraphs = "~1.4.0"
StaticArrays = "~1.9.8"
WGLMakie = "~0.10.17"
"""
# ╔═╡ 00000000-0000-0000-0000-000000000002
......@@ -250,7 +1012,7 @@ PLUTO_MANIFEST_TOML_CONTENTS = """
julia_version = "1.11.2"
manifest_format = "2.0"
project_hash = "feb7b6e362fe5c6656a7e942f7aba17db4834b37"
project_hash = "5bf96e00a2e13ab0a5de00e8daf8c8bd9034ba1f"
[[deps.ANSIColoredPrinters]]
git-tree-sha1 = "574baf8110975760d391c710b6341da1afa48d8c"
......@@ -302,9 +1064,9 @@ version = "1.1.3"
[[deps.Animations]]
deps = ["Colors"]
git-tree-sha1 = "e81c509d2c8e49592413bfb0bb3b08150056c79d"
git-tree-sha1 = "e092fa223bf66a3c41f9c022bd074d916dc303e7"
uuid = "27a7e980-b3e6-11e9-2bcd-0b925532e340"
version = "0.4.1"
version = "0.4.2"
[[deps.ArgTools]]
uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f"
......@@ -321,10 +1083,10 @@ uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33"
version = "1.11.0"
[[deps.Automa]]
deps = ["PrecompileTools", "TranscodingStreams"]
git-tree-sha1 = "014bc22d6c400a7703c0f5dc1fdc302440cf88be"
deps = ["PrecompileTools", "SIMD", "TranscodingStreams"]
git-tree-sha1 = "a8f503e8e1a5f583fbef15a8440c8c7e32185df2"
uuid = "67c07d97-cdcb-5c2c-af73-a7f9c32a568b"
version = "1.0.4"
version = "1.1.0"
[[deps.AxisAlgorithms]]
deps = ["LinearAlgebra", "Random", "SparseArrays", "WoodburyMatrices"]
......@@ -373,9 +1135,9 @@ version = "0.1.9"
[[deps.Bonito]]
deps = ["Base64", "CodecZlib", "Colors", "Dates", "Deno_jll", "HTTP", "Hyperscript", "LinearAlgebra", "Markdown", "MsgPack", "Observables", "RelocatableFolders", "SHA", "Sockets", "Tables", "ThreadPools", "URIs", "UUIDs", "WidgetsBase"]
git-tree-sha1 = "91302336aa0c70d6eed21d6fbae6823168903b89"
git-tree-sha1 = "262f58917d5d9644d16ec6f53480e11a6e128db2"
uuid = "824d6782-a2ef-11e9-3a09-e5662e0c26f8"
version = "3.2.2"
version = "4.0.0"
[[deps.Bzip2_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
......@@ -398,6 +1160,12 @@ git-tree-sha1 = "e329286945d0cfc04456972ea732551869af1cfc"
uuid = "4e9b3aee-d8a1-5a3d-ad8b-7d824db253f0"
version = "1.0.1+0"
[[deps.Cairo]]
deps = ["Cairo_jll", "Colors", "Glib_jll", "Graphics", "Libdl", "Pango_jll"]
git-tree-sha1 = "71aa551c5c33f1a4415867fe06b7844faadb0ae9"
uuid = "159f3aea-2a34-519c-b102-8c37f9878175"
version = "1.1.1"
[[deps.Cairo_jll]]
deps = ["Artifacts", "Bzip2_jll", "CompilerSupportLibraries_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "JLLWrappers", "LZO_jll", "Libdl", "Pixman_jll", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Zlib_jll", "libpng_jll"]
git-tree-sha1 = "009060c9a6168704143100f36ab08f06c2af4642"
......@@ -531,10 +1299,10 @@ uuid = "ade2ca70-3891-5945-98fb-dc099432e06a"
version = "1.11.0"
[[deps.DelaunayTriangulation]]
deps = ["AdaptivePredicates", "EnumX", "ExactPredicates", "PrecompileTools", "Random"]
git-tree-sha1 = "668bb97ea6df5e654e6288d87d2243591fe68665"
deps = ["AdaptivePredicates", "EnumX", "ExactPredicates", "Random"]
git-tree-sha1 = "e1371a23fd9816080c828d0ce04373857fe73d33"
uuid = "927a84f5-c5f4-47a5-9785-b46e178433df"
version = "1.6.0"
version = "1.6.3"
[[deps.DelimitedFiles]]
deps = ["Mmap"]
......@@ -544,9 +1312,9 @@ version = "1.9.1"
[[deps.Deno_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl"]
git-tree-sha1 = "7e2908b0979fcf7375db8b7613cb348b31be8ad8"
git-tree-sha1 = "cd6756e833c377e0ce9cd63fb97689a255f12323"
uuid = "04572ae6-984a-583e-9378-9577a1c2574d"
version = "2.0.0+0"
version = "1.33.4+0"
[[deps.DiffResults]]
deps = ["StaticArraysCore"]
......@@ -629,20 +1397,26 @@ version = "0.1.11"
[[deps.Expat_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl"]
git-tree-sha1 = "cc5231d52eb1771251fbd37171dbc408bcc8a1b6"
git-tree-sha1 = "e51db81749b0777b2147fbe7b783ee79045b8e99"
uuid = "2e619515-83b5-522b-bb60-26c02a35a201"
version = "2.6.4+0"
version = "2.6.4+1"
[[deps.Extents]]
git-tree-sha1 = "81023caa0021a41712685887db1fc03db26f41f5"
uuid = "411431e0-e8b7-467b-b5e0-f676ba4f2910"
version = "0.1.4"
[[deps.FFMPEG]]
deps = ["FFMPEG_jll"]
git-tree-sha1 = "53ebe7511fa11d33bec688a9178fac4e49eeee00"
uuid = "c87230d0-a227-11e9-1b43-d7ebe4e7570a"
version = "0.4.2"
[[deps.FFMPEG_jll]]
deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "JLLWrappers", "LAME_jll", "Libdl", "Ogg_jll", "OpenSSL_jll", "Opus_jll", "PCRE2_jll", "Zlib_jll", "libaom_jll", "libass_jll", "libfdk_aac_jll", "libvorbis_jll", "x264_jll", "x265_jll"]
git-tree-sha1 = "8cc47f299902e13f90405ddb5bf87e5d474c0d38"
git-tree-sha1 = "466d45dc38e15794ec7d5d63ec03d776a9aff36e"
uuid = "b22a6f82-2f65-5046-a5b2-351ab43fb4e5"
version = "6.1.2+0"
version = "4.4.4+1"
[[deps.FFTW]]
deps = ["AbstractFFTs", "FFTW_jll", "LinearAlgebra", "MKL_jll", "Preferences", "Reexport"]
......@@ -707,15 +1481,21 @@ version = "0.8.5"
[[deps.Fontconfig_jll]]
deps = ["Artifacts", "Bzip2_jll", "Expat_jll", "FreeType2_jll", "JLLWrappers", "Libdl", "Libuuid_jll", "Zlib_jll"]
git-tree-sha1 = "db16beca600632c95fc8aca29890d83788dd8b23"
git-tree-sha1 = "21fac3c77d7b5a9fc03b0ec503aa1a6392c34d2b"
uuid = "a3f928ae-7b40-5064-980b-68af3947d34b"
version = "2.13.96+0"
version = "2.15.0+0"
[[deps.Format]]
git-tree-sha1 = "9c68794ef81b08086aeb32eeaf33531668d5f5fc"
uuid = "1fa38f19-a742-5d3f-a2b9-30dd87b9d5f8"
version = "1.3.7"
[[deps.Formatting]]
deps = ["Logging", "Printf"]
git-tree-sha1 = "fb409abab2caf118986fc597ba84b50cbaf00b87"
uuid = "59287772-0a20-5a39-b81b-1366585eb4c0"
version = "0.4.3"
[[deps.ForwardDiff]]
deps = ["CommonSubexpressions", "DiffResults", "DiffRules", "LinearAlgebra", "LogExpFunctions", "NaNMath", "Preferences", "Printf", "Random", "SpecialFunctions"]
git-tree-sha1 = "a2df1b776752e3f344e5116c06d75a10436ab853"
......@@ -734,15 +1514,15 @@ version = "4.1.1"
[[deps.FreeType2_jll]]
deps = ["Artifacts", "Bzip2_jll", "JLLWrappers", "Libdl", "Zlib_jll"]
git-tree-sha1 = "5c1d8ae0efc6c2e7b1fc502cbe25def8f661b7bc"
git-tree-sha1 = "786e968a8d2fb167f2e4880baba62e0e26bd8e4e"
uuid = "d7e528f0-a631-5988-bf34-fe36492bcfd7"
version = "2.13.2+0"
version = "2.13.3+1"
[[deps.FreeTypeAbstraction]]
deps = ["ColorVectorSpace", "Colors", "FreeType", "GeometryBasics"]
git-tree-sha1 = "2493cdfd0740015955a8e46de4ef28f49460d8bc"
git-tree-sha1 = "d52e255138ac21be31fa633200b65e4e71d26802"
uuid = "663a7486-cb36-511b-a19d-713bb74d65c9"
version = "0.10.3"
version = "0.10.6"
[[deps.FriBidi_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl"]
......@@ -779,6 +1559,12 @@ git-tree-sha1 = "9b02998aba7bf074d14de89f9d37ca24a1a0b046"
uuid = "78b55507-aeef-58d4-861c-77aaff3498b1"
version = "0.21.0+0"
[[deps.Giflib_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl"]
git-tree-sha1 = "0224cce99284d997f6880a42ef715a37c99338d1"
uuid = "59f7168a-df46-5410-90c8-f2779963d0ec"
version = "5.2.2+0"
[[deps.Git]]
deps = ["Git_jll"]
git-tree-sha1 = "04eff47b1354d702c3a85e8ab23d539bb7d5957e"
......@@ -787,15 +1573,15 @@ version = "1.3.1"
[[deps.Git_jll]]
deps = ["Artifacts", "Expat_jll", "JLLWrappers", "LibCURL_jll", "Libdl", "Libiconv_jll", "OpenSSL_jll", "PCRE2_jll", "Zlib_jll"]
git-tree-sha1 = "ea372033d09e4552a04fd38361cd019f9003f4f4"
git-tree-sha1 = "399f4a308c804b446ae4c91eeafadb2fe2c54ff9"
uuid = "f8c6e375-362e-5223-8a59-34ff63f689eb"
version = "2.46.2+0"
version = "2.47.1+0"
[[deps.Glib_jll]]
deps = ["Artifacts", "Gettext_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Libiconv_jll", "Libmount_jll", "PCRE2_jll", "Zlib_jll"]
git-tree-sha1 = "674ff0db93fffcd11a3573986e550d66cd4fd71f"
git-tree-sha1 = "48b5d4c75b2c9078ead62e345966fa51a25c05ad"
uuid = "7746bdde-850d-59dc-9ae8-88ece973131d"
version = "2.80.5+0"
version = "2.82.2+1"
[[deps.GraphPlot]]
deps = ["ArnoldiMethod", "Colors", "Compose", "DelimitedFiles", "Graphs", "LinearAlgebra", "Random", "SparseArrays"]
......@@ -803,11 +1589,17 @@ git-tree-sha1 = "f76a7a0f10af6ce7f227b7a921bfe351f628ed45"
uuid = "a2cc645c-3eea-5389-862e-a155d0052231"
version = "0.6.0"
[[deps.Graphics]]
deps = ["Colors", "LinearAlgebra", "NaNMath"]
git-tree-sha1 = "a641238db938fff9b2f60d08ed9030387daf428c"
uuid = "a2bd30eb-e257-5431-a919-1863eab51364"
version = "1.1.3"
[[deps.Graphite2_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "344bf40dcab1073aca04aa0df4fb092f920e4011"
git-tree-sha1 = "01979f9b37367603e2848ea225918a3b3861b606"
uuid = "3b182d85-2403-5c21-9c21-1e1f0cc25472"
version = "1.3.14+0"
version = "1.3.14+1"
[[deps.Graphs]]
deps = ["ArnoldiMethod", "Compat", "DataStructures", "Distributed", "Inflate", "LinearAlgebra", "Random", "SharedArrays", "SimpleTraits", "SparseArrays", "Statistics"]
......@@ -817,9 +1609,9 @@ version = "1.9.0"
[[deps.GridLayoutBase]]
deps = ["GeometryBasics", "InteractiveUtils", "Observables"]
git-tree-sha1 = "fc713f007cff99ff9e50accba6373624ddd33588"
git-tree-sha1 = "dc6bed05c15523624909b3953686c5f5ffa10adc"
uuid = "3955a311-db13-416c-9275-1d80ed98e5e9"
version = "0.11.0"
version = "0.11.1"
[[deps.Grisu]]
git-tree-sha1 = "53bb909d1151e57e2484c3d1b53e19552b887fb2"
......@@ -828,15 +1620,15 @@ version = "1.0.2"
[[deps.HTTP]]
deps = ["Base64", "CodecZlib", "ConcurrentUtilities", "Dates", "ExceptionUnwrapping", "Logging", "LoggingExtras", "MbedTLS", "NetworkOptions", "OpenSSL", "PrecompileTools", "Random", "SimpleBufferStream", "Sockets", "URIs", "UUIDs"]
git-tree-sha1 = "ae350b8225575cc3ea385d4131c81594f86dfe4f"
git-tree-sha1 = "6c22309e9a356ac1ebc5c8a217045f9bae6f8d9a"
uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3"
version = "1.10.12"
version = "1.10.13"
[[deps.HarfBuzz_jll]]
deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "Graphite2_jll", "JLLWrappers", "Libdl", "Libffi_jll"]
git-tree-sha1 = "401e4f3f30f43af2c8478fc008da50096ea5240f"
git-tree-sha1 = "55c53be97790242c29031e5cd45e8ac296dadda3"
uuid = "2e76f6c2-a576-52d4-95c1-20adfe4de566"
version = "8.3.1+0"
version = "8.5.0+0"
[[deps.HypergeometricFunctions]]
deps = ["LinearAlgebra", "OpenLibm_jll", "SpecialFunctions"]
......@@ -864,9 +1656,9 @@ version = "0.2.5"
[[deps.ImageAxes]]
deps = ["AxisArrays", "ImageBase", "ImageCore", "Reexport", "SimpleTraits"]
git-tree-sha1 = "2e4520d67b0cef90865b3ef727594d2a58e0e1f8"
git-tree-sha1 = "e12629406c6c4442539436581041d372d69c55ba"
uuid = "2803e5a7-5153-5ecf-9a86-9b4c37f5f5ac"
version = "0.6.11"
version = "0.6.12"
[[deps.ImageBase]]
deps = ["ImageCore", "Reexport"]
......@@ -876,21 +1668,21 @@ version = "0.1.7"
[[deps.ImageCore]]
deps = ["ColorVectorSpace", "Colors", "FixedPointNumbers", "MappedArrays", "MosaicViews", "OffsetArrays", "PaddedViews", "PrecompileTools", "Reexport"]
git-tree-sha1 = "b2a7eaa169c13f5bcae8131a83bc30eff8f71be0"
git-tree-sha1 = "8c193230235bbcee22c8066b0374f63b5683c2d3"
uuid = "a09fc81d-aa75-5fe9-8630-4744c3626534"
version = "0.10.2"
version = "0.10.5"
[[deps.ImageIO]]
deps = ["FileIO", "IndirectArrays", "JpegTurbo", "LazyModules", "Netpbm", "OpenEXR", "PNGFiles", "QOI", "Sixel", "TiffImages", "UUIDs"]
git-tree-sha1 = "437abb322a41d527c197fa800455f79d414f0a3c"
deps = ["FileIO", "IndirectArrays", "JpegTurbo", "LazyModules", "Netpbm", "OpenEXR", "PNGFiles", "QOI", "Sixel", "TiffImages", "UUIDs", "WebP"]
git-tree-sha1 = "696144904b76e1ca433b886b4e7edd067d76cbf7"
uuid = "82e4d734-157c-48bb-816b-45c225c6df19"
version = "0.6.8"
version = "0.6.9"
[[deps.ImageMetadata]]
deps = ["AxisArrays", "ImageAxes", "ImageBase", "ImageCore"]
git-tree-sha1 = "355e2b974f2e3212a75dfb60519de21361ad3cb7"
git-tree-sha1 = "2a81c3897be6fbcde0802a0ebe6796d0562f63ec"
uuid = "bc367c6b-8a6b-528e-b4bd-a4b897500b49"
version = "0.9.9"
version = "0.9.10"
[[deps.Imath_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl"]
......@@ -953,6 +1745,16 @@ weakdeps = ["Random", "RecipesBase", "Statistics"]
IntervalSetsRecipesBaseExt = "RecipesBase"
IntervalSetsStatisticsExt = "Statistics"
[[deps.InverseFunctions]]
git-tree-sha1 = "a779299d77cd080bf77b97535acecd73e1c5e5cb"
uuid = "3587e190-3f89-42d0-90ee-14403ec27112"
version = "0.1.17"
weakdeps = ["Dates", "Test"]
[deps.InverseFunctions.extensions]
InverseFunctionsDatesExt = "Dates"
InverseFunctionsTestExt = "Test"
[[deps.IrrationalConstants]]
git-tree-sha1 = "630b497eafcc20001bba38a4651b327dcfc491d2"
uuid = "92d709cd-6900-40b7-9082-c6be49f344b6"
......@@ -1040,6 +1842,12 @@ git-tree-sha1 = "170b660facf5df5de098d866564877e119141cbd"
uuid = "c1c5ebd0-6772-5130-a774-d5fcae4a789d"
version = "3.100.2+0"
[[deps.LERC_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl"]
git-tree-sha1 = "36bdbc52f13a7d1dcb0f3cd694e01677a515655b"
uuid = "88015f11-f218-50d7-93a8-a6af411a945d"
version = "4.0.0+0"
[[deps.LLVMOpenMP_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl"]
git-tree-sha1 = "78211fb6cbc872f77cad3fc0b6cf647d923f4929"
......@@ -1113,6 +1921,12 @@ git-tree-sha1 = "8be878062e0ffa2c3f67bb58a595375eda5de80b"
uuid = "d4300ac3-e22c-5743-9152-c294e39db1e4"
version = "1.11.0+0"
[[deps.Libglvnd_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll", "Xorg_libXext_jll"]
git-tree-sha1 = "ff3b4b9d35de638936a525ecd36e86a8bb919d11"
uuid = "7e76a0d4-f3c7-5321-8279-8d96eeed0f29"
version = "1.7.0+0"
[[deps.Libgpg_error_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl"]
git-tree-sha1 = "c6ce1e19f3aec9b59186bdf06cdf3c4fc5f5f3e6"
......@@ -1127,15 +1941,27 @@ version = "1.17.0+1"
[[deps.Libmount_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl"]
git-tree-sha1 = "0c4f9c4f1a50d8f35048fa0532dabbadf702f81e"
git-tree-sha1 = "84eef7acd508ee5b3e956a2ae51b05024181dee0"
uuid = "4b2f31a3-9ecc-558c-b454-b3730dcb73e9"
version = "2.40.1+0"
version = "2.40.2+0"
[[deps.Librsvg_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pango_jll", "Pkg", "gdk_pixbuf_jll"]
git-tree-sha1 = "ae0923dab7324e6bc980834f709c4cd83dd797ed"
uuid = "925c91fb-5dd6-59dd-8e8c-345e74382d89"
version = "2.54.5+0"
[[deps.Libtiff_jll]]
deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "LERC_jll", "Libdl", "XZ_jll", "Zlib_jll", "Zstd_jll"]
git-tree-sha1 = "b404131d06f7886402758c9ce2214b636eb4d54a"
uuid = "89763e89-9b03-5906-acba-b20f662cd828"
version = "4.7.0+0"
[[deps.Libuuid_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl"]
git-tree-sha1 = "5ee6203157c120d79034c748a2acba45b82b8807"
git-tree-sha1 = "edbf5309f9ddf1cab25afc344b1e8150b7c832f9"
uuid = "38a345b3-de98-5d2b-a5d3-14cd9215e700"
version = "2.40.1+0"
version = "2.40.2+0"
[[deps.LinearAlgebra]]
deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"]
......@@ -1168,6 +1994,16 @@ git-tree-sha1 = "f02b56007b064fbfddb4c9cd60161b6dd0f40df3"
uuid = "e6f89c97-d47a-5376-807f-9c37f3926c36"
version = "1.1.0"
[[deps.Luxor]]
deps = ["Base64", "Cairo", "Colors", "DataStructures", "Dates", "FFMPEG", "FileIO", "PolygonAlgorithms", "PrecompileTools", "Random", "Rsvg"]
git-tree-sha1 = "134570038473304d709de27384621bd0810d23fa"
uuid = "ae8d54c2-7ccd-5906-9d76-62fc9837b5bc"
version = "4.1.0"
weakdeps = ["LaTeXStrings", "MathTeXEngine"]
[deps.Luxor.extensions]
LuxorExtLatex = ["LaTeXStrings", "MathTeXEngine"]
[[deps.MIMEs]]
git-tree-sha1 = "65f28ad4b594aebe22157d6fac869786a255b7eb"
uuid = "6c6e2e6c-3030-632d-7369-2d6c69616d65"
......@@ -1186,16 +2022,16 @@ uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09"
version = "0.5.13"
[[deps.Makie]]
deps = ["Animations", "Base64", "CRC32c", "ColorBrewer", "ColorSchemes", "ColorTypes", "Colors", "Contour", "Dates", "DelaunayTriangulation", "Distributions", "DocStringExtensions", "Downloads", "FFMPEG_jll", "FileIO", "FilePaths", "FixedPointNumbers", "Format", "FreeType", "FreeTypeAbstraction", "GeometryBasics", "GridLayoutBase", "ImageBase", "ImageIO", "InteractiveUtils", "Interpolations", "IntervalSets", "Isoband", "KernelDensity", "LaTeXStrings", "LinearAlgebra", "MacroTools", "MakieCore", "Markdown", "MathTeXEngine", "Observables", "OffsetArrays", "Packing", "PlotUtils", "PolygonOps", "PrecompileTools", "Printf", "REPL", "Random", "RelocatableFolders", "Scratch", "ShaderAbstractions", "Showoff", "SignedDistanceFields", "SparseArrays", "Statistics", "StatsBase", "StatsFuns", "StructArrays", "TriplotBase", "UnicodeFun", "Unitful"]
git-tree-sha1 = "50ebda951efaa11b6db0413c1128726b8eab3bf0"
deps = ["Animations", "Base64", "CRC32c", "ColorBrewer", "ColorSchemes", "ColorTypes", "Colors", "Contour", "Dates", "DelaunayTriangulation", "Distributions", "DocStringExtensions", "Downloads", "FFMPEG_jll", "FileIO", "FilePaths", "FixedPointNumbers", "Format", "FreeType", "FreeTypeAbstraction", "GeometryBasics", "GridLayoutBase", "ImageBase", "ImageIO", "InteractiveUtils", "Interpolations", "IntervalSets", "InverseFunctions", "Isoband", "KernelDensity", "LaTeXStrings", "LinearAlgebra", "MacroTools", "MakieCore", "Markdown", "MathTeXEngine", "Observables", "OffsetArrays", "Packing", "PlotUtils", "PolygonOps", "PrecompileTools", "Printf", "REPL", "Random", "RelocatableFolders", "Scratch", "ShaderAbstractions", "Showoff", "SignedDistanceFields", "SparseArrays", "Statistics", "StatsBase", "StatsFuns", "StructArrays", "TriplotBase", "UnicodeFun", "Unitful"]
git-tree-sha1 = "260d6e1ac8abcebd939029e6eedeba4e3870f13a"
uuid = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a"
version = "0.21.13"
version = "0.21.17"
[[deps.MakieCore]]
deps = ["ColorTypes", "GeometryBasics", "IntervalSets", "Observables"]
git-tree-sha1 = "4604f03e5b057e8e62a95a44929cafc9585b0fe9"
git-tree-sha1 = "b774d0563bc332f64d136d50d0420a195d9bdcc6"
uuid = "20f20a25-4f0e-4fdf-b5d1-57303727442b"
version = "0.8.9"
version = "0.8.11"
[[deps.MappedArrays]]
git-tree-sha1 = "2dab0221fe2b0f2cb6754eaa743cc266339f527e"
......@@ -1221,9 +2057,9 @@ version = "1.34.0"
[[deps.MathTeXEngine]]
deps = ["AbstractTrees", "Automa", "DataStructures", "FreeTypeAbstraction", "GeometryBasics", "LaTeXStrings", "REPL", "RelocatableFolders", "UnicodeFun"]
git-tree-sha1 = "e1641f32ae592e415e3dbae7f4a188b5316d4b62"
git-tree-sha1 = "f45c8916e8385976e1ccd055c9874560c257ab13"
uuid = "0a4f8689-d25c-4efe-a92b-7142dfc1aa53"
version = "0.6.1"
version = "0.6.2"
[[deps.MbedTLS]]
deps = ["Dates", "MbedTLS_jll", "MozillaCACerts_jll", "NetworkOptions", "Random", "Sockets"]
......@@ -1295,9 +2131,9 @@ uuid = "510215fc-4207-5dde-b226-833fc4488ee2"
version = "0.5.5"
[[deps.OffsetArrays]]
git-tree-sha1 = "1a27764e945a152f7ca7efa04de513d473e9542e"
git-tree-sha1 = "39d000d9c33706b8364817d8894fae1548f40295"
uuid = "6fe1bfb0-de20-5000-8ca7-80f57d26f881"
version = "1.14.1"
version = "1.14.2"
weakdeps = ["Adapt"]
[deps.OffsetArrays.extensions]
......@@ -1316,9 +2152,9 @@ version = "0.3.27+1"
[[deps.OpenEXR]]
deps = ["Colors", "FileIO", "OpenEXR_jll"]
git-tree-sha1 = "327f53360fdb54df7ecd01e96ef1983536d1e633"
git-tree-sha1 = "97db9e07fe2091882c765380ef58ec553074e9c7"
uuid = "52e1d378-f018-4a11-a4be-720524705ac7"
version = "0.3.2"
version = "0.3.3"
[[deps.OpenEXR_jll]]
deps = ["Artifacts", "Imath_jll", "JLLWrappers", "Libdl", "Zlib_jll"]
......@@ -1356,9 +2192,9 @@ uuid = "91d4177d-7536-5919-b921-800302f37372"
version = "1.3.3+0"
[[deps.OrderedCollections]]
git-tree-sha1 = "dfdf5519f235516220579f949664f1bf44e741c5"
git-tree-sha1 = "12f1439c4f986bb868acda6ea33ebc78e19b95ad"
uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d"
version = "1.6.3"
version = "1.7.0"
[[deps.PCRE2_jll]]
deps = ["Artifacts", "Libdl"]
......@@ -1379,9 +2215,9 @@ version = "0.4.3"
[[deps.Packing]]
deps = ["GeometryBasics"]
git-tree-sha1 = "ec3edfe723df33528e085e632414499f26650501"
git-tree-sha1 = "bc5bf2ea3d5351edf285a06b0016788a121ce92c"
uuid = "19eb6ba3-879d-56ad-ad62-d5c202156566"
version = "0.5.0"
version = "0.5.1"
[[deps.PaddedViews]]
deps = ["OffsetArrays"]
......@@ -1389,6 +2225,12 @@ git-tree-sha1 = "0fac6313486baae819364c52b4f483450a9d793f"
uuid = "5432bcbf-9aad-5242-b902-cca2824c8663"
version = "0.5.12"
[[deps.Pango_jll]]
deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "FriBidi_jll", "Glib_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl"]
git-tree-sha1 = "e127b609fb9ecba6f201ba7ab753d5a605d53801"
uuid = "36c8627f-9965-5494-a995-c6b170f724f3"
version = "1.54.1+0"
[[deps.Parsers]]
deps = ["Dates", "PrecompileTools", "UUIDs"]
git-tree-sha1 = "8489905bcdbcfac64d1daa51ca07c0d8f0283821"
......@@ -1428,6 +2270,11 @@ git-tree-sha1 = "eba4810d5e6a01f612b948c9fa94f905b49087b0"
uuid = "7f904dfe-b85e-4ff6-b463-dae2292396a8"
version = "0.7.60"
[[deps.PolygonAlgorithms]]
git-tree-sha1 = "a5ded6396172cff3bacdd1354d190b93cb667c4b"
uuid = "32a0d02f-32d9-4438-b5ed-3a2932b48f96"
version = "0.2.0"
[[deps.PolygonOps]]
git-tree-sha1 = "77b3d3605fc1cd0b42d95eba87dfcd2bf67d5ff6"
uuid = "647866c9-e3ac-4575-94e7-e3d426903924"
......@@ -1473,9 +2320,9 @@ version = "1.2.1"
[[deps.QOI]]
deps = ["ColorTypes", "FileIO", "FixedPointNumbers"]
git-tree-sha1 = "18e8f4d1426e965c7b532ddd260599e1510d26ce"
git-tree-sha1 = "8b3fc30bc0390abdce15f8822c889f669baed73d"
uuid = "4b34888f-f399-49d4-9bb3-47ed5cae4e65"
version = "1.0.0"
version = "1.0.1"
[[deps.QuadGK]]
deps = ["DataStructures", "LinearAlgebra"]
......@@ -1560,15 +2407,21 @@ git-tree-sha1 = "40b9edad2e5287e05bd413a38f61a8ff55b9557b"
uuid = "5eaf0fd0-dfba-4ccb-bf02-d820a40db705"
version = "0.2.1"
[[deps.Rsvg]]
deps = ["Cairo", "Glib_jll", "Librsvg_jll"]
git-tree-sha1 = "3d3dc66eb46568fb3a5259034bfc752a0eb0c686"
uuid = "c4c386cf-5103-5370-be45-f3a111cca3b8"
version = "1.0.0"
[[deps.SHA]]
uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce"
version = "0.7.0"
[[deps.SIMD]]
deps = ["PrecompileTools"]
git-tree-sha1 = "98ca7c29edd6fc79cd74c61accb7010a4e7aee33"
git-tree-sha1 = "52af86e35dd1b177d051b12681e1c581f53c281b"
uuid = "fdea26ae-647d-5447-a871-4b548cad5224"
version = "3.6.0"
version = "3.7.0"
[[deps.Scratch]]
deps = ["Dates"]
......@@ -1614,6 +2467,12 @@ 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"
......@@ -1700,15 +2559,12 @@ deps = ["HypergeometricFunctions", "IrrationalConstants", "LogExpFunctions", "Re
git-tree-sha1 = "b423576adc27097764a90e163157bcfc9acf0f46"
uuid = "4c63d2b9-4356-54db-8cca-17b64c39e42c"
version = "1.3.2"
weakdeps = ["ChainRulesCore", "InverseFunctions"]
[deps.StatsFuns.extensions]
StatsFunsChainRulesCoreExt = "ChainRulesCore"
StatsFunsInverseFunctionsExt = "InverseFunctions"
[deps.StatsFuns.weakdeps]
ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4"
InverseFunctions = "3587e190-3f89-42d0-90ee-14403ec27112"
[[deps.StringEncodings]]
deps = ["Libiconv_jll"]
git-tree-sha1 = "b765e46ba27ecf6b44faf70df40c57aa3a547dcb"
......@@ -1717,19 +2573,22 @@ version = "0.3.7"
[[deps.StructArrays]]
deps = ["ConstructionBase", "DataAPI", "Tables"]
git-tree-sha1 = "f4dc295e983502292c4c3f951dbb4e985e35b3be"
git-tree-sha1 = "9537ef82c42cdd8c5d443cbc359110cbb36bae10"
uuid = "09ab397b-f2b6-538f-b94a-2f83cf4a842a"
version = "0.6.18"
version = "0.6.21"
[deps.StructArrays.extensions]
StructArraysAdaptExt = "Adapt"
StructArraysGPUArraysCoreExt = "GPUArraysCore"
StructArraysGPUArraysCoreExt = ["GPUArraysCore", "KernelAbstractions"]
StructArraysLinearAlgebraExt = "LinearAlgebra"
StructArraysSparseArraysExt = "SparseArrays"
StructArraysStaticArraysExt = "StaticArrays"
[deps.StructArrays.weakdeps]
Adapt = "79e6a3ab-5dfb-504d-930d-738a2a938a0e"
GPUArraysCore = "46192b85-c4d5-4398-a991-12ede77f4527"
KernelAbstractions = "63c18a36-062a-441e-b654-da1e3ab1ce7c"
LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf"
StaticArrays = "90137ffa-7385-5640-81b9-e52037218182"
......@@ -1798,9 +2657,9 @@ version = "2.1.1"
[[deps.TiffImages]]
deps = ["ColorTypes", "DataStructures", "DocStringExtensions", "FileIO", "FixedPointNumbers", "IndirectArrays", "Inflate", "Mmap", "OffsetArrays", "PkgVersion", "ProgressMeter", "SIMD", "UUIDs"]
git-tree-sha1 = "bc7fd5c91041f44636b2c134041f7e5263ce58ae"
git-tree-sha1 = "0248b1b2210285652fbc67fd6ced9bf0394bcfec"
uuid = "731e570b-9d59-4bfa-96dc-6df516fadf69"
version = "0.10.0"
version = "0.11.1"
[[deps.TranscodingStreams]]
git-tree-sha1 = "0c45878dcfdcfa8480052b6ab162cdd138781742"
......@@ -1839,23 +2698,26 @@ version = "0.4.1"
[[deps.Unitful]]
deps = ["Dates", "LinearAlgebra", "Random"]
git-tree-sha1 = "d95fe458f26209c66a187b1114df96fd70839efd"
git-tree-sha1 = "01915bfcd62be15329c9a07235447a89d588327c"
uuid = "1986cc42-f94f-5a68-af5c-568840ba703d"
version = "1.21.0"
version = "1.21.1"
weakdeps = ["ConstructionBase", "InverseFunctions"]
[deps.Unitful.extensions]
ConstructionBaseUnitfulExt = "ConstructionBase"
InverseFunctionsUnitfulExt = "InverseFunctions"
[deps.Unitful.weakdeps]
ConstructionBase = "187b0558-2788-49d3-abe0-74a17ed4e7c9"
InverseFunctions = "3587e190-3f89-42d0-90ee-14403ec27112"
[[deps.WGLMakie]]
deps = ["Bonito", "Colors", "FileIO", "FreeTypeAbstraction", "GeometryBasics", "Hyperscript", "LinearAlgebra", "Makie", "Observables", "PNGFiles", "PrecompileTools", "RelocatableFolders", "ShaderAbstractions", "StaticArrays"]
git-tree-sha1 = "bbd8bf625fc952bf4a85bf6d59e640990107253a"
git-tree-sha1 = "db71caa2e1ac6b3f806333c9de32393ed75d60e6"
uuid = "276b4fcb-3e11-5398-bf8b-a0c2d153d008"
version = "0.10.13"
version = "0.10.17"
[[deps.WebP]]
deps = ["CEnum", "ColorTypes", "FileIO", "FixedPointNumbers", "ImageCore", "libwebp_jll"]
git-tree-sha1 = "aa1ca3c47f119fbdae8770c29820e5e6119b83f2"
uuid = "e3aaa7dc-3e4b-44e0-be63-ffb868ccd7c1"
version = "0.1.3"
[[deps.WidgetsBase]]
deps = ["Observables"]
......@@ -1877,33 +2739,39 @@ version = "2.13.5+0"
[[deps.XSLT_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgcrypt_jll", "Libgpg_error_jll", "Libiconv_jll", "XML2_jll", "Zlib_jll"]
git-tree-sha1 = "a54ee957f4c86b526460a720dbc882fa5edcbefc"
git-tree-sha1 = "7d1671acbe47ac88e981868a078bd6b4e27c5191"
uuid = "aed1982a-8fda-507f-9586-7b0439959a61"
version = "1.1.41+0"
version = "1.1.42+0"
[[deps.XZ_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl"]
git-tree-sha1 = "15e637a697345f6743674f1322beefbc5dcd5cfc"
uuid = "ffd25f8a-64ca-5728-b0f7-c24cf3aae800"
version = "5.6.3+0"
[[deps.Xorg_libX11_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxcb_jll", "Xorg_xtrans_jll"]
git-tree-sha1 = "afead5aba5aa507ad5a3bf01f58f82c8d1403495"
git-tree-sha1 = "9dafcee1d24c4f024e7edc92603cedba72118283"
uuid = "4f6342f7-b3d2-589e-9d20-edeb45f2b2bc"
version = "1.8.6+0"
version = "1.8.6+1"
[[deps.Xorg_libXau_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl"]
git-tree-sha1 = "6035850dcc70518ca32f012e46015b9beeda49d8"
git-tree-sha1 = "2b0e27d52ec9d8d483e2ca0b72b3cb1a8df5c27a"
uuid = "0c0b7dd1-d40b-584c-a123-a41640f87eec"
version = "1.0.11+0"
version = "1.0.11+1"
[[deps.Xorg_libXdmcp_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl"]
git-tree-sha1 = "34d526d318358a859d7de23da945578e8e8727b7"
git-tree-sha1 = "02054ee01980c90297412e4c809c8694d7323af3"
uuid = "a3789734-cfe1-5b06-b2d0-1dd0d9d62d05"
version = "1.1.4+0"
version = "1.1.4+1"
[[deps.Xorg_libXext_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"]
git-tree-sha1 = "d2d1a5c49fae4ba39983f63de6afcbea47194e85"
git-tree-sha1 = "d7155fea91a4123ef59f42c4afb5ab3b4ca95058"
uuid = "1082639a-0dae-5f34-9b06-72781eeb8cb3"
version = "1.3.6+0"
version = "1.3.6+1"
[[deps.Xorg_libXrender_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"]
......@@ -1913,21 +2781,21 @@ version = "0.9.11+0"
[[deps.Xorg_libpthread_stubs_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl"]
git-tree-sha1 = "8fdda4c692503d44d04a0603d9ac0982054635f9"
git-tree-sha1 = "fee57a273563e273f0f53275101cd41a8153517a"
uuid = "14d82f49-176c-5ed1-bb49-ad3f5cbd8c74"
version = "0.1.1+0"
version = "0.1.1+1"
[[deps.Xorg_libxcb_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "XSLT_jll", "Xorg_libXau_jll", "Xorg_libXdmcp_jll", "Xorg_libpthread_stubs_jll"]
git-tree-sha1 = "bcd466676fef0878338c61e655629fa7bbc69d8e"
git-tree-sha1 = "1a74296303b6524a0472a8cb12d3d87a78eb3612"
uuid = "c7cfdc94-dc32-55de-ac96-5a1b8d977c5b"
version = "1.17.0+0"
version = "1.17.0+1"
[[deps.Xorg_xtrans_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl"]
git-tree-sha1 = "e92a1a012a10506618f10b7047e478403a046c77"
git-tree-sha1 = "b9ead2d2bdb27330545eb14234a2e300da61232e"
uuid = "c5fb5394-a638-5e4d-96e5-b29de1b5cf10"
version = "1.5.0+0"
version = "1.5.0+1"
[[deps.YAML]]
deps = ["Base64", "Dates", "Printf", "StringEncodings"]
......@@ -1940,6 +2808,18 @@ deps = ["Libdl"]
uuid = "83775a58-1f1d-513f-b197-d71354ab007a"
version = "1.2.13+1"
[[deps.Zstd_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl"]
git-tree-sha1 = "555d1076590a6cc2fdee2ef1469451f872d8b41b"
uuid = "3161d3a3-bdf6-5164-811a-617609db77b4"
version = "1.5.6+1"
[[deps.gdk_pixbuf_jll]]
deps = ["Artifacts", "Glib_jll", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Libtiff_jll", "Xorg_libX11_jll", "libpng_jll"]
git-tree-sha1 = "86e7731be08b12fa5e741f719603ae740e16b666"
uuid = "da03df04-f53b-5353-a52f-6a8b0620ced0"
version = "2.42.10+0"
[[deps.isoband_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "51b5eeb3f98367157a7a12a1fb0aa5328946c03c"
......@@ -1987,6 +2867,12 @@ git-tree-sha1 = "490376214c4721cdaca654041f635213c6165cb3"
uuid = "f27f6e37-5d2b-51aa-960f-b287f2bc3b7a"
version = "1.3.7+2"
[[deps.libwebp_jll]]
deps = ["Artifacts", "Giflib_jll", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Libglvnd_jll", "Libtiff_jll", "libpng_jll"]
git-tree-sha1 = "ccbb625a89ec6195856a50aa2b668a5c08712c94"
uuid = "c5f90fcd-3b7e-5836-afba-fc50a0988cb2"
version = "1.4.0+0"
[[deps.nghttp2_jll]]
deps = ["Artifacts", "Libdl"]
uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d"
......@@ -2004,16 +2890,16 @@ uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0"
version = "17.4.0+2"
[[deps.x264_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl"]
git-tree-sha1 = "35976a1216d6c066ea32cba2150c4fa682b276fc"
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "4fea590b89e6ec504593146bf8b988b2c00922b2"
uuid = "1270edf5-f2f9-52d2-97e9-ab00b5d0237a"
version = "10164.0.0+0"
version = "2021.5.5+0"
[[deps.x265_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl"]
git-tree-sha1 = "dcc541bb19ed5b0ede95581fb2e41ecf179527d2"
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "ee567a171cce03570d77ad3a43e90218e38937a9"
uuid = "dfaa095f-4041-5dcd-9319-2fabd8486b76"
version = "3.6.0+0"
version = "3.5.0+0"
"""
# ╔═╡ Cell order:
......@@ -2048,13 +2934,100 @@ version = "3.6.0+0"
# ╟─8e7b6a51-1f8e-43d7-846b-a9e7596052b9
# ╟─84926c9f-5ed7-4720-8153-01700575d3c5
# ╟─0d914458-7ab1-4d0e-afc6-1bd0db52076a
# ╠═75bb5e30-76b8-486b-b3fa-9979aaf830a5
# ╟─d884c51e-9ddd-4dc4-9f9c-e461f0455a17
# ╟─4253daed-b737-49bf-9927-6b9db39d43c1
# ╠═ceb5aea4-5a69-47cf-bedd-17d47a6e07a8
# ╟─b94745d7-ffda-4190-82af-8ee2fe9ea165
# ╟─60e42a23-9acc-4df0-8a9d-4c5f87a74a90
# ╠═944b6ad9-731b-4479-94bd-e61876987917
# ╠═d1329a48-5bed-428f-8554-854a5d51488e
# ╟─3c09769f-13b2-4713-8d2e-06abd7735c33
# ╠═3eb8d016-d1a1-4e4f-a307-e2c439c502e4
# ╟─ecf6a7d0-3279-4bff-b0f4-73327f60b702
# ╟─b5088341-c171-45bc-ab93-c49059da6c6a
# ╟─8c384e86-18d4-419b-977b-c5d5bfd1318f
# ╟─dc4766e9-e4a7-4b8b-a6db-360df927cc5d
# ╠═49092fe9-7c24-4564-9d2a-aa313d54ed8a
# ╟─264eb1b6-0e3f-4d67-b8b0-5f0831d18b95
# ╟─ea6fabad-d23a-46b7-ba8c-e4822216cd4e
# ╠═730e5e09-e818-49c5-8fa1-495b39b4267e
# ╟─66c7051b-c377-4376-a472-b2bd5c788267
# ╟─71566570-7d26-4fba-8f9a-8726fb97f2d8
# ╟─d4cb08b6-7829-45fe-ab61-b45b39b6c3ec
# ╠═2f905018-1d7b-43dc-b576-e4080dc946ee
# ╟─8eca3dcf-e69f-40b6-b1cd-65785af1d2c4
# ╠═b53e5719-cc0e-4169-9c8d-3eb5a50570b0
# ╟─0a2f66ad-bff3-42e5-9f91-2f8c46ab41a7
# ╟─a95116d6-614a-4a8a-b3a6-5a96e9b3c439
# ╠═d35df21e-2dd5-478f-b0c1-17cbd96a9cc6
# ╟─3c82aba6-0539-4578-ad04-648eb3bcf400
# ╟─ae970602-a2f0-472f-8e77-35b6bfd4cb39
# ╟─cf1fd0a7-0512-4b0f-800a-912be0c6138a
# ╠═46977b09-a43a-427c-8974-a1fd5f2d7da2
# ╟─6183e415-898a-4d1f-a5db-9c09503affff
# ╟─a9379cc3-6ca8-4aed-81f7-992f3664ceb3
# ╟─09192bc0-ac3e-47fe-8307-67f9c66d4f8e
# ╠═c395343c-3f7c-4dfe-bc0f-8950afc115bf
# ╠═73c0c135-f070-422e-ab1d-20c6faa160d8
# ╠═9eeaca05-9e6e-4881-85aa-d81ad5460e8c
# ╟─16c5f723-77d4-4bee-86c6-90a1b597e7d9
# ╟─28cfa917-cf00-4790-b71d-e629a18e4e10
# ╟─54d0cbaf-4bf7-4508-b706-b5042dda1644
# ╠═005b2830-0510-4ef2-bb06-5a63ea5c372d
# ╟─6c3b02ad-5048-427f-8433-f030c96d0036
# ╟─beb44e5f-2677-448e-8a23-6611ad0dd65d
# ╟─3f48d345-1535-4568-becd-d8d79b3fa95c
# ╟─df7c6179-7541-4b38-8317-1aeccbd04868
# ╟─73d104ac-7aff-46cc-95b5-a67b6811f64d
# ╟─9e9f07dd-edcb-471c-9fb4-613553e10353
# ╟─1308d56a-f91a-4fe2-8f5d-7d7a15b8f040
# ╟─877e5e67-b8a2-4d42-8043-47057a6df1ad
# ╟─a252ae16-783c-4e8f-a467-1bcbf1e12565
# ╠═17dc0577-35dd-4580-b2d1-958f2d3336e5
# ╟─9e114f3b-77f2-4b06-bff2-35e36c806b56
# ╟─797a4c59-6978-482e-b085-9924ea5f63bc
# ╟─3de604e8-20b6-4ef5-9952-b8f27c28fef1
# ╟─a7530e0a-a3b5-46c8-9666-fb0219d7ba04
# ╟─9e45076a-a26d-4964-a31f-da58f40f9d50
# ╟─103f4378-34f6-46ae-9ff0-1ffd1fe4d8dd
# ╟─9e3a4cb5-5ed9-42ac-b0d1-11aa5189089c
# ╟─0a7e65f5-da36-4331-8463-221051286728
# ╟─3f813480-726b-42e0-a648-e3ad76abcf9d
# ╟─7613cf26-b429-4483-bf55-bb110e49f45e
# ╠═a2596069-63c1-4950-b9be-bf10a402b5bb
# ╟─ff30250c-8844-45c5-b5fb-2f09bf05ac4e
# ╟─35cffe19-61e3-4eb1-9ec1-aeb36f91c93b
# ╟─3b82fa0a-65b1-46dd-b81a-d1fa117893d5
# ╟─f0f1539a-0a11-4c81-95d8-b6375fbc9160
# ╟─75bb5e30-76b8-486b-b3fa-9979aaf830a5
# ╠═b01e3f5a-ad9f-4557-ba62-30e9c57b8532
# ╠═fdd9318e-ee09-4eab-9322-ad97b03da002
# ╠═039d5065-4ab2-4787-86e2-5612cfcd01b4
# ╠═3c9dd530-8a25-4c1b-b1ff-3b5a3748b74a
# ╠═f83fdf0a-a2f5-4d72-9297-a409cf4e2bbb
# ╠═33ac9568-a83d-47b0-a17c-6e30df0dbaa4
# ╠═accdf77c-fc4b-4777-bebf-9d69ebb36526
# ╠═bd9ab2c4-b098-11ef-3c1e-7fe1458a8556
# ╠═1b748b69-5262-46c9-aeff-01696c585e6f
# ╠═d57a6a11-0387-4693-a50e-9eba62605a49
# ╠═2fedb811-6f34-424f-a46b-806bb0c6b9c0
# ╠═12fa3c11-c5d3-4c81-a92f-174f09ec10ff
# ╠═3ca057ef-1367-4fef-8e18-bdef855bc35e
# ╠═b107f529-f47f-4252-b06a-6e53302be860
# ╠═e2f5854a-c6ce-4600-8e96-62ac8ffc6b6e
# ╠═938e0359-0a86-4755-a92b-f1a7a892961d
# ╠═f0ba7d64-a360-450b-a9bb-ee6d5751e9ec
# ╠═1c762a4a-4ee1-46ee-93ee-7b566376d5a4
# ╠═92956d94-f128-46fd-9bc5-f96d6ad265fd
# ╠═8dea1779-e432-4fe3-baf0-5b0d8d3dd97b
# ╠═3b494bea-74b1-43c8-9ab8-6ad744294c2f
# ╠═2ef98325-0497-4a76-b2b4-161e663575c4
# ╠═efbdb43d-3c6b-48d6-be40-51369f3158de
# ╠═74e93e11-f07d-4f8d-a5aa-7b6e38825270
# ╠═fa7956f3-822a-4d34-bb64-f94104b3d03e
# ╠═2429f085-20f2-4941-820e-c49499331874
# ╠═2766c3d6-6a48-4b30-bf4e-56ac9a341145
# ╠═5b9132b5-6638-413f-83f3-2bf1f2f9e3e6
# ╠═f1af8644-4daf-464f-aba1-b306541508bc
# ╠═2d0c6a4f-f55d-41d2-89cf-501a97bcd89d
# ╠═37b6ef7f-2b07-4189-a3fe-ae3ab1661eb9
......