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),