diff --git a/CHANGELOG.md b/CHANGELOG.md
index 10f0a7b74..7c59970c0 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,6 +6,35 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
*Note*: We try to adhere to these practices as of version [v1.1.1].
+## Version [1.4.6] - 2026-02-06
+
+### Removed
+
+- Temporarily removed tests for NeuroTreeModels.jl pending updates to compat.
+- Temporarily removed tests for benchmarking, which seems non-performant (will open a separate issue).
+
+### Added
+
+- Added a new evaluation measure `feature_sensitivity(ce::AbstractCounterfactualExplanation)` that can be used to compute the proposed absolute changes for features.
+- Added an optional `callback::Union{Nothing,Function}` argument to `generate_counterfactual` to allow users to either display or store anything relevant from the full `CounterfactualExplanation` object. This is useful if the user has specified `return_flattened=true` but still needs something specific from `CounterfactualExplanation` that is not returned with `FlattenedCE`.
+
+### Changed
+
+- Moved from Flux.jl for autodiff to DifferentiationInterface.jl. Not all backends working for basic examples, but considerable speedup for ForwardDiff compared to Zygote. The following backends work for generic generator:
+ - Zygote.jl
+ - ForwardDiff.jl
+ - PolyesterForwardDiff.jl
+ - GTPSA.jl
+ - FiniteDiff.jl
+ - Symbolics.jl
+- Avoid aggregating divergence metrics across runs.
+- Changed the way mutability constraints can be supplied: users can now supply a tuple of pairs of feature indices and there corresponding constraints.
+- Removed a bug in `reconstruct_cat_encoding` that turned the `counterfactual_state` object from a matrix into a vector.
+- Added option to provide additional keyword arguments to `validity_strict(ce::CounterfactualExplanation; kwrgs...)`.
+- Small bug fix for `validity` function.
+- Improved `find_potential_neighbours` method.
+- Added possibility to run `compute_divergence` for a fixed number of samples.
+
## Version [1.4.5] - 2025-01-13
### Changed
diff --git a/Project.toml b/Project.toml
index fcb7c1973..89c87aaec 100755
--- a/Project.toml
+++ b/Project.toml
@@ -1,16 +1,18 @@
name = "CounterfactualExplanations"
uuid = "2f13d31b-18db-44c1-bc43-ebaf2cff0be0"
+version = "1.5.0"
authors = ["Patrick Altmeyer
and contributors"]
-version = "1.4.5"
[deps]
CategoricalArrays = "324d7699-5711-5eae-9e2f-1d82baa6b597"
CausalInference = "8e462317-f959-576b-b3c1-403f26cec956"
ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4"
DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0"
+DifferentiationInterface = "a0c0ee7d-e4b9-4e03-894e-1c5f64a51d63"
Distributions = "31c24e10-a181-5473-b8eb-7969acd0382f"
EnergySamplers = "f446124b-5d5e-4171-a6dd-a1d99768d3ce"
Flux = "587475ba-b771-5e3f-ad9e-33799f191a9c"
+ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210"
Graphs = "86223c79-3864-5bf0-83f7-82e725a168b6"
KernelFunctions = "ec8451be-7e33-11e9-00cf-bbf324bd1392"
LazyArtifacts = "4af54fe1-eca0-43a8-85a7-787d91b784e3"
@@ -20,6 +22,7 @@ MLJBase = "a7f614a8-145f-11e9-1d2a-a57a1082229d"
MLJDecisionTreeInterface = "c6f25543-311c-4c74-83dc-3ea6d1015661"
MLUtils = "f1d291b0-491e-4a28-83b9-f70985020b54"
MultivariateStats = "6f286f6a-111f-5878-ab1e-185364afe411"
+Optimisers = "3bd65402-5787-11e9-1adc-39752487f4e2"
PackageExtensionCompat = "65ce6f38-6b18-4e1d-a461-8949797d7930"
ProgressMeter = "92933f4c-e287-5a05-a399-4b506db050ca"
Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"
@@ -29,33 +32,34 @@ StatsBase = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91"
Tables = "bd369af6-aec1-5ad0-b16a-f7cc5008161c"
TaijaBase = "10284c91-9f28-4c9a-abbf-ee43576dfff6"
UUIDs = "cf7118a7-6976-5b1a-9a39-7adc72f591a4"
+Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f"
[weakdeps]
DecisionTree = "7806a523-6efd-50cb-b5f6-3fa6f1930dbb"
JointEnergyModels = "48c56d24-211d-4463-bbc0-7a701b291131"
LaplaceRedux = "c52c1a26-f7c5-402b-80be-ba1e638ad478"
-NeuroTreeModels = "1db4e0a5-a364-4b0c-897c-2bd5a4a3a1f2"
[extensions]
DecisionTreeExt = "DecisionTree"
JEMExt = "JointEnergyModels"
LaplaceReduxExt = "LaplaceRedux"
-NeuroTreeExt = "NeuroTreeModels"
[compat]
Aqua = "0.8"
-CategoricalArrays = "0.10"
-CausalInference = "0.17, 0.18"
+CategoricalArrays = "0.10, 1"
+CausalInference = "0.19.2"
ChainRulesCore = "1.15"
DataFrames = "1"
DecisionTree = "0.12.3, 0.12.4"
+DifferentiationInterface = "0.7.16"
Distributions = "0.25.97"
-EnergySamplers = "1.0"
+EnergySamplers = "1"
Flux = "0.12, 0.13, 0.14, 0.15, 0.16"
+ForwardDiff = "1.3"
Graphs = "1.11.1"
-JointEnergyModels = "0.1.7"
-KernelFunctions = "0.10.64"
-LaplaceRedux = "0.1.4, 0.2, 1.0"
+JointEnergyModels = "0.1, 0.2"
+KernelFunctions = "0.10"
+LaplaceRedux = "1"
LazyArtifacts = "1"
LinearAlgebra = "1"
Logging = "1"
@@ -63,7 +67,7 @@ MLJBase = "0.21, 1"
MLJDecisionTreeInterface = "0.4.0"
MLUtils = "0.2, 0.3, 0.4"
MultivariateStats = "0.9, 0.10"
-NeuroTreeModels = "1.1.3"
+Optimisers = "0.3, 0.4"
PackageExtensionCompat = "1"
ProgressMeter = "1"
Random = "1"
@@ -74,15 +78,14 @@ Tables = "1"
TaijaBase = "1"
Test = "1"
UUIDs = "1"
+Zygote = "0.6, 0.7"
julia = "1.10"
[extras]
Aqua = "4c88cf16-eb10-579e-8560-4a9242c79595"
DecisionTree = "7806a523-6efd-50cb-b5f6-3fa6f1930dbb"
JointEnergyModels = "48c56d24-211d-4463-bbc0-7a701b291131"
-LaplaceRedux = "c52c1a26-f7c5-402b-80be-ba1e638ad478"
-NeuroTreeModels = "1db4e0a5-a364-4b0c-897c-2bd5a4a3a1f2"
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
[targets]
-test = ["Aqua", "DecisionTree", "JointEnergyModels", "LaplaceRedux", "NeuroTreeModels", "Test"]
+test = ["Aqua", "DecisionTree", "JointEnergyModels", "Test"]
diff --git a/README_files/figure-commonmark/cell-11-output-1.svg b/README_files/figure-commonmark/cell-11-output-1.svg
index 86855e8b1..13232e4fd 100644
--- a/README_files/figure-commonmark/cell-11-output-1.svg
+++ b/README_files/figure-commonmark/cell-11-output-1.svg
@@ -1,25 +1,25 @@
-
+
-
+
-
+
-
+
-
+
-
-
-
+
+
+
-
+
-
+
-
-
-
+
+
+
-
+
-
+
-
+
-
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/README_files/figure-commonmark/cell-3-output-2.svg b/README_files/figure-commonmark/cell-3-output-2.svg
index 9b6c8c79b..b2d5d4067 100644
--- a/README_files/figure-commonmark/cell-3-output-2.svg
+++ b/README_files/figure-commonmark/cell-3-output-2.svg
@@ -1,361 +1,362 @@
-
+
-
+
-
+
-
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/README_files/figure-commonmark/cell-6-output-1.svg b/README_files/figure-commonmark/cell-6-output-1.svg
index 593154bf3..0ff137782 100644
--- a/README_files/figure-commonmark/cell-6-output-1.svg
+++ b/README_files/figure-commonmark/cell-6-output-1.svg
@@ -1,96 +1,98 @@
-
+
-
+
-
+
-
+
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dev/Manifest.toml b/dev/Manifest.toml
index 3eac0b710..22b4604bc 100644
--- a/dev/Manifest.toml
+++ b/dev/Manifest.toml
@@ -1,9 +1,24 @@
# This file is machine-generated - editing it directly is not advised
-julia_version = "1.10.5"
+julia_version = "1.11.5"
manifest_format = "2.0"
project_hash = "025352022d4c7d3367ba51b3bbb7c2d4652aee1b"
+[[deps.ADTypes]]
+git-tree-sha1 = "f7304359109c768cf32dc5fa2d371565bb63b68a"
+uuid = "47edcb42-4c32-4615-8424-f2b9edc5f35b"
+version = "1.21.0"
+
+ [deps.ADTypes.extensions]
+ ADTypesChainRulesCoreExt = "ChainRulesCore"
+ ADTypesConstructionBaseExt = "ConstructionBase"
+ ADTypesEnzymeCoreExt = "EnzymeCore"
+
+ [deps.ADTypes.weakdeps]
+ ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4"
+ ConstructionBase = "187b0558-2788-49d3-abe0-74a17ed4e7c9"
+ EnzymeCore = "f151be2c-9106-41f4-ab19-57ee4f262869"
+
[[deps.AbstractFFTs]]
deps = ["LinearAlgebra"]
git-tree-sha1 = "d92ad398961a3ed262d8bf04a1a2b8340f915fef"
@@ -21,25 +36,24 @@ uuid = "1520ce14-60c1-5f80-bbc7-55ef81b5835c"
version = "0.4.5"
[[deps.Accessors]]
-deps = ["CompositionsBase", "ConstructionBase", "InverseFunctions", "LinearAlgebra", "MacroTools", "Markdown"]
-git-tree-sha1 = "b392ede862e506d451fc1616e79aa6f4c673dab8"
+deps = ["CompositionsBase", "ConstructionBase", "Dates", "InverseFunctions", "MacroTools"]
+git-tree-sha1 = "856ecd7cebb68e5fc87abecd2326ad59f0f911f3"
uuid = "7d9f7c33-5ae7-4f3b-8dc6-eff91059b697"
-version = "0.1.38"
+version = "0.1.43"
[deps.Accessors.extensions]
- AccessorsAxisKeysExt = "AxisKeys"
- AccessorsDatesExt = "Dates"
- AccessorsIntervalSetsExt = "IntervalSets"
- AccessorsStaticArraysExt = "StaticArrays"
- AccessorsStructArraysExt = "StructArrays"
- AccessorsTestExt = "Test"
- AccessorsUnitfulExt = "Unitful"
+ AxisKeysExt = "AxisKeys"
+ IntervalSetsExt = "IntervalSets"
+ LinearAlgebraExt = "LinearAlgebra"
+ StaticArraysExt = "StaticArrays"
+ StructArraysExt = "StructArrays"
+ TestExt = "Test"
+ UnitfulExt = "Unitful"
[deps.Accessors.weakdeps]
AxisKeys = "94b1ba4f-4ee9-5380-92f1-94cde586c3c5"
- Dates = "ade2ca70-3891-5945-98fb-dc099432e06a"
IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953"
- Requires = "ae029012-a4dd-5104-9daa-d747884805df"
+ LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
StaticArrays = "90137ffa-7385-5640-81b9-e52037218182"
StructArrays = "09ab397b-f2b6-538f-b94a-2f83cf4a842a"
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
@@ -47,12 +61,13 @@ version = "0.1.38"
[[deps.Adapt]]
deps = ["LinearAlgebra", "Requires"]
-git-tree-sha1 = "6a55b747d1812e699320963ffde36f1ebdda4099"
+git-tree-sha1 = "7e35fca2bdfba44d797c53dfe63a51fabf39bfc0"
uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e"
-version = "4.0.4"
-weakdeps = ["StaticArrays"]
+version = "4.4.0"
+weakdeps = ["SparseArrays", "StaticArrays"]
[deps.Adapt.extensions]
+ AdaptSparseArraysExt = "SparseArrays"
AdaptStaticArraysExt = "StaticArrays"
[[deps.AdaptivePredicates]]
@@ -68,18 +83,18 @@ 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.ArgCheck]]
-git-tree-sha1 = "a3a402a35a2f7e0b87828ccabbd5ebfbebe356b4"
+git-tree-sha1 = "f9e9a66c9b7be1ad7372bbd9b062d9230c30c5ce"
uuid = "dce04be8-c92d-5529-be00-80e4d2c0e197"
-version = "2.3.0"
+version = "2.5.0"
[[deps.ArgTools]]
uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f"
-version = "1.1.1"
+version = "1.1.2"
[[deps.ArnoldiMethod]]
deps = ["LinearAlgebra", "Random", "StaticArrays"]
@@ -94,24 +109,26 @@ uuid = "7d9fca2a-8960-54d3-9f78-7d1dccf2cb97"
version = "0.5.4"
[[deps.Arpack_jll]]
-deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "OpenBLAS_jll", "Pkg"]
-git-tree-sha1 = "5ba6c757e8feccf03a1554dfaf3e26b3cfc7fd5e"
+deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "libblastrampoline_jll"]
+git-tree-sha1 = "7f54761502ff149a9d492e4acefe9805898e29b3"
uuid = "68821587-b530-5797-8361-c406ea357684"
-version = "3.5.1+1"
+version = "3.5.2+0"
[[deps.ArrayInterface]]
deps = ["Adapt", "LinearAlgebra"]
-git-tree-sha1 = "3640d077b6dafd64ceb8fd5c1ec76f7ca53bcf76"
+git-tree-sha1 = "d81ae5489e13bc03567d4fbbb06c546a5e53c857"
uuid = "4fba245c-0d91-5ea0-9b3e-6abc04ee57a9"
-version = "7.16.0"
+version = "7.22.0"
[deps.ArrayInterface.extensions]
ArrayInterfaceBandedMatricesExt = "BandedMatrices"
ArrayInterfaceBlockBandedMatricesExt = "BlockBandedMatrices"
ArrayInterfaceCUDAExt = "CUDA"
- ArrayInterfaceCUDSSExt = "CUDSS"
+ ArrayInterfaceCUDSSExt = ["CUDSS", "CUDA"]
+ ArrayInterfaceChainRulesCoreExt = "ChainRulesCore"
ArrayInterfaceChainRulesExt = "ChainRules"
ArrayInterfaceGPUArraysCoreExt = "GPUArraysCore"
+ ArrayInterfaceMetalExt = "Metal"
ArrayInterfaceReverseDiffExt = "ReverseDiff"
ArrayInterfaceSparseArraysExt = "SparseArrays"
ArrayInterfaceStaticArraysCoreExt = "StaticArraysCore"
@@ -123,7 +140,9 @@ version = "7.16.0"
CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba"
CUDSS = "45b445bb-4962-46a0-9369-b4df9d0f772e"
ChainRules = "082447d4-558c-5d27-93f4-14fc19e9eca2"
+ ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4"
GPUArraysCore = "46192b85-c4d5-4398-a991-12ede77f4527"
+ Metal = "dde4c033-4e86-420c-a63e-0dd931031962"
ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267"
SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf"
StaticArraysCore = "1e83bf80-4336-4d27-bf5d-d5a4f845583c"
@@ -131,24 +150,43 @@ version = "7.16.0"
[[deps.Artifacts]]
uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33"
+version = "1.11.0"
[[deps.Atomix]]
deps = ["UnsafeAtomics"]
-git-tree-sha1 = "c06a868224ecba914baa6942988e2f2aade419be"
+git-tree-sha1 = "29bb0eb6f578a587a49da16564705968667f5fa8"
uuid = "a9b6321e-bd34-4604-b9c9-b65b8de01458"
-version = "0.1.0"
+version = "1.1.2"
+
+ [deps.Atomix.extensions]
+ AtomixCUDAExt = "CUDA"
+ AtomixMetalExt = "Metal"
+ AtomixOpenCLExt = "OpenCL"
+ AtomixoneAPIExt = "oneAPI"
+
+ [deps.Atomix.weakdeps]
+ CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba"
+ Metal = "dde4c033-4e86-420c-a63e-0dd931031962"
+ OpenCL = "08131aa3-fb12-5dee-8b74-c09406e224a2"
+ oneAPI = "8f75cd03-7ff8-4ecb-9b8f-daf728133b1b"
[[deps.AtomsBase]]
-deps = ["LinearAlgebra", "PeriodicTable", "Printf", "Requires", "StaticArrays", "Unitful", "UnitfulAtomic"]
-git-tree-sha1 = "995c2b6b17840cd87b722ce9c6cdd72f47bab545"
+deps = ["LinearAlgebra", "PeriodicTable", "Preferences", "Printf", "Requires", "StaticArrays", "Unitful", "UnitfulAtomic"]
+git-tree-sha1 = "922c2469c526996566dbabd273d15701ed2aacfe"
uuid = "a963bdd2-2df7-4f54-a1ee-49d51e6be12a"
-version = "0.3.5"
+version = "0.5.2"
+
+ [deps.AtomsBase.extensions]
+ AtomsBaseAtomsViewExt = "AtomsView"
+
+ [deps.AtomsBase.weakdeps]
+ AtomsView = "ee286e10-dd2d-4ff2-afcb-0a3cd50c8041"
[[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"]
@@ -158,15 +196,15 @@ version = "1.1.0"
[[deps.AxisArrays]]
deps = ["Dates", "IntervalSets", "IterTools", "RangeArrays"]
-git-tree-sha1 = "16351be62963a67ac4083f748fdb3cca58bfd52f"
+git-tree-sha1 = "4126b08903b777c88edf1754288144a0492c05ad"
uuid = "39de3d68-74b9-583c-8d2d-e117c070f3a9"
-version = "0.4.7"
+version = "0.4.8"
[[deps.BFloat16s]]
-deps = ["LinearAlgebra", "Printf", "Random", "Test"]
-git-tree-sha1 = "2c7cc21e8678eff479978a0a2ef5ce2f51b63dff"
+deps = ["LinearAlgebra", "Printf", "Random"]
+git-tree-sha1 = "3b642331600250f592719140c60cf12372b82d66"
uuid = "ab4f0b2a-ad5b-11e8-123f-65d77653426b"
-version = "0.5.0"
+version = "0.5.1"
[[deps.BSON]]
git-tree-sha1 = "4c3e506685c527ac6a54ccc0c8c76fd6f91b42fb"
@@ -174,10 +212,10 @@ uuid = "fbb218c0-5317-5bc6-957e-2ee96dd4b1f0"
version = "0.3.9"
[[deps.BangBang]]
-deps = ["Accessors", "ConstructionBase", "InitialValues", "LinearAlgebra", "Requires"]
-git-tree-sha1 = "e2144b631226d9eeab2d746ca8880b7ccff504ae"
+deps = ["Accessors", "ConstructionBase", "InitialValues", "LinearAlgebra"]
+git-tree-sha1 = "a49f9342fc60c2a2aaa4e0934f06755464fcf438"
uuid = "198e06fe-97b7-11e9-32a5-e1d131e6ad66"
-version = "0.4.3"
+version = "0.4.6"
[deps.BangBang.extensions]
BangBangChainRulesCoreExt = "ChainRulesCore"
@@ -197,6 +235,12 @@ version = "0.4.3"
[[deps.Base64]]
uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f"
+version = "1.11.0"
+
+[[deps.BaseDirs]]
+git-tree-sha1 = "bca794632b8a9bbe159d56bf9e31c422671b35e0"
+uuid = "18cc8868-cbac-4acf-b575-c8ff214dc66f"
+version = "1.3.2"
[[deps.Baselet]]
git-tree-sha1 = "aebf55e6d7795e02ca500a689d326ac979aaf89e"
@@ -214,16 +258,11 @@ git-tree-sha1 = "f21cfd4950cb9f0587d5067e69405ad2acd27b87"
uuid = "62783981-4cbd-42fc-bca8-16325de8dc4b"
version = "0.1.6"
-[[deps.BufferedStreams]]
-git-tree-sha1 = "6863c5b7fc997eadcabdbaf6c5f201dc30032643"
-uuid = "e1450e63-4bb3-523b-b2a4-4ffa8c0fd77d"
-version = "1.2.2"
-
[[deps.Bzip2_jll]]
-deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
-git-tree-sha1 = "9e2a6b69137e6969bab0152632dcb3bc108c8bdd"
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "1b96ea4a01afe0ea4090c5c8039690672dd13f2e"
uuid = "6e34b625-4abd-537c-b88f-471c36dfa7a0"
-version = "1.0.8+1"
+version = "1.0.9+0"
[[deps.CEnum]]
git-tree-sha1 = "389ad5c84de1ae7cf0e28e381131c98ea87d54fc"
@@ -231,13 +270,20 @@ uuid = "fa961155-64e5-5f13-b03f-caf6b980ea82"
version = "0.5.0"
[[deps.CPUSummary]]
-deps = ["CpuId", "IfElse", "PrecompileTools", "Static"]
-git-tree-sha1 = "5a97e67919535d6841172016c9530fd69494e5ec"
+deps = ["CpuId", "IfElse", "PrecompileTools", "Preferences", "Static"]
+git-tree-sha1 = "f3a21d7fc84ba618a779d1ed2fcca2e682865bab"
uuid = "2a0fbf3d-bb9c-48f3-b0a9-814d99fd7ab9"
-version = "0.2.6"
+version = "0.2.7"
[[deps.CRC32c]]
uuid = "8bf52ea8-c179-5cab-976a-9e18b702a9bc"
+version = "1.11.0"
+
+[[deps.CRlibm]]
+deps = ["CRlibm_jll"]
+git-tree-sha1 = "66188d9d103b92b6cd705214242e27f5737a1e5e"
+uuid = "96374032-68de-5a5b-8d9e-752f78720389"
+version = "1.0.2"
[[deps.CRlibm_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
@@ -247,21 +293,21 @@ version = "1.0.1+0"
[[deps.CSV]]
deps = ["CodecZlib", "Dates", "FilePathsBase", "InlineStrings", "Mmap", "Parsers", "PooledArrays", "PrecompileTools", "SentinelArrays", "Tables", "Unicode", "WeakRefStrings", "WorkerUtilities"]
-git-tree-sha1 = "6c834533dc1fabd820c1db03c839bf97e45a3fab"
+git-tree-sha1 = "deddd8725e5e1cc49ee205a1964256043720a6c3"
uuid = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b"
-version = "0.10.14"
+version = "0.10.15"
[[deps.Cairo]]
deps = ["Cairo_jll", "Colors", "Glib_jll", "Graphics", "Libdl", "Pango_jll"]
-git-tree-sha1 = "7b6ad8c35f4bc3bca8eb78127c8b99719506a5fb"
+git-tree-sha1 = "71aa551c5c33f1a4415867fe06b7844faadb0ae9"
uuid = "159f3aea-2a34-519c-b102-8c37f9878175"
-version = "1.1.0"
+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 = "a2f1c8c668c8e3cb4cca4e57a8efdb09067bb3fd"
+git-tree-sha1 = "fde3bf89aead2e723284a8ff9cdf5b551ed700e8"
uuid = "83423d85-b0ee-5818-9007-b63ccbeb887a"
-version = "1.18.0+2"
+version = "1.18.5+0"
[[deps.CatIndices]]
deps = ["CustomUnitRanges", "OffsetArrays"]
@@ -271,16 +317,9 @@ version = "0.2.2"
[[deps.CategoricalArrays]]
deps = ["DataAPI", "Future", "Missings", "Printf", "Requires", "Statistics", "Unicode"]
-git-tree-sha1 = "1568b28f91293458345dabba6a5ea3f183250a61"
+git-tree-sha1 = "5084cc1a28976dd1642c9f337b28a3cb03e0f7d2"
uuid = "324d7699-5711-5eae-9e2f-1d82baa6b597"
-version = "0.10.8"
-weakdeps = ["JSON", "RecipesBase", "SentinelArrays", "StructTypes"]
-
- [deps.CategoricalArrays.extensions]
- CategoricalArraysJSONExt = "JSON"
- CategoricalArraysRecipesBaseExt = "RecipesBase"
- CategoricalArraysSentinelArraysExt = "SentinelArrays"
- CategoricalArraysStructTypesExt = "StructTypes"
+version = "0.10.7"
[[deps.CategoricalDistributions]]
deps = ["CategoricalArrays", "Distributions", "Missings", "OrderedCollections", "Random", "ScientificTypes"]
@@ -296,9 +335,9 @@ version = "0.1.15"
[[deps.CausalInference]]
deps = ["Combinatorics", "Distances", "Distributions", "Graphs", "LRUCache", "LinearAlgebra", "LinkedLists", "LogarithmicNumbers", "Memoization", "MetaGraphs", "NearestNeighbors", "OffsetArrays", "PrecompileTools", "ProgressMeter", "Random", "Requires", "SpecialFunctions", "Statistics", "Tables", "TabularDisplay", "ThreadsX"]
-git-tree-sha1 = "8e5ff009a8eedb719bb0d450c9f65ef1e110c693"
+git-tree-sha1 = "12dc39598961e6a4054e7bfea9042af45b025845"
uuid = "8e462317-f959-576b-b3c1-403f26cec956"
-version = "0.17.0"
+version = "0.18.0"
[deps.CausalInference.extensions]
GraphMakieExt = "GraphMakie"
@@ -313,25 +352,25 @@ version = "0.17.0"
[[deps.ChainRules]]
deps = ["Adapt", "ChainRulesCore", "Compat", "Distributed", "GPUArraysCore", "IrrationalConstants", "LinearAlgebra", "Random", "RealDot", "SparseArrays", "SparseInverseSubset", "Statistics", "StructArrays", "SuiteSparse"]
-git-tree-sha1 = "be227d253d132a6d57f9ccf5f67c0fb6488afd87"
+git-tree-sha1 = "3b704353e517a957323bd3ac70fa7b669b5f48d4"
uuid = "082447d4-558c-5d27-93f4-14fc19e9eca2"
-version = "1.71.0"
+version = "1.72.6"
[[deps.ChainRulesCore]]
deps = ["Compat", "LinearAlgebra"]
-git-tree-sha1 = "3e4b134270b372f2ed4d4d0e936aabaefc1802bc"
+git-tree-sha1 = "e4c6a16e77171a5f5e25e9646617ab1c276c5607"
uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4"
-version = "1.25.0"
+version = "1.26.0"
weakdeps = ["SparseArrays"]
[deps.ChainRulesCore.extensions]
ChainRulesCoreSparseArraysExt = "SparseArrays"
[[deps.Chemfiles]]
-deps = ["AtomsBase", "Chemfiles_jll", "DocStringExtensions", "PeriodicTable", "Unitful", "UnitfulAtomic"]
-git-tree-sha1 = "82fe5e341c793cb51149d993307da9543824b206"
+deps = ["AtomsBase", "Chemfiles_jll", "DocStringExtensions", "Unitful", "UnitfulAtomic"]
+git-tree-sha1 = "8d4217428ee7c64605d1217a8ea810436fd03742"
uuid = "46823bd8-5fb3-5f92-9aa0-96921f3dd015"
-version = "0.10.41"
+version = "0.10.43"
[[deps.Chemfiles_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl"]
@@ -339,6 +378,23 @@ git-tree-sha1 = "f3743181e30d87c23d9c8ebd493b77f43d8f1890"
uuid = "78a364fa-1a3c-552a-b4bb-8fa0f9c1fcca"
version = "0.10.4+0"
+[[deps.ChunkCodecCore]]
+git-tree-sha1 = "1a3ad7e16a321667698a19e77362b35a1e94c544"
+uuid = "0b6fb165-00bc-4d37-ab8b-79f91016dbe1"
+version = "1.0.1"
+
+[[deps.ChunkCodecLibZlib]]
+deps = ["ChunkCodecCore", "Zlib_jll"]
+git-tree-sha1 = "cee8104904c53d39eb94fd06cbe60cb5acde7177"
+uuid = "4c0bbee4-addc-4d73-81a0-b6caacae83c8"
+version = "1.0.0"
+
+[[deps.ChunkCodecLibZstd]]
+deps = ["ChunkCodecCore", "Zstd_jll"]
+git-tree-sha1 = "34d9873079e4cb3d0c62926a225136824677073f"
+uuid = "55437552-ac27-4d47-9aa3-63184e8fd398"
+version = "1.0.0"
+
[[deps.CloseOpenIntervals]]
deps = ["Static", "StaticArrayInterface"]
git-tree-sha1 = "05ba0d07cd4fd8b7a39541e31a7b0254704ea581"
@@ -347,27 +403,27 @@ version = "0.1.13"
[[deps.Clustering]]
deps = ["Distances", "LinearAlgebra", "NearestNeighbors", "Printf", "Random", "SparseArrays", "Statistics", "StatsBase"]
-git-tree-sha1 = "9ebb045901e9bbf58767a9f34ff89831ed711aae"
+git-tree-sha1 = "3e22db924e2945282e70c33b75d4dde8bfa44c94"
uuid = "aaaa29a8-35af-508c-8bc3-b662a17a0fe5"
-version = "0.15.7"
+version = "0.15.8"
[[deps.CodecZlib]]
deps = ["TranscodingStreams", "Zlib_jll"]
-git-tree-sha1 = "bce6804e5e6044c6daab27bb533d1295e4a2e759"
+git-tree-sha1 = "962834c22b66e32aa10f7611c08c8ca4e20749a9"
uuid = "944b1d66-785c-5afd-91f1-9de20f533193"
-version = "0.7.6"
+version = "0.7.8"
[[deps.ColorBrewer]]
-deps = ["Colors", "JSON", "Test"]
-git-tree-sha1 = "61c5334f33d91e570e1d0c3eb5465835242582c4"
+deps = ["Colors", "JSON"]
+git-tree-sha1 = "07da79661b919001e6863b81fc572497daa58349"
uuid = "a2cac450-b92f-5266-8821-25eda20663c8"
-version = "0.4.0"
+version = "0.4.2"
[[deps.ColorSchemes]]
deps = ["ColorTypes", "ColorVectorSpace", "Colors", "FixedPointNumbers", "PrecompileTools", "Random"]
-git-tree-sha1 = "b5278586822443594ff615963b0c09755771b3e0"
+git-tree-sha1 = "b0fd3f56fa442f81e0a47815c92245acfaaa4e34"
uuid = "35d6a980-a343-548e-a6ea-1d62b119f2f4"
-version = "3.26.0"
+version = "3.31.0"
[[deps.ColorTypes]]
deps = ["FixedPointNumbers", "Random"]
@@ -387,14 +443,14 @@ weakdeps = ["SpecialFunctions"]
[[deps.Colors]]
deps = ["ColorTypes", "FixedPointNumbers", "Reexport"]
-git-tree-sha1 = "362a287c3aa50601b0bc359053d5c2468f0e7ce0"
+git-tree-sha1 = "37ea44092930b1811e666c3bc38065d7d87fcc74"
uuid = "5ae59095-9a9b-59fe-a467-6f913c188581"
-version = "0.12.11"
+version = "0.13.1"
[[deps.Combinatorics]]
-git-tree-sha1 = "08c8b6831dc00bfea825826be0bc8336fc369860"
+git-tree-sha1 = "c761b00e7755700f9cdf5b02039939d1359330e1"
uuid = "861a8166-3701-5b0c-9a16-15d98fcdc6aa"
-version = "1.0.2"
+version = "1.1.0"
[[deps.CommonSubexpressions]]
deps = ["MacroTools"]
@@ -409,9 +465,9 @@ version = "1.0.0"
[[deps.Compat]]
deps = ["TOML", "UUIDs"]
-git-tree-sha1 = "8ae8d32e09f0dcf42a36b90d4e17f5dd2e4c4215"
+git-tree-sha1 = "9d8a54ce4b17aa5bdce0ea5c34bc5e7c340d16ad"
uuid = "34da2185-b29b-5c13-b0c7-acf172513d20"
-version = "4.16.0"
+version = "4.18.1"
weakdeps = ["Dates", "LinearAlgebra"]
[deps.Compat.extensions]
@@ -436,11 +492,17 @@ git-tree-sha1 = "52cb3ec90e8a8bea0e62e275ba577ad0f74821f7"
uuid = "ed09eef8-17a6-5b46-8889-db040fac31e3"
version = "0.3.2"
+[[deps.ComputePipeline]]
+deps = ["Observables", "Preferences"]
+git-tree-sha1 = "76dab592fa553e378f9dd8adea16fe2591aa3daa"
+uuid = "95dc2771-c249-4cd0-9c9f-1f3b4330693c"
+version = "0.1.6"
+
[[deps.ConcurrentUtilities]]
deps = ["Serialization", "Sockets"]
-git-tree-sha1 = "ea32b83ca4fefa1768dc84e504cc0a94fb1ab8d1"
+git-tree-sha1 = "d9d26935a0bcffc87d2613ce14c527c99fc543fd"
uuid = "f0e56b4a-5159-44fe-b623-3e5288b988bb"
-version = "2.4.2"
+version = "2.5.0"
[[deps.ConformalPrediction]]
deps = ["CategoricalArrays", "ChainRules", "ComputationalResources", "Flux", "InferOpt", "LinearAlgebra", "MLJBase", "MLJEnsembles", "MLJFlux", "MLJLinearModels", "MLJModelInterface", "MLUtils", "ProgressMeter", "Random", "StatsBase", "Tables"]
@@ -449,9 +511,9 @@ uuid = "98bfc277-1877-43dc-819b-a3e38c30242f"
version = "0.1.13"
[[deps.ConstructionBase]]
-git-tree-sha1 = "76219f1ed5771adbb096743bff43fb5fdd4c1157"
+git-tree-sha1 = "b4b092499347b18a015186eae3042f72267106cb"
uuid = "187b0558-2788-49d3-abe0-74a17ed4e7c9"
-version = "1.5.8"
+version = "1.6.0"
weakdeps = ["IntervalSets", "LinearAlgebra", "StaticArrays"]
[deps.ConstructionBase.extensions]
@@ -472,15 +534,15 @@ version = "0.6.3"
[[deps.CoordinateTransformations]]
deps = ["LinearAlgebra", "StaticArrays"]
-git-tree-sha1 = "f9d7112bfff8a19a3a4ea4e03a8e6a91fe8456bf"
+git-tree-sha1 = "a692f5e257d332de1e554e4566a4e5a8a72de2b2"
uuid = "150eb455-5306-5404-9cee-2592286d6298"
-version = "0.6.3"
+version = "0.6.4"
[[deps.CounterfactualExplanations]]
-deps = ["CategoricalArrays", "CausalInference", "ChainRulesCore", "DataFrames", "Distributions", "EnergySamplers", "Flux", "Graphs", "LazyArtifacts", "LinearAlgebra", "Logging", "MLJBase", "MLJDecisionTreeInterface", "MLUtils", "MultivariateStats", "PackageExtensionCompat", "ProgressMeter", "Random", "Serialization", "Statistics", "StatsBase", "Tables", "TaijaBase", "UUIDs"]
+deps = ["CategoricalArrays", "CausalInference", "ChainRulesCore", "DataFrames", "Distributions", "EnergySamplers", "Flux", "Graphs", "KernelFunctions", "LazyArtifacts", "LinearAlgebra", "Logging", "MLJBase", "MLJDecisionTreeInterface", "MLUtils", "MultivariateStats", "PackageExtensionCompat", "ProgressMeter", "Random", "Serialization", "Statistics", "StatsBase", "Tables", "TaijaBase", "UUIDs"]
path = ".."
uuid = "2f13d31b-18db-44c1-bc43-ebaf2cff0be0"
-version = "1.3.0"
+version = "1.4.6"
[deps.CounterfactualExplanations.extensions]
DecisionTreeExt = "DecisionTree"
@@ -522,16 +584,16 @@ uuid = "124859b0-ceae-595e-8997-d05f6a7a8dfe"
version = "0.7.13"
[[deps.DataFrames]]
-deps = ["Compat", "DataAPI", "DataStructures", "Future", "InlineStrings", "InvertedIndices", "IteratorInterfaceExtensions", "LinearAlgebra", "Markdown", "Missings", "PooledArrays", "PrecompileTools", "PrettyTables", "Printf", "REPL", "Random", "Reexport", "SentinelArrays", "SortingAlgorithms", "Statistics", "TableTraits", "Tables", "Unicode"]
-git-tree-sha1 = "04c738083f29f86e62c8afc341f0967d8717bdb8"
+deps = ["Compat", "DataAPI", "DataStructures", "Future", "InlineStrings", "InvertedIndices", "IteratorInterfaceExtensions", "LinearAlgebra", "Markdown", "Missings", "PooledArrays", "PrecompileTools", "PrettyTables", "Printf", "Random", "Reexport", "SentinelArrays", "SortingAlgorithms", "Statistics", "TableTraits", "Tables", "Unicode"]
+git-tree-sha1 = "d8928e9169ff76c6281f39a659f9bca3a573f24c"
uuid = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0"
-version = "1.6.1"
+version = "1.8.1"
[[deps.DataStructures]]
deps = ["Compat", "InteractiveUtils", "OrderedCollections"]
-git-tree-sha1 = "1d0a14036acb104d9e89698bd408f63ab58cdc82"
+git-tree-sha1 = "4e1fe97fdaed23e9dc21d4d664bea76b65fc50a0"
uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8"
-version = "0.18.20"
+version = "0.18.22"
[[deps.DataValueInterfaces]]
git-tree-sha1 = "bfc1187b79289637fa0ef6d4436ebdfe6905cbd6"
@@ -541,12 +603,13 @@ version = "1.0.0"
[[deps.Dates]]
deps = ["Printf"]
uuid = "ade2ca70-3891-5945-98fb-dc099432e06a"
+version = "1.11.0"
[[deps.Dbus_jll]]
deps = ["Artifacts", "Expat_jll", "JLLWrappers", "Libdl"]
-git-tree-sha1 = "fc173b380865f70627d7dd1190dc2fce6cc105af"
+git-tree-sha1 = "473e9afc9cf30814eb67ffa5f2db7df82c3ad9fd"
uuid = "ee1fde0b-3d02-5ea6-8484-8dfef6360eab"
-version = "1.14.10+0"
+version = "1.16.2+0"
[[deps.DecisionTree]]
deps = ["AbstractTrees", "DelimitedFiles", "LinearAlgebra", "Random", "ScikitLearnBase", "Statistics"]
@@ -561,9 +624,9 @@ version = "0.1.2"
[[deps.DelaunayTriangulation]]
deps = ["AdaptivePredicates", "EnumX", "ExactPredicates", "Random"]
-git-tree-sha1 = "94eb20e6621600f4315813b1d1fc9b8a5a6a34db"
+git-tree-sha1 = "c55f5a9fd67bdbc8e089b5a3111fe4292986a8e8"
uuid = "927a84f5-c5f4-47a5-9785-b46e178433df"
-version = "1.4.0"
+version = "1.6.6"
[[deps.DelimitedFiles]]
deps = ["Mmap"]
@@ -589,11 +652,61 @@ git-tree-sha1 = "23163d55f885173722d1e4cf0f6110cdbaf7e272"
uuid = "b552c78f-8df3-52c6-915a-8e097449b14b"
version = "1.15.1"
+[[deps.DifferentiationInterface]]
+deps = ["ADTypes", "LinearAlgebra"]
+git-tree-sha1 = "44d9321761ed99e1d444b5081b3166d3259adcf0"
+uuid = "a0c0ee7d-e4b9-4e03-894e-1c5f64a51d63"
+version = "0.7.14"
+
+ [deps.DifferentiationInterface.extensions]
+ DifferentiationInterfaceChainRulesCoreExt = "ChainRulesCore"
+ DifferentiationInterfaceDiffractorExt = "Diffractor"
+ DifferentiationInterfaceEnzymeExt = ["EnzymeCore", "Enzyme"]
+ DifferentiationInterfaceFastDifferentiationExt = "FastDifferentiation"
+ DifferentiationInterfaceFiniteDiffExt = "FiniteDiff"
+ DifferentiationInterfaceFiniteDifferencesExt = "FiniteDifferences"
+ DifferentiationInterfaceForwardDiffExt = ["ForwardDiff", "DiffResults"]
+ DifferentiationInterfaceGPUArraysCoreExt = "GPUArraysCore"
+ DifferentiationInterfaceGTPSAExt = "GTPSA"
+ DifferentiationInterfaceMooncakeExt = "Mooncake"
+ DifferentiationInterfacePolyesterForwardDiffExt = ["PolyesterForwardDiff", "ForwardDiff", "DiffResults"]
+ DifferentiationInterfaceReverseDiffExt = ["ReverseDiff", "DiffResults"]
+ DifferentiationInterfaceSparseArraysExt = "SparseArrays"
+ DifferentiationInterfaceSparseConnectivityTracerExt = "SparseConnectivityTracer"
+ DifferentiationInterfaceSparseMatrixColoringsExt = "SparseMatrixColorings"
+ DifferentiationInterfaceStaticArraysExt = "StaticArrays"
+ DifferentiationInterfaceSymbolicsExt = "Symbolics"
+ DifferentiationInterfaceTrackerExt = "Tracker"
+ DifferentiationInterfaceZygoteExt = ["Zygote", "ForwardDiff"]
+
+ [deps.DifferentiationInterface.weakdeps]
+ ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4"
+ DiffResults = "163ba53b-c6d8-5494-b064-1a9d43ac40c5"
+ Diffractor = "9f5e2b26-1114-432f-b630-d3fe2085c51c"
+ Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9"
+ EnzymeCore = "f151be2c-9106-41f4-ab19-57ee4f262869"
+ FastDifferentiation = "eb9bf01b-bf85-4b60-bf87-ee5de06c00be"
+ FiniteDiff = "6a86dc24-6348-571c-b903-95158fe2bd41"
+ FiniteDifferences = "26cc04aa-876d-5657-8c51-4c34ba976000"
+ ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210"
+ GPUArraysCore = "46192b85-c4d5-4398-a991-12ede77f4527"
+ GTPSA = "b27dd330-f138-47c5-815b-40db9dd9b6e8"
+ Mooncake = "da2b9cff-9c12-43a0-ae48-6db2b0edb7d6"
+ PolyesterForwardDiff = "98d1487c-24ca-40b6-b7ab-df2af84e126b"
+ ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267"
+ SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf"
+ SparseConnectivityTracer = "9f842d2f-2579-4b1d-911e-f412cf18a3f5"
+ SparseMatrixColorings = "0a514795-09f3-496d-8182-132a7b665d35"
+ StaticArrays = "90137ffa-7385-5640-81b9-e52037218182"
+ Symbolics = "0c5d862f-8b57-4792-8d23-62f2024744c7"
+ Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c"
+ Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f"
+
[[deps.Distances]]
deps = ["LinearAlgebra", "Statistics", "StatsAPI"]
-git-tree-sha1 = "66c4c81f259586e8f002eacebc177e1fb06363b0"
+git-tree-sha1 = "c7e3a542b999843086e2f29dac96a618c105be1d"
uuid = "b4f34e82-e78d-54a5-968a-f98e89d6e8f7"
-version = "0.10.11"
+version = "0.10.12"
weakdeps = ["ChainRulesCore", "SparseArrays"]
[deps.Distances.extensions]
@@ -603,12 +716,13 @@ weakdeps = ["ChainRulesCore", "SparseArrays"]
[[deps.Distributed]]
deps = ["Random", "Serialization", "Sockets"]
uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b"
+version = "1.11.0"
[[deps.Distributions]]
deps = ["AliasTables", "FillArrays", "LinearAlgebra", "PDMats", "Printf", "QuadGK", "Random", "SpecialFunctions", "Statistics", "StatsAPI", "StatsBase", "StatsFuns"]
-git-tree-sha1 = "e6c693a0e4394f8fda0e51a5bdf5aef26f8235e9"
+git-tree-sha1 = "fbcc7610f6d8348428f722ecbe0e6cfe22e672c6"
uuid = "31c24e10-a181-5473-b8eb-7969acd0382f"
-version = "0.25.111"
+version = "0.25.123"
weakdeps = ["ChainRulesCore", "DensityInterface", "Test"]
[deps.Distributions.extensions]
@@ -617,10 +731,9 @@ weakdeps = ["ChainRulesCore", "DensityInterface", "Test"]
DistributionsTestExt = "Test"
[[deps.DocStringExtensions]]
-deps = ["LibGit2"]
-git-tree-sha1 = "2fb1e02f2b635d0845df5d7c167fec4dd739b00d"
+git-tree-sha1 = "7442a5dfe1ebb773c29cc2962a8980f47221d76c"
uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae"
-version = "0.9.3"
+version = "0.9.5"
[[deps.Downloads]]
deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"]
@@ -634,10 +747,10 @@ uuid = "5ae413db-bbd1-5e63-b57d-d24a61df00f5"
version = "2.2.4+0"
[[deps.EasyFit]]
-deps = ["LsqFit", "Parameters", "Statistics", "TestItems"]
-git-tree-sha1 = "861981a1edab282ff101e9f393cf961375f6be27"
+deps = ["LsqFit", "Parameters", "Statistics", "TestItems", "Unitful"]
+git-tree-sha1 = "c18e731f3b04a5ab4e5edad2c7fc4b7e309e5fae"
uuid = "fde71243-0cda-4261-b7c7-4845bd106b21"
-version = "0.6.6"
+version = "0.7.3"
weakdeps = ["Interpolations"]
[deps.EasyFit.extensions]
@@ -645,55 +758,61 @@ weakdeps = ["Interpolations"]
[[deps.EnergySamplers]]
deps = ["CategoricalArrays", "Distributions", "Flux", "MLUtils", "Optimisers", "StatsBase", "Tables"]
-git-tree-sha1 = "6072d358f2208c7cf56c18d4112d94f8660fa4b0"
+git-tree-sha1 = "639499c3b2f9932590d9cb12650d5fe8067c76e6"
uuid = "f446124b-5d5e-4171-a6dd-a1d99768d3ce"
-version = "1.0.0"
+version = "1.0.3"
[[deps.EnumX]]
-git-tree-sha1 = "bdb1942cd4c45e3c678fd11569d5cccd80976237"
+git-tree-sha1 = "bddad79635af6aec424f53ed8aad5d7555dc6f00"
uuid = "4e289a0a-7415-4d19-859d-a7e5c4648b56"
-version = "1.0.4"
+version = "1.0.5"
[[deps.EpollShim_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl"]
-git-tree-sha1 = "8e9441ee83492030ace98f9789a654a6d0b1f643"
+git-tree-sha1 = "8a4be429317c42cfae6a7fc03c31bad1970c310d"
uuid = "2702e6a9-849d-5ed8-8c21-79e8b8f9ee43"
-version = "0.0.20230411+0"
+version = "0.0.20230411+1"
[[deps.ExactPredicates]]
deps = ["IntervalArithmetic", "Random", "StaticArrays"]
-git-tree-sha1 = "b3f2ff58735b5f024c392fde763f29b057e4b025"
+git-tree-sha1 = "83231673ea4d3d6008ac74dc5079e77ab2209d8f"
uuid = "429591f6-91af-11e9-00e2-59fbe8cec110"
-version = "2.2.8"
+version = "2.2.9"
[[deps.ExceptionUnwrapping]]
deps = ["Test"]
-git-tree-sha1 = "dcb08a0d93ec0b1cdc4af184b26b591e9695423a"
+git-tree-sha1 = "d36f682e590a83d63d1c7dbd287573764682d12a"
uuid = "460bff9d-24e4-43bc-9d9f-a8973cb893f4"
-version = "0.1.10"
+version = "0.1.11"
[[deps.Expat_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl"]
-git-tree-sha1 = "1c6317308b9dc757616f0b5cb379db10494443a7"
+git-tree-sha1 = "27af30de8b5445644e8ffe3bcb0d72049c089cf1"
uuid = "2e619515-83b5-522b-bb60-26c02a35a201"
-version = "2.6.2+0"
+version = "2.7.3+0"
[[deps.Extents]]
-git-tree-sha1 = "81023caa0021a41712685887db1fc03db26f41f5"
+git-tree-sha1 = "b309b36a9e02fe7be71270dd8c0fd873625332b4"
uuid = "411431e0-e8b7-467b-b5e0-f676ba4f2910"
-version = "0.1.4"
+version = "0.1.6"
[[deps.FFMPEG]]
deps = ["FFMPEG_jll"]
-git-tree-sha1 = "b57e3acbe22f8484b4b5ff66a7499717fe1a9cc8"
+git-tree-sha1 = "95ecf07c2eea562b5adbd0696af6db62c0f52560"
uuid = "c87230d0-a227-11e9-1b43-d7ebe4e7570a"
-version = "0.4.1"
+version = "0.4.5"
[[deps.FFMPEG_jll]]
-deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "JLLWrappers", "LAME_jll", "Libdl", "Ogg_jll", "OpenSSL_jll", "Opus_jll", "PCRE2_jll", "Pkg", "Zlib_jll", "libaom_jll", "libass_jll", "libfdk_aac_jll", "libvorbis_jll", "x264_jll", "x265_jll"]
-git-tree-sha1 = "74faea50c1d007c85837327f6775bea60b5492dd"
+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 = "01ba9d15e9eae375dc1eb9589df76b3572acd3f2"
uuid = "b22a6f82-2f65-5046-a5b2-351ab43fb4e5"
-version = "4.4.2+2"
+version = "8.0.1+0"
+
+[[deps.FFTA]]
+deps = ["AbstractFFTs", "DocStringExtensions", "LinearAlgebra", "MuladdMacro", "Primes", "Random", "Reexport"]
+git-tree-sha1 = "65e55303b72f4a567a51b174dd2c47496efeb95a"
+uuid = "b86e33f2-c0db-4aa1-a6e0-ab43e668529e"
+version = "0.3.1"
[[deps.FFTViews]]
deps = ["CustomUnitRanges", "FFTW"]
@@ -702,16 +821,16 @@ uuid = "4f61f5a4-77b1-5117-aa51-3ab5ef4ef0cd"
version = "0.3.2"
[[deps.FFTW]]
-deps = ["AbstractFFTs", "FFTW_jll", "LinearAlgebra", "MKL_jll", "Preferences", "Reexport"]
-git-tree-sha1 = "4820348781ae578893311153d69049a93d05f39d"
+deps = ["AbstractFFTs", "FFTW_jll", "Libdl", "LinearAlgebra", "MKL_jll", "Preferences", "Reexport"]
+git-tree-sha1 = "97f08406df914023af55ade2f843c39e99c5d969"
uuid = "7a1cc6ca-52ef-59f5-83cd-3a7055c09341"
-version = "1.8.0"
+version = "1.10.0"
[[deps.FFTW_jll]]
-deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
-git-tree-sha1 = "c6033cc3892d0ef5bb9cd29b7f2f0331ea5184ea"
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "6d6219a004b8cf1e0b4dbe27a2860b8e04eba0be"
uuid = "f5851436-0d7a-5f13-b9de-f02708fd171a"
-version = "3.3.10+0"
+version = "3.3.11+0"
[[deps.FLoops]]
deps = ["BangBang", "Compat", "FLoopsBase", "InitialValues", "JuliaVariables", "MLStyle", "Serialization", "Setfield", "Transducers"]
@@ -727,21 +846,35 @@ version = "0.1.1"
[[deps.FileIO]]
deps = ["Pkg", "Requires", "UUIDs"]
-git-tree-sha1 = "82d8afa92ecf4b52d78d869f038ebfb881267322"
+git-tree-sha1 = "d60eb76f37d7e5a40cc2e7c36974d864b82dc802"
uuid = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549"
-version = "1.16.3"
+version = "1.17.1"
+weakdeps = ["HTTP"]
+
+ [deps.FileIO.extensions]
+ HTTPExt = "HTTP"
[[deps.FilePaths]]
-deps = ["FilePathsBase", "MacroTools", "Reexport", "Requires"]
-git-tree-sha1 = "919d9412dbf53a2e6fe74af62a73ceed0bce0629"
+deps = ["FilePathsBase", "MacroTools", "Reexport"]
+git-tree-sha1 = "a1b2fbfe98503f15b665ed45b3d149e5d8895e4c"
uuid = "8fc22ac5-c921-52a6-82fd-178b2807b824"
-version = "0.8.3"
+version = "0.9.0"
+
+ [deps.FilePaths.extensions]
+ FilePathsGlobExt = "Glob"
+ FilePathsURIParserExt = "URIParser"
+ FilePathsURIsExt = "URIs"
+
+ [deps.FilePaths.weakdeps]
+ Glob = "c27321d9-0574-5035-807b-f59d2c89b15c"
+ URIParser = "30578b45-9adc-5946-b283-645ec420af67"
+ URIs = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4"
[[deps.FilePathsBase]]
deps = ["Compat", "Dates"]
-git-tree-sha1 = "7878ff7172a8e6beedd1dea14bd27c3c6340d361"
+git-tree-sha1 = "3bab2c5aa25e7840a4b065805c0cdfc01f3068d2"
uuid = "48062228-2e41-5def-b9a4-89aafe57970f"
-version = "0.9.22"
+version = "0.9.24"
weakdeps = ["Mmap", "Test"]
[deps.FilePathsBase.extensions]
@@ -750,33 +883,37 @@ weakdeps = ["Mmap", "Test"]
[[deps.FileWatching]]
uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee"
+version = "1.11.0"
[[deps.FillArrays]]
deps = ["LinearAlgebra"]
-git-tree-sha1 = "6a70198746448456524cb442b8af316927ff3e1a"
+git-tree-sha1 = "2f979084d1e13948a3352cf64a25df6bd3b4dca3"
uuid = "1a297f60-69ca-5386-bcde-b61e274b549b"
-version = "1.13.0"
-weakdeps = ["PDMats", "SparseArrays", "Statistics"]
+version = "1.16.0"
+weakdeps = ["PDMats", "SparseArrays", "StaticArrays", "Statistics"]
[deps.FillArrays.extensions]
FillArraysPDMatsExt = "PDMats"
FillArraysSparseArraysExt = "SparseArrays"
+ FillArraysStaticArraysExt = "StaticArrays"
FillArraysStatisticsExt = "Statistics"
[[deps.FiniteDiff]]
-deps = ["ArrayInterface", "LinearAlgebra", "Setfield", "SparseArrays"]
-git-tree-sha1 = "f9219347ebf700e77ca1d48ef84e4a82a6701882"
+deps = ["ArrayInterface", "LinearAlgebra", "Setfield"]
+git-tree-sha1 = "9340ca07ca27093ff68418b7558ca37b05f8aeb1"
uuid = "6a86dc24-6348-571c-b903-95158fe2bd41"
-version = "2.24.0"
+version = "2.29.0"
[deps.FiniteDiff.extensions]
FiniteDiffBandedMatricesExt = "BandedMatrices"
FiniteDiffBlockBandedMatricesExt = "BlockBandedMatrices"
+ FiniteDiffSparseArraysExt = "SparseArrays"
FiniteDiffStaticArraysExt = "StaticArrays"
[deps.FiniteDiff.weakdeps]
BandedMatrices = "aae01518-5342-5314-be14-df237901396f"
BlockBandedMatrices = "ffab5731-97b5-5995-9138-79e8c1846df0"
+ SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf"
StaticArrays = "90137ffa-7385-5640-81b9-e52037218182"
[[deps.FixedPointNumbers]]
@@ -786,47 +923,43 @@ uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93"
version = "0.8.5"
[[deps.Flux]]
-deps = ["Adapt", "ChainRulesCore", "Compat", "Functors", "LinearAlgebra", "MLUtils", "MacroTools", "NNlib", "OneHotArrays", "Optimisers", "Preferences", "ProgressLogging", "Random", "Reexport", "SparseArrays", "SpecialFunctions", "Statistics", "Zygote"]
-git-tree-sha1 = "fbf100b4bed74c9b6fac0ebd1031e04977d35b3b"
+deps = ["Adapt", "ChainRulesCore", "Compat", "Functors", "LinearAlgebra", "MLDataDevices", "MLUtils", "MacroTools", "NNlib", "OneHotArrays", "Optimisers", "Preferences", "ProgressLogging", "Random", "Reexport", "Setfield", "SparseArrays", "SpecialFunctions", "Statistics", "Zygote"]
+git-tree-sha1 = "df520a0727f843576801a0294f5be1a94be28e23"
uuid = "587475ba-b771-5e3f-ad9e-33799f191a9c"
-version = "0.14.19"
+version = "0.14.25"
[deps.Flux.extensions]
FluxAMDGPUExt = "AMDGPU"
FluxCUDAExt = "CUDA"
FluxCUDAcuDNNExt = ["CUDA", "cuDNN"]
FluxEnzymeExt = "Enzyme"
- FluxMetalExt = "Metal"
+ FluxMPIExt = "MPI"
+ FluxMPINCCLExt = ["CUDA", "MPI", "NCCL"]
[deps.Flux.weakdeps]
AMDGPU = "21141c5a-9bdb-4563-92ae-f87d6854732e"
CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba"
Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9"
- Metal = "dde4c033-4e86-420c-a63e-0dd931031962"
+ MPI = "da04e1cc-30fd-572f-bb4f-1f8673147195"
+ NCCL = "3fe64909-d7a1-4096-9b7d-7a0f12cf0f6b"
cuDNN = "02a925ec-e4fe-4b08-9a7e-0d78e3d38ccd"
[[deps.Fontconfig_jll]]
deps = ["Artifacts", "Bzip2_jll", "Expat_jll", "FreeType2_jll", "JLLWrappers", "Libdl", "Libuuid_jll", "Zlib_jll"]
-git-tree-sha1 = "db16beca600632c95fc8aca29890d83788dd8b23"
+git-tree-sha1 = "f85dac9a96a01087df6e3a749840015a0ca3817d"
uuid = "a3f928ae-7b40-5064-980b-68af3947d34b"
-version = "2.13.96+0"
+version = "2.17.1+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 = "cf0fe81336da9fb90944683b8c41984b08793dad"
+git-tree-sha1 = "b2977f86ed76484de6f29d5b36f2fa686f085487"
uuid = "f6369f11-7733-5829-9624-2563aa707210"
-version = "0.10.36"
+version = "1.3.1"
weakdeps = ["StaticArrays"]
[deps.ForwardDiff.extensions]
@@ -840,21 +973,21 @@ version = "4.1.1"
[[deps.FreeType2_jll]]
deps = ["Artifacts", "Bzip2_jll", "JLLWrappers", "Libdl", "Zlib_jll"]
-git-tree-sha1 = "5c1d8ae0efc6c2e7b1fc502cbe25def8f661b7bc"
+git-tree-sha1 = "2c5512e11c791d1baed2049c5652441b28fc6a31"
uuid = "d7e528f0-a631-5988-bf34-fe36492bcfd7"
-version = "2.13.2+0"
+version = "2.13.4+0"
[[deps.FreeTypeAbstraction]]
-deps = ["ColorVectorSpace", "Colors", "FreeType", "GeometryBasics"]
-git-tree-sha1 = "2493cdfd0740015955a8e46de4ef28f49460d8bc"
+deps = ["BaseDirs", "ColorVectorSpace", "Colors", "FreeType", "GeometryBasics", "Mmap"]
+git-tree-sha1 = "4ebb930ef4a43817991ba35db6317a05e59abd11"
uuid = "663a7486-cb36-511b-a19d-713bb74d65c9"
-version = "0.10.3"
+version = "0.10.8"
[[deps.FriBidi_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl"]
-git-tree-sha1 = "1ed150b39aebcc805c26b93a8d0122c940f64ce2"
+git-tree-sha1 = "7a214fdac5ed5f59a22c2d9a885a16da1c74bbc7"
uuid = "559328eb-81f9-559d-9380-de523a88c83c"
-version = "1.0.14+0"
+version = "1.0.17+0"
[[deps.Functors]]
deps = ["LinearAlgebra"]
@@ -865,36 +998,47 @@ version = "0.4.12"
[[deps.Future]]
deps = ["Random"]
uuid = "9fa8497b-333b-5362-9e8d-4d0656e87820"
+version = "1.11.0"
[[deps.GLFW_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Libglvnd_jll", "Xorg_libXcursor_jll", "Xorg_libXi_jll", "Xorg_libXinerama_jll", "Xorg_libXrandr_jll", "libdecor_jll", "xkbcommon_jll"]
-git-tree-sha1 = "532f9126ad901533af1d4f5c198867227a7bb077"
+git-tree-sha1 = "b7bfd56fa66616138dfe5237da4dc13bbd83c67f"
uuid = "0656b61e-2033-5cc2-a64a-77c0f6c09b89"
-version = "3.4.0+1"
+version = "3.4.1+0"
[[deps.GPUArrays]]
-deps = ["Adapt", "GPUArraysCore", "LLVM", "LinearAlgebra", "Printf", "Random", "Reexport", "Serialization", "Statistics"]
-git-tree-sha1 = "62ee71528cca49be797076a76bdc654a170a523e"
+deps = ["Adapt", "GPUArraysCore", "KernelAbstractions", "LLVM", "LinearAlgebra", "Printf", "Random", "Reexport", "ScopedValues", "Serialization", "SparseArrays", "Statistics"]
+git-tree-sha1 = "4afe2c81e0160a7190c24361defc8c28f3616bac"
uuid = "0c68f7d7-f131-5f86-a1c3-88cf8149b2d7"
-version = "10.3.1"
+version = "11.3.4"
+weakdeps = ["JLD2"]
+
+ [deps.GPUArrays.extensions]
+ JLD2Ext = "JLD2"
[[deps.GPUArraysCore]]
deps = ["Adapt"]
-git-tree-sha1 = "ec632f177c0d990e64d955ccc1b8c04c485a0950"
+git-tree-sha1 = "83cf05ab16a73219e5f6bd1bdfa9848fa24ac627"
uuid = "46192b85-c4d5-4398-a991-12ede77f4527"
-version = "0.1.6"
+version = "0.2.0"
[[deps.GR]]
-deps = ["Artifacts", "Base64", "DelimitedFiles", "Downloads", "GR_jll", "HTTP", "JSON", "Libdl", "LinearAlgebra", "Pkg", "Preferences", "Printf", "Random", "Serialization", "Sockets", "TOML", "Tar", "Test", "UUIDs", "p7zip_jll"]
-git-tree-sha1 = "8e2d86e06ceb4580110d9e716be26658effc5bfd"
+deps = ["Artifacts", "Base64", "DelimitedFiles", "Downloads", "GR_jll", "HTTP", "JSON", "Libdl", "LinearAlgebra", "Preferences", "Printf", "Qt6Wayland_jll", "Random", "Serialization", "Sockets", "TOML", "Tar", "Test", "p7zip_jll"]
+git-tree-sha1 = "6949039c4db076a5967228bf9d7b6f32f2324328"
uuid = "28b8d3ca-fb5f-59d9-8090-bfdbd6d07a71"
-version = "0.72.8"
+version = "0.73.20"
+
+ [deps.GR.extensions]
+ IJuliaExt = "IJulia"
+
+ [deps.GR.weakdeps]
+ IJulia = "7073ff75-c697-5162-941a-fcdaad2a7d2a"
[[deps.GR_jll]]
-deps = ["Artifacts", "Bzip2_jll", "Cairo_jll", "FFMPEG_jll", "Fontconfig_jll", "GLFW_jll", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Libtiff_jll", "Pixman_jll", "Qt5Base_jll", "Zlib_jll", "libpng_jll"]
-git-tree-sha1 = "da121cbdc95b065da07fbb93638367737969693f"
+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 = "04a6eb1e57dc3a6992b5af5aa753a2f8d3a1028e"
uuid = "d2c73de3-f751-5644-a686-071e5b155ba9"
-version = "0.72.8+0"
+version = "0.73.20+0"
[[deps.GZip]]
deps = ["Libdl", "Zlib_jll"]
@@ -902,22 +1046,17 @@ git-tree-sha1 = "0085ccd5ec327c077ec5b91a5f937b759810ba62"
uuid = "92fee26a-97fe-5a0c-ad85-20a5f3185b63"
version = "0.6.2"
-[[deps.GeoFormatTypes]]
-git-tree-sha1 = "59107c179a586f0fe667024c5eb7033e81333271"
-uuid = "68eda718-8dee-11e9-39e7-89f7f65f511f"
-version = "0.4.2"
-
-[[deps.GeoInterface]]
-deps = ["Extents", "GeoFormatTypes"]
-git-tree-sha1 = "5921fc0704e40c024571eca551800c699f86ceb4"
-uuid = "cf35fbd7-0cd7-5166-be24-54bfbe79505f"
-version = "1.3.6"
-
[[deps.GeometryBasics]]
-deps = ["EarCut_jll", "Extents", "GeoInterface", "IterTools", "LinearAlgebra", "StaticArrays", "StructArrays", "Tables"]
-git-tree-sha1 = "b62f2b2d76cee0d61a2ef2b3118cd2a3215d3134"
+deps = ["EarCut_jll", "Extents", "IterTools", "LinearAlgebra", "PrecompileTools", "Random", "StaticArrays"]
+git-tree-sha1 = "1f5a80f4ed9f5a4aada88fc2db456e637676414b"
uuid = "5c1252a2-5f33-56bf-86c9-59e7332b4326"
-version = "0.4.11"
+version = "0.5.10"
+
+ [deps.GeometryBasics.extensions]
+ GeometryBasicsGeoInterfaceExt = "GeoInterface"
+
+ [deps.GeometryBasics.weakdeps]
+ GeoInterface = "cf35fbd7-0cd7-5166-be24-54bfbe79505f"
[[deps.GeometryTypes]]
deps = ["ColorTypes", "FixedPointNumbers", "LinearAlgebra", "StaticArrays"]
@@ -925,58 +1064,64 @@ git-tree-sha1 = "d796f7be0383b5416cd403420ce0af083b0f9b28"
uuid = "4d00f742-c7ba-57c2-abde-4428a4b178cb"
version = "0.8.5"
-[[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.GettextRuntime_jll]]
+deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Libiconv_jll"]
+git-tree-sha1 = "45288942190db7c5f760f59c04495064eedf9340"
+uuid = "b0724c58-0f36-5564-988d-3bb0596ebc4a"
+version = "0.22.4+0"
[[deps.Ghostscript_jll]]
-deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
-git-tree-sha1 = "43ba3d3c82c18d88471cfd2924931658838c9d8f"
+deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Zlib_jll"]
+git-tree-sha1 = "38044a04637976140074d0b0621c1edf0eb531fd"
uuid = "61579ee1-b43e-5ca0-a5da-69d92c66a64b"
-version = "9.55.0+4"
+version = "9.55.1+0"
+
+[[deps.Giflib_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "6570366d757b50fabae9f4315ad74d2e40c0560a"
+uuid = "59f7168a-df46-5410-90c8-f2779963d0ec"
+version = "5.2.3+0"
[[deps.Glib_jll]]
-deps = ["Artifacts", "Gettext_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Libiconv_jll", "Libmount_jll", "PCRE2_jll", "Zlib_jll"]
-git-tree-sha1 = "7c82e6a6cd34e9d935e9aa4051b66c6ff3af59ba"
+deps = ["Artifacts", "GettextRuntime_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Libiconv_jll", "Libmount_jll", "PCRE2_jll", "Zlib_jll"]
+git-tree-sha1 = "6b4d2dc81736fe3980ff0e8879a9fc7c33c44ddf"
uuid = "7746bdde-850d-59dc-9ae8-88ece973131d"
-version = "2.80.2+0"
+version = "2.86.2+0"
[[deps.Glob]]
-git-tree-sha1 = "97285bbd5230dd766e9ef6749b80fc617126d496"
+git-tree-sha1 = "83cb0092e2792b9e3a865b6655e88f5b862607e2"
uuid = "c27321d9-0574-5035-807b-f59d2c89b15c"
-version = "1.3.1"
+version = "1.4.0"
[[deps.GraphRecipes]]
deps = ["AbstractTrees", "GeometryTypes", "Graphs", "InteractiveUtils", "Interpolations", "LinearAlgebra", "NaNMath", "NetworkLayout", "PlotUtils", "RecipesBase", "SparseArrays", "Statistics"]
-git-tree-sha1 = "10920601dc51d2231bb3d2111122045efed8def0"
+git-tree-sha1 = "c280e827ec2acc9e61ac373f9be359efa08d9f87"
uuid = "bd48cda9-67a9-57be-86fa-5b3c104eda73"
-version = "0.5.13"
+version = "0.5.15"
[[deps.Graphics]]
deps = ["Colors", "LinearAlgebra", "NaNMath"]
-git-tree-sha1 = "d61890399bc535850c4bf08e4e0d3a7ad0f21cbd"
+git-tree-sha1 = "a641238db938fff9b2f60d08ed9030387daf428c"
uuid = "a2bd30eb-e257-5431-a919-1863eab51364"
-version = "1.1.2"
+version = "1.1.3"
[[deps.Graphite2_jll]]
-deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
-git-tree-sha1 = "344bf40dcab1073aca04aa0df4fb092f920e4011"
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "8a6dbda1fd736d60cc477d99f2e7a042acfa46e8"
uuid = "3b182d85-2403-5c21-9c21-1e1f0cc25472"
-version = "1.3.14+0"
+version = "1.3.15+0"
[[deps.Graphs]]
-deps = ["ArnoldiMethod", "Compat", "DataStructures", "Distributed", "Inflate", "LinearAlgebra", "Random", "SharedArrays", "SimpleTraits", "SparseArrays", "Statistics"]
-git-tree-sha1 = "ebd18c326fa6cee1efb7da9a3b45cf69da2ed4d9"
+deps = ["ArnoldiMethod", "DataStructures", "Distributed", "Inflate", "LinearAlgebra", "Random", "SharedArrays", "SimpleTraits", "SparseArrays", "Statistics"]
+git-tree-sha1 = "7a98c6502f4632dbe9fb1973a4244eaa3324e84d"
uuid = "86223c79-3864-5bf0-83f7-82e725a168b6"
-version = "1.11.2"
+version = "1.13.1"
[[deps.GridLayoutBase]]
deps = ["GeometryBasics", "InteractiveUtils", "Observables"]
-git-tree-sha1 = "fc713f007cff99ff9e50accba6373624ddd33588"
+git-tree-sha1 = "93d5c27c8de51687a2c70ec0716e6e76f298416f"
uuid = "3955a311-db13-416c-9275-1d80ed98e5e9"
-version = "0.11.0"
+version = "0.11.2"
[[deps.Grisu]]
git-tree-sha1 = "53bb909d1151e57e2484c3d1b53e19552b887fb2"
@@ -996,22 +1141,27 @@ version = "0.17.2"
MPI = "da04e1cc-30fd-572f-bb4f-1f8673147195"
[[deps.HDF5_jll]]
-deps = ["Artifacts", "JLLWrappers", "LibCURL_jll", "Libdl", "OpenSSL_jll", "Pkg", "Zlib_jll"]
-git-tree-sha1 = "4cc2bb72df6ff40b055295fdef6d92955f9dede8"
+deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LazyArtifacts", "LibCURL_jll", "Libdl", "MPICH_jll", "MPIPreferences", "MPItrampoline_jll", "MicrosoftMPI_jll", "OpenMPI_jll", "OpenSSL_jll", "TOML", "Zlib_jll", "libaec_jll"]
+git-tree-sha1 = "e94f84da9af7ce9c6be049e9067e511e17ff89ec"
uuid = "0234f1f7-429e-5d53-9886-15a909be8d59"
-version = "1.12.2+2"
+version = "1.14.6+0"
[[deps.HTTP]]
-deps = ["Base64", "CodecZlib", "ConcurrentUtilities", "Dates", "ExceptionUnwrapping", "Logging", "LoggingExtras", "MbedTLS", "NetworkOptions", "OpenSSL", "Random", "SimpleBufferStream", "Sockets", "URIs", "UUIDs"]
-git-tree-sha1 = "d1d712be3164d61d1fb98e7ce9bcbc6cc06b45ed"
+deps = ["Base64", "CodecZlib", "ConcurrentUtilities", "Dates", "ExceptionUnwrapping", "Logging", "LoggingExtras", "MbedTLS", "NetworkOptions", "OpenSSL", "PrecompileTools", "Random", "SimpleBufferStream", "Sockets", "URIs", "UUIDs"]
+git-tree-sha1 = "5e6fe50ae7f23d171f44e311c2960294aaa0beb5"
uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3"
-version = "1.10.8"
+version = "1.10.19"
[[deps.HarfBuzz_jll]]
deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "Graphite2_jll", "JLLWrappers", "Libdl", "Libffi_jll"]
-git-tree-sha1 = "401e4f3f30f43af2c8478fc008da50096ea5240f"
+git-tree-sha1 = "f923f9a774fcf3f5cb761bfa43aeadd689714813"
uuid = "2e76f6c2-a576-52d4-95c1-20adfe4de566"
-version = "8.3.1+0"
+version = "8.5.1+0"
+
+[[deps.HashArrayMappedTries]]
+git-tree-sha1 = "2eaa69a7cab70a52b9687c8bf950a5a93ec895ae"
+uuid = "076d061b-32b6-4027-95e0-9a2c6f6d7e74"
+version = "0.2.0"
[[deps.HistogramThresholding]]
deps = ["ImageBase", "LinearAlgebra", "MappedArrays"]
@@ -1020,22 +1170,28 @@ uuid = "2c695a8d-9458-5d45-9878-1b8a99cf7853"
version = "0.3.1"
[[deps.HostCPUFeatures]]
-deps = ["BitTwiddlingConvenienceFunctions", "IfElse", "Libdl", "Static"]
-git-tree-sha1 = "8e070b599339d622e9a081d17230d74a5c473293"
+deps = ["BitTwiddlingConvenienceFunctions", "IfElse", "Libdl", "Preferences", "Static"]
+git-tree-sha1 = "af9ab7d1f70739a47f03be78771ebda38c3c71bf"
uuid = "3e5b6fbb-0976-4d2c-9146-d79de83f2fb0"
-version = "0.1.17"
+version = "0.1.18"
+
+[[deps.Hwloc_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "XML2_jll", "Xorg_libpciaccess_jll"]
+git-tree-sha1 = "3d468106a05408f9f7b6f161d9e7715159af247b"
+uuid = "e33a78d0-f292-5ffc-b300-72abe9b543c8"
+version = "2.12.2+0"
[[deps.HypergeometricFunctions]]
deps = ["LinearAlgebra", "OpenLibm_jll", "SpecialFunctions"]
-git-tree-sha1 = "7c4195be1649ae622304031ed46a2f4df989f1eb"
+git-tree-sha1 = "68c173f4f449de5b438ee67ed0c9c748dc31a2ec"
uuid = "34004b35-14d8-5ef3-9330-4cdb6864b03a"
-version = "0.3.24"
+version = "0.3.28"
[[deps.IRTools]]
deps = ["InteractiveUtils", "MacroTools"]
-git-tree-sha1 = "950c3717af761bc3ff906c2e8e52bd83390b6ec2"
+git-tree-sha1 = "57e9ce6cf68d0abf5cb6b3b4abf9bedf05c939c0"
uuid = "7869d1d1-7146-5819-86e3-90919afe41df"
-version = "0.4.14"
+version = "0.4.15"
[[deps.IfElse]]
git-tree-sha1 = "debdd00ffef04665ccbb3e150747a77560e8fad1"
@@ -1044,9 +1200,9 @@ version = "0.1.1"
[[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"]
@@ -1056,9 +1212,9 @@ version = "0.1.7"
[[deps.ImageBinarization]]
deps = ["HistogramThresholding", "ImageCore", "LinearAlgebra", "Polynomials", "Reexport", "Statistics"]
-git-tree-sha1 = "f5356e7203c4a9954962e3757c08033f2efe578a"
+git-tree-sha1 = "33485b4e40d1df46c806498c73ea32dc17475c59"
uuid = "cbc4b850-ae4b-5111-9e64-df94c024a13d"
-version = "0.3.0"
+version = "0.3.1"
[[deps.ImageContrastAdjustment]]
deps = ["ImageBase", "ImageCore", "ImageTransformations", "Parameters"]
@@ -1068,9 +1224,9 @@ version = "0.3.12"
[[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.ImageCorners]]
deps = ["ImageCore", "ImageFiltering", "PrecompileTools", "StaticArrays", "StatsBase"]
@@ -1086,39 +1242,39 @@ version = "0.2.17"
[[deps.ImageFiltering]]
deps = ["CatIndices", "ComputationalResources", "DataStructures", "FFTViews", "FFTW", "ImageBase", "ImageCore", "LinearAlgebra", "OffsetArrays", "PrecompileTools", "Reexport", "SparseArrays", "StaticArrays", "Statistics", "TiledIteration"]
-git-tree-sha1 = "432ae2b430a18c58eb7eca9ef8d0f2db90bc749c"
+git-tree-sha1 = "52116260a234af5f69969c5286e6a5f8dc3feab8"
uuid = "6a3955dd-da59-5b1f-98d4-e7296123deb5"
-version = "0.7.8"
+version = "0.7.12"
[[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.ImageMagick]]
deps = ["FileIO", "ImageCore", "ImageMagick_jll", "InteractiveUtils"]
-git-tree-sha1 = "8e2eae13d144d545ef829324f1f0a5a4fe4340f3"
+git-tree-sha1 = "8e64ab2f0da7b928c8ae889c514a52741debc1c2"
uuid = "6218d12a-5da1-5696-b52f-db25d2ecc6d1"
-version = "1.3.1"
+version = "1.4.2"
[[deps.ImageMagick_jll]]
-deps = ["Artifacts", "Ghostscript_jll", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Libtiff_jll", "OpenJpeg_jll", "Pkg", "Zlib_jll", "libpng_jll"]
-git-tree-sha1 = "8d2e786fd090199a91ecbf4a66d03aedd0fb24d4"
+deps = ["Artifacts", "Bzip2_jll", "FFTW_jll", "Ghostscript_jll", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Libtiff_jll", "OpenJpeg_jll", "Zlib_jll", "Zstd_jll", "libpng_jll", "libwebp_jll", "libzip_jll"]
+git-tree-sha1 = "2c232857f2eb9ecfa3ab534df7f060c9afbeb187"
uuid = "c73af94c-d91f-53ed-93a7-00f77d67a9d7"
-version = "6.9.11+4"
+version = "7.1.2011+0"
[[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.ImageMorphology]]
deps = ["DataStructures", "ImageCore", "LinearAlgebra", "LoopVectorization", "OffsetArrays", "Requires", "TiledIteration"]
-git-tree-sha1 = "6f0a801136cb9c229aebea0df296cdcd471dbcd1"
+git-tree-sha1 = "cffa21df12f00ca1a365eb8ed107614b40e8c6da"
uuid = "787d08f9-d448-5407-9aad-5290dd7ab264"
-version = "0.4.5"
+version = "0.4.6"
[[deps.ImageQualityIndexes]]
deps = ["ImageContrastAdjustment", "ImageCore", "ImageDistances", "ImageFiltering", "LazyModules", "OffsetArrays", "PrecompileTools", "Statistics"]
@@ -1128,9 +1284,9 @@ version = "0.3.7"
[[deps.ImageSegmentation]]
deps = ["Clustering", "DataStructures", "Distances", "Graphs", "ImageCore", "ImageFiltering", "ImageMorphology", "LinearAlgebra", "MetaGraphs", "RegionTrees", "SimpleWeightedGraphs", "StaticArrays", "Statistics"]
-git-tree-sha1 = "3ff0ca203501c3eedde3c6fa7fd76b703c336b5f"
+git-tree-sha1 = "7196039573b6f312864547eb7a74360d6c0ab8e6"
uuid = "80713f31-8817-5129-9cf8-209ff8fb23e1"
-version = "1.8.2"
+version = "1.9.0"
[[deps.ImageShow]]
deps = ["Base64", "ColorSchemes", "FileIO", "ImageBase", "ImageCore", "OffsetArrays", "StackViews"]
@@ -1140,21 +1296,21 @@ version = "0.3.8"
[[deps.ImageTransformations]]
deps = ["AxisAlgorithms", "CoordinateTransformations", "ImageBase", "ImageCore", "Interpolations", "OffsetArrays", "Rotations", "StaticArrays"]
-git-tree-sha1 = "e0884bdf01bbbb111aea77c348368a86fb4b5ab6"
+git-tree-sha1 = "dfde81fafbe5d6516fb864dc79362c5c6b973c82"
uuid = "02fcd773-0e25-5acc-982a-7f6622650795"
-version = "0.10.1"
+version = "0.10.2"
[[deps.Images]]
deps = ["Base64", "FileIO", "Graphics", "ImageAxes", "ImageBase", "ImageBinarization", "ImageContrastAdjustment", "ImageCore", "ImageCorners", "ImageDistances", "ImageFiltering", "ImageIO", "ImageMagick", "ImageMetadata", "ImageMorphology", "ImageQualityIndexes", "ImageSegmentation", "ImageShow", "ImageTransformations", "IndirectArrays", "IntegralArrays", "Random", "Reexport", "SparseArrays", "StaticArrays", "Statistics", "StatsBase", "TiledIteration"]
-git-tree-sha1 = "12fdd617c7fe25dc4a6cc804d657cc4b2230302b"
+git-tree-sha1 = "a49b96fd4a8d1a9a718dfd9cde34c154fc84fcd5"
uuid = "916415d5-f1e6-5110-898d-aaa5f9f070e0"
-version = "0.26.1"
+version = "0.26.2"
[[deps.Imath_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl"]
-git-tree-sha1 = "0936ba688c6d201805a83da835b55c61a180db52"
+git-tree-sha1 = "dcc8d0cd653e55213df9b75ebc6fe4a8d3254c65"
uuid = "905a6f67-0a94-5f89-b386-d35d92009cd1"
-version = "3.1.11+0"
+version = "3.2.2+0"
[[deps.IndirectArrays]]
git-tree-sha1 = "012e604e1c7458645cb8b436f8fba789a51b257f"
@@ -1184,9 +1340,9 @@ uuid = "22cec73e-a1b8-11e9-2c92-598750a2cf9c"
version = "0.3.1"
[[deps.InlineStrings]]
-git-tree-sha1 = "45521d31238e87ee9f9732561bfee12d4eebd52d"
+git-tree-sha1 = "8f3d257792a522b4601c24a577954b0a8cd7334d"
uuid = "842dd82b-1e85-43dc-bf29-5d0ee9dffc48"
-version = "1.4.2"
+version = "1.4.5"
[deps.InlineStrings.extensions]
ArrowTypesExt = "ArrowTypes"
@@ -1196,21 +1352,27 @@ version = "1.4.2"
ArrowTypes = "31f734f8-188a-4ce0-8406-c8a06bd891cd"
Parsers = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0"
+[[deps.IntegerMathUtils]]
+git-tree-sha1 = "4c1acff2dc6b6967e7e750633c50bc3b8d83e617"
+uuid = "18e54dd8-cb9d-406c-a71d-865a43cbb235"
+version = "0.1.3"
+
[[deps.IntegralArrays]]
deps = ["ColorTypes", "FixedPointNumbers", "IntervalSets"]
-git-tree-sha1 = "be8e690c3973443bec584db3346ddc904d4884eb"
+git-tree-sha1 = "b842cbff3f44804a84fda409745cc8f04c029a20"
uuid = "1d092043-8f09-5a30-832f-7509e371ab51"
-version = "0.1.5"
+version = "0.1.6"
[[deps.IntelOpenMP_jll]]
deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl"]
-git-tree-sha1 = "10bd689145d2c3b2a9844005d01087cc1194e79e"
+git-tree-sha1 = "ec1debd61c300961f98064cfb21287613ad7f303"
uuid = "1d5cc7b8-4909-519e-a0f8-d0f5ad9712d0"
-version = "2024.2.1+0"
+version = "2025.2.0+0"
[[deps.InteractiveUtils]]
deps = ["Markdown"]
uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240"
+version = "1.11.0"
[[deps.InternedStrings]]
deps = ["Random", "Test"]
@@ -1219,33 +1381,44 @@ uuid = "7d512f48-7fb1-5a58-b986-67e6dc259f01"
version = "0.7.0"
[[deps.Interpolations]]
-deps = ["Adapt", "AxisAlgorithms", "ChainRulesCore", "LinearAlgebra", "OffsetArrays", "Random", "Ratios", "Requires", "SharedArrays", "SparseArrays", "StaticArrays", "WoodburyMatrices"]
-git-tree-sha1 = "88a101217d7cb38a7b481ccd50d21876e1d1b0e0"
+deps = ["Adapt", "AxisAlgorithms", "ChainRulesCore", "LinearAlgebra", "OffsetArrays", "Random", "Ratios", "SharedArrays", "SparseArrays", "StaticArrays", "WoodburyMatrices"]
+git-tree-sha1 = "65d505fa4c0d7072990d659ef3fc086eb6da8208"
uuid = "a98d9a8b-a2ab-59e6-89dd-64a1c18fca59"
-version = "0.15.1"
-weakdeps = ["Unitful"]
+version = "0.16.2"
+weakdeps = ["ForwardDiff", "Unitful"]
[deps.Interpolations.extensions]
+ InterpolationsForwardDiffExt = "ForwardDiff"
InterpolationsUnitfulExt = "Unitful"
[[deps.IntervalArithmetic]]
-deps = ["CRlibm_jll", "MacroTools", "RoundingEmulator"]
-git-tree-sha1 = "fe30dec78e68f27fc416901629c6e24e9d5f057b"
+deps = ["CRlibm", "MacroTools", "OpenBLASConsistentFPCSR_jll", "Printf", "Random", "RoundingEmulator"]
+git-tree-sha1 = "02b61501dbe6da3b927cc25dacd7ce32390ee970"
uuid = "d1acc4aa-44c8-5952-acd4-ba5d80a2a253"
-version = "0.22.16"
-weakdeps = ["DiffRules", "ForwardDiff", "IntervalSets", "LinearAlgebra", "RecipesBase"]
+version = "1.0.2"
[deps.IntervalArithmetic.extensions]
+ IntervalArithmeticArblibExt = "Arblib"
IntervalArithmeticDiffRulesExt = "DiffRules"
IntervalArithmeticForwardDiffExt = "ForwardDiff"
IntervalArithmeticIntervalSetsExt = "IntervalSets"
IntervalArithmeticLinearAlgebraExt = "LinearAlgebra"
IntervalArithmeticRecipesBaseExt = "RecipesBase"
+ IntervalArithmeticSparseArraysExt = "SparseArrays"
+
+ [deps.IntervalArithmetic.weakdeps]
+ Arblib = "fb37089c-8514-4489-9461-98f9c8763369"
+ DiffRules = "b552c78f-8df3-52c6-915a-8e097449b14b"
+ ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210"
+ IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953"
+ LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
+ RecipesBase = "3cdcf5f2-1ef4-517c-9805-6587b60abb01"
+ SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf"
[[deps.IntervalSets]]
-git-tree-sha1 = "dba9ddf07f77f60450fe5d2e2beb9854d9a49bd0"
+git-tree-sha1 = "d966f85b3b7a8e49d034d27a189e9a4874b4391a"
uuid = "8197267c-284f-5f27-9208-e0e47529a953"
-version = "0.7.10"
+version = "0.7.13"
weakdeps = ["Random", "RecipesBase", "Statistics"]
[deps.IntervalSets.extensions]
@@ -1254,9 +1427,9 @@ weakdeps = ["Random", "RecipesBase", "Statistics"]
IntervalSetsStatisticsExt = "Statistics"
[[deps.InverseFunctions]]
-git-tree-sha1 = "2787db24f4e03daf859c6509ff87764e4182f7d1"
+git-tree-sha1 = "a779299d77cd080bf77b97535acecd73e1c5e5cb"
uuid = "3587e190-3f89-42d0-90ee-14403ec27112"
-version = "0.1.16"
+version = "0.1.17"
weakdeps = ["Dates", "Test"]
[deps.InverseFunctions.extensions]
@@ -1264,14 +1437,14 @@ weakdeps = ["Dates", "Test"]
InverseFunctionsTestExt = "Test"
[[deps.InvertedIndices]]
-git-tree-sha1 = "0dc7b50b8d436461be01300fd8cd45aa0274b038"
+git-tree-sha1 = "6da3c4316095de0f5ee2ebd875df8721e7e0bdbe"
uuid = "41ab1584-1d38-5bbf-9106-f11c6c58b48f"
-version = "1.3.0"
+version = "1.3.1"
[[deps.IrrationalConstants]]
-git-tree-sha1 = "630b497eafcc20001bba38a4651b327dcfc491d2"
+git-tree-sha1 = "b2d91fe939cae05960e760110b328288867b5758"
uuid = "92d709cd-6900-40b7-9082-c6be49f344b6"
-version = "0.2.2"
+version = "0.2.6"
[[deps.Isoband]]
deps = ["isoband_jll"]
@@ -1296,34 +1469,44 @@ uuid = "82899510-4779-5014-852e-03e436cf321d"
version = "1.0.0"
[[deps.JLD2]]
-deps = ["FileIO", "MacroTools", "Mmap", "OrderedCollections", "PrecompileTools", "Requires", "TranscodingStreams"]
-git-tree-sha1 = "a0746c21bdc986d0dc293efa6b1faee112c37c28"
+deps = ["ChunkCodecLibZlib", "ChunkCodecLibZstd", "FileIO", "MacroTools", "Mmap", "OrderedCollections", "PrecompileTools", "ScopedValues"]
+git-tree-sha1 = "8f8ff711442d1f4cfc0d86133e7ee03d62ec9b98"
uuid = "033835bb-8acc-5ee8-8aae-3f567f8a3819"
-version = "0.4.53"
+version = "0.6.3"
+weakdeps = ["UnPack"]
+
+ [deps.JLD2.extensions]
+ UnPackExt = "UnPack"
[[deps.JLFzf]]
-deps = ["Pipe", "REPL", "Random", "fzf_jll"]
-git-tree-sha1 = "39d64b09147620f5ffbf6b2d3255be3c901bec63"
+deps = ["REPL", "Random", "fzf_jll"]
+git-tree-sha1 = "82f7acdc599b65e0f8ccd270ffa1467c21cb647b"
uuid = "1019f520-868f-41f5-a6de-eb00f4b6a39c"
-version = "0.1.8"
+version = "0.1.11"
[[deps.JLLWrappers]]
deps = ["Artifacts", "Preferences"]
-git-tree-sha1 = "f389674c99bfcde17dc57454011aa44d5a260a40"
+git-tree-sha1 = "0533e564aae234aff59ab625543145446d8b6ec2"
uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210"
-version = "1.6.0"
+version = "1.7.1"
[[deps.JSON]]
-deps = ["Dates", "Mmap", "Parsers", "Unicode"]
-git-tree-sha1 = "31e996f0a15c7b280ba9f76636b3ff9e2ae58c9a"
+deps = ["Dates", "Logging", "Parsers", "PrecompileTools", "StructUtils", "UUIDs", "Unicode"]
+git-tree-sha1 = "b3ad4a0255688dcb895a52fafbaae3023b588a90"
uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6"
-version = "0.21.4"
+version = "1.4.0"
+
+ [deps.JSON.extensions]
+ JSONArrowExt = ["ArrowTypes"]
+
+ [deps.JSON.weakdeps]
+ ArrowTypes = "31f734f8-188a-4ce0-8406-c8a06bd891cd"
[[deps.JSON3]]
deps = ["Dates", "Mmap", "Parsers", "PrecompileTools", "StructTypes", "UUIDs"]
-git-tree-sha1 = "eb3edce0ed4fa32f75a0a11217433c31d56bd48b"
+git-tree-sha1 = "411eccfe8aba0814ffa0fdf4860913ed09c34975"
uuid = "0f8b85d8-7281-11e9-16c2-39a750bddbf1"
-version = "1.14.0"
+version = "1.14.3"
[deps.JSON3.extensions]
JSON3ArrowExt = ["ArrowTypes"]
@@ -1333,15 +1516,15 @@ version = "1.14.0"
[[deps.JpegTurbo]]
deps = ["CEnum", "FileIO", "ImageCore", "JpegTurbo_jll", "TOML"]
-git-tree-sha1 = "fa6d0bcff8583bac20f1ffa708c3913ca605c611"
+git-tree-sha1 = "9496de8fb52c224a2e3f9ff403947674517317d9"
uuid = "b835a17e-a41a-41e7-81f0-2f016b05efe0"
-version = "0.1.5"
+version = "0.1.6"
[[deps.JpegTurbo_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl"]
-git-tree-sha1 = "c84a835e1a09b289ffcd2271bf2a337bbdda6637"
+git-tree-sha1 = "b6893345fd6658c8e475d40155789f4860ac3b21"
uuid = "aacddb02-875f-59d6-b918-886e6ef4fbf8"
-version = "3.0.3+0"
+version = "3.1.4+0"
[[deps.JuliaVariables]]
deps = ["MLStyle", "NameResolution"]
@@ -1350,10 +1533,10 @@ uuid = "b14d175d-62b4-44ba-8fb7-3064adc8c3ec"
version = "0.2.4"
[[deps.KernelAbstractions]]
-deps = ["Adapt", "Atomix", "InteractiveUtils", "MacroTools", "PrecompileTools", "Requires", "StaticArrays", "UUIDs", "UnsafeAtomics", "UnsafeAtomicsLLVM"]
-git-tree-sha1 = "045d41a364a81e357757c566b5a69fd4a2a2c445"
+deps = ["Adapt", "Atomix", "InteractiveUtils", "MacroTools", "PrecompileTools", "Requires", "StaticArrays", "UUIDs"]
+git-tree-sha1 = "b5a371fcd1d989d844a4354127365611ae1e305f"
uuid = "63c18a36-062a-441e-b654-da1e3ab1ce7c"
-version = "0.9.26"
+version = "0.9.39"
[deps.KernelAbstractions.extensions]
EnzymeExt = "EnzymeCore"
@@ -1366,28 +1549,34 @@ version = "0.9.26"
SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf"
[[deps.KernelDensity]]
-deps = ["Distributions", "DocStringExtensions", "FFTW", "Interpolations", "StatsBase"]
-git-tree-sha1 = "7d703202e65efa1369de1279c162b915e245eed1"
+deps = ["Distributions", "DocStringExtensions", "FFTA", "Interpolations", "StatsBase"]
+git-tree-sha1 = "4260cfc991b8885bf747801fb60dd4503250e478"
uuid = "5ab0869b-81aa-558d-bb23-cbf5423bbe9b"
-version = "0.6.9"
+version = "0.6.11"
+
+[[deps.KernelFunctions]]
+deps = ["ChainRulesCore", "Compat", "CompositionsBase", "Distances", "FillArrays", "Functors", "IrrationalConstants", "LinearAlgebra", "LogExpFunctions", "Random", "Requires", "SpecialFunctions", "Statistics", "StatsBase", "TensorCore", "Test", "ZygoteRules"]
+git-tree-sha1 = "9db545feadff48ec2da8216f589857e7a619df84"
+uuid = "ec8451be-7e33-11e9-00cf-bbf324bd1392"
+version = "0.10.67"
[[deps.LAME_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl"]
-git-tree-sha1 = "170b660facf5df5de098d866564877e119141cbd"
+git-tree-sha1 = "059aabebaa7c82ccb853dd4a0ee9d17796f7e1bc"
uuid = "c1c5ebd0-6772-5130-a774-d5fcae4a789d"
-version = "3.100.2+0"
+version = "3.100.3+0"
[[deps.LERC_jll]]
-deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
-git-tree-sha1 = "bf36f528eec6634efc60d7ec062008f171071434"
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "aaafe88dccbd957a8d82f7d05be9b69172e0cee3"
uuid = "88015f11-f218-50d7-93a8-a6af411a945d"
-version = "3.0.0+1"
+version = "4.0.1+0"
[[deps.LLVM]]
-deps = ["CEnum", "LLVMExtra_jll", "Libdl", "Preferences", "Printf", "Requires", "Unicode"]
-git-tree-sha1 = "4ad43cb0a4bb5e5b1506e1d1f48646d7e0c80363"
+deps = ["CEnum", "LLVMExtra_jll", "Libdl", "Preferences", "Printf", "Unicode"]
+git-tree-sha1 = "ce8614210409eaa54ed5968f4b50aa96da7ae543"
uuid = "929cbde3-209d-540e-8aea-75f648917ca0"
-version = "9.1.2"
+version = "9.4.4"
weakdeps = ["BFloat16s"]
[deps.LLVM.extensions]
@@ -1395,20 +1584,20 @@ weakdeps = ["BFloat16s"]
[[deps.LLVMExtra_jll]]
deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl", "TOML"]
-git-tree-sha1 = "05a8bd5a42309a9ec82f700876903abce1017dd3"
+git-tree-sha1 = "8e76807afb59ebb833e9b131ebf1a8c006510f33"
uuid = "dad2f222-ce93-54a1-a47d-0025e8a3acab"
-version = "0.0.34+0"
+version = "0.0.38+0"
[[deps.LLVMOpenMP_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl"]
-git-tree-sha1 = "78211fb6cbc872f77cad3fc0b6cf647d923f4929"
+git-tree-sha1 = "eb62a3deb62fc6d8822c0c4bef73e4412419c5d8"
uuid = "1d63c593-3942-5779-bab2-d838dc0a180e"
-version = "18.1.7+0"
+version = "18.1.8+0"
[[deps.LRUCache]]
-git-tree-sha1 = "b3cc6698599b10e652832c2f23db3cab99d51b59"
+git-tree-sha1 = "5519b95a490ff5fe629c4a7aa3b3dfc9160498b3"
uuid = "8ac3fa9e-de4c-5943-b1dc-09c6b5f20637"
-version = "1.6.1"
+version = "1.6.2"
weakdeps = ["Serialization"]
[deps.LRUCache.extensions]
@@ -1416,36 +1605,38 @@ weakdeps = ["Serialization"]
[[deps.LZO_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl"]
-git-tree-sha1 = "70c5da094887fd2cae843b8db33920bac4b6f07d"
+git-tree-sha1 = "1c602b1127f4751facb671441ca72715cc95938a"
uuid = "dd4b983a-f0e5-5f8d-a1b7-129d4a5fb1ac"
-version = "2.10.2+0"
+version = "2.10.3+0"
[[deps.LaTeXStrings]]
-git-tree-sha1 = "50901ebc375ed41dbf8058da26f9de442febbbec"
+git-tree-sha1 = "dda21b8cbd6a6c40d9d02a73230f9d70fed6918c"
uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f"
-version = "1.3.1"
+version = "1.4.0"
[[deps.LaplaceRedux]]
-deps = ["ChainRulesCore", "Compat", "ComputationalResources", "Distributions", "Flux", "LinearAlgebra", "MLJBase", "MLJFlux", "MLJModelInterface", "MLUtils", "Optimisers", "ProgressMeter", "Random", "Statistics", "Tables", "Tullio", "Zygote"]
-git-tree-sha1 = "699f8ce28616e7bf0ffc19d8d9bd2a0b2d3343dd"
+deps = ["CategoricalDistributions", "ChainRulesCore", "Compat", "Distributions", "Flux", "LinearAlgebra", "MLJBase", "MLJModelInterface", "MLUtils", "Optimisers", "Random", "Statistics", "Tables", "Tullio", "Zygote"]
+git-tree-sha1 = "6b70b389d1becf580680dc0ac2127348eabec7fc"
uuid = "c52c1a26-f7c5-402b-80be-ba1e638ad478"
-version = "1.1.1"
+version = "1.2.0"
[[deps.Latexify]]
-deps = ["Format", "InteractiveUtils", "LaTeXStrings", "MacroTools", "Markdown", "OrderedCollections", "Requires"]
-git-tree-sha1 = "ce5f5621cac23a86011836badfedf664a612cee4"
+deps = ["Format", "Ghostscript_jll", "InteractiveUtils", "LaTeXStrings", "MacroTools", "Markdown", "OrderedCollections", "Requires"]
+git-tree-sha1 = "44f93c47f9cd6c7e431f2f2091fcba8f01cd7e8f"
uuid = "23fbe1c1-3f47-55db-b15f-69d7ec21a316"
-version = "0.16.5"
+version = "0.16.10"
[deps.Latexify.extensions]
DataFramesExt = "DataFrames"
SparseArraysExt = "SparseArrays"
SymEngineExt = "SymEngine"
+ TectonicExt = "tectonic_jll"
[deps.Latexify.weakdeps]
DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0"
SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf"
SymEngine = "123dc426-2d89-5057-bbad-38513e3affd8"
+ tectonic_jll = "d7dd28d6-a5e6-559c-9131-7eb760cdacc5"
[[deps.LayoutPointers]]
deps = ["ArrayInterface", "LinearAlgebra", "ManualMemory", "SIMDTypes", "Static", "StaticArrayInterface"]
@@ -1456,6 +1647,7 @@ version = "0.1.17"
[[deps.LazyArtifacts]]
deps = ["Artifacts", "Pkg"]
uuid = "4af54fe1-eca0-43a8-85a7-787d91b784e3"
+version = "1.11.0"
[[deps.LazyModules]]
git-tree-sha1 = "a560dd966b386ac9ae60bdd3a3d3a326062d3c3e"
@@ -1463,10 +1655,9 @@ uuid = "8cdb02fc-e678-4876-92c5-9defec4f444e"
version = "0.3.1"
[[deps.LearnAPI]]
-deps = ["InteractiveUtils", "Statistics"]
-git-tree-sha1 = "ec695822c1faaaa64cee32d0b21505e1977b4809"
+git-tree-sha1 = "c276ed13346953f3035a6d35519ec816b820cd44"
uuid = "92ad9a40-7767-427a-9ee6-6e577f1266cb"
-version = "0.1.0"
+version = "1.0.1"
[[deps.LibCURL]]
deps = ["LibCURL_jll", "MozillaCACerts_jll"]
@@ -1476,16 +1667,17 @@ 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"
+version = "8.6.0+0"
[[deps.LibGit2]]
deps = ["Base64", "LibGit2_jll", "NetworkOptions", "Printf", "SHA"]
uuid = "76f85450-5226-5b5a-8eaa-529ad045b433"
+version = "1.11.0"
[[deps.LibGit2_jll]]
deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll"]
uuid = "e37daf67-58a4-590a-8e99-b0245dd2ffc5"
-version = "1.6.4+0"
+version = "1.7.2+0"
[[deps.LibSSH2_jll]]
deps = ["Artifacts", "Libdl", "MbedTLS_jll"]
@@ -1494,76 +1686,66 @@ version = "1.11.0+1"
[[deps.Libdl]]
uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb"
+version = "1.11.0"
[[deps.Libffi_jll]]
-deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
-git-tree-sha1 = "0b4a5d71f3e5200a7dff793393e09dfc2d874290"
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "c8da7e6a91781c41a863611c7e966098d783c57a"
uuid = "e9f186c6-92d2-5b65-8a66-fee21dc1b490"
-version = "3.2.2+1"
-
-[[deps.Libgcrypt_jll]]
-deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgpg_error_jll"]
-git-tree-sha1 = "9fd170c4bbfd8b935fdc5f8b7aa33532c991a673"
-uuid = "d4300ac3-e22c-5743-9152-c294e39db1e4"
-version = "1.8.11+0"
+version = "3.4.7+0"
[[deps.Libglvnd_jll]]
-deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll", "Xorg_libXext_jll"]
-git-tree-sha1 = "6f73d1dd803986947b2c750138528a999a6c7733"
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll", "Xorg_libXext_jll"]
+git-tree-sha1 = "d36c21b9e7c172a44a10484125024495e2625ac0"
uuid = "7e76a0d4-f3c7-5321-8279-8d96eeed0f29"
-version = "1.6.0+0"
-
-[[deps.Libgpg_error_jll]]
-deps = ["Artifacts", "JLLWrappers", "Libdl"]
-git-tree-sha1 = "fbb1f2bef882392312feb1ede3615ddc1e9b99ed"
-uuid = "7add5ba3-2f88-524e-9cd5-f83b8a55f7b8"
-version = "1.49.0+0"
+version = "1.7.1+1"
[[deps.Libiconv_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl"]
-git-tree-sha1 = "f9557a255370125b405568f9767d6d195822a175"
+git-tree-sha1 = "be484f5c92fad0bd8acfef35fe017900b0b73809"
uuid = "94ce4f54-9a6c-5748-9c1c-f9c7231a4531"
-version = "1.17.0+0"
+version = "1.18.0+0"
[[deps.Libmount_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl"]
-git-tree-sha1 = "0c4f9c4f1a50d8f35048fa0532dabbadf702f81e"
+git-tree-sha1 = "3acf07f130a76f87c041cfb2ff7d7284ca67b072"
uuid = "4b2f31a3-9ecc-558c-b454-b3730dcb73e9"
-version = "2.40.1+0"
+version = "2.41.2+0"
[[deps.Librsvg_jll]]
-deps = ["Artifacts", "JLLWrappers", "Libdl", "Pango_jll", "Pkg", "gdk_pixbuf_jll"]
-git-tree-sha1 = "ae0923dab7324e6bc980834f709c4cd83dd797ed"
+deps = ["Artifacts", "Cairo_jll", "FreeType2_jll", "Glib_jll", "JLLWrappers", "Libdl", "Pango_jll", "XML2_jll", "gdk_pixbuf_jll"]
+git-tree-sha1 = "e6ab5dda9916d7041356371c53cdc00b39841c31"
uuid = "925c91fb-5dd6-59dd-8e8c-345e74382d89"
-version = "2.54.5+0"
+version = "2.54.7+0"
[[deps.Libtiff_jll]]
-deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "LERC_jll", "Libdl", "Pkg", "Zlib_jll", "Zstd_jll"]
-git-tree-sha1 = "3eb79b0ca5764d4799c06699573fd8f533259713"
+deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "LERC_jll", "Libdl", "XZ_jll", "Zlib_jll", "Zstd_jll"]
+git-tree-sha1 = "f04133fe05eff1667d2054c53d59f9122383fe05"
uuid = "89763e89-9b03-5906-acba-b20f662cd828"
-version = "4.4.0+0"
+version = "4.7.2+0"
[[deps.Libuuid_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl"]
-git-tree-sha1 = "5ee6203157c120d79034c748a2acba45b82b8807"
+git-tree-sha1 = "2a7a12fc0a4e7fb773450d17975322aa77142106"
uuid = "38a345b3-de98-5d2b-a5d3-14cd9215e700"
-version = "2.40.1+0"
+version = "2.41.2+0"
[[deps.LineSearches]]
-deps = ["LinearAlgebra", "NLSolversBase", "NaNMath", "Parameters", "Printf"]
-git-tree-sha1 = "e4c3be53733db1051cc15ecf573b1042b3a712a1"
+deps = ["LinearAlgebra", "NLSolversBase", "NaNMath", "Printf"]
+git-tree-sha1 = "9ea3422d03222c6de679934d1c08f0a99405aa03"
uuid = "d3d80556-e9d4-5f37-9878-2ab0fcc64255"
-version = "7.3.0"
+version = "7.5.1"
[[deps.LinearAlgebra]]
deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"]
uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
+version = "1.11.0"
[[deps.LinearMaps]]
deps = ["LinearAlgebra"]
-git-tree-sha1 = "ee79c3208e55786de58f8dcccca098ced79f743f"
+git-tree-sha1 = "7f6be2e4cdaaf558623d93113d6ddade7b916209"
uuid = "7a12625a-238d-50fd-b39a-03d52299707e"
-version = "3.11.3"
+version = "3.11.4"
weakdeps = ["ChainRulesCore", "SparseArrays", "Statistics"]
[deps.LinearMaps.extensions]
@@ -1577,16 +1759,16 @@ uuid = "70f5e60a-1556-5f34-a19e-a48b3e4aaee9"
version = "0.1.1"
[[deps.LittleCMS_jll]]
-deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Libtiff_jll", "Pkg"]
-git-tree-sha1 = "110897e7db2d6836be22c18bffd9422218ee6284"
+deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Libtiff_jll"]
+git-tree-sha1 = "8e6a74641caf3b84800f2ccd55dc7ab83893c10b"
uuid = "d3a379c0-f9a3-5b72-a4c0-6bf4d2e8af0f"
-version = "2.12.0+0"
+version = "2.17.0+0"
[[deps.LogExpFunctions]]
deps = ["DocStringExtensions", "IrrationalConstants", "LinearAlgebra"]
-git-tree-sha1 = "a2d09619db4e765091ee5c6ffe8872849de0feea"
+git-tree-sha1 = "13ca9e2586b89836fd20cccf56e57e2b9ae7f38f"
uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688"
-version = "0.3.28"
+version = "0.3.29"
[deps.LogExpFunctions.extensions]
LogExpFunctionsChainRulesCoreExt = "ChainRulesCore"
@@ -1600,9 +1782,9 @@ version = "0.3.28"
[[deps.LogarithmicNumbers]]
deps = ["Random"]
-git-tree-sha1 = "427421c277f82c5749002c1b23cb1aac91beb0a8"
+git-tree-sha1 = "34828f5fd2583085e2a73d444f6317327826ab50"
uuid = "aa2f6b4e-9042-5d33-9679-40d3a6b85899"
-version = "1.4.0"
+version = "1.4.1"
weakdeps = ["ForwardDiff"]
[deps.LogarithmicNumbers.extensions]
@@ -1610,63 +1792,120 @@ weakdeps = ["ForwardDiff"]
[[deps.Logging]]
uuid = "56ddb016-857b-54e1-b83d-db4d58db5568"
+version = "1.11.0"
[[deps.LoggingExtras]]
deps = ["Dates", "Logging"]
-git-tree-sha1 = "c1dd6d7978c12545b4179fb6153b9250c96b0075"
+git-tree-sha1 = "f00544d95982ea270145636c181ceda21c4e2575"
uuid = "e6f89c97-d47a-5376-807f-9c37f3926c36"
-version = "1.0.3"
+version = "1.2.0"
[[deps.LoopVectorization]]
deps = ["ArrayInterface", "CPUSummary", "CloseOpenIntervals", "DocStringExtensions", "HostCPUFeatures", "IfElse", "LayoutPointers", "LinearAlgebra", "OffsetArrays", "PolyesterWeave", "PrecompileTools", "SIMDTypes", "SLEEFPirates", "Static", "StaticArrayInterface", "ThreadingUtilities", "UnPack", "VectorizationBase"]
-git-tree-sha1 = "8084c25a250e00ae427a379a5b607e7aed96a2dd"
+git-tree-sha1 = "a9fc7883eb9b5f04f46efb9a540833d1fad974b3"
uuid = "bdcacae8-1622-11e9-2a5c-532679323890"
-version = "0.12.171"
-weakdeps = ["ChainRulesCore", "ForwardDiff", "SpecialFunctions"]
+version = "0.12.173"
+weakdeps = ["ChainRulesCore", "ForwardDiff", "NNlib", "SpecialFunctions"]
[deps.LoopVectorization.extensions]
ForwardDiffExt = ["ChainRulesCore", "ForwardDiff"]
+ ForwardDiffNNlibExt = ["ForwardDiff", "NNlib"]
SpecialFunctionsExt = "SpecialFunctions"
[[deps.LsqFit]]
deps = ["Distributions", "ForwardDiff", "LinearAlgebra", "NLSolversBase", "Printf", "StatsAPI"]
-git-tree-sha1 = "40acc20cfb253cf061c1a2a2ea28de85235eeee1"
+git-tree-sha1 = "f386224fa41af0c27f45e2f9a8f323e538143b43"
uuid = "2fda8390-95c7-5789-9bda-21331edee243"
-version = "0.15.0"
+version = "0.15.1"
[[deps.Luxor]]
deps = ["Base64", "Cairo", "Colors", "DataStructures", "Dates", "FFMPEG", "FileIO", "PolygonAlgorithms", "PrecompileTools", "Random", "Rsvg"]
-git-tree-sha1 = "134570038473304d709de27384621bd0810d23fa"
+git-tree-sha1 = "54bdbc3b05b3a4cf25ec4c00054038758c1c090b"
uuid = "ae8d54c2-7ccd-5906-9d76-62fc9837b5bc"
-version = "4.1.0"
-weakdeps = ["LaTeXStrings", "MathTeXEngine"]
+version = "4.3.0"
[deps.Luxor.extensions]
LuxorExtLatex = ["LaTeXStrings", "MathTeXEngine"]
+ LuxorExtTypstry = ["Typstry"]
+
+ [deps.Luxor.weakdeps]
+ LaTeXStrings = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f"
+ MathTeXEngine = "0a4f8689-d25c-4efe-a92b-7142dfc1aa53"
+ Typstry = "f0ed7684-a786-439e-b1e3-3b82803b501e"
[[deps.MAT]]
-deps = ["BufferedStreams", "CodecZlib", "HDF5", "SparseArrays"]
-git-tree-sha1 = "1d2dd9b186742b0f317f2530ddcbf00eebb18e96"
+deps = ["CodecZlib", "Dates", "HDF5", "OrderedCollections", "PooledArrays", "SparseArrays", "StringEncodings", "Tables"]
+git-tree-sha1 = "dc4920291ef8e4aead248e7133da4cb0429e27e3"
uuid = "23992714-dd62-5051-b70f-ba57cb901cac"
-version = "0.10.7"
+version = "0.11.4"
[[deps.MKL_jll]]
deps = ["Artifacts", "IntelOpenMP_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "oneTBB_jll"]
-git-tree-sha1 = "f046ccd0c6db2832a9f639e2c669c6fe867e5f4f"
+git-tree-sha1 = "282cadc186e7b2ae0eeadbd7a4dffed4196ae2aa"
uuid = "856f044c-d86e-5d09-b602-aeab76dc8ba7"
-version = "2024.2.0+0"
+version = "2025.2.0+0"
+
+[[deps.MLCore]]
+deps = ["DataAPI", "SimpleTraits", "Tables"]
+git-tree-sha1 = "73907695f35bc7ffd9f11f6c4f2ee8c1302084be"
+uuid = "c2834f40-e789-41da-a90e-33b280584a8c"
+version = "1.0.0"
+
+[[deps.MLDataDevices]]
+deps = ["Adapt", "Compat", "Functors", "Preferences", "Random"]
+git-tree-sha1 = "85b47bc5a8bf0c886286638585df3bec7c9f8269"
+uuid = "7e8f7934-dd98-4c1a-8fe8-92b47a384d40"
+version = "1.5.3"
+
+ [deps.MLDataDevices.extensions]
+ MLDataDevicesAMDGPUExt = "AMDGPU"
+ MLDataDevicesCUDAExt = "CUDA"
+ MLDataDevicesChainRulesCoreExt = "ChainRulesCore"
+ MLDataDevicesChainRulesExt = "ChainRules"
+ MLDataDevicesFillArraysExt = "FillArrays"
+ MLDataDevicesGPUArraysExt = "GPUArrays"
+ MLDataDevicesMLUtilsExt = "MLUtils"
+ MLDataDevicesMetalExt = ["GPUArrays", "Metal"]
+ MLDataDevicesOneHotArraysExt = "OneHotArrays"
+ MLDataDevicesReactantExt = "Reactant"
+ MLDataDevicesRecursiveArrayToolsExt = "RecursiveArrayTools"
+ MLDataDevicesReverseDiffExt = "ReverseDiff"
+ MLDataDevicesSparseArraysExt = "SparseArrays"
+ MLDataDevicesTrackerExt = "Tracker"
+ MLDataDevicesZygoteExt = "Zygote"
+ MLDataDevicescuDNNExt = ["CUDA", "cuDNN"]
+ MLDataDevicesoneAPIExt = ["GPUArrays", "oneAPI"]
+
+ [deps.MLDataDevices.weakdeps]
+ AMDGPU = "21141c5a-9bdb-4563-92ae-f87d6854732e"
+ CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba"
+ ChainRules = "082447d4-558c-5d27-93f4-14fc19e9eca2"
+ ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4"
+ FillArrays = "1a297f60-69ca-5386-bcde-b61e274b549b"
+ GPUArrays = "0c68f7d7-f131-5f86-a1c3-88cf8149b2d7"
+ MLUtils = "f1d291b0-491e-4a28-83b9-f70985020b54"
+ Metal = "dde4c033-4e86-420c-a63e-0dd931031962"
+ OneHotArrays = "0b1bfda6-eb8a-41d2-88d8-f5af5cad476f"
+ Reactant = "3c362404-f566-11ee-1572-e11a4b42c853"
+ RecursiveArrayTools = "731186ca-8d62-57ce-b412-fbd966d074cd"
+ ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267"
+ SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf"
+ Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c"
+ Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f"
+ cuDNN = "02a925ec-e4fe-4b08-9a7e-0d78e3d38ccd"
+ oneAPI = "8f75cd03-7ff8-4ecb-9b8f-daf728133b1b"
[[deps.MLDatasets]]
deps = ["CSV", "Chemfiles", "DataDeps", "DataFrames", "DelimitedFiles", "FileIO", "FixedPointNumbers", "GZip", "Glob", "HDF5", "ImageShow", "JLD2", "JSON3", "LazyModules", "MAT", "MLUtils", "NPZ", "Pickle", "Printf", "Requires", "SparseArrays", "Statistics", "Tables"]
-git-tree-sha1 = "361c2692ee730944764945859f1a6b31072e275d"
+git-tree-sha1 = "542b6aa3ac67145331066ae758253430fe96e7c6"
uuid = "eb30cadb-4394-5ae3-aed4-317e484a6458"
-version = "0.7.18"
+version = "0.7.20"
[[deps.MLJBase]]
deps = ["CategoricalArrays", "CategoricalDistributions", "ComputationalResources", "Dates", "DelimitedFiles", "Distributed", "Distributions", "InteractiveUtils", "InvertedIndices", "LearnAPI", "LinearAlgebra", "MLJModelInterface", "Missings", "OrderedCollections", "Parameters", "PrettyTables", "ProgressMeter", "Random", "RecipesBase", "Reexport", "ScientificTypes", "Serialization", "StatisticalMeasuresBase", "StatisticalTraits", "Statistics", "StatsBase", "Tables"]
-git-tree-sha1 = "6f45e12073bc2f2e73ed0473391db38c31e879c9"
+git-tree-sha1 = "fab517c95d653cafa271beff753edbbc4324456e"
uuid = "a7f614a8-145f-11e9-1d2a-a57a1082229d"
-version = "1.7.0"
+version = "1.9.2"
[deps.MLJBase.extensions]
DefaultMeasuresExt = "StatisticalMeasures"
@@ -1694,15 +1933,15 @@ version = "0.5.1"
[[deps.MLJLinearModels]]
deps = ["DocStringExtensions", "IterativeSolvers", "LinearAlgebra", "LinearMaps", "MLJModelInterface", "Optim", "Parameters"]
-git-tree-sha1 = "7f517fd840ca433a8fae673edb31678ff55d969c"
+git-tree-sha1 = "d23c53a454f01c03780621477000f03bae487a9a"
uuid = "6ee0df7b-362f-4a72-a706-9e79364fb692"
-version = "0.10.0"
+version = "0.10.1"
[[deps.MLJModelInterface]]
-deps = ["Random", "ScientificTypesBase", "StatisticalTraits"]
-git-tree-sha1 = "ceaff6618408d0e412619321ae43b33b40c1a733"
+deps = ["InteractiveUtils", "REPL", "Random", "ScientificTypesBase", "StatisticalTraits"]
+git-tree-sha1 = "c275fae2e693206b4527dd9d2382aa15359ef3ed"
uuid = "e80e1ace-859a-464e-9ed9-23947d8ae3ea"
-version = "1.11.0"
+version = "1.12.1"
[[deps.MLJModels]]
deps = ["CategoricalArrays", "CategoricalDistributions", "Combinatorics", "Dates", "Distances", "Distributions", "InteractiveUtils", "LinearAlgebra", "MLJModelInterface", "Markdown", "OrderedCollections", "Parameters", "Pkg", "PrettyPrinting", "REPL", "Random", "RelocatableFolders", "ScientificTypes", "StatisticalTraits", "Statistics", "StatsBase", "Tables"]
@@ -1716,10 +1955,16 @@ uuid = "d8e11817-5142-5d16-987a-aa16d5891078"
version = "0.4.17"
[[deps.MLUtils]]
-deps = ["ChainRulesCore", "Compat", "DataAPI", "DelimitedFiles", "FLoops", "NNlib", "Random", "ShowCases", "SimpleTraits", "Statistics", "StatsBase", "Tables", "Transducers"]
-git-tree-sha1 = "b45738c2e3d0d402dffa32b2c1654759a2ac35a4"
+deps = ["ChainRulesCore", "Compat", "DataAPI", "DelimitedFiles", "FLoops", "MLCore", "NNlib", "Random", "ShowCases", "SimpleTraits", "Statistics", "StatsBase", "Tables", "Transducers"]
+git-tree-sha1 = "a772d8d1987433538a5c226f79393324b55f7846"
uuid = "f1d291b0-491e-4a28-83b9-f70985020b54"
-version = "0.4.4"
+version = "0.4.8"
+
+[[deps.MPICH_jll]]
+deps = ["Artifacts", "CompilerSupportLibraries_jll", "Hwloc_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "MPIPreferences", "TOML"]
+git-tree-sha1 = "9341048b9f723f2ae2a72a5269ac2f15f80534dc"
+uuid = "7cb0a576-ebde-5e09-9194-50597f1243b4"
+version = "4.3.2+0"
[[deps.MPIPreferences]]
deps = ["Libdl", "Preferences"]
@@ -1727,23 +1972,28 @@ git-tree-sha1 = "c105fe467859e7f6e9a852cb15cb4301126fac07"
uuid = "3da0fdf6-3ccc-4f1b-acd9-58baa6c99267"
version = "0.1.11"
+[[deps.MPItrampoline_jll]]
+deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "MPIPreferences", "TOML"]
+git-tree-sha1 = "e214f2a20bdd64c04cd3e4ff62d3c9be7e969a59"
+uuid = "f1f71cc9-e9ae-5b93-9b94-4fe0e1ad3748"
+version = "5.5.4+0"
+
[[deps.MacroTools]]
-deps = ["Markdown", "Random"]
-git-tree-sha1 = "2fa9ee3e63fd3a4f7a9a4f4744a52f4856de82df"
+git-tree-sha1 = "1e0228a030642014fe5cfe68c2c0a818f9e3f522"
uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09"
-version = "0.5.13"
+version = "0.5.16"
[[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 = "2281aaf0685e5e8a559982d32f17d617a949b9cd"
+deps = ["Animations", "Base64", "CRC32c", "ColorBrewer", "ColorSchemes", "ColorTypes", "Colors", "ComputePipeline", "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", "Markdown", "MathTeXEngine", "Observables", "OffsetArrays", "PNGFiles", "Packing", "Pkg", "PlotUtils", "PolygonOps", "PrecompileTools", "Printf", "REPL", "Random", "RelocatableFolders", "Scratch", "ShaderAbstractions", "Showoff", "SignedDistanceFields", "SparseArrays", "Statistics", "StatsBase", "StatsFuns", "StructArrays", "TriplotBase", "UnicodeFun", "Unitful"]
+git-tree-sha1 = "d1b974f376c24dad02c873e951c5cd4e351cd7c2"
uuid = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a"
-version = "0.21.11"
+version = "0.24.8"
-[[deps.MakieCore]]
-deps = ["ColorTypes", "GeometryBasics", "IntervalSets", "Observables"]
-git-tree-sha1 = "22fed09860ca73537a36d4e5a9bce0d9e80ee8a8"
-uuid = "20f20a25-4f0e-4fdf-b5d1-57303727442b"
-version = "0.8.8"
+ [deps.Makie.extensions]
+ MakieDynamicQuantitiesExt = "DynamicQuantities"
+
+ [deps.Makie.weakdeps]
+ DynamicQuantities = "06fc5a27-2a28-4c7c-a15d-362465fb6821"
[[deps.ManualMemory]]
git-tree-sha1 = "bcaef4fc7a0cfe2cba636d84cda54b5e4e4ca3cd"
@@ -1751,19 +2001,20 @@ uuid = "d125e4d3-2237-4719-b19c-fa641b8a4667"
version = "0.1.8"
[[deps.MappedArrays]]
-git-tree-sha1 = "2dab0221fe2b0f2cb6754eaa743cc266339f527e"
+git-tree-sha1 = "0ee4497a4e80dbd29c058fcee6493f5219556f40"
uuid = "dbb5928d-eab1-5f90-85c2-b9b0edb7c900"
-version = "0.4.2"
+version = "0.4.3"
[[deps.Markdown]]
deps = ["Base64"]
uuid = "d6f4376e-aef5-505a-96c1-9c027394607a"
+version = "1.11.0"
[[deps.MathTeXEngine]]
deps = ["AbstractTrees", "Automa", "DataStructures", "FreeTypeAbstraction", "GeometryBasics", "LaTeXStrings", "REPL", "RelocatableFolders", "UnicodeFun"]
-git-tree-sha1 = "e1641f32ae592e415e3dbae7f4a188b5316d4b62"
+git-tree-sha1 = "7eb8cdaa6f0e8081616367c10b31b9d9b34bb02a"
uuid = "0a4f8689-d25c-4efe-a92b-7142dfc1aa53"
-version = "0.6.1"
+version = "0.6.7"
[[deps.MbedTLS]]
deps = ["Dates", "MbedTLS_jll", "MozillaCACerts_jll", "NetworkOptions", "Random", "Sockets"]
@@ -1774,30 +2025,30 @@ version = "1.1.9"
[[deps.MbedTLS_jll]]
deps = ["Artifacts", "Libdl"]
uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1"
-version = "2.28.2+1"
+version = "2.28.6+0"
[[deps.Measures]]
-git-tree-sha1 = "c13304c81eec1ed3af7fc20e75fb6b26092a1102"
+git-tree-sha1 = "b513cedd20d9c914783d8ad83d08120702bf2c77"
uuid = "442fdcdd-2543-5da2-b0f3-8c86c306513e"
-version = "0.3.2"
+version = "0.3.3"
[[deps.Memoization]]
deps = ["MacroTools"]
-git-tree-sha1 = "073f080e733bc6697411901224ed4fd15fefaffa"
+git-tree-sha1 = "7dbf904fa6c4447bd1f1d316886bfbe29feacf45"
uuid = "6fafb56a-5788-4b4e-91ca-c0cea6611c73"
-version = "0.2.1"
+version = "0.2.2"
[[deps.MetaGraphs]]
deps = ["Graphs", "JLD2", "Random"]
-git-tree-sha1 = "1130dbe1d5276cb656f6e1094ce97466ed700e5a"
+git-tree-sha1 = "3a8f462a180a9d735e340f4e8d5f364d411da3a4"
uuid = "626554b9-1ddb-594c-aa3c-2596fe9399a5"
-version = "0.7.2"
+version = "0.8.1"
[[deps.Metalhead]]
deps = ["Artifacts", "BSON", "ChainRulesCore", "Flux", "Functors", "JLD2", "LazyArtifacts", "MLUtils", "NNlib", "PartialFunctions", "Random", "Statistics"]
-git-tree-sha1 = "aef476e4958303f5ea9e1deb81a1ba2f510d4e11"
+git-tree-sha1 = "c022cd34e7bd63374361bbc033cc5d845d94abc5"
uuid = "dbeba491-748d-5e0e-a39e-b530a07fa0cc"
-version = "0.9.4"
+version = "0.9.6"
[deps.Metalhead.extensions]
MetalheadCUDAExt = "CUDA"
@@ -1811,6 +2062,12 @@ git-tree-sha1 = "44d32db644e84c75dab479f1bc15ee76a1a3618f"
uuid = "128add7d-3638-4c79-886c-908ea0c25c34"
version = "0.2.0"
+[[deps.MicrosoftMPI_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
+git-tree-sha1 = "bc95bf4149bf535c09602e3acdf950d9b4376227"
+uuid = "9237b28f-5490-5468-be7b-bb81f5f5e6cf"
+version = "10.1.4+3"
+
[[deps.Missings]]
deps = ["DataAPI"]
git-tree-sha1 = "ec4f7fbeab05d7747bdf98eb74d130a2a2ed298d"
@@ -1819,6 +2076,7 @@ version = "1.2.0"
[[deps.Mmap]]
uuid = "a63ad114-7e13-5084-954f-fe012c677804"
+version = "1.11.0"
[[deps.MosaicViews]]
deps = ["MappedArrays", "OffsetArrays", "PaddedViews", "StackViews"]
@@ -1828,7 +2086,12 @@ version = "0.3.4"
[[deps.MozillaCACerts_jll]]
uuid = "14a3606d-f60d-562e-9121-12d972cd8159"
-version = "2023.1.10"
+version = "2023.12.12"
+
+[[deps.MuladdMacro]]
+git-tree-sha1 = "cac9cc5499c25554cba55cd3c30543cff5ca4fab"
+uuid = "46d2c3a1-f734-5fdb-9937-b9b9aeba4221"
+version = "0.2.4"
[[deps.MultivariateStats]]
deps = ["Arpack", "Distributions", "LinearAlgebra", "SparseArrays", "Statistics", "StatsAPI", "StatsBase"]
@@ -1837,16 +2100,16 @@ uuid = "6f286f6a-111f-5878-ab1e-185364afe411"
version = "0.10.3"
[[deps.NLSolversBase]]
-deps = ["DiffResults", "Distributed", "FiniteDiff", "ForwardDiff"]
-git-tree-sha1 = "a0b464d183da839699f4c79e7606d9d186ec172c"
+deps = ["ADTypes", "DifferentiationInterface", "Distributed", "FiniteDiff", "ForwardDiff"]
+git-tree-sha1 = "25a6638571a902ecfb1ae2a18fc1575f86b1d4df"
uuid = "d41bc354-129a-5804-8e4c-c37616107c6c"
-version = "7.8.3"
+version = "7.10.0"
[[deps.NNlib]]
-deps = ["Adapt", "Atomix", "ChainRulesCore", "GPUArraysCore", "KernelAbstractions", "LinearAlgebra", "Random", "Statistics"]
-git-tree-sha1 = "da09a1e112fd75f9af2a5229323f01b56ec96a4c"
+deps = ["Adapt", "Atomix", "ChainRulesCore", "GPUArraysCore", "KernelAbstractions", "LinearAlgebra", "Random", "ScopedValues", "Statistics"]
+git-tree-sha1 = "6dc9ffc3a9931e6b988f913b49630d0fb986d0a8"
uuid = "872c559c-99b0-510c-b3b7-b6c96a88d5cd"
-version = "0.9.24"
+version = "0.9.33"
[deps.NNlib.extensions]
NNlibAMDGPUExt = "AMDGPU"
@@ -1855,6 +2118,8 @@ version = "0.9.24"
NNlibEnzymeCoreExt = "EnzymeCore"
NNlibFFTWExt = "FFTW"
NNlibForwardDiffExt = "ForwardDiff"
+ NNlibMetalExt = "Metal"
+ NNlibSpecialFunctionsExt = "SpecialFunctions"
[deps.NNlib.weakdeps]
AMDGPU = "21141c5a-9bdb-4563-92ae-f87d6854732e"
@@ -1862,6 +2127,8 @@ version = "0.9.24"
EnzymeCore = "f151be2c-9106-41f4-ab19-57ee4f262869"
FFTW = "7a1cc6ca-52ef-59f5-83cd-3a7055c09341"
ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210"
+ Metal = "dde4c033-4e86-420c-a63e-0dd931031962"
+ SpecialFunctions = "276daf66-3868-5448-9aa4-cd146d93841b"
cuDNN = "02a925ec-e4fe-4b08-9a7e-0d78e3d38ccd"
[[deps.NPZ]]
@@ -1872,9 +2139,9 @@ version = "0.4.3"
[[deps.NaNMath]]
deps = ["OpenLibm_jll"]
-git-tree-sha1 = "0877504529a3e5c3343c6f8b4c0381e57e4387e4"
+git-tree-sha1 = "9b8215b1ee9e78a293f99797cd31375471b2bcae"
uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3"
-version = "1.0.2"
+version = "1.1.3"
[[deps.NameResolution]]
deps = ["PrettyPrint"]
@@ -1894,10 +2161,10 @@ uuid = "636a865e-7cf4-491e-846c-de09b730eb36"
version = "0.2.3"
[[deps.NearestNeighbors]]
-deps = ["Distances", "StaticArrays"]
-git-tree-sha1 = "91a67b4d73842da90b526011fa85c5c4c9343fe0"
+deps = ["AbstractTrees", "Distances", "StaticArrays"]
+git-tree-sha1 = "2949f294f82b5ad7192fd544a988a1e785438ee2"
uuid = "b8a86587-4115-5ab1-83bc-aa920d37bbce"
-version = "0.4.18"
+version = "0.4.26"
[[deps.Netpbm]]
deps = ["FileIO", "ImageCore", "ImageMetadata"]
@@ -1907,9 +2174,9 @@ version = "1.1.1"
[[deps.NetworkLayout]]
deps = ["GeometryBasics", "LinearAlgebra", "Random", "Requires", "StaticArrays"]
-git-tree-sha1 = "91bb2fedff8e43793650e7a677ccda6e6e6e166b"
+git-tree-sha1 = "f7466c23a7c5029dc99e8358e7ce5d81a117c364"
uuid = "46757867-2c16-5918-afeb-47bfcb05e46a"
-version = "0.4.6"
+version = "0.4.10"
weakdeps = ["Graphs"]
[deps.NetworkLayout.extensions]
@@ -1925,77 +2192,89 @@ uuid = "510215fc-4207-5dde-b226-833fc4488ee2"
version = "0.5.5"
[[deps.OffsetArrays]]
-git-tree-sha1 = "1a27764e945a152f7ca7efa04de513d473e9542e"
+git-tree-sha1 = "117432e406b5c023f665fa73dc26e79ec3630151"
uuid = "6fe1bfb0-de20-5000-8ca7-80f57d26f881"
-version = "1.14.1"
+version = "1.17.0"
weakdeps = ["Adapt"]
[deps.OffsetArrays.extensions]
OffsetArraysAdaptExt = "Adapt"
[[deps.Ogg_jll]]
-deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
-git-tree-sha1 = "887579a3eb005446d514ab7aeac5d1d027658b8f"
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "b6aa4566bb7ae78498a5e68943863fa8b5231b59"
uuid = "e7412a2a-1a6e-54c0-be00-318e2571c051"
-version = "1.3.5+1"
+version = "1.3.6+0"
[[deps.OneHotArrays]]
deps = ["Adapt", "ChainRulesCore", "Compat", "GPUArraysCore", "LinearAlgebra", "NNlib"]
-git-tree-sha1 = "963a3f28a2e65bb87a68033ea4a616002406037d"
+git-tree-sha1 = "bfe8e84c71972f77e775f75e6d8048ad3fdbe8bc"
uuid = "0b1bfda6-eb8a-41d2-88d8-f5af5cad476f"
-version = "0.2.5"
+version = "0.2.10"
+
+[[deps.OpenBLASConsistentFPCSR_jll]]
+deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "567515ca155d0020a45b05175449b499c63e7015"
+uuid = "6cdc7f73-28fd-5e50-80fb-958a8875b1af"
+version = "0.3.29+0"
[[deps.OpenBLAS_jll]]
deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"]
uuid = "4536629a-c528-5b80-bd46-f80d51c5b363"
-version = "0.3.23+4"
+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"]
-git-tree-sha1 = "8292dd5c8a38257111ada2174000a33745b06d4e"
+git-tree-sha1 = "df9b7c88c2e7a2e77146223c526bf9e236d5f450"
uuid = "18a262bb-aa17-5467-a713-aee519bc75cb"
-version = "3.2.4+0"
+version = "3.4.4+0"
[[deps.OpenJpeg_jll]]
-deps = ["Artifacts", "JLLWrappers", "Libdl", "Libtiff_jll", "LittleCMS_jll", "Pkg", "libpng_jll"]
-git-tree-sha1 = "76374b6e7f632c130e78100b166e5a48464256f8"
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Libtiff_jll", "LittleCMS_jll", "libpng_jll"]
+git-tree-sha1 = "215a6666fee6d6b3a6e75f2cc22cb767e2dd393a"
uuid = "643b3616-a352-519d-856d-80112ee9badc"
-version = "2.4.0+0"
+version = "2.5.5+0"
[[deps.OpenLibm_jll]]
deps = ["Artifacts", "Libdl"]
uuid = "05823500-19ac-5b8b-9628-191a04bc5112"
-version = "0.8.1+2"
+version = "0.8.5+0"
+
+[[deps.OpenMPI_jll]]
+deps = ["Artifacts", "CompilerSupportLibraries_jll", "Hwloc_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "MPIPreferences", "TOML", "Zlib_jll"]
+git-tree-sha1 = "ab6596a9d8236041dcd59b5b69316f28a8753592"
+uuid = "fe0851c0-eecd-5654-98d4-656369965a5c"
+version = "5.0.9+0"
[[deps.OpenSSL]]
-deps = ["BitFlags", "Dates", "MozillaCACerts_jll", "OpenSSL_jll", "Sockets"]
-git-tree-sha1 = "38cb508d080d21dc1128f7fb04f20387ed4c0af4"
+deps = ["BitFlags", "Dates", "MozillaCACerts_jll", "NetworkOptions", "OpenSSL_jll", "Sockets"]
+git-tree-sha1 = "1d1aaa7d449b58415f97d2839c318b70ffb525a0"
uuid = "4d8831e6-92b7-49fb-bdf8-b643e874388c"
-version = "1.4.3"
+version = "1.6.1"
[[deps.OpenSSL_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl"]
-git-tree-sha1 = "a12e56c72edee3ce6b96667745e6cbbe5498f200"
+git-tree-sha1 = "f19301ae653233bc88b1810ae908194f07f8db9d"
uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95"
-version = "1.1.23+0"
+version = "3.5.4+0"
[[deps.OpenSpecFun_jll]]
-deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Pkg"]
-git-tree-sha1 = "13652491f6856acfd2db29360e1bbcd4565d04f1"
+deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "1346c9208249809840c91b26703912dff463d335"
uuid = "efe28fd5-8261-553b-a9e1-b2916fc3738e"
-version = "0.5.5+0"
+version = "0.5.6+0"
[[deps.Optim]]
-deps = ["Compat", "FillArrays", "ForwardDiff", "LineSearches", "LinearAlgebra", "NLSolversBase", "NaNMath", "Parameters", "PositiveFactorizations", "Printf", "SparseArrays", "StatsBase"]
-git-tree-sha1 = "d9b79c4eed437421ac4285148fcadf42e0700e89"
+deps = ["Compat", "EnumX", "FillArrays", "ForwardDiff", "LineSearches", "LinearAlgebra", "NLSolversBase", "NaNMath", "PositiveFactorizations", "Printf", "SparseArrays", "StatsBase"]
+git-tree-sha1 = "48968edaf014f67e58fe4c8a4ce72d392aed3294"
uuid = "429524aa-4258-5aef-a3af-852621145aeb"
-version = "1.9.4"
+version = "1.13.3"
[deps.Optim.extensions]
OptimMOIExt = "MathOptInterface"
@@ -2005,20 +2284,20 @@ version = "1.9.4"
[[deps.Optimisers]]
deps = ["ChainRulesCore", "Functors", "LinearAlgebra", "Random", "Statistics"]
-git-tree-sha1 = "6572fe0c5b74431aaeb0b18a4aa5ef03c84678be"
+git-tree-sha1 = "c9ff5c686240c31eb8570b662dd1f66f4b183116"
uuid = "3bd65402-5787-11e9-1adc-39752487f4e2"
-version = "0.3.3"
+version = "0.3.4"
[[deps.Opus_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl"]
-git-tree-sha1 = "6703a85cb3781bd5909d48730a67205f3f31a575"
+git-tree-sha1 = "39a11854f0cba27aa41efaedf43c77c5daa6be51"
uuid = "91d4177d-7536-5919-b921-800302f37372"
-version = "1.3.3+0"
+version = "1.6.0+0"
[[deps.OrderedCollections]]
-git-tree-sha1 = "dfdf5519f235516220579f949664f1bf44e741c5"
+git-tree-sha1 = "05868e21324cede2207c6f0f466b4bfef6d5e7ee"
uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d"
-version = "1.6.3"
+version = "1.8.1"
[[deps.PCRE2_jll]]
deps = ["Artifacts", "Libdl"]
@@ -2027,15 +2306,19 @@ version = "10.42.0+1"
[[deps.PDMats]]
deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"]
-git-tree-sha1 = "949347156c25054de2db3b166c52ac4728cbad65"
+git-tree-sha1 = "e4cff168707d441cd6bf3ff7e4832bdf34278e4a"
uuid = "90014a1f-27ba-587c-ab20-58faa44d9150"
-version = "0.11.31"
+version = "0.11.37"
+weakdeps = ["StatsBase"]
+
+ [deps.PDMats.extensions]
+ StatsBaseExt = "StatsBase"
[[deps.PNGFiles]]
deps = ["Base64", "CEnum", "ImageCore", "IndirectArrays", "OffsetArrays", "libpng_jll"]
-git-tree-sha1 = "67186a2bc9a90f9f85ff3cc8277868961fb57cbd"
+git-tree-sha1 = "cf181f0b1e6a18dfeb0ee8acc4a9d1672499626c"
uuid = "f57f5aa1-a3ce-4bc8-8ab9-96f992907883"
-version = "0.4.3"
+version = "0.4.4"
[[deps.PackageExtensionCompat]]
git-tree-sha1 = "fb28e33b8a95c4cee25ce296c817d89cc2e53518"
@@ -2045,9 +2328,9 @@ weakdeps = ["Requires", "TOML"]
[[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"]
@@ -2057,9 +2340,9 @@ 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"
+git-tree-sha1 = "0662b083e11420952f2e62e17eddae7fc07d5997"
uuid = "36c8627f-9965-5494-a995-c6b170f724f3"
-version = "1.54.1+0"
+version = "1.57.0+0"
[[deps.Parameters]]
deps = ["OrderedCollections", "UnPack"]
@@ -2069,15 +2352,15 @@ version = "0.12.3"
[[deps.Parsers]]
deps = ["Dates", "PrecompileTools", "UUIDs"]
-git-tree-sha1 = "8489905bcdbcfac64d1daa51ca07c0d8f0283821"
+git-tree-sha1 = "7d2f8f21da5db6a806faf7b9b292296da42b2810"
uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0"
-version = "2.8.1"
+version = "2.8.3"
[[deps.PartialFunctions]]
deps = ["MacroTools"]
-git-tree-sha1 = "47b49a4dbc23b76682205c646252c0f9e1eb75af"
+git-tree-sha1 = "ba0ea009d9f1e38162d016ca54627314b6d8aac8"
uuid = "570af359-4316-4cb7-8c74-252c00c2016b"
-version = "1.2.0"
+version = "1.2.1"
[[deps.PeriodicTable]]
deps = ["Base64", "Unitful"]
@@ -2087,25 +2370,24 @@ version = "1.2.1"
[[deps.Pickle]]
deps = ["BFloat16s", "DataStructures", "InternedStrings", "Mmap", "Serialization", "SparseArrays", "StridedViews", "StringEncodings", "ZipFile"]
-git-tree-sha1 = "e99da19b86b7e1547b423fc1721b260cfbe83acb"
+git-tree-sha1 = "b10600c3a4094c9a35a81c4d109ad5da8a99875f"
uuid = "fbb45041-c46e-462f-888f-7c521cafbc2c"
-version = "0.3.5"
-
-[[deps.Pipe]]
-git-tree-sha1 = "6842804e7867b115ca9de748a0cf6b364523c16d"
-uuid = "b98c9c47-44ae-5843-9183-064241ee97a0"
-version = "1.3.0"
+version = "0.3.6"
[[deps.Pixman_jll]]
deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LLVMOpenMP_jll", "Libdl"]
-git-tree-sha1 = "35621f10a7531bc8fa58f74610b1bfb70a3cfc6b"
+git-tree-sha1 = "db76b1ecd5e9715f3d043cec13b2ec93ce015d53"
uuid = "30392449-352a-5448-841d-b1acce4e97dc"
-version = "0.43.4+0"
+version = "0.44.2+0"
[[deps.Pkg]]
-deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"]
+deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "Random", "SHA", "TOML", "Tar", "UUIDs", "p7zip_jll"]
uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f"
-version = "1.10.0"
+version = "1.11.0"
+weakdeps = ["REPL"]
+
+ [deps.Pkg.extensions]
+ REPLExt = "REPL"
[[deps.PkgVersion]]
deps = ["Pkg"]
@@ -2115,21 +2397,21 @@ version = "0.3.3"
[[deps.PlotThemes]]
deps = ["PlotUtils", "Statistics"]
-git-tree-sha1 = "6e55c6841ce3411ccb3457ee52fc48cb698d6fb0"
+git-tree-sha1 = "41031ef3a1be6f5bbbf3e8073f210556daeae5ca"
uuid = "ccf2f8ad-2431-5c83-bf29-c5338b663b6a"
-version = "3.2.0"
+version = "3.3.0"
[[deps.PlotUtils]]
-deps = ["ColorSchemes", "Colors", "Dates", "PrecompileTools", "Printf", "Random", "Reexport", "Statistics"]
-git-tree-sha1 = "7b1a9df27f072ac4c9c7cbe5efb198489258d1f5"
+deps = ["ColorSchemes", "Colors", "Dates", "PrecompileTools", "Printf", "Random", "Reexport", "StableRNGs", "Statistics"]
+git-tree-sha1 = "26ca162858917496748aad52bb5d3be4d26a228a"
uuid = "995b91a9-d308-5afd-9ec6-746e21dbc043"
-version = "1.4.1"
+version = "1.4.4"
[[deps.Plots]]
-deps = ["Base64", "Contour", "Dates", "Downloads", "FFMPEG", "FixedPointNumbers", "GR", "JLFzf", "JSON", "LaTeXStrings", "Latexify", "LinearAlgebra", "Measures", "NaNMath", "Pkg", "PlotThemes", "PlotUtils", "PrecompileTools", "Printf", "REPL", "Random", "RecipesBase", "RecipesPipeline", "Reexport", "RelocatableFolders", "Requires", "Scratch", "Showoff", "SparseArrays", "Statistics", "StatsBase", "TOML", "UUIDs", "UnicodeFun", "UnitfulLatexify", "Unzip"]
-git-tree-sha1 = "f202a1ca4f6e165238d8175df63a7e26a51e04dc"
+deps = ["Base64", "Contour", "Dates", "Downloads", "FFMPEG", "FixedPointNumbers", "GR", "JLFzf", "JSON", "LaTeXStrings", "Latexify", "LinearAlgebra", "Measures", "NaNMath", "Pkg", "PlotThemes", "PlotUtils", "PrecompileTools", "Printf", "REPL", "Random", "RecipesBase", "RecipesPipeline", "Reexport", "RelocatableFolders", "Requires", "Scratch", "Showoff", "SparseArrays", "Statistics", "StatsBase", "TOML", "UUIDs", "UnicodeFun", "Unzip"]
+git-tree-sha1 = "063ef757a1e0e15af77bbe92be92da672793fd4e"
uuid = "91a5bcdd-55d7-5caf-9e0b-520d859cae80"
-version = "1.40.7"
+version = "1.41.4"
[deps.Plots.extensions]
FileIOExt = "FileIO"
@@ -2152,9 +2434,9 @@ uuid = "1d0040c9-8b98-4ee7-8388-3f51789ca0ad"
version = "0.2.2"
[[deps.PolygonAlgorithms]]
-git-tree-sha1 = "a5ded6396172cff3bacdd1354d190b93cb667c4b"
+git-tree-sha1 = "5608c3c5b78134cd5da29571ef3736077408031f"
uuid = "32a0d02f-32d9-4438-b5ed-3a2932b48f96"
-version = "0.2.0"
+version = "0.3.5"
[[deps.PolygonOps]]
git-tree-sha1 = "77b3d3605fc1cd0b42d95eba87dfcd2bf67d5ff6"
@@ -2162,10 +2444,22 @@ uuid = "647866c9-e3ac-4575-94e7-e3d426903924"
version = "0.1.2"
[[deps.Polynomials]]
-deps = ["LinearAlgebra", "RecipesBase"]
-git-tree-sha1 = "a14a99e430e42a105c898fcc7f212334bc7be887"
+deps = ["LinearAlgebra", "OrderedCollections", "RecipesBase", "Requires", "Setfield", "SparseArrays"]
+git-tree-sha1 = "972089912ba299fba87671b025cd0da74f5f54f7"
uuid = "f27b6e38-b328-58d1-80ce-0feddd5e7a45"
-version = "3.2.4"
+version = "4.1.0"
+
+ [deps.Polynomials.extensions]
+ PolynomialsChainRulesCoreExt = "ChainRulesCore"
+ PolynomialsFFTWExt = "FFTW"
+ PolynomialsMakieExt = "Makie"
+ PolynomialsMutableArithmeticsExt = "MutableArithmetics"
+
+ [deps.Polynomials.weakdeps]
+ ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4"
+ FFTW = "7a1cc6ca-52ef-59f5-83cd-3a7055c09341"
+ Makie = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a"
+ MutableArithmetics = "d8a4904e-b15c-11e9-3269-09a3773c0cb0"
[[deps.PooledArrays]]
deps = ["DataAPI", "Future"]
@@ -2187,9 +2481,9 @@ version = "1.2.1"
[[deps.Preferences]]
deps = ["TOML"]
-git-tree-sha1 = "9306f6085165d270f7e3db02af26a400d580f5c6"
+git-tree-sha1 = "522f093a29b31a93e34eaea17ba055d850edea28"
uuid = "21216c6a-2e73-6563-6e65-726566657250"
-version = "1.4.3"
+version = "1.5.1"
[[deps.PrettyPrint]]
git-tree-sha1 = "632eb4abab3449ab30c5e1afaa874f0b98b586e4"
@@ -2203,48 +2497,73 @@ version = "0.4.2"
[[deps.PrettyTables]]
deps = ["Crayons", "LaTeXStrings", "Markdown", "PrecompileTools", "Printf", "Reexport", "StringManipulation", "Tables"]
-git-tree-sha1 = "66b20dd35966a748321d3b2537c4584cf40387c7"
+git-tree-sha1 = "1101cd475833706e4d0e7b122218257178f48f34"
uuid = "08abe8d2-0d0c-5749-adfa-8a2ac140af0d"
-version = "2.3.2"
+version = "2.4.0"
+
+[[deps.Primes]]
+deps = ["IntegerMathUtils"]
+git-tree-sha1 = "25cdd1d20cd005b52fc12cb6be3f75faaf59bb9b"
+uuid = "27ebfcd6-29c5-5fa9-bf4b-fb8fc14df3ae"
+version = "0.5.7"
[[deps.Printf]]
deps = ["Unicode"]
uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7"
+version = "1.11.0"
[[deps.ProgressLogging]]
deps = ["Logging", "SHA", "UUIDs"]
-git-tree-sha1 = "80d919dee55b9c50e8d9e2da5eeafff3fe58b539"
+git-tree-sha1 = "f0803bc1171e455a04124affa9c21bba5ac4db32"
uuid = "33c8b6b6-d38a-422a-b730-caa89a2f386c"
-version = "0.1.4"
+version = "0.1.6"
[[deps.ProgressMeter]]
deps = ["Distributed", "Printf"]
-git-tree-sha1 = "8f6bc219586aef8baf0ff9a5fe16ee9c70cb65e4"
+git-tree-sha1 = "fbb92c6c56b34e1a2c4c36058f68f332bec840e7"
uuid = "92933f4c-e287-5a05-a399-4b506db050ca"
-version = "1.10.2"
+version = "1.11.0"
[[deps.PtrArrays]]
-git-tree-sha1 = "77a42d78b6a92df47ab37e177b2deac405e1c88f"
+git-tree-sha1 = "1d36ef11a9aaf1e8b74dacc6a731dd1de8fd493d"
uuid = "43287f4e-b6f4-7ad1-bb20-aadabca52c3d"
-version = "1.2.1"
+version = "1.3.0"
[[deps.QOI]]
deps = ["ColorTypes", "FileIO", "FixedPointNumbers"]
-git-tree-sha1 = "18e8f4d1426e965c7b532ddd260599e1510d26ce"
+git-tree-sha1 = "472daaa816895cb7aee81658d4e7aec901fa1106"
uuid = "4b34888f-f399-49d4-9bb3-47ed5cae4e65"
-version = "1.0.0"
+version = "1.0.2"
-[[deps.Qt5Base_jll]]
-deps = ["Artifacts", "CompilerSupportLibraries_jll", "Fontconfig_jll", "Glib_jll", "JLLWrappers", "Libdl", "Libglvnd_jll", "OpenSSL_jll", "Pkg", "Xorg_libXext_jll", "Xorg_libxcb_jll", "Xorg_xcb_util_image_jll", "Xorg_xcb_util_keysyms_jll", "Xorg_xcb_util_renderutil_jll", "Xorg_xcb_util_wm_jll", "Zlib_jll", "xkbcommon_jll"]
-git-tree-sha1 = "0c03844e2231e12fda4d0086fd7cbe4098ee8dc5"
-uuid = "ea2cea3b-5b76-57ae-a6ef-0a8af62496e1"
-version = "5.15.3+2"
+[[deps.Qt6Base_jll]]
+deps = ["Artifacts", "CompilerSupportLibraries_jll", "Fontconfig_jll", "Glib_jll", "JLLWrappers", "Libdl", "Libglvnd_jll", "OpenSSL_jll", "Vulkan_Loader_jll", "Xorg_libSM_jll", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Xorg_libxcb_jll", "Xorg_xcb_util_cursor_jll", "Xorg_xcb_util_image_jll", "Xorg_xcb_util_keysyms_jll", "Xorg_xcb_util_renderutil_jll", "Xorg_xcb_util_wm_jll", "Zlib_jll", "libinput_jll", "xkbcommon_jll"]
+git-tree-sha1 = "34f7e5d2861083ec7596af8b8c092531facf2192"
+uuid = "c0090381-4147-56d7-9ebc-da0b1113ec56"
+version = "6.8.2+2"
+
+[[deps.Qt6Declarative_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Qt6Base_jll", "Qt6ShaderTools_jll"]
+git-tree-sha1 = "da7adf145cce0d44e892626e647f9dcbe9cb3e10"
+uuid = "629bc702-f1f5-5709-abd5-49b8460ea067"
+version = "6.8.2+1"
+
+[[deps.Qt6ShaderTools_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Qt6Base_jll"]
+git-tree-sha1 = "9eca9fc3fe515d619ce004c83c31ffd3f85c7ccf"
+uuid = "ce943373-25bb-56aa-8eca-768745ed7b5a"
+version = "6.8.2+1"
+
+[[deps.Qt6Wayland_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Qt6Base_jll", "Qt6Declarative_jll"]
+git-tree-sha1 = "8f528b0851b5b7025032818eb5abbeb8a736f853"
+uuid = "e99dba38-086e-5de3-a5b1-6e4c66e897c3"
+version = "6.8.2+2"
[[deps.QuadGK]]
deps = ["DataStructures", "LinearAlgebra"]
-git-tree-sha1 = "cda3b045cf9ef07a08ad46731f5a3165e56cf3da"
+git-tree-sha1 = "9da16da70037ba9d701192e27befedefb91ec284"
uuid = "1fd47b50-473d-5c70-9696-f719f8f3bcdc"
-version = "2.11.1"
+version = "2.11.2"
[deps.QuadGK.extensions]
QuadGKEnzymeExt = "Enzyme"
@@ -2254,17 +2573,19 @@ version = "2.11.1"
[[deps.Quaternions]]
deps = ["LinearAlgebra", "Random", "RealDot"]
-git-tree-sha1 = "994cc27cdacca10e68feb291673ec3a76aa2fae9"
+git-tree-sha1 = "4d8c1b7c3329c1885b857abb50d08fa3f4d9e3c8"
uuid = "94ee1d12-ae83-5a48-8b1c-48b8ff168ae0"
-version = "0.7.6"
+version = "0.7.7"
[[deps.REPL]]
-deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"]
+deps = ["InteractiveUtils", "Markdown", "Sockets", "StyledStrings", "Unicode"]
uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb"
+version = "1.11.0"
[[deps.Random]]
deps = ["SHA"]
uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"
+version = "1.11.0"
[[deps.RangeArrays]]
git-tree-sha1 = "b9039e93773ddcfc828f12aadf7115b4b4d225f5"
@@ -2324,21 +2645,21 @@ version = "1.0.1"
[[deps.RequiredInterfaces]]
deps = ["InteractiveUtils", "Logging", "Test"]
-git-tree-sha1 = "c3250333ea2894237ed015baf7d5fcb8a1ea3169"
+git-tree-sha1 = "f4e7fec4fa52d0919f18fec552d2fabf9e94811d"
uuid = "97f35ef4-7bc5-4ec1-a41a-dcc69c7308c6"
-version = "0.1.6"
+version = "0.1.7"
[[deps.Requires]]
deps = ["UUIDs"]
-git-tree-sha1 = "838a3a4188e2ded87a4f9f184b4b0d78a1e91cb7"
+git-tree-sha1 = "62389eeff14780bfe55195b7204c0d8738436d64"
uuid = "ae029012-a4dd-5104-9daa-d747884805df"
-version = "1.3.0"
+version = "1.3.1"
[[deps.Rmath]]
deps = ["Random", "Rmath_jll"]
-git-tree-sha1 = "852bd0f55565a9e973fcfee83a84413270224dc4"
+git-tree-sha1 = "5b3d50eb374cea306873b371d3f8d3915a018f0b"
uuid = "79098fc4-a85e-5d69-aa6a-4863f24498fa"
-version = "0.8.0"
+version = "0.9.0"
[[deps.Rmath_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl"]
@@ -2363,9 +2684,9 @@ version = "0.2.1"
[[deps.Rsvg]]
deps = ["Cairo", "Glib_jll", "Librsvg_jll"]
-git-tree-sha1 = "3d3dc66eb46568fb3a5259034bfc752a0eb0c686"
+git-tree-sha1 = "e53dad0507631c0b8d5d946d93458cbabd0f05d7"
uuid = "c4c386cf-5103-5370-be45-f3a111cca3b8"
-version = "1.0.0"
+version = "1.1.0"
[[deps.SHA]]
uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce"
@@ -2373,9 +2694,9 @@ version = "0.7.0"
[[deps.SIMD]]
deps = ["PrecompileTools"]
-git-tree-sha1 = "98ca7c29edd6fc79cd74c61accb7010a4e7aee33"
+git-tree-sha1 = "e24dc23107d426a096d3eae6c165b921e74c18e4"
uuid = "fdea26ae-647d-5447-a871-4b548cad5224"
-version = "3.6.0"
+version = "3.7.2"
[[deps.SIMDTypes]]
git-tree-sha1 = "330289636fb8107c5f32088d2741e9fd7a061a5c"
@@ -2388,11 +2709,16 @@ git-tree-sha1 = "456f610ca2fbd1c14f5fcf31c6bfadc55e7d66e0"
uuid = "476501e8-09a2-5ece-8869-fb82de89a1fa"
version = "0.6.43"
+[[deps.SciMLPublic]]
+git-tree-sha1 = "0ba076dbdce87ba230fff48ca9bca62e1f345c9b"
+uuid = "431bcebd-1456-4ced-9d72-93c2757fff0b"
+version = "1.0.1"
+
[[deps.ScientificTypes]]
deps = ["CategoricalArrays", "ColorTypes", "Dates", "Distributions", "PrettyTables", "Reexport", "ScientificTypesBase", "StatisticalTraits", "Tables"]
-git-tree-sha1 = "75ccd10ca65b939dab03b812994e571bf1e3e1da"
+git-tree-sha1 = "3ad7f09ae97806e86b3ef28cd50c52ca18bd2d80"
uuid = "321657f4-b219-11e9-178b-2701a2544e81"
-version = "3.0.2"
+version = "3.1.1"
[[deps.ScientificTypesBase]]
git-tree-sha1 = "a8e18eb383b5ecf1b5e6fc237eb39255044fd92b"
@@ -2405,36 +2731,44 @@ git-tree-sha1 = "7877e55c1523a4b336b433da39c8e8c08d2f221f"
uuid = "6e75b9c4-186b-50bd-896f-2d2496a4843e"
version = "0.5.0"
+[[deps.ScopedValues]]
+deps = ["HashArrayMappedTries", "Logging"]
+git-tree-sha1 = "c3b2323466378a2ba15bea4b2f73b081e022f473"
+uuid = "7e506255-f358-4e82-b7e4-beb19740aa63"
+version = "1.5.0"
+
[[deps.Scratch]]
deps = ["Dates"]
-git-tree-sha1 = "3bac05bc7e74a75fd9cba4295cde4045d9fe2386"
+git-tree-sha1 = "9b81b8393e50b7d4e6d0a9f14e192294d3b7c109"
uuid = "6c6a2e73-6563-6170-7368-637461726353"
-version = "1.2.1"
+version = "1.3.0"
[[deps.SentinelArrays]]
deps = ["Dates", "Random"]
-git-tree-sha1 = "ff11acffdb082493657550959d4feb4b6149e73a"
+git-tree-sha1 = "ebe7e59b37c400f694f52b58c93d26201387da70"
uuid = "91c51154-3ec4-41a3-a24f-3f23e20d615c"
-version = "1.4.5"
+version = "1.4.9"
[[deps.Serialization]]
uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b"
+version = "1.11.0"
[[deps.Setfield]]
deps = ["ConstructionBase", "Future", "MacroTools", "StaticArraysCore"]
-git-tree-sha1 = "e2cc6d8c88613c05e1defb55170bf5ff211fbeac"
+git-tree-sha1 = "c5391c6ace3bc430ca630251d02ea9687169ca68"
uuid = "efcf1570-3423-57d1-acb7-fd33fddbac46"
-version = "1.1.1"
+version = "1.1.2"
[[deps.ShaderAbstractions]]
-deps = ["ColorTypes", "FixedPointNumbers", "GeometryBasics", "LinearAlgebra", "Observables", "StaticArrays", "StructArrays", "Tables"]
-git-tree-sha1 = "79123bc60c5507f035e6d1d9e563bb2971954ec8"
+deps = ["ColorTypes", "FixedPointNumbers", "GeometryBasics", "LinearAlgebra", "Observables", "StaticArrays"]
+git-tree-sha1 = "818554664a2e01fc3784becb2eb3a82326a604b6"
uuid = "65257c39-d410-5151-9873-9b3e5be5013e"
-version = "0.4.1"
+version = "0.5.0"
[[deps.SharedArrays]]
deps = ["Distributed", "Mmap", "Random", "Serialization"]
uuid = "1a1011a3-84de-559e-8e89-a11a2f7dc383"
+version = "1.11.0"
[[deps.ShowCases]]
git-tree-sha1 = "7f534ad62ab2bd48591bdeac81994ea8c445e4a5"
@@ -2448,10 +2782,10 @@ uuid = "992d4aef-0814-514b-bc4d-f2e9a6c4116f"
version = "1.0.3"
[[deps.SignedDistanceFields]]
-deps = ["Random", "Statistics", "Test"]
-git-tree-sha1 = "d263a08ec505853a5ff1c1ebde2070419e3f28e9"
+deps = ["Statistics"]
+git-tree-sha1 = "3949ad92e1c9d2ff0cd4a1317d5ecbba682f4b92"
uuid = "73760f76-fbc4-59ce-8f25-708e95d2df96"
-version = "0.4.0"
+version = "0.4.1"
[[deps.SimpleBufferStream]]
git-tree-sha1 = "f305871d2f381d21527c770d4788c06c097c9bc1"
@@ -2460,35 +2794,36 @@ version = "1.2.0"
[[deps.SimpleTraits]]
deps = ["InteractiveUtils", "MacroTools"]
-git-tree-sha1 = "5d7e3f4e11935503d3ecaf7186eac40602e7d231"
+git-tree-sha1 = "be8eeac05ec97d379347584fa9fe2f5f76795bcb"
uuid = "699a6c99-e7fa-54fc-8d76-47d257e15c1d"
-version = "0.9.4"
+version = "0.9.5"
[[deps.SimpleWeightedGraphs]]
deps = ["Graphs", "LinearAlgebra", "Markdown", "SparseArrays"]
-git-tree-sha1 = "4b33e0e081a825dbfaf314decf58fa47e53d6acb"
+git-tree-sha1 = "749a2b719ec7f34f280c0d97ac3dab5c89818631"
uuid = "47aef6b3-ad0c-573a-a1e2-d07658019622"
-version = "1.4.0"
+version = "1.5.1"
[[deps.Sixel]]
deps = ["Dates", "FileIO", "ImageCore", "IndirectArrays", "OffsetArrays", "REPL", "libsixel_jll"]
-git-tree-sha1 = "2da10356e31327c7096832eb9cd86307a50b1eb6"
+git-tree-sha1 = "0494aed9501e7fb65daba895fb7fd57cc38bc743"
uuid = "45858cf5-a6b0-47a3-bbea-62219f50df47"
-version = "0.1.3"
+version = "0.1.5"
[[deps.Sockets]]
uuid = "6462fe0b-24de-5631-8697-dd941f90decc"
+version = "1.11.0"
[[deps.SortingAlgorithms]]
deps = ["DataStructures"]
-git-tree-sha1 = "66e0a8e672a0bdfca2c3f5937efb8538b9ddc085"
+git-tree-sha1 = "64d974c2e6fdf07f8155b5b2ca2ffa9069b608d9"
uuid = "a2af1166-a08f-5f64-846c-94a0d3cef48c"
-version = "1.2.1"
+version = "1.2.2"
[[deps.SparseArrays]]
deps = ["Libdl", "LinearAlgebra", "Random", "Serialization", "SuiteSparse_jll"]
uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf"
-version = "1.10.0"
+version = "1.11.0"
[[deps.SparseInverseSubset]]
deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"]
@@ -2498,9 +2833,9 @@ version = "0.1.2"
[[deps.SpecialFunctions]]
deps = ["IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"]
-git-tree-sha1 = "2f5d4697f21388cbe1ff299430dd169ef97d7e14"
+git-tree-sha1 = "f2685b435df2613e25fc10ad8c26dddb8640f547"
uuid = "276daf66-3868-5448-9aa4-cd146d93841b"
-version = "2.4.0"
+version = "2.6.1"
weakdeps = ["ChainRulesCore"]
[deps.SpecialFunctions.extensions]
@@ -2512,17 +2847,23 @@ git-tree-sha1 = "e08a62abc517eb79667d0a29dc08a3b589516bb5"
uuid = "171d559e-b47b-412a-8079-5efa626c420e"
version = "0.1.15"
+[[deps.StableRNGs]]
+deps = ["Random"]
+git-tree-sha1 = "4f96c596b8c8258cc7d3b19797854d368f243ddc"
+uuid = "860ef19b-820b-49d6-a774-d7a799459cd3"
+version = "1.0.4"
+
[[deps.StackViews]]
deps = ["OffsetArrays"]
-git-tree-sha1 = "46e589465204cd0c08b4bd97385e4fa79a0c770c"
+git-tree-sha1 = "be1cf4eb0ac528d96f5115b4ed80c26a8d8ae621"
uuid = "cae243ae-269e-4f55-b966-ac2d0dc13c15"
-version = "0.1.1"
+version = "0.1.2"
[[deps.Static]]
-deps = ["CommonWorldInvalidations", "IfElse", "PrecompileTools"]
-git-tree-sha1 = "87d51a3ee9a4b0d2fe054bdd3fc2436258db2603"
+deps = ["CommonWorldInvalidations", "IfElse", "PrecompileTools", "SciMLPublic"]
+git-tree-sha1 = "49440414711eddc7227724ae6e570c7d5559a086"
uuid = "aedffcd0-7271-4cad-89d0-dc628f76c6d3"
-version = "1.1.1"
+version = "1.3.1"
[[deps.StaticArrayInterface]]
deps = ["ArrayInterface", "Compat", "IfElse", "LinearAlgebra", "PrecompileTools", "Static"]
@@ -2537,9 +2878,9 @@ weakdeps = ["OffsetArrays", "StaticArrays"]
[[deps.StaticArrays]]
deps = ["LinearAlgebra", "PrecompileTools", "Random", "StaticArraysCore"]
-git-tree-sha1 = "eeafab08ae20c62c44c8399ccb9354a04b80db50"
+git-tree-sha1 = "eee1b9ad8b29ef0d936e3ec9838c7ec089620308"
uuid = "90137ffa-7385-5640-81b9-e52037218182"
-version = "1.9.7"
+version = "1.9.16"
weakdeps = ["ChainRulesCore", "Statistics"]
[deps.StaticArrays.extensions]
@@ -2547,44 +2888,49 @@ weakdeps = ["ChainRulesCore", "Statistics"]
StaticArraysStatisticsExt = "Statistics"
[[deps.StaticArraysCore]]
-git-tree-sha1 = "192954ef1208c7019899fbf8049e717f92959682"
+git-tree-sha1 = "6ab403037779dae8c514bad259f32a447262455a"
uuid = "1e83bf80-4336-4d27-bf5d-d5a4f845583c"
-version = "1.4.3"
+version = "1.4.4"
[[deps.StatisticalMeasuresBase]]
deps = ["CategoricalArrays", "InteractiveUtils", "MLUtils", "MacroTools", "OrderedCollections", "PrecompileTools", "ScientificTypesBase", "Statistics"]
-git-tree-sha1 = "17dfb22e2e4ccc9cd59b487dce52883e0151b4d3"
+git-tree-sha1 = "201079ca2c48e5edfaabfc34dec1a5ad2e59476e"
uuid = "c062fc1d-0d66-479b-b6ac-8b44719de4cc"
-version = "0.1.1"
+version = "0.1.3"
[[deps.StatisticalTraits]]
deps = ["ScientificTypesBase"]
-git-tree-sha1 = "542d979f6e756f13f862aa00b224f04f9e445f11"
+git-tree-sha1 = "89f86d9376acd18a1a4fbef66a56335a3a7633b8"
uuid = "64bff920-2084-43da-a3e6-9bb72801c0c9"
-version = "3.4.0"
+version = "3.5.0"
[[deps.Statistics]]
-deps = ["LinearAlgebra", "SparseArrays"]
+deps = ["LinearAlgebra"]
+git-tree-sha1 = "ae3bb1eb3bba077cd276bc5cfc337cc65c3075c0"
uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2"
-version = "1.10.0"
+version = "1.11.1"
+weakdeps = ["SparseArrays"]
+
+ [deps.Statistics.extensions]
+ SparseArraysExt = ["SparseArrays"]
[[deps.StatsAPI]]
deps = ["LinearAlgebra"]
-git-tree-sha1 = "1ff449ad350c9c4cbc756624d6f8a8c3ef56d3ed"
+git-tree-sha1 = "178ed29fd5b2a2cfc3bd31c13375ae925623ff36"
uuid = "82ae8749-77ed-4fe6-ae5f-f523153014b0"
-version = "1.7.0"
+version = "1.8.0"
[[deps.StatsBase]]
-deps = ["DataAPI", "DataStructures", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"]
-git-tree-sha1 = "5cf7606d6cef84b543b483848d4ae08ad9832b21"
+deps = ["AliasTables", "DataAPI", "DataStructures", "IrrationalConstants", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"]
+git-tree-sha1 = "aceda6f4e598d331548e04cc6b2124a6148138e3"
uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91"
-version = "0.34.3"
+version = "0.34.10"
[[deps.StatsFuns]]
deps = ["HypergeometricFunctions", "IrrationalConstants", "LogExpFunctions", "Reexport", "Rmath", "SpecialFunctions"]
-git-tree-sha1 = "b423576adc27097764a90e163157bcfc9acf0f46"
+git-tree-sha1 = "91f091a8716a6bb38417a6e6f274602a19aaa685"
uuid = "4c63d2b9-4356-54db-8cca-17b64c39e42c"
-version = "1.3.2"
+version = "1.5.2"
weakdeps = ["ChainRulesCore", "InverseFunctions"]
[deps.StatsFuns.extensions]
@@ -2593,15 +2939,17 @@ weakdeps = ["ChainRulesCore", "InverseFunctions"]
[[deps.StridedViews]]
deps = ["LinearAlgebra", "PackageExtensionCompat"]
-git-tree-sha1 = "5b765c4e401693ab08981989f74a36a010aa1d8e"
+git-tree-sha1 = "e34a59ea9c7abc8f10bfd77578de9d64bded2859"
uuid = "4db3bf67-4bd7-4b4e-b153-31dc3fb37143"
-version = "0.2.2"
+version = "0.4.3"
[deps.StridedViews.extensions]
StridedViewsCUDAExt = "CUDA"
+ StridedViewsPtrArraysExt = "PtrArrays"
[deps.StridedViews.weakdeps]
CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba"
+ PtrArrays = "43287f4e-b6f4-7ad1-bb20-aadabca52c3d"
[[deps.StringEncodings]]
deps = ["Libiconv_jll"]
@@ -2611,20 +2959,21 @@ version = "0.3.7"
[[deps.StringManipulation]]
deps = ["PrecompileTools"]
-git-tree-sha1 = "a04cabe79c5f01f4d723cc6704070ada0b9d46d5"
+git-tree-sha1 = "a3c1536470bf8c5e02096ad4853606d7c8f62721"
uuid = "892a3eda-7b42-436c-8928-eab12a02cf0e"
-version = "0.3.4"
+version = "0.4.2"
[[deps.StructArrays]]
deps = ["ConstructionBase", "DataAPI", "Tables"]
-git-tree-sha1 = "f4dc295e983502292c4c3f951dbb4e985e35b3be"
+git-tree-sha1 = "a2c37d815bf00575332b7bd0389f771cb7987214"
uuid = "09ab397b-f2b6-538f-b94a-2f83cf4a842a"
-version = "0.6.18"
-weakdeps = ["Adapt", "GPUArraysCore", "SparseArrays", "StaticArrays"]
+version = "0.7.2"
+weakdeps = ["Adapt", "GPUArraysCore", "KernelAbstractions", "LinearAlgebra", "SparseArrays", "StaticArrays"]
[deps.StructArrays.extensions]
StructArraysAdaptExt = "Adapt"
- StructArraysGPUArraysCoreExt = "GPUArraysCore"
+ StructArraysGPUArraysCoreExt = ["GPUArraysCore", "KernelAbstractions"]
+ StructArraysLinearAlgebraExt = "LinearAlgebra"
StructArraysSparseArraysExt = "SparseArrays"
StructArraysStaticArraysExt = "StaticArrays"
@@ -2634,6 +2983,24 @@ git-tree-sha1 = "159331b30e94d7b11379037feeb9b690950cace8"
uuid = "856f2bd8-1eba-4b0a-8007-ebc267875bd4"
version = "1.11.0"
+[[deps.StructUtils]]
+deps = ["Dates", "UUIDs"]
+git-tree-sha1 = "9297459be9e338e546f5c4bedb59b3b5674da7f1"
+uuid = "ec057cc2-7a8d-4b58-b3b3-92acb9f63b42"
+version = "2.6.2"
+
+ [deps.StructUtils.extensions]
+ StructUtilsMeasurementsExt = ["Measurements"]
+ StructUtilsTablesExt = ["Tables"]
+
+ [deps.StructUtils.weakdeps]
+ Measurements = "eff96d63-e80a-5855-80a2-b1b0885c5ab7"
+ Tables = "bd369af6-aec1-5ad0-b16a-f7cc5008161c"
+
+[[deps.StyledStrings]]
+uuid = "f489334b-da3d-4c2e-b8f0-e476e12c162b"
+version = "1.11.0"
+
[[deps.SuiteSparse]]
deps = ["Libdl", "LinearAlgebra", "Serialization", "SparseArrays"]
uuid = "4607b0f0-06f3-5cda-b6b1-a6196a1729e9"
@@ -2641,7 +3008,7 @@ uuid = "4607b0f0-06f3-5cda-b6b1-a6196a1729e9"
[[deps.SuiteSparse_jll]]
deps = ["Artifacts", "Libdl", "libblastrampoline_jll"]
uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c"
-version = "7.2.1+1"
+version = "7.7.0+0"
[[deps.TOML]]
deps = ["Dates"]
@@ -2656,15 +3023,15 @@ version = "1.0.1"
[[deps.Tables]]
deps = ["DataAPI", "DataValueInterfaces", "IteratorInterfaceExtensions", "OrderedCollections", "TableTraits"]
-git-tree-sha1 = "598cd7c1f68d1e205689b1c2fe65a9f85846f297"
+git-tree-sha1 = "f2c1efbc8f3a609aadf318094f8fc5204bdaf344"
uuid = "bd369af6-aec1-5ad0-b16a-f7cc5008161c"
-version = "1.12.0"
+version = "1.12.1"
[[deps.TabularDisplay]]
-deps = ["Formatting"]
-git-tree-sha1 = "ab1c4fe069f16cbb62bf4b39a0b9dab9c1699752"
+deps = ["Format"]
+git-tree-sha1 = "b6501c247f5950c234a9e496cfd9700a43d32ea6"
uuid = "3eeacb1d-13c2-54cc-9b18-30c86af3cadb"
-version = "1.2.0"
+version = "1.3.0"
[[deps.TaijaBase]]
git-tree-sha1 = "4076f60078b12095ca71a2c26e2e4515e3a6a5e5"
@@ -2673,9 +3040,9 @@ version = "1.2.3"
[[deps.TaijaData]]
deps = ["CSV", "CounterfactualExplanations", "DataAPI", "DataFrames", "Flux", "LazyArtifacts", "MLDatasets", "MLJBase", "MLJModels", "Random", "StatsBase"]
-git-tree-sha1 = "04fed01efa65478c9f55a35c27c12add47ffe49e"
+git-tree-sha1 = "510e4b12d3090309ca6bf9663822f5fb8dcf405a"
uuid = "9d524318-b4e6-4a65-86d2-b2b72d07866c"
-version = "1.0.0"
+version = "1.1.7"
[[deps.TaijaPlotting]]
deps = ["CategoricalArrays", "ConformalPrediction", "CounterfactualExplanations", "DataAPI", "Distributions", "LaplaceRedux", "LinearAlgebra", "MLJBase", "MLUtils", "MultivariateStats", "NaturalSort", "NearestNeighborModels", "OneHotArrays", "Plots", "RecipesBase", "Trapz"]
@@ -2697,17 +3064,18 @@ version = "0.1.1"
[[deps.Test]]
deps = ["InteractiveUtils", "Logging", "Random", "Serialization"]
uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
+version = "1.11.0"
[[deps.TestItems]]
-git-tree-sha1 = "8621ba2637b49748e2dc43ba3d84340be2938022"
+git-tree-sha1 = "42fd9023fef18b9b78c8343a4e2f3813ffbcefcb"
uuid = "1c621080-faea-4a02-84b6-bbd5e436b8fe"
-version = "0.1.1"
+version = "1.0.0"
[[deps.ThreadingUtilities]]
deps = ["ManualMemory"]
-git-tree-sha1 = "eda08f7e9818eb53661b3deb74e3159460dfbc27"
+git-tree-sha1 = "d969183d3d244b6c33796b5ed01ab97328f2db85"
uuid = "8290d209-cae3-49c0-8002-c8c24d57dab5"
-version = "0.5.2"
+version = "0.5.5"
[[deps.ThreadsX]]
deps = ["Accessors", "ArgCheck", "BangBang", "ConstructionBase", "InitialValues", "MicroCollections", "Referenceables", "SplittablesBase", "Transducers"]
@@ -2716,10 +3084,10 @@ uuid = "ac1d9e8a-700a-412c-b207-f0111f4b6c0d"
version = "0.1.12"
[[deps.TiffImages]]
-deps = ["ColorTypes", "DataStructures", "DocStringExtensions", "FileIO", "FixedPointNumbers", "IndirectArrays", "Inflate", "Mmap", "OffsetArrays", "PkgVersion", "ProgressMeter", "SIMD", "UUIDs"]
-git-tree-sha1 = "bc7fd5c91041f44636b2c134041f7e5263ce58ae"
+deps = ["ColorTypes", "DataStructures", "DocStringExtensions", "FileIO", "FixedPointNumbers", "IndirectArrays", "Inflate", "Mmap", "OffsetArrays", "PkgVersion", "PrecompileTools", "ProgressMeter", "SIMD", "UUIDs"]
+git-tree-sha1 = "98b9352a24cb6a2066f9ababcc6802de9aed8ad8"
uuid = "731e570b-9d59-4bfa-96dc-6df516fadf69"
-version = "0.10.0"
+version = "0.11.6"
[[deps.TiledIteration]]
deps = ["OffsetArrays", "StaticArrayInterface"]
@@ -2728,17 +3096,18 @@ uuid = "06e1c1a7-607b-532d-9fad-de7d9aa2abac"
version = "0.5.0"
[[deps.TranscodingStreams]]
-git-tree-sha1 = "e84b3a11b9bece70d14cce63406bbc79ed3464d2"
+git-tree-sha1 = "0c45878dcfdcfa8480052b6ab162cdd138781742"
uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa"
-version = "0.11.2"
+version = "0.11.3"
[[deps.Transducers]]
-deps = ["Accessors", "Adapt", "ArgCheck", "BangBang", "Baselet", "CompositionsBase", "ConstructionBase", "DefineSingletons", "Distributed", "InitialValues", "Logging", "Markdown", "MicroCollections", "Requires", "SplittablesBase", "Tables"]
-git-tree-sha1 = "5215a069867476fc8e3469602006b9670e68da23"
+deps = ["Accessors", "ArgCheck", "BangBang", "Baselet", "CompositionsBase", "ConstructionBase", "DefineSingletons", "Distributed", "InitialValues", "Logging", "Markdown", "MicroCollections", "SplittablesBase", "Tables"]
+git-tree-sha1 = "4aa1fdf6c1da74661f6f5d3edfd96648321dade9"
uuid = "28d57a85-8fef-5791-bfe6-a80928e7c999"
-version = "0.4.82"
+version = "0.4.85"
[deps.Transducers.extensions]
+ TransducersAdaptExt = "Adapt"
TransducersBlockArraysExt = "BlockArrays"
TransducersDataFramesExt = "DataFrames"
TransducersLazyArraysExt = "LazyArrays"
@@ -2746,6 +3115,7 @@ version = "0.4.82"
TransducersReferenceablesExt = "Referenceables"
[deps.Transducers.weakdeps]
+ Adapt = "79e6a3ab-5dfb-504d-930d-738a2a938a0e"
BlockArrays = "8e7c35d0-a365-5155-bbbb-fb81a777f24e"
DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0"
LazyArrays = "5078a376-72f3-5289-bfd5-ec5146d43c02"
@@ -2764,9 +3134,9 @@ version = "0.1.0"
[[deps.Tullio]]
deps = ["DiffRules", "LinearAlgebra", "Requires"]
-git-tree-sha1 = "6d476962ba4e435d7f4101a403b1d3d72afe72f3"
+git-tree-sha1 = "972698b132b9df8791ae74aa547268e977b55f68"
uuid = "bc48ee85-29a4-5162-ae0b-a64e1601d4bc"
-version = "0.3.7"
+version = "0.3.8"
[deps.Tullio.extensions]
TullioCUDAExt = "CUDA"
@@ -2781,13 +3151,14 @@ version = "0.3.7"
Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c"
[[deps.URIs]]
-git-tree-sha1 = "67db6cc7b3821e19ebe75791a9dd19c9b1188f2b"
+git-tree-sha1 = "bef26fb046d031353ef97a82e3fdb6afe7f21b1a"
uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4"
-version = "1.5.1"
+version = "1.6.1"
[[deps.UUIDs]]
deps = ["Random", "SHA"]
uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4"
+version = "1.11.0"
[[deps.UnPack]]
git-tree-sha1 = "387c1f73762231e86e0c9c5443ce3b4a0a9a0c2b"
@@ -2796,6 +3167,7 @@ version = "1.0.2"
[[deps.Unicode]]
uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5"
+version = "1.11.0"
[[deps.UnicodeFun]]
deps = ["REPL"]
@@ -2805,14 +3177,18 @@ version = "0.4.1"
[[deps.Unitful]]
deps = ["Dates", "LinearAlgebra", "Random"]
-git-tree-sha1 = "d95fe458f26209c66a187b1114df96fd70839efd"
+git-tree-sha1 = "c25751629f5baaa27fef307f96536db62e1d754e"
uuid = "1986cc42-f94f-5a68-af5c-568840ba703d"
-version = "1.21.0"
-weakdeps = ["ConstructionBase", "InverseFunctions"]
+version = "1.27.0"
+weakdeps = ["ConstructionBase", "ForwardDiff", "InverseFunctions", "LaTeXStrings", "Latexify", "NaNMath", "Printf"]
[deps.Unitful.extensions]
ConstructionBaseUnitfulExt = "ConstructionBase"
+ ForwardDiffExt = "ForwardDiff"
InverseFunctionsUnitfulExt = "InverseFunctions"
+ LatexifyExt = ["Latexify", "LaTeXStrings"]
+ NaNMathExt = "NaNMath"
+ PrintfExt = "Printf"
[[deps.UnitfulAtomic]]
deps = ["Unitful"]
@@ -2820,22 +3196,14 @@ git-tree-sha1 = "903be579194534af1c4b4778d1ace676ca042238"
uuid = "a7773ee8-282e-5fa2-be4e-bd808c38a91a"
version = "1.0.0"
-[[deps.UnitfulLatexify]]
-deps = ["LaTeXStrings", "Latexify", "Unitful"]
-git-tree-sha1 = "975c354fcd5f7e1ddcc1f1a23e6e091d99e99bc8"
-uuid = "45397f5d-5981-4c77-b2b3-fc36d6e9b728"
-version = "1.6.4"
-
[[deps.UnsafeAtomics]]
-git-tree-sha1 = "6331ac3440856ea1988316b46045303bef658278"
+git-tree-sha1 = "b13c4edda90890e5b04ba24e20a310fbe6f249ff"
uuid = "013be700-e6cd-48c3-b4a1-df204f14c38f"
-version = "0.2.1"
+version = "0.3.0"
+weakdeps = ["LLVM"]
-[[deps.UnsafeAtomicsLLVM]]
-deps = ["LLVM", "UnsafeAtomics"]
-git-tree-sha1 = "2d17fabcd17e67d7625ce9c531fb9f40b7c42ce4"
-uuid = "d80eeb9a-aca5-4d75-85e5-170c8b632249"
-version = "0.2.1"
+ [deps.UnsafeAtomics.extensions]
+ UnsafeAtomicsLLVM = ["LLVM"]
[[deps.Unzip]]
git-tree-sha1 = "ca0969166a028236229f63514992fc073799bb78"
@@ -2844,21 +3212,21 @@ version = "0.2.0"
[[deps.VectorizationBase]]
deps = ["ArrayInterface", "CPUSummary", "HostCPUFeatures", "IfElse", "LayoutPointers", "Libdl", "LinearAlgebra", "SIMDTypes", "Static", "StaticArrayInterface"]
-git-tree-sha1 = "e7f5b81c65eb858bed630fe006837b935518aca5"
+git-tree-sha1 = "d1d9a935a26c475ebffd54e9c7ad11627c43ea85"
uuid = "3d5dd08c-fd9d-11e8-17fa-ed2836048c2f"
-version = "0.21.70"
+version = "0.21.72"
+
+[[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"
+deps = ["Artifacts", "EpollShim_jll", "Expat_jll", "JLLWrappers", "Libdl", "Libffi_jll"]
+git-tree-sha1 = "96478df35bbc2f3e1e791bc7a3d0eeee559e60e9"
uuid = "a2964d1f-97da-50d4-b82a-358c7fce9d89"
-version = "1.21.0+1"
-
-[[deps.Wayland_protocols_jll]]
-deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
-git-tree-sha1 = "93f43ab61b16ddfb2fd3bb13b3ce241cafb0e6c9"
-uuid = "2381bf8a-dfd0-557d-9999-79630e7b1b91"
-version = "1.31.0+0"
+version = "1.24.0+0"
[[deps.WeakRefStrings]]
deps = ["DataAPI", "InlineStrings", "Parsers"]
@@ -2866,11 +3234,17 @@ git-tree-sha1 = "b1be2855ed9ed8eac54e5caff2afcdb442d52c23"
uuid = "ea10d353-3f73-51f8-a26c-33c1cb351aa5"
version = "1.4.2"
+[[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.WoodburyMatrices]]
deps = ["LinearAlgebra", "SparseArrays"]
-git-tree-sha1 = "c1a7aa6219628fcd757dede0ca95e245c5cd9511"
+git-tree-sha1 = "248a7031b3da79a127f14e5dc5f417e26f9f6db7"
uuid = "efce3f68-66dc-5838-9240-27a6d6f5f9b6"
-version = "1.0.0"
+version = "1.1.0"
[[deps.WorkerUtilities]]
git-tree-sha1 = "cd1659ba0d57b71a464a29e64dbc67cfe83d54e7"
@@ -2879,141 +3253,159 @@ version = "1.6.1"
[[deps.XML2_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Zlib_jll"]
-git-tree-sha1 = "1165b0443d0eca63ac1e32b8c0eb69ed2f4f8127"
+git-tree-sha1 = "80d3930c6347cfce7ccf96bd3bafdf079d9c0390"
uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a"
-version = "2.13.3+0"
+version = "2.13.9+0"
-[[deps.XSLT_jll]]
-deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgcrypt_jll", "Libgpg_error_jll", "Libiconv_jll", "XML2_jll", "Zlib_jll"]
-git-tree-sha1 = "a54ee957f4c86b526460a720dbc882fa5edcbefc"
-uuid = "aed1982a-8fda-507f-9586-7b0439959a61"
-version = "1.1.41+0"
+[[deps.XZ_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "9cce64c0fdd1960b597ba7ecda2950b5ed957438"
+uuid = "ffd25f8a-64ca-5728-b0f7-c24cf3aae800"
+version = "5.8.2+0"
+
+[[deps.Xorg_libICE_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "a3ea76ee3f4facd7a64684f9af25310825ee3668"
+uuid = "f67eecfb-183a-506d-b269-f58e52b52d7c"
+version = "1.1.2+0"
+
+[[deps.Xorg_libSM_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libICE_jll"]
+git-tree-sha1 = "9c7ad99c629a44f81e7799eb05ec2746abb5d588"
+uuid = "c834827a-8449-5923-a945-d239c165b7dd"
+version = "1.2.6+0"
[[deps.Xorg_libX11_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxcb_jll", "Xorg_xtrans_jll"]
-git-tree-sha1 = "afead5aba5aa507ad5a3bf01f58f82c8d1403495"
+git-tree-sha1 = "b5899b25d17bf1889d25906fb9deed5da0c15b3b"
uuid = "4f6342f7-b3d2-589e-9d20-edeb45f2b2bc"
-version = "1.8.6+0"
+version = "1.8.12+0"
[[deps.Xorg_libXau_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl"]
-git-tree-sha1 = "6035850dcc70518ca32f012e46015b9beeda49d8"
+git-tree-sha1 = "aa1261ebbac3ccc8d16558ae6799524c450ed16b"
uuid = "0c0b7dd1-d40b-584c-a123-a41640f87eec"
-version = "1.0.11+0"
+version = "1.0.13+0"
[[deps.Xorg_libXcursor_jll]]
-deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXfixes_jll", "Xorg_libXrender_jll"]
-git-tree-sha1 = "12e0eb3bc634fa2080c1c37fccf56f7c22989afd"
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libXfixes_jll", "Xorg_libXrender_jll"]
+git-tree-sha1 = "6c74ca84bbabc18c4547014765d194ff0b4dc9da"
uuid = "935fb764-8cf2-53bf-bb30-45bb1f8bf724"
-version = "1.2.0+4"
+version = "1.2.4+0"
[[deps.Xorg_libXdmcp_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl"]
-git-tree-sha1 = "34d526d318358a859d7de23da945578e8e8727b7"
+git-tree-sha1 = "52858d64353db33a56e13c341d7bf44cd0d7b309"
uuid = "a3789734-cfe1-5b06-b2d0-1dd0d9d62d05"
-version = "1.1.4+0"
+version = "1.1.6+0"
[[deps.Xorg_libXext_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"]
-git-tree-sha1 = "d2d1a5c49fae4ba39983f63de6afcbea47194e85"
+git-tree-sha1 = "a4c0ee07ad36bf8bbce1c3bb52d21fb1e0b987fb"
uuid = "1082639a-0dae-5f34-9b06-72781eeb8cb3"
-version = "1.3.6+0"
+version = "1.3.7+0"
[[deps.Xorg_libXfixes_jll]]
-deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll"]
-git-tree-sha1 = "0e0dc7431e7a0587559f9294aeec269471c991a4"
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"]
+git-tree-sha1 = "75e00946e43621e09d431d9b95818ee751e6b2ef"
uuid = "d091e8ba-531a-589c-9de9-94069b037ed8"
-version = "5.0.3+4"
+version = "6.0.2+0"
[[deps.Xorg_libXi_jll]]
-deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXext_jll", "Xorg_libXfixes_jll"]
-git-tree-sha1 = "89b52bc2160aadc84d707093930ef0bffa641246"
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libXext_jll", "Xorg_libXfixes_jll"]
+git-tree-sha1 = "a376af5c7ae60d29825164db40787f15c80c7c54"
uuid = "a51aa0fd-4e3c-5386-b890-e753decda492"
-version = "1.7.10+4"
+version = "1.8.3+0"
[[deps.Xorg_libXinerama_jll]]
-deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXext_jll"]
-git-tree-sha1 = "26be8b1c342929259317d8b9f7b53bf2bb73b123"
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libXext_jll"]
+git-tree-sha1 = "a5bc75478d323358a90dc36766f3c99ba7feb024"
uuid = "d1454406-59df-5ea1-beac-c340f2130bc3"
-version = "1.1.4+4"
+version = "1.1.6+0"
[[deps.Xorg_libXrandr_jll]]
-deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXext_jll", "Xorg_libXrender_jll"]
-git-tree-sha1 = "34cea83cb726fb58f325887bf0612c6b3fb17631"
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libXext_jll", "Xorg_libXrender_jll"]
+git-tree-sha1 = "aff463c82a773cb86061bce8d53a0d976854923e"
uuid = "ec84b674-ba8e-5d96-8ba1-2a689ba10484"
-version = "1.5.2+4"
+version = "1.5.5+0"
[[deps.Xorg_libXrender_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"]
-git-tree-sha1 = "47e45cd78224c53109495b3e324df0c37bb61fbe"
+git-tree-sha1 = "7ed9347888fac59a618302ee38216dd0379c480d"
uuid = "ea2f1a96-1ddc-540d-b46f-429655e07cfa"
-version = "0.9.11+0"
+version = "0.9.12+0"
-[[deps.Xorg_libpthread_stubs_jll]]
-deps = ["Artifacts", "JLLWrappers", "Libdl"]
-git-tree-sha1 = "8fdda4c692503d44d04a0603d9ac0982054635f9"
-uuid = "14d82f49-176c-5ed1-bb49-ad3f5cbd8c74"
-version = "0.1.1+0"
+[[deps.Xorg_libpciaccess_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Zlib_jll"]
+git-tree-sha1 = "4909eb8f1cbf6bd4b1c30dd18b2ead9019ef2fad"
+uuid = "a65dc6b1-eb27-53a1-bb3e-dea574b5389e"
+version = "0.18.1+0"
[[deps.Xorg_libxcb_jll]]
-deps = ["Artifacts", "JLLWrappers", "Libdl", "XSLT_jll", "Xorg_libXau_jll", "Xorg_libXdmcp_jll", "Xorg_libpthread_stubs_jll"]
-git-tree-sha1 = "bcd466676fef0878338c61e655629fa7bbc69d8e"
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libXau_jll", "Xorg_libXdmcp_jll"]
+git-tree-sha1 = "bfcaf7ec088eaba362093393fe11aa141fa15422"
uuid = "c7cfdc94-dc32-55de-ac96-5a1b8d977c5b"
-version = "1.17.0+0"
+version = "1.17.1+0"
[[deps.Xorg_libxkbfile_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"]
-git-tree-sha1 = "730eeca102434283c50ccf7d1ecdadf521a765a4"
+git-tree-sha1 = "e3150c7400c41e207012b41659591f083f3ef795"
uuid = "cc61e674-0454-545c-8b26-ed2c68acab7a"
-version = "1.1.2+0"
+version = "1.1.3+0"
+
+[[deps.Xorg_xcb_util_cursor_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_xcb_util_image_jll", "Xorg_xcb_util_jll", "Xorg_xcb_util_renderutil_jll"]
+git-tree-sha1 = "9750dc53819eba4e9a20be42349a6d3b86c7cdf8"
+uuid = "e920d4aa-a673-5f3a-b3d7-f755a4d47c43"
+version = "0.1.6+0"
[[deps.Xorg_xcb_util_image_jll]]
-deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"]
-git-tree-sha1 = "0fab0a40349ba1cba2c1da699243396ff8e94b97"
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_xcb_util_jll"]
+git-tree-sha1 = "f4fc02e384b74418679983a97385644b67e1263b"
uuid = "12413925-8142-5f55-bb0e-6d7ca50bb09b"
-version = "0.4.0+1"
+version = "0.4.1+0"
[[deps.Xorg_xcb_util_jll]]
-deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libxcb_jll"]
-git-tree-sha1 = "e7fd7b2881fa2eaa72717420894d3938177862d1"
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxcb_jll"]
+git-tree-sha1 = "68da27247e7d8d8dafd1fcf0c3654ad6506f5f97"
uuid = "2def613f-5ad1-5310-b15b-b15d46f528f5"
-version = "0.4.0+1"
+version = "0.4.1+0"
[[deps.Xorg_xcb_util_keysyms_jll]]
-deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"]
-git-tree-sha1 = "d1151e2c45a544f32441a567d1690e701ec89b00"
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_xcb_util_jll"]
+git-tree-sha1 = "44ec54b0e2acd408b0fb361e1e9244c60c9c3dd4"
uuid = "975044d2-76e6-5fbe-bf08-97ce7c6574c7"
-version = "0.4.0+1"
+version = "0.4.1+0"
[[deps.Xorg_xcb_util_renderutil_jll]]
-deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"]
-git-tree-sha1 = "dfd7a8f38d4613b6a575253b3174dd991ca6183e"
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_xcb_util_jll"]
+git-tree-sha1 = "5b0263b6d080716a02544c55fdff2c8d7f9a16a0"
uuid = "0d47668e-0667-5a69-a72c-f761630bfb7e"
-version = "0.3.9+1"
+version = "0.3.10+0"
[[deps.Xorg_xcb_util_wm_jll]]
-deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"]
-git-tree-sha1 = "e78d10aab01a4a154142c5006ed44fd9e8e31b67"
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_xcb_util_jll"]
+git-tree-sha1 = "f233c83cad1fa0e70b7771e0e21b061a116f2763"
uuid = "c22f9ab0-d5fe-5066-847c-f4bb1cd4e361"
-version = "0.4.1+1"
+version = "0.4.2+0"
[[deps.Xorg_xkbcomp_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxkbfile_jll"]
-git-tree-sha1 = "330f955bc41bb8f5270a369c473fc4a5a4e4d3cb"
+git-tree-sha1 = "801a858fc9fb90c11ffddee1801bb06a738bda9b"
uuid = "35661453-b289-5fab-8a00-3d9160c6a3a4"
-version = "1.4.6+0"
+version = "1.4.7+0"
[[deps.Xorg_xkeyboard_config_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_xkbcomp_jll"]
-git-tree-sha1 = "691634e5453ad362044e2ad653e79f3ee3bb98c3"
+git-tree-sha1 = "00af7ebdc563c9217ecc67776d1bbf037dbcebf4"
uuid = "33bec58e-1273-512f-9401-5d533626f822"
-version = "2.39.0+0"
+version = "2.44.0+0"
[[deps.Xorg_xtrans_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl"]
-git-tree-sha1 = "e92a1a012a10506618f10b7047e478403a046c77"
+git-tree-sha1 = "a63799ff68005991f9d9491b6e95bd3478d783cb"
uuid = "c5fb5394-a638-5e4d-96e5-b29de1b5cf10"
-version = "1.5.0+0"
+version = "1.6.0+0"
[[deps.ZipFile]]
deps = ["Libdl", "Printf", "Zlib_jll"]
@@ -3028,15 +3420,15 @@ version = "1.2.13+1"
[[deps.Zstd_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl"]
-git-tree-sha1 = "e678132f07ddb5bfa46857f0d7620fb9be675d3b"
+git-tree-sha1 = "446b23e73536f84e8037f5dce465e92275f6a308"
uuid = "3161d3a3-bdf6-5164-811a-617609db77b4"
-version = "1.5.6+0"
+version = "1.5.7+1"
[[deps.Zygote]]
deps = ["AbstractFFTs", "ChainRules", "ChainRulesCore", "DiffRules", "Distributed", "FillArrays", "ForwardDiff", "GPUArrays", "GPUArraysCore", "IRTools", "InteractiveUtils", "LinearAlgebra", "LogExpFunctions", "MacroTools", "NaNMath", "PrecompileTools", "Random", "Requires", "SparseArrays", "SpecialFunctions", "Statistics", "ZygoteRules"]
-git-tree-sha1 = "19c586905e78a26f7e4e97f81716057bd6b1bc54"
+git-tree-sha1 = "8462a20f0fd85b4ef4a1b7310d33e7475d2bb14f"
uuid = "e88e6eb3-aa80-5325-afca-941959d7151f"
-version = "0.6.70"
+version = "0.6.77"
[deps.Zygote.extensions]
ZygoteColorsExt = "Colors"
@@ -3050,27 +3442,33 @@ version = "0.6.70"
[[deps.ZygoteRules]]
deps = ["ChainRulesCore", "MacroTools"]
-git-tree-sha1 = "27798139afc0a2afa7b1824c206d5e87ea587a00"
+git-tree-sha1 = "434b3de333c75fc446aa0d19fc394edafd07ab08"
uuid = "700de1a5-db45-46bc-99cf-38207098b444"
-version = "0.2.5"
+version = "0.2.7"
+
+[[deps.eudev_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "c3b0e6196d50eab0c5ed34021aaa0bb463489510"
+uuid = "35ca27e7-8b34-5b7f-bca9-bdc33f59eb06"
+version = "3.2.14+0"
[[deps.fzf_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl"]
-git-tree-sha1 = "936081b536ae4aa65415d869287d43ef3cb576b2"
+git-tree-sha1 = "b6a34e0e0960190ac2a4363a1bd003504772d631"
uuid = "214eeab7-80f7-51ab-84ad-2988db7cef09"
-version = "0.53.0+0"
+version = "0.61.1+0"
[[deps.gdk_pixbuf_jll]]
-deps = ["Artifacts", "Glib_jll", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Libtiff_jll", "Pkg", "Xorg_libX11_jll", "libpng_jll"]
-git-tree-sha1 = "e9190f9fb03f9c3b15b9fb0c380b0d57a3c8ea39"
+deps = ["Artifacts", "Glib_jll", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Libtiff_jll", "Xorg_libX11_jll", "libpng_jll"]
+git-tree-sha1 = "895f21b699121d1a57ecac57e65a852caf569254"
uuid = "da03df04-f53b-5353-a52f-6a8b0620ced0"
-version = "2.42.8+0"
+version = "2.42.13+0"
[[deps.ghr_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl"]
-git-tree-sha1 = "baa52e2507b7ed34212bd6de76ae65e0c17c7218"
+git-tree-sha1 = "77e7480ee7097e0c2dd4bd122a652a126faa60c0"
uuid = "07c12ed4-43bc-5495-8a2a-d5838ef8d533"
-version = "0.16.2+0"
+version = "0.17.0+0"
[[deps.isoband_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
@@ -3078,17 +3476,23 @@ git-tree-sha1 = "51b5eeb3f98367157a7a12a1fb0aa5328946c03c"
uuid = "9a68df92-36a6-505f-a73e-abb412b6bfb4"
version = "0.2.3+0"
+[[deps.libaec_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "1aa23f01927b2dac46db77a56b31088feee0a491"
+uuid = "477f73a3-ac25-53e9-8cc3-50b2fa2566f0"
+version = "1.1.4+0"
+
[[deps.libaom_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl"]
-git-tree-sha1 = "1827acba325fdcdf1d2647fc8d5301dd9ba43a9d"
+git-tree-sha1 = "371cc681c00a3ccc3fbc5c0fb91f58ba9bec1ecf"
uuid = "a4ae2306-e953-59d6-aa16-d00cac43593b"
-version = "3.9.0+0"
+version = "3.13.1+0"
[[deps.libass_jll]]
deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl", "Zlib_jll"]
-git-tree-sha1 = "e17c115d55c5fbb7e52ebedb427a0dca79d4484e"
+git-tree-sha1 = "125eedcb0a4a0bba65b657251ce1d27c8714e9d6"
uuid = "0ac62f75-1d6f-5e53-bd7c-93b484bb37c0"
-version = "0.15.2+0"
+version = "0.17.4+0"
[[deps.libblastrampoline_jll]]
deps = ["Artifacts", "Libdl"]
@@ -3101,40 +3505,70 @@ git-tree-sha1 = "9bf7903af251d2050b467f76bdbe57ce541f7f4f"
uuid = "1183f4f0-6f2a-5f1a-908b-139f9cdfea6f"
version = "0.2.2+0"
+[[deps.libevdev_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "56d643b57b188d30cccc25e331d416d3d358e557"
+uuid = "2db6ffa8-e38f-5e21-84af-90c45d0032cc"
+version = "1.13.4+0"
+
[[deps.libfdk_aac_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl"]
-git-tree-sha1 = "8a22cf860a7d27e4f3498a0fe0811a7957badb38"
+git-tree-sha1 = "646634dd19587a56ee2f1199563ec056c5f228df"
uuid = "f638f0a6-7fb0-5443-88ba-1cc74229b280"
-version = "2.0.3+0"
+version = "2.0.4+0"
+
+[[deps.libinput_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "eudev_jll", "libevdev_jll", "mtdev_jll"]
+git-tree-sha1 = "91d05d7f4a9f67205bd6cf395e488009fe85b499"
+uuid = "36db933b-70db-51c0-b978-0f229ee0e533"
+version = "1.28.1+0"
[[deps.libpng_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Zlib_jll"]
-git-tree-sha1 = "d7015d2e18a5fd9a4f47de711837e980519781a4"
+git-tree-sha1 = "6ab498eaf50e0495f89e7a5b582816e2efb95f64"
uuid = "b53b4c65-9356-5827-b1ea-8c7a1a84506f"
-version = "1.6.43+1"
+version = "1.6.54+0"
[[deps.libsixel_jll]]
-deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Pkg", "libpng_jll"]
-git-tree-sha1 = "d4f63314c8aa1e48cd22aa0c17ed76cd1ae48c3c"
+deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "Libdl", "libpng_jll"]
+git-tree-sha1 = "c1733e347283df07689d71d61e14be986e49e47a"
uuid = "075b6546-f08a-558a-be8f-8157d0f608a5"
-version = "1.10.3+0"
+version = "1.10.5+0"
[[deps.libvorbis_jll]]
-deps = ["Artifacts", "JLLWrappers", "Libdl", "Ogg_jll", "Pkg"]
-git-tree-sha1 = "490376214c4721cdaca654041f635213c6165cb3"
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Ogg_jll"]
+git-tree-sha1 = "11e1772e7f3cc987e9d3de991dd4f6b2602663a5"
uuid = "f27f6e37-5d2b-51aa-960f-b287f2bc3b7a"
-version = "1.3.7+2"
+version = "1.3.8+0"
+
+[[deps.libwebp_jll]]
+deps = ["Artifacts", "Giflib_jll", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Libglvnd_jll", "Libtiff_jll", "libpng_jll"]
+git-tree-sha1 = "4e4282c4d846e11dce56d74fa8040130b7a95cb3"
+uuid = "c5f90fcd-3b7e-5836-afba-fc50a0988cb2"
+version = "1.6.0+0"
+
+[[deps.libzip_jll]]
+deps = ["Artifacts", "Bzip2_jll", "JLLWrappers", "Libdl", "OpenSSL_jll", "XZ_jll", "Zlib_jll", "Zstd_jll"]
+git-tree-sha1 = "86addc139bca85fdf9e7741e10977c45785727b7"
+uuid = "337d8026-41b4-5cde-a456-74a10e5b31d1"
+version = "1.11.3+0"
+
+[[deps.mtdev_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "b4d631fd51f2e9cdd93724ae25b2efc198b059b1"
+uuid = "009596ad-96f7-51b1-9f1b-5ce2d5e8a71e"
+version = "1.1.7+0"
[[deps.nghttp2_jll]]
deps = ["Artifacts", "Libdl"]
uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d"
-version = "1.52.0+1"
+version = "1.59.0+0"
[[deps.oneTBB_jll]]
-deps = ["Artifacts", "JLLWrappers", "Libdl"]
-git-tree-sha1 = "7d0ea0f4895ef2f5cb83645fa689e52cb55cf493"
+deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl"]
+git-tree-sha1 = "1350188a69a6e46f799d3945beef36435ed7262f"
uuid = "1317d2d5-d96f-522e-a858-c73665f53c3e"
-version = "2021.12.0+0"
+version = "2022.0.0+1"
[[deps.p7zip_jll]]
deps = ["Artifacts", "Libdl"]
@@ -3142,19 +3576,19 @@ uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0"
version = "17.4.0+2"
[[deps.x264_jll]]
-deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
-git-tree-sha1 = "4fea590b89e6ec504593146bf8b988b2c00922b2"
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "14cc7083fc6dff3cc44f2bc435ee96d06ed79aa7"
uuid = "1270edf5-f2f9-52d2-97e9-ab00b5d0237a"
-version = "2021.5.5+0"
+version = "10164.0.1+0"
[[deps.x265_jll]]
-deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
-git-tree-sha1 = "ee567a171cce03570d77ad3a43e90218e38937a9"
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "e7b67590c14d487e734dcb925924c5dc43ec85f3"
uuid = "dfaa095f-4041-5dcd-9319-2fabd8486b76"
-version = "3.5.0+0"
+version = "4.1.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"
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxcb_jll", "Xorg_xkeyboard_config_jll"]
+git-tree-sha1 = "a1fc6507a40bf504527d0d4067d718f8e179b2b8"
uuid = "d8fb68d0-12a3-5cfd-a85a-d49703b185fd"
-version = "1.4.1+1"
+version = "1.13.0+0"
diff --git a/dev/logo/logo.jl b/dev/logo/logo.jl
index f624816ff..994115bad 100644
--- a/dev/logo/logo.jl
+++ b/dev/logo/logo.jl
@@ -3,7 +3,6 @@ Pkg.activate("dev");
using Colors
using CounterfactualExplanations
-using CounterfactualExplanations.Data
using CounterfactualExplanations.Models
using Distributions
using EasyFit
@@ -12,6 +11,7 @@ using LinearAlgebra
using Luxor
using MLJBase
using StatsBase: sample
+using TaijaData
using Random
julia_colors = Dict(
@@ -66,8 +66,8 @@ function get_data(
yrange = range(ylims[1] - _zoom, ylims[2] + _zoom; length=n_range)
target_idx = get_target_index(counterfactual_data.y_levels, target)
yhat = [
- predict_proba(M, counterfactual_data, [x, y])[target_idx] for x in xrange,
- y in yrange
+ predict_proba(M, counterfactual_data, [x, y])[target_idx] for
+ x in xrange, y in yrange
]
db_points = findall(0.0 .< yhat .- 0.5 .< 0.1)
db_points = map(p -> [xrange[p[1]], yrange[p[2]]], db_points)
@@ -80,7 +80,10 @@ function get_data(
# Counterfactual:
T = isnothing(n_steps) ? 100 : n_steps
- ce = generate_counterfactual(factual, target, counterfactual_data, M, generator; T=T)
+ conv = CounterfactualExplanations.Convergence.MaxIterConvergence(T)
+ ce = generate_counterfactual(
+ factual, target, counterfactual_data, M, generator; convergence=conv
+ )
return x, y, M, ce, db_points
end
@@ -107,6 +110,7 @@ function logo_picture(;
border_stroke_size=db_stroke_size,
n_steps=nothing,
smooth=4,
+ draw_frame=true, # New parameter
)
# Setup
@@ -115,7 +119,7 @@ function logo_picture(;
Random.seed!(seed)
# Background
- if bg
+ if bg && draw_frame # Only draw frame if draw_frame is true
circle(O, frame_size//2, :clip)
setcolor(bg_color)
box(Point(0, 0), frame_size, frame_size; action=:fill)
@@ -173,15 +177,21 @@ function logo_picture(;
end
function draw_small_logo(
- filename="docs/src/assets/logo.svg", width=500; bg_color="transparent", kwrgs...
+ filename="docs/src/assets/logo.svg";
+ width=500,
+ height=nothing, # New parameter for custom height
+ bg_color="transparent",
+ kwrgs...,
)
- frame_size = width
- Drawing(frame_size, frame_size, filename)
+ frame_width = width
+ frame_height = isnothing(height) ? width : height # Use width if height not specified
+
+ Drawing(frame_width, frame_height, filename)
if !isnothing(bg_color)
background(bg_color)
end
origin()
- logo_picture(; kwrgs...)
+ logo_picture(; frame_size=frame_width, kwrgs...)
finish()
return preview()
end
@@ -222,17 +232,27 @@ function draw_wide_logo(
font_fill=bg_color,
font_color=Luxor.julia_blue,
bg_color="transparent",
+ include_logo=true,
+ heigh_scale=2.4,
picture_kwargs...,
)
# Setup:
- height = Int(round(font_size * 2.4))
+ height = Int(round(font_size * heigh_scale))
fontsize(font_size)
fontface(font_family)
strs = split(_pkg_name)
text_col_width = Int(round(maximum(map(str -> textextents(str)[3], strs)) * 1.05))
- width = Int(round(height + text_col_width))
- cw = [height, text_col_width]
+
+ # Adjust width based on whether logo is included
+ if include_logo
+ width = Int(round(height + text_col_width))
+ cw = [height, text_col_width]
+ else
+ width = text_col_width
+ cw = [text_col_width]
+ end
+
cells = Luxor.Table(height, cw)
ms = Int(round(height / 10))
db_stroke_size = Int(round(height / 50))
@@ -241,24 +261,28 @@ function draw_wide_logo(
origin()
background(bg_color)
- # Picture:
- @layer begin
- Luxor.translate(cells[1])
- logo_picture(;
- frame_size=height,
- margin=0.1,
- ms=ms,
- db_stroke_size=db_stroke_size,
- picture_kwargs...,
- )
+ # Picture (only if include_logo is true):
+ if include_logo
+ @layer begin
+ Luxor.translate(cells[1])
+ logo_picture(;
+ frame_size=height,
+ margin=0.1,
+ ms=ms,
+ db_stroke_size=db_stroke_size,
+ picture_kwargs...,
+ )
+ end
end
# Text:
@layer begin
- Luxor.translate(cells[2])
+ # Translate to appropriate cell (1 if no logo, 2 if logo included)
+ cell_idx = include_logo ? 2 : 1
+ Luxor.translate(cells[cell_idx])
fontsize(font_size)
fontface(font_family)
- tiles = Tiler(cells.colwidths[2], height, length(strs), 1)
+ tiles = Tiler(cells.colwidths[cell_idx], height, length(strs), 1)
for (pos, n) in tiles
@layer begin
Luxor.translate(pos)
@@ -285,8 +309,24 @@ picture_kwargs = (
cluster_std=0.1,
clip_border=true,
m_alpha=0.2,
- generator=GravitationalGenerator(; decision_threshold=0.95, opt=Descent(0.005)),
+ generator=GravitationalGenerator(; opt=Descent(0.005)),
)
draw_small_logo(; picture_kwargs...)
draw_wide_logo(; picture_kwargs...)
+
+# Thesis cover art:
+draw_wide_logo("text.png"; picture_kwargs..., font_size=300, include_logo=false)
+draw_small_logo("logo.png", 2000; picture_kwargs..., seed=123, ms=100)
+draw_small_logo(
+ "logo_wide.png";
+ width=2000,
+ height=350,
+ draw_frame=false,
+ bg_color="transparent",
+ picture_kwargs...,
+ ms=20,
+ ndots=70,
+ seed=280393,
+ db_stroke_size=10,
+)
diff --git a/docs/Project.toml b/docs/Project.toml
index 69e90195e..ba6b66d90 100755
--- a/docs/Project.toml
+++ b/docs/Project.toml
@@ -8,11 +8,18 @@ CondaPkg = "992eb4ea-22a4-4c89-a5bb-47a3300528ab"
CounterfactualExplanations = "2f13d31b-18db-44c1-bc43-ebaf2cff0be0"
DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0"
DecisionTree = "7806a523-6efd-50cb-b5f6-3fa6f1930dbb"
+DifferentiationInterface = "a0c0ee7d-e4b9-4e03-894e-1c5f64a51d63"
Documenter = "e30172f5-a6a5-5a46-863b-614d45cd2de4"
EnergySamplers = "f446124b-5d5e-4171-a6dd-a1d99768d3ce"
+Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9"
+FastDifferentiation = "eb9bf01b-bf85-4b60-bf87-ee5de06c00be"
FeatureTransforms = "8fd68953-04b8-4117-ac19-158bf6de9782"
+FiniteDiff = "6a86dc24-6348-571c-b903-95158fe2bd41"
+FiniteDifferences = "26cc04aa-876d-5657-8c51-4c34ba976000"
Flux = "587475ba-b771-5e3f-ad9e-33799f191a9c"
+ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210"
Functors = "d9f16b24-f501-4c13-a1f2-28368ffc5196"
+GTPSA = "b27dd330-f138-47c5-815b-40db9dd9b6e8"
ImageCore = "a09fc81d-aa75-5fe9-8630-4744c3626534"
ImageIO = "82e4d734-157c-48bb-816b-45c225c6df19"
ImageMagick = "6218d12a-5da1-5696-b52f-db25d2ecc6d1"
@@ -26,7 +33,7 @@ Logging = "56ddb016-857b-54e1-b83d-db4d58db5568"
MLDatasets = "eb30cadb-4394-5ae3-aed4-317e484a6458"
MLJBase = "a7f614a8-145f-11e9-1d2a-a57a1082229d"
MLJFlux = "094fc8d1-fd35-5302-93ea-dabda2abf845"
-MLJModels = "d491faf4-2d78-11e9-2867-c94bc002c0b7"
+MLJTransforms = "23777cdb-d90c-4eb0-a694-7c2b83d5c1d6"
MLUtils = "f1d291b0-491e-4a28-83b9-f70985020b54"
MPI = "da04e1cc-30fd-572f-bb4f-1f8673147195"
Measures = "442fdcdd-2543-5da2-b0f3-8c86c306513e"
@@ -36,9 +43,12 @@ PlotThemes = "ccf2f8ad-2431-5c83-bf29-c5338b663b6a"
Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80"
Pluto = "c3e4b0f8-55cb-11ea-2926-15256bba5781"
PlutoUI = "7f904dfe-b85e-4ff6-b463-dae2292396a8"
+PolyesterForwardDiff = "98d1487c-24ca-40b6-b7ab-df2af84e126b"
ProgressMeter = "92933f4c-e287-5a05-a399-4b506db050ca"
PythonCall = "6099a3de-0909-46bc-b1f4-468b9a2dfc0d"
+ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267"
StatsBase = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91"
+Symbolics = "0c5d862f-8b57-4792-8d23-62f2024744c7"
Tables = "bd369af6-aec1-5ad0-b16a-f7cc5008161c"
TaijaBase = "10284c91-9f28-4c9a-abbf-ee43576dfff6"
TaijaData = "9d524318-b4e6-4a65-86d2-b2b72d07866c"
diff --git a/docs/setup_docs.jl b/docs/setup_docs.jl
index 648e5a67d..c8faf6d41 100644
--- a/docs/setup_docs.jl
+++ b/docs/setup_docs.jl
@@ -20,14 +20,12 @@ setup_docs = quote
using MLDatasets
using MLDatasets: convert2image
using MLJBase
- using MLJModels: OneHotEncoder
+ using MLJTransforms: OneHotEncoder
using Plots
using Random
using StatsBase
using Tables
using TaijaData
- using TaijaParallel
- using TaijaParallel: @with_parallelizer
using TaijaPlotting: animate_path
using TaijaInteroperability
using TaijaData
diff --git a/docs/src/assets/logo.svg b/docs/src/assets/logo.svg
index 5b999557d..b5a0c5a45 100644
--- a/docs/src/assets/logo.svg
+++ b/docs/src/assets/logo.svg
@@ -1,883 +1,1754 @@
-
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
+
-
-
-
+
+
+
diff --git a/docs/src/assets/wide_logo.png b/docs/src/assets/wide_logo.png
index 721f8afd7..e1f6d71a2 100644
Binary files a/docs/src/assets/wide_logo.png and b/docs/src/assets/wide_logo.png differ
diff --git a/docs/src/explanation/evaluation/faithfulness.qmd b/docs/src/explanation/evaluation/faithfulness.qmd
index f7ce6d89a..0a81128ca 100644
--- a/docs/src/explanation/evaluation/faithfulness.qmd
+++ b/docs/src/explanation/evaluation/faithfulness.qmd
@@ -40,8 +40,9 @@ In @altmeyer2024faithful, we defined two sample-based metrics for plausibility a
Below we generate a simple synthetic dataset with two output classes, both Gaussian clusters with different centers. We then train a joint energy-based model (JEM) using Taija's [JointEnergyModels.jl](https://github.com/JuliaTrustworthyAI/JointEnergyModels.jl) package to both discriminate between output classes and generate inputs.
```{julia}
-n_obs = 1000
-X, y = TaijaData.load_blobs(n_obs; cluster_std=0.1, center_box=(-1. => 1.))
+n_obs = 3000
+# X, y = TaijaData.load_blobs(n_obs; cluster_std=0.1, center_box=(-1. => 1.))
+X, y = TaijaData.load_linearly_separable(n_obs)
data = CounterfactualData(X, y)
n_hidden = 16
diff --git a/ext/DecisionTreeExt/feature_tweak/utils.jl b/ext/DecisionTreeExt/feature_tweak/utils.jl
index 96d6c5edd..c8dbfb10e 100644
--- a/ext/DecisionTreeExt/feature_tweak/utils.jl
+++ b/ext/DecisionTreeExt/feature_tweak/utils.jl
@@ -12,7 +12,8 @@ Calculates the penalty for the proposed feature tweak.
function calculate_delta(ce::AbstractCounterfactualExplanation)
penalty = ce.generator.penalty
penalty_functions = penalty isa PenaltyOrFun ? [penalty] : penalty
- delta = sum([p(ce) for p in penalty_functions])
+ cf = CounterfactualExplanations.decode_state(ce)
+ delta = sum([p(cf, ce) for p in penalty_functions])
return delta
end
diff --git a/ext/JEMExt/jem.jl b/ext/JEMExt/jem.jl
index c77cd6770..7e3ba8418 100644
--- a/ext/JEMExt/jem.jl
+++ b/ext/JEMExt/jem.jl
@@ -10,7 +10,7 @@ using TaijaBase: TaijaBase
model::JointEnergyModels.JointEnergyClassifier; likelihood::Symbol=:classification_multi
)
-Outer constructor for a neural network with Laplace Approximation from `LaplaceRedux.jl`.
+Outer constructor for a neural network with JointEnergyClassifier from `JointEnergyModels.jl`.
"""
function CounterfactualExplanations.JEM(
model::JointEnergyModels.JointEnergyClassifier; likelihood::Symbol=:classification_multi
diff --git a/ext/LaplaceReduxExt/laplace_redux.jl b/ext/LaplaceReduxExt/laplace_redux.jl
index be7895c97..a7f706c66 100644
--- a/ext/LaplaceReduxExt/laplace_redux.jl
+++ b/ext/LaplaceReduxExt/laplace_redux.jl
@@ -101,6 +101,8 @@ end
Predicts the probabilities of the classes for the input data `X` using the model `M`.
"""
-Models.probs(
+function Models.probs(
M::Models.Model, type::CounterfactualExplanations.LaplaceReduxModel, X::AbstractArray
-) = LaplaceRedux.predict(M.fitresult(), X; predict_proba=true)
+)
+ LaplaceRedux.predict(M.fitresult(), X; predict_proba=true)
+end
diff --git a/src/CounterfactualExplanations.jl b/src/CounterfactualExplanations.jl
index ed02ff89d..e8f6ef5d1 100755
--- a/src/CounterfactualExplanations.jl
+++ b/src/CounterfactualExplanations.jl
@@ -30,6 +30,7 @@ include("global_utils.jl")
export RawTargetType, EncodedTargetType, RawOutputArrayType, EncodedOutputArrayType
export OutputEncoder
export get_target_index
+export get_global_ad_backend, set_global_ad_backend
# Error messages:
include("errors.jl")
@@ -47,6 +48,7 @@ include("data_preprocessing/DataPreprocessing.jl")
using .DataPreprocessing
export CounterfactualData,
select_factual, apply_domain_constraints, OutputEncoder, transformable_features
+export mutability_constraints, mutability_constraints!
### Models
# ℳ[𝒟] : x ↦ y
@@ -79,13 +81,15 @@ using .Generators
export AbstractGradientBasedGenerator
export AbstractNonGradientBasedGenerator
export ClaPROARGenerator
+export DiCEGenerator
export ECCoGenerator
export FeatureTweakGenerator
export GenericGenerator
export GravitationalGenerator
export GreedyGenerator
+export ProbeGenerator
export REVISEGenerator
-export DiCEGenerator
+export TCRExGenerator
export WachterGenerator
export generator_catalogue
export generate_perturbations
@@ -98,6 +102,7 @@ include("counterfactuals/Counterfactuals.jl")
export CounterfactualExplanation, FlattenedCE
export generate_counterfactual
export total_steps, converged, terminated, path, target_probs
+export num_counterfactuals
export animate_path
export flatten, unflatten, FlattenedCE
export target_encoded
diff --git a/src/base_types.jl b/src/base_types.jl
index 3513daed6..c93ac5c7f 100644
--- a/src/base_types.jl
+++ b/src/base_types.jl
@@ -28,3 +28,7 @@ abstract type AbstractPenalty <: AbstractMeasure end
Base.broadcastable(pen::AbstractPenalty) = Ref(pen)
const PenaltyOrFun = Union{Function,AbstractPenalty}
+
+flatten_penalty(pen::PenaltyOrFun) = [pen]
+flatten_penalty(pen::Vector{<:PenaltyOrFun}) = pen
+flatten_penalty(pen::Vector{<:Tuple}) = [p[1] for p in pen]
diff --git a/src/convergence/Convergence.jl b/src/convergence/Convergence.jl
index 04f047c31..fbc3d57db 100644
--- a/src/convergence/Convergence.jl
+++ b/src/convergence/Convergence.jl
@@ -17,7 +17,9 @@ include("max_iter.jl")
Returns `true` if the counterfactual explanation has converged.
"""
function converged(ce::AbstractCounterfactualExplanation)
- return converged(ce.convergence, ce)
+ _conv = converged(ce.convergence, ce)
+ ce.search[:converged] = _conv
+ return _conv
end
"""
diff --git a/src/convergence/invalidation_rate.jl b/src/convergence/invalidation_rate.jl
index b1d92080c..430a4ea1a 100644
--- a/src/convergence/invalidation_rate.jl
+++ b/src/convergence/invalidation_rate.jl
@@ -1,6 +1,6 @@
using ChainRulesCore: ignore_derivatives
using Distributions: Distributions
-using Flux: Flux
+import DifferentiationInterface as DI
using LinearAlgebra: LinearAlgebra
Base.@kwdef struct InvalidationRateConvergence <: AbstractConvergence
@@ -40,19 +40,30 @@ Calculates the invalidation rate of a counterfactual explanation.
# Returns
The invalidation rate of the counterfactual explanation.
"""
-function invalidation_rate(ce::AbstractCounterfactualExplanation)
- z = []
- ignore_derivatives() do
- index_target = get_target_index(ce.data.y_levels, ce.target)
- f_loss = logits(ce.M, CounterfactualExplanations.decode_state(ce))[index_target]
- grad = Flux.gradient(
- () -> logits(ce.M, CounterfactualExplanations.decode_state(ce))[index_target],
- Flux.params(ce.counterfactual_state),
- )[ce.counterfactual_state]
- denominator = sqrt(ce.convergence.variance) * norm(grad)
- normalized_gradient = f_loss / denominator
- push!(z, normalized_gradient)
+function invalidation_rate(ce_state::AbstractArray, ce::AbstractCounterfactualExplanation)
+ index_target = get_target_index(ce.data.y_levels, ce.target)
+ f_loss = logits(ce.M, CounterfactualExplanations.decode_state(ce))[index_target]
+ y = ce.target_encoded
+
+ # Create closure
+ function f(x)
+ return logits(ce.M, CounterfactualExplanations.decode_state(ce, x))[index_target]
end
- ϕ = Distributions.cdf(Distributions.Normal(0, 1), z[1])
+
+ # Compute gradient:
+ grad = DI.gradient(f, get_global_ad_backend(), ce_state)
+ denominator = sqrt(ce.convergence.variance) * norm(grad)
+ normalized_gradient = f_loss / denominator
+ ϕ = Distributions.cdf(Distributions.Normal(0, 1), normalized_gradient)
return 1 - ϕ
end
+
+"""
+ invalidation_rate(ce::AbstractCounterfactualExplanation)
+
+Single-argument method for convenience.
+"""
+function invalidation_rate(ce::AbstractCounterfactualExplanation)
+ cf = CounterfactualExplanations.decode_state(ce)
+ return invalidation_rate(cf, ce)
+end
diff --git a/src/counterfactuals/core_struct.jl b/src/counterfactuals/core_struct.jl
index 2da889d00..ee4807f8b 100644
--- a/src/counterfactuals/core_struct.jl
+++ b/src/counterfactuals/core_struct.jl
@@ -1,6 +1,7 @@
+using CausalInference
using ..GenerativeModels: GenerativeModels
using MultivariateStats: MultivariateStats
-using CausalInference
+using Optimisers: Optimisers
"""
A struct that collects all information relevant to a specific counterfactual explanation for a single individual.
@@ -137,5 +138,16 @@ function initialize!(ce::CounterfactualExplanation)
ce.search[:path] = [ce.s′]
ce.search[:times_changed_features] = zeros(size(decode_state(ce)))
+
+ # Update using new Optimisers.jl API
+ if hasfield(typeof(ce.generator), :opt)
+ ce.search[:opt_state] = Optimisers.setup(ce.generator.opt, ce.counterfactual_state)
+ end
+
+ # Generator loss:
+ if hasfield(typeof(ce.generator), :loss)
+ ce.generator.loss = guess_loss(ce)
+ end
+
return ce
end
diff --git a/src/counterfactuals/encodings.jl b/src/counterfactuals/encodings.jl
index ba1ca82cb..5d27d16d0 100644
--- a/src/counterfactuals/encodings.jl
+++ b/src/counterfactuals/encodings.jl
@@ -219,6 +219,8 @@ function decode_state(
data, counterfactual_state
)
+ @assert isa(counterfactual_state, Matrix)
+
return counterfactual_state
end
@@ -234,3 +236,5 @@ function decode_state!(
return ce
end
+
+decode_state(ce::AbstractCounterfactualExplanation) = ce.counterfactual
diff --git a/src/counterfactuals/flatten.jl b/src/counterfactuals/flatten.jl
index d653f90a4..f37727bff 100644
--- a/src/counterfactuals/flatten.jl
+++ b/src/counterfactuals/flatten.jl
@@ -67,3 +67,12 @@ Returns the encoded representation of `flat_ce.target`.
function target_encoded(flat_ce::FlattenedCE, data::CounterfactualData)
return data.output_encoder(flat_ce.target; y_levels=data.y_levels)
end
+
+"""
+ num_counterfactuals(flat_ce::FlattenedCE)
+
+Extends the `num_counterfactuals` method to `FlattenedCE`.
+"""
+function num_counterfactuals(flat_ce::FlattenedCE)
+ return size(flat_ce.counterfactual_state, ndims(flat_ce.counterfactual_state))
+end
diff --git a/src/counterfactuals/generate_counterfactual.jl b/src/counterfactuals/generate_counterfactual.jl
index c62383a8c..b0555be04 100644
--- a/src/counterfactuals/generate_counterfactual.jl
+++ b/src/counterfactuals/generate_counterfactual.jl
@@ -26,6 +26,7 @@ The core function that is used to run counterfactual search for a given factual
- `convergence::Union{AbstractConvergence,Symbol}=:decision_threshold`: Convergence criterion. By default, the convergence is based on the decision threshold. Possible values are `:decision_threshold`, `:max_iter`, `:generator_conditions` or a conrete convergence object (e.g. [`DecisionThresholdConvergence`](@ref)).
- `timeout::Union{Nothing,Int}=nothing`: Timeout in seconds.
- `return_flattened::Bool`: If true, the flattened CE is returned instead of a CE object.
+- `callback::Union{Nothing,Function}`: An optional callback function that takes a [`CounterfactualExplanation`](@ref) as its only positional input.
# Examples
@@ -86,8 +87,14 @@ function generate_counterfactual(
convergence::Union{AbstractConvergence,Symbol}=:decision_threshold,
timeout::Union{Nothing,Real}=nothing,
return_flattened::Bool=false,
+ callback::Union{Nothing,Function}=nothing,
)
+
+ # Setup
output(ce::CounterfactualExplanation) = return_flattened ? flatten(ce) : ce
+ if !isnothing(callback)
+ @assert hasmethod(callback, Tuple{CounterfactualExplanation}) "The `callback` function needs to accept a `CounterfactualExplanation` as its first and only positional input."
+ end
# Initialize:
ce = CounterfactualExplanation(
@@ -126,6 +133,14 @@ function generate_counterfactual(
end
end
+ # Callback:
+ if !isnothing(callback)
+ callback(ce)
+ end
+
+ # Convergence:
+ ce.search[:converged] = converged(ce)
+
# Return full or flattened explanation:
return output(ce)
end
diff --git a/src/counterfactuals/info_extraction.jl b/src/counterfactuals/info_extraction.jl
index 5d29ad551..28b03a9ac 100644
--- a/src/counterfactuals/info_extraction.jl
+++ b/src/counterfactuals/info_extraction.jl
@@ -102,3 +102,5 @@ function target_encoded(ce::CounterfactualExplanation, data::CounterfactualData)
end
target_encoded(ce::CounterfactualExplanation) = target_encoded(ce, ce.data)
+
+num_counterfactuals(ce::CounterfactualExplanation) = ce.num_counterfactuals
diff --git a/src/counterfactuals/initialisation.jl b/src/counterfactuals/initialisation.jl
index a5891db17..90e499022 100644
--- a/src/counterfactuals/initialisation.jl
+++ b/src/counterfactuals/initialisation.jl
@@ -25,11 +25,11 @@ function initialize_state(ce::CounterfactualExplanation)
# Add random perturbation following Slack (2021): https://arxiv.org/abs/2106.02666
if ce.initialization == :add_perturbation
- Δcounterfactual_state =
+ grad_ce_state =
randn(eltype(counterfactual_state), size(counterfactual_state)) *
convert(eltype(counterfactual_state), 0.1)
- Δcounterfactual_state = apply_mutability(ce, Δcounterfactual_state)
- counterfactual_state .+= Δcounterfactual_state
+ grad_ce_state = apply_mutability(ce, grad_ce_state)
+ counterfactual_state .+= grad_ce_state
end
return counterfactual_state
diff --git a/src/counterfactuals/search.jl b/src/counterfactuals/search.jl
index 14b6a331e..734b3f065 100644
--- a/src/counterfactuals/search.jl
+++ b/src/counterfactuals/search.jl
@@ -6,17 +6,16 @@ An important subroutine that updates the counterfactual explanation. It takes a
function update!(ce::CounterfactualExplanation)
# Generate peturbations:
- Δcounterfactual_state = Generators.generate_perturbations(ce.generator, ce)
- Δcounterfactual_state = apply_mutability(ce, Δcounterfactual_state) # mutability constraints
- counterfactual_state = ce.counterfactual_state + Δcounterfactual_state # new proposed state
+ grad_ce_state = Generators.generate_perturbations(ce.generator, ce)
+ grad_ce_state = apply_mutability(ce, grad_ce_state) # mutability constraints
+ counterfactual_state = ce.counterfactual_state + grad_ce_state # new proposed state
# Updates:
ce.counterfactual_state = counterfactual_state # update counterfactual
ce.counterfactual = decode_state(ce) # decoded counterfactual state
apply_domain_constraints!(ce) # apply domain constraints
_times_changed = reshape(
- decode_state(ce, Δcounterfactual_state) .!= 0,
- size(ce.search[:times_changed_features]),
+ decode_state(ce, grad_ce_state) .!= 0, size(ce.search[:times_changed_features])
)
ce.search[:times_changed_features] += _times_changed # update number of times feature has been changed
ce.search[:iteration_count] += 1 # update iteration counter
@@ -27,36 +26,45 @@ end
"""
apply_mutability(
ce::CounterfactualExplanation,
- Δcounterfactual_state::AbstractArray,
+ grad_ce_state::AbstractArray,
)
A subroutine that applies mutability constraints to the proposed vector of feature perturbations.
"""
-function apply_mutability(
- ce::CounterfactualExplanation, Δcounterfactual_state::AbstractArray
-)
+function apply_mutability(ce::CounterfactualExplanation, grad_ce_state::AbstractArray)
if typeof(ce.data.input_encoder) <: GenerativeModels.AbstractGenerativeModel ||
typeof(ce.data.input_encoder) <: MultivariateStats.AbstractDimensionalityReduction
if isnothing(ce.search)
@warn "Mutability constraints not currently implemented for latent space search."
end
- return Δcounterfactual_state
+ return grad_ce_state
end
mutability = ce.search[:mutability]
- # Helper functions:
- both(x) = x
- increase(x) = ifelse(x < 0.0, 0.0, x)
- decrease(x) = ifelse(x > 0.0, 0.0, x)
- none(x) = 0.0
- cases = (both=both, increase=increase, decrease=decrease, none=none)
- # Apply:
- Δcounterfactual_state = map(
- (case, s) -> getfield(cases, case)(s), mutability, Δcounterfactual_state
- )
+ # Create output array with same type as input (critical for type stability)
+ result = similar(grad_ce_state)
+
+ # Apply mutability constraints element-wise
+ @inbounds for i in eachindex(mutability, grad_ce_state)
+ case = mutability[i]
+ val = grad_ce_state[i]
+
+ # Use if-else instead of getfield for type stability
+ result[i] = if case === :both
+ val
+ elseif case === :increase
+ val < 0 ? zero(val) : val
+ elseif case === :decrease
+ val > 0 ? zero(val) : val
+ elseif case === :none
+ zero(val)
+ else
+ val # fallback
+ end
+ end
- return Δcounterfactual_state
+ return result
end
"""
diff --git a/src/counterfactuals/utils.jl b/src/counterfactuals/utils.jl
index 3c6ad8e88..f5a81ff61 100644
--- a/src/counterfactuals/utils.jl
+++ b/src/counterfactuals/utils.jl
@@ -81,8 +81,7 @@ Finds potential neighbors for the selected factual data point.
function find_potential_neighbours(
ce::AbstractCounterfactualExplanation, data::CounterfactualData, n::Int=1000
)
- nobs = size(data.X, 2)
- data = DataPreprocessing.subsample(data, minimum([nobs, n]))
+ # Get IDs of samples in target class (ground truth):
ids = findall(data.output_encoder.labels .== ce.target)
n_candidates = minimum([size(data.y, 2), n])
candidates = DataPreprocessing.select_factual(data, rand(ids, n_candidates))
@@ -95,5 +94,6 @@ end
Overloads the function for [`CounterfactualExplanation`](@ref) to use the counterfactual data's labels if no data is provided.
"""
-find_potential_neighbours(ce::CounterfactualExplanation, n::Int=1000) =
- find_potential_neighbours(ce, ce.data, n)
+function find_potential_neighbours(ce::CounterfactualExplanation, n::Int=1000)
+ return find_potential_neighbours(ce, ce.data, n)
+end
diff --git a/src/data_preprocessing/DataPreprocessing.jl b/src/data_preprocessing/DataPreprocessing.jl
index 2b9221aab..41bb36a53 100644
--- a/src/data_preprocessing/DataPreprocessing.jl
+++ b/src/data_preprocessing/DataPreprocessing.jl
@@ -17,5 +17,6 @@ include("data_contraints.jl")
export CounterfactualData
export select_factual, apply_domain_constraints, OutputEncoder, transformable_features
export fit_transformer, fit_transformer!
+export mutability_constraints, mutability_constraints!
end
diff --git a/src/data_preprocessing/counterfactual_data.jl b/src/data_preprocessing/counterfactual_data.jl
index ba7205680..14d1804b2 100644
--- a/src/data_preprocessing/counterfactual_data.jl
+++ b/src/data_preprocessing/counterfactual_data.jl
@@ -146,7 +146,7 @@ counterfactual_data = CounterfactualData(X,y')
function CounterfactualData(
X::AbstractMatrix,
y::RawOutputArrayType;
- mutability::Union{Vector{Symbol},Nothing}=nothing,
+ mutability::Union{Tuple{Vararg{Pair{Int,Symbol}}},Vector{Int},Vector{Symbol},Nothing}=nothing,
domain::Union{Any,Nothing}=nothing,
features_categorical::Union{Vector{Vector{Int}},Nothing}=nothing,
features_continuous::Union{Vector{Int},Nothing}=nothing,
@@ -174,7 +174,7 @@ function CounterfactualData(
X,
y,
likelihood,
- mutability,
+ nothing,
domain,
features_categorical,
features_continuous,
@@ -183,6 +183,9 @@ function CounterfactualData(
output_encoder,
)
+ # Mutability:
+ counterfactual_data.mutability = mutability_constraints(counterfactual_data, mutability)
+
# Data transformations:
if transformable_features(counterfactual_data) !=
counterfactual_data.features_continuous
@@ -233,7 +236,6 @@ function reconstruct_cat_encoding(counterfactual_data::CounterfactualData, x::Ab
return x
end
- x = vec(x)
map(features_categorical) do cat_group_index
if length(cat_group_index) > 1
x[cat_group_index] = Int.(x[cat_group_index] .== maximum(x[cat_group_index]))
diff --git a/src/data_preprocessing/data_contraints.jl b/src/data_preprocessing/data_contraints.jl
index d9b30267c..8fd7bd2d4 100644
--- a/src/data_preprocessing/data_contraints.jl
+++ b/src/data_preprocessing/data_contraints.jl
@@ -4,11 +4,76 @@
A convenience function that returns the mutability constraints. If none were specified, it is assumed that all features are mutable in `:both` directions.
"""
function mutability_constraints(counterfactual_data::CounterfactualData)
- return if isnothing(counterfactual_data.mutability)
- [:both for i in 1:size(counterfactual_data.X)[1]]
- else
- counterfactual_data.mutability
+ return mutability_constraints(counterfactual_data, counterfactual_data.mutability)
+end
+
+"""
+ mutability_constraints(counterfactual_data::CounterfactualData, mutability::Nothing)
+
+If nothing is supplied, all features are assumed to be mutable in both directions.
+"""
+function mutability_constraints(
+ counterfactual_data::CounterfactualData, mutability::Nothing
+)
+ return [:both for i in 1:size(counterfactual_data.X)[1]]
+end
+
+"""
+mutability_constraints(counterfactual_data::CounterfactualData, mutability::Vector{Symbol})
+
+If `mutability` is already a vector of symbols, it is returned as is.
+"""
+function mutability_constraints(
+ counterfactual_data::CounterfactualData, mutability::Vector{Symbol}
+)
+ return mutability
+end
+
+"""
+mutability_constraints(counterfactual_data::CounterfactualData, mutability::Vector{Symbol})
+
+If `mutability` is already a vector of integers, these are assumed to be indices of immutable features. All other features are assumed to be mutable in both directions. This offers a convenient way to quickly specify immutable features.
+"""
+function mutability_constraints(
+ counterfactual_data::CounterfactualData, mutability::Vector{Int}
+)
+ mutability_final = mutability_constraints(counterfactual_data, nothing) # starting point
+ for i in mutability
+ # Set all referenced indices to immutable:
+ mutability_final[i] = :none
+ end
+ return mutability_final
+end
+
+"""
+ mutability_constraints(counterfactual_data::CounterfactualData, mutability::Pair{K,V}...) where {K<:Int,V<:Symbol}
+
+If pairs of feature indices (`::Int`) and constraints (`::Symbol`) are supplied, the given constraints are applied to the corresponding features. All other features are assumed to be mutable in both directions.
+"""
+function mutability_constraints(
+ counterfactual_data::CounterfactualData, mutability::Pair{K,V}...
+) where {K<:Int,V<:Symbol}
+ mutability_final = mutability_constraints(counterfactual_data, nothing) # starting point
+ for (k, v) in mutability
+ mutability_final[k] = v
end
+ return mutability_final
+end
+
+function mutability_constraints(
+ counterfactual_data::CounterfactualData, mutability::Tuple{Vararg{Pair{Int,Symbol}}}
+)
+ return mutability_constraints(counterfactual_data, mutability...)
+end
+
+"""
+ mutability_constraints!(counterfactual_data::CounterfactualData, mutability)
+
+Applies provided mutability constraints in-place to existing data.
+"""
+function mutability_constraints!(counterfactual_data::CounterfactualData, mutability)
+ counterfactual_data.mutability = mutability_constraints(counterfactual_data, mutability)
+ return counterfactual_data.mutability
end
"""
diff --git a/src/data_preprocessing/utils.jl b/src/data_preprocessing/utils.jl
index 448468bdf..5b43caa78 100644
--- a/src/data_preprocessing/utils.jl
+++ b/src/data_preprocessing/utils.jl
@@ -126,7 +126,7 @@ function preprocess_data_for_mlj(data::CounterfactualData)
end
"""
- convert_to_1d(y::Matrix, y_levels::AbstractArray)
+ convert_to_1d(y::AbstractMatrix, y_levels::AbstractArray)
Helper function to convert a one-hot encoded matrix to a vector of labels.
This is necessary because MLJ models require the labels to be represented as a vector,
@@ -139,7 +139,7 @@ but the synthetic datasets in this package hold the labels in one-hot encoded fo
# Returns
- `labels`: A vector of labels.
"""
-function convert_to_1d(y::Matrix, y_levels::AbstractArray)
+function convert_to_1d(y::AbstractMatrix, y_levels::AbstractArray)
# Number of rows in the onehot_encoded matrix corresponds to the number of data points
num_data_points = size(y, 2)
diff --git a/src/deprecated.jl b/src/deprecated.jl
index 83d6a213c..b4f97058f 100644
--- a/src/deprecated.jl
+++ b/src/deprecated.jl
@@ -79,3 +79,11 @@ Base.@deprecate train!(vae, X, y) GenerativeModels.train!(vae, X) false
Base.@deprecate load_mnist_mlp() Models.load_mnist_model(MLP())
Base.@deprecate load_mnist_ensemble() Models.load_mnist_model(DeepEnsemble())
+
+Base.@deprecate ∂ℓ(generator, ce) grad_loss(generator, ce)
+
+Base.@deprecate ∂h(generator, ce) grad_pen(generator, ce)
+
+Base.@deprecate ∇(generator, ce) grad_search_opt(generator, ce)
+
+Base.@deprecate retrain!(vae, X; n_epochs) GenerativeModels.train!(vae, X; n_epochs) false
diff --git a/src/evaluation/Evaluation.jl b/src/evaluation/Evaluation.jl
index 313c7b2e7..f67f0944b 100644
--- a/src/evaluation/Evaluation.jl
+++ b/src/evaluation/Evaluation.jl
@@ -32,6 +32,7 @@ export faithfulness
export plausibility_measures, default_measures, distance_measures, all_measures
export concatenate_benchmarks
export compute_divergence
+export feature_sensitivity
"Available plausibility measures."
const plausibility_measures = [
@@ -49,6 +50,7 @@ const distance_measures = [
CounterfactualExplanations.Objectives.distance_l1,
CounterfactualExplanations.Objectives.distance_l2,
CounterfactualExplanations.Objectives.distance_linf,
+ CounterfactualExplanations.Objectives.distance_cosine,
]
"All measures."
diff --git a/src/evaluation/benchmark.jl b/src/evaluation/benchmark.jl
index 4a52cdea0..c7c8f8aac 100644
--- a/src/evaluation/benchmark.jl
+++ b/src/evaluation/benchmark.jl
@@ -1,5 +1,6 @@
using Base.Iterators
using DataFrames: DataFrames
+using Random
using Serialization: Serialization
using Statistics: mean
using TaijaBase: AbstractParallelizer, vectorize_collection, parallelize
@@ -360,7 +361,7 @@ function benchmark(
# Grid setup:
grid = []
for (mod_name, M) in models
- # Individuals need to be chosen separately for each model:
+ # Individuals need to be chosen separately for each model, because different models predict different factual/target classes for different samples.
chosen = Vector{Int}()
yhat = CounterfactualExplanations.predict_label(M, test_data)
for i in 1:n_individuals
@@ -565,13 +566,18 @@ A helper function to determine if counterfactual explanations should be stored b
"""
function needs_ce(store_ce::Bool, measure::Union{Function,Vector{<:Function}})
if !store_ce && includes_divergence_metric(measure)
- @warn "Divergence metric detected. Will temporarily store counterfactual explanations, which can lead to increased memory usage."
+ @warn "Divergence metric detected. Will temporarily store counterfactual explanations, which can lead to increased memory usage." maxlog =
+ 1
end
return store_ce || includes_divergence_metric(measure)
end
function compute_divergence(
- bmk::Benchmark, measure::Union{Function,Vector{<:Function}}, data::CounterfactualData
+ bmk::Benchmark,
+ measure::Union{Function,Vector{<:Function}},
+ data::CounterfactualData;
+ nsamples::Union{Nothing,Int}=nothing,
+ rng::AbstractRNG=Random.default_rng(),
)
@assert !isnothing(bmk.counterfactuals) "Cannot compute divergence without counterfactuals. Set `store_ce=true` when running the benchmark."
if !includes_divergence_metric(measure)
@@ -580,7 +586,13 @@ function compute_divergence(
end
df = innerjoin(bmk.evaluation, bmk.counterfactuals; on=:sample)
div_metrics = String.(measure_name.(measure)[isa.(measure, AbstractDivergenceMetric)])
- gdf = groupby(df, [:variable, :generator, :model, :target, :factual])
+
+ byvars = [:variable, :generator, :model, :target, :factual]
+ if "run" in names(df)
+ push!(byvars, :run)
+ end
+
+ gdf = groupby(df, byvars)
final_df = DataFrame()
for _df in gdf
if !(unique(_df.variable)[1] in div_metrics)
@@ -590,7 +602,11 @@ function compute_divergence(
ces =
collect(_df.ce) |>
ces -> [convert(AbstractCounterfactualExplanation, ce) for ce in ces]
- val, pval = metric(ces, data)
+ if isnothing(nsamples)
+ val, pval = metric(ces, data)
+ else
+ val, pval = metric(ces, data, nsamples; rng=rng)
+ end
_df.value .= val
_df.pval .= pval
end
diff --git a/src/evaluation/divergence/divergence.jl b/src/evaluation/divergence/divergence.jl
index 67824b774..289138763 100644
--- a/src/evaluation/divergence/divergence.jl
+++ b/src/evaluation/divergence/divergence.jl
@@ -1,5 +1,6 @@
using CounterfactualExplanations
using CounterfactualExplanations: counterfactual
+using Random
include("mmd.jl")
@@ -35,6 +36,7 @@ function (metric::AbstractDivergenceMetric)(
ces::Vector{<:AbstractCounterfactualExplanation},
data::CounterfactualData,
n::Int;
+ rng::AbstractRNG=Random.default_rng(),
kwrgs...,
)
@@ -42,5 +44,5 @@ function (metric::AbstractDivergenceMetric)(
counterfactuals, neighbours = get_samples_for_metric(ces, data)
# Compute divergence metric:
- return metric(counterfactuals, neighbours, n; kwrgs...)
+ return metric(counterfactuals, neighbours, n; rng=rng, kwrgs...)
end
diff --git a/src/evaluation/divergence/mmd.jl b/src/evaluation/divergence/mmd.jl
index 91a853e03..a224e3da5 100644
--- a/src/evaluation/divergence/mmd.jl
+++ b/src/evaluation/divergence/mmd.jl
@@ -1,6 +1,6 @@
# A lot of things salvaged from from IPMeasures: https://github.com/aicenter/IPMeasures.jl/blob/master/src/mmd.jl
using KernelFunctions
-using Random: shuffle
+using Random
export MMD, mmd_null_dist, mmd_significance
@@ -51,9 +51,14 @@ end
Computes the MMD between two datasets `x` and `y`, along with a p-value based on a null distribution of MMD values (unless `m.compute_p=nothing`) for a random subset of the data (of sample size `n`). The p-value is computed using a permutation test.
"""
-function (m::MMD)(x::AbstractArray, y::AbstractArray, n::Int; kwrgs...)
- n = minimum([size(x, 2), n])
- return m(samplecolumns(x, n), samplecolumns(y, n); kwrgs...)
+function (m::MMD)(
+ x::AbstractArray,
+ y::AbstractArray,
+ n::Int;
+ rng::AbstractRNG=Random.default_rng(),
+ kwrgs...,
+)
+ return m(samplecolumns(rng, x, n), samplecolumns(rng, y, n); kwrgs...)
end
"""
@@ -100,10 +105,12 @@ function mmd_significance(mmd::Number, mmd_null_dist::AbstractArray)
end
"""
- samplecolumns(x::AbstractMatrix, n::Int)
+ samplecolumns([rng::AbstractRNG], x::AbstractMatrix, n::Int)
Sample `n` columns from a matrix. Returns `x` if the matrix has less than `n` columns.
"""
-function samplecolumns(x::AbstractMatrix, n::Int)
- return (size(x, 2) > n) ? x[:, sample(1:size(x, 2), n; replace=false)] : x
+function samplecolumns(rng::AbstractRNG, x::AbstractMatrix, n::Int)
+ return (size(x, 2) > n) ? x[:, sample(rng, 1:size(x, 2), n; replace=false)] : x
end
+
+samplecolumns(x::AbstractMatrix, n::Int) = samplecolumns(Random.default_rng(), x, n)
diff --git a/src/evaluation/evaluate.jl b/src/evaluation/evaluate.jl
index 9661209bc..a0961bf2e 100644
--- a/src/evaluation/evaluate.jl
+++ b/src/evaluation/evaluate.jl
@@ -54,9 +54,11 @@ end
For abstract divergence metrics, returns a vector of NaN values.
"""
-compute_measure(
+function compute_measure(
ce::CounterfactualExplanation, measure::AbstractDivergenceMetric, agg::Function
-) = [NaN]
+)
+ return [NaN]
+end
"""
evaluate_dict(ce::CounterfactualExplanation, measure::Vector{Function}, agg::Function)
@@ -90,10 +92,37 @@ function to_dataframe(
store_ce::Bool,
ce::CounterfactualExplanation,
)
+ if any(
+ (x -> length(x[1]) > 1 && length(x[1]) != num_counterfactuals(ce)).(
+ computed_measures
+ ),
+ ) && report_each
+ # This conditional is only ever entered for metrics like `feature_sensitivity`, that may produce multiple results per counterfactual (i.e. here one for each specified feature: evaluate(ce; measure=function(x;kwrgs...) feature_sensitivity(x, [1,2];kwrgs...) end, report_each=true, output_format=:DataFrame)
+ @assert num_counterfactuals(ce) == 1 "Combining measures that produce output of different lengths with `num_counterfactuals`>1 is not currently implemented."
+ new_measure = []
+ new_vals = []
+ measure_names = []
+ for (i, x) in enumerate(computed_measures)
+ m = fill(measure[i], length(x[1]))
+ mname = if length(x[1]) > 1
+ ["$(measure_name(measure[i]))_outid:$j" for j in 1:length(x[1])]
+ else
+ [measure_name(measure[i])]
+ end
+ push!(new_measure, m...)
+ push!(new_vals, x[1]...)
+ push!(measure_names, mname...)
+ end
+ measure = new_measure
+ computed_measures = [[x] for x in new_vals]
+ else
+ measure_names = measure_name.(measure)
+ end
+
evaluation = DataFrames.DataFrame(
Dict(
m => report_each ? val[1] : val for
- (m, val) in zip(measure_name.(measure), computed_measures)
+ (m, val) in zip(Symbol.(measure_names), computed_measures)
),
)
evaluation.num_counterfactual = 1:nrow(evaluation)
@@ -108,6 +137,14 @@ function to_dataframe(
return evaluation
end
+function get_outid(varname::String)
+ if contains(varname, "outid:")
+ return parse(Int, varname[end])
+ else
+ return 1
+ end
+end
+
"""
generate_meta_data(
ce::CounterfactualExplanation,
diff --git a/src/evaluation/faithfulness/utils.jl b/src/evaluation/faithfulness/utils.jl
index 26a739163..f23939725 100644
--- a/src/evaluation/faithfulness/utils.jl
+++ b/src/evaluation/faithfulness/utils.jl
@@ -374,8 +374,9 @@ function distance_from_posterior(
end
# Compute distance:
+ cf = CounterfactualExplanations.decode_state(ce)
_loss = map(eachcol(conditional_samples[1])) do xsample
- distance(ce; from=xsample, agg=agg, p=p, cosine=cosine)
+ distance(cf, ce; from=xsample, agg=agg, p=p, cosine=cosine)
end
_loss = reduce((x, y) -> x + y, _loss) / nsamples # aggregate over samples
diff --git a/src/evaluation/measures.jl b/src/evaluation/measures.jl
index 8d760352b..6cd7c7107 100644
--- a/src/evaluation/measures.jl
+++ b/src/evaluation/measures.jl
@@ -1,3 +1,4 @@
+using CounterfactualExplanations.Convergence: threshold_reached
using Statistics: Statistics
include("faithfulness/faithfulness.jl")
@@ -8,19 +9,26 @@ include("plausibility/plausibility.jl")
Checks of the counterfactual search has been successful in that the predicted label corresponds to the specified target. In case multiple counterfactuals were generated, the function returns the proportion of successful counterfactuals.
"""
-function validity(ce::CounterfactualExplanation; agg=Statistics.mean, γ=0.5)
- val = agg(CounterfactualExplanations.counterfactual_label(ce) .== ce.target)
- val = val isa LinearAlgebra.AbstractMatrix ? vec(val) : val
+function validity(
+ ce::CounterfactualExplanation;
+ agg=Statistics.mean,
+ threshold::Union{Nothing,AbstractFloat}=nothing,
+)
+ val = if isnothing(threshold)
+ agg(CounterfactualExplanations.counterfactual_label(ce) .== ce.target)
+ else
+ threshold_reached(ce) |> x -> float.(x)
+ end
return val
end
"""
- validity_strict(ce::CounterfactualExplanation)
+ validity_strict(ce::CounterfactualExplanation; kwrgs...)
Checks if the counterfactual search has been strictly valid in the sense that it has converged with respect to the pre-specified target probability `γ`.
"""
-function validity_strict(ce::CounterfactualExplanation)
- return validity(ce; γ=ce.convergence.decision_threshold)
+function validity_strict(ce::CounterfactualExplanation; kwrgs...)
+ return validity(ce; threshold=ce.convergence.decision_threshold, kwrgs...)
end
"""
@@ -37,3 +45,19 @@ function redundancy(ce::CounterfactualExplanation; agg=Statistics.mean, tol=1e-5
redundant_x = length(redundant_x) == 1 ? redundant_x[1] : redundant_x
return redundant_x
end
+
+"""
+ feature_sensitivity(
+ ce::AbstractCounterfactualExplanation, d::Union{Int,Vector{Int}}=[1]; kwrgs...
+ )
+
+Return the sensitivity to feature(s) `d` in terms of absolute changes associated with the counterfactual. Any keyword arguments accepted by [`distance`](@ref) can be passed to `kwrgs...`.
+"""
+function feature_sensitivity(
+ ce::AbstractCounterfactualExplanation, d::Union{Int,Vector{Int}}=[1]; kwrgs...
+)
+ if isa(d, Int)
+ d = [d]
+ end
+ return [distance(ce; d=[d], kwrgs...) for d in d]
+end
diff --git a/src/evaluation/plausibility/plausibility.jl b/src/evaluation/plausibility/plausibility.jl
index 0ab9d4469..be9ec6f8a 100644
--- a/src/evaluation/plausibility/plausibility.jl
+++ b/src/evaluation/plausibility/plausibility.jl
@@ -32,7 +32,8 @@ function plausibility(
end
# Compute the distance from the target:
- Δ = fun(ce; K=K, kwrgs...)
+ cf = CounterfactualExplanations.decode_state(ce)
+ Δ = fun(cf, ce; K=K, kwrgs...)
return -Δ
end
@@ -73,7 +74,8 @@ function plausibility(
end
# Compute the distance from the target:
- Δ = fun(ce; K=K, kwrgs...)
+ cf = CounterfactualExplanations.decode_state(ce)
+ Δ = fun(cf, ce; K=K, kwrgs...)
return -Δ
end
@@ -99,7 +101,7 @@ Computes the plausibility of a counterfactual explanation based on the cosine si
function plausibility(
ce::CounterfactualExplanation, fun::Objectives.EnergyDifferential; kwrgs...
)
- Δ = fun(ce)
+ Δ = fun(CounterfactualExplanations.decode_state(ce), ce)
return -Δ
end
diff --git a/src/extensions/LaplaceReduxExt.jl b/src/extensions/LaplaceReduxExt.jl
index a202f1eb8..a3919d654 100644
--- a/src/extensions/LaplaceReduxExt.jl
+++ b/src/extensions/LaplaceReduxExt.jl
@@ -7,3 +7,14 @@ struct LaplaceReduxModel <: Models.AbstractFluxNN end
Models.all_models_catalogue[:LaplaceReduxModel] =
CounterfactualExplanations.LaplaceReduxModel
+
+"The `LaplaceReduxModel` model type requires `ForwardDiff`"
+function Objectives.ADRequirements(::Type{<:LaplaceReduxModel})
+ if VERSION >= v"1.12"
+ @warn "Zygote support for `LaplaceRedux` model is broken on Julia v$VERSION. Falling back to ForwardDiff, which can lead to slower performance for high-dimensional inputs." maxlog =
+ 1
+ Objectives.NeedsForwardDiff()
+ else
+ Objectives.NoADRequirements()
+ end
+end
diff --git a/src/generative_models/vae.jl b/src/generative_models/vae.jl
index 0bae8ab71..649ec7b02 100644
--- a/src/generative_models/vae.jl
+++ b/src/generative_models/vae.jl
@@ -1,4 +1,5 @@
using Flux: Flux, Adam, cpu, gpu
+using Optimisers: Optimisers
using ProgressMeter: Progress, next!
using Statistics: mean
@@ -82,7 +83,7 @@ function model_loss(generative_model::VAE, λ, x, device)
# Negative log-likelihood: - log(p(x|z))
nll_x_z = -generative_model.params.nll(z, x; agg=sum) / len
# Weight regularization:
- reg = λ * sum(x -> sum(x .^ 2), Flux.params(generative_model.decoder))
+ reg = λ * sum(x -> sum(x .^ 2), Flux.trainables(generative_model.decoder))
elbo = -nll_x_z + kl_q_p + reg
@@ -91,51 +92,12 @@ end
function _fit(generative_model::Type{VAE}, X::AbstractArray; kws...)
generative_model = VAE(size(X, 1); kws...)
-
- # load hyperparamters
- args = generative_model.params
- args.seed > 0 && Random.seed!(args.seed)
-
- # load data
- loader = get_data(X, args.batch_size)
-
- # parameters
- ps = Flux.params(generative_model)
-
- # Verbosity
- if flux_training_params.verbose
- @info "Begin training VAE"
- p_epoch = Progress(
- args.epochs; desc="Progress on epochs:", showspeed=true, color=:green
- )
- end
-
- # training
- for epoch in 1:(args.epochs)
- avg_loss = []
- for (x,) in loader
- loss, back = Flux.pullback(ps) do
- model_loss(generative_model, args.λ, args.device(x), args.device)
- end
-
- avg_loss = vcat(avg_loss, loss)
- grad = back(1.0f0)
- Flux.Optimise.update!(args.opt, ps, grad)
- end
-
- avg_loss = mean(avg_loss)
- if flux_training_params.verbose
- next!(p_epoch; showvalues=[(:Loss, "$(avg_loss)")])
- end
- end
-
- # Set training status to true:
- generative_model.trained = true
-
- return generative_model
+ return train!(generative_model, X; kws...)
end
-function train!(generative_model::VAE, X::AbstractArray; kws...)
+function train!(
+ generative_model::VAE, X::AbstractArray; n_epochs::Union{Int,Nothing}=nothing, kws...
+)
# load hyperparamters
args = generative_model.params
@@ -144,9 +106,6 @@ function train!(generative_model::VAE, X::AbstractArray; kws...)
# load data
loader = get_data(X, args.batch_size)
- # parameters
- ps = Flux.params(generative_model)
-
# Verbosity
if flux_training_params.verbose
@info "Begin training VAE"
@@ -155,17 +114,20 @@ function train!(generative_model::VAE, X::AbstractArray; kws...)
)
end
+ # Optimiser state:
+ state = Optimisers.setup(args.opt, generative_model)
+
# training
- for epoch in 1:(args.epochs)
+ T = ifelse(isnothing(n_epochs), args.epochs, n_epochs) # if n_epochs unspecified, rely on VAE params
+ for epoch in 1:T
avg_loss = []
for (x,) in loader
- loss, back = Flux.pullback(ps) do
- model_loss(generative_model, args.λ, args.device(x), args.device)
+ loss, back = Flux.withgradient(generative_model) do m
+ model_loss(m, args.λ, args.device(x), args.device)
end
avg_loss = vcat(avg_loss, loss)
- grad = back(1.0f0)
- Flux.Optimise.update!(args.opt, ps, grad)
+ Flux.update!(state, generative_model, back[1])
end
avg_loss = mean(avg_loss)
@@ -175,50 +137,8 @@ function train!(generative_model::VAE, X::AbstractArray; kws...)
end
# Set training status to true:
- return generative_model.trained = true
-end
-
-function retrain!(generative_model::VAE, X::AbstractArray; n_epochs=10)
-
- # load hyperparameters
- args = generative_model.params
- args.seed > 0 && Random.seed!(args.seed)
-
- # load data
- loader = get_data(X, args.batch_size)
-
- # parameters
- ps = Flux.params(generative_model)
-
- # Verbosity
- if flux_training_params.verbose
- @info "Begin training VAE"
- p_epoch = Progress(
- args.epochs; desc="Progress on epochs:", showspeed=true, color=:green
- )
- end
-
- # training
- train_steps = 0
- for epoch in 1:n_epochs
- avg_loss = []
- for (x,) in loader
- loss, back = Flux.pullback(ps) do
- model_loss(generative_model, args.λ, args.device(x), args.device)
- end
-
- avg_loss = vcat(avg_loss, loss)
- grad = back(1.0f0)
- Flux.Optimise.update!(args.opt, ps, grad)
-
- train_steps += 1
- end
-
- avg_loss = mean(avg_loss)
- if flux_training_params.verbose
- next!(p_epoch; showvalues=[(:Loss, "$(avg_loss)")])
- end
- end
+ generative_model.trained = true
+ return generative_model
end
"""
diff --git a/src/generators/Generators.jl b/src/generators/Generators.jl
index e7d437b26..5e4eac63c 100755
--- a/src/generators/Generators.jl
+++ b/src/generators/Generators.jl
@@ -27,6 +27,7 @@ export GenericGenerator
export GravitationalGenerator
export GreedyGenerator
export REVISEGenerator
+export TCRExGenerator
export WachterGenerator
export FeatureTweakGenerator
export generator_catalogue
@@ -38,7 +39,6 @@ export predictive_entropy
export ProbeGenerator
include("macros.jl")
-include("loss.jl")
include("complexity.jl")
include("generate_perturbations.jl")
@@ -84,11 +84,14 @@ end
Computes the total loss of a counterfactual explanation with respect to the search objective.
"""
-total_loss(ce::AbstractCounterfactualExplanation) =
+function total_loss(ce::AbstractCounterfactualExplanation)
if hasfield(typeof(ce.generator), :loss)
- ℓ(ce.generator, ce) + h(ce.generator, ce)
+ yhat = logits(ce.M, CounterfactualExplanations.decode_state(ce))
+ y = ce.target_encoded
+ return ce.generator.loss(yhat, y) + h(ce.generator, ce)
else
- nothing
+ return nothing
end
+end
end
diff --git a/src/generators/generate_perturbations.jl b/src/generators/generate_perturbations.jl
index ff4abf877..59ac80c2d 100644
--- a/src/generators/generate_perturbations.jl
+++ b/src/generators/generate_perturbations.jl
@@ -10,9 +10,9 @@ function generate_perturbations(
)
counterfactual_state = deepcopy(ce.counterfactual_state)
new_counterfactual_state = propose_state(generator, ce)
- Δcounterfactual_state = new_counterfactual_state - counterfactual_state
- Δcounterfactual_state = _replace_nans(Δcounterfactual_state)
- Δcounterfactual_state = convert.(eltype(ce.factual), Δcounterfactual_state)
+ grad_ce_state = new_counterfactual_state - counterfactual_state
+ grad_ce_state = _replace_nans(grad_ce_state)
+ grad_ce_state = convert.(eltype(ce.factual), grad_ce_state)
- return Δcounterfactual_state
+ return grad_ce_state
end
diff --git a/src/generators/gradient_based/base.jl b/src/generators/gradient_based/base.jl
index 8af1abfcf..1930f7945 100644
--- a/src/generators/gradient_based/base.jl
+++ b/src/generators/gradient_based/base.jl
@@ -1,3 +1,5 @@
+using Optimisers: Optimisers
+
"""
AbstractGradientBasedGenerator
@@ -15,7 +17,7 @@ mutable struct GradientBasedGenerator <: AbstractGradientBasedGenerator
λ::Union{Nothing,AbstractFloat,Vector{<:AbstractFloat}}
latent_space::Bool
dim_reduction::Bool
- opt::Flux.Optimise.AbstractOptimiser
+ opt::Optimisers.AbstractRule
generative_model_params::NamedTuple
end
@@ -25,7 +27,7 @@ end
penalty::Penalty=nothing,
λ::Union{Nothing,AbstractFloat,Vector{AbstractFloat}}=nothing,
latent_space::Bool::false,
- opt::Flux.Optimise.AbstractOptimiser=Flux.Descent(),
+ opt::Optimisers.AbstractRule=Optimisers.Descent(),
generative_model_params::NamedTuple=(;),
)
@@ -36,7 +38,7 @@ Default outer constructor for `GradientBasedGenerator`.
- `penalty::Penalty=nothing`: A penalty function for the generator to penalize counterfactuals too far from the original point.
- `λ::Union{Nothing,AbstractFloat,Vector{AbstractFloat}}=nothing`: The weight of the penalty function.
- `latent_space::Bool=false`: Whether to use the latent space of a generative model to generate counterfactuals.
-- `opt::Flux.Optimise.AbstractOptimiser=Flux.Descent()`: The optimizer to use for the generator.
+- `opt::Optimisers.AbstractRule=Optimisers.Descent()`: The optimizer to use for the generator.
- `generative_model_params::NamedTuple`: The parameters of the generative model associated with the generator.
# Returns
@@ -48,7 +50,7 @@ function GradientBasedGenerator(;
λ::Union{Nothing,AbstractFloat,Vector{<:AbstractFloat}}=nothing,
latent_space::Bool=false,
dim_reduction::Bool=false,
- opt::Flux.Optimise.AbstractOptimiser=Flux.Descent(),
+ opt::Optimisers.AbstractRule=Optimisers.Descent(),
generative_model_params::NamedTuple=(;),
)
@assert !(isnothing(λ) && !isnothing(penalty)) "Penalty function(s) provided but no penalty weight(s) provided."
diff --git a/src/generators/gradient_based/generate_perturbations.jl b/src/generators/gradient_based/generate_perturbations.jl
index 9325088da..e49d3f1c8 100644
--- a/src/generators/gradient_based/generate_perturbations.jl
+++ b/src/generators/gradient_based/generate_perturbations.jl
@@ -8,12 +8,12 @@ function generate_perturbations(
)
counterfactual_state = deepcopy(ce.counterfactual_state)
new_counterfactual_state = propose_state(generator, ce)
- Δcounterfactual_state = new_counterfactual_state - counterfactual_state
- Δcounterfactual_state = _replace_nans(Δcounterfactual_state)
- Δcounterfactual_state = convert.(eltype(ce.factual), Δcounterfactual_state)
- Δcounterfactual_state *= ce.num_counterfactuals # rescale to account for number of counterfactuals
+ grad_ce_state = new_counterfactual_state - counterfactual_state
+ grad_ce_state = _replace_nans(grad_ce_state)
+ grad_ce_state = convert.(eltype(ce.factual), grad_ce_state)
+ grad_ce_state *= ce.num_counterfactuals # rescale to account for number of counterfactuals
- return Δcounterfactual_state
+ return grad_ce_state
end
function propose_state(
@@ -21,6 +21,7 @@ function propose_state(
)
return propose_state(Models.Differentiability(ce.M), generator, ce)
end
+
"""
propose_state(
::Models.IsDifferentiable,
@@ -35,8 +36,10 @@ function propose_state(
generator::AbstractGradientBasedGenerator,
ce::AbstractCounterfactualExplanation,
)
- grads = ∇(generator, ce) # gradient
- new_counterfactual_state = deepcopy(ce.counterfactual_state)
- Flux.Optimise.update!(generator.opt, new_counterfactual_state, grads)
+ grads = grad_search_opt(generator, ce) # gradient
+ opt_state = ce.search[:opt_state]
+ opt_state, new_counterfactual_state = Optimisers.update(
+ opt_state, ce.counterfactual_state, grads
+ )
return new_counterfactual_state
end
diff --git a/src/generators/gradient_based/generators.jl b/src/generators/gradient_based/generators.jl
index 0fd0f8cb7..420540879 100644
--- a/src/generators/gradient_based/generators.jl
+++ b/src/generators/gradient_based/generators.jl
@@ -81,7 +81,7 @@ Constructor for `ProbeGenerator`. $DOC_Probe
## Warning
-$DOC_Probe_warn
+$DOC_Probe
"""
function ProbeGenerator(;
λ::Vector{<:AbstractFloat}=[0.1, 1.0],
@@ -89,7 +89,6 @@ function ProbeGenerator(;
penalty=[Objectives.distance_l1, Objectives.hinge_loss],
kwargs...,
)
- @warn DOC_Probe_warn
user_loss = Objectives.losses_catalogue[loss]
return GradientBasedGenerator(; loss=user_loss, penalty=penalty, λ=λ, kwargs...)
end
diff --git a/src/generators/gradient_based/loss.jl b/src/generators/gradient_based/loss.jl
index 0cd6ebf73..56697029e 100644
--- a/src/generators/gradient_based/loss.jl
+++ b/src/generators/gradient_based/loss.jl
@@ -1,55 +1,126 @@
-using Flux: Flux
+import DifferentiationInterface as DI
+
+function loss_wrt_state(x::AbstractArray, ce::AbstractCounterfactualExplanation)
+ return ce.generator.loss(
+ logits(ce.M, CounterfactualExplanations.decode_state(ce, x)), ce.target_encoded
+ )
+end
"""
- ∂ℓ(
+ grad_loss(
generator::AbstractGradientBasedGenerator,
- ce::AbstractCounterfactualExplanation,
+ ce::AbstractCounterfactualExplanation
)
The default method to compute the gradient of the loss function at the current counterfactual state for gradient-based generators.
-It assumes that `Zygote.jl` has gradient access.
"""
-function ∂ℓ(
- generator::AbstractGradientBasedGenerator, ce::AbstractCounterfactualExplanation
+function grad_loss(
+ generator::AbstractGradientBasedGenerator, ce::AbstractCounterfactualExplanation;
+)
+
+ # Get counterfactual state:
+ ce_state = ce.counterfactual_state
+
+ # Get AD backend:
+ backend = get!(ce.search, :ad_backend, CounterfactualExplanations.choose_ad_backend(ce))
+
+ # Get prepared gradient:
+ prep = get!(
+ ce.search,
+ :prep_loss,
+ DI.prepare_gradient(loss_wrt_state, backend, similar(ce_state), DI.Constant(ce)),
+ )
+
+ # Compute gradient:
+ g = DI.gradient(loss_wrt_state, prep, backend, ce_state, DI.Constant(ce))
+
+ return g
+end
+
+function pen_wrt_state(x::AbstractArray, ce::AbstractCounterfactualExplanation)
+ return pen_wrt_state(x, ce.generator.penalty, ce)
+end
+
+function pen_wrt_state(
+ x::AbstractArray, pen::Nothing, ce::AbstractCounterfactualExplanation
+)
+ return 0.0
+end
+
+function pen_wrt_state(
+ x::AbstractArray, pen::PenaltyOrFun, ce::AbstractCounterfactualExplanation
)
- return Flux.gradient(ce -> ℓ(generator, ce), ce)[1][:counterfactual_state]
+ return ce.generator.λ * pen(x, ce)
+end
+
+function pen_wrt_state(
+ x::AbstractArray, pen::Vector{<:Tuple}, ce::AbstractCounterfactualExplanation
+)
+ total = zero(eltype(ce.generator.λ))
+ @inbounds for i in 1:length(pen)
+ fun, kwargs = pen[i]
+ total += ce.generator.λ[i] * fun(x, ce; kwargs...)
+ end
+ return total
+end
+
+function pen_wrt_state(
+ x::AbstractArray, pen::Vector{<:PenaltyOrFun}, ce::AbstractCounterfactualExplanation
+)
+ total = zero(eltype(ce.generator.λ))
+ @inbounds for i in eachindex(pen, ce.generator.λ)
+ total += ce.generator.λ[i] * pen[i](x, ce)
+ end
+ return total
end
"""
- ∂h(generator::AbstractGradientBasedGenerator, ce::AbstractCounterfactualExplanation)
+ grad_pen(generator::AbstractGradientBasedGenerator, ce::AbstractCounterfactualExplanation)
The default method to compute the gradient of the complexity penalty at the current counterfactual state for gradient-based generators.
It assumes that `Zygote.jl` has gradient access.
If the penalty is not provided, it returns 0.0. By default, Zygote never works out the gradient for constants and instead returns 'nothing', so we need to add a manual step to override this behaviour. See here: https://discourse.julialang.org/t/zygote-gradient/26715.
"""
-function ∂h(
- generator::AbstractGradientBasedGenerator, ce::AbstractCounterfactualExplanation
+function grad_pen(
+ generator::AbstractGradientBasedGenerator, ce::AbstractCounterfactualExplanation;
)
- if isnothing(generator.penalty)
- return 0.0
- else
- _grad = Flux.gradient(ce -> h(generator, ce), ce)[1][:counterfactual_state]
- return _grad
- end
+
+ # Get counterfactual state:
+ ce_state = ce.counterfactual_state
+
+ # Get AD backend:
+ backend = get!(ce.search, :ad_backend, CounterfactualExplanations.choose_ad_backend(ce))
+
+ # Get prepared gradient:
+ prep = get!(
+ ce.search,
+ :prep_pen,
+ DI.prepare_gradient(pen_wrt_state, backend, similar(ce_state), DI.Constant(ce)),
+ )
+
+ # Compute gradient:
+ g = DI.gradient(pen_wrt_state, prep, backend, ce_state, DI.Constant(ce))
+
+ g = isnothing(g) ? 0.0 : g
+
+ return g
end
"""
- ∇(
+ grad_search_opt(
generator::AbstractGradientBasedGenerator,
ce::AbstractCounterfactualExplanation,
)
The default method to compute the gradient of the counterfactual search objective for gradient-based generators.
-It simply computes the weighted sum over partial derivates. It assumes that `Zygote.jl` has gradient access.
+It simply computes the weighted sum over partial derivatives. It assumes that `Zygote.jl` has gradient access.
If the counterfactual is being generated using Probe, the hinge loss is added to the gradient.
"""
-function ∇(generator::AbstractGradientBasedGenerator, ce::AbstractCounterfactualExplanation)
- grad_loss = ∂ℓ(generator, ce)
- # println("Loss:")
- # display(grad_loss)
- grad_pen = ∂h(generator, ce)
- # println("Penality:")
- # display(grad_pen)
- return grad_loss .+ grad_pen
+function grad_search_opt(
+ generator::AbstractGradientBasedGenerator, ce::AbstractCounterfactualExplanation
+)
+ _grad_loss = grad_loss(generator, ce)
+ _grad_pen = grad_pen(generator, ce)
+ return _grad_loss .+ _grad_pen
end
diff --git a/src/generators/gradient_based/utils.jl b/src/generators/gradient_based/utils.jl
index d2a229c33..68898dedf 100644
--- a/src/generators/gradient_based/utils.jl
+++ b/src/generators/gradient_based/utils.jl
@@ -1,10 +1,10 @@
"""
- _replace_nans(Δcounterfactual_state::AbstractArray, old_new::Pair=(NaN => 0))
+ _replace_nans(grad_ce_state::AbstractArray, old_new::Pair=(NaN => 0))
Helper function to deal with exploding gradients. This is only a temporary fix and will be improved.
"""
-function _replace_nans(Δcounterfactual_state::AbstractArray, old_new::Pair=(NaN => 0))
- return replace(Δcounterfactual_state, old_new)
+function _replace_nans(grad_ce_state::AbstractArray, old_new::Pair=(NaN => 0))
+ return replace(grad_ce_state, old_new)
end
"""
@@ -16,10 +16,8 @@ By default, gradient-based search is considered to have converged as soon as the
function Convergence.conditions_satisfied(
generator::AbstractGradientBasedGenerator, ce::AbstractCounterfactualExplanation
)
- Δcounterfactual_state = ∇(generator, ce)
- Δcounterfactual_state = CounterfactualExplanations.apply_mutability(
- ce, Δcounterfactual_state
- )
+ grad_ce_state = grad_search_opt(generator, ce)
+ grad_ce_state = CounterfactualExplanations.apply_mutability(ce, grad_ce_state)
if !hasfield(typeof(ce.convergence), :gradient_tol)
# Temporary fix due to the fact that `ProbeGenerator` relies on `InvalidationRateConvergence`.
@warn "Checking for generator conditions convergence is not implemented for this generator type. Return `false`." maxlog =
@@ -28,8 +26,7 @@ function Convergence.conditions_satisfied(
end
τ = ce.convergence.gradient_tol
satisfied = map(
- x -> all(abs.(x) .< τ),
- eachslice(Δcounterfactual_state; dims=ndims(Δcounterfactual_state)),
+ x -> all(abs.(x) .< τ), eachslice(grad_ce_state; dims=ndims(grad_ce_state))
)
success_rate = sum(satisfied) / ce.num_counterfactuals
status = success_rate > ce.convergence.min_success_rate
diff --git a/src/generators/loss.jl b/src/generators/loss.jl
deleted file mode 100644
index b6baf8937..000000000
--- a/src/generators/loss.jl
+++ /dev/null
@@ -1,30 +0,0 @@
-"""
- ℓ(generator::AbstractGenerator, ce::AbstractCounterfactualExplanation)
-
-Dispatches to the appropriate loss function for any generator.
-"""
-function ℓ(generator::AbstractGenerator, ce::AbstractCounterfactualExplanation)
- return ℓ(generator, generator.loss, ce)
-end
-
-"""
- ℓ(generator::AbstractGenerator, loss::Nothing, ce::AbstractCounterfactualExplanation)
-
-Overloads the `ℓ` function for the case where no loss function is provided.
-"""
-function ℓ(
- generator::AbstractGenerator, loss::Nothing, ce::AbstractCounterfactualExplanation
-)
- return CounterfactualExplanations.guess_loss(ce)(ce)
-end
-
-"""
- ℓ(generator::AbstractGenerator, loss::Function, ce::AbstractCounterfactualExplanation)
-
-Overloads the `ℓ` function for the case where a single loss function is provided.
-"""
-function ℓ(
- generator::AbstractGenerator, loss::Function, ce::AbstractCounterfactualExplanation
-)
- return loss(ce)
-end
diff --git a/src/generators/optimizers/JSMADescent.jl b/src/generators/optimizers/JSMADescent.jl
index cae7a83e5..29acb57a6 100644
--- a/src/generators/optimizers/JSMADescent.jl
+++ b/src/generators/optimizers/JSMADescent.jl
@@ -1,9 +1,10 @@
+using Optimisers: Optimisers
+
"An optimisation rule that can be used to implement a Jacobian-based Saliency Map Attack."
-struct JSMADescent <: Flux.Optimise.AbstractOptimiser
+struct JSMADescent <: Optimisers.AbstractRule
eta::AbstractFloat
n::Int
mutability::Union{Nothing,AbstractArray}
- state::IdDict
end
"Outer constructor for the [`JSMADescent`](@ref) rule."
@@ -20,41 +21,62 @@ function JSMADescent(;
elseif !isnothing(η) && isnothing(n)
n = Int(maximum([1, 1 / η]))
end
- return JSMADescent(η, n, mutability, IdDict())
+ return JSMADescent(η, n, mutability)
+end
+
+# Initialize state - just return zeros array
+function Optimisers.init(o::JSMADescent, x::AbstractArray)
+ return zeros(eltype(x), size(x))
end
-function Flux.Optimise.apply!(o::JSMADescent, x, Δ)
+# Apply the optimization rule
+function Optimisers.apply!(o::JSMADescent, times_changed, x, Δ)
# Mutability:
if !isnothing(o.mutability)
- Δ[o.mutability .== :none] .= 0
+ Δ[o.mutability .== :none] .= 0.0
end
# Times changed:
- times_changed = get!(o.state, :times_changed, zeros(size(x)))
Δ[times_changed .== o.n] .= 0
- # Helper function to choose most salient:
- function choose_most_salient(x)
- s = (abs.(x) .== maximum(abs.(x); dims=1)) .* sign.(x)
- non_zero_elements = findall(vec(s) .!= 0)
- # If more than one equal, randomise:
- if length(non_zero_elements) > 1
- keep_ = rand(non_zero_elements)
- s_ = zeros(size(s))
- s_[keep_] = s[keep_]
- s = s_
+ # Choose most salient - use similar(Δ) to preserve exact type
+ n_samples = size(Δ, 3)
+ Δ_out = similar(Δ) # This preserves the exact type of Δ
+ fill!(Δ_out, 0)
+
+ for sample_idx in 1:n_samples
+ sample_slice = Δ[:, :, sample_idx]
+
+ # Find maximum absolute value
+ max_val = maximum(abs.(sample_slice))
+
+ # Find all positions with maximum value
+ s = (abs.(sample_slice) .== max_val) .* sign.(sample_slice)
+ non_zero_elements = findall(s .!= 0)
+
+ # If more than one equal, choose first (deterministic)
+ if length(non_zero_elements) > 0
+ keep_idx = first(non_zero_elements)
+ Δ_out[keep_idx, sample_idx] = s[keep_idx]
+ end
+ end
+
+ Δ = Δ_out
+
+ # Update times_changed
+ new_times_changed = times_changed .+ (Δ .!= 0.0)
+
+ for sample_idx in 1:n_samples
+ sample_slice = @view new_times_changed[:, :, sample_idx]
+ if all(sample_slice .== o.n)
+ sample_slice .= 0
end
- return s
end
- # Updating:
- Δ = mapslices(x -> choose_most_salient(x), Δ; dims=(1, 2)) # choose most salient feature
- o.state[:times_changed] .+= Δ .!= 0.0
- o.state[:times_changed] = mapslices(
- x -> all(x .== o.n) ? zeros(size(x)) : x, o.state[:times_changed]; dims=(1, 2)
- )
- Δ = o.eta / size(x, 3) .* Δ
+ # Scale - convert to match Δ's type
+ scale_factor = convert(eltype(Δ), o.eta / size(Δ, 3))
+ Δ = scale_factor .* Δ
- return Δ
+ return new_times_changed, Δ
end
diff --git a/src/global_utils.jl b/src/global_utils.jl
index f24224963..c259515c0 100644
--- a/src/global_utils.jl
+++ b/src/global_utils.jl
@@ -1,6 +1,10 @@
-using CategoricalArrays: CategoricalArrays, CategoricalArray, CategoricalVector
+using CategoricalArrays:
+ CategoricalArrays, CategoricalArray, CategoricalVector, CategoricalValue
+import DifferentiationInterface as DI
+using ForwardDiff: ForwardDiff
using Flux: Flux
using MLJBase: MLJBase, Continuous, Count, Finite, Textual, categorical, levels, scitype
+using Zygote: Zygote
# Abstract Base Types:
"""
@@ -8,7 +12,7 @@ using MLJBase: MLJBase, Continuous, Count, Finite, Textual, categorical, levels,
A type union for the allowed types for the `target` variable.
"""
-const RawTargetType = Union{Int,AbstractFloat,String,Symbol}
+const RawTargetType = Union{Int,AbstractFloat,String,Symbol,CategoricalValue}
"""
EncodedTargetType
@@ -157,7 +161,7 @@ end
The default training parameter for `FluxModels` etc.
"""
-const flux_training_params = FluxModelParams()
+global flux_training_params = FluxModelParams()
"""
reset!(flux_training_params::FluxModelParams)
@@ -185,3 +189,29 @@ function polynomial_decay(a::Real, b::Real, decay::Real, t::Int)
end
return a * (b + t)^(-decay)
end
+
+global _ad_backend = DI.AutoZygote()
+
+"""
+ get_global_ad_backend()
+
+Get the currently set automatic differentiation backend.
+
+# Returns
+- The global automatic differentiation backend as an instance of `DI.AutoZygote`.
+"""
+function get_global_ad_backend()
+ return _ad_backend
+end
+
+"""
+ set_global_ad_backend(backend)
+
+Set the global automatic differentiation backend.
+
+# Arguments
+- `backend`: The new backend to set, which must be an instance of `DI.AbstractBackend`.
+"""
+function set_global_ad_backend(backend)
+ return global _ad_backend = backend
+end
diff --git a/src/models/differentiable/flux/utils.jl b/src/models/differentiable/flux/utils.jl
index feaf4472f..c857c39ad 100644
--- a/src/models/differentiable/flux/utils.jl
+++ b/src/models/differentiable/flux/utils.jl
@@ -1,3 +1,4 @@
+using Optimisers: Optimisers
using ProgressMeter: ProgressMeter
using Statistics: mean
@@ -76,7 +77,7 @@ function forward!(
avg_loss(data) = mean(map(d -> loss_(model(d[1]), d[2]), data))
# Optimizer:
- opt_ = getfield(Flux.Optimise, opt)()
+ opt_ = getfield(Optimisers, opt)()
# Training:
if flux_training_params.verbose
@@ -94,7 +95,7 @@ function forward!(
gs = Flux.gradient(model) do m
loss_(m(input), label)
end
- Flux.Optimise.update!(opt_state, model, gs[1])
+ Optimisers.update!(opt_state, model, gs[1])
end
if flux_training_params.verbose
ProgressMeter.next!(p_epoch; showvalues=[(:Loss, "$(avg_loss(data))")])
diff --git a/src/models/mlj.jl b/src/models/mlj.jl
index e53e4e61d..5504ba668 100644
--- a/src/models/mlj.jl
+++ b/src/models/mlj.jl
@@ -34,9 +34,9 @@ end
Overloads the [`probs`](@ref) method for MLJ models.
-## Note for developers
+## To Do:
-Note that currently the underlying MLJ methods (`reformat`, `predict`) are incompatible with Zygote's autodiff. For differentiable MLJ models, the [`probs``](@ref) and [`logits`](@ref) methods need to be overloaded.
+Refactor this to be less convoluted and bring in line with current MLJ API.
"""
function probs(M::Model, type::MLJModelType, X::AbstractArray)
if ndims(X) == 1
@@ -45,7 +45,7 @@ function probs(M::Model, type::MLJModelType, X::AbstractArray)
X = Tables.table(X')
X = MLJBase.reformat(M.model, X)[1]
output = MLJBase.predict(M.model, M.fitresult(), X)
- p = MLJBase.pdf(output, MLJBase.classes(output))'
+ p = MLJBase.pdf(output, MLJBase.levels.(output)[1])'[:, :]
if M.likelihood == :classification_binary
p = reshape(p[2, :], 1, size(p, 2))
end
diff --git a/src/objectives/Objectives.jl b/src/objectives/Objectives.jl
index 4bdefeba1..d7a3cf900 100644
--- a/src/objectives/Objectives.jl
+++ b/src/objectives/Objectives.jl
@@ -2,7 +2,7 @@ module Objectives
using ..CounterfactualExplanations
using Flux: Flux
-using Flux.Losses: Losses, logitbinarycrossentropy, logitcrossentropy, mse
+using Flux.Losses
using ChainRulesCore: ChainRulesCore
using LinearAlgebra
using Statistics
@@ -13,7 +13,7 @@ include("loss_functions.jl")
include("penalties.jl")
include("traits.jl")
-export logitbinarycrossentropy, logitcrossentropy, mse, predictive_entropy
+export logitbinarycrossentropy, logitcrossentropy, predictive_entropy
export losses_catalogue
export distance, distance_mad, distance_l0, distance_l1, distance_l2, distance_linf
export distance_cosine, distance_from_target, distance_from_target_cosine
@@ -21,11 +21,11 @@ export ddp_diversity
export EnergyDifferential
export hinge_loss
export penalties_catalogue
+export choose_ad_backend
const losses_catalogue = Dict(
:logitbinarycrossentropy => logitbinarycrossentropy,
:logitcrossentropy => logitcrossentropy,
- :mse => mse,
)
const penalties_catalogue = Dict(
diff --git a/src/objectives/distance_utils.jl b/src/objectives/distance_utils.jl
index 93fae74f3..45179a669 100644
--- a/src/objectives/distance_utils.jl
+++ b/src/objectives/distance_utils.jl
@@ -2,48 +2,65 @@ using Flux: Flux
"""
distance(
- ce::AbstractCounterfactualExplanation;
- from::Union{Nothing,AbstractArray}=nothing,
+ cf::AbstractArray,
+ from::AbstractArray;
agg=mean,
p::Real=1,
weights::Union{Nothing,AbstractArray}=nothing,
+ cosine::Bool=false,
+ d::Union{Nothing,Vector{Int}}=nothing,
)
Computes the distance of the counterfactual to the original factual.
"""
function distance(
+ cf::AbstractArray,
ce::AbstractCounterfactualExplanation;
- from::Union{Nothing,AbstractArray}=nothing,
+ from::Union{AbstractArray,Nothing}=nothing,
agg=mean,
p::Real=1,
weights::Union{Nothing,AbstractArray}=nothing,
cosine::Bool=false,
+ d::Union{Nothing,Vector{Int}}=nothing,
)
if isnothing(from)
- from = CounterfactualExplanations.factual(ce)
+ from = ce.factual
+ from = CounterfactualExplanations.encode_state(ce, from)
+ end
+
+ if !isnothing(d)
+ # Select subset of features:
+ selector = Flux.onehotbatch(d, 1:size(cf, 1))
+ from = from'selector |> permutedims
+ cf = cf'selector |> permutedims
end
- cf = CounterfactualExplanations.decode_state(ce)
# Cosine:
if cosine
xs = eachslice(cf; dims=ndims(cf))
δs = map(cf -> cos_dist(cf, from), xs)
- Δ = agg(δs)
- return Δ
+ dist = agg(δs)
+ return dist
end
- if ce.num_counterfactuals == 1
- return LinearAlgebra.norm(cf .- from, p)
+ xs = eachslice(cf; dims=ndims(cf)) # slices along the last dimension (i.e. the number of counterfactuals)
+ if isnothing(weights)
+ dist = agg(map(cf -> LinearAlgebra.norm(cf .- from, p), xs)) # aggregate across counterfactuals
else
- xs = eachslice(cf; dims=ndims(cf)) # slices along the last dimension (i.e. the number of counterfactuals)
- if isnothing(weights)
- Δ = agg(map(cf -> LinearAlgebra.norm(cf .- from, p), xs)) # aggregate across counterfactuals
- else
- @assert length(weights) == size(first(xs), ndims(first(xs))) "The length of the weights vector must match the number of features."
- Δ = agg(map(cf -> (LinearAlgebra.norm.(cf .- from, p)'weights)[1], xs)) # aggregate across counterfactuals
- end
- return Δ
+ @assert length(weights) == size(first(xs), ndims(first(xs))) "The length of the weights vector must match the number of features."
+ dist = agg(map(cf -> (LinearAlgebra.norm.(cf .- from, p)'weights)[1], xs)) # aggregate across counterfactuals
end
+ return dist
+end
+
+"""
+ distance(ce::AbstractCounterfactualExplanation; kwrgs...)
+
+Overloads method to be applied directly to `ce`
+"""
+function distance(ce::AbstractCounterfactualExplanation; kwrgs...)
+ cf = CounterfactualExplanations.decode_state(ce)
+ return distance(cf, ce; kwrgs...)
end
"""
diff --git a/src/objectives/loss_functions.jl b/src/objectives/loss_functions.jl
index fcda9f700..26aeea9c0 100644
--- a/src/objectives/loss_functions.jl
+++ b/src/objectives/loss_functions.jl
@@ -1,4 +1,4 @@
-using Statistics: Statistics
+using Flux: Flux
"""
Flux.Losses.logitbinarycrossentropy(ce::AbstractCounterfactualExplanation)
@@ -30,20 +30,6 @@ function Flux.Losses.logitcrossentropy(ce::AbstractCounterfactualExplanation; kw
return loss
end
-"""
- Flux.Losses.mse(ce::AbstractCounterfactualExplanation)
-
-Simply extends the `mse` method to work with objects of type `AbstractCounterfactualExplanation`.
-"""
-function Flux.Losses.mse(ce::AbstractCounterfactualExplanation; kwargs...)
- loss = Flux.Losses.mse(
- logits(ce.M, CounterfactualExplanations.decode_state(ce)),
- ce.target_encoded;
- kwargs...,
- )
- return loss
-end
-
"""
predictive_entropy(ce::AbstractCounterfactualExplanation; agg=Statistics.mean)
diff --git a/src/objectives/penalties.jl b/src/objectives/penalties.jl
index ebb2b37a7..4a85c3232 100644
--- a/src/objectives/penalties.jl
+++ b/src/objectives/penalties.jl
@@ -12,7 +12,11 @@ using Statistics: mean
This is the distance measure proposed by Wachter et al. (2017).
"""
function distance_mad(
- ce::AbstractCounterfactualExplanation; agg=Statistics.mean, noise=1e-5, kwrgs...
+ cf::AbstractArray,
+ ce::AbstractCounterfactualExplanation;
+ agg=Statistics.mean,
+ noise=1e-5,
+ kwrgs...,
)
X = ce.data.X
mad = []
@@ -26,7 +30,7 @@ function distance_mad(
_mad = _dict[:mad_features]
push!(mad, _mad)
end
- return distance(ce; agg=agg, weights=1.0 ./ mad[1], kwrgs...)
+ return distance(cf, ce; agg=agg, weights=1.0 ./ mad[1], kwrgs...)
end
"""
@@ -34,8 +38,8 @@ end
Computes the L0 distance of the counterfactual to the original factual.
"""
-function distance_l0(ce::AbstractCounterfactualExplanation; kwrgs...)
- return distance(ce; p=0, kwrgs...)
+function distance_l0(cf::AbstractArray, ce::AbstractCounterfactualExplanation; kwrgs...)
+ return distance(cf, ce; p=0, kwrgs...)
end
"""
@@ -43,8 +47,8 @@ end
Computes the L1 distance of the counterfactual to the original factual.
"""
-function distance_l1(ce::AbstractCounterfactualExplanation; kwrgs...)
- return distance(ce; p=1, kwrgs...)
+function distance_l1(cf::AbstractArray, ce::AbstractCounterfactualExplanation; kwrgs...)
+ return distance(cf, ce; p=1, kwrgs...)
end
"""
@@ -52,8 +56,8 @@ end
Computes the L2 (Euclidean) distance of the counterfactual to the original factual.
"""
-function distance_l2(ce::AbstractCounterfactualExplanation; kwrgs...)
- return distance(ce; p=2, kwrgs...)
+function distance_l2(cf::AbstractArray, ce::AbstractCounterfactualExplanation; kwrgs...)
+ return distance(cf, ce; p=2, kwrgs...)
end
"""
@@ -61,8 +65,8 @@ end
Computes the L-inf distance of the counterfactual to the original factual.
"""
-function distance_linf(ce::AbstractCounterfactualExplanation; kwrgs...)
- return distance(ce; p=Inf, kwrgs...)
+function distance_linf(cf::AbstractArray, ce::AbstractCounterfactualExplanation; kwrgs...)
+ return distance(cf, ce; p=Inf, kwrgs...)
end
"""
@@ -70,8 +74,8 @@ end
Computes the distance of the counterfactual to the original factual using cosine similarity. See also: [`cos_dist`](@ref).
"""
-function distance_cosine(ce::AbstractCounterfactualExplanation; kwrgs...)
- return distance(ce; cosine=true, kwrgs...)
+function distance_cosine(cf::AbstractArray, ce::AbstractCounterfactualExplanation; kwrgs...)
+ return distance(cf, ce; cosine=true, kwrgs...)
end
"""
@@ -83,9 +87,12 @@ end
Evaluates how diverse the counterfactuals are using a Determinantal Point Process (DDP).
"""
function ddp_diversity(
- ce::AbstractCounterfactualExplanation; perturbation_size=1e-3, agg=det
+ cf::AbstractArray,
+ ce::AbstractCounterfactualExplanation;
+ perturbation_size=1e-3,
+ agg=det,
)
- X = ce.counterfactual_state
+ X = cf
xs = eachslice(X; dims=ndims(X))
K = [1 / (1 + LinearAlgebra.norm(x .- y)) for x in xs, y in xs]
K += LinearAlgebra.Diagonal(
@@ -113,6 +120,7 @@ Computes the distance of the counterfactual from samples in the target main. If
- `Δ::AbstractFloat`: The distance from the counterfactual to the target manifold.
"""
function distance_from_target(
+ cf::AbstractArray,
ce::AbstractCounterfactualExplanation;
K::Int=50,
choose_random::Bool=false,
@@ -144,7 +152,7 @@ function distance_from_target(
Δ = []
ChainRulesCore.ignore_derivatives() do
δ = map(eachcol(ys)) do y
- distance(ce; from=y, kwrgs...)
+ distance(cf, ce; from=y, kwrgs...)
end
push!(Δ, δ)
end
@@ -154,7 +162,7 @@ function distance_from_target(
neighbours = ys[:, ids]
# Compute distance:
- Δ = distance(ce; from=neighbours, cosine=cosine, kwrgs...) / size(neighbours, 2)
+ Δ = distance(cf, ce; from=neighbours, cosine=cosine, kwrgs...) / size(neighbours, 2)
return Δ
end
@@ -168,8 +176,10 @@ Compute the distance from a counterfactual to the target manifold using cosine s
- `ce::AbstractCounterfactualExplanation`: The counterfactual explanation object.
- `kwrgs...`: Additional keyword arguments for the distance function.
"""
-function distance_from_target_cosine(ce::AbstractCounterfactualExplanation; kwrgs...)
- return distance_from_target(ce; cosine=true, kwrgs...)
+function distance_from_target_cosine(
+ cf::AbstractArray, ce::AbstractCounterfactualExplanation; kwrgs...
+)
+ return distance_from_target(cf, ce; cosine=true, kwrgs...)
end
"""
@@ -180,8 +190,10 @@ end
Additional penalty for ClaPROARGenerator.
"""
-function model_loss_penalty(ce::AbstractCounterfactualExplanation; agg=Statistics.mean)
- x_ = CounterfactualExplanations.counterfactual(ce)
+function model_loss_penalty(
+ cf::AbstractArray, ce::AbstractCounterfactualExplanation; agg=Statistics.mean
+)
+ x_ = cf
M = ce.M
model = isa(M.model, LinearAlgebra.Vector) ? M.model : [M.model]
y_ = ce.target_encoded
@@ -232,6 +244,7 @@ Computes the energy constraint for the counterfactual explanation as in Altmeyer
- `ℒ::AbstractFloat`: The energy constraint.
"""
function energy_constraint(
+ cf::AbstractArray,
ce::AbstractCounterfactualExplanation;
agg=mean,
reg_strength::AbstractFloat=1e-3,
@@ -240,10 +253,7 @@ function energy_constraint(
)
# Setup:
- ℒ = 0
- cf = CounterfactualExplanations.decode_state(ce) # current state
t = get_target_index(ce.data.y_levels, ce.target)
- xs = eachslice(cf; dims=ndims(cf))
# Multiplier ϕ for the energy constraint:
max_steps = CounterfactualExplanations.Convergence.max_iter(ce.convergence)
@@ -251,14 +261,24 @@ function energy_constraint(
a = b / 10
ϕ = polynomial_decay(a, b, decay, total_steps(ce) + 1)
+ # Reshape to 2D: (features, samples)
+ n_samples = size(cf, ndims(cf))
+ cf_2d = reshape(cf, :, n_samples)
+
+ # Compute energies using a loop (more AD-stable than comprehension)
+ energies = map(1:n_samples) do j
+ x = @view cf_2d[:, j]
+ energy(ce.M, x, t)
+ end
+
# Generative loss:
- gen_loss = energy.(ce.M, xs, t) |> agg
+ gen_loss = agg(energies)
if reg_strength == 0.0
ℒ = ϕ * gen_loss
else
# Regularization loss:
- reg_loss = norm(energy.(ce.M, xs, t))^2 |> agg
+ reg_loss = agg(norm(energies)^2)
# Total loss:
ℒ = ϕ * (gen_loss + reg_strength * reg_loss)
@@ -274,7 +294,9 @@ end
EnergyDifferential(; K::Int=50, agg::Function=mean) = EnergyDifferential(K, agg)
-function (pen::EnergyDifferential)(ce::AbstractCounterfactualExplanation)
+function (pen::EnergyDifferential)(
+ cf::AbstractArray, ce::AbstractCounterfactualExplanation; kwrgs...
+)
# If the potential neighbours have not been computed, do so:
get!(
@@ -291,7 +313,6 @@ function (pen::EnergyDifferential)(ce::AbstractCounterfactualExplanation)
end
# Get counterfactual:
- cf = CounterfactualExplanations.decode_state(ce) # current state
xs = eachslice(cf; dims=ndims(cf))
# Compute energy differential:
@@ -318,12 +339,140 @@ Calculates the hinge loss of a counterfactual explanation with `InvalidationRate
# Returns
The hinge loss of the counterfactual explanation.
"""
-function hinge_loss(ce::AbstractCounterfactualExplanation)
+function hinge_loss(cf::AbstractArray, ce::AbstractCounterfactualExplanation)
typeof(ce.M.type) <: Models.AbstractFluxNN || throw(NotImplementedModel(ce.M))
if !(ce.convergence isa InvalidationRateConvergence)
@warn "The hinge loss is only defined for `InvalidationRateConvergence`s. Setting convergence to default `InvalidationRateConvergence`." maxlog =
1
ce.convergence = InvalidationRateConvergence()
end
- return max(0, invalidation_rate(ce) - ce.convergence.invalidation_rate)
+ return max(0, invalidation_rate(cf, ce) - ce.convergence.invalidation_rate)
+end
+
+# Single-argument convenience methods that compute cf from ce
+
+"""
+ distance_mad(ce::AbstractCounterfactualExplanation; kwargs...)
+
+Convenience method that computes cf from ce.
+"""
+function distance_mad(ce::AbstractCounterfactualExplanation; kwargs...)
+ cf = CounterfactualExplanations.decode_state(ce)
+ return distance_mad(cf, ce; kwargs...)
+end
+
+"""
+ distance_l0(ce::AbstractCounterfactualExplanation; kwargs...)
+
+Convenience method that computes cf from ce.
+"""
+function distance_l0(ce::AbstractCounterfactualExplanation; kwargs...)
+ cf = CounterfactualExplanations.decode_state(ce)
+ return distance_l0(cf, ce; kwargs...)
+end
+
+"""
+ distance_l1(ce::AbstractCounterfactualExplanation; kwargs...)
+
+Convenience method that computes cf from ce.
+"""
+function distance_l1(ce::AbstractCounterfactualExplanation; kwargs...)
+ cf = CounterfactualExplanations.decode_state(ce)
+ return distance_l1(cf, ce; kwargs...)
+end
+
+"""
+ distance_l2(ce::AbstractCounterfactualExplanation; kwargs...)
+
+Convenience method that computes cf from ce.
+"""
+function distance_l2(ce::AbstractCounterfactualExplanation; kwargs...)
+ cf = CounterfactualExplanations.decode_state(ce)
+ return distance_l2(cf, ce; kwargs...)
+end
+
+"""
+ distance_linf(ce::AbstractCounterfactualExplanation; kwargs...)
+
+Convenience method that computes cf from ce.
+"""
+function distance_linf(ce::AbstractCounterfactualExplanation; kwargs...)
+ cf = CounterfactualExplanations.decode_state(ce)
+ return distance_linf(cf, ce; kwargs...)
+end
+
+"""
+ distance_cosine(ce::AbstractCounterfactualExplanation; kwargs...)
+
+Convenience method that computes cf from ce.
+"""
+function distance_cosine(ce::AbstractCounterfactualExplanation; kwargs...)
+ cf = CounterfactualExplanations.decode_state(ce)
+ return distance_cosine(cf, ce; kwargs...)
+end
+
+"""
+ ddp_diversity(ce::AbstractCounterfactualExplanation; kwargs...)
+
+Convenience method that computes cf from ce.
+"""
+function ddp_diversity(ce::AbstractCounterfactualExplanation; kwargs...)
+ cf = CounterfactualExplanations.decode_state(ce)
+ return ddp_diversity(cf, ce; kwargs...)
+end
+
+"""
+ distance_from_target(ce::AbstractCounterfactualExplanation; kwargs...)
+
+Convenience method that computes cf from ce.
+"""
+function distance_from_target(ce::AbstractCounterfactualExplanation; kwargs...)
+ cf = CounterfactualExplanations.decode_state(ce)
+ return distance_from_target(cf, ce; kwargs...)
+end
+
+"""
+ distance_from_target_cosine(ce::AbstractCounterfactualExplanation; kwargs...)
+
+Convenience method that computes cf from ce.
+"""
+function distance_from_target_cosine(ce::AbstractCounterfactualExplanation; kwargs...)
+ cf = CounterfactualExplanations.decode_state(ce)
+ return distance_from_target_cosine(cf, ce; kwargs...)
+end
+
+"""
+ model_loss_penalty(ce::AbstractCounterfactualExplanation; kwargs...)
+
+Convenience method that computes cf from ce.
+"""
+function model_loss_penalty(ce::AbstractCounterfactualExplanation; kwargs...)
+ cf = CounterfactualExplanations.decode_state(ce)
+ return model_loss_penalty(cf, ce; kwargs...)
+end
+
+"""
+ energy_constraint(ce::AbstractCounterfactualExplanation; kwargs...)
+
+Convenience method that computes cf from ce.
+"""
+function energy_constraint(ce::AbstractCounterfactualExplanation; kwargs...)
+ cf = CounterfactualExplanations.decode_state(ce)
+ return energy_constraint(cf, ce; kwargs...)
+end
+
+"""
+ hinge_loss(ce::AbstractCounterfactualExplanation)
+
+Convenience method that computes cf from ce.
+"""
+function hinge_loss(ce::AbstractCounterfactualExplanation; kwrgs...)
+ cf = CounterfactualExplanations.decode_state(ce)
+ return hinge_loss(cf, ce)
+end
+
+# Note: EnergyDifferential is a callable struct, so the single-argument method is:
+function (pen::EnergyDifferential)(ce::AbstractCounterfactualExplanation; kwrgs...)
+ cf = CounterfactualExplanations.decode_state(ce)
+ return pen(cf, ce)
end
diff --git a/src/objectives/traits.jl b/src/objectives/traits.jl
index ee16e1845..954e8fc18 100644
--- a/src/objectives/traits.jl
+++ b/src/objectives/traits.jl
@@ -1,3 +1,5 @@
+import DifferentiationInterface as DI
+
"A base type for a style of process."
abstract type PenaltyRequirements end
@@ -21,8 +23,19 @@ needs_neighbours(::NeedsNeighbours, x) = true
Check if a generator needs access to neighbors in the target class.
"""
-needs_neighbours(gen::AbstractGenerator) =
- hasfield(typeof(gen), :penalty) ? any(needs_neighbours.(gen.penalty)) : false
+function needs_neighbours(gen::AbstractGenerator)
+ # No penalty defined:
+ if !hasfield(typeof(gen), :penalty)
+ return false
+ end
+ # No penalty supplied:
+ if isnothing(gen.penalty)
+ return false
+ end
+ # All other cases:
+ penalty = CounterfactualExplanations.flatten_penalty(gen.penalty)
+ return any(needs_neighbours.(penalty))
+end
"""
needs_neighbours(ce::AbstractCounterfactualExplanation)
@@ -30,3 +43,135 @@ needs_neighbours(gen::AbstractGenerator) =
Check if a counterfactual explanation needs access to neighbors in the target class.
"""
needs_neighbours(ce::AbstractCounterfactualExplanation) = needs_neighbours(ce.generator)
+
+"A base type for AD backend requirements"
+abstract type ADRequirements end
+
+"By default, no special AD backend is required."
+struct NoADRequirements <: ADRequirements end
+
+ADRequirements(::Type) = NoADRequirements()
+
+"This trait implies that `ForwardDiff` is required."
+struct NeedsForwardDiff <: ADRequirements end
+
+"The `hinge_loss` function requires `ForwardDiff`"
+ADRequirements(::Type{<:typeof(hinge_loss)}) = NeedsForwardDiff()
+
+"The `energy_constraint` function requires `ForwardDiff`"
+ADRequirements(::Type{<:typeof(energy_constraint)}) = NeedsForwardDiff()
+
+choose_ad_backend(::NoADRequirements) = get_global_ad_backend()
+choose_ad_backend(x::T) where {T} = choose_ad_backend(ADRequirements(T), x)
+choose_ad_backend(::NoADRequirements, x) = get_global_ad_backend()
+choose_ad_backend(::NeedsForwardDiff, x) = DI.AutoForwardDiff()
+
+needs_special_backend(x::T) where {T} = needs_special_backend(ADRequirements(T), x)
+needs_special_backend(::NoADRequirements, x) = false
+needs_special_backend(::NeedsForwardDiff, x) = true
+
+"Chooses the appropriate AD backend for the given model type"
+choose_ad_backend(mod::Model) = choose_ad_backend(mod.type)
+
+"""
+ choose_ad_backend(gen::AbstractGenerator)
+
+Choose an appropriate automatic differentiation backend for a given generator based on its penalty function. Handles both simple cases (no penalty function) and complex cases where multiple penalties might require different AD backends, ensuring that these backends are mutually exclusive.
+"""
+function choose_ad_backend(gen::AbstractGenerator)
+
+ # Simplest case (no penalty function at all):
+ if !hasfield(typeof(gen), :penalty)
+ return choose_ad_backend(NoADRequirements())
+ end
+
+ # No penalty supplied:
+ if isnothing(gen.penalty)
+ return choose_ad_backend(NoADRequirements())
+ end
+
+ # Flatten the penalty to ensure it's a single object or array of penalties
+ penalty = CounterfactualExplanations.flatten_penalty(gen.penalty)
+
+ # Check if any penalty requires a special AD backend
+ if any(needs_special_backend.(penalty))
+ @assert length(unique(choose_ad_backend.(penalty))) <= 2 "You have specified two or more penalties that require mutually exclusive AD backends."
+
+ # Filter penalties that need special backends
+ penalty = penalty[findall(needs_special_backend.(penalty))]
+
+ # Choose the unique backend among those required by the filtered penalties
+ return choose_ad_backend.(penalty) |> x -> unique(x)[1]
+ else
+ # If no special backend is needed, use the default AD backend
+ return choose_ad_backend(NoADRequirements())
+ end
+end
+
+"""
+ choose_ad_backend(backends::Vararg{<:Any})
+
+Select a single automatic differentiation backend from multiple provided backends.
+
+# Arguments
+- `backends::Vararg{<:Any}`: Variable number of AD backend instances (e.g., `AutoZygote()`, `AutoEnzyme()`).
+
+# Returns
+- `AutoZygote()` if all provided backends are `AutoZygote` instances.
+- The single non-`AutoZygote` backend if exactly one is provided among `AutoZygote` instances.
+
+# Throws
+- `AssertionError` if more than one non-`AutoZygote` backend is provided.
+
+# Examples
+
+```julia
+choose_ad_backend(AutoZygote(), AutoZygote()) # Returns AutoZygote()
+choose_ad_backend(AutoZygote(), AutoEnzyme()) # Returns AutoEnzyme()
+choose_ad_backend(AutoZygote(), AutoEnzyme(), AutoForwardDiff()) # Throws AssertionError
+```
+"""
+function choose_ad_backend(backends::Vararg{<:Any}; default_bkd=DI.AutoZygote())
+ # Filter out non-default backends
+ non_default = filter(b -> b != default_bkd, backends) |> unique
+
+ # Assert only one non-Zygote backend
+ @assert length(non_default) <= 1 "Only one non-default backend is allowed, got $(length(non_default))"
+
+ # Return non-default backend if it exists, otherwise return default
+ if isempty(non_default)
+ return default_bkd
+ else
+ return first(non_default)
+ end
+end
+
+"""
+ choose_ad_backend(ce::CounterfactualExplanation)
+
+Select a compatible automatic differentiation backend for a counterfactual explanation.
+
+Determines the AD backend by querying the backends of the model and generator within the
+counterfactual explanation, then reconciling them into a single compatible backend.
+
+# Arguments
+- `ce::CounterfactualExplanation`: A counterfactual explanation object containing a model (`M`) and a generator.
+
+# Returns
+- A single AD backend compatible with both the model and generator.
+
+# Throws
+- `AssertionError` if the model and generator use incompatible non-`AutoZygote` backends.
+
+# See Also
+- [`choose_ad_backend(backends::Vararg)`](@ref)
+"""
+function choose_ad_backend(ce::AbstractCounterfactualExplanation)
+ n_features = CounterfactualExplanations.DataPreprocessing.input_dim(ce.data)
+
+ # Check for model/generator requirments:
+ bkd_mod = choose_ad_backend(ce.M)
+ bkd_gen = choose_ad_backend(ce.generator)
+
+ return choose_ad_backend(bkd_mod, bkd_gen)
+end
diff --git a/test/Project.toml b/test/Project.toml
index ac5f071d7..70e3fd908 100644
--- a/test/Project.toml
+++ b/test/Project.toml
@@ -3,7 +3,6 @@ Aqua = "4c88cf16-eb10-579e-8560-4a9242c79595"
BenchmarkTools = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf"
CausalInference = "8e462317-f959-576b-b3c1-403f26cec956"
Chain = "8be319e6-bccf-4806-a6f7-6fae938471bc"
-CompatHelperLocal = "5224ae11-6099-4aaa-941d-3aab004bd678"
DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0"
DecisionTree = "7806a523-6efd-50cb-b5f6-3fa6f1930dbb"
EnergySamplers = "f446124b-5d5e-4171-a6dd-a1d99768d3ce"
@@ -16,40 +15,16 @@ MLDatasets = "eb30cadb-4394-5ae3-aed4-317e484a6458"
MLJBase = "a7f614a8-145f-11e9-1d2a-a57a1082229d"
MLJDecisionTreeInterface = "c6f25543-311c-4c74-83dc-3ea6d1015661"
MLJFlux = "094fc8d1-fd35-5302-93ea-dabda2abf845"
-MLJModels = "d491faf4-2d78-11e9-2867-c94bc002c0b7"
+MLJTransforms = "23777cdb-d90c-4eb0-a694-7c2b83d5c1d6"
MLUtils = "f1d291b0-491e-4a28-83b9-f70985020b54"
MultivariateStats = "6f286f6a-111f-5878-ab1e-185364afe411"
-NeuroTreeModels = "1db4e0a5-a364-4b0c-897c-2bd5a4a3a1f2"
-Pkg = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f"
Printf = "de0858da-6303-5e67-8744-51eddeeeb8d7"
Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"
Serialization = "9e88b42a-f829-5b0c-bbe9-9e923198166b"
StatsBase = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91"
Tables = "bd369af6-aec1-5ad0-b16a-f7cc5008161c"
TaijaData = "9d524318-b4e6-4a65-86d2-b2b72d07866c"
-TaijaParallel = "bf1c2c22-5e42-4e78-8b6b-92e6c673eeb0"
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
[compat]
Aqua = "0.8"
-BenchmarkTools = "1.5.0"
-CausalInference = "0.17, 0.18"
-Chain = "0.6.0"
-CompatHelperLocal = "0.1.26"
-DataFrames = "1.6.1"
-DecisionTree = "0.12.4"
-EnergySamplers = "1.0"
-Flux = "0.12, 0.13, 0.14, 0.15, 0.16"
-JointEnergyModels = "0.1.7"
-LaplaceRedux = "1.1.0"
-MLDatasets = "0.7.17"
-MLJBase = "1.7.0"
-MLJDecisionTreeInterface = "0.4.2"
-MLJModels = "0.15, 0.16, 0.17"
-MLUtils = "0.4.4"
-MultivariateStats = "0.10.3"
-NeuroTreeModels = "1.3"
-StatsBase = "0.34.3"
-Tables = "1"
-TaijaData = "1.0.0"
-julia = "1.10"
diff --git a/test/counterfactuals/encodings.jl b/test/counterfactuals/encodings.jl
index 102558347..ce3858ef6 100644
--- a/test/counterfactuals/encodings.jl
+++ b/test/counterfactuals/encodings.jl
@@ -1,5 +1,5 @@
using CounterfactualExplanations.DataPreprocessing: fit_transformer
-using CounterfactualExplanations.Models: load_mnist_mlp
+using CounterfactualExplanations.Models: load_mnist_model
using CounterfactualExplanations: decode_array
using MultivariateStats: MultivariateStats
using StatsBase: StatsBase
@@ -19,11 +19,12 @@ using CausalInference: CausalInference
if VERSION >= v"1.8"
@testset "Dimensionality Reduction" begin
- dt_pca = CounterfactualData(load_mnist(1000)...)
+ dt = CounterfactualData(load_mnist(1000)...)
+ dt_pca = deepcopy(dt)
dt_pca.input_encoder = fit_transformer(
dt_pca, MultivariateStats.PCA; maxoutdim=16
)
- M = load_mnist_mlp()
+ M = load_mnist_model(MLP())
target = 9
factual = 7
chosen = rand(findall(predict_label(M, dt_pca) .== factual))
diff --git a/test/counterfactuals/generate_counterfactual.jl b/test/counterfactuals/generate_counterfactual.jl
index 3a5b6ea4a..75fe22ca4 100644
--- a/test/counterfactuals/generate_counterfactual.jl
+++ b/test/counterfactuals/generate_counterfactual.jl
@@ -56,4 +56,22 @@ using CounterfactualExplanations.Objectives: distance_mad
@test converged(ce) == converged(_ce)
end
end
+
+ @testset "Callback" begin
+ ce = generate_counterfactual(
+ x,
+ target,
+ counterfactual_data,
+ M,
+ generator;
+ callback=(x -> x.search[:greeting] = "Hi there!"),
+ )
+ @test ce.search[:greeting] == "Hi there!"
+ end
+
+ @testset "Mutability constraints" begin
+ mutability_constraints!(counterfactual_data, [1])
+ ce = generate_counterfactual(x, target, counterfactual_data, M, generator)
+ @test typeof(ce) <: CounterfactualExplanation
+ end
end
diff --git a/test/generators/categorical_data.jl b/test/generators/categorical_data.jl
index 7856365e5..1ee4b9b16 100644
--- a/test/generators/categorical_data.jl
+++ b/test/generators/categorical_data.jl
@@ -1,4 +1,4 @@
-using MLJModels: OneHotEncoder
+using MLJTransforms: OneHotEncoder
using StatsBase: sample, Weights
@testset "Categorical data" begin
diff --git a/test/generators/probe.jl b/test/generators/probe.jl
index 96adba2f2..77cb2b604 100644
--- a/test/generators/probe.jl
+++ b/test/generators/probe.jl
@@ -10,9 +10,8 @@ using CounterfactualExplanations.Objectives
end
@testset "Custom arguments" begin
- generator = Generators.ProbeGenerator(; λ=[0.5, 0.5], loss=:mse)
+ generator = Generators.ProbeGenerator(; λ=[0.5, 0.5])
@test generator.λ == [0.5, 0.5]
- @test generator.loss == Flux.Losses.mse
end
end
@@ -39,8 +38,9 @@ end
max_iter=100, invalidation_rate=0.1
),
)
- loss = Objectives.hinge_loss(linear_counterfactual)
- rate = Convergence.invalidation_rate(linear_counterfactual)
+ cf = CounterfactualExplanations.decode_state(linear_counterfactual)
+ loss = Objectives.hinge_loss(cf, linear_counterfactual)
+ rate = Convergence.invalidation_rate(cf, linear_counterfactual)
@test rate <= 0.1
@test loss <= 0.9
end
diff --git a/test/models/generative_models.jl b/test/models/generative_models.jl
index 9b153ec1b..5932a3e62 100644
--- a/test/models/generative_models.jl
+++ b/test/models/generative_models.jl
@@ -13,9 +13,9 @@ ce = CounterfactualExplanations.generate_counterfactual(
x, target, counterfactual_data, M, generator
)
-using CounterfactualExplanations.GenerativeModels: train!, retrain!, VAE
+using CounterfactualExplanations.GenerativeModels: train!, VAE
generative_model = VAE(size(X, 1))
train!(generative_model, X)
-retrain!(generative_model, X)
+train!(generative_model, X; n_epochs=10)
@test true
diff --git a/test/models/laplace_redux/laplace_redux.jl b/test/models/laplace_redux/laplace_redux.jl
index 2f94e4efb..a3b2094ea 100644
--- a/test/models/laplace_redux/laplace_redux.jl
+++ b/test/models/laplace_redux/laplace_redux.jl
@@ -1,4 +1,5 @@
using CounterfactualExplanations
+using CounterfactualExplanations.Convergence
using CounterfactualExplanations.Models
using Flux
using LaplaceRedux
@@ -17,8 +18,9 @@ using TaijaData
x = select_factual(data, chosen)
# Search:
- generator = GenericGenerator(; opt=Descent(0.5))
- ce = generate_counterfactual(x, target, data, M, generator)
+ generator = GenericGenerator(; opt=Descent(0.5), λ=0.001)
+ conv = MaxIterConvergence(250)
+ ce = generate_counterfactual(x, target, data, M, generator; convergence=conv)
@test typeof(ce) <: CounterfactualExplanation
@test CounterfactualExplanations.counterfactual_label(ce) == [target]
end
diff --git a/test/models/models.jl b/test/models/models.jl
index a5f6f4aba..f839aeef8 100644
--- a/test/models/models.jl
+++ b/test/models/models.jl
@@ -6,7 +6,7 @@ include("flux/mlp.jl")
include("laplace_redux/laplace_redux.jl")
include("decision_tree/decision_tree.jl")
include("jem/jem.jl")
-include("neurotree/neurotree.jl")
+# include("neurotree/neurotree.jl")
include("utils.jl")
diff --git a/test/models/pretrained.jl b/test/models/pretrained.jl
index b3fffacb7..f6536b745 100644
--- a/test/models/pretrained.jl
+++ b/test/models/pretrained.jl
@@ -17,6 +17,7 @@ if VERSION >= v"1.8"
# The name of the dataset the model was trained on
dataset_name = string(key)
@testset "$dataset_name" begin
+ @info dataset_name
for (name, M) in value[:models]
name = string(name)
@testset "$name" begin
diff --git a/test/other/deprecations.jl b/test/other/deprecations.jl
index 38e6dbbd1..1353e12c3 100644
--- a/test/other/deprecations.jl
+++ b/test/other/deprecations.jl
@@ -1,12 +1,22 @@
using Flux
+using CounterfactualExplanations.GenerativeModels: VAE
+using CounterfactualExplanations.Generators
using TaijaData: load_linearly_separable
model = Chain(Dense(20, 2))
data = CounterfactualData(load_linearly_separable()...)
+X = data.X
+y = data.y
+vae = VAE(size(X, 1))
+generator = GenericGenerator()
@testset "Deprecations" begin
@test_deprecated FluxModel(model)
@test_deprecated FluxModel(data)
@test_deprecated FluxEnsemble([model, model])
@test_deprecated FluxEnsemble(data)
+ @test_deprecated CounterfactualExplanations.train!(vae, X, y)
+ @test_deprecated CounterfactualExplanations.retrain!(vae, X; n_epochs=10)
+ @test_deprecated load_mnist_mlp()
+ @test_deprecated load_mnist_ensemble()
end
diff --git a/test/other/evaluation.jl b/test/other/evaluation.jl
index 9a29aeb19..6fc307c31 100644
--- a/test/other/evaluation.jl
+++ b/test/other/evaluation.jl
@@ -3,13 +3,15 @@ using CounterfactualExplanations.Evaluation:
Benchmark,
evaluate,
validity,
+ validity_strict,
distance_measures,
concatenate_benchmarks,
- compute_divergence
-using CounterfactualExplanations.Objectives: distance
+ compute_divergence,
+ feature_sensitivity
+using CounterfactualExplanations.Generators
+using CounterfactualExplanations.Objectives
using Serialization: serialize
using TaijaData: load_moons, load_circles
-using TaijaParallel: ThreadsParallelizer
# Dataset
data = TaijaData.load_overlapping()
@@ -48,9 +50,28 @@ generators = Dict(
)
@testset "Evaluation" begin
+ @test Generators.total_loss(ce) isa AbstractFloat
@test typeof(evaluate(ce; measure=validity)) <: Vector
+ @test typeof(evaluate(ce; measure=validity_strict)) <: Vector
+ @test typeof(evaluate(ce; measure=feature_sensitivity)) <: Vector
@test typeof(evaluate(ce; measure=distance)) <: Vector
@test typeof(evaluate(ce; measure=distance_measures)) <: Vector
+ @test typeof(
+ evaluate(
+ ce;
+ measure=[
+ Objectives.distance_mad,
+ Objectives.distance_cosine,
+ Objectives.distance_from_target,
+ Objectives.distance_from_target_cosine,
+ Objectives.ddp_diversity,
+ Objectives.model_loss_penalty,
+ Objectives.energy_constraint,
+ Objectives.EnergyDifferential(),
+ Objectives.hinge_loss,
+ ],
+ ),
+ ) <: Vector
@test typeof(evaluate(ce)) <: Vector
@test typeof(evaluate.(ces)) <: Vector
@test typeof(evaluate.(ces; report_each=true)) <: Vector
@@ -76,6 +97,19 @@ generators = Dict(
@testset "Divergence Metrics" begin
@test isnan(evaluate(ce; measure=MMD())[1][1])
end
+
+ @testset "Multiple results per CE (e.g. feature sensitivity)" begin
+ df = evaluate(
+ ce;
+ measure=function (x; kwrgs...)
+ feature_sensitivity(x, [1, 2]; kwrgs...)
+ end,
+ report_each=true,
+ output_format=:DataFrame,
+ )
+ @test df isa DataFrame
+ Evaluation.get_outid.(df.variable)
+ end
end
@testset "Benchmarking" begin
@@ -83,7 +117,7 @@ end
@testset "Parallelization" begin
@testset "Threads" begin
- parallelizer = ThreadsParallelizer()
+ parallelizer = nothing
bmk = benchmark(
counterfactual_data;
convergence=:generator_conditions,
@@ -189,7 +223,7 @@ end
mmd_generic = mmd(ces, counterfactual_data, n_individuals)
bmk =
- benchmark(ces; measure=[validity, MMD()]) |>
+ benchmark(counterfactual_data; n_runs=2, measure=[validity, MMD()]) |>
bmk -> compute_divergence(
bmk, [validity, MMD(; compute_p=nothing)], counterfactual_data
)
diff --git a/test/other/objectives.jl b/test/other/objectives.jl
index 1cf7af960..3ccfbe411 100644
--- a/test/other/objectives.jl
+++ b/test/other/objectives.jl
@@ -19,11 +19,13 @@ ce = generate_counterfactual(x, target, counterfactual_data, M, generator)
for (lname, lfun) in Objectives.losses_catalogue
@test lfun(ce) isa AbstractFloat
end
+ @test predictive_entropy(ce) isa AbstractFloat
end
@testset "Penalties" begin
for (pname, pfun) in Objectives.penalties_catalogue
- @test pfun(ce) isa AbstractFloat
+ cf = CounterfactualExplanations.decode_state(ce)
+ @test pfun(cf, ce) isa AbstractFloat
end
@testset "EnergyDifferential" begin
@@ -38,6 +40,7 @@ end
ce = generate_counterfactual(x, target, counterfactual_data, M_tree, generator)
# EnergyDifferential:
- @test_throws NotImplementedModel EnergyDifferential()(ce)
+ cf = CounterfactualExplanations.decode_state(ce)
+ @test_throws NotImplementedModel EnergyDifferential()(cf, ce)
end
end
diff --git a/test/setup.jl b/test/setup.jl
index 048448daf..5d6221641 100644
--- a/test/setup.jl
+++ b/test/setup.jl
@@ -9,11 +9,10 @@ using Test
using DataFrames
using DecisionTree
using Flux
-using LaplaceRedux
+# using LaplaceRedux
using LinearAlgebra
using MLDatasets
using MLJBase
-using MLJDecisionTreeInterface
using Printf
using MLUtils
using Random
@@ -32,3 +31,15 @@ include("utils.jl")
# Load synthetic data, models, generators
synthetic = _load_synthetic()
generators = Generators.generator_catalogue
+
+# Counteractual data and model:
+counterfactual_data = CounterfactualData(load_linearly_separable()...)
+M = fit_model(counterfactual_data, :Linear)
+target = 2
+factual = 1
+chosen = rand(findall(predict_label(M, counterfactual_data) .== factual))
+x = select_factual(counterfactual_data, chosen)
+
+# Search:
+generator = Generators.GenericGenerator()
+ce = generate_counterfactual(x, target, counterfactual_data, M, generator)
diff --git a/test/utils.jl b/test/utils.jl
index 23712a8e8..8739da6e3 100644
--- a/test/utils.jl
+++ b/test/utils.jl
@@ -52,8 +52,8 @@ function _load_pretrained_models()
pretrained = Dict(
:mnist => Dict(
:models => Dict(
- :mlp => Models.load_mnist_mlp(),
- :ensemble => Models.load_mnist_ensemble(),
+ :mlp => Models.load_mnist_model(MLP()),
+ :ensemble => Models.load_mnist_model(DeepEnsemble()),
),
:latent => Dict(
:vae_strong => Models.load_mnist_vae(; strong=true),