diff --git a/Project.toml b/Project.toml index fec6be5..7a5a80d 100644 --- a/Project.toml +++ b/Project.toml @@ -72,7 +72,7 @@ NaNMath = "1.1.3" Optimisers = "0.4.6" Optimization = "3.11, 4" Random = "1.10.0" -SimpleChains = "0.4" +SimpleChains = "0.4.8" StableRNGs = "1.0.2" StaticArrays = "1.9.13" StatsBase = "0.34.4" diff --git a/docs/.gitignore b/docs/.gitignore index 075b254..0e3521a 100644 --- a/docs/.gitignore +++ b/docs/.gitignore @@ -1 +1,3 @@ /.quarto/ + +**/*.quarto_ipynb diff --git a/docs/src/tutorials/Manifest-v1.11.toml b/docs/src/tutorials/Manifest-v1.11.toml new file mode 100644 index 0000000..4f4e554 --- /dev/null +++ b/docs/src/tutorials/Manifest-v1.11.toml @@ -0,0 +1,3398 @@ +# This file is machine-generated - editing it directly is not advised + +julia_version = "1.11.9" +manifest_format = "2.0" +project_hash = "9c33017a188b1974d0c0c424bd1863131c3a2b25" + +[[deps.ADTypes]] +git-tree-sha1 = "f7304359109c768cf32dc5fa2d371565bb63b68a" +uuid = "47edcb42-4c32-4615-8424-f2b9edc5f35b" +version = "1.21.0" +weakdeps = ["ChainRulesCore", "ConstructionBase", "EnzymeCore"] + + [deps.ADTypes.extensions] + ADTypesChainRulesCoreExt = "ChainRulesCore" + ADTypesConstructionBaseExt = "ConstructionBase" + ADTypesEnzymeCoreExt = "EnzymeCore" + +[[deps.AbstractFFTs]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "d92ad398961a3ed262d8bf04a1a2b8340f915fef" +uuid = "621f4979-c628-5d54-868e-fcf4e3e8185c" +version = "1.5.0" +weakdeps = ["ChainRulesCore", "Test"] + + [deps.AbstractFFTs.extensions] + AbstractFFTsChainRulesCoreExt = "ChainRulesCore" + AbstractFFTsTestExt = "Test" + +[[deps.AbstractTrees]] +git-tree-sha1 = "2d9c9a55f9c93e8887ad391fbae72f8ef55e1177" +uuid = "1520ce14-60c1-5f80-bbc7-55ef81b5835c" +version = "0.4.5" + +[[deps.Accessors]] +deps = ["CompositionsBase", "ConstructionBase", "Dates", "InverseFunctions", "MacroTools"] +git-tree-sha1 = "856ecd7cebb68e5fc87abecd2326ad59f0f911f3" +uuid = "7d9f7c33-5ae7-4f3b-8dc6-eff91059b697" +version = "0.1.43" + + [deps.Accessors.extensions] + AxisKeysExt = "AxisKeys" + IntervalSetsExt = "IntervalSets" + LinearAlgebraExt = "LinearAlgebra" + StaticArraysExt = "StaticArrays" + StructArraysExt = "StructArrays" + TestExt = "Test" + UnitfulExt = "Unitful" + + [deps.Accessors.weakdeps] + AxisKeys = "94b1ba4f-4ee9-5380-92f1-94cde586c3c5" + IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953" + LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + StructArrays = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" + Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" + +[[deps.Adapt]] +deps = ["LinearAlgebra", "Requires"] +git-tree-sha1 = "7e35fca2bdfba44d797c53dfe63a51fabf39bfc0" +uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" +version = "4.4.0" +weakdeps = ["SparseArrays", "StaticArrays"] + + [deps.Adapt.extensions] + AdaptSparseArraysExt = "SparseArrays" + AdaptStaticArraysExt = "StaticArrays" + +[[deps.AdaptivePredicates]] +git-tree-sha1 = "7e651ea8d262d2d74ce75fdf47c4d63c07dba7a6" +uuid = "35492f91-a3bd-45ad-95db-fcad7dcfedb7" +version = "1.2.0" + +[[deps.AliasTables]] +deps = ["PtrArrays", "Random"] +git-tree-sha1 = "9876e1e164b144ca45e9e3198d0b689cadfed9ff" +uuid = "66dad0bd-aa9a-41b7-9441-69ab47430ed8" +version = "1.1.3" + +[[deps.Animations]] +deps = ["Colors"] +git-tree-sha1 = "e092fa223bf66a3c41f9c022bd074d916dc303e7" +uuid = "27a7e980-b3e6-11e9-2bcd-0b925532e340" +version = "0.4.2" + +[[deps.ArgCheck]] +git-tree-sha1 = "f9e9a66c9b7be1ad7372bbd9b062d9230c30c5ce" +uuid = "dce04be8-c92d-5529-be00-80e4d2c0e197" +version = "2.5.0" + +[[deps.ArgTools]] +uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" +version = "1.1.2" + +[[deps.ArrayInterface]] +deps = ["Adapt", "LinearAlgebra"] +git-tree-sha1 = "d81ae5489e13bc03567d4fbbb06c546a5e53c857" +uuid = "4fba245c-0d91-5ea0-9b3e-6abc04ee57a9" +version = "7.22.0" + + [deps.ArrayInterface.extensions] + ArrayInterfaceBandedMatricesExt = "BandedMatrices" + ArrayInterfaceBlockBandedMatricesExt = "BlockBandedMatrices" + ArrayInterfaceCUDAExt = "CUDA" + ArrayInterfaceCUDSSExt = ["CUDSS", "CUDA"] + ArrayInterfaceChainRulesCoreExt = "ChainRulesCore" + ArrayInterfaceChainRulesExt = "ChainRules" + ArrayInterfaceGPUArraysCoreExt = "GPUArraysCore" + ArrayInterfaceMetalExt = "Metal" + ArrayInterfaceReverseDiffExt = "ReverseDiff" + ArrayInterfaceSparseArraysExt = "SparseArrays" + ArrayInterfaceStaticArraysCoreExt = "StaticArraysCore" + ArrayInterfaceTrackerExt = "Tracker" + + [deps.ArrayInterface.weakdeps] + BandedMatrices = "aae01518-5342-5314-be14-df237901396f" + BlockBandedMatrices = "ffab5731-97b5-5995-9138-79e8c1846df0" + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + 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" + Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" + +[[deps.Artifacts]] +uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" +version = "1.11.0" + +[[deps.Atomix]] +deps = ["UnsafeAtomics"] +git-tree-sha1 = "29bb0eb6f578a587a49da16564705968667f5fa8" +uuid = "a9b6321e-bd34-4604-b9c9-b65b8de01458" +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.Automa]] +deps = ["PrecompileTools", "SIMD", "TranscodingStreams"] +git-tree-sha1 = "a8f503e8e1a5f583fbef15a8440c8c7e32185df2" +uuid = "67c07d97-cdcb-5c2c-af73-a7f9c32a568b" +version = "1.1.0" + +[[deps.AxisAlgorithms]] +deps = ["LinearAlgebra", "Random", "SparseArrays", "WoodburyMatrices"] +git-tree-sha1 = "01b8ccb13d68535d73d2b0c23e39bd23155fb712" +uuid = "13072b0f-2c55-5437-9ae7-d433b7a33950" +version = "1.1.0" + +[[deps.AxisArrays]] +deps = ["Dates", "IntervalSets", "IterTools", "RangeArrays"] +git-tree-sha1 = "4126b08903b777c88edf1754288144a0492c05ad" +uuid = "39de3d68-74b9-583c-8d2d-e117c070f3a9" +version = "0.4.8" + +[[deps.BFloat16s]] +deps = ["LinearAlgebra", "Printf", "Random"] +git-tree-sha1 = "e386db8b4753b42caac75ac81d0a4fe161a68a97" +uuid = "ab4f0b2a-ad5b-11e8-123f-65d77653426b" +version = "0.6.1" + +[[deps.BangBang]] +deps = ["Accessors", "ConstructionBase", "InitialValues", "LinearAlgebra"] +git-tree-sha1 = "308d82aa3d83140909590aa5a7824540944f110f" +uuid = "198e06fe-97b7-11e9-32a5-e1d131e6ad66" +version = "0.4.8" + + [deps.BangBang.extensions] + BangBangChainRulesCoreExt = "ChainRulesCore" + BangBangDataFramesExt = "DataFrames" + BangBangStaticArraysExt = "StaticArrays" + BangBangStructArraysExt = "StructArrays" + BangBangTablesExt = "Tables" + BangBangTypedTablesExt = "TypedTables" + + [deps.BangBang.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + StructArrays = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" + Tables = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" + TypedTables = "9d95f2ec-7b3d-5a63-8d20-e2491e220bb9" + +[[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" +uuid = "9718e550-a3fa-408a-8086-8db961cd8217" +version = "0.1.1" + +[[deps.Bijectors]] +deps = ["ArgCheck", "ChainRulesCore", "ChangesOfVariables", "Distributions", "DocStringExtensions", "Functors", "InverseFunctions", "IrrationalConstants", "LinearAlgebra", "LogExpFunctions", "MappedArrays", "Random", "Reexport", "Roots", "SparseArrays", "Statistics"] +git-tree-sha1 = "52f3f101c0c541145da25fba9805f3ef076f2d96" +uuid = "76274a88-744f-5084-9051-94815aaf08c4" +version = "0.15.16" + + [deps.Bijectors.extensions] + BijectorsDistributionsADExt = "DistributionsAD" + BijectorsEnzymeCoreExt = "EnzymeCore" + BijectorsForwardDiffExt = "ForwardDiff" + BijectorsLazyArraysExt = "LazyArrays" + BijectorsMooncakeExt = "Mooncake" + BijectorsReverseDiffChainRulesExt = ["ChainRules", "ReverseDiff"] + BijectorsReverseDiffExt = "ReverseDiff" + + [deps.Bijectors.weakdeps] + ChainRules = "082447d4-558c-5d27-93f4-14fc19e9eca2" + DistributionsAD = "ced4e74d-a319-5a8a-b0ac-84af2272839c" + EnzymeCore = "f151be2c-9106-41f4-ab19-57ee4f262869" + ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + LazyArrays = "5078a376-72f3-5289-bfd5-ec5146d43c02" + Mooncake = "da2b9cff-9c12-43a0-ae48-6db2b0edb7d6" + ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + +[[deps.BitFlags]] +git-tree-sha1 = "0691e34b3bb8be9307330f88d1a3c3f25466c24d" +uuid = "d1d4a3ce-64b1-5f1a-9ba4-7e7e69966f35" +version = "0.1.9" + +[[deps.BitTwiddlingConvenienceFunctions]] +deps = ["Static"] +git-tree-sha1 = "f21cfd4950cb9f0587d5067e69405ad2acd27b87" +uuid = "62783981-4cbd-42fc-bca8-16325de8dc4b" +version = "0.1.6" + +[[deps.BlockDiagonals]] +deps = ["FillArrays", "LinearAlgebra"] +git-tree-sha1 = "6e0ac86a90783f36f6daa496acf39ca138be8922" +uuid = "0a1fb500-61f7-11e9-3c65-f5ef3456f9f0" +version = "0.2.0" +weakdeps = ["ChainRulesCore"] + + [deps.BlockDiagonals.extensions] + ChainRulesCoreExt = "ChainRulesCore" + +[[deps.Bzip2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "1b96ea4a01afe0ea4090c5c8039690672dd13f2e" +uuid = "6e34b625-4abd-537c-b88f-471c36dfa7a0" +version = "1.0.9+0" + +[[deps.CEnum]] +git-tree-sha1 = "389ad5c84de1ae7cf0e28e381131c98ea87d54fc" +uuid = "fa961155-64e5-5f13-b03f-caf6b980ea82" +version = "0.5.0" + +[[deps.CPUSummary]] +deps = ["CpuId", "IfElse", "PrecompileTools", "Preferences", "Static"] +git-tree-sha1 = "f3a21d7fc84ba618a779d1ed2fcca2e682865bab" +uuid = "2a0fbf3d-bb9c-48f3-b0a9-814d99fd7ab9" +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"] +git-tree-sha1 = "e329286945d0cfc04456972ea732551869af1cfc" +uuid = "4e9b3aee-d8a1-5a3d-ad8b-7d824db253f0" +version = "1.0.1+0" + +[[deps.CUDA]] +deps = ["AbstractFFTs", "Adapt", "BFloat16s", "CEnum", "CUDA_Compiler_jll", "CUDA_Driver_jll", "CUDA_Runtime_Discovery", "CUDA_Runtime_jll", "Crayons", "DataFrames", "ExprTools", "GPUArrays", "GPUCompiler", "GPUToolbox", "KernelAbstractions", "LLVM", "LLVMLoopInfo", "LazyArtifacts", "Libdl", "LinearAlgebra", "Logging", "NVTX", "Preferences", "PrettyTables", "Printf", "Random", "Random123", "RandomNumbers", "Reexport", "SparseArrays", "StaticArrays", "Statistics", "demumble_jll"] +git-tree-sha1 = "3fe1fb600b6ec029697416d5851ef0661c538f20" +uuid = "052768ef-5323-5732-b1bb-66c8b64840ba" +version = "5.9.6" + + [deps.CUDA.extensions] + ChainRulesCoreExt = "ChainRulesCore" + EnzymeCoreExt = "EnzymeCore" + SparseMatricesCSRExt = "SparseMatricesCSR" + SpecialFunctionsExt = "SpecialFunctions" + + [deps.CUDA.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + EnzymeCore = "f151be2c-9106-41f4-ab19-57ee4f262869" + SparseMatricesCSR = "a0a7dd2c-ebf4-11e9-1f05-cf50bc540ca1" + SpecialFunctions = "276daf66-3868-5448-9aa4-cd146d93841b" + +[[deps.CUDA_Compiler_jll]] +deps = ["Artifacts", "CUDA_Driver_jll", "CUDA_Runtime_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "TOML"] +git-tree-sha1 = "e547b2202721853ec06c6d9a71c87426419ba765" +uuid = "d1e2174e-dfdc-576e-b43e-73b79eb1aca8" +version = "0.4.1+1" + +[[deps.CUDA_Driver_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "23bf4e60006b78544f753880fbcf1aa158a7669c" +uuid = "4ee394cb-3365-5eb0-8335-949819d2adfc" +version = "13.1.0+2" + +[[deps.CUDA_Runtime_Discovery]] +deps = ["Libdl"] +git-tree-sha1 = "f9a521f52d236fe49f1028d69e549e7f2644bb72" +uuid = "1af6417a-86b4-443c-805f-a4643ffb695f" +version = "1.0.0" + +[[deps.CUDA_Runtime_jll]] +deps = ["Artifacts", "CUDA_Driver_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "TOML"] +git-tree-sha1 = "92cd84e2b760e471d647153ea5efc5789fc5e8b2" +uuid = "76a88914-d11a-5bdc-97e0-2f5a05c973a2" +version = "0.19.2+0" + +[[deps.CUDNN_jll]] +deps = ["Artifacts", "CUDA_Runtime_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "TOML"] +git-tree-sha1 = "dff9a69017686c95f1fd601c63c088244b3db75b" +uuid = "62b44479-cb7b-5706-934f-f13b2eb2e645" +version = "9.17.1+0" + +[[deps.Cairo]] +deps = ["Cairo_jll", "Colors", "Glib_jll", "Graphics", "Libdl", "Pango_jll"] +git-tree-sha1 = "71aa551c5c33f1a4415867fe06b7844faadb0ae9" +uuid = "159f3aea-2a34-519c-b102-8c37f9878175" +version = "1.1.1" + +[[deps.CairoMakie]] +deps = ["CRC32c", "Cairo", "Cairo_jll", "Colors", "FileIO", "FreeType", "GeometryBasics", "LinearAlgebra", "Makie", "PrecompileTools"] +git-tree-sha1 = "5017d6849aff775febd36049f7d926a5fb6677ec" +uuid = "13f3f980-e62b-5c42-98c6-ff1f3baf88f0" +version = "0.15.8" + +[[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 = "a21c5464519504e41e0cbc91f0188e8ca23d7440" +uuid = "83423d85-b0ee-5818-9007-b63ccbeb887a" +version = "1.18.5+1" + +[[deps.ChainRules]] +deps = ["Adapt", "ChainRulesCore", "Compat", "Distributed", "GPUArraysCore", "IrrationalConstants", "LinearAlgebra", "Random", "RealDot", "SparseArrays", "SparseInverseSubset", "Statistics", "StructArrays", "SuiteSparse"] +git-tree-sha1 = "3c190c570fb3108c09f838607386d10c71701789" +uuid = "082447d4-558c-5d27-93f4-14fc19e9eca2" +version = "1.73.0" + +[[deps.ChainRulesCore]] +deps = ["Compat", "LinearAlgebra"] +git-tree-sha1 = "e4c6a16e77171a5f5e25e9646617ab1c276c5607" +uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" +version = "1.26.0" +weakdeps = ["SparseArrays"] + + [deps.ChainRulesCore.extensions] + ChainRulesCoreSparseArraysExt = "SparseArrays" + +[[deps.ChangesOfVariables]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "3aa4bf1532aa2e14e0374c4fd72bed9a9d0d0f6c" +uuid = "9e997f8a-9a97-42d5-a9f1-ce6bfc15e2c0" +version = "0.1.10" +weakdeps = ["InverseFunctions", "Test"] + + [deps.ChangesOfVariables.extensions] + ChangesOfVariablesInverseFunctionsExt = "InverseFunctions" + ChangesOfVariablesTestExt = "Test" + +[[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" +uuid = "fb6a15b2-703c-40df-9091-08a04967cfa9" +version = "0.1.13" + +[[deps.CodecZlib]] +deps = ["TranscodingStreams", "Zlib_jll"] +git-tree-sha1 = "962834c22b66e32aa10f7611c08c8ca4e20749a9" +uuid = "944b1d66-785c-5afd-91f1-9de20f533193" +version = "0.7.8" + +[[deps.ColorBrewer]] +deps = ["Colors", "JSON"] +git-tree-sha1 = "07da79661b919001e6863b81fc572497daa58349" +uuid = "a2cac450-b92f-5266-8821-25eda20663c8" +version = "0.4.2" + +[[deps.ColorSchemes]] +deps = ["ColorTypes", "ColorVectorSpace", "Colors", "FixedPointNumbers", "PrecompileTools", "Random"] +git-tree-sha1 = "b0fd3f56fa442f81e0a47815c92245acfaaa4e34" +uuid = "35d6a980-a343-548e-a6ea-1d62b119f2f4" +version = "3.31.0" + +[[deps.ColorTypes]] +deps = ["FixedPointNumbers", "Random"] +git-tree-sha1 = "67e11ee83a43eb71ddc950302c53bf33f0690dfe" +uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f" +version = "0.12.1" +weakdeps = ["StyledStrings"] + + [deps.ColorTypes.extensions] + StyledStringsExt = "StyledStrings" + +[[deps.ColorVectorSpace]] +deps = ["ColorTypes", "FixedPointNumbers", "LinearAlgebra", "Requires", "Statistics", "TensorCore"] +git-tree-sha1 = "8b3b6f87ce8f65a2b4f857528fd8d70086cd72b1" +uuid = "c3611d14-8923-5661-9e6a-0046d554d3a4" +version = "0.11.0" +weakdeps = ["SpecialFunctions"] + + [deps.ColorVectorSpace.extensions] + SpecialFunctionsExt = "SpecialFunctions" + +[[deps.Colors]] +deps = ["ColorTypes", "FixedPointNumbers", "Reexport"] +git-tree-sha1 = "37ea44092930b1811e666c3bc38065d7d87fcc74" +uuid = "5ae59095-9a9b-59fe-a467-6f913c188581" +version = "0.13.1" + +[[deps.Combinatorics]] +git-tree-sha1 = "c761b00e7755700f9cdf5b02039939d1359330e1" +uuid = "861a8166-3701-5b0c-9a16-15d98fcdc6aa" +version = "1.1.0" + +[[deps.CommonSolve]] +git-tree-sha1 = "78ea4ddbcf9c241827e7035c3a03e2e456711470" +uuid = "38540f10-b2f7-11e9-35d8-d573e4eb0ff2" +version = "0.2.6" + +[[deps.CommonSubexpressions]] +deps = ["MacroTools"] +git-tree-sha1 = "cda2cfaebb4be89c9084adaca7dd7333369715c5" +uuid = "bbf7d656-a473-5ed7-a52c-81e309532950" +version = "0.3.1" + +[[deps.CommonWorldInvalidations]] +git-tree-sha1 = "ae52d1c52048455e85a387fbee9be553ec2b68d0" +uuid = "f70d9fcc-98c5-4d4a-abd7-e4cdeebd8ca8" +version = "1.0.0" + +[[deps.Compat]] +deps = ["TOML", "UUIDs"] +git-tree-sha1 = "9d8a54ce4b17aa5bdce0ea5c34bc5e7c340d16ad" +uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" +version = "4.18.1" +weakdeps = ["Dates", "LinearAlgebra"] + + [deps.Compat.extensions] + CompatLinearAlgebraExt = "LinearAlgebra" + +[[deps.CompilerSupportLibraries_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" +version = "1.1.1+0" + +[[deps.ComponentArrays]] +deps = ["Adapt", "ArrayInterface", "ChainRulesCore", "ConstructionBase", "Functors", "LinearAlgebra", "StaticArrayInterface", "StaticArraysCore"] +git-tree-sha1 = "0d1b8b3d556d70a29ad515325cd2f5f4ed703e09" +uuid = "b0b7db55-cfe3-40fc-9ded-d10e2dbeff66" +version = "0.15.32" + + [deps.ComponentArrays.extensions] + ComponentArraysGPUArraysExt = "GPUArrays" + ComponentArraysKernelAbstractionsExt = "KernelAbstractions" + ComponentArraysOptimisersExt = "Optimisers" + ComponentArraysReactantExt = "Reactant" + ComponentArraysRecursiveArrayToolsExt = "RecursiveArrayTools" + ComponentArraysReverseDiffExt = "ReverseDiff" + ComponentArraysSciMLBaseExt = "SciMLBase" + ComponentArraysTrackerExt = "Tracker" + ComponentArraysZygoteExt = "Zygote" + + [deps.ComponentArrays.weakdeps] + GPUArrays = "0c68f7d7-f131-5f86-a1c3-88cf8149b2d7" + KernelAbstractions = "63c18a36-062a-441e-b654-da1e3ab1ce7c" + Optimisers = "3bd65402-5787-11e9-1adc-39752487f4e2" + Reactant = "3c362404-f566-11ee-1572-e11a4b42c853" + RecursiveArrayTools = "731186ca-8d62-57ce-b412-fbd966d074cd" + ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + SciMLBase = "0bca4576-84f4-4d90-8ffe-ffa030f20462" + Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" + Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f" + +[[deps.CompositionsBase]] +git-tree-sha1 = "802bb88cd69dfd1509f6670416bd4434015693ad" +uuid = "a33af91c-f02d-484b-be07-31d278c5ca2b" +version = "0.1.2" +weakdeps = ["InverseFunctions"] + + [deps.CompositionsBase.extensions] + CompositionsBaseInverseFunctionsExt = "InverseFunctions" + +[[deps.ComputePipeline]] +deps = ["Observables", "Preferences"] +git-tree-sha1 = "76dab592fa553e378f9dd8adea16fe2591aa3daa" +uuid = "95dc2771-c249-4cd0-9c9f-1f3b4330693c" +version = "0.1.6" + +[[deps.ConcreteStructs]] +git-tree-sha1 = "f749037478283d372048690eb3b5f92a79432b34" +uuid = "2569d6c7-a4a2-43d3-a901-331e8e4be471" +version = "0.2.3" + +[[deps.ConcurrentUtilities]] +deps = ["Serialization", "Sockets"] +git-tree-sha1 = "d9d26935a0bcffc87d2613ce14c527c99fc543fd" +uuid = "f0e56b4a-5159-44fe-b623-3e5288b988bb" +version = "2.5.0" + +[[deps.ConsoleProgressMonitor]] +deps = ["Logging", "ProgressMeter"] +git-tree-sha1 = "3ab7b2136722890b9af903859afcf457fa3059e8" +uuid = "88cd18e8-d9cc-4ea6-8889-5259c0d15c8b" +version = "0.1.2" + +[[deps.ConstructionBase]] +git-tree-sha1 = "b4b092499347b18a015186eae3042f72267106cb" +uuid = "187b0558-2788-49d3-abe0-74a17ed4e7c9" +version = "1.6.0" +weakdeps = ["IntervalSets", "LinearAlgebra", "StaticArrays"] + + [deps.ConstructionBase.extensions] + ConstructionBaseIntervalSetsExt = "IntervalSets" + ConstructionBaseLinearAlgebraExt = "LinearAlgebra" + ConstructionBaseStaticArraysExt = "StaticArrays" + +[[deps.ContextVariablesX]] +deps = ["Compat", "Logging", "UUIDs"] +git-tree-sha1 = "25cc3803f1030ab855e383129dcd3dc294e322cc" +uuid = "6add18c4-b38d-439d-96f6-d6bc489c04c5" +version = "0.1.3" + +[[deps.Contour]] +git-tree-sha1 = "439e35b0b36e2e5881738abc8857bd92ad6ff9a8" +uuid = "d38c429a-6771-53c6-b99e-75d170b6e991" +version = "0.6.3" + +[[deps.CpuId]] +deps = ["Markdown"] +git-tree-sha1 = "fcbb72b032692610bfbdb15018ac16a36cf2e406" +uuid = "adafc99b-e345-5852-983c-f28acb93d879" +version = "0.3.1" + +[[deps.Crayons]] +git-tree-sha1 = "249fe38abf76d48563e2f4556bebd215aa317e15" +uuid = "a8cc5b0e-0ffa-5ad4-8c14-923d3ee1735f" +version = "4.1.1" + +[[deps.DataAPI]] +git-tree-sha1 = "abe83f3a2f1b857aac70ef8b269080af17764bbe" +uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a" +version = "1.16.0" + +[[deps.DataFrames]] +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.8.1" + +[[deps.DataStructures]] +deps = ["OrderedCollections"] +git-tree-sha1 = "e357641bb3e0638d353c4b29ea0e40ea644066a6" +uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" +version = "0.19.3" + +[[deps.DataValueInterfaces]] +git-tree-sha1 = "bfc1187b79289637fa0ef6d4436ebdfe6905cbd6" +uuid = "e2d170a0-9d28-54be-80f0-106bbe20a464" +version = "1.0.0" + +[[deps.Dates]] +deps = ["Printf"] +uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" +version = "1.11.0" + +[[deps.Dbus_jll]] +deps = ["Artifacts", "Expat_jll", "JLLWrappers", "Libdl"] +git-tree-sha1 = "473e9afc9cf30814eb67ffa5f2db7df82c3ad9fd" +uuid = "ee1fde0b-3d02-5ea6-8484-8dfef6360eab" +version = "1.16.2+0" + +[[deps.DefineSingletons]] +git-tree-sha1 = "0fba8b706d0178b4dc7fd44a96a92382c9065c2c" +uuid = "244e2a9f-e319-4986-a169-4d1fe445cd52" +version = "0.1.2" + +[[deps.DelaunayTriangulation]] +deps = ["AdaptivePredicates", "EnumX", "ExactPredicates", "Random"] +git-tree-sha1 = "c55f5a9fd67bdbc8e089b5a3111fe4292986a8e8" +uuid = "927a84f5-c5f4-47a5-9785-b46e178433df" +version = "1.6.6" + +[[deps.DelimitedFiles]] +deps = ["Mmap"] +git-tree-sha1 = "9e2f36d3c96a820c678f2f1f1782582fcf685bae" +uuid = "8bb1440f-4735-579b-a4ab-409b98df4dab" +version = "1.9.1" + +[[deps.DiffResults]] +deps = ["StaticArraysCore"] +git-tree-sha1 = "782dd5f4561f5d267313f23853baaaa4c52ea621" +uuid = "163ba53b-c6d8-5494-b064-1a9d43ac40c5" +version = "1.1.0" + +[[deps.DiffRules]] +deps = ["IrrationalConstants", "LogExpFunctions", "NaNMath", "Random", "SpecialFunctions"] +git-tree-sha1 = "23163d55f885173722d1e4cf0f6110cdbaf7e272" +uuid = "b552c78f-8df3-52c6-915a-8e097449b14b" +version = "1.15.1" + +[[deps.DifferentiationInterface]] +deps = ["ADTypes", "LinearAlgebra"] +git-tree-sha1 = "7ae99144ea44715402c6c882bfef2adbeadbc4ce" +uuid = "a0c0ee7d-e4b9-4e03-894e-1c5f64a51d63" +version = "0.7.16" + + [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.DispatchDoctor]] +deps = ["MacroTools", "Preferences"] +git-tree-sha1 = "42cd00edaac86f941815fe557c1d01e11913e07c" +uuid = "8d63f2c5-f18a-4cf2-ba9d-b3f60fc568c8" +version = "0.4.28" +weakdeps = ["ChainRulesCore", "EnzymeCore"] + + [deps.DispatchDoctor.extensions] + DispatchDoctorChainRulesCoreExt = "ChainRulesCore" + DispatchDoctorEnzymeCoreExt = "EnzymeCore" + +[[deps.Distributed]] +deps = ["Random", "Serialization", "Sockets"] +uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" +version = "1.11.0" + +[[deps.DistributionFits]] +deps = ["Distributions", "FillArrays", "LinearAlgebra", "Reexport", "Requires", "StaticArrays", "Statistics", "StatsAPI", "StatsFuns"] +git-tree-sha1 = "a50a9fbdcccc1cb08ff2e1f40c37a268a74b8879" +uuid = "45214091-1ed4-4409-9bcf-fdb48a05e921" +version = "0.3.9" + + [deps.DistributionFits.extensions] + DistributionFitsOptimExt = "Optim" + + [deps.DistributionFits.weakdeps] + Optim = "429524aa-4258-5aef-a3af-852621145aeb" + +[[deps.Distributions]] +deps = ["AliasTables", "FillArrays", "LinearAlgebra", "PDMats", "Printf", "QuadGK", "Random", "SpecialFunctions", "Statistics", "StatsAPI", "StatsBase", "StatsFuns"] +git-tree-sha1 = "fbcc7610f6d8348428f722ecbe0e6cfe22e672c6" +uuid = "31c24e10-a181-5473-b8eb-7969acd0382f" +version = "0.25.123" + + [deps.Distributions.extensions] + DistributionsChainRulesCoreExt = "ChainRulesCore" + DistributionsDensityInterfaceExt = "DensityInterface" + DistributionsTestExt = "Test" + + [deps.Distributions.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + DensityInterface = "b429d917-457f-4dbc-8f4c-0cc954292b1d" + Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[[deps.DocStringExtensions]] +git-tree-sha1 = "7442a5dfe1ebb773c29cc2962a8980f47221d76c" +uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" +version = "0.9.5" + +[[deps.Downloads]] +deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] +uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" +version = "1.6.0" + +[[deps.EarCut_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "e3290f2d49e661fbd94046d7e3726ffcb2d41053" +uuid = "5ae413db-bbd1-5e63-b57d-d24a61df00f5" +version = "2.2.4+0" + +[[deps.EnumX]] +git-tree-sha1 = "7bebc8aad6ee6217c78c5ddcf7ed289d65d0263e" +uuid = "4e289a0a-7415-4d19-859d-a7e5c4648b56" +version = "1.0.6" + +[[deps.EnzymeCore]] +git-tree-sha1 = "990991b8aa76d17693a98e3a915ac7aa49f08d1a" +uuid = "f151be2c-9106-41f4-ab19-57ee4f262869" +version = "0.8.18" +weakdeps = ["Adapt", "ChainRulesCore"] + + [deps.EnzymeCore.extensions] + AdaptExt = "Adapt" + EnzymeCoreChainRulesCoreExt = "ChainRulesCore" + +[[deps.EpollShim_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "8a4be429317c42cfae6a7fc03c31bad1970c310d" +uuid = "2702e6a9-849d-5ed8-8c21-79e8b8f9ee43" +version = "0.0.20230411+1" + +[[deps.ExactPredicates]] +deps = ["IntervalArithmetic", "Random", "StaticArrays"] +git-tree-sha1 = "83231673ea4d3d6008ac74dc5079e77ab2209d8f" +uuid = "429591f6-91af-11e9-00e2-59fbe8cec110" +version = "2.2.9" + +[[deps.ExceptionUnwrapping]] +deps = ["Test"] +git-tree-sha1 = "d36f682e590a83d63d1c7dbd287573764682d12a" +uuid = "460bff9d-24e4-43bc-9d9f-a8973cb893f4" +version = "0.1.11" + +[[deps.Expat_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "27af30de8b5445644e8ffe3bcb0d72049c089cf1" +uuid = "2e619515-83b5-522b-bb60-26c02a35a201" +version = "2.7.3+0" + +[[deps.ExprTools]] +git-tree-sha1 = "27415f162e6028e81c72b82ef756bf321213b6ec" +uuid = "e2ba6199-217a-4e67-a87a-7c52f15ade04" +version = "0.1.10" + +[[deps.ExpressionExplorer]] +git-tree-sha1 = "5f1c005ed214356bbe41d442cc1ccd416e510b7e" +uuid = "21656369-7473-754a-2065-74616d696c43" +version = "1.1.4" + +[[deps.ExproniconLite]] +git-tree-sha1 = "c13f0b150373771b0fdc1713c97860f8df12e6c2" +uuid = "55351af7-c7e9-48d6-89ff-24e801d99491" +version = "0.10.14" + +[[deps.Extents]] +git-tree-sha1 = "b309b36a9e02fe7be71270dd8c0fd873625332b4" +uuid = "411431e0-e8b7-467b-b5e0-f676ba4f2910" +version = "0.1.6" + +[[deps.FFMPEG]] +deps = ["FFMPEG_jll"] +git-tree-sha1 = "95ecf07c2eea562b5adbd0696af6db62c0f52560" +uuid = "c87230d0-a227-11e9-1b43-d7ebe4e7570a" +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", "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 = "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.FLoops]] +deps = ["BangBang", "Compat", "FLoopsBase", "InitialValues", "JuliaVariables", "MLStyle", "Serialization", "Setfield", "Transducers"] +git-tree-sha1 = "0a2e5873e9a5f54abb06418d57a8df689336a660" +uuid = "cc61a311-1640-44b5-9fba-1b764f453329" +version = "0.2.2" + +[[deps.FLoopsBase]] +deps = ["ContextVariablesX"] +git-tree-sha1 = "656f7a6859be8673bf1f35da5670246b923964f7" +uuid = "b9860ae5-e623-471e-878b-f6a53c775ea6" +version = "0.1.1" + +[[deps.FastClosures]] +git-tree-sha1 = "acebe244d53ee1b461970f8910c235b259e772ef" +uuid = "9aa1b823-49e4-5ca5-8b0f-3971ec8bab6a" +version = "0.3.2" + +[[deps.FileIO]] +deps = ["Pkg", "Requires", "UUIDs"] +git-tree-sha1 = "6522cfb3b8fe97bec632252263057996cbd3de20" +uuid = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" +version = "1.18.0" +weakdeps = ["HTTP"] + + [deps.FileIO.extensions] + HTTPExt = "HTTP" + +[[deps.FilePaths]] +deps = ["FilePathsBase", "MacroTools", "Reexport"] +git-tree-sha1 = "a1b2fbfe98503f15b665ed45b3d149e5d8895e4c" +uuid = "8fc22ac5-c921-52a6-82fd-178b2807b824" +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 = "3bab2c5aa25e7840a4b065805c0cdfc01f3068d2" +uuid = "48062228-2e41-5def-b9a4-89aafe57970f" +version = "0.9.24" +weakdeps = ["Mmap", "Test"] + + [deps.FilePathsBase.extensions] + FilePathsBaseMmapExt = "Mmap" + FilePathsBaseTestExt = "Test" + +[[deps.FileWatching]] +uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" +version = "1.11.0" + +[[deps.FillArrays]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "2f979084d1e13948a3352cf64a25df6bd3b4dca3" +uuid = "1a297f60-69ca-5386-bcde-b61e274b549b" +version = "1.16.0" +weakdeps = ["PDMats", "SparseArrays", "StaticArrays", "Statistics"] + + [deps.FillArrays.extensions] + FillArraysPDMatsExt = "PDMats" + FillArraysSparseArraysExt = "SparseArrays" + FillArraysStaticArraysExt = "StaticArrays" + FillArraysStatisticsExt = "Statistics" + +[[deps.FixedPointNumbers]] +deps = ["Statistics"] +git-tree-sha1 = "05882d6995ae5c12bb5f36dd2ed3f61c98cbb172" +uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" +version = "0.8.5" + +[[deps.Fontconfig_jll]] +deps = ["Artifacts", "Bzip2_jll", "Expat_jll", "FreeType2_jll", "JLLWrappers", "Libdl", "Libuuid_jll", "Zlib_jll"] +git-tree-sha1 = "f85dac9a96a01087df6e3a749840015a0ca3817d" +uuid = "a3f928ae-7b40-5064-980b-68af3947d34b" +version = "2.17.1+0" + +[[deps.Format]] +git-tree-sha1 = "9c68794ef81b08086aeb32eeaf33531668d5f5fc" +uuid = "1fa38f19-a742-5d3f-a2b9-30dd87b9d5f8" +version = "1.3.7" + +[[deps.ForwardDiff]] +deps = ["CommonSubexpressions", "DiffResults", "DiffRules", "LinearAlgebra", "LogExpFunctions", "NaNMath", "Preferences", "Printf", "Random", "SpecialFunctions"] +git-tree-sha1 = "eef4c86803f47dcb61e9b8790ecaa96956fdd8ae" +uuid = "f6369f11-7733-5829-9624-2563aa707210" +version = "1.3.2" +weakdeps = ["StaticArrays"] + + [deps.ForwardDiff.extensions] + ForwardDiffStaticArraysExt = "StaticArrays" + +[[deps.FreeType]] +deps = ["CEnum", "FreeType2_jll"] +git-tree-sha1 = "907369da0f8e80728ab49c1c7e09327bf0d6d999" +uuid = "b38be410-82b0-50bf-ab77-7b57e271db43" +version = "4.1.1" + +[[deps.FreeType2_jll]] +deps = ["Artifacts", "Bzip2_jll", "JLLWrappers", "Libdl", "Zlib_jll"] +git-tree-sha1 = "2c5512e11c791d1baed2049c5652441b28fc6a31" +uuid = "d7e528f0-a631-5988-bf34-fe36492bcfd7" +version = "2.13.4+0" + +[[deps.FreeTypeAbstraction]] +deps = ["BaseDirs", "ColorVectorSpace", "Colors", "FreeType", "GeometryBasics", "Mmap"] +git-tree-sha1 = "4ebb930ef4a43817991ba35db6317a05e59abd11" +uuid = "663a7486-cb36-511b-a19d-713bb74d65c9" +version = "0.10.8" + +[[deps.FriBidi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "7a214fdac5ed5f59a22c2d9a885a16da1c74bbc7" +uuid = "559328eb-81f9-559d-9380-de523a88c83c" +version = "1.0.17+0" + +[[deps.FunctionWrappers]] +git-tree-sha1 = "d62485945ce5ae9c0c48f124a84998d755bae00e" +uuid = "069b7b12-0de2-55c6-9aab-29f3d0a68a2e" +version = "1.1.3" + +[[deps.FunctionWrappersWrappers]] +deps = ["FunctionWrappers"] +git-tree-sha1 = "b104d487b34566608f8b4e1c39fb0b10aa279ff8" +uuid = "77dc65aa-8811-40c2-897b-53d922fa7daf" +version = "0.1.3" + +[[deps.Functors]] +deps = ["Compat", "ConstructionBase", "LinearAlgebra", "Random"] +git-tree-sha1 = "60a0339f28a233601cb74468032b5c302d5067de" +uuid = "d9f16b24-f501-4c13-a1f2-28368ffc5196" +version = "0.5.2" + +[[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 = "b7bfd56fa66616138dfe5237da4dc13bbd83c67f" +uuid = "0656b61e-2033-5cc2-a64a-77c0f6c09b89" +version = "3.4.1+0" + +[[deps.GPUArrays]] +deps = ["Adapt", "GPUArraysCore", "KernelAbstractions", "LLVM", "LinearAlgebra", "Printf", "Random", "Reexport", "ScopedValues", "Serialization", "SparseArrays", "Statistics"] +git-tree-sha1 = "6487601563e4a1d1dab796e88b4548bf5544209e" +uuid = "0c68f7d7-f131-5f86-a1c3-88cf8149b2d7" +version = "11.4.1" +weakdeps = ["JLD2"] + + [deps.GPUArrays.extensions] + JLD2Ext = "JLD2" + +[[deps.GPUArraysCore]] +deps = ["Adapt"] +git-tree-sha1 = "83cf05ab16a73219e5f6bd1bdfa9848fa24ac627" +uuid = "46192b85-c4d5-4398-a991-12ede77f4527" +version = "0.2.0" + +[[deps.GPUCompiler]] +deps = ["ExprTools", "InteractiveUtils", "LLVM", "Libdl", "Logging", "PrecompileTools", "Preferences", "Scratch", "Serialization", "TOML", "Tracy", "UUIDs"] +git-tree-sha1 = "966946d226e8b676ca6409454718accb18c34c54" +uuid = "61eb1bfa-7361-4325-ad38-22787b887f55" +version = "1.8.2" + +[[deps.GPUToolbox]] +deps = ["LLVM"] +git-tree-sha1 = "9e9186b09a13b7f094f87d1a9bb266d8780e1b1c" +uuid = "096a3bc2-3ced-46d0-87f4-dd12716f4bfc" +version = "1.0.0" + +[[deps.GR]] +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 = "ee0585b62671ce88e48d3409733230b401c9775c" +uuid = "28b8d3ca-fb5f-59d9-8090-bfdbd6d07a71" +version = "0.73.22" + + [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", "FreeType2_jll", "GLFW_jll", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Libtiff_jll", "Pixman_jll", "Qt6Base_jll", "Zlib_jll", "libpng_jll"] +git-tree-sha1 = "7dd7173f7129a1b6f84e0f03e0890cd1189b0659" +uuid = "d2c73de3-f751-5644-a686-071e5b155ba9" +version = "0.73.22+0" + +[[deps.GeometryBasics]] +deps = ["EarCut_jll", "Extents", "IterTools", "LinearAlgebra", "PrecompileTools", "Random", "StaticArrays"] +git-tree-sha1 = "1f5a80f4ed9f5a4aada88fc2db456e637676414b" +uuid = "5c1252a2-5f33-56bf-86c9-59e7332b4326" +version = "0.5.10" + + [deps.GeometryBasics.extensions] + GeometryBasicsGeoInterfaceExt = "GeoInterface" + + [deps.GeometryBasics.weakdeps] + GeoInterface = "cf35fbd7-0cd7-5166-be24-54bfbe79505f" + +[[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", "JpegTurbo_jll", "Libdl", "Zlib_jll"] +git-tree-sha1 = "38044a04637976140074d0b0621c1edf0eb531fd" +uuid = "61579ee1-b43e-5ca0-a5da-69d92c66a64b" +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", "GettextRuntime_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Libiconv_jll", "Libmount_jll", "PCRE2_jll", "Zlib_jll"] +git-tree-sha1 = "24f6def62397474a297bfcec22384101609142ed" +uuid = "7746bdde-850d-59dc-9ae8-88ece973131d" +version = "2.86.3+0" + +[[deps.Graphics]] +deps = ["Colors", "LinearAlgebra", "NaNMath"] +git-tree-sha1 = "a641238db938fff9b2f60d08ed9030387daf428c" +uuid = "a2bd30eb-e257-5431-a919-1863eab51364" +version = "1.1.3" + +[[deps.Graphite2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "8a6dbda1fd736d60cc477d99f2e7a042acfa46e8" +uuid = "3b182d85-2403-5c21-9c21-1e1f0cc25472" +version = "1.3.15+0" + +[[deps.GridLayoutBase]] +deps = ["GeometryBasics", "InteractiveUtils", "Observables"] +git-tree-sha1 = "93d5c27c8de51687a2c70ec0716e6e76f298416f" +uuid = "3955a311-db13-416c-9275-1d80ed98e5e9" +version = "0.11.2" + +[[deps.Grisu]] +git-tree-sha1 = "53bb909d1151e57e2484c3d1b53e19552b887fb2" +uuid = "42e2da0e-8278-4e71-bc24-59509adca0fe" +version = "1.0.2" + +[[deps.HTTP]] +deps = ["Base64", "CodecZlib", "ConcurrentUtilities", "Dates", "ExceptionUnwrapping", "Logging", "LoggingExtras", "MbedTLS", "NetworkOptions", "OpenSSL", "PrecompileTools", "Random", "SimpleBufferStream", "Sockets", "URIs", "UUIDs"] +git-tree-sha1 = "5e6fe50ae7f23d171f44e311c2960294aaa0beb5" +uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3" +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 = "f923f9a774fcf3f5cb761bfa43aeadd689714813" +uuid = "2e76f6c2-a576-52d4-95c1-20adfe4de566" +version = "8.5.1+0" + +[[deps.HashArrayMappedTries]] +git-tree-sha1 = "2eaa69a7cab70a52b9687c8bf950a5a93ec895ae" +uuid = "076d061b-32b6-4027-95e0-9a2c6f6d7e74" +version = "0.2.0" + +[[deps.HostCPUFeatures]] +deps = ["BitTwiddlingConvenienceFunctions", "IfElse", "Libdl", "Preferences", "Static"] +git-tree-sha1 = "af9ab7d1f70739a47f03be78771ebda38c3c71bf" +uuid = "3e5b6fbb-0976-4d2c-9146-d79de83f2fb0" +version = "0.1.18" + +[[deps.HybridVariationalInference]] +deps = ["Bijectors", "BlockDiagonals", "ChainRulesCore", "Combinatorics", "CommonSolve", "ComponentArrays", "DifferentiationInterface", "DistributionFits", "Distributions", "FillArrays", "Functors", "GPUArraysCore", "KernelAbstractions", "LinearAlgebra", "LogExpFunctions", "MLDataDevices", "MLUtils", "Missings", "NaNMath", "Optimisers", "Optimization", "Random", "StableRNGs", "StaticArrays", "StatsBase", "StatsFuns", "Test", "UnPack", "Zygote"] +path = "../../.." +uuid = "a108c475-a4e2-4021-9a84-cfa7df242f64" +version = "0.2.0" + + [deps.HybridVariationalInference.extensions] + HybridVariationalInferenceCUDAExt = "CUDA" + HybridVariationalInferenceFluxExt = "Flux" + HybridVariationalInferenceLuxExt = "Lux" + HybridVariationalInferenceSimpleChainsExt = "SimpleChains" + + [deps.HybridVariationalInference.weakdeps] + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + Flux = "587475ba-b771-5e3f-ad9e-33799f191a9c" + Lux = "b2108857-7c20-44ae-9111-449ecde12c47" + SimpleChains = "de6bee2f-e2f4-4ec7-b6ed-219cc6f6e9e5" + +[[deps.HypergeometricFunctions]] +deps = ["LinearAlgebra", "OpenLibm_jll", "SpecialFunctions"] +git-tree-sha1 = "68c173f4f449de5b438ee67ed0c9c748dc31a2ec" +uuid = "34004b35-14d8-5ef3-9330-4cdb6864b03a" +version = "0.3.28" + +[[deps.IRTools]] +deps = ["InteractiveUtils", "MacroTools"] +git-tree-sha1 = "57e9ce6cf68d0abf5cb6b3b4abf9bedf05c939c0" +uuid = "7869d1d1-7146-5819-86e3-90919afe41df" +version = "0.4.15" + +[[deps.IfElse]] +git-tree-sha1 = "debdd00ffef04665ccbb3e150747a77560e8fad1" +uuid = "615f187c-cbe4-4ef1-ba3b-2fcf58d6d173" +version = "0.1.1" + +[[deps.ImageAxes]] +deps = ["AxisArrays", "ImageBase", "ImageCore", "Reexport", "SimpleTraits"] +git-tree-sha1 = "e12629406c6c4442539436581041d372d69c55ba" +uuid = "2803e5a7-5153-5ecf-9a86-9b4c37f5f5ac" +version = "0.6.12" + +[[deps.ImageBase]] +deps = ["ImageCore", "Reexport"] +git-tree-sha1 = "eb49b82c172811fd2c86759fa0553a2221feb909" +uuid = "c817782e-172a-44cc-b673-b171935fbb9e" +version = "0.1.7" + +[[deps.ImageCore]] +deps = ["ColorVectorSpace", "Colors", "FixedPointNumbers", "MappedArrays", "MosaicViews", "OffsetArrays", "PaddedViews", "PrecompileTools", "Reexport"] +git-tree-sha1 = "8c193230235bbcee22c8066b0374f63b5683c2d3" +uuid = "a09fc81d-aa75-5fe9-8630-4744c3626534" +version = "0.10.5" + +[[deps.ImageIO]] +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.9" + +[[deps.ImageMetadata]] +deps = ["AxisArrays", "ImageAxes", "ImageBase", "ImageCore"] +git-tree-sha1 = "2a81c3897be6fbcde0802a0ebe6796d0562f63ec" +uuid = "bc367c6b-8a6b-528e-b4bd-a4b897500b49" +version = "0.9.10" + +[[deps.Imath_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "dcc8d0cd653e55213df9b75ebc6fe4a8d3254c65" +uuid = "905a6f67-0a94-5f89-b386-d35d92009cd1" +version = "3.2.2+0" + +[[deps.IndirectArrays]] +git-tree-sha1 = "012e604e1c7458645cb8b436f8fba789a51b257f" +uuid = "9b13fd28-a010-5f03-acff-a1bbcff69959" +version = "1.0.0" + +[[deps.Inflate]] +git-tree-sha1 = "d1b1b796e47d94588b3757fe84fbf65a5ec4a80d" +uuid = "d25df0c9-e2be-5dd7-82c8-3ad0b3e990b9" +version = "0.1.5" + +[[deps.InitialValues]] +git-tree-sha1 = "4da0f88e9a39111c2fa3add390ab15f3a44f3ca3" +uuid = "22cec73e-a1b8-11e9-2c92-598750a2cf9c" +version = "0.3.1" + +[[deps.InlineStrings]] +git-tree-sha1 = "8f3d257792a522b4601c24a577954b0a8cd7334d" +uuid = "842dd82b-1e85-43dc-bf29-5d0ee9dffc48" +version = "1.4.5" + + [deps.InlineStrings.extensions] + ArrowTypesExt = "ArrowTypes" + ParsersExt = "Parsers" + + [deps.InlineStrings.weakdeps] + 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.InteractiveUtils]] +deps = ["Markdown"] +uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" +version = "1.11.0" + +[[deps.Interpolations]] +deps = ["Adapt", "AxisAlgorithms", "ChainRulesCore", "LinearAlgebra", "OffsetArrays", "Random", "Ratios", "SharedArrays", "SparseArrays", "StaticArrays", "WoodburyMatrices"] +git-tree-sha1 = "65d505fa4c0d7072990d659ef3fc086eb6da8208" +uuid = "a98d9a8b-a2ab-59e6-89dd-64a1c18fca59" +version = "0.16.2" +weakdeps = ["ForwardDiff", "Unitful"] + + [deps.Interpolations.extensions] + InterpolationsForwardDiffExt = "ForwardDiff" + InterpolationsUnitfulExt = "Unitful" + +[[deps.IntervalArithmetic]] +deps = ["CRlibm", "MacroTools", "OpenBLASConsistentFPCSR_jll", "Printf", "Random", "RoundingEmulator"] +git-tree-sha1 = "02b61501dbe6da3b927cc25dacd7ce32390ee970" +uuid = "d1acc4aa-44c8-5952-acd4-ba5d80a2a253" +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 = "d966f85b3b7a8e49d034d27a189e9a4874b4391a" +uuid = "8197267c-284f-5f27-9208-e0e47529a953" +version = "0.7.13" +weakdeps = ["Random", "RecipesBase", "Statistics"] + + [deps.IntervalSets.extensions] + IntervalSetsRandomExt = "Random" + IntervalSetsRecipesBaseExt = "RecipesBase" + IntervalSetsStatisticsExt = "Statistics" + +[[deps.InverseFunctions]] +git-tree-sha1 = "a779299d77cd080bf77b97535acecd73e1c5e5cb" +uuid = "3587e190-3f89-42d0-90ee-14403ec27112" +version = "0.1.17" +weakdeps = ["Dates", "Test"] + + [deps.InverseFunctions.extensions] + InverseFunctionsDatesExt = "Dates" + InverseFunctionsTestExt = "Test" + +[[deps.InvertedIndices]] +git-tree-sha1 = "6da3c4316095de0f5ee2ebd875df8721e7e0bdbe" +uuid = "41ab1584-1d38-5bbf-9106-f11c6c58b48f" +version = "1.3.1" + +[[deps.IrrationalConstants]] +git-tree-sha1 = "b2d91fe939cae05960e760110b328288867b5758" +uuid = "92d709cd-6900-40b7-9082-c6be49f344b6" +version = "0.2.6" + +[[deps.Isoband]] +deps = ["isoband_jll"] +git-tree-sha1 = "f9b6d97355599074dc867318950adaa6f9946137" +uuid = "f1662d9f-8043-43de-a69a-05efc1cc6ff4" +version = "0.1.1" + +[[deps.IterTools]] +git-tree-sha1 = "42d5f897009e7ff2cf88db414a389e5ed1bdd023" +uuid = "c8e1da08-722c-5040-9ed9-7db0dc04731e" +version = "1.10.0" + +[[deps.IteratorInterfaceExtensions]] +git-tree-sha1 = "a3f24677c21f5bbe9d2a714f95dcd58337fb2856" +uuid = "82899510-4779-5014-852e-03e436cf321d" +version = "1.0.0" + +[[deps.JLD2]] +deps = ["ChunkCodecLibZlib", "ChunkCodecLibZstd", "FileIO", "MacroTools", "Mmap", "OrderedCollections", "PrecompileTools", "ScopedValues"] +git-tree-sha1 = "8f8ff711442d1f4cfc0d86133e7ee03d62ec9b98" +uuid = "033835bb-8acc-5ee8-8aae-3f567f8a3819" +version = "0.6.3" +weakdeps = ["UnPack"] + + [deps.JLD2.extensions] + UnPackExt = "UnPack" + +[[deps.JLFzf]] +deps = ["REPL", "Random", "fzf_jll"] +git-tree-sha1 = "82f7acdc599b65e0f8ccd270ffa1467c21cb647b" +uuid = "1019f520-868f-41f5-a6de-eb00f4b6a39c" +version = "0.1.11" + +[[deps.JLLWrappers]] +deps = ["Artifacts", "Preferences"] +git-tree-sha1 = "0533e564aae234aff59ab625543145446d8b6ec2" +uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" +version = "1.7.1" + +[[deps.JSON]] +deps = ["Dates", "Logging", "Parsers", "PrecompileTools", "StructUtils", "UUIDs", "Unicode"] +git-tree-sha1 = "b3ad4a0255688dcb895a52fafbaae3023b588a90" +uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" +version = "1.4.0" + + [deps.JSON.extensions] + JSONArrowExt = ["ArrowTypes"] + + [deps.JSON.weakdeps] + ArrowTypes = "31f734f8-188a-4ce0-8406-c8a06bd891cd" + +[[deps.Jieko]] +deps = ["ExproniconLite"] +git-tree-sha1 = "2f05ed29618da60c06a87e9c033982d4f71d0b6c" +uuid = "ae98c720-c025-4a4a-838c-29b094483192" +version = "0.2.1" + +[[deps.JpegTurbo]] +deps = ["CEnum", "FileIO", "ImageCore", "JpegTurbo_jll", "TOML"] +git-tree-sha1 = "9496de8fb52c224a2e3f9ff403947674517317d9" +uuid = "b835a17e-a41a-41e7-81f0-2f016b05efe0" +version = "0.1.6" + +[[deps.JpegTurbo_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "b6893345fd6658c8e475d40155789f4860ac3b21" +uuid = "aacddb02-875f-59d6-b918-886e6ef4fbf8" +version = "3.1.4+0" + +[[deps.JuliaNVTXCallbacks_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "af433a10f3942e882d3c671aacb203e006a5808f" +uuid = "9c1d0b0a-7046-5b2e-a33f-ea22f176ac7e" +version = "0.2.1+0" + +[[deps.JuliaVariables]] +deps = ["MLStyle", "NameResolution"] +git-tree-sha1 = "49fb3cb53362ddadb4415e9b73926d6b40709e70" +uuid = "b14d175d-62b4-44ba-8fb7-3064adc8c3ec" +version = "0.2.4" + +[[deps.KernelAbstractions]] +deps = ["Adapt", "Atomix", "InteractiveUtils", "MacroTools", "PrecompileTools", "Requires", "StaticArrays", "UUIDs"] +git-tree-sha1 = "fb14a863240d62fbf5922bf9f8803d7df6c62dc8" +uuid = "63c18a36-062a-441e-b654-da1e3ab1ce7c" +version = "0.9.40" +weakdeps = ["EnzymeCore", "LinearAlgebra", "SparseArrays"] + + [deps.KernelAbstractions.extensions] + EnzymeExt = "EnzymeCore" + LinearAlgebraExt = "LinearAlgebra" + SparseArraysExt = "SparseArrays" + +[[deps.KernelDensity]] +deps = ["Distributions", "DocStringExtensions", "FFTA", "Interpolations", "StatsBase"] +git-tree-sha1 = "4260cfc991b8885bf747801fb60dd4503250e478" +uuid = "5ab0869b-81aa-558d-bb23-cbf5423bbe9b" +version = "0.6.11" + +[[deps.LAME_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "059aabebaa7c82ccb853dd4a0ee9d17796f7e1bc" +uuid = "c1c5ebd0-6772-5130-a774-d5fcae4a789d" +version = "3.100.3+0" + +[[deps.LBFGSB]] +deps = ["L_BFGS_B_jll"] +git-tree-sha1 = "e2e6f53ee20605d0ea2be473480b7480bd5091b5" +uuid = "5be7bae1-8223-5378-bac3-9e7378a2f6e6" +version = "0.4.1" + +[[deps.LERC_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "aaafe88dccbd957a8d82f7d05be9b69172e0cee3" +uuid = "88015f11-f218-50d7-93a8-a6af411a945d" +version = "4.0.1+0" + +[[deps.LLVM]] +deps = ["CEnum", "LLVMExtra_jll", "Libdl", "Preferences", "Printf", "Unicode"] +git-tree-sha1 = "69e4739502b7ab5176117e97e1664ed181c35036" +uuid = "929cbde3-209d-540e-8aea-75f648917ca0" +version = "9.4.6" +weakdeps = ["BFloat16s"] + + [deps.LLVM.extensions] + BFloat16sExt = "BFloat16s" + +[[deps.LLVMExtra_jll]] +deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl", "TOML"] +git-tree-sha1 = "8e76807afb59ebb833e9b131ebf1a8c006510f33" +uuid = "dad2f222-ce93-54a1-a47d-0025e8a3acab" +version = "0.0.38+0" + +[[deps.LLVMLoopInfo]] +git-tree-sha1 = "2e5c102cfc41f48ae4740c7eca7743cc7e7b75ea" +uuid = "8b046642-f1f6-4319-8d3c-209ddc03c586" +version = "1.0.0" + +[[deps.LLVMOpenMP_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "eb62a3deb62fc6d8822c0c4bef73e4412419c5d8" +uuid = "1d63c593-3942-5779-bab2-d838dc0a180e" +version = "18.1.8+0" + +[[deps.LZO_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "1c602b1127f4751facb671441ca72715cc95938a" +uuid = "dd4b983a-f0e5-5f8d-a1b7-129d4a5fb1ac" +version = "2.10.3+0" + +[[deps.L_BFGS_B_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "77feda930ed3f04b2b0fbb5bea89e69d3677c6b0" +uuid = "81d17ec3-03a1-5e46-b53e-bddc35a13473" +version = "3.0.1+0" + +[[deps.LaTeXStrings]] +git-tree-sha1 = "dda21b8cbd6a6c40d9d02a73230f9d70fed6918c" +uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" +version = "1.4.0" + +[[deps.Latexify]] +deps = ["Format", "Ghostscript_jll", "InteractiveUtils", "LaTeXStrings", "MacroTools", "Markdown", "OrderedCollections", "Requires"] +git-tree-sha1 = "44f93c47f9cd6c7e431f2f2091fcba8f01cd7e8f" +uuid = "23fbe1c1-3f47-55db-b15f-69d7ec21a316" +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"] +git-tree-sha1 = "a9eaadb366f5493a5654e843864c13d8b107548c" +uuid = "10f19ff3-798f-405d-979b-55457f8fc047" +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" +uuid = "8cdb02fc-e678-4876-92c5-9defec4f444e" +version = "0.3.1" + +[[deps.LeftChildRightSiblingTrees]] +deps = ["AbstractTrees"] +git-tree-sha1 = "95ba48564903b43b2462318aa243ee79d81135ff" +uuid = "1d6d02ad-be62-4b6b-8a6d-2f90e265016e" +version = "0.2.1" + +[[deps.LibCURL]] +deps = ["LibCURL_jll", "MozillaCACerts_jll"] +uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" +version = "0.6.4" + +[[deps.LibCURL_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] +uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" +version = "8.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.7.2+0" + +[[deps.LibSSH2_jll]] +deps = ["Artifacts", "Libdl", "MbedTLS_jll"] +uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" +version = "1.11.0+1" + +[[deps.LibTracyClient_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "d4e20500d210247322901841d4eafc7a0c52642d" +uuid = "ad6e5548-8b26-5c9f-8ef3-ef0ad883f3a5" +version = "0.13.1+0" + +[[deps.Libdl]] +uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" +version = "1.11.0" + +[[deps.Libffi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "c8da7e6a91781c41a863611c7e966098d783c57a" +uuid = "e9f186c6-92d2-5b65-8a66-fee21dc1b490" +version = "3.4.7+0" + +[[deps.Libglvnd_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll", "Xorg_libXext_jll"] +git-tree-sha1 = "d36c21b9e7c172a44a10484125024495e2625ac0" +uuid = "7e76a0d4-f3c7-5321-8279-8d96eeed0f29" +version = "1.7.1+1" + +[[deps.Libiconv_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "be484f5c92fad0bd8acfef35fe017900b0b73809" +uuid = "94ce4f54-9a6c-5748-9c1c-f9c7231a4531" +version = "1.18.0+0" + +[[deps.Libmount_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "97bbca976196f2a1eb9607131cb108c69ec3f8a6" +uuid = "4b2f31a3-9ecc-558c-b454-b3730dcb73e9" +version = "2.41.3+0" + +[[deps.Libtiff_jll]] +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.7.2+0" + +[[deps.Libuuid_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "d0205286d9eceadc518742860bf23f703779a3d6" +uuid = "38a345b3-de98-5d2b-a5d3-14cd9215e700" +version = "2.41.3+0" + +[[deps.LinearAlgebra]] +deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"] +uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" +version = "1.11.0" + +[[deps.LogExpFunctions]] +deps = ["DocStringExtensions", "IrrationalConstants", "LinearAlgebra"] +git-tree-sha1 = "13ca9e2586b89836fd20cccf56e57e2b9ae7f38f" +uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688" +version = "0.3.29" +weakdeps = ["ChainRulesCore", "ChangesOfVariables", "InverseFunctions"] + + [deps.LogExpFunctions.extensions] + LogExpFunctionsChainRulesCoreExt = "ChainRulesCore" + LogExpFunctionsChangesOfVariablesExt = "ChangesOfVariables" + LogExpFunctionsInverseFunctionsExt = "InverseFunctions" + +[[deps.Logging]] +uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" +version = "1.11.0" + +[[deps.LoggingExtras]] +deps = ["Dates", "Logging"] +git-tree-sha1 = "f00544d95982ea270145636c181ceda21c4e2575" +uuid = "e6f89c97-d47a-5376-807f-9c37f3926c36" +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 = "a9fc7883eb9b5f04f46efb9a540833d1fad974b3" +uuid = "bdcacae8-1622-11e9-2a5c-532679323890" +version = "0.12.173" +weakdeps = ["ChainRulesCore", "ForwardDiff", "NNlib", "SpecialFunctions"] + + [deps.LoopVectorization.extensions] + ForwardDiffExt = ["ChainRulesCore", "ForwardDiff"] + ForwardDiffNNlibExt = ["ForwardDiff", "NNlib"] + SpecialFunctionsExt = "SpecialFunctions" + +[[deps.Lux]] +deps = ["ADTypes", "Adapt", "ArrayInterface", "ChainRulesCore", "ConcreteStructs", "DiffResults", "DispatchDoctor", "EnzymeCore", "FastClosures", "ForwardDiff", "Functors", "GPUArraysCore", "LinearAlgebra", "LuxCore", "LuxLib", "MLDataDevices", "MacroTools", "Markdown", "NNlib", "Optimisers", "PrecompileTools", "Preferences", "Random", "ReactantCore", "Reexport", "SciMLPublic", "Setfield", "Static", "StaticArraysCore", "Statistics", "UUIDs", "WeightInitializers"] +git-tree-sha1 = "334de475ff414c8eb67f88f57f7b02d40cd8f320" +uuid = "b2108857-7c20-44ae-9111-449ecde12c47" +version = "1.31.3" + + [deps.Lux.extensions] + ComponentArraysExt = "ComponentArrays" + EnzymeExt = "Enzyme" + FluxExt = "Flux" + GPUArraysExt = "GPUArrays" + LossFunctionsExt = "LossFunctions" + MLUtilsExt = "MLUtils" + MPIExt = "MPI" + MPINCCLExt = ["CUDA", "MPI", "NCCL"] + MooncakeExt = "Mooncake" + ReactantExt = ["Enzyme", "Reactant"] + ReverseDiffExt = ["FunctionWrappers", "ReverseDiff"] + SimpleChainsExt = "SimpleChains" + TrackerExt = "Tracker" + ZygoteExt = "Zygote" + + [deps.Lux.weakdeps] + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + ComponentArrays = "b0b7db55-cfe3-40fc-9ded-d10e2dbeff66" + Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9" + Flux = "587475ba-b771-5e3f-ad9e-33799f191a9c" + FunctionWrappers = "069b7b12-0de2-55c6-9aab-29f3d0a68a2e" + GPUArrays = "0c68f7d7-f131-5f86-a1c3-88cf8149b2d7" + LossFunctions = "30fc2ffe-d236-52d8-8643-a9d8f7c094a7" + MLUtils = "f1d291b0-491e-4a28-83b9-f70985020b54" + MPI = "da04e1cc-30fd-572f-bb4f-1f8673147195" + Mooncake = "da2b9cff-9c12-43a0-ae48-6db2b0edb7d6" + NCCL = "3fe64909-d7a1-4096-9b7d-7a0f12cf0f6b" + Reactant = "3c362404-f566-11ee-1572-e11a4b42c853" + ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + SimpleChains = "de6bee2f-e2f4-4ec7-b6ed-219cc6f6e9e5" + Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" + Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f" + +[[deps.LuxCore]] +deps = ["DispatchDoctor", "Random", "SciMLPublic"] +git-tree-sha1 = "9455b1e829d8dacad236143869be70b7fdb826b8" +uuid = "bb33d45b-7691-41d6-9220-0943567d0623" +version = "1.5.3" + + [deps.LuxCore.extensions] + ArrayInterfaceReverseDiffExt = ["ArrayInterface", "ReverseDiff"] + ArrayInterfaceTrackerExt = ["ArrayInterface", "Tracker"] + ChainRulesCoreExt = "ChainRulesCore" + EnzymeCoreExt = "EnzymeCore" + FluxExt = "Flux" + FunctorsExt = "Functors" + MLDataDevicesExt = ["Adapt", "MLDataDevices"] + ReactantExt = "Reactant" + SetfieldExt = "Setfield" + + [deps.LuxCore.weakdeps] + Adapt = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" + ArrayInterface = "4fba245c-0d91-5ea0-9b3e-6abc04ee57a9" + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + EnzymeCore = "f151be2c-9106-41f4-ab19-57ee4f262869" + Flux = "587475ba-b771-5e3f-ad9e-33799f191a9c" + Functors = "d9f16b24-f501-4c13-a1f2-28368ffc5196" + MLDataDevices = "7e8f7934-dd98-4c1a-8fe8-92b47a384d40" + Reactant = "3c362404-f566-11ee-1572-e11a4b42c853" + ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + Setfield = "efcf1570-3423-57d1-acb7-fd33fddbac46" + Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" + +[[deps.LuxLib]] +deps = ["ArrayInterface", "CPUSummary", "ChainRulesCore", "DispatchDoctor", "EnzymeCore", "FastClosures", "Functors", "KernelAbstractions", "LinearAlgebra", "LuxCore", "MLDataDevices", "Markdown", "NNlib", "Preferences", "Random", "Reexport", "SciMLPublic", "Static", "StaticArraysCore", "Statistics", "UUIDs"] +git-tree-sha1 = "d93ed9031e8609a63dcd7f158f8565f93a0ab61e" +uuid = "82251201-b29d-42c6-8e01-566dec8acb11" +version = "1.15.4" + + [deps.LuxLib.extensions] + AppleAccelerateExt = "AppleAccelerate" + BLISBLASExt = "BLISBLAS" + CUDAExt = "CUDA" + CUDAForwardDiffExt = ["CUDA", "ForwardDiff"] + EnzymeExt = "Enzyme" + ForwardDiffExt = "ForwardDiff" + LoopVectorizationExt = ["LoopVectorization", "Polyester"] + MKLExt = "MKL" + OctavianExt = ["Octavian", "LoopVectorization"] + OneHotArraysExt = ["OneHotArrays"] + ReactantExt = ["Reactant", "ReactantCore"] + ReverseDiffExt = "ReverseDiff" + SLEEFPiratesExt = "SLEEFPirates" + TrackerAMDGPUExt = ["AMDGPU", "Tracker"] + TrackerExt = "Tracker" + cuDNNExt = ["CUDA", "cuDNN"] + + [deps.LuxLib.weakdeps] + AMDGPU = "21141c5a-9bdb-4563-92ae-f87d6854732e" + AppleAccelerate = "13e28ba4-7ad8-5781-acae-3021b1ed3924" + BLISBLAS = "6f275bd8-fec0-4d39-945b-7e95a765fa1e" + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9" + ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + LoopVectorization = "bdcacae8-1622-11e9-2a5c-532679323890" + MKL = "33e6dc65-8f57-5167-99aa-e5a354878fb2" + Octavian = "6fd5a793-0b7e-452c-907f-f8bfe9c57db4" + OneHotArrays = "0b1bfda6-eb8a-41d2-88d8-f5af5cad476f" + Polyester = "f517fe37-dbe3-4b94-8317-1923a5111588" + Reactant = "3c362404-f566-11ee-1572-e11a4b42c853" + ReactantCore = "a3311ec8-5e00-46d5-b541-4f83e724a433" + ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + SLEEFPirates = "476501e8-09a2-5ece-8869-fb82de89a1fa" + Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" + cuDNN = "02a925ec-e4fe-4b08-9a7e-0d78e3d38ccd" + +[[deps.MCMCDiagnosticTools]] +deps = ["AbstractFFTs", "DataAPI", "DataStructures", "Distributions", "LinearAlgebra", "MLJModelInterface", "Random", "SpecialFunctions", "Statistics", "StatsBase", "StatsFuns", "Tables"] +git-tree-sha1 = "f90494689e927268dec7bbd1ece64f134ad251f4" +uuid = "be115224-59cd-429b-ad48-344e309966f0" +version = "0.3.16" + +[[deps.MLCore]] +deps = ["DataAPI", "SimpleTraits", "Tables"] +git-tree-sha1 = "73907695f35bc7ffd9f11f6c4f2ee8c1302084be" +uuid = "c2834f40-e789-41da-a90e-33b280584a8c" +version = "1.0.0" + +[[deps.MLDataDevices]] +deps = ["Adapt", "Functors", "Preferences", "Random", "SciMLPublic"] +git-tree-sha1 = "d8ab79840174b85db64214d4140d4be0a9270210" +uuid = "7e8f7934-dd98-4c1a-8fe8-92b47a384d40" +version = "1.17.4" + + [deps.MLDataDevices.extensions] + AMDGPUExt = "AMDGPU" + CUDAExt = "CUDA" + ChainRulesCoreExt = "ChainRulesCore" + ChainRulesExt = "ChainRules" + ComponentArraysExt = "ComponentArrays" + FillArraysExt = "FillArrays" + GPUArraysSparseArraysExt = ["GPUArrays", "SparseArrays"] + MLUtilsExt = "MLUtils" + MetalExt = ["GPUArrays", "Metal"] + OneHotArraysExt = "OneHotArrays" + OpenCLExt = ["GPUArrays", "OpenCL"] + ReactantExt = "Reactant" + RecursiveArrayToolsExt = "RecursiveArrayTools" + ReverseDiffExt = "ReverseDiff" + SparseArraysExt = "SparseArrays" + TrackerExt = "Tracker" + ZygoteExt = "Zygote" + cuDNNExt = ["CUDA", "cuDNN"] + oneAPIExt = ["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" + ComponentArrays = "b0b7db55-cfe3-40fc-9ded-d10e2dbeff66" + 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" + OpenCL = "08131aa3-fb12-5dee-8b74-c09406e224a2" + 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.MLJModelInterface]] +deps = ["InteractiveUtils", "REPL", "Random", "ScientificTypesBase", "StatisticalTraits"] +git-tree-sha1 = "c275fae2e693206b4527dd9d2382aa15359ef3ed" +uuid = "e80e1ace-859a-464e-9ed9-23947d8ae3ea" +version = "1.12.1" + +[[deps.MLStyle]] +git-tree-sha1 = "bc38dff0548128765760c79eb7388a4b37fae2c8" +uuid = "d8e11817-5142-5d16-987a-aa16d5891078" +version = "0.4.17" + +[[deps.MLUtils]] +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.8" + +[[deps.MacroTools]] +git-tree-sha1 = "1e0228a030642014fe5cfe68c2c0a818f9e3f522" +uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" +version = "0.5.16" + +[[deps.Makie]] +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.24.8" + + [deps.Makie.extensions] + MakieDynamicQuantitiesExt = "DynamicQuantities" + + [deps.Makie.weakdeps] + DynamicQuantities = "06fc5a27-2a28-4c7c-a15d-362465fb6821" + +[[deps.ManualMemory]] +git-tree-sha1 = "bcaef4fc7a0cfe2cba636d84cda54b5e4e4ca3cd" +uuid = "d125e4d3-2237-4719-b19c-fa641b8a4667" +version = "0.1.8" + +[[deps.MappedArrays]] +git-tree-sha1 = "0ee4497a4e80dbd29c058fcee6493f5219556f40" +uuid = "dbb5928d-eab1-5f90-85c2-b9b0edb7c900" +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 = "7eb8cdaa6f0e8081616367c10b31b9d9b34bb02a" +uuid = "0a4f8689-d25c-4efe-a92b-7142dfc1aa53" +version = "0.6.7" + +[[deps.MbedTLS]] +deps = ["Dates", "MbedTLS_jll", "MozillaCACerts_jll", "NetworkOptions", "Random", "Sockets"] +git-tree-sha1 = "c067a280ddc25f196b5e7df3877c6b226d390aaf" +uuid = "739be429-bea8-5141-9913-cc70e7f3736d" +version = "1.1.9" + +[[deps.MbedTLS_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" +version = "2.28.6+0" + +[[deps.Measures]] +git-tree-sha1 = "b513cedd20d9c914783d8ad83d08120702bf2c77" +uuid = "442fdcdd-2543-5da2-b0f3-8c86c306513e" +version = "0.3.3" + +[[deps.MicroCollections]] +deps = ["Accessors", "BangBang", "InitialValues"] +git-tree-sha1 = "44d32db644e84c75dab479f1bc15ee76a1a3618f" +uuid = "128add7d-3638-4c79-886c-908ea0c25c34" +version = "0.2.0" + +[[deps.Missings]] +deps = ["DataAPI"] +git-tree-sha1 = "ec4f7fbeab05d7747bdf98eb74d130a2a2ed298d" +uuid = "e1d29d7a-bbdc-5cf2-9ac0-f12de2c33e28" +version = "1.2.0" + +[[deps.Mmap]] +uuid = "a63ad114-7e13-5084-954f-fe012c677804" +version = "1.11.0" + +[[deps.MosaicViews]] +deps = ["MappedArrays", "OffsetArrays", "PaddedViews", "StackViews"] +git-tree-sha1 = "7b86a5d4d70a9f5cdf2dacb3cbe6d251d1a61dbe" +uuid = "e94cdb99-869f-56ef-bcf0-1ae2bcbe0389" +version = "0.3.4" + +[[deps.Moshi]] +deps = ["ExproniconLite", "Jieko"] +git-tree-sha1 = "53f817d3e84537d84545e0ad749e483412dd6b2a" +uuid = "2e0e35c7-a2e4-4343-998d-7ef72827ed2d" +version = "0.3.7" + +[[deps.MozillaCACerts_jll]] +uuid = "14a3606d-f60d-562e-9121-12d972cd8159" +version = "2023.12.12" + +[[deps.MuladdMacro]] +git-tree-sha1 = "cac9cc5499c25554cba55cd3c30543cff5ca4fab" +uuid = "46d2c3a1-f734-5fdb-9937-b9b9aeba4221" +version = "0.2.4" + +[[deps.NNlib]] +deps = ["Adapt", "Atomix", "ChainRulesCore", "GPUArraysCore", "KernelAbstractions", "LinearAlgebra", "Random", "ScopedValues", "Statistics"] +git-tree-sha1 = "6dc9ffc3a9931e6b988f913b49630d0fb986d0a8" +uuid = "872c559c-99b0-510c-b3b7-b6c96a88d5cd" +version = "0.9.33" + + [deps.NNlib.extensions] + NNlibAMDGPUExt = "AMDGPU" + NNlibCUDACUDNNExt = ["CUDA", "cuDNN"] + NNlibCUDAExt = "CUDA" + NNlibEnzymeCoreExt = "EnzymeCore" + NNlibFFTWExt = "FFTW" + NNlibForwardDiffExt = "ForwardDiff" + NNlibMetalExt = "Metal" + NNlibSpecialFunctionsExt = "SpecialFunctions" + + [deps.NNlib.weakdeps] + AMDGPU = "21141c5a-9bdb-4563-92ae-f87d6854732e" + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + 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.NVTX]] +deps = ["JuliaNVTXCallbacks_jll", "Libdl", "NVTX_jll"] +git-tree-sha1 = "a9083c3e469e63cca454d1fc3b19472d9d92c14a" +uuid = "5da4648a-3479-48b8-97b9-01cb529c0a1f" +version = "1.0.3" +weakdeps = ["Colors"] + + [deps.NVTX.extensions] + NVTXColorsExt = "Colors" + +[[deps.NVTX_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "af2232f69447494514c25742ba1503ec7e9877fe" +uuid = "e98f9f5b-d649-5603-91fd-7774390e6439" +version = "3.2.2+0" + +[[deps.NaNMath]] +deps = ["OpenLibm_jll"] +git-tree-sha1 = "9b8215b1ee9e78a293f99797cd31375471b2bcae" +uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" +version = "1.1.3" + +[[deps.NameResolution]] +deps = ["PrettyPrint"] +git-tree-sha1 = "1a0fa0e9613f46c9b8c11eee38ebb4f590013c5e" +uuid = "71a1bf82-56d0-4bbc-8a3c-48b961074391" +version = "0.1.5" + +[[deps.Netpbm]] +deps = ["FileIO", "ImageCore", "ImageMetadata"] +git-tree-sha1 = "d92b107dbb887293622df7697a2223f9f8176fcd" +uuid = "f09324ee-3d7c-5217-9330-fc30815ba969" +version = "1.1.1" + +[[deps.NetworkOptions]] +uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" +version = "1.2.0" + +[[deps.Observables]] +git-tree-sha1 = "7438a59546cf62428fc9d1bc94729146d37a7225" +uuid = "510215fc-4207-5dde-b226-833fc4488ee2" +version = "0.5.5" + +[[deps.OffsetArrays]] +git-tree-sha1 = "117432e406b5c023f665fa73dc26e79ec3630151" +uuid = "6fe1bfb0-de20-5000-8ca7-80f57d26f881" +version = "1.17.0" +weakdeps = ["Adapt"] + + [deps.OffsetArrays.extensions] + OffsetArraysAdaptExt = "Adapt" + +[[deps.Ogg_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "b6aa4566bb7ae78498a5e68943863fa8b5231b59" +uuid = "e7412a2a-1a6e-54c0-be00-318e2571c051" +version = "1.3.6+0" + +[[deps.OpenBLASConsistentFPCSR_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl"] +git-tree-sha1 = "f2b3b9e52a5eb6a3434c8cca67ad2dde011194f4" +uuid = "6cdc7f73-28fd-5e50-80fb-958a8875b1af" +version = "0.3.30+0" + +[[deps.OpenBLAS_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] +uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" +version = "0.3.27+1" + +[[deps.OpenEXR]] +deps = ["Colors", "FileIO", "OpenEXR_jll"] +git-tree-sha1 = "97db9e07fe2091882c765380ef58ec553074e9c7" +uuid = "52e1d378-f018-4a11-a4be-720524705ac7" +version = "0.3.3" + +[[deps.OpenEXR_jll]] +deps = ["Artifacts", "Imath_jll", "JLLWrappers", "Libdl", "Zlib_jll"] +git-tree-sha1 = "df9b7c88c2e7a2e77146223c526bf9e236d5f450" +uuid = "18a262bb-aa17-5467-a713-aee519bc75cb" +version = "3.4.4+0" + +[[deps.OpenLibm_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "05823500-19ac-5b8b-9628-191a04bc5112" +version = "0.8.5+0" + +[[deps.OpenSSL]] +deps = ["BitFlags", "Dates", "MozillaCACerts_jll", "NetworkOptions", "OpenSSL_jll", "Sockets"] +git-tree-sha1 = "1d1aaa7d449b58415f97d2839c318b70ffb525a0" +uuid = "4d8831e6-92b7-49fb-bdf8-b643e874388c" +version = "1.6.1" + +[[deps.OpenSSL_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "c9cbeda6aceffc52d8a0017e71db27c7a7c0beaf" +uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95" +version = "3.5.5+0" + +[[deps.OpenSpecFun_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl"] +git-tree-sha1 = "1346c9208249809840c91b26703912dff463d335" +uuid = "efe28fd5-8261-553b-a9e1-b2916fc3738e" +version = "0.5.6+0" + +[[deps.Optimisers]] +deps = ["ChainRulesCore", "ConstructionBase", "Functors", "LinearAlgebra", "Random", "Statistics"] +git-tree-sha1 = "36b5d2b9dd06290cd65fcf5bdbc3a551ed133af5" +uuid = "3bd65402-5787-11e9-1adc-39752487f4e2" +version = "0.4.7" + + [deps.Optimisers.extensions] + OptimisersAdaptExt = ["Adapt"] + OptimisersEnzymeCoreExt = "EnzymeCore" + OptimisersReactantExt = "Reactant" + + [deps.Optimisers.weakdeps] + Adapt = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" + EnzymeCore = "f151be2c-9106-41f4-ab19-57ee4f262869" + Reactant = "3c362404-f566-11ee-1572-e11a4b42c853" + +[[deps.Optimization]] +deps = ["ADTypes", "ArrayInterface", "ConsoleProgressMonitor", "DocStringExtensions", "LBFGSB", "LinearAlgebra", "Logging", "LoggingExtras", "OptimizationBase", "Printf", "ProgressLogging", "Random", "Reexport", "SciMLBase", "SparseArrays", "TerminalLoggers"] +git-tree-sha1 = "fa2449ce34cc1d7b2191bad4d3356a5376412288" +uuid = "7f7a1694-90dd-40f0-9382-eb1efda571ba" +version = "4.8.0" + +[[deps.OptimizationBase]] +deps = ["ADTypes", "ArrayInterface", "DifferentiationInterface", "DocStringExtensions", "FastClosures", "LinearAlgebra", "PDMats", "Reexport", "SciMLBase", "SparseArrays", "SparseConnectivityTracer", "SparseMatrixColorings"] +git-tree-sha1 = "a4d72b85ec4b0ef7aca1a1e067406fcc673addae" +uuid = "bca83a33-5cc9-4baa-983d-23429ab6bcbb" +version = "2.14.0" + + [deps.OptimizationBase.extensions] + OptimizationEnzymeExt = "Enzyme" + OptimizationFiniteDiffExt = "FiniteDiff" + OptimizationForwardDiffExt = "ForwardDiff" + OptimizationMLDataDevicesExt = "MLDataDevices" + OptimizationMLUtilsExt = "MLUtils" + OptimizationMTKExt = "ModelingToolkit" + OptimizationReverseDiffExt = "ReverseDiff" + OptimizationSymbolicAnalysisExt = "SymbolicAnalysis" + OptimizationZygoteExt = "Zygote" + + [deps.OptimizationBase.weakdeps] + Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9" + FiniteDiff = "6a86dc24-6348-571c-b903-95158fe2bd41" + ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + MLDataDevices = "7e8f7934-dd98-4c1a-8fe8-92b47a384d40" + MLUtils = "f1d291b0-491e-4a28-83b9-f70985020b54" + ModelingToolkit = "961ee093-0014-501f-94e3-6117800e7a78" + ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + SymbolicAnalysis = "4297ee4d-0239-47d8-ba5d-195ecdf594fe" + Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f" + +[[deps.OptimizationOptimisers]] +deps = ["Optimisers", "Optimization", "Printf", "ProgressLogging", "Reexport"] +git-tree-sha1 = "ea6169605fe93e02df87874f388279ae766175d9" +uuid = "42dfb2eb-d2b4-4451-abcd-913932933ac1" +version = "0.3.11" + +[[deps.Opus_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "e2bb57a313a74b8104064b7efd01406c0a50d2ff" +uuid = "91d4177d-7536-5919-b921-800302f37372" +version = "1.6.1+0" + +[[deps.OrderedCollections]] +git-tree-sha1 = "05868e21324cede2207c6f0f466b4bfef6d5e7ee" +uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" +version = "1.8.1" + +[[deps.PCRE2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "efcefdf7-47ab-520b-bdef-62a2eaa19f15" +version = "10.42.0+1" + +[[deps.PDMats]] +deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"] +git-tree-sha1 = "e4cff168707d441cd6bf3ff7e4832bdf34278e4a" +uuid = "90014a1f-27ba-587c-ab20-58faa44d9150" +version = "0.11.37" +weakdeps = ["StatsBase"] + + [deps.PDMats.extensions] + StatsBaseExt = "StatsBase" + +[[deps.PNGFiles]] +deps = ["Base64", "CEnum", "ImageCore", "IndirectArrays", "OffsetArrays", "libpng_jll"] +git-tree-sha1 = "cf181f0b1e6a18dfeb0ee8acc4a9d1672499626c" +uuid = "f57f5aa1-a3ce-4bc8-8ab9-96f992907883" +version = "0.4.4" + +[[deps.Packing]] +deps = ["GeometryBasics"] +git-tree-sha1 = "bc5bf2ea3d5351edf285a06b0016788a121ce92c" +uuid = "19eb6ba3-879d-56ad-ad62-d5c202156566" +version = "0.5.1" + +[[deps.PaddedViews]] +deps = ["OffsetArrays"] +git-tree-sha1 = "0fac6313486baae819364c52b4f483450a9d793f" +uuid = "5432bcbf-9aad-5242-b902-cca2824c8663" +version = "0.5.12" + +[[deps.PairPlots]] +deps = ["Contour", "Distributions", "KernelDensity", "LinearAlgebra", "MCMCDiagnosticTools", "Makie", "Measures", "Missings", "OrderedCollections", "PolygonOps", "PrecompileTools", "Printf", "Requires", "StaticArrays", "Statistics", "StatsBase", "TableOperations", "Tables"] +git-tree-sha1 = "ca8501a0912f6c1e6533904e28cc80a1f23e9247" +uuid = "43a3c2be-4208-490b-832a-a21dcd55d7da" +version = "3.0.3" + + [deps.PairPlots.extensions] + MCMCChainsExt = "MCMCChains" + PairPlotsDynamicQuantitiesExt = "DynamicQuantities" + PairPlotsDynamicUnitfulExt = "Unitful" + + [deps.PairPlots.weakdeps] + DynamicQuantities = "06fc5a27-2a28-4c7c-a15d-362465fb6821" + MCMCChains = "c7f686f2-ff18-58e9-bc7b-31028e88f75d" + Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" + +[[deps.Pango_jll]] +deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "FriBidi_jll", "Glib_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl"] +git-tree-sha1 = "0662b083e11420952f2e62e17eddae7fc07d5997" +uuid = "36c8627f-9965-5494-a995-c6b170f724f3" +version = "1.57.0+0" + +[[deps.Parsers]] +deps = ["Dates", "PrecompileTools", "UUIDs"] +git-tree-sha1 = "7d2f8f21da5db6a806faf7b9b292296da42b2810" +uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" +version = "2.8.3" + +[[deps.Pixman_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LLVMOpenMP_jll", "Libdl"] +git-tree-sha1 = "db76b1ecd5e9715f3d043cec13b2ec93ce015d53" +uuid = "30392449-352a-5448-841d-b1acce4e97dc" +version = "0.44.2+0" + +[[deps.Pkg]] +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.11.0" +weakdeps = ["REPL"] + + [deps.Pkg.extensions] + REPLExt = "REPL" + +[[deps.PkgVersion]] +deps = ["Pkg"] +git-tree-sha1 = "f9501cc0430a26bc3d156ae1b5b0c1b47af4d6da" +uuid = "eebad327-c553-4316-9ea0-9fa01ccd7688" +version = "0.3.3" + +[[deps.PlotThemes]] +deps = ["PlotUtils", "Statistics"] +git-tree-sha1 = "41031ef3a1be6f5bbbf3e8073f210556daeae5ca" +uuid = "ccf2f8ad-2431-5c83-bf29-c5338b663b6a" +version = "3.3.0" + +[[deps.PlotUtils]] +deps = ["ColorSchemes", "Colors", "Dates", "PrecompileTools", "Printf", "Random", "Reexport", "StableRNGs", "Statistics"] +git-tree-sha1 = "26ca162858917496748aad52bb5d3be4d26a228a" +uuid = "995b91a9-d308-5afd-9ec6-746e21dbc043" +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", "Unzip"] +git-tree-sha1 = "1cc8ad0762e59e713ee3ef28f9b78b2c9f4ca078" +uuid = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" +version = "1.41.5" + + [deps.Plots.extensions] + FileIOExt = "FileIO" + GeometryBasicsExt = "GeometryBasics" + IJuliaExt = "IJulia" + ImageInTerminalExt = "ImageInTerminal" + UnitfulExt = "Unitful" + + [deps.Plots.weakdeps] + FileIO = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" + GeometryBasics = "5c1252a2-5f33-56bf-86c9-59e7332b4326" + IJulia = "7073ff75-c697-5162-941a-fcdaad2a7d2a" + ImageInTerminal = "d8c32880-2388-543b-8c61-d9f865259254" + Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" + +[[deps.Polyester]] +deps = ["ArrayInterface", "BitTwiddlingConvenienceFunctions", "CPUSummary", "IfElse", "ManualMemory", "PolyesterWeave", "Static", "StaticArrayInterface", "StrideArraysCore", "ThreadingUtilities"] +git-tree-sha1 = "16bbc30b5ebea91e9ce1671adc03de2832cff552" +uuid = "f517fe37-dbe3-4b94-8317-1923a5111588" +version = "0.7.19" + +[[deps.PolyesterWeave]] +deps = ["BitTwiddlingConvenienceFunctions", "CPUSummary", "IfElse", "Static", "ThreadingUtilities"] +git-tree-sha1 = "645bed98cd47f72f67316fd42fc47dee771aefcd" +uuid = "1d0040c9-8b98-4ee7-8388-3f51789ca0ad" +version = "0.2.2" + +[[deps.PolygonOps]] +git-tree-sha1 = "77b3d3605fc1cd0b42d95eba87dfcd2bf67d5ff6" +uuid = "647866c9-e3ac-4575-94e7-e3d426903924" +version = "0.1.2" + +[[deps.PooledArrays]] +deps = ["DataAPI", "Future"] +git-tree-sha1 = "36d8b4b899628fb92c2749eb488d884a926614d3" +uuid = "2dfb63ee-cc39-5dd5-95bd-886bf059d720" +version = "1.4.3" + +[[deps.PreallocationTools]] +deps = ["Adapt", "ArrayInterface", "PrecompileTools"] +git-tree-sha1 = "dc8d6bde5005a0eac05ae8faf1eceaaca166cfa4" +uuid = "d236fae5-4411-538c-8e31-a6e3d9e00b46" +version = "1.1.2" + + [deps.PreallocationTools.extensions] + PreallocationToolsForwardDiffExt = "ForwardDiff" + PreallocationToolsReverseDiffExt = "ReverseDiff" + PreallocationToolsSparseConnectivityTracerExt = "SparseConnectivityTracer" + + [deps.PreallocationTools.weakdeps] + ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + SparseConnectivityTracer = "9f842d2f-2579-4b1d-911e-f412cf18a3f5" + +[[deps.PrecompileTools]] +deps = ["Preferences"] +git-tree-sha1 = "5aa36f7049a63a1528fe8f7c3f2113413ffd4e1f" +uuid = "aea7be01-6a6a-4083-8856-8a6e6704d82a" +version = "1.2.1" + +[[deps.Preferences]] +deps = ["TOML"] +git-tree-sha1 = "522f093a29b31a93e34eaea17ba055d850edea28" +uuid = "21216c6a-2e73-6563-6e65-726566657250" +version = "1.5.1" + +[[deps.PrettyPrint]] +git-tree-sha1 = "632eb4abab3449ab30c5e1afaa874f0b98b586e4" +uuid = "8162dcfd-2161-5ef2-ae6c-7681170c5f98" +version = "0.2.0" + +[[deps.PrettyTables]] +deps = ["Crayons", "LaTeXStrings", "Markdown", "PrecompileTools", "Printf", "REPL", "Reexport", "StringManipulation", "Tables"] +git-tree-sha1 = "211530a7dc76ab59087f4d4d1fc3f086fbe87594" +uuid = "08abe8d2-0d0c-5749-adfa-8a2ac140af0d" +version = "3.2.3" + + [deps.PrettyTables.extensions] + PrettyTablesTypstryExt = "Typstry" + + [deps.PrettyTables.weakdeps] + Typstry = "f0ed7684-a786-439e-b1e3-3b82803b501e" + +[[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 = "f0803bc1171e455a04124affa9c21bba5ac4db32" +uuid = "33c8b6b6-d38a-422a-b730-caa89a2f386c" +version = "0.1.6" + +[[deps.ProgressMeter]] +deps = ["Distributed", "Printf"] +git-tree-sha1 = "fbb92c6c56b34e1a2c4c36058f68f332bec840e7" +uuid = "92933f4c-e287-5a05-a399-4b506db050ca" +version = "1.11.0" + +[[deps.PtrArrays]] +git-tree-sha1 = "1d36ef11a9aaf1e8b74dacc6a731dd1de8fd493d" +uuid = "43287f4e-b6f4-7ad1-bb20-aadabca52c3d" +version = "1.3.0" + +[[deps.QOI]] +deps = ["ColorTypes", "FileIO", "FixedPointNumbers"] +git-tree-sha1 = "472daaa816895cb7aee81658d4e7aec901fa1106" +uuid = "4b34888f-f399-49d4-9bb3-47ed5cae4e65" +version = "1.0.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 = "9da16da70037ba9d701192e27befedefb91ec284" +uuid = "1fd47b50-473d-5c70-9696-f719f8f3bcdc" +version = "2.11.2" + + [deps.QuadGK.extensions] + QuadGKEnzymeExt = "Enzyme" + + [deps.QuadGK.weakdeps] + Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9" + +[[deps.REPL]] +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.Random123]] +deps = ["Random", "RandomNumbers"] +git-tree-sha1 = "dbe5fd0b334694e905cb9fda73cd8554333c46e2" +uuid = "74087812-796a-5b5d-8853-05524746bad3" +version = "1.7.1" + +[[deps.RandomNumbers]] +deps = ["Random"] +git-tree-sha1 = "c6ec94d2aaba1ab2ff983052cf6a606ca5985902" +uuid = "e6cf234a-135c-5ec9-84dd-332b85af5143" +version = "1.6.0" + +[[deps.RangeArrays]] +git-tree-sha1 = "b9039e93773ddcfc828f12aadf7115b4b4d225f5" +uuid = "b3c3ace0-ae52-54e7-9d0b-2c1406fd6b9d" +version = "0.3.2" + +[[deps.Ratios]] +deps = ["Requires"] +git-tree-sha1 = "1342a47bf3260ee108163042310d26f2be5ec90b" +uuid = "c84ed2f1-dad5-54f0-aa8e-dbefe2724439" +version = "0.4.5" +weakdeps = ["FixedPointNumbers"] + + [deps.Ratios.extensions] + RatiosFixedPointNumbersExt = "FixedPointNumbers" + +[[deps.ReactantCore]] +deps = ["ExpressionExplorer", "MacroTools"] +git-tree-sha1 = "f3e31b90afcd152578a6c389eae46dd38b9a4f38" +uuid = "a3311ec8-5e00-46d5-b541-4f83e724a433" +version = "0.1.16" + +[[deps.RealDot]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "9f0a1b71baaf7650f4fa8a1d168c7fb6ee41f0c9" +uuid = "c1ae055f-0cd5-4b69-90a6-9a35b1a98df9" +version = "0.1.0" + +[[deps.RecipesBase]] +deps = ["PrecompileTools"] +git-tree-sha1 = "5c3d09cc4f31f5fc6af001c250bf1278733100ff" +uuid = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" +version = "1.3.4" + +[[deps.RecipesPipeline]] +deps = ["Dates", "NaNMath", "PlotUtils", "PrecompileTools", "RecipesBase"] +git-tree-sha1 = "45cf9fd0ca5839d06ef333c8201714e888486342" +uuid = "01d81517-befc-4cb6-b9ec-a95719d0359c" +version = "0.6.12" + +[[deps.RecursiveArrayTools]] +deps = ["Adapt", "ArrayInterface", "DocStringExtensions", "GPUArraysCore", "LinearAlgebra", "PrecompileTools", "RecipesBase", "StaticArraysCore", "SymbolicIndexingInterface"] +git-tree-sha1 = "18d2a6fd1ea9a8205cadb3a5704f8e51abdd748b" +uuid = "731186ca-8d62-57ce-b412-fbd966d074cd" +version = "3.48.0" + + [deps.RecursiveArrayTools.extensions] + RecursiveArrayToolsFastBroadcastExt = "FastBroadcast" + RecursiveArrayToolsForwardDiffExt = "ForwardDiff" + RecursiveArrayToolsKernelAbstractionsExt = "KernelAbstractions" + RecursiveArrayToolsMeasurementsExt = "Measurements" + RecursiveArrayToolsMonteCarloMeasurementsExt = "MonteCarloMeasurements" + RecursiveArrayToolsReverseDiffExt = ["ReverseDiff", "Zygote"] + RecursiveArrayToolsSparseArraysExt = ["SparseArrays"] + RecursiveArrayToolsStatisticsExt = "Statistics" + RecursiveArrayToolsStructArraysExt = "StructArrays" + RecursiveArrayToolsTablesExt = ["Tables"] + RecursiveArrayToolsTrackerExt = "Tracker" + RecursiveArrayToolsZygoteExt = "Zygote" + + [deps.RecursiveArrayTools.weakdeps] + FastBroadcast = "7034ab61-46d4-4ed7-9d0f-46aef9175898" + ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + KernelAbstractions = "63c18a36-062a-441e-b654-da1e3ab1ce7c" + Measurements = "eff96d63-e80a-5855-80a2-b1b0885c5ab7" + MonteCarloMeasurements = "0987c9cc-fe09-11e8-30f0-b96dd679fdca" + ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" + StructArrays = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" + Tables = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" + Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" + Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f" + +[[deps.Reexport]] +git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" +uuid = "189a3867-3050-52da-a836-e630ba90ab69" +version = "1.2.2" + +[[deps.RelocatableFolders]] +deps = ["SHA", "Scratch"] +git-tree-sha1 = "ffdaf70d81cf6ff22c2b6e733c900c3321cab864" +uuid = "05181044-ff0b-4ac5-8273-598c1e38db00" +version = "1.0.1" + +[[deps.Requires]] +deps = ["UUIDs"] +git-tree-sha1 = "62389eeff14780bfe55195b7204c0d8738436d64" +uuid = "ae029012-a4dd-5104-9daa-d747884805df" +version = "1.3.1" + +[[deps.Rmath]] +deps = ["Random", "Rmath_jll"] +git-tree-sha1 = "5b3d50eb374cea306873b371d3f8d3915a018f0b" +uuid = "79098fc4-a85e-5d69-aa6a-4863f24498fa" +version = "0.9.0" + +[[deps.Rmath_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "58cdd8fb2201a6267e1db87ff148dd6c1dbd8ad8" +uuid = "f50d1b31-88e8-58de-be2c-1cc44531875f" +version = "0.5.1+0" + +[[deps.Roots]] +deps = ["Accessors", "CommonSolve", "Printf"] +git-tree-sha1 = "8a433b1ede5e9be9a7ba5b1cc6698daa8d718f1d" +uuid = "f2b01f46-fcfa-551c-844a-d8ac1e96c665" +version = "2.2.10" + + [deps.Roots.extensions] + RootsChainRulesCoreExt = "ChainRulesCore" + RootsForwardDiffExt = "ForwardDiff" + RootsIntervalRootFindingExt = "IntervalRootFinding" + RootsSymPyExt = "SymPy" + RootsSymPyPythonCallExt = "SymPyPythonCall" + RootsUnitfulExt = "Unitful" + + [deps.Roots.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + IntervalRootFinding = "d2bf35a9-74e0-55ec-b149-d360ff49b807" + SymPy = "24249f21-da20-56a4-8eb1-6a02cf4ae2e6" + SymPyPythonCall = "bc8888f7-b21e-4b7c-a06a-5d9c9496438c" + Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" + +[[deps.RoundingEmulator]] +git-tree-sha1 = "40b9edad2e5287e05bd413a38f61a8ff55b9557b" +uuid = "5eaf0fd0-dfba-4ccb-bf02-d820a40db705" +version = "0.2.1" + +[[deps.RuntimeGeneratedFunctions]] +deps = ["ExprTools", "SHA", "Serialization"] +git-tree-sha1 = "7257165d5477fd1025f7cb656019dcb6b0512c38" +uuid = "7e49a35a-f44a-4d26-94aa-eba1b4ca6b47" +version = "0.5.17" + +[[deps.SHA]] +uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" +version = "0.7.0" + +[[deps.SIMD]] +deps = ["PrecompileTools"] +git-tree-sha1 = "e24dc23107d426a096d3eae6c165b921e74c18e4" +uuid = "fdea26ae-647d-5447-a871-4b548cad5224" +version = "3.7.2" + +[[deps.SIMDTypes]] +git-tree-sha1 = "330289636fb8107c5f32088d2741e9fd7a061a5c" +uuid = "94e857df-77ce-4151-89e5-788b33177be4" +version = "0.1.0" + +[[deps.SLEEFPirates]] +deps = ["IfElse", "Static", "VectorizationBase"] +git-tree-sha1 = "456f610ca2fbd1c14f5fcf31c6bfadc55e7d66e0" +uuid = "476501e8-09a2-5ece-8869-fb82de89a1fa" +version = "0.6.43" + +[[deps.SciMLBase]] +deps = ["ADTypes", "Accessors", "Adapt", "ArrayInterface", "CommonSolve", "ConstructionBase", "Distributed", "DocStringExtensions", "EnumX", "FunctionWrappersWrappers", "IteratorInterfaceExtensions", "LinearAlgebra", "Logging", "Markdown", "Moshi", "PreallocationTools", "PrecompileTools", "Preferences", "Printf", "RecipesBase", "RecursiveArrayTools", "Reexport", "RuntimeGeneratedFunctions", "SciMLLogging", "SciMLOperators", "SciMLPublic", "SciMLStructures", "StaticArraysCore", "Statistics", "SymbolicIndexingInterface"] +git-tree-sha1 = "f2c5ddf74a49c1fd74e511d31168f0354c6c1e19" +uuid = "0bca4576-84f4-4d90-8ffe-ffa030f20462" +version = "2.138.1" + + [deps.SciMLBase.extensions] + SciMLBaseChainRulesCoreExt = "ChainRulesCore" + SciMLBaseDifferentiationInterfaceExt = "DifferentiationInterface" + SciMLBaseDistributionsExt = "Distributions" + SciMLBaseEnzymeExt = "Enzyme" + SciMLBaseForwardDiffExt = "ForwardDiff" + SciMLBaseMLStyleExt = "MLStyle" + SciMLBaseMakieExt = "Makie" + SciMLBaseMeasurementsExt = "Measurements" + SciMLBaseMonteCarloMeasurementsExt = "MonteCarloMeasurements" + SciMLBaseMooncakeExt = "Mooncake" + SciMLBasePartialFunctionsExt = "PartialFunctions" + SciMLBasePyCallExt = "PyCall" + SciMLBasePythonCallExt = "PythonCall" + SciMLBaseRCallExt = "RCall" + SciMLBaseReverseDiffExt = "ReverseDiff" + SciMLBaseTrackerExt = "Tracker" + SciMLBaseZygoteExt = ["Zygote", "ChainRulesCore"] + + [deps.SciMLBase.weakdeps] + ChainRules = "082447d4-558c-5d27-93f4-14fc19e9eca2" + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + DifferentiationInterface = "a0c0ee7d-e4b9-4e03-894e-1c5f64a51d63" + Distributions = "31c24e10-a181-5473-b8eb-7969acd0382f" + Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9" + ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + MLStyle = "d8e11817-5142-5d16-987a-aa16d5891078" + Makie = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a" + Measurements = "eff96d63-e80a-5855-80a2-b1b0885c5ab7" + MonteCarloMeasurements = "0987c9cc-fe09-11e8-30f0-b96dd679fdca" + Mooncake = "da2b9cff-9c12-43a0-ae48-6db2b0edb7d6" + PartialFunctions = "570af359-4316-4cb7-8c74-252c00c2016b" + PyCall = "438e738f-606a-5dbb-bf0a-cddfbfd45ab0" + PythonCall = "6099a3de-0909-46bc-b1f4-468b9a2dfc0d" + RCall = "6f49c342-dc21-5d91-9882-a32aef131414" + ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" + Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f" + +[[deps.SciMLLogging]] +deps = ["Logging", "LoggingExtras", "Preferences"] +git-tree-sha1 = "a51104fa06a784c5ddf4a9937c5e0c03de0c6878" +uuid = "a6db7da4-7206-11f0-1eab-35f2a5dbe1d1" +version = "1.9.0" +weakdeps = ["Tracy"] + + [deps.SciMLLogging.extensions] + SciMLLoggingTracyExt = "Tracy" + +[[deps.SciMLOperators]] +deps = ["Accessors", "ArrayInterface", "DocStringExtensions", "LinearAlgebra"] +git-tree-sha1 = "794c760e6aafe9f40dcd7dd30526ea33f0adc8b7" +uuid = "c0aeaf25-5076-4817-a8d5-81caf7dfa961" +version = "1.15.1" +weakdeps = ["SparseArrays", "StaticArraysCore"] + + [deps.SciMLOperators.extensions] + SciMLOperatorsSparseArraysExt = "SparseArrays" + SciMLOperatorsStaticArraysCoreExt = "StaticArraysCore" + +[[deps.SciMLPublic]] +git-tree-sha1 = "0ba076dbdce87ba230fff48ca9bca62e1f345c9b" +uuid = "431bcebd-1456-4ced-9d72-93c2757fff0b" +version = "1.0.1" + +[[deps.SciMLStructures]] +deps = ["ArrayInterface", "PrecompileTools"] +git-tree-sha1 = "607f6867d0b0553e98fc7f725c9f9f13b4d01a32" +uuid = "53ae85a6-f571-4167-b2af-e1d143709226" +version = "1.10.0" + +[[deps.ScientificTypesBase]] +deps = ["InteractiveUtils"] +git-tree-sha1 = "e785eaa35a0f5518a388f9010e66fda64ea95ede" +uuid = "30f210dd-8aff-4c5f-94ba-8e64358c1161" +version = "3.1.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 = "9b81b8393e50b7d4e6d0a9f14e192294d3b7c109" +uuid = "6c6a2e73-6563-6170-7368-637461726353" +version = "1.3.0" + +[[deps.SentinelArrays]] +deps = ["Dates", "Random"] +git-tree-sha1 = "ebe7e59b37c400f694f52b58c93d26201387da70" +uuid = "91c51154-3ec4-41a3-a24f-3f23e20d615c" +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 = "c5391c6ace3bc430ca630251d02ea9687169ca68" +uuid = "efcf1570-3423-57d1-acb7-fd33fddbac46" +version = "1.1.2" + +[[deps.ShaderAbstractions]] +deps = ["ColorTypes", "FixedPointNumbers", "GeometryBasics", "LinearAlgebra", "Observables", "StaticArrays"] +git-tree-sha1 = "818554664a2e01fc3784becb2eb3a82326a604b6" +uuid = "65257c39-d410-5151-9873-9b3e5be5013e" +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" +uuid = "605ecd9f-84a6-4c9e-81e2-4798472b76a3" +version = "0.1.0" + +[[deps.Showoff]] +deps = ["Dates", "Grisu"] +git-tree-sha1 = "91eddf657aca81df9ae6ceb20b959ae5653ad1de" +uuid = "992d4aef-0814-514b-bc4d-f2e9a6c4116f" +version = "1.0.3" + +[[deps.SignedDistanceFields]] +deps = ["Statistics"] +git-tree-sha1 = "3949ad92e1c9d2ff0cd4a1317d5ecbba682f4b92" +uuid = "73760f76-fbc4-59ce-8f25-708e95d2df96" +version = "0.4.1" + +[[deps.SimpleBufferStream]] +git-tree-sha1 = "f305871d2f381d21527c770d4788c06c097c9bc1" +uuid = "777ac1f9-54b0-4bf8-805c-2214025038e7" +version = "1.2.0" + +[[deps.SimpleChains]] +deps = ["ArrayInterface", "CPUSummary", "ChainRulesCore", "CloseOpenIntervals", "ForwardDiff", "HostCPUFeatures", "IfElse", "LayoutPointers", "LoopVectorization", "ManualMemory", "Polyester", "Random", "SIMDTypes", "SLEEFPirates", "Static", "StaticArrayInterface", "StaticArrays", "StrideArraysCore", "UnPack", "VectorizationBase", "VectorizedRNG"] +git-tree-sha1 = "bd3f17dc89fe287eea8f94dd771f9343443dc664" +uuid = "de6bee2f-e2f4-4ec7-b6ed-219cc6f6e9e5" +version = "0.4.8" + +[[deps.SimpleTraits]] +deps = ["InteractiveUtils", "MacroTools"] +git-tree-sha1 = "be8eeac05ec97d379347584fa9fe2f5f76795bcb" +uuid = "699a6c99-e7fa-54fc-8d76-47d257e15c1d" +version = "0.9.5" + +[[deps.Sixel]] +deps = ["Dates", "FileIO", "ImageCore", "IndirectArrays", "OffsetArrays", "REPL", "libsixel_jll"] +git-tree-sha1 = "0494aed9501e7fb65daba895fb7fd57cc38bc743" +uuid = "45858cf5-a6b0-47a3-bbea-62219f50df47" +version = "0.1.5" + +[[deps.Sockets]] +uuid = "6462fe0b-24de-5631-8697-dd941f90decc" +version = "1.11.0" + +[[deps.SortingAlgorithms]] +deps = ["DataStructures"] +git-tree-sha1 = "64d974c2e6fdf07f8155b5b2ca2ffa9069b608d9" +uuid = "a2af1166-a08f-5f64-846c-94a0d3cef48c" +version = "1.2.2" + +[[deps.SparseArrays]] +deps = ["Libdl", "LinearAlgebra", "Random", "Serialization", "SuiteSparse_jll"] +uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" +version = "1.11.0" + +[[deps.SparseConnectivityTracer]] +deps = ["ADTypes", "DocStringExtensions", "FillArrays", "LinearAlgebra", "Random", "SparseArrays"] +git-tree-sha1 = "590b72143436e443888124aaf4026a636049e3f5" +uuid = "9f842d2f-2579-4b1d-911e-f412cf18a3f5" +version = "1.2.1" +weakdeps = ["ChainRulesCore", "LogExpFunctions", "NNlib", "NaNMath", "SpecialFunctions"] + + [deps.SparseConnectivityTracer.extensions] + SparseConnectivityTracerChainRulesCoreExt = "ChainRulesCore" + SparseConnectivityTracerLogExpFunctionsExt = "LogExpFunctions" + SparseConnectivityTracerNNlibExt = "NNlib" + SparseConnectivityTracerNaNMathExt = "NaNMath" + SparseConnectivityTracerSpecialFunctionsExt = "SpecialFunctions" + +[[deps.SparseInverseSubset]] +deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"] +git-tree-sha1 = "52962839426b75b3021296f7df242e40ecfc0852" +uuid = "dc90abb0-5640-4711-901d-7e5b23a2fada" +version = "0.1.2" + +[[deps.SparseMatrixColorings]] +deps = ["ADTypes", "DocStringExtensions", "LinearAlgebra", "PrecompileTools", "Random", "SparseArrays"] +git-tree-sha1 = "6ed48d9a3b22417c765dc273ae3e1e4de035e7c8" +uuid = "0a514795-09f3-496d-8182-132a7b665d35" +version = "0.4.23" + + [deps.SparseMatrixColorings.extensions] + SparseMatrixColoringsCUDAExt = "CUDA" + SparseMatrixColoringsCliqueTreesExt = "CliqueTrees" + SparseMatrixColoringsColorsExt = "Colors" + SparseMatrixColoringsJuMPExt = ["JuMP", "MathOptInterface"] + + [deps.SparseMatrixColorings.weakdeps] + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + CliqueTrees = "60701a23-6482-424a-84db-faee86b9b1f8" + Colors = "5ae59095-9a9b-59fe-a467-6f913c188581" + JuMP = "4076af6c-e467-56ae-b986-b466b2749572" + MathOptInterface = "b8f27783-ece8-5eb3-8dc8-9495eed66fee" + +[[deps.SpecialFunctions]] +deps = ["IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"] +git-tree-sha1 = "5acc6a41b3082920f79ca3c759acbcecf18a8d78" +uuid = "276daf66-3868-5448-9aa4-cd146d93841b" +version = "2.7.1" +weakdeps = ["ChainRulesCore"] + + [deps.SpecialFunctions.extensions] + SpecialFunctionsChainRulesCoreExt = "ChainRulesCore" + +[[deps.SplittablesBase]] +deps = ["Setfield", "Test"] +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 = "be1cf4eb0ac528d96f5115b4ed80c26a8d8ae621" +uuid = "cae243ae-269e-4f55-b966-ac2d0dc13c15" +version = "0.1.2" + +[[deps.Static]] +deps = ["CommonWorldInvalidations", "IfElse", "PrecompileTools", "SciMLPublic"] +git-tree-sha1 = "49440414711eddc7227724ae6e570c7d5559a086" +uuid = "aedffcd0-7271-4cad-89d0-dc628f76c6d3" +version = "1.3.1" + +[[deps.StaticArrayInterface]] +deps = ["ArrayInterface", "Compat", "IfElse", "LinearAlgebra", "PrecompileTools", "SciMLPublic", "Static"] +git-tree-sha1 = "aa1ea41b3d45ac449d10477f65e2b40e3197a0d2" +uuid = "0d7ed370-da01-4f52-bd93-41d350b8b718" +version = "1.9.0" +weakdeps = ["OffsetArrays", "StaticArrays"] + + [deps.StaticArrayInterface.extensions] + StaticArrayInterfaceOffsetArraysExt = "OffsetArrays" + StaticArrayInterfaceStaticArraysExt = "StaticArrays" + +[[deps.StaticArrays]] +deps = ["LinearAlgebra", "PrecompileTools", "Random", "StaticArraysCore"] +git-tree-sha1 = "eee1b9ad8b29ef0d936e3ec9838c7ec089620308" +uuid = "90137ffa-7385-5640-81b9-e52037218182" +version = "1.9.16" +weakdeps = ["ChainRulesCore", "Statistics"] + + [deps.StaticArrays.extensions] + StaticArraysChainRulesCoreExt = "ChainRulesCore" + StaticArraysStatisticsExt = "Statistics" + +[[deps.StaticArraysCore]] +git-tree-sha1 = "6ab403037779dae8c514bad259f32a447262455a" +uuid = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" +version = "1.4.4" + +[[deps.StatisticalTraits]] +deps = ["ScientificTypesBase"] +git-tree-sha1 = "89f86d9376acd18a1a4fbef66a56335a3a7633b8" +uuid = "64bff920-2084-43da-a3e6-9bb72801c0c9" +version = "3.5.0" + +[[deps.Statistics]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "ae3bb1eb3bba077cd276bc5cfc337cc65c3075c0" +uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" +version = "1.11.1" +weakdeps = ["SparseArrays"] + + [deps.Statistics.extensions] + SparseArraysExt = ["SparseArrays"] + +[[deps.StatsAPI]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "178ed29fd5b2a2cfc3bd31c13375ae925623ff36" +uuid = "82ae8749-77ed-4fe6-ae5f-f523153014b0" +version = "1.8.0" + +[[deps.StatsBase]] +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.10" + +[[deps.StatsFuns]] +deps = ["HypergeometricFunctions", "IrrationalConstants", "LogExpFunctions", "Reexport", "Rmath", "SpecialFunctions"] +git-tree-sha1 = "91f091a8716a6bb38417a6e6f274602a19aaa685" +uuid = "4c63d2b9-4356-54db-8cca-17b64c39e42c" +version = "1.5.2" +weakdeps = ["ChainRulesCore", "InverseFunctions"] + + [deps.StatsFuns.extensions] + StatsFunsChainRulesCoreExt = "ChainRulesCore" + StatsFunsInverseFunctionsExt = "InverseFunctions" + +[[deps.StrideArraysCore]] +deps = ["ArrayInterface", "CloseOpenIntervals", "IfElse", "LayoutPointers", "LinearAlgebra", "ManualMemory", "SIMDTypes", "Static", "StaticArrayInterface", "ThreadingUtilities"] +git-tree-sha1 = "83151ba8065a73f53ca2ae98bc7274d817aa30f2" +uuid = "7792a7ef-975c-4747-a70f-980b88e8d1da" +version = "0.5.8" + +[[deps.StringManipulation]] +deps = ["PrecompileTools"] +git-tree-sha1 = "a3c1536470bf8c5e02096ad4853606d7c8f62721" +uuid = "892a3eda-7b42-436c-8928-eab12a02cf0e" +version = "0.4.2" + +[[deps.StructArrays]] +deps = ["ConstructionBase", "DataAPI", "Tables"] +git-tree-sha1 = "a2c37d815bf00575332b7bd0389f771cb7987214" +uuid = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" +version = "0.7.2" +weakdeps = ["Adapt", "GPUArraysCore", "KernelAbstractions", "LinearAlgebra", "SparseArrays", "StaticArrays"] + + [deps.StructArrays.extensions] + StructArraysAdaptExt = "Adapt" + StructArraysGPUArraysCoreExt = ["GPUArraysCore", "KernelAbstractions"] + StructArraysLinearAlgebraExt = "LinearAlgebra" + StructArraysSparseArraysExt = "SparseArrays" + StructArraysStaticArraysExt = "StaticArrays" + +[[deps.StructUtils]] +deps = ["Dates", "UUIDs"] +git-tree-sha1 = "28145feabf717c5d65c1d5e09747ee7b1ff3ed13" +uuid = "ec057cc2-7a8d-4b58-b3b3-92acb9f63b42" +version = "2.6.3" + + [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" + +[[deps.SuiteSparse_jll]] +deps = ["Artifacts", "Libdl", "libblastrampoline_jll"] +uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c" +version = "7.7.0+0" + +[[deps.SymbolicIndexingInterface]] +deps = ["Accessors", "ArrayInterface", "RuntimeGeneratedFunctions", "StaticArraysCore"] +git-tree-sha1 = "94c58884e013efff548002e8dc2fdd1cb74dfce5" +uuid = "2efcf032-c050-4f8e-a9bb-153293bab1f5" +version = "0.3.46" +weakdeps = ["PrettyTables"] + + [deps.SymbolicIndexingInterface.extensions] + SymbolicIndexingInterfacePrettyTablesExt = "PrettyTables" + +[[deps.TOML]] +deps = ["Dates"] +uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" +version = "1.0.3" + +[[deps.TableOperations]] +deps = ["SentinelArrays", "Tables", "Test"] +git-tree-sha1 = "e383c87cf2a1dc41fa30c093b2a19877c83e1bc1" +uuid = "ab02a1b2-a7df-11e8-156e-fb1833f50b87" +version = "1.2.0" + +[[deps.TableTraits]] +deps = ["IteratorInterfaceExtensions"] +git-tree-sha1 = "c06b2f539df1c6efa794486abfb6ed2022561a39" +uuid = "3783bdb8-4a98-5b6b-af9a-565f29a5fe9c" +version = "1.0.1" + +[[deps.Tables]] +deps = ["DataAPI", "DataValueInterfaces", "IteratorInterfaceExtensions", "OrderedCollections", "TableTraits"] +git-tree-sha1 = "f2c1efbc8f3a609aadf318094f8fc5204bdaf344" +uuid = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" +version = "1.12.1" + +[[deps.Tar]] +deps = ["ArgTools", "SHA"] +uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" +version = "1.10.0" + +[[deps.TensorCore]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "1feb45f88d133a655e001435632f019a9a1bcdb6" +uuid = "62fd8b95-f654-4bbd-a8a5-9c27f68ccd50" +version = "0.1.1" + +[[deps.TerminalLoggers]] +deps = ["LeftChildRightSiblingTrees", "Logging", "Markdown", "Printf", "ProgressLogging", "UUIDs"] +git-tree-sha1 = "f133fab380933d042f6796eda4e130272ba520ca" +uuid = "5d786b92-1e48-4d6f-9151-6b4477ca9bed" +version = "0.1.7" + +[[deps.Test]] +deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] +uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" +version = "1.11.0" + +[[deps.ThreadingUtilities]] +deps = ["ManualMemory"] +git-tree-sha1 = "d969183d3d244b6c33796b5ed01ab97328f2db85" +uuid = "8290d209-cae3-49c0-8002-c8c24d57dab5" +version = "0.5.5" + +[[deps.TiffImages]] +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.11.6" + +[[deps.Tracy]] +deps = ["ExprTools", "LibTracyClient_jll", "Libdl"] +git-tree-sha1 = "73e3ff50fd3990874c59fef0f35d10644a1487bc" +uuid = "e689c965-62c8-4b79-b2c5-8359227902fd" +version = "0.1.6" + + [deps.Tracy.extensions] + TracyProfilerExt = "TracyProfiler_jll" + + [deps.Tracy.weakdeps] + TracyProfiler_jll = "0c351ed6-8a68-550e-8b79-de6f926da83c" + +[[deps.TranscodingStreams]] +git-tree-sha1 = "0c45878dcfdcfa8480052b6ab162cdd138781742" +uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa" +version = "0.11.3" + +[[deps.Transducers]] +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.85" + + [deps.Transducers.extensions] + TransducersAdaptExt = "Adapt" + TransducersBlockArraysExt = "BlockArrays" + TransducersDataFramesExt = "DataFrames" + TransducersLazyArraysExt = "LazyArrays" + TransducersOnlineStatsBaseExt = "OnlineStatsBase" + 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" + OnlineStatsBase = "925886fa-5bf2-5e8e-b522-a9147a512338" + Referenceables = "42d2dcc6-99eb-4e98-b66c-637b7d73030e" + +[[deps.TriplotBase]] +git-tree-sha1 = "4d4ed7f294cda19382ff7de4c137d24d16adc89b" +uuid = "981d1d27-644d-49a2-9326-4793e63143c3" +version = "0.1.0" + +[[deps.URIs]] +git-tree-sha1 = "bef26fb046d031353ef97a82e3fdb6afe7f21b1a" +uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" +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" +uuid = "3a884ed6-31ef-47d7-9d2a-63182c4928ed" +version = "1.0.2" + +[[deps.Unicode]] +uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" +version = "1.11.0" + +[[deps.UnicodeFun]] +deps = ["REPL"] +git-tree-sha1 = "53915e50200959667e78a92a418594b428dffddf" +uuid = "1cfade01-22cf-5700-b092-accc4b62d6e1" +version = "0.4.1" + +[[deps.Unitful]] +deps = ["Dates", "LinearAlgebra", "Random"] +git-tree-sha1 = "57e1b2c9de4bd6f40ecb9de4ac1797b81970d008" +uuid = "1986cc42-f94f-5a68-af5c-568840ba703d" +version = "1.28.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.UnsafeAtomics]] +git-tree-sha1 = "b13c4edda90890e5b04ba24e20a310fbe6f249ff" +uuid = "013be700-e6cd-48c3-b4a1-df204f14c38f" +version = "0.3.0" +weakdeps = ["LLVM"] + + [deps.UnsafeAtomics.extensions] + UnsafeAtomicsLLVM = ["LLVM"] + +[[deps.Unzip]] +git-tree-sha1 = "ca0969166a028236229f63514992fc073799bb78" +uuid = "41fe7b60-77ed-43a1-b4f0-825fd5a5650d" +version = "0.2.0" + +[[deps.VectorizationBase]] +deps = ["ArrayInterface", "CPUSummary", "HostCPUFeatures", "IfElse", "LayoutPointers", "Libdl", "LinearAlgebra", "SIMDTypes", "Static", "StaticArrayInterface"] +git-tree-sha1 = "d1d9a935a26c475ebffd54e9c7ad11627c43ea85" +uuid = "3d5dd08c-fd9d-11e8-17fa-ed2836048c2f" +version = "0.21.72" + +[[deps.VectorizedRNG]] +deps = ["Distributed", "Random", "SLEEFPirates", "UnPack", "VectorizationBase"] +git-tree-sha1 = "5ca83562ba95272d8709c6c91e31e23c3c4c9825" +uuid = "33b4df10-0173-11e9-2a0c-851a7edac40e" +version = "0.2.25" +weakdeps = ["Requires", "StaticArraysCore"] + + [deps.VectorizedRNG.extensions] + VectorizedRNGStaticArraysExt = ["StaticArraysCore"] + +[[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"] +git-tree-sha1 = "96478df35bbc2f3e1e791bc7a3d0eeee559e60e9" +uuid = "a2964d1f-97da-50d4-b82a-358c7fce9d89" +version = "1.24.0+0" + +[[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.WeightInitializers]] +deps = ["ConcreteStructs", "GPUArraysCore", "LinearAlgebra", "Random", "SpecialFunctions", "Statistics"] +git-tree-sha1 = "d79b71da9e7be904db615bdb99187d30753822a4" +uuid = "d49dbf32-c5c2-4618-8acc-27bb2598ef2d" +version = "1.3.1" + + [deps.WeightInitializers.extensions] + AMDGPUExt = "AMDGPU" + CUDAExt = "CUDA" + ChainRulesCoreExt = "ChainRulesCore" + GPUArraysExt = "GPUArrays" + ReactantExt = "Reactant" + + [deps.WeightInitializers.weakdeps] + AMDGPU = "21141c5a-9bdb-4563-92ae-f87d6854732e" + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + GPUArrays = "0c68f7d7-f131-5f86-a1c3-88cf8149b2d7" + Reactant = "3c362404-f566-11ee-1572-e11a4b42c853" + +[[deps.WoodburyMatrices]] +deps = ["LinearAlgebra", "SparseArrays"] +git-tree-sha1 = "248a7031b3da79a127f14e5dc5f417e26f9f6db7" +uuid = "efce3f68-66dc-5838-9240-27a6d6f5f9b6" +version = "1.1.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 = "808090ede1d41644447dd5cbafced4731c56bd2f" +uuid = "4f6342f7-b3d2-589e-9d20-edeb45f2b2bc" +version = "1.8.13+0" + +[[deps.Xorg_libXau_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "aa1261ebbac3ccc8d16558ae6799524c450ed16b" +uuid = "0c0b7dd1-d40b-584c-a123-a41640f87eec" +version = "1.0.13+0" + +[[deps.Xorg_libXcursor_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libXfixes_jll", "Xorg_libXrender_jll"] +git-tree-sha1 = "6c74ca84bbabc18c4547014765d194ff0b4dc9da" +uuid = "935fb764-8cf2-53bf-bb30-45bb1f8bf724" +version = "1.2.4+0" + +[[deps.Xorg_libXdmcp_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "52858d64353db33a56e13c341d7bf44cd0d7b309" +uuid = "a3789734-cfe1-5b06-b2d0-1dd0d9d62d05" +version = "1.1.6+0" + +[[deps.Xorg_libXext_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] +git-tree-sha1 = "1a4a26870bf1e5d26cd585e38038d399d7e65706" +uuid = "1082639a-0dae-5f34-9b06-72781eeb8cb3" +version = "1.3.8+0" + +[[deps.Xorg_libXfixes_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] +git-tree-sha1 = "75e00946e43621e09d431d9b95818ee751e6b2ef" +uuid = "d091e8ba-531a-589c-9de9-94069b037ed8" +version = "6.0.2+0" + +[[deps.Xorg_libXi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libXext_jll", "Xorg_libXfixes_jll"] +git-tree-sha1 = "a376af5c7ae60d29825164db40787f15c80c7c54" +uuid = "a51aa0fd-4e3c-5386-b890-e753decda492" +version = "1.8.3+0" + +[[deps.Xorg_libXinerama_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libXext_jll"] +git-tree-sha1 = "0ba01bc7396896a4ace8aab67db31403c71628f4" +uuid = "d1454406-59df-5ea1-beac-c340f2130bc3" +version = "1.1.7+0" + +[[deps.Xorg_libXrandr_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libXext_jll", "Xorg_libXrender_jll"] +git-tree-sha1 = "6c174ef70c96c76f4c3f4d3cfbe09d018bcd1b53" +uuid = "ec84b674-ba8e-5d96-8ba1-2a689ba10484" +version = "1.5.6+0" + +[[deps.Xorg_libXrender_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] +git-tree-sha1 = "7ed9347888fac59a618302ee38216dd0379c480d" +uuid = "ea2f1a96-1ddc-540d-b46f-429655e07cfa" +version = "0.9.12+0" + +[[deps.Xorg_libxcb_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libXau_jll", "Xorg_libXdmcp_jll"] +git-tree-sha1 = "bfcaf7ec088eaba362093393fe11aa141fa15422" +uuid = "c7cfdc94-dc32-55de-ac96-5a1b8d977c5b" +version = "1.17.1+0" + +[[deps.Xorg_libxkbfile_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] +git-tree-sha1 = "ed756a03e95fff88d8f738ebc2849431bdd4fd1a" +uuid = "cc61e674-0454-545c-8b26-ed2c68acab7a" +version = "1.2.0+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", "Xorg_xcb_util_jll"] +git-tree-sha1 = "f4fc02e384b74418679983a97385644b67e1263b" +uuid = "12413925-8142-5f55-bb0e-6d7ca50bb09b" +version = "0.4.1+0" + +[[deps.Xorg_xcb_util_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxcb_jll"] +git-tree-sha1 = "68da27247e7d8d8dafd1fcf0c3654ad6506f5f97" +uuid = "2def613f-5ad1-5310-b15b-b15d46f528f5" +version = "0.4.1+0" + +[[deps.Xorg_xcb_util_keysyms_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_xcb_util_jll"] +git-tree-sha1 = "44ec54b0e2acd408b0fb361e1e9244c60c9c3dd4" +uuid = "975044d2-76e6-5fbe-bf08-97ce7c6574c7" +version = "0.4.1+0" + +[[deps.Xorg_xcb_util_renderutil_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_xcb_util_jll"] +git-tree-sha1 = "5b0263b6d080716a02544c55fdff2c8d7f9a16a0" +uuid = "0d47668e-0667-5a69-a72c-f761630bfb7e" +version = "0.3.10+0" + +[[deps.Xorg_xcb_util_wm_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_xcb_util_jll"] +git-tree-sha1 = "f233c83cad1fa0e70b7771e0e21b061a116f2763" +uuid = "c22f9ab0-d5fe-5066-847c-f4bb1cd4e361" +version = "0.4.2+0" + +[[deps.Xorg_xkbcomp_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxkbfile_jll"] +git-tree-sha1 = "801a858fc9fb90c11ffddee1801bb06a738bda9b" +uuid = "35661453-b289-5fab-8a00-3d9160c6a3a4" +version = "1.4.7+0" + +[[deps.Xorg_xkeyboard_config_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_xkbcomp_jll"] +git-tree-sha1 = "00af7ebdc563c9217ecc67776d1bbf037dbcebf4" +uuid = "33bec58e-1273-512f-9401-5d533626f822" +version = "2.44.0+0" + +[[deps.Xorg_xtrans_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "a63799ff68005991f9d9491b6e95bd3478d783cb" +uuid = "c5fb5394-a638-5e4d-96e5-b29de1b5cf10" +version = "1.6.0+0" + +[[deps.Zlib_jll]] +deps = ["Libdl"] +uuid = "83775a58-1f1d-513f-b197-d71354ab007a" +version = "1.2.13+1" + +[[deps.Zstd_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "446b23e73536f84e8037f5dce465e92275f6a308" +uuid = "3161d3a3-bdf6-5164-811a-617609db77b4" +version = "1.5.7+1" + +[[deps.Zygote]] +deps = ["AbstractFFTs", "ChainRules", "ChainRulesCore", "DiffRules", "Distributed", "FillArrays", "ForwardDiff", "GPUArraysCore", "IRTools", "InteractiveUtils", "LinearAlgebra", "LogExpFunctions", "MacroTools", "NaNMath", "PrecompileTools", "Random", "SparseArrays", "SpecialFunctions", "Statistics", "ZygoteRules"] +git-tree-sha1 = "a29cbf3968d36022198bcc6f23fdfd70f7caf737" +uuid = "e88e6eb3-aa80-5325-afca-941959d7151f" +version = "0.7.10" + + [deps.Zygote.extensions] + ZygoteAtomExt = "Atom" + ZygoteColorsExt = "Colors" + ZygoteDistancesExt = "Distances" + ZygoteTrackerExt = "Tracker" + + [deps.Zygote.weakdeps] + Atom = "c52e3926-4ff0-5f6e-af25-54175e0327b1" + Colors = "5ae59095-9a9b-59fe-a467-6f913c188581" + Distances = "b4f34e82-e78d-54a5-968a-f98e89d6e8f7" + Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" + +[[deps.ZygoteRules]] +deps = ["ChainRulesCore", "MacroTools"] +git-tree-sha1 = "434b3de333c75fc446aa0d19fc394edafd07ab08" +uuid = "700de1a5-db45-46bc-99cf-38207098b444" +version = "0.2.7" + +[[deps.cuDNN]] +deps = ["CEnum", "CUDA", "CUDA_Runtime_Discovery", "CUDNN_jll"] +git-tree-sha1 = "c1e756c5b075d06f19595ac0bc6388ab2973237a" +uuid = "02a925ec-e4fe-4b08-9a7e-0d78e3d38ccd" +version = "1.4.6" + +[[deps.demumble_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "6498e3581023f8e530f34760d18f75a69e3a4ea8" +uuid = "1e29f10c-031c-5a83-9565-69cddfc27673" +version = "1.3.0+0" + +[[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 = "b6a34e0e0960190ac2a4363a1bd003504772d631" +uuid = "214eeab7-80f7-51ab-84ad-2988db7cef09" +version = "0.61.1+0" + +[[deps.isoband_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "51b5eeb3f98367157a7a12a1fb0aa5328946c03c" +uuid = "9a68df92-36a6-505f-a73e-abb412b6bfb4" +version = "0.2.3+0" + +[[deps.libaom_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "371cc681c00a3ccc3fbc5c0fb91f58ba9bec1ecf" +uuid = "a4ae2306-e953-59d6-aa16-d00cac43593b" +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 = "125eedcb0a4a0bba65b657251ce1d27c8714e9d6" +uuid = "0ac62f75-1d6f-5e53-bd7c-93b484bb37c0" +version = "0.17.4+0" + +[[deps.libblastrampoline_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" +version = "5.11.0+0" + +[[deps.libdecor_jll]] +deps = ["Artifacts", "Dbus_jll", "JLLWrappers", "Libdl", "Libglvnd_jll", "Pango_jll", "Wayland_jll", "xkbcommon_jll"] +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 = "646634dd19587a56ee2f1199563ec056c5f228df" +uuid = "f638f0a6-7fb0-5443-88ba-1cc74229b280" +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 = "e015f211ebb898c8180887012b938f3851e719ac" +uuid = "b53b4c65-9356-5827-b1ea-8c7a1a84506f" +version = "1.6.55+0" + +[[deps.libsixel_jll]] +deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "Libdl", "libpng_jll"] +git-tree-sha1 = "c1733e347283df07689d71d61e14be986e49e47a" +uuid = "075b6546-f08a-558a-be8f-8157d0f608a5" +version = "1.10.5+0" + +[[deps.libvorbis_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Ogg_jll"] +git-tree-sha1 = "11e1772e7f3cc987e9d3de991dd4f6b2602663a5" +uuid = "f27f6e37-5d2b-51aa-960f-b287f2bc3b7a" +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.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.59.0+0" + +[[deps.p7zip_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" +version = "17.4.0+2" + +[[deps.x264_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "14cc7083fc6dff3cc44f2bc435ee96d06ed79aa7" +uuid = "1270edf5-f2f9-52d2-97e9-ab00b5d0237a" +version = "10164.0.1+0" + +[[deps.x265_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "e7b67590c14d487e734dcb925924c5dc43ec85f3" +uuid = "dfaa095f-4041-5dcd-9319-2fabd8486b76" +version = "4.1.0+0" + +[[deps.xkbcommon_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxcb_jll", "Xorg_xkeyboard_config_jll"] +git-tree-sha1 = "a1fc6507a40bf504527d0d4067d718f8e179b2b8" +uuid = "d8fb68d0-12a3-5cfd-a85a-d49703b185fd" +version = "1.13.0+0" diff --git a/docs/src/tutorials/Manifest-v1.12.toml b/docs/src/tutorials/Manifest-v1.12.toml index e3d8c46..0a80e6a 100644 --- a/docs/src/tutorials/Manifest-v1.12.toml +++ b/docs/src/tutorials/Manifest-v1.12.toml @@ -1,8 +1,8 @@ # This file is machine-generated - editing it directly is not advised -julia_version = "1.12.0" +julia_version = "1.12.5" manifest_format = "2.0" -project_hash = "b7ca4e9d809facc5760954c617658f1ee144f372" +project_hash = "5313db7951d8d244962549993121abb3638d8442" [[deps.ADTypes]] git-tree-sha1 = "27cecae79e5cc9935255f90c53bb831cc3c870d7" @@ -739,7 +739,7 @@ version = "0.9.5" [[deps.Downloads]] deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" -version = "1.6.0" +version = "1.7.0" [[deps.EarCut_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] @@ -1087,7 +1087,7 @@ uuid = "3e5b6fbb-0976-4d2c-9146-d79de83f2fb0" version = "0.1.17" [[deps.HybridVariationalInference]] -deps = ["Bijectors", "BlockDiagonals", "ChainRulesCore", "Combinatorics", "CommonSolve", "ComponentArrays", "DifferentiationInterface", "DistributionFits", "Distributions", "FillArrays", "Functors", "GPUArraysCore", "KernelAbstractions", "LinearAlgebra", "LogExpFunctions", "MLDataDevices", "MLUtils", "Missings", "NaNMath", "Optimisers", "Optimization", "Random", "StableRNGs", "StaticArrays", "StatsBase", "StatsFuns", "Test", "Zygote"] +deps = ["Bijectors", "BlockDiagonals", "ChainRulesCore", "Combinatorics", "CommonSolve", "ComponentArrays", "DifferentiationInterface", "DistributionFits", "Distributions", "FillArrays", "Functors", "GPUArraysCore", "KernelAbstractions", "LinearAlgebra", "LogExpFunctions", "MLDataDevices", "MLUtils", "Missings", "NaNMath", "Optimisers", "Optimization", "Random", "StableRNGs", "StaticArrays", "StatsBase", "StatsFuns", "Test", "UnPack", "Zygote"] path = "../../.." uuid = "a108c475-a4e2-4021-9a84-cfa7df242f64" version = "0.2.0" @@ -1469,7 +1469,7 @@ version = "0.6.4" [[deps.LibCURL_jll]] deps = ["Artifacts", "LibSSH2_jll", "Libdl", "OpenSSL_jll", "Zlib_jll", "nghttp2_jll"] uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" -version = "8.11.1+1" +version = "8.15.0+0" [[deps.LibGit2]] deps = ["LibGit2_jll", "NetworkOptions", "Printf", "SHA"] @@ -1835,7 +1835,7 @@ version = "0.3.7" [[deps.MozillaCACerts_jll]] uuid = "14a3606d-f60d-562e-9121-12d972cd8159" -version = "2025.5.20" +version = "2025.11.4" [[deps.NNlib]] deps = ["Adapt", "Atomix", "ChainRulesCore", "GPUArraysCore", "KernelAbstractions", "LinearAlgebra", "Random", "ScopedValues", "Statistics"] @@ -1952,7 +1952,7 @@ version = "1.5.0" [[deps.OpenSSL_jll]] deps = ["Artifacts", "Libdl"] uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95" -version = "3.5.1+0" +version = "3.5.4+0" [[deps.OpenSpecFun_jll]] deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl"] @@ -2093,7 +2093,7 @@ version = "0.44.2+0" [[deps.Pkg]] 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.12.0" +version = "1.12.1" weakdeps = ["REPL"] [deps.Pkg.extensions] @@ -3226,7 +3226,7 @@ version = "0.17.4+0" [[deps.libblastrampoline_jll]] deps = ["Artifacts", "Libdl"] uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" -version = "5.13.1+1" +version = "5.15.0+0" [[deps.libdecor_jll]] deps = ["Artifacts", "Dbus_jll", "JLLWrappers", "Libdl", "Libglvnd_jll", "Pango_jll", "Wayland_jll", "xkbcommon_jll"] @@ -3288,15 +3288,15 @@ uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" version = "1.64.0+1" [[deps.oneTBB_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] +deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl"] git-tree-sha1 = "d5a767a3bb77135a99e433afe0eb14cd7f6914c3" uuid = "1317d2d5-d96f-522e-a858-c73665f53c3e" version = "2022.0.0+0" [[deps.p7zip_jll]] -deps = ["Artifacts", "Libdl"] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" -version = "17.5.0+2" +version = "17.7.0+0" [[deps.x264_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] diff --git a/docs/src/tutorials/basic_cpu.md b/docs/src/tutorials/basic_cpu.md index b8031ac..18d8b38 100644 --- a/docs/src/tutorials/basic_cpu.md +++ b/docs/src/tutorials/basic_cpu.md @@ -125,17 +125,25 @@ Here, we use synthetic data generated by the package. ``` julia rng = StableRNG(111) +n_site_test = 60 (; xM, xP, y_o, y_unc) = gen_hybridproblem_synthetic( - rng, DoubleMM.DoubleMMCase(); scenario=Val((:omit_r0,))) + rng, DoubleMM.DoubleMMCase(); n_site_test, scenario=Val((:omit_r0,))) +n_site = size(y_o,2) - n_site_test +i_test = n_site .+ (1:n_site_test) +i_train = 1:n_site +test_data = (; xM = xM[:, i_test], xP = xP[:, i_test], + y_o = y_o[:, i_test], y_unc = y_unc[:, i_test], i_site = i_test) +train_data = (; xM = xM[:, i_train], xP = xP[:, i_train], + y_o = y_o[:, i_train], y_unc = y_unc[:, i_train], i_site = i_train) ``` Lets look at them. ``` julia -size(xM), size(xP), size(y_o), size(y_unc) +map(size,train_data) ``` - ((5, 800), (16, 800), (8, 800), (8, 800)) + (xM = (5, 800), xP = (16, 800), y_o = (8, 800), y_unc = (8, 800), i_site = (800,)) All of them have 800 columns, corresponding to 800 sites. There are 5 site-covaritas, 16 values of model drivers, and 8 observations per site. @@ -161,11 +169,9 @@ iteration of the solver. In addition to the data, it provides an index to the sites inside a tuple. ``` julia -n_site = size(y_o,2) n_batch = 20 train_dataloader = MLUtils.DataLoader( - (CA.getdata(xM), CA.getdata(xP), y_o, y_unc, 1:n_site), - batchsize=n_batch, partial=false) + CA.getdata.(values(train_data)), batchsize=n_batch, partial=false) ``` ## The Machine-Learning model @@ -230,12 +236,13 @@ given a vector of global parameters, and a matrix of site parameters to invocation of the process based model (PBM), defined at the beginning. ``` julia +approx = MeanHVIApproximation() f_batch = PBMSiteApplicator(f_doubleMM; θP, θM, θFix, xPvec=xP[:,1]) -ϕq0 = init_hybrid_ϕq(MeanHVIApproximation(), θP, θM, transP) +ϕq0 = init_hybrid_ϕq(approx, θP, θM, transP; n_site, transM) prob = HybridProblem(θM, ϕq0, g_chain_scaled, ϕg0, f_batch, priors_dict, py, - transM, transP, train_dataloader, n_covar, n_site, n_batch) + transM, transP, train_dataloader, test_data,n_covar, n_site, n_batch; approx) ``` ## Perform the inversion @@ -284,24 +291,25 @@ when running the model for all sites within one batch simultaneously. In the following, the PBM specification accepts matrices as arguments for parameters and drivers and returns a matrix of precitions. -For the parameters, one row corresponds to -one site. For the drivers and predictions, one column corresponds to one site. +Generally, the sites are the last dimension. So for the drivers and predictions, one column corresponds to one site. +However, for the parameters one row corresponds to one site. ``` julia -function f_doubleMM_sites(θc::CA.ComponentMatrix, xPc::CA.ComponentMatrix) +using StaticArrays +function f_doubleMM_sites(θc_tr::CA.ComponentMatrix, xPc::CA.ComponentMatrix) # extract several covariates from xP S1 = view(xPc, Val(:S1), :) S2 = view(xPc, Val(:S2), :) # # extract the parameters as row-repeated vectors - # θc[:,:r0] is parameter r0 for each site in batch + # θc_tr[:,:r0] is parameter r0 for each site in batch # dot-multiplication of full matrix times row-vector repeats for each observation row # also introduces zero for missing observations, leading to zero gradient there is_valid = isfinite.(S1) .&& isfinite.(S2) - r0 = is_valid .* CA.getdata(θc[:, Val(:r0)])' - r1 = is_valid .* CA.getdata(θc[:, Val(:r1)])' - K1 = is_valid .* CA.getdata(θc[:, Val(:K1)])' - K2 = is_valid .* CA.getdata(θc[:, Val(:K2)])' + r0 = is_valid .* CA.getdata(θc_tr[:, Val(:r0)])' + r1 = is_valid .* CA.getdata(θc_tr[:, Val(:r1)])' + K1 = is_valid .* CA.getdata(θc_tr[:, Val(:K1)])' + K2 = is_valid .* CA.getdata(θc_tr[:, Val(:K2)])' # each variable is a matrix (n_obs x n_site) r0 .+ r1 .* S1 ./ (K1 .+ S1) .* S2 ./ (K2 .+ S2) end diff --git a/docs/src/tutorials/basic_cpu.qmd b/docs/src/tutorials/basic_cpu.qmd index 6e3389d..86def5c 100644 --- a/docs/src/tutorials/basic_cpu.qmd +++ b/docs/src/tutorials/basic_cpu.qmd @@ -1,6 +1,8 @@ --- title: "Basic workflow without GPU" engine: julia +julia: + exeflags: ["+1.11"] execute: echo: true output: false @@ -130,8 +132,16 @@ Here, we use synthetic data generated by the package. ```{julia} rng = StableRNG(111) +n_site_test = 60 (; xM, xP, y_o, y_unc) = gen_hybridproblem_synthetic( - rng, DoubleMM.DoubleMMCase(); scenario=Val((:omit_r0,))) + rng, DoubleMM.DoubleMMCase(); n_site_test, scenario=Val((:omit_r0,))) +n_site = size(y_o,2) - n_site_test +i_test = n_site .+ (1:n_site_test) +i_train = 1:n_site +test_data = (; xM = xM[:, i_test], xP = xP[:, i_test], + y_o = y_o[:, i_test], y_unc = y_unc[:, i_test], i_site = i_test) +train_data = (; xM = xM[:, i_train], xP = xP[:, i_train], + y_o = y_o[:, i_train], y_unc = y_unc[:, i_train], i_site = i_train) ``` ```{julia} @@ -146,7 +156,7 @@ end Lets look at them. ```{julia} #| output: true -size(xM), size(xP), size(y_o), size(y_unc) +map(size,train_data) ``` All of them have 800 columns, corresponding to 800 sites. There are 5 site-covaritas, 16 values of model drivers, and 8 observations per site. @@ -170,11 +180,9 @@ iteration of the solver. In addition to the data, it provides an index to the sites inside a tuple. ```{julia} -n_site = size(y_o,2) n_batch = 20 train_dataloader = MLUtils.DataLoader( - (CA.getdata(xM), CA.getdata(xP), y_o, y_unc, 1:n_site), - batchsize=n_batch, partial=false) + CA.getdata.(values(train_data)), batchsize=n_batch, partial=false) ``` ## The Machine-Learning model @@ -240,12 +248,13 @@ given a vector of global parameters, and a matrix of site parameters to invocation of the process based model (PBM), defined at the beginning. ```{julia} +approx = MeanHVIApproximation() f_batch = PBMSiteApplicator(f_doubleMM; θP, θM, θFix, xPvec=xP[:,1]) -ϕq0 = init_hybrid_ϕq(MeanHVIApproximation(), θP, θM, transP) +ϕq0 = init_hybrid_ϕq(approx, θP, θM, transP; n_site, transM) prob = HybridProblem(θM, ϕq0, g_chain_scaled, ϕg0, f_batch, priors_dict, py, - transM, transP, train_dataloader, n_covar, n_site, n_batch) + transM, transP, train_dataloader, test_data,n_covar, n_site, n_batch; approx) ``` ```{julia} @@ -319,26 +328,26 @@ when running the model for all sites within one batch simultaneously. In the following, the PBM specification accepts matrices as arguments for parameters and drivers and returns a matrix of precitions. -For the parameters, one row corresponds to -one site. For the drivers and predictions, one column corresponds to one site. +Generally, the sites are the last dimension. So for the drivers and predictions, one column corresponds to one site. +However, for the parameters one row corresponds to one site. ```{julia} using StaticArrays -function f_doubleMM_sites(θc::CA.ComponentMatrix, xPc::CA.ComponentMatrix) +function f_doubleMM_sites(θc_tr::CA.ComponentMatrix, xPc::CA.ComponentMatrix) # extract several covariates from xP S1 = view(xPc, Val(:S1), :) S2 = view(xPc, Val(:S2), :) # # extract the parameters as row-repeated vectors - # θc[:,:r0] is parameter r0 for each site in batch + # θc_tr[:,:r0] is parameter r0 for each site in batch # dot-multiplication of full matrix times row-vector repeats for each observation row # also introduces zero for missing observations, leading to zero gradient there is_valid = isfinite.(S1) .&& isfinite.(S2) - r0 = is_valid .* CA.getdata(θc[:, Val(:r0)])' - r1 = is_valid .* CA.getdata(θc[:, Val(:r1)])' - K1 = is_valid .* CA.getdata(θc[:, Val(:K1)])' - K2 = is_valid .* CA.getdata(θc[:, Val(:K2)])' + r0 = is_valid .* CA.getdata(θc_tr[:, Val(:r0)])' + r1 = is_valid .* CA.getdata(θc_tr[:, Val(:r1)])' + K1 = is_valid .* CA.getdata(θc_tr[:, Val(:K1)])' + K2 = is_valid .* CA.getdata(θc_tr[:, Val(:K2)])' # each variable is a matrix (n_obs x n_site) r0 .+ r1 .* S1 ./ (K1 .+ S1) .* S2 ./ (K2 .+ S2) end diff --git a/docs/src/tutorials/blocks_corr.md b/docs/src/tutorials/blocks_corr.md index 5244069..75459aa 100644 --- a/docs/src/tutorials/blocks_corr.md +++ b/docs/src/tutorials/blocks_corr.md @@ -106,15 +106,15 @@ First, draw a sample. ``` julia n_sample_pred = 400 -(y_cor, θsP_cor, θsMs_cor) = (; y, θsP, θsMs) = predict_hvi( +(y_cor, θsP_cor, θsMs_tr_cor) = (; y, θsP, θsMs_tr) = predict_hvi( Random.default_rng(), probo_cor; n_sample_pred) -(y_ind, θsP_ind, θsMs_ind) = (; y, θsP, θsMs) = predict_hvi( +(y_ind, θsP_ind, θsMs_tr_ind) = (; y, θsP, θsMs_tr) = predict_hvi( Random.default_rng(), probo_ind; n_sample_pred) ``` ``` julia i_site = 1 -θ1 = vcat(θsP_ind, θsMs_ind[i_site,:,:]) +θ1 = vcat(θsP_ind, θsMs_tr_ind[i_site,:,:]) θ1_nt = NamedTuple(k => CA.getdata(θ1[k,:]) for k in keys(θ1[:,1])) # plt = pairplot(θ1_nt) ``` @@ -142,11 +142,11 @@ fig ``` julia plot_sd_vs_mean = (par) -> begin fig = Figure(); ax = Axis(fig[1,1], xlabel="mean($par)",ylabel="sd($par)") - θmean_cor = [mean(θsMs_cor[s,par,:]) for s in axes(θsMs_cor, 1)] - θsd_cor = [std(θsMs_cor[s,par,:]) for s in axes(θsMs_cor, 1)] + θmean_cor = [mean(θsMs_tr_cor[s,par,:]) for s in axes(θsMs_tr_cor, 1)] + θsd_cor = [std(θsMs_tr_cor[s,par,:]) for s in axes(θsMs_tr_cor, 1)] scatter!(ax, θmean_cor, θsd_cor, label="correlated") - θmean_ind = [mean(θsMs_ind[s,par,:]) for s in axes(θsMs_ind, 1)] - θsd_ind = [std(θsMs_ind[s,par,:]) for s in axes(θsMs_ind, 1)] + θmean_ind = [mean(θsMs_tr_ind[s,par,:]) for s in axes(θsMs_tr_ind, 1)] + θsd_ind = [std(θsMs_tr_ind[s,par,:]) for s in axes(θsMs_tr_ind, 1)] scatter!(ax, θmean_ind, θsd_ind, label="independent") axislegend(ax, unique=true) fig diff --git a/docs/src/tutorials/blocks_corr.qmd b/docs/src/tutorials/blocks_corr.qmd index 9a09bb0..e5f2c71 100644 --- a/docs/src/tutorials/blocks_corr.qmd +++ b/docs/src/tutorials/blocks_corr.qmd @@ -109,16 +109,16 @@ solver = HybridPosteriorSolver(; alg=Adam(0.02), n_MC=3) First, draw a sample. ```{julia} n_sample_pred = 400 -(y_cor, θsP_cor, θsMs_cor) = (; y, θsP, θsMs) = predict_hvi( +(y_cor, θsP_cor, θsMs_tr_cor) = (; y, θsP, θsMs_tr) = predict_hvi( Random.default_rng(), probo_cor; n_sample_pred) -(y_ind, θsP_ind, θsMs_ind) = (; y, θsP, θsMs) = predict_hvi( +(y_ind, θsP_ind, θsMs_tr_ind) = (; y, θsP, θsMs_tr) = predict_hvi( Random.default_rng(), probo_ind; n_sample_pred) ``` ```{julia} #| output: true i_site = 1 -θ1 = vcat(θsP_ind, θsMs_ind[i_site,:,:]) +θ1 = vcat(θsP_ind, θsMs_tr_ind[i_site,:,:]) θ1_nt = NamedTuple(k => CA.getdata(θ1[k,:]) for k in keys(θ1[:,1])) # plt = pairplot(θ1_nt) ``` @@ -143,11 +143,11 @@ fig #| output: true plot_sd_vs_mean = (par) -> begin fig = Figure(); ax = Axis(fig[1,1], xlabel="mean($par)",ylabel="sd($par)") - θmean_cor = [mean(θsMs_cor[s,par,:]) for s in axes(θsMs_cor, 1)] - θsd_cor = [std(θsMs_cor[s,par,:]) for s in axes(θsMs_cor, 1)] + θmean_cor = [mean(θsMs_tr_cor[s,par,:]) for s in axes(θsMs_tr_cor, 1)] + θsd_cor = [std(θsMs_tr_cor[s,par,:]) for s in axes(θsMs_tr_cor, 1)] scatter!(ax, θmean_cor, θsd_cor, label="correlated") - θmean_ind = [mean(θsMs_ind[s,par,:]) for s in axes(θsMs_ind, 1)] - θsd_ind = [std(θsMs_ind[s,par,:]) for s in axes(θsMs_ind, 1)] + θmean_ind = [mean(θsMs_tr_ind[s,par,:]) for s in axes(θsMs_tr_ind, 1)] + θsd_ind = [std(θsMs_tr_ind[s,par,:]) for s in axes(θsMs_tr_ind, 1)] scatter!(ax, θmean_ind, θsd_ind, label="independent") axislegend(ax, unique=true) fig diff --git a/docs/src/tutorials/blocks_corr_files/figure-commonmark/cell-10-output-1.png b/docs/src/tutorials/blocks_corr_files/figure-commonmark/cell-10-output-1.png index 6b042a8..d620c2b 100644 Binary files a/docs/src/tutorials/blocks_corr_files/figure-commonmark/cell-10-output-1.png and b/docs/src/tutorials/blocks_corr_files/figure-commonmark/cell-10-output-1.png differ diff --git a/docs/src/tutorials/blocks_corr_files/figure-commonmark/cell-11-output-1.png b/docs/src/tutorials/blocks_corr_files/figure-commonmark/cell-11-output-1.png index dfcdeea..c99b0d6 100644 Binary files a/docs/src/tutorials/blocks_corr_files/figure-commonmark/cell-11-output-1.png and b/docs/src/tutorials/blocks_corr_files/figure-commonmark/cell-11-output-1.png differ diff --git a/docs/src/tutorials/blocks_corr_files/figure-commonmark/cell-12-output-1.png b/docs/src/tutorials/blocks_corr_files/figure-commonmark/cell-12-output-1.png index d6e51d7..23e29ce 100644 Binary files a/docs/src/tutorials/blocks_corr_files/figure-commonmark/cell-12-output-1.png and b/docs/src/tutorials/blocks_corr_files/figure-commonmark/cell-12-output-1.png differ diff --git a/docs/src/tutorials/corr_site_global.md b/docs/src/tutorials/corr_site_global.md index f3e00f6..2bc5aed 100644 --- a/docs/src/tutorials/corr_site_global.md +++ b/docs/src/tutorials/corr_site_global.md @@ -114,9 +114,9 @@ First, draw a sample. ``` julia n_sample_pred = 400 -(y_cond, θsP_cond, θsMs_cond) = (; y, θsP, θsMs) = predict_hvi( +(y_cond, θsP_cond, θsMs_cond) = (; y, θsP, θsMs_tr) = predict_hvi( Random.default_rng(), probo_cond; n_sample_pred) -(y_uncond, θsP_uncond, θsMs_uncond) = (; y, θsP, θsMs) = predict_hvi( +(y_uncond, θsP_uncond, θsMs_uncond) = (; y, θsP, θsMs_tr) = predict_hvi( Random.default_rng(), probo_uncond; n_sample_pred) ``` diff --git a/docs/src/tutorials/corr_site_global.qmd b/docs/src/tutorials/corr_site_global.qmd index dc7ae7e..774bbd0 100644 --- a/docs/src/tutorials/corr_site_global.qmd +++ b/docs/src/tutorials/corr_site_global.qmd @@ -123,9 +123,9 @@ solver = HybridPosteriorSolver(; alg=Adam(0.02), n_MC=3) First, draw a sample. ```{julia} n_sample_pred = 400 -(y_cond, θsP_cond, θsMs_cond) = (; y, θsP, θsMs) = predict_hvi( +(y_cond, θsP_cond, θsMs_cond) = (; y, θsP, θsMs_tr) = predict_hvi( Random.default_rng(), probo_cond; n_sample_pred) -(y_uncond, θsP_uncond, θsMs_uncond) = (; y, θsP, θsMs) = predict_hvi( +(y_uncond, θsP_uncond, θsMs_uncond) = (; y, θsP, θsMs_tr) = predict_hvi( Random.default_rng(), probo_uncond; n_sample_pred) ``` diff --git a/docs/src/tutorials/corr_site_global_files/figure-commonmark/cell-10-output-1.png b/docs/src/tutorials/corr_site_global_files/figure-commonmark/cell-10-output-1.png index 51066e0..c63a6a8 100644 Binary files a/docs/src/tutorials/corr_site_global_files/figure-commonmark/cell-10-output-1.png and b/docs/src/tutorials/corr_site_global_files/figure-commonmark/cell-10-output-1.png differ diff --git a/docs/src/tutorials/corr_site_global_files/figure-commonmark/cell-11-output-1.png b/docs/src/tutorials/corr_site_global_files/figure-commonmark/cell-11-output-1.png index 15a008f..d0dcacb 100644 Binary files a/docs/src/tutorials/corr_site_global_files/figure-commonmark/cell-11-output-1.png and b/docs/src/tutorials/corr_site_global_files/figure-commonmark/cell-11-output-1.png differ diff --git a/docs/src/tutorials/corr_site_global_files/figure-commonmark/cell-12-output-1.png b/docs/src/tutorials/corr_site_global_files/figure-commonmark/cell-12-output-1.png index c1a21ff..af449cf 100644 Binary files a/docs/src/tutorials/corr_site_global_files/figure-commonmark/cell-12-output-1.png and b/docs/src/tutorials/corr_site_global_files/figure-commonmark/cell-12-output-1.png differ diff --git a/docs/src/tutorials/corr_site_global_files/figure-commonmark/cell-9-output-1.png b/docs/src/tutorials/corr_site_global_files/figure-commonmark/cell-9-output-1.png index 90833a8..5faf3f8 100644 Binary files a/docs/src/tutorials/corr_site_global_files/figure-commonmark/cell-9-output-1.png and b/docs/src/tutorials/corr_site_global_files/figure-commonmark/cell-9-output-1.png differ diff --git a/docs/src/tutorials/inspect_results.md b/docs/src/tutorials/inspect_results.md index c0f5ef9..468b4e7 100644 --- a/docs/src/tutorials/inspect_results.md +++ b/docs/src/tutorials/inspect_results.md @@ -39,25 +39,25 @@ using function [`sample_posterior`](@ref). using StableRNGs rng = StableRNG(112) n_sample_pred = 400 -(; θsP, θsMs) = sample_posterior(rng, probo; n_sample_pred, is_testmode = true) +(; θsP, θsMs_tr) = sample_posterior(rng, probo; n_sample_pred, is_testmode = true) ``` Lets look at the results. ``` julia -size(θsP), size(θsMs) +size(θsP), size(θsMs_tr) ``` ((1, 400), (800, 2, 400)) The last dimension is the number of samples, the second-last dimension is -the respective parameter. `θsMs` has an additional dimension denoting +the respective parameter. `θsMs_tr` has an additional dimension denoting the site for which parameters are sampled. They are ComponentArrays with the parameter dimension names that can be used: ``` julia -θsMs[1,:r1,:] # samples of the first site of parameter r1 +θsMs_tr[1,:r1,:] # samples of the first site of parameter r1 ``` ## Corner plots @@ -70,7 +70,7 @@ Here, we plot the global parameters and the site-parameters for the first site. ``` julia i_site = 1 -θ1 = vcat(θsP, θsMs[i_site,:,:]) +θ1 = vcat(θsP, θsMs_tr[i_site,:,:]) θ1_nt = NamedTuple(k => CA.getdata(θ1[k,:]) for k in keys(θ1[:,1])) # plt = pairplot(θ1_nt) ``` @@ -91,8 +91,8 @@ its expected value. ``` julia par = :K1 -θmean = [mean(θsMs[s,par,:]) for s in axes(θsMs, 1)] -θsd = [std(θsMs[s,par,:]) for s in axes(θsMs, 1)] +θmean = [mean(θsMs_tr[s,par,:]) for s in axes(θsMs_tr, 1)] +θsd = [std(θsMs_tr[s,par,:]) for s in axes(θsMs_tr, 1)] fig = Figure(); ax = Axis(fig[1,1], xlabel="mean($par)",ylabel="sd($par)") scatter!(ax, θmean, θsd) fig @@ -104,6 +104,23 @@ We see that $K_1$ across sites ranges from about 0.18 to 0.25, and that its estimated uncertainty is about 0.04, slightly decreasing with the values of the parameter. +## Correlations among site parameters at uncronstrained scale + +The features a correlation matrix of site parameters at unconstrained scale. +It can be extracted using function [`get_hybridproblem_correlation_Ms`](@ref). + +In a first implementation, this function operates on an `AbstractHybridProblem` +assuming that its returned `ϕq` contains a component `ρsM` +that is used to parameterize the +Cholesky factor of the correlation matrix. + +``` julia +CM = HVI.get_hybridproblem_correlation_Ms(probo) +fig = Figure(); ax = Axis(fig[1,1], xlabel="mean($par)",ylabel="sd($par)") +scatter!(ax, θmean, θsd) +fig +``` + ## Predictive Posterior In addition to the uncertainty in parameters, we are also interested in @@ -115,7 +132,7 @@ sampling the posterior and predictive posterior and returns the additional `NamedTuple` entry `y`. ``` julia -(; y, θsP, θsMs) = predict_hvi(rng, probo; n_sample_pred) +(; y, θsP, θsMs_tr) = predict_hvi(rng, probo; n_sample_pred) ``` ``` julia @@ -133,8 +150,8 @@ predicted magnitude across sites. ``` julia i_obs = 4 -ymean = [mean(y[i_obs,s,:]) for s in axes(θsMs, 1)] -ysd = [std(y[i_obs,s,:]) for s in axes(θsMs, 1)] +ymean = [mean(y[i_obs,s,:]) for s in axes(θsMs_tr, 1)] +ysd = [std(y[i_obs,s,:]) for s in axes(θsMs_tr, 1)] fig = Figure(); ax = Axis(fig[1,1], xlabel="mean(y$i_obs)",ylabel="sd(y$i_obs)") scatter!(ax, ymean, ysd) fig @@ -145,3 +162,7 @@ fig We see that observed values for associated substrate concentrations range about from 0.51 to 0.59 with an estimated standard deviation around 0.005 that decreases with the observed value. + +If only a point prediction is required, function [`predict_point_hvi`](@ref) +can be used, that returns +a single set of expected parameters and corresponding predictions. diff --git a/docs/src/tutorials/inspect_results.qmd b/docs/src/tutorials/inspect_results.qmd index 92bd94b..51910f9 100644 --- a/docs/src/tutorials/inspect_results.qmd +++ b/docs/src/tutorials/inspect_results.qmd @@ -47,10 +47,15 @@ probo = load(fname, "probo"); # not necessary any more with DoubleMM.f_doubleMM_sites # {{< include _pbm_matrix.qmd >}} # outside notebook, need to reset ModelApplicator, due to fθ defined in Notebook module -#θFix = CA.ComponentVector{eltype(probo.θP)}(r0=0.3) +# θFix = CA.ComponentVector{eltype(probo.θP)}( r0=probo.f_allsites.θFixm[1]) -_xP_batch = first(probo.train_dataloader)[2] +_xP_batch = _xP = first(probo.train_dataloader)[2] +_xM = first(probo.train_dataloader)[1] +_xM = probo.train_dataloader.data[1] +_xP = probo.train_dataloader.data[2] +tmp = predict_point_hvi(rng, probo, xM = _xM, xP = _xP) + f_batch = PBMPopulationApplicator( f_doubleMM_sites, probo.n_batch; probo.θP, probo.θM, θFix, xPvec=_xP_batch[:,1]) probo = HybridProblem(probo; f_batch) @@ -64,21 +69,21 @@ using function [`sample_posterior`](@ref). using StableRNGs rng = StableRNG(112) n_sample_pred = 400 -(; θsP, θsMs) = sample_posterior(rng, probo; n_sample_pred, is_testmode = true) +(; θsP, θsMs_tr) = sample_posterior(rng, probo; n_sample_pred, is_testmode = true) ``` Lets look at the results. ```{julia} #| output: true -size(θsP), size(θsMs) +size(θsP), size(θsMs_tr) ``` The last dimension is the number of samples, the second-last dimension is -the respective parameter. `θsMs` has an additional dimension denoting +the respective parameter. `θsMs_tr` has an additional dimension denoting the site for which parameters are sampled. They are ComponentArrays with the parameter dimension names that can be used: ```{julia} -θsMs[1,:r1,:] # samples of the first site of parameter r1 +θsMs_tr[1,:r1,:] # samples of the first site of parameter r1 ``` ## Corner plots @@ -91,7 +96,7 @@ Here, we plot the global parameters and the site-parameters for the first site. ```{julia} #| output: true i_site = 1 -θ1 = vcat(θsP, θsMs[i_site,:,:]) +θ1 = vcat(θsP, θsMs_tr[i_site,:,:]) θ1_nt = NamedTuple(k => CA.getdata(θ1[k,:]) for k in keys(θ1[:,1])) # plt = pairplot(θ1_nt) ``` @@ -117,8 +122,8 @@ its expected value. ```{julia} #| output: true par = :K1 -θmean = [mean(θsMs[s,par,:]) for s in axes(θsMs, 1)] -θsd = [std(θsMs[s,par,:]) for s in axes(θsMs, 1)] +θmean = [mean(θsMs_tr[s,par,:]) for s in axes(θsMs_tr, 1)] +θsd = [std(θsMs_tr[s,par,:]) for s in axes(θsMs_tr, 1)] fig = Figure(); ax = Axis(fig[1,1], xlabel="mean($par)",ylabel="sd($par)") scatter!(ax, θmean, θsd) fig @@ -128,6 +133,21 @@ We see that $K_1$ across sites ranges from about 0.18 to 0.25, and that its estimated uncertainty is about 0.04, slightly decreasing with the values of the parameter. +## Correlations among site parameters at uncronstrained scale +The features a correlation matrix of site parameters at unconstrained scale. +It can be extracted using function [`get_hybridproblem_correlation_Ms`](@ref). + +In a first implementation, this function operates on an `AbstractHybridProblem` +assuming that its returned `ϕq` contains a component `ρsM` +that is used to parameterize the +Cholesky factor of the correlation matrix. + +``` julia +CM = HVI.get_hybridproblem_correlation_Ms(probo) +fig = Figure(); ax = Axis(fig[1,1], xlabel="mean($par)",ylabel="sd($par)") +scatter!(ax, θmean, θsd) +fig +``` ## Predictive Posterior In addition to the uncertainty in parameters, we are also interested in @@ -139,7 +159,7 @@ sampling the posterior and predictive posterior and returns the additional `NamedTuple` entry `y`. ```{julia} -(; y, θsP, θsMs) = predict_hvi(rng, probo; n_sample_pred) +(; y, θsP, θsMs_tr) = predict_hvi(rng, probo; n_sample_pred) ``` ```{julia} @@ -157,8 +177,8 @@ predicted magnitude across sites. ```{julia} #| output: true i_obs = 4 -ymean = [mean(y[i_obs,s,:]) for s in axes(θsMs, 1)] -ysd = [std(y[i_obs,s,:]) for s in axes(θsMs, 1)] +ymean = [mean(y[i_obs,s,:]) for s in axes(θsMs_tr, 1)] +ysd = [std(y[i_obs,s,:]) for s in axes(θsMs_tr, 1)] fig = Figure(); ax = Axis(fig[1,1], xlabel="mean(y$i_obs)",ylabel="sd(y$i_obs)") scatter!(ax, ymean, ysd) fig @@ -168,6 +188,9 @@ We see that observed values for associated substrate concentrations range about with the observed value. +If only a point prediction is required, function [`predict_point_hvi`](@ref) +can be used, that returns +a single set of expected parameters and corresponding predictions. diff --git a/docs/src/tutorials/inspect_results_files/figure-commonmark/cell-10-output-1.png b/docs/src/tutorials/inspect_results_files/figure-commonmark/cell-10-output-1.png index acc1d00..781c794 100644 Binary files a/docs/src/tutorials/inspect_results_files/figure-commonmark/cell-10-output-1.png and b/docs/src/tutorials/inspect_results_files/figure-commonmark/cell-10-output-1.png differ diff --git a/docs/src/tutorials/inspect_results_files/figure-commonmark/cell-13-output-1.png b/docs/src/tutorials/inspect_results_files/figure-commonmark/cell-13-output-1.png index 28857b2..0177497 100644 Binary files a/docs/src/tutorials/inspect_results_files/figure-commonmark/cell-13-output-1.png and b/docs/src/tutorials/inspect_results_files/figure-commonmark/cell-13-output-1.png differ diff --git a/docs/src/tutorials/inspect_results_files/figure-commonmark/cell-8-output-1.png b/docs/src/tutorials/inspect_results_files/figure-commonmark/cell-8-output-1.png index dfb5314..58f5511 100644 Binary files a/docs/src/tutorials/inspect_results_files/figure-commonmark/cell-8-output-1.png and b/docs/src/tutorials/inspect_results_files/figure-commonmark/cell-8-output-1.png differ diff --git a/docs/src/tutorials/intermediate/basic_cpu_results.jld2 b/docs/src/tutorials/intermediate/basic_cpu_results.jld2 index 17f8cc2..3a83818 100644 Binary files a/docs/src/tutorials/intermediate/basic_cpu_results.jld2 and b/docs/src/tutorials/intermediate/basic_cpu_results.jld2 differ diff --git a/docs/src/tutorials/logden_user.md b/docs/src/tutorials/logden_user.md index e98eaf8..786d34c 100644 --- a/docs/src/tutorials/logden_user.md +++ b/docs/src/tutorials/logden_user.md @@ -116,9 +116,9 @@ the inversion assuming loglornally distributed observation errors. ``` julia n_sample_pred = 400 -(y_normal, θsP_normal, θsMs_normal) = (; y, θsP, θsMs) = predict_hvi( +(y_normal, θsP_normal, θsMs_normal) = (; y, θsP, θsMs_tr) = predict_hvi( Random.default_rng(), probo_normal; n_sample_pred) -(y_lognormal, θsP_lognormal, θsMs_lognormal) = (; y, θsP, θsMs) = predict_hvi( +(y_lognormal, θsP_lognormal, θsMs_lognormal) = (; y, θsP, θsMs_tr) = predict_hvi( Random.default_rng(), probo_lognormal; n_sample_pred) ``` diff --git a/docs/src/tutorials/logden_user.qmd b/docs/src/tutorials/logden_user.qmd index 4a57b06..b0762ba 100644 --- a/docs/src/tutorials/logden_user.qmd +++ b/docs/src/tutorials/logden_user.qmd @@ -125,9 +125,9 @@ the inversion assuming loglornally distributed observation errors. ```{julia} n_sample_pred = 400 -(y_normal, θsP_normal, θsMs_normal) = (; y, θsP, θsMs) = predict_hvi( +(y_normal, θsP_normal, θsMs_normal) = (; y, θsP, θsMs_tr) = predict_hvi( Random.default_rng(), probo_normal; n_sample_pred) -(y_lognormal, θsP_lognormal, θsMs_lognormal) = (; y, θsP, θsMs) = predict_hvi( +(y_lognormal, θsP_lognormal, θsMs_lognormal) = (; y, θsP, θsMs_tr) = predict_hvi( Random.default_rng(), probo_lognormal; n_sample_pred) ``` diff --git a/docs/src/tutorials/logden_user_files/figure-commonmark/cell-10-output-1.png b/docs/src/tutorials/logden_user_files/figure-commonmark/cell-10-output-1.png index 42f0133..a2dca56 100644 Binary files a/docs/src/tutorials/logden_user_files/figure-commonmark/cell-10-output-1.png and b/docs/src/tutorials/logden_user_files/figure-commonmark/cell-10-output-1.png differ diff --git a/docs/src/tutorials/logden_user_files/figure-commonmark/cell-11-output-1.png b/docs/src/tutorials/logden_user_files/figure-commonmark/cell-11-output-1.png index 90d8cb3..a8260f2 100644 Binary files a/docs/src/tutorials/logden_user_files/figure-commonmark/cell-11-output-1.png and b/docs/src/tutorials/logden_user_files/figure-commonmark/cell-11-output-1.png differ diff --git a/docs/src/tutorials/logden_user_files/figure-commonmark/cell-12-output-1.png b/docs/src/tutorials/logden_user_files/figure-commonmark/cell-12-output-1.png index ca1d37b..98ad217 100644 Binary files a/docs/src/tutorials/logden_user_files/figure-commonmark/cell-12-output-1.png and b/docs/src/tutorials/logden_user_files/figure-commonmark/cell-12-output-1.png differ diff --git a/docs/src/tutorials/logden_user_files/figure-commonmark/cell-8-output-1.png b/docs/src/tutorials/logden_user_files/figure-commonmark/cell-8-output-1.png index 7d1d356..1254ae0 100644 Binary files a/docs/src/tutorials/logden_user_files/figure-commonmark/cell-8-output-1.png and b/docs/src/tutorials/logden_user_files/figure-commonmark/cell-8-output-1.png differ diff --git a/docs/src/tutorials/logden_user_files/figure-commonmark/cell-9-output-1.png b/docs/src/tutorials/logden_user_files/figure-commonmark/cell-9-output-1.png index 12165e4..b996186 100644 Binary files a/docs/src/tutorials/logden_user_files/figure-commonmark/cell-9-output-1.png and b/docs/src/tutorials/logden_user_files/figure-commonmark/cell-9-output-1.png differ diff --git a/docs/src/tutorials/lux_gpu.md b/docs/src/tutorials/lux_gpu.md index 1f0887c..b48433f 100644 --- a/docs/src/tutorials/lux_gpu.md +++ b/docs/src/tutorials/lux_gpu.md @@ -117,7 +117,7 @@ The sampling and prediction methods, also take this `gdevs` keyword argument. ``` julia n_sample_pred = 400 -(y_dev, θsP_dev, θsMs_dev) = (; y, θsP, θsMs) = predict_hvi( +(y_dev, θsP_dev, θsMs_dev) = (; y, θsP, θsMs_tr) = predict_hvi( rng, probo_lux; n_sample_pred, gdevs = (; gdev_M=gpu_device(), gdev_P=gpu_device())); ``` @@ -130,7 +130,7 @@ and need to be transferred to CPU. typeof(θsMs_dev) ``` - ComponentArrays.ComponentArray{Float32, 3, CUDA.CuArray{Float32, 3, CUDA.DeviceMemory}, Tuple{ComponentArrays.Shaped1DAxis{(800,)}, ComponentArrays.Axis{(r1 = 1, K1 = 2)}, ComponentArrays.Shaped1DAxis{(400,)}}} + ComponentArrays.ComponentArray{Float32, 3, Array{Float32, 3}, Tuple{ComponentArrays.Shaped1DAxis{(800,)}, ComponentArrays.Axis{(r1 = 1, K1 = 2)}, ComponentArrays.Shaped1DAxis{(400,)}}} Handling of a `ComponentArrays` backed by GPUArrays can result in errors of scalar indexing. Therefore, use a semicolon @@ -142,5 +142,5 @@ Also for moving the `ComponentArrays` to CPU, use function cdev = cpu_device() y = cdev(y_dev) θsP = apply_preserve_axes(cdev, θsP_dev) -θsMs = apply_preserve_axes(cdev, θsMs_dev) +θsMs_tr = apply_preserve_axes(cdev, θsMs_dev) ``` diff --git a/docs/src/tutorials/lux_gpu.qmd b/docs/src/tutorials/lux_gpu.qmd index 196b63a..4ad3545 100644 --- a/docs/src/tutorials/lux_gpu.qmd +++ b/docs/src/tutorials/lux_gpu.qmd @@ -135,7 +135,7 @@ The sampling and prediction methods, also take this `gdevs` keyword argument. ```{julia} n_sample_pred = 400 -(y_dev, θsP_dev, θsMs_dev) = (; y, θsP, θsMs) = predict_hvi( +(y_dev, θsP_dev, θsMs_dev) = (; y, θsP, θsMs_tr) = predict_hvi( rng, probo_lux; n_sample_pred, gdevs = (; gdev_M=gpu_device(), gdev_P=gpu_device())); ``` @@ -159,6 +159,6 @@ Also for moving the `ComponentArrays` to CPU, use function cdev = cpu_device() y = cdev(y_dev) θsP = apply_preserve_axes(cdev, θsP_dev) -θsMs = apply_preserve_axes(cdev, θsMs_dev) +θsMs_tr = apply_preserve_axes(cdev, θsMs_dev) ``` diff --git a/projects/doubleMM.jl b/projects/doubleMM.jl index 2c7c094..9faa1c6 100644 --- a/projects/doubleMM.jl +++ b/projects/doubleMM.jl @@ -59,12 +59,12 @@ n_epoch = 80 maxiters = n_batches_in_epoch * n_epoch); # update the problem with optimized parameters prob0o = prob1o =probo; - y_pred, θMs = gf(prob0o; scenario, is_inferred=Val(true)); + y_pred, θMs_tr = gf(prob0o; scenario, is_inferred=Val(true)); # @descend_code_warntype gf(prob0o; scenario) #@usingany UnicodePlots -plt = scatterplot(θMs_true'[:, 1], θMs[:, 1]); +plt = scatterplot(θMs_true'[:, 1], θMs_tr[:, 1]); lineplot!(plt, 0, 1) -scatterplot(θMs_true'[:,2], θMs[:,2]) +scatterplot(θMs_true'[:,2], θMs_tr[:,2]) prob0o.θP #scatterplot(vec(y_true), vec(y_o)) #scatterplot(vec(y_true), vec(y_pred)) @@ -77,13 +77,13 @@ histogram(vec(y_pred) - vec(y_true)) # predictions centered around y_o (or y_tru (; ϕ, resopt) = solve(prob0o, solver1; scenario, rng, callback = callback_loss(20), maxiters = 400) prob1o = HybridProblem(prob0o; ϕg = cpu_ca(ϕ).ϕg, θP = cpu_ca(ϕ).θP) - y_pred, θMs = gf(prob1o, xM, xP; scenario) - scatterplot(θMs_true[1, :], θMs[1, :]) - scatterplot(θMs_true[2, :], θMs[2, :]) + y_pred, θMs_tr = gf(prob1o, xM, xP; scenario) + scatterplot(θMs_true[1, :], θMs_tr[1, :]) + scatterplot(θMs_true[2, :], θMs_tr[2, :]) prob1o.θP scatterplot(vec(y_true), vec(y_pred)) - # still overestimating θMs and θP + # still overestimating θMs_tr and θP end () -> begin # with more iterations? @@ -91,11 +91,11 @@ end (; ϕ, resopt) = solve(prob2, solver1; scenario, rng, callback = callback_loss(20), maxiters = 600) prob2o = HybridProblem(prob2; ϕg = collect(ϕ.ϕg), θP = ϕ.θP) - y_pred, θMs = gf(prob2o, xM, xP) + y_pred, θMs_tr = gf(prob2o, xM, xP) prob2o.θP end -() -> begin #----------- fit g to true θMs +() -> begin #----------- fit g to true θMs_tr # and fit gf starting from true parameters prob = prob0 g, ϕg0_cpu = get_hybridproblem_MLapplicator(prob; scenario) @@ -105,9 +105,9 @@ end function loss_g(ϕg, x, g, transM; gpu_handler = HVI.default_GPU_DataHandler) ζMs = g(x, ϕg) # predict the log of the parameters ζMs_cpu = gpu_handler(ζMs) - θMs = reduce(hcat, map(transM, eachcol(ζMs_cpu))) # transform each column - loss = sum(abs2, θMs .- θMs_true) - return loss, θMs + θMs_tr = reduce(hcat, map(transM, eachcol(ζMs_cpu))) # transform each column + loss = sum(abs2, θMs_tr .- θMs_true) + return loss, θMs_tr end loss_g(ϕg0, xM, g, transM) @@ -118,17 +118,17 @@ end optprob, Adam(0.015), callback = callback_loss(100), maxiters = 2000) ϕg_opt1 = res.u - l1, θMs = loss_g(ϕg_opt1, xM, g, transM) - #scatterplot(θMs_true[1,:], θMs[1,:]) - scatterplot(θMs_true[2, :], θMs[2, :]) # able to fit θMs[2,:] + l1, θMs_tr = loss_g(ϕg_opt1, xM, g, transM) + #scatterplot(θMs_true[1,:], θMs_tr[1,:]) + scatterplot(θMs_true[2, :], θMs_tr[2, :]) # able to fit θMs_tr[2,:] prob3 = HybridProblem(prob0, ϕg = Array(ϕg_opt1), θP = θP_true) solver1 = HybridPointSolver(; alg = Adam(0.01), n_batch = n_site) (; ϕ, resopt) = solve(prob3, solver1; scenario, rng, callback = callback_loss(50), maxiters = 600) prob3o = HybridProblem(prob3; ϕg = cpu_ca(ϕ).ϕg, θP = cpu_ca(ϕ).θP) - y_pred, θMs = gf(prob3o, xM, xP; scenario) - scatterplot(θMs_true[2, :], θMs[2, :]) + y_pred, θMs_tr = gf(prob3o, xM, xP; scenario) + scatterplot(θMs_true[2, :], θMs_tr[2, :]) prob3o.θP scatterplot(vec(y_true), vec(y_pred)) scatterplot(vec(y_true), vec(y_o)) @@ -169,13 +169,13 @@ solver_post = HybridPosteriorSolver(; alg = OptimizationOptimisers.Adam(0.01), n prob1o = probo; n_sample_pred = 400 #(; θ, y) = predict_hvi(rng, prob1o, xM, xP; scenario, n_sample_pred); - (; y, θsP, θsMs) = predict_hvi(rng, prob1o; scenario, n_sample_pred, is_inferred=Val(true)); - (y1, θsP1, θsMs1) = (y, θsP, θsMs); + (; y, θsP, θsMs_tr) = predict_hvi(rng, prob1o; scenario, n_sample_pred, is_inferred=Val(true)); + (y1, θsP1, θsMs1_tr) = (y, θsP, θsMs_tr); () -> begin # prediction with fitted parameters (should be smaller than mean) - y_pred2, θMs = gf(prob1o, xM, xP; scenario) - scatterplot(θMs_true[1, :], θMs[1, :]) - scatterplot(θMs_true[2, :], θMs[2, :]) + y_pred2, θMs_tr = gf(prob1o, xM, xP; scenario) + scatterplot(θMs_true[1, :], θMs_tr[1, :]) + scatterplot(θMs_true[2, :], θMs_tr[2, :]) hcat(θP_true, θP) # all parameters overestimated histogram(vec(y_pred2) - vec(y_true)) # predicts an unsymmytric distribution end @@ -222,9 +222,9 @@ end prob2o_indep = tmp["prob2o"] # test predicting correct obs-uncertainty of predictive posterior n_sample_pred = 400 - (; y, θsP, θsMs) = predict_hvi(rng, prob2o_indep; scenario = scenario_indep, n_sample_pred); - (y2_indep, θsP2_indep, θsMs2_indep) = (y, θsP, θsMs); - #θsMs2_indep .- θsMs2 + (; y, θsP, θsMs_tr) = predict_hvi(rng, prob2o_indep; scenario = scenario_indep, n_sample_pred); + (y2_indep, θsP2_indep, θsMs2_tr_indep) = (y, θsP, θsMs_tr); + #θsMs2_tr_indep .- θsMs2_tr #(θ2_indep, y2_indep) = (θ2, y2) # workaround to use covarK2 when loading failed # scenario_neglect_cor = Val((HVI._val_value(scenario)..., :neglect_cor)) @@ -234,8 +234,8 @@ end prob2o_neglect_cor = tmp["prob2o"] # test predicting correct obs-uncertainty of predictive posterior n_sample_pred = 400 - (; y, θsP, θsMs) = predict_hvi(rng, prob2o_neglect_cor; scenario = scenario_neglect_cor, n_sample_pred); - (y2_neglect_cor, θsP2_neglect_cor, θsMs2_neglect_cor) = (y, θsP, θsMs); + (; y, θsP, θsMs_tr) = predict_hvi(rng, prob2o_neglect_cor; scenario = scenario_neglect_cor, n_sample_pred); + (y2_neglect_cor, θsP2_neglect_cor, θsMs2_tr_neglect_cor) = (y, θsP, θsMs_tr); # scenario_K1global = Val((HVI._val_value(scenario)..., :K1global)) fname_probos_K1global = "intermediate/probos800_$(last(HVI._val_value(scenario_K1global))).jld2" @@ -244,8 +244,8 @@ end prob2o_K1global = tmp["prob2o"] # test predicting correct obs-uncertainty of predictive posterior n_sample_pred = 400 - (; y, θsP, θsMs) = predict_hvi(rng, prob2o_K1global; scenario = scenario_K1global, n_sample_pred); - (y2_K1global, θsP2_K1global, θsMs2_K1global) = (y, θsP, θsMs); + (; y, θsP, θsMs_tr) = predict_hvi(rng, prob2o_K1global; scenario = scenario_K1global, n_sample_pred); + (y2_K1global, θsP2_K1global, θsMs2_tr_K1global) = (y, θsP, θsMs_tr); end () -> begin # optimize using LUX @@ -279,11 +279,11 @@ exp.(ϕunc_VI.coef_logσ2_ζMs[1, :]) # test predicting correct obs-uncertainty of predictive posterior n_sample_pred = 400 -(; y, θsP, θsMs) = predict_hvi(rng, prob2o; scenario, n_sample_pred); -(y2, θsP2, θsMs2) = (y, θsP, θsMs); +(; y, θsP, θsMs_tr) = predict_hvi(rng, prob2o; scenario, n_sample_pred); +(y2, θsP2, θsMs2_tr) = (y, θsP, θsMs_tr); size(y) # n_obs x n_site, n_sample_pred -size(θsMs) # n_site x n_θM x n_sample +size(θsMs_tr) # n_site x n_θM x n_sample σ_o_post = dropdims(std(y; dims = 3), dims = 3); σ_o = exp.(y_unc[:, 1] / 2) @@ -298,7 +298,7 @@ plt = scatterplot(vec(y_true), vec(mean_y_pred)); lineplot!(plt, 0, 2) mean(mean_y_pred - y_true) # still ok -mean_θMs = CA.ComponentArray(mean(θsMs; dims = 3)[:,:,1], CA.getaxes(θMs_true')) +mean_θMs = CA.ComponentArray(mean(θsMs_tr; dims = 3)[:,:,1], CA.getaxes(θMs_true')) plt = scatterplot(θMs_true'[:,1], mean_θMs[:,1]); lineplot!(plt, 0, 1) plt = scatterplot(θMs_true'[:,2], mean_θMs[:,2]) @@ -355,9 +355,9 @@ end () -> begin # look at distribution of parameters, predictions, and likelihood and elob at one site # compare prob1o (with constraining theta to be near original mean) to unconstrained HVI function predict_site(probo, i_site) - (; y, θsP, θsMs, entropy_ζ) = predict_hvi(rng, probo; scenario, n_sample_pred) + (; y, θsP, θsMs_tr, entropy_ζ) = predict_hvi(rng, probo; scenario, n_sample_pred) y_site = y[:, i_site, :] - θMs_i = CA.ComponentArray(θsMs[i_site,:,:], (CA.getaxes(θMs_true)[1], CA.FlatAxis())) + θMs_i = CA.ComponentArray(θsMs_tr[i_site,:,:], (CA.getaxes(θMs_true)[1], CA.FlatAxis())) r1s = θMs_i[:r1,:] # K1s = map(x -> x[2], θMs_i) # invt = map(Bijectors.inverse, get_hybridproblem_transforms(probo; scenario)) @@ -472,11 +472,11 @@ f = get_hybridproblem_PBmodel(prob; scenario) # need to construct different MvNormal prior if std differs by variable # or need to take care when extracting samples and when constructing chains ζMs = Matrix{T}(undef, n_θM, n_site) - # the first loop vectorizes θMs by columns but is much slower + # the first loop vectorizes θMs_tr by columns but is much slower # for i_site in 1:n_site # ζMs[:, i_site] ~ prior_ζn(n_θM) #MvNormal(n_site, 10.0) # end - # this loop is faster, but vectorizes θMs by rows in parameter vector + # this loop is faster, but vectorizes θMs_tr by rows in parameter vector for i_par in 1:n_θM ζMs[i_par, :] ~ prior_ζM_sites[i_par] end @@ -490,7 +490,7 @@ f = get_hybridproblem_PBmodel(prob; scenario) y[i_obs, :] ~ MvNormal(y_pred[i_obs, :], σ_o[i_obs]) # single value σ instead of variance end #Main.@infiltrate_main # step to second time - # θMs_MCc[:,:,1] # checking row- or column-order of θMs + # θMs_MCc[:,:,1] # checking row- or column-order of θMs_tr # exp.(ζMs) y_pred end @@ -564,18 +564,18 @@ f = get_hybridproblem_PBmodel(probc; scenario) f_allsites = create_nsite_applicator(f, n_site) #ζs = mapreduce(ζi -> transposeMs(ζi, intm_PMs_gen, true), hcat, eachrow(Array(chain))); ζsP = Array(chain)[:,1:n_θP]' -ζsMst = reshape(Array(chain)[:,(n_θP+1) : end], n_sample_NUTS, n_site, n_θM) -ζsMs = permutedims(ζsMst, (2,3,1)) -# need to reshape according to generate_ζ -ζsMs[:,:,1] # first sample: n_site x n_par -ζsMs[:,1,:] # first parameter n_site x n_sample +ζsMs = reshape(Array(chain)[:,(n_θP+1) : end], n_sample_NUTS, n_site, n_θM) +# need to reshape according to generate_ζ, with columns of parameters +ζsMs_tr = permutedims(ζsMs, (2,3,1)) +ζsMs_tr[:,:,1] # first sample: n_site x n_par +ζsMs_tr[:,1,:] # first parameter n_site x n_sample trans_mP=StackedArray(transP, size(ζsP, 2)) -trans_mMs=StackedArray(transM, size(ζsMs, 1) * size(ζsMs, 3)) -θsP, θsMs = transform_ζs(ζsP, ζsMs; trans_mP, trans_mMs) -y = f(θsP, θsMs, f, xP) -#(; y, θsP, θsMs) = HVI.apply_f_trans(ζsP, ζsMs, f_allsites, xP; transP, transM); -(y_hmc, θsP_hmc, θsMs_hmc) = (; y, θsP, θsMs); +trans_mMs=StackedArray(transM, size(ζsMs_tr, 1) * size(ζsMs_tr, 3)) +θsP, θsMs_tr = transform_ζs(ζsP, ζsMs_tr; trans_mP, trans_mMs) +y = f(θsP, θsMs_tr, f, xP) +#(; y, θsP, θsMs_tr) = HVI.apply_f_trans(ζsP, ζsMs, f_allsites, xP; transP, transM); +(y_hmc, θsP_hmc, θsMs_hmc) = (; y, θsP, θsMs_tr); () -> begin # check that the model predicts the same as HVI-code @@ -591,7 +591,7 @@ end () -> begin # plot chain #@usingany FigureHelpers, CairoMakie - # θP and first θMs + # θP and first θMs_tr ch = chain[:,vcat(1:n_θP, n_θP+1, n_θP+n_site+1),:]; fig = plot_chn(ch) save("tmp.svg", fig) @@ -614,7 +614,7 @@ describe(pdf.(Ref(prior_ζ), ζsP[1, :])) # only small differences pdf(prior_ζ, log(θP_true[1])) mean_θP = CA.ComponentArray(mean(θsP; dims = 2)[:, 1], CA.getaxes(θP_true)) -mean_θMs = CA.ComponentArray(mean(θsMs; dims = 3)[:,:, 1], CA.getaxes(θMs_true')) +mean_θMs = CA.ComponentArray(mean(θsMs_tr; dims = 3)[:,:, 1], CA.getaxes(θMs_true')) histogram(θsP .- θP_true) # all overestimated ? plt = scatterplot(θMs_true'[:,1], mean_θMs[:,1]); lineplot!(plt, 0, 1) @@ -655,10 +655,10 @@ lineplot!(plt, 0, 1) ζsP_hvi_neglect_cor = log.(θsP2_neglect_cor) ζsP_hvi_K1global = log.(θsP2_K1global) ζsP_hmc = log.(θsP_hmc) - ζsMs_hvi = log.(θsMs2) - ζsMs_hvi_indep = log.(θsMs2_indep) - ζsMs_hvi_neglect_cor = log.(θsMs2_neglect_cor) - ζsMs_hvi_K1global = log.(θsMs2_K1global) + ζsMs_hvi = log.(θsMs2_tr) + ζsMs_hvi_indep = log.(θsMs2_tr_indep) + ζsMs_hvi_neglect_cor = log.(θsMs2_tr_neglect_cor) + ζsMs_hvi_K1global = log.(θsMs2_tr_K1global) ζsMs_hmc = log.(θsMs_hmc) # int_pms = interpreters.PMs # par_pos = int_pms(1:length(int_pms)) @@ -976,7 +976,7 @@ end #ζMs[:] ~ prior_ζn(n_θM * n_site) # assume σ_o known, see f_MM #σ_o ~ truncated(Normal(0, 1); lower=0) - y_pred = f(θP, θMs, xP)[2] # first is global return + y_pred = f(θP, θMs', xP)[2] # first is global return #i_obs = 1 for i_obs in 1:n_obs #pdf(MvNormal(y_pred[i_obs,:], σ_o[i_obs]),y[i_obs,:]) diff --git a/src/AbstractHybridProblem.jl b/src/AbstractHybridProblem.jl index f7cc0d1..d7835a6 100644 --- a/src/AbstractHybridProblem.jl +++ b/src/AbstractHybridProblem.jl @@ -10,6 +10,7 @@ For a specific prob, provide functions that specify details - `get_hybridproblem_par_templates` - `get_hybridproblem_ϕq` - `get_hybridproblem_train_dataloader` (may use `construct_dataloader_from_synthetic`) +- `get_hybridproblem_test_data` - `get_hybridproblem_priors` - `get_hybridproblem_n_covar` - `get_hybridproblem_n_site_and_batch` @@ -72,7 +73,8 @@ function get_hybridproblem_neg_logden_obs end """ get_hybridproblem_par_templates(::AbstractHybridProblem; scenario) -Provide tuple of templates of ComponentVectors `θP` and `θM`. +Provide a template tuple of ComponentVectors `θP` and `θM` +at unconstrained (original) scale. """ function get_hybridproblem_par_templates end @@ -149,7 +151,7 @@ function get_hybridproblem_n_site_and_batch end """ - gen_hybridproblem_synthetic([rng,] ::AbstractHybridProblem; scenario) + gen_hybridproblem_synthetic([rng,] ::AbstractHybridProblem; n_site_test = 0, scenario) Setup synthetic data, a NamedTuple of - xM: matrix of covariates, with one column per site @@ -172,6 +174,7 @@ end """ get_hybridproblem_train_dataloader(::AbstractHybridProblem; scenario, n_batch) + get_hybridproblem_test_data end::AbstractHybridProblem; scenario) Return a DataLoader that provides a tuple of - `xM`: matrix of covariates, with one column per site @@ -181,6 +184,8 @@ Return a DataLoader that provides a tuple of - `i_sites`: Vector of indices of sites in the minibatch """ function get_hybridproblem_train_dataloader end +function get_hybridproblem_test_data end + """ construct_dataloader_from_synthetic(rng::AbstractRNG, prob::AbstractHybridProblem; @@ -189,11 +194,11 @@ function get_hybridproblem_train_dataloader end Construct a dataloader based on `gen_hybridproblem_synthetic`. """ function construct_dataloader_from_synthetic(rng::AbstractRNG, prob::AbstractHybridProblem; - scenario = (), n_batch, + scenario = (), n_batch, n_site_test = 0, #gdev = :use_gpu ∈ scenario ? gpu_device() : identity, ) - (; xM, xP, y_o, y_unc) = gen_hybridproblem_synthetic(rng, prob; scenario) - n_site = size(xM,2) + (; xM, xP, y_o, y_unc) = gen_hybridproblem_synthetic(rng, prob; n_site_test, scenario) + n_site = size(xM,2) - n_site_test @assert size(xP,2) == n_site @assert size(y_o,2) == n_site @assert size(y_unc,2) == n_site diff --git a/src/DoubleMM/f_doubleMM.jl b/src/DoubleMM/f_doubleMM.jl index f950ebb..7e78387 100644 --- a/src/DoubleMM/f_doubleMM.jl +++ b/src/DoubleMM/f_doubleMM.jl @@ -22,22 +22,22 @@ int_xP1 = ComponentArrayInterpreter(CA.ComponentVector(S1 = xP_S1, S2 = xP_S2)) const int_θdoubleMM = ComponentArrayInterpreter(flatten1(CA.ComponentVector(; θP, θM))) """ - f_doubleMM(θc::CA.ComponentVector{ET}, x) where ET + f_doubleMM(θc_tr::CA.ComponentVector{ET}, x) where ET Example process based model (PBM) predicts a double-monod constrained rate for different substrate concentration vectors, `x.S1`, and `x.S2` for a single site. -θc is a ComponentVector with scalar parameters as components: `r0`, `r1`, `K1`, and `K2` +θc_tr is a ComponentVector with scalar parameters as components: `r0`, `r1`, `K1`, and `K2` It predicts a rate for each entry in concentrations: `y = r0 .+ r1 .* x.S1 ./ (K1 .+ x.S1) .* x.S2 ./ (K2 .+ x.S2)`. It is defined as ```julia -function f_doubleMM(θc::ComponentVector{ET}, x) where ET +function f_doubleMM(θc_tr::ComponentVector{ET}, x) where ET # extract parameters not depending on order, i.e whether they are in θP or θM - # r0 = θc[:r0] + # r0 = θc_tr[:r0] (r0, r1, K1, K2) = map((:r0, :r1, :K1, :K2)) do par - getdata(θc[par])::ET + getdata(θc_tr[par])::ET end y = r0 .+ r1 .* x.S1 ./ (K1 .+ x.S1) .* x.S2 ./ (K2 .+ x.S2) return (y) @@ -65,29 +65,29 @@ function f_doubleMM(θc::CA.ComponentVector{ET}, x) where ET end """ - f_doubleMM_sites(θc::CA.ComponentMatrix, xPc::CA.ComponentMatrix) + f_doubleMM_sites(θc_tr::CA.ComponentMatrix, xPc::CA.ComponentMatrix) Example process based model (PBM) that predicts for a batch of sites. Arguments -- `θc`: parameters with one row per site and symbolic column index +- `θc_tr`: parameters with one row per site and symbolic column index - `xPc`: model drivers with one column per site, and symbolic row index Returns a matrix `(n_obs x n_site)` of predictions. ```julia -function f_doubleMM_sites(θc::ComponentMatrix, xPc::ComponentMatrix) +function f_doubleMM_sites(θc_tr::ComponentMatrix, xPc::ComponentMatrix) # extract several covariates from xP ST = typeof(CA.getdata(xPc)[1:1,:]) # workaround for non-type-stable Symbol-indexing S1 = (CA.getdata(xPc[:S1,:])::ST) S2 = (CA.getdata(xPc[:S2,:])::ST) # # extract the parameters as vectors that are row-repeated into a matrix - VT = typeof(CA.getdata(θc)[:,1]) # workaround for non-type-stable Symbol-indexing + VT = typeof(CA.getdata(θc_tr)[:,1]) # workaround for non-type-stable Symbol-indexing n_obs = size(S1, 1) rep_fac = ones_similar_x(xPc, n_obs) # to reshape into matrix, avoiding repeat (r0, r1, K1, K2) = map((:r0, :r1, :K1, :K2)) do par - p1 = CA.getdata(θc[:, par]) ::VT + p1 = CA.getdata(θc_tr[:, par]) ::VT #(r0 .* rep_fac)' # move to computation below to save allocation #repeat(p1', n_obs) # matrix: same for each concentration row in S1 end @@ -98,7 +98,7 @@ function f_doubleMM_sites(θc::ComponentMatrix, xPc::ComponentMatrix) end ``` """ -function f_doubleMM_sites(θc::CA.ComponentMatrix, xPc::CA.ComponentMatrix) +function f_doubleMM_sites(θc_tr::CA.ComponentMatrix, xPc::CA.ComponentMatrix) # extract several covariates from xP # ST = typeof(CA.getdata(xPc)[1:1,:]) # workaround for non-type-stable Symbol-indexing # S1 = (CA.getdata(xPc[:S1,:])::ST) @@ -111,13 +111,13 @@ function f_doubleMM_sites(θc::CA.ComponentMatrix, xPc::CA.ComponentMatrix) is_valid = isfinite.(S1) .&& isfinite.(S2) # # extract the parameters as vectors that are row-repeated into a matrix - # VT = typeof(CA.getdata(θc)[:,1]) # workaround for non-type-stable Symbol-indexing + # VT = typeof(CA.getdata(θc_tr)[:,1]) # workaround for non-type-stable Symbol-indexing # #n_obs = size(S1, 1) # #rep_fac = HVI.ones_similar_x(xPc, n_obs) # to reshape into matrix, avoiding repeat # #is_dummy = isnan.(S1) .|| isnan.(S2) # (r0, r1, K1, K2) = map((:r0, :r1, :K1, :K2)) do par - # p1 = CA.getdata(θc[:, par]) ::VT + # p1 = CA.getdata(θc_tr[:, par]) ::VT # #Main.@infiltrate_main # # tmp = Zygote.gradient(p1 -> sum(repeat_rowvector_dummy(p1', is_dummy)), p1)[1] # #p1_mat = repeat_rowvector_dummy(p1', is_dummy) @@ -126,10 +126,10 @@ function f_doubleMM_sites(θc::CA.ComponentMatrix, xPc::CA.ComponentMatrix) # #(rep_fac .* p1') # move to computation below to save allocation # end # - r0 = is_valid .* CA.getdata(θc[:, Val(:r0)])' - r1 = is_valid .* CA.getdata(θc[:, Val(:r1)])' - K1 = is_valid .* CA.getdata(θc[:, Val(:K1)])' - K2 = is_valid .* CA.getdata(θc[:, Val(:K2)])' + r0 = is_valid .* CA.getdata(θc_tr[:, Val(:r0)])' + r1 = is_valid .* CA.getdata(θc_tr[:, Val(:r1)])' + K1 = is_valid .* CA.getdata(θc_tr[:, Val(:K1)])' + K2 = is_valid .* CA.getdata(θc_tr[:, Val(:K2)])' # #, r1, K1, K2) = map((:r0, :r1, :K1, :K2)) do par @@ -138,11 +138,11 @@ function f_doubleMM_sites(θc::CA.ComponentMatrix, xPc::CA.ComponentMatrix) #(rep_fac .* r0') .+ (rep_fac .* r1') .* S1 ./ ((rep_fac .* K1') .+ S1) .* S2 ./ ((rep_fac .* K2') .+ S2) end -# function f_doubleMM_sites(θc::CA.ComponentMatrix, xPc::CA.ComponentMatrix) +# function f_doubleMM_sites(θc_tr::CA.ComponentMatrix, xPc::CA.ComponentMatrix) # # extract the parameters as vectors -# VT = typeof(CA.getdata(θc)[:,1]) # workaround for non-type-stable Symbol-indexing +# VT = typeof(CA.getdata(θc_tr)[:,1]) # workaround for non-type-stable Symbol-indexing # (r0, r1, K1, K2) = map((:r0, :r1, :K1, :K2)) do par -# CA.getdata(θc[:, par]) ::VT +# CA.getdata(θc_tr[:, par]) ::VT # end # # # # extract several covariates from xP @@ -158,54 +158,6 @@ end # return (CA.getdata(y)') # transform site-first -> site-last dimension # end - - -# function f_doubleMM( -# θ::AbstractMatrix{T}, x; intθ::HVI.AbstractComponentArrayInterpreter) where T -# # provide θ for n_row sites -# # provide x.S1 as Matrix n_site x n_obs -# # extract parameters not depending on order, i.e whether they are in θP or θM -# θc = intθ(θ) -# @assert size(x.S1, 1) == size(θ, 1) # same number of sites -# @assert size(x.S1) == size(x.S2) # same number of observations -# #@assert length(x.s2 == n_obs) -# # problems on AD on GPU with indexing CA may be related to printing result, use ";" -# VT = typeof(θ[:,1]) # workaround for non-stable Symbol-indexing CAMatrix -# #VT = first(Base.return_types(getindex, Tuple{typeof(θ),typeof(Colon()),typeof(1)})) -# (r0, r1, K1, K2) = map((:r0, :r1, :K1, :K2)) do par -# # vector will be repeated when broadcasted by a matrix -# CA.getdata(θc[:, par]) ::VT -# end -# # r0 = CA.getdata(θc[:,:r0]) # vector will be repeated when broadcasted by a matrix -# # r1 = CA.getdata(θc[:,:r1]) -# # K1 = CA.getdata(θc[:,:K1]) -# # K2 = CA.getdata(θc[:,:K2]) -# y = r0 .+ r1 .* x.S1 ./ (K1 .+ x.S1) .* x.S2 ./ (K2 .+ x.S2) -# return (y) -# end - -# function f_doubleMM(θ::AbstractMatrix, x::NamedTuple, θpos::NamedTuple) -# # provide θ for n_row sites -# # provide x.S1 as Matrix n_site x n_obs -# # extract parameters not depending on order, i.e whether they are in θP or θM -# @assert size(x.S1,1) == size(θ,1) # same number of sites -# @assert size(x.S1) == size(x.S2) # same number of observations -# (r0, r1, K1, K2) = map((:r0, :r1, :K1, :K2)) do par -# # vector will be repeated when broadcasted by a matrix -# CA.getdata(θ[:,θpos[par]]) -# end -# # r0 = CA.getdata(θ[:,θpos.r0]) # vector will be repeated when broadcasted by a matrix -# # r1 = CA.getdata(θ[:,θpos.r1]) -# # K1 = CA.getdata(θ[:,θpos.K1]) -# # K2 = CA.getdata(θ[:,θpos.K2]) -# #y = r0 .+ r1 -# #y = x.S1 + x.S2 -# #y = (K1 .+ x.S1) -# #y = r1 .* x.S1 ./ (K1 .+ x.S1) -# y = r0 .+ r1 .* x.S1 ./ (K1 .+ x.S1) .* x.S2 ./ (K2 .+ x.S2) -# return (y) -# end - function HVI.get_hybridproblem_par_templates( ::DoubleMMCase; scenario::Val{scen}) where {scen} if (:no_globals ∈ scen) @@ -376,37 +328,51 @@ function HVI.get_hybridproblem_train_dataloader(prob::DoubleMMCase; scenario::Va rng::AbstractRNG = StableRNG(111), kwargs... ) where {scen} n_site, n_batch = get_hybridproblem_n_site_and_batch(prob; scenario) + dl = construct_dataloader_from_synthetic(rng, prob; scenario, n_batch, kwargs...) if (:driverNAN ∈ scen) - (; xM, xP, y_o, y_unc) = gen_hybridproblem_synthetic(rng, prob; scenario) - n_site = size(xM,2) - i_sites = 1:n_site + (xM, xP, y_o, y_unc, i_sites) = dl.data # set the last two entries of the S1 drivers and observations of the second site NaN - view(@view(xP[:S1,2]), 7:8) .= NaN - y_o[7:8,2] .= NaN + is_obs = 7:8 + i_site = 2 + xP[is_obs,i_site] .= NaN + y_o[is_obs,i_site] .= NaN train_loader = MLUtils.DataLoader((CA.getdata(xM), CA.getdata(xP), y_o, y_unc, i_sites); batchsize = n_batch, partial = false) else - construct_dataloader_from_synthetic(rng, prob; scenario, n_batch, kwargs...) + dl end end +function HVI.get_hybridproblem_test_data(prob::DoubleMMCase; scenario::Val{scen}, + rng::AbstractRNG = StableRNG(211), kwargs... +) where {scen} + n_site_test = 60 + (; xM, xP, y_o, y_unc) = gen_hybridproblem_synthetic( + rng, prob; scenario, n_site_test) + n_site_all = size(xM,2) + i_test = (n_site_all - n_site_test + 1):n_site_all + (; xM = xM[:, i_test], xP = xP[:, i_test], y_o = y_o[:, i_test], + y_unc = y_unc[:, i_test], i_sites = i_test) +end + function HVI.gen_hybridproblem_synthetic(rng::AbstractRNG, prob::DoubleMMCase; - scenario::Val{scen}) where {scen} + scenario::Val{scen}, n_site_test = 0) where {scen} n_covar_pc = 2 n_site, n_batch = get_hybridproblem_n_site_and_batch(prob; scenario) + n_siteall = n_site + n_site_test n_covar = get_hybridproblem_n_covar(prob; scenario) n_θM = length(θM) FloatType = get_hybridproblem_float_type(prob; scenario) - xM, θMs_true0 = gen_cov_pred(rng, FloatType, n_covar_pc, n_covar, n_site, n_θM; + xM, θMs_true0 = gen_cov_pred(rng, FloatType, n_covar_pc, n_covar, n_siteall, n_θM; rhodec = 8, is_using_dropout = false) - int_θMs_sites = ComponentArrayInterpreter(θM, (n_site,)) + int_θMs_sites = ComponentArrayInterpreter(θM, (n_siteall,)) # normalize to be distributed around the prescribed true values θMs_true = int_θMs_sites(scale_centered_at(θMs_true0, θM, FloatType(0.1))) f_batch = get_hybridproblem_PBmodel(prob; scenario) - f = create_nsite_applicator(f_batch, n_site) - #xP = fill((; S1 = xP_S1, S2 = xP_S2), n_site) - int_xP_sites = ComponentArrayInterpreter(int_xP1, (n_site,)) - xP = int_xP_sites(vcat(repeat(xP_S1, 1, n_site), repeat(xP_S2, 1, n_site))) + f = create_nsite_applicator(f_batch, n_siteall) + #xP = fill((; S1 = xP_S1, S2 = xP_S2), n_siteall) + int_xP_sites = ComponentArrayInterpreter(int_xP1, (n_siteall,)) + xP = int_xP_sites(vcat(repeat(xP_S1, 1, n_siteall), repeat(xP_S2, 1, n_siteall))) #xP[:S1,:] #θP = get_θP(prob) # for DoubleMMCase par_templates gives correct θP θP = get_hybridproblem_θP(prob; scenario) @@ -438,13 +404,15 @@ function HVI.get_hybridproblem_cor_ends(prob::DoubleMMCase; scenario::Val{scen}) end end -function HVI.get_hybridproblem_ϕq(prob::DoubleMMCase; scenario) +function HVI.get_hybridproblem_ϕq(prob::DoubleMMCase; scenario::Val{scen}) where {scen} + approx = (:sepvar ∈ scen) ? MeanVarSepHVIApproximation() : MeanHVIApproximationMat() FT = get_hybridproblem_float_type(prob; scenario) cor_ends = get_hybridproblem_cor_ends(prob; scenario) - ϕunc = init_hybrid_ϕunc(MeanHVIApproximationMat(), cor_ends, zero(FT)) + (;θP, θM) = get_hybridproblem_par_templates(prob; scenario) + n_site, _ = get_hybridproblem_n_site_and_batch(prob; scenario) + (;transP, transM) = get_hybridproblem_transforms(prob; scenario) + ϕunc = init_hybrid_ϕunc(approx, cor_ends, zero(FT); θM, transM, n_site) # for DoubleMMCase templates gives the correct values - θP = get_hybridproblem_par_templates(prob; scenario).θP - transP = get_hybridproblem_transforms(prob; scenario).transP ϕq = HVI.update_μP_by_θP(ϕunc, θP, transP) end diff --git a/src/HVIApproximation.jl b/src/HVIApproximation.jl index 7a6e45a..ceb29b0 100644 --- a/src/HVIApproximation.jl +++ b/src/HVIApproximation.jl @@ -18,3 +18,7 @@ struct MeanHVIApproximation <: AbstractMeanHVIApproximation end struct MeanHVIApproximationDev <: AbstractMeanHVIApproximation end +abstract type AbstractMeanVarSepHVIApproximation <: AbstractHVIApproximation end + +struct MeanVarSepHVIApproximation <: AbstractMeanVarSepHVIApproximation end + diff --git a/src/HybridProblem.jl b/src/HybridProblem.jl index 91c0a19..c454c7a 100644 --- a/src/HybridProblem.jl +++ b/src/HybridProblem.jl @@ -11,16 +11,20 @@ Fields: - `py`: Likelihood function - `transM::Stacked`, `transP::Stacked`: bijectors transforming from unconstrained to constrained scale for site-specific and global parameters respectively. -- `train_dataloader::MLUtils.DataLoader`: providingn Tuple of matrices +- `train_dataloader::MLUtils.DataLoader`: providing Tuple of matrices `(xM, xP, y_o, y_unc, i_sites)`: covariates, model drivers, observations, observation uncertainties and index of provided sites. +- `test_data::Tuple of the same form as with `train_dataloader` for testset data. - `n_covar::Int`, `n_site::Int`, `n_batch::Int`: number covariates, number of sites, and number of sites within one batch - `cor_ends::NamedTuple`: block structure in correlations, defaults to `(P = [length(θP)], M = [length(θM)])` - `pbm_covars::NTuple{N,Symbol}`: names of global parameters used as covariates in the ML model, defaults to `()`, i.e. no covariates fed into the ML model - +- `approx::AbstractHVIApproximation`: the approximation to use for the variational + distribution, defaults to `MeanHVIApproximationMat()`, i.e. correlation matrix + shared across all sites and variance parameters a function of the predicted + parameters. """ struct HybridProblem <: AbstractHybridProblem #θP::CA.ComponentVector @@ -35,6 +39,7 @@ struct HybridProblem <: AbstractHybridProblem transP::Stacked cor_ends::@NamedTuple{P::Vector{Int}, M::Vector{Int}} # = (P=(1,),M=(1,)) train_dataloader::MLUtils.DataLoader + test_data::NamedTuple n_covar::Int n_site::Int n_batch::Int @@ -51,38 +56,43 @@ struct HybridProblem <: AbstractHybridProblem py, transM::Stacked, transP::Stacked, - # return a function that constructs the trainloader based on n_batch train_dataloader::MLUtils.DataLoader, + test_data::NamedTuple, n_covar::Int, n_site::Int, - n_batch::Int, + n_batch::Int; cor_ends::NamedTuple = (P = [length(ϕq[Val(:μP)])], M = [length(θM)]), pbm_covars::NTuple{N,Symbol} = (), approx::AbstractHVIApproximation = MeanHVIApproximationMat() ) where N new( θM, f_batch, g, ϕg, ϕq, priors, py, transM, transP, cor_ends, - train_dataloader, n_covar, n_site, n_batch, pbm_covars, approx) + train_dataloader, test_data, n_covar, n_site, n_batch, pbm_covars, approx) end end """ - init_hybrid_ϕq(θP, θM, transP; cor_ends) + init_hybrid_ϕq(θP, θM, transP; cor_ends, n_site) Initialize the non-ML parameter vector. """ function init_hybrid_ϕq( - approx::AbstractMeanHVIApproximation, + approx::Union{AbstractMeanHVIApproximation, AbstractMeanVarSepHVIApproximation}, θP::CA.ComponentVector, θM::CA.ComponentVector, transP::Stacked, - cor_ends::NamedTuple = (P = [length(θP)], M = [length(θM)]), + cor_ends::NamedTuple = (P = [length(θP)], M = [length(θM)]); + n_site::Integer, + kwargs..., ) FT = promote_type(eltype(θP), eltype(θM)) - ϕunc0 = init_hybrid_ϕunc(approx, cor_ends, zero(FT)) + ϕunc0 = init_hybrid_ϕunc(approx, cor_ends, zero(FT); θM, n_site, kwargs...) ϕq = update_μP_by_θP(ϕunc0, θP, transP) end + + + """ create_ϕq(θP, ϕunc, transP::Stacked) @@ -112,6 +122,7 @@ function update_hybridProblem(prob::AbstractHybridProblem; scenario, transP = get_hybridproblem_transforms(prob; scenario).transP, transM = get_hybridproblem_transforms(prob; scenario).transM, train_dataloader = get_hybridproblem_train_dataloader(prob; scenario), + test_data = get_hybridproblem_test_data(prob; scenario), n_covar = get_hybridproblem_n_covar(prob; scenario), n_site = get_hybridproblem_n_site_and_batch(prob; scenario)[1], n_batch = get_hybridproblem_n_site_and_batch(prob; scenario)[2], @@ -124,7 +135,7 @@ function update_hybridProblem(prob::AbstractHybridProblem; scenario, ) cor_ends_new = if !isnothing(cor_ends) # if new cor_ends was specified then re-initialize the ρsP and ρsM in ϕq - ϕunc0 = init_hybrid_ϕunc(approx, cor_ends, zero(eltype(ϕq))) + ϕunc0 = init_hybrid_ϕunc(approx, cor_ends, zero(eltype(ϕq)); θM, transM) ϕq = CA.ComponentVector(;ϕq..., ρsP = ϕunc0.ρsP, ρsM = ϕunc0.ρsM) cor_ends else @@ -137,11 +148,11 @@ function update_hybridProblem(prob::AbstractHybridProblem; scenario, ϕq = CA.ComponentVector(ϕq; ϕunc...) end HybridProblem(θM, ϕq, g, ϕg, f_batch, priors, py, transM, transP, train_dataloader, - n_covar, n_site, n_batch, cor_ends_new, pbm_covars, approx) + test_data, n_covar, n_site, n_batch; cor_ends = cor_ends_new, pbm_covars, approx) end function HybridProblem(prob::HybridProblem; kwargs... ) - update_hybridProblem(prob; scenario = Val(()), kwargs..., approx = prob.approx) + update_hybridProblem(prob; scenario = Val(()), approx = prob.approx, kwargs...) end @@ -177,9 +188,44 @@ end function get_hybridproblem_par_templates(prob::HybridProblem; scenario = ()) θP = get_hybridproblem_θP(prob; scenario) - (; θP, θM = prob.θM) + (; θP, θM = prob.θM) end +# deprecated, better use predict_point_hvi +# """ +# compute_hybridproblem_par_expected(prob::HybridProblem, xM; scenario = ()) + +# Compute the expected PBM model parameters for given covariates +# (n_covariate x n_site). + +# Returns a tuple of +# - `θP`: ComponentVector of population-level parameters +# - `θMs_tr`: ComponentArray (n_site x n_par) of individual (site) parameters +# """ +# function compute_hybridproblem_par_expected(prob::HybridProblem, xM; +# scenario = (), cdev = identity) +# n_site = size(xM,2) +# θP = get_hybridproblem_θP(prob; scenario) +# g, ϕg = get_hybridproblem_MLapplicator(prob; scenario) +# (; transP, transM) = get_hybridproblem_transforms(prob; scenario) +# transMs = StackedArray(transM, n_site) +# pbm_covars = get_hybridproblem_pbmpar_covars(prob; scenario) +# xMP = if isempty(pbm_covars) +# xM +# else +# intP = ComponentArrayInterpreter(θP) +# pbm_covar_indices = CA.getdata(intP(1:length(intP))[pbm_covars]) +# ζP = inverse(transP)(θP) +# _append_each_covars(xM, CA.getdata(ζP), pbm_covar_indices) +# end +# θMs_tr_m = gtrans(g, transMs, xMP, ϕg; cdev=identity, is_testmode=true) +# # attach parameter names in columns +# (;θM) = get_hybridproblem_par_templates(prob; scenario) +# intm = ComponentArrayInterpreter((n_site,), θM) +# θMs_tr = intm(θMs_tr_m) +# (; θP, θMs_tr) +# end + function get_hybridproblem_ϕq(prob::HybridProblem; scenario = ()) prob.ϕq end @@ -210,6 +256,10 @@ function get_hybridproblem_train_dataloader(prob::HybridProblem; scenario = ()) prob.train_dataloader end +function get_hybridproblem_test_data(prob::HybridProblem; scenario = ()) + prob.test_data +end + function get_hybridproblem_cor_ends(prob::HybridProblem; scenario = ()) prob.cor_ends end diff --git a/src/HybridSolver.jl b/src/HybridSolver.jl index aee018f..441d64f 100644 --- a/src/HybridSolver.jl +++ b/src/HybridSolver.jl @@ -278,7 +278,7 @@ end Create a loss function for parameter vector ϕ, given - `g(x, ϕ)`: machine learning model - `transPMS`: transformation from unconstrained space to parameter space -- `f(θMs, θP)`: mechanistic model +- `f(θMs_tr, θP)`: mechanistic model - `interpreters`: assigning structure to pure vectors, see `neg_elbo_gtf` - `n_MC`: number of Monte-Carlo sample to approximate the expected value across distribution - `pbm_covars`: tuple of symbols of process-based parameters provided to the ML model @@ -403,8 +403,8 @@ function construct_priors_θ_mean(prob, ϕg, keysθM, θP, θmean_quant, g_dev, transMs = StackedArray(transM, n_site) # ζMs = g_dev(xMP_all, CA.getdata(ϕg))' # transpose to par-last for StackedArray # ζMs_cpu = cdev(ζMs) - # θMs = transMs(ζMs_cpu) - θMs = gtrans( + # θMs_tr = transMs(ζMs_cpu) + θMs_tr = gtrans( g_dev, transMs, xMP_all, CA.getdata(ϕg); cdev=cpu_device(), is_testmode = true) priors_dict = get_hybridproblem_priors(prob; scenario) priorsP = [priors_dict[k] for k in keys(θP)] @@ -414,9 +414,9 @@ function construct_priors_θ_mean(prob, ϕg, keysθM, θP, θmean_quant, g_dev, priorsM = Tuple(priors_dict[k] for k in keysθM) i_par = 1 i_site = 1 - priors_θMs_mean = map(Iterators.product(axes(θMs)...)) do (i_site, i_par) + priors_θMs_mean = map(Iterators.product(axes(θMs_tr)...)) do (i_site, i_par) #@show i_par, i_site - fit_narrow_normal(θMs[i_site, i_par], priorsM[i_par], θmean_quant) + fit_narrow_normal(θMs_tr[i_site, i_par], priorsM[i_par], θmean_quant) end # # concatenate to a flat vector # int_n_site = get_ca_int_PMs(n_site) diff --git a/src/HybridVariationalInference.jl b/src/HybridVariationalInference.jl index 8481078..2602191 100644 --- a/src/HybridVariationalInference.jl +++ b/src/HybridVariationalInference.jl @@ -42,6 +42,7 @@ include("bijectors_utils.jl") export AbstractHVIApproximation, AbstractMeanHVIApproximation export MeanHVIApproximation, MeanHVIApproximationMat +export AbstractMeanVarSepHVIApproximation, MeanVarSepHVIApproximation include("HVIApproximation.jl") export AbstractComponentArrayInterpreter, ComponentArrayInterpreter, @@ -69,6 +70,7 @@ export AbstractHybridProblem, get_hybridproblem_MLapplicator, get_hybridproblem_ get_hybridproblem_float_type, gen_hybridproblem_synthetic, get_hybridproblem_par_templates, get_hybridproblem_transforms, get_hybridproblem_train_dataloader, + get_hybridproblem_test_data, get_hybridproblem_neg_logden_obs, get_hybridproblem_n_covar, get_hybridproblem_n_site_and_batch, @@ -80,7 +82,7 @@ export AbstractHybridProblem, get_hybridproblem_MLapplicator, get_hybridproblem_ gdev_hybridproblem_dataloader, gdev_hybridproblem_data, setup_PBMpar_interpreter, get_gdev_MP, - init_hybrid_ϕq + init_hybrid_ϕq include("AbstractHybridProblem.jl") export HybridProblem @@ -110,7 +112,9 @@ export get_ca_starts, get_ca_ends, get_cor_count include("cholesky.jl") export neg_elbo_gtf, sample_posterior, predict_hvi, zero_penalty_loss +export get_hybridproblem_correlation_Ms include("elbo_dev.jl") +include("elbo_sepvec.jl") include("elbo.jl") include("elbo2.jl") diff --git a/src/PBMApplicator.jl b/src/PBMApplicator.jl index 0a2afd5..fcde585 100644 --- a/src/PBMApplicator.jl +++ b/src/PBMApplicator.jl @@ -4,13 +4,16 @@ global parameters, `θP`, site-specific parameters, `θMs` (sites in columns), and site-specific model drivers, `xP` (sites in columns), It returns a matrix of predictions sites in columns. -Specific implementations need to provide function `apply_model(app, θP, θMs, xP)`. +Specific implementations need to provide function `apply_model(app, θP, θMs_tr, xP)`. where -- `θsP` and `θsMs` are shaped according to the output of `generate_ζ`, i.e. - `(n_site_pred x n_par x n_MC)`. +- `θsP` and `θsMs_tr` are shaped according to the output of `generate_ζ`, i.e. + `(n_site_pred x n_par x n_MC)`. Note that this transposed shape is different from most + other parts of the interface, where sites are in the last dimension. + The reason is that a column of a parameter is more efficient to transform between + constrain and unconstrained scale. - Results are of shape `(n_obs x n_site_pred x n_MC)`. -They may also provide function `apply_model(app, θP, θMs, xP)` for a sample +They may also provide function `apply_model(app, θP, θMs_tr, xP)` for a sample of parameters, i.e. where an additional dimension is added to both `θP` and `θMs`. However, there is a default implementation that mapreduces across these dimensions. @@ -24,8 +27,8 @@ abstract type AbstractPBMApplicator end # function apply_model end # already defined in ModelApplicator.jl for ML model -function (app::AbstractPBMApplicator)(θP::AbstractArray, θMs::AbstractArray, xP::AbstractMatrix) - apply_model(app, θP, θMs, xP) +function (app::AbstractPBMApplicator)(θP::AbstractArray, θMs_tr::AbstractArray, xP::AbstractMatrix) + apply_model(app, θP, θMs_tr, xP) end """ @@ -35,8 +38,8 @@ function create_nsite_applicator end """ - apply_model(app::AbstractPBMApplicator, θsP::AbstractVector, θsMs::AbstractMatrix, xP::AbstractMatrix) - apply_model(app::AbstractPBMApplicator, θsP::AbstractMatrix, θsMs::AbstractArray{ET,3}, xP) + apply_model(app::AbstractPBMApplicator, θsP::AbstractVector, θsMs_tr::AbstractMatrix, xP::AbstractMatrix) + apply_model(app::AbstractPBMApplicator, θsP::AbstractMatrix, θsMs_tr::AbstractArray{ET,3}, xP) The first variant calls the PBM for one batch of sites. @@ -45,36 +48,36 @@ The default implementation mapreduces the last dimension of `θsP` and θ`sMs` c first variant of `apply_model` for each sample. """ # docu in struct -function apply_model(app::AbstractPBMApplicator, θsP::AbstractMatrix, θsMs::AbstractArray{ET,3}, xP) where ET +function apply_model(app::AbstractPBMApplicator, θsP::AbstractMatrix, θsMs_tr::AbstractArray{ET,3}, xP) where ET # stack does not work on GPU, see specialized method for GPUArrays below y_pred = stack( - map(eachcol(CA.getdata(θsP)), eachslice(CA.getdata(θsMs), dims=3)) do θP, θMs + map(eachcol(CA.getdata(θsP)), eachslice(CA.getdata(θsMs_tr), dims=3)) do θP, θMs app(θP, θMs, xP) end) end -# function apply_model(app::AbstractPBMApplicator, θsP::GPUArraysCore.AbstractGPUMatrix, θsMs::GPUArraysCore.AbstractGPUArray{ET,3}, xP) where ET +# function apply_model(app::AbstractPBMApplicator, θsP::GPUArraysCore.AbstractGPUMatrix, θsMs_tr::GPUArraysCore.AbstractGPUArray{ET,3}, xP) where ET # # stack does not work on GPU, need to resort to slower mapreduce # # for type stability, apply f at first iterate to supply init to mapreduce # P1, Pit = Iterators.peel(eachcol(CA.getdata(θsP))); -# Ms1, Msit = Iterators.peel(eachslice(CA.getdata(θsMs), dims=3)); +# Ms1, Msit = Iterators.peel(eachslice(CA.getdata(θsMs_tr), dims=3)); # y1 = apply_model(app, P1, Ms1, xP)[2] # y1a = reshape(y1, size(y1)..., 1) # add one dimension # y_pred = mapreduce((a,b) -> cat(a,b; dims=3), Pit, Msit; init=y1a) do θP, θMs # y_pred_i = app(θP, θMs, xP) # end # end -function apply_model(app::AbstractPBMApplicator, θsP::GPUArraysCore.AbstractGPUMatrix, θsMs::GPUArraysCore.AbstractGPUArray{ET,3}, xP) where ET +function apply_model(app::AbstractPBMApplicator, θsP::GPUArraysCore.AbstractGPUMatrix, θsMs_tr::GPUArraysCore.AbstractGPUArray{ET,3}, xP) where ET # stack does not work on GPU, need to resort to slower mapreduce # for type stability, apply f at first iterate to supply init to mapreduce # avoid Iterators.peel for CUDA - y1 = apply_model(app, CA.getdata(θsP)[:,1], CA.getdata(θsMs)[:,:,1], xP)[2] + y1 = apply_model(app, CA.getdata(θsP)[:,1], CA.getdata(θsMs_tr)[:,:,1], xP)[2] y1a = reshape(y1, :, 1) # add one dimension n_sample = size(θsP,2) y_pred = if (n_sample == 1) y1a else mapreduce((a,b) -> cat(a,b; dims=3), - eachcol(CA.getdata(θsP)[:,2:end]), eachslice(CA.getdata(θsMs)[:,:,2:end], dims=3); + eachcol(CA.getdata(θsP)[:,2:end]), eachslice(CA.getdata(θsMs_tr)[:,:,2:end], dims=3); init=y1a) do θP, θMs app(θP, θMs, xP) end @@ -92,8 +95,8 @@ Process-Base-Model applicator that returns its θMs inputs. Used for testing. """ struct NullPBMApplicator <: AbstractPBMApplicator end -function apply_model(app::NullPBMApplicator, θP::AbstractVector, θMs::AbstractMatrix, xP) - return CA.getdata(θMs) +function apply_model(app::NullPBMApplicator, θP::AbstractVector, θMs_tr::AbstractMatrix, xP) + return CA.getdata(θMs_tr) end create_nsite_applicator(app::NullPBMApplicator, n_site) = app @@ -108,8 +111,8 @@ struct DirectPBMApplicator{F} <: AbstractPBMApplicator f::F end -function apply_model(app::DirectPBMApplicator, θP::AbstractVector, θMs::AbstractMatrix, xP) - return app.f(θP, θMs, xP) +function apply_model(app::DirectPBMApplicator, θP::AbstractVector, θMs_tr::AbstractMatrix, xP) + return app.f(θP, θMs_tr, xP) end create_nsite_applicator(app::DirectPBMApplicator, n_site) = app @@ -155,16 +158,16 @@ function create_nsite_applicator(app::PBMSiteApplicator, n_site) end -function apply_model(app::PBMSiteApplicator, θP::AbstractVector, θMs::AbstractMatrix, xP) - function apply_PBMsite(θM, xP1) - if (CA.getdata(θP) isa GPUArraysCore.AbstractGPUArray) && - (!(CA.getdata(app.θFix) isa GPUArraysCore.AbstractGPUArray) || - !(CA.getdata(θMs) isa GPUArraysCore.AbstractGPUArray)) - error("concatenating GPUarrays with non-gpu arrays θFix or θMs. " * - "May fmap PBMModelapplicators to gdev, " * - "or compute PBMmodel on CPU") - end - θ = vcat(CA.getdata(θP), CA.getdata(θM), CA.getdata(app.θFix)) +function apply_model(app::PBMSiteApplicator, θP::AbstractVector, θMs_tr::AbstractMatrix, xP) + if (CA.getdata(θP) isa GPUArraysCore.AbstractGPUArray) && + (!(CA.getdata(app.θFix) isa GPUArraysCore.AbstractGPUArray) || + !(CA.getdata(θMs_tr) isa GPUArraysCore.AbstractGPUArray)) + error("concatenating GPUarrays with non-gpu arrays θFix or θMs. " * + "May fmap PBMModelapplicators to gdev, " * + "or compute PBMmodel on CPU") + end + function apply_PBMsite(θM_tr, xP1) + θ = vcat(CA.getdata(θP), CA.getdata(θM_tr), CA.getdata(app.θFix)) θc = app.intθ1(θ); # show errors without ";" xPc = app.int_xPsite(xP1); ans = CA.getdata(app.fθ(θc, xPc)) @@ -174,20 +177,20 @@ function apply_model(app::PBMSiteApplicator, θP::AbstractVector, θMs::Abstract # https://discourse.julialang.org/t/type-instability-of-mapreduce-vs-map-reduce/121136 # local pred_sites = mapreduce( # apply_PBMsite, hcat, eachrow(θMs), eachcol(xP); init=Matrix{Float64}(undef,n_obs,0)) - θMs1, it_θMs = if (CA.getdata(θP) isa GPUArraysCore.AbstractGPUArray) + θMs1_tr, it_θMs_tr = if (CA.getdata(θP) isa GPUArraysCore.AbstractGPUArray) # if working on CuArray, better materialize transpose and use eachcol for contiguous # avoid eachrow, because it does produce non-strided views which are bad on GPU, # https://discourse.julialang.org/t/using-view-with-cuarrays/104057/5 # better compute on CPU or use matrix-version of PBMModel - θMst = copy(CA.getdata(θMs)') - Iterators.peel(eachcol(θMst)); + θMst_tr = copy(CA.getdata(θMs_tr)') + Iterators.peel(eachcol(θMst_tr)); else - Iterators.peel(eachrow(CA.getdata(θMs))) + Iterators.peel(eachrow(CA.getdata(θMs_tr))) end xP1, it_xP = Iterators.peel(eachcol(CA.getdata(xP))) - obs1 = apply_PBMsite(θMs1, xP1) + obs1 = apply_PBMsite(θMs1_tr, xP1) local pred_sites = mapreduce( - apply_PBMsite, hcat, it_θMs, it_xP; init=reshape(obs1, :, 1)) + apply_PBMsite, hcat, it_θMs_tr, it_xP; init=reshape(obs1, :, 1)) return pred_sites end @@ -257,7 +260,7 @@ function create_nsite_applicator(app::PBMPopulationApplicator, n_site) PBMPopulationApplicator(app.fθpop, θFixm, rep_fac, intθ, int_xP) end -function apply_model(app::PBMPopulationApplicator, θP::AbstractVector, θMs::AbstractMatrix, xP) +function apply_model(app::PBMPopulationApplicator, θP::AbstractVector, θMs_tr::AbstractMatrix, xP) # error causes trouble in type inference in Zygote # if (CA.getdata(θP) isa GPUArraysCore.AbstractGPUArray) && # (!(CA.getdata(app.θFixm) isa GPUArraysCore.AbstractGPUArray) || @@ -277,14 +280,14 @@ function apply_model(app::PBMPopulationApplicator, θP::AbstractVector, θMs::Ab # but when returning a gradient of size (n_bach, 0) there are errors # need to live with dynamic dispatch of Union type of Matrix and ZeroTangent #local θ = concat_PMFix(θP, θMs, app) - local θ = if !isempty(θP) - hcat(app.rep_fac .* CA.getdata(θP)' , CA.getdata(θMs), CA.getdata(app.θFixm)) + local θ_tr = if !isempty(θP) + hcat(app.rep_fac .* CA.getdata(θP)' , CA.getdata(θMs_tr), CA.getdata(app.θFixm)) else - hcat(CA.getdata(θMs), CA.getdata(app.θFixm)) + hcat(CA.getdata(θMs_tr), CA.getdata(app.θFixm)) end - local θc = app.intθ(θ) + local θc_tr = app.intθ(θ_tr) local xPc = app.int_xP(CA.getdata(xP)) - local pred_sites = app.fθpop(θc, xPc) + local pred_sites = app.fθpop(θc_tr, xPc) return pred_sites end @@ -320,10 +323,10 @@ to a `ComponentMatrix` with parameters with one row for each site, that can be column-indexed by Symbols. ## Arguments -- `fθpop`: process model, process model `f(θsc, θgc, xPc)`, which is not +- `fθpop`: process model, process model `f(θsc_tr, θgc, xPc)`, which is not agnostic of the partitioning of parameters into fixed, global, and individual to increase performance - - `θc`: parameters: `ComponentMatrix` (n_site x n_par_site) with each row a parameter vector + - `θsc_tr`: parameters: `ComponentMatrix` (n_site x n_par_site) with each row a parameter vector - `θgc`: parameters: `ComponentVector` (n_par_global) - `xPc`: observations: `ComponentMatrix` (n_obs x n_site) with each column observationsfor one site @@ -354,20 +357,20 @@ function create_nsite_applicator(app::PBMPopulationGlobalApplicator, n_site) end -function apply_model(app::PBMPopulationGlobalApplicator, θP::AbstractVector, θMs::AbstractMatrix, xP) +function apply_model(app::PBMPopulationGlobalApplicator, θP::AbstractVector, θMs_tr::AbstractMatrix, xP) if (CA.getdata(θP) isa GPUArraysCore.AbstractGPUArray) && (!(CA.getdata(app.θFix) isa GPUArraysCore.AbstractGPUArray) || - !(CA.getdata(θMs) isa GPUArraysCore.AbstractGPUArray)) + !(CA.getdata(θMs_tr) isa GPUArraysCore.AbstractGPUArray)) error("concatenating GPUarrays with non-gpu arrays θFixm or θMs. " * "May transfer PBMPopulationGlobalApplicator to gdev, " * "or compute PBM on CPU.") end - local θs = CA.getdata(θMs) + local θs_tr = CA.getdata(θMs_tr) local θg = vcat(CA.getdata(θP), CA.getdata(app.θFix)) - local θsc = app.intθs(CA.getdata(θs)) + local θsc_tr = app.intθs(CA.getdata(θs_tr)) local θgc = app.intθg(CA.getdata(θg)) local xPc = app.int_xP(CA.getdata(xP)) - local pred_sites = app.fθpop(θsc, θgc, xPc) + local pred_sites = app.fθpop(θsc_tr, θgc, xPc) return pred_sites end diff --git a/src/chainrulescore.jl b/src/chainrulescore.jl index dce15e6..5309c7a 100644 --- a/src/chainrulescore.jl +++ b/src/chainrulescore.jl @@ -24,8 +24,8 @@ end # end # end -# function ChainRulesCore.rrule(::typeof(transform_and_logjac_ζ), ζP, ζMs; transP, transMs) -# transform_and_logjac_ζ(ζP, ζMs; transP, transMs), +# function ChainRulesCore.rrule(::typeof(transform_and_logjac_ζ), ζP, ζMs_tr; transP, transMs) +# transform_and_logjac_ζ(ζP, ζMs_tr; transP, transMs), # function rrule_test(Δ) # Main.@infiltrate_main # (ChainRulesCore.NoTangent(), ΔζP, ΔζMs) diff --git a/src/elbo.jl b/src/elbo.jl index 7c919c5..76d262c 100644 --- a/src/elbo.jl +++ b/src/elbo.jl @@ -65,10 +65,10 @@ function neg_elbo_gtf_components(rng, ϕ::AbstractVector{FT}, g, f, py, approx::AbstractHVIApproximation, ) where {FT} n_MCr = isempty(priors_θP_mean) ? n_MC : max(n_MC, n_MC_mean) - ζsP, ζsMs, σ = generate_ζ(approx, rng, g, ϕ, xM; n_MC=n_MCr, cor_ends, pbm_covar_indices, - int_ϕq, int_ϕg_ϕq, is_testmode) + ζsP, ζsMs_tr, σ = generate_ζ(approx, rng, g, ϕ, xM; n_MC=n_MCr, cor_ends, pbm_covar_indices, + int_ϕq, int_ϕg_ϕq, is_testmode, i_sites) ζsP_cpu = cdev(ζsP) # fetch to CPU, because for <1000 sites (n_batch) this is faster - ζsMs_cpu = cdev(ζsMs) # fetch to CPU, because for <1000 sites (n_batch) this is faster + ζsMs_tr_cpu = cdev(ζsMs_tr) # fetch to CPU, because for <1000 sites (n_batch) this is faster # # maybe: translate ζ once and supply to both neg_elbo and negloglik_meanθ ϕc = int_ϕg_ϕq(ϕ) @@ -76,7 +76,7 @@ function neg_elbo_gtf_components(rng, ϕ::AbstractVector{FT}, g, f, py, ϕg = CA.getdata(ϕc.ϕg)::VT ϕq = CA.getdata(ϕc.ϕq)::VT loss_comps = neg_elbo_ζtf( - ζsP_cpu[:,1:n_MC], ζsMs_cpu[:,:,1:n_MC], σ, f, py, xP, y_ob, y_unc; + ζsP_cpu[:,1:n_MC], ζsMs_tr_cpu[:,:,1:n_MC], σ, f, py, xP, y_ob, y_unc; n_MC_cap, transP, transMs, priorsP, priorsM, floss_penalty, ϕg, ϕq, is_omit_priors, zero_prior_logdensity,) # @@ -87,16 +87,16 @@ function neg_elbo_gtf_components(rng, ϕ::AbstractVector{FT}, g, f, py, # (;loss_comps..., nLmean_θ) end -function _compute_negloglik_meanθ(ζsP::AbstractMatrix{FT}, ζsMs; +function _compute_negloglik_meanθ(ζsP::AbstractMatrix{FT}, ζsMs_tr; priors_θP_mean, priors_θMs_mean, i_sites, trans_mP, trans_mMs, ) where FT if isempty(priors_θP_mean) return zero(FT) end - θsP, θsMs = transform_ζs(ζsP, ζsMs; trans_mP, trans_mMs) + θsP, θsMs_tr = transform_ζs(ζsP, ζsMs_tr; trans_mP, trans_mMs) mean_θP = mean(CA.getdata(θsP); dims=(2))[:, 1] nLmean_θP = map((d, θi) -> -logpdf(d, θi), priors_θP_mean, mean_θP) - mean_θMs = mean(θsMs; dims=(3))[:, :, 1] + mean_θMs = mean(θsMs_tr; dims=(3))[:, :, 1] nLmean_θMs = map((d, θi) -> -logpdf(d, θi), priors_θMs_mean[i_sites], mean_θMs) nLmean_θ = sum(nLmean_θP) + sum(nLmean_θMs) convert(FT,nLmean_θ)::FT @@ -129,20 +129,20 @@ Compute the neg_elbo for each sampled parameter vector (last dimension of ζs). - `loss_penalty`: additional loss terms from floss_penalty - compute entropy of transformation """ -function neg_elbo_ζtf(ζsP, ζsMs, σ, f, py, xP, y_ob, y_unc; +function neg_elbo_ζtf(ζsP, ζsMs_tr, σ, f, py, xP, y_ob, y_unc; n_MC_cap=size(ζsP,2), transP, - transMs=StackedArray(transM, size(ζsMs, 2)), + transMs=StackedArray(transM, size(ζsMs_tr, 2)), priorsP, priorsM, floss_penalty, ϕg, ϕq, is_omit_priors::Val, zero_prior_logdensity, ) n_MC = size(ζsP,2) - f_sample = (ζP, ζMs) -> begin - θP, θMs, logjac_i = transform_and_logjac_ζ(ζP, ζMs; transP, transMs) + f_sample = (ζP, ζMs_tr) -> begin + θP, θMs_tr, logjac_i = transform_and_logjac_ζ(ζP, ζMs_tr; transP, transMs) # currently logpdf only works on CPU - y_pred_i = f(θP, θMs, xP) + y_pred_i = f(θP, θMs_tr, xP) #nLy1 = neg_logden_indep_normal(y_ob, y_pred_i, y_unc) # Main.@infiltrate_main # Test.@inferred( f(θP, θMs, xP) ) @@ -150,8 +150,8 @@ function neg_elbo_ζtf(ζsP, ζsMs, σ, f, py, xP, y_ob, y_unc; # @usingany Cthulhu # @descend_code_warntype f(θP, θMs, xP) nLy_i = py(y_ob, y_pred_i, y_unc) - loss_penalty_i = convert(eltype(nLy_i),floss_penalty(y_pred_i, θMs, θP, ϕg, ϕq)) - neg_log_prior_i = compute_priors_logdensity(priorsP, priorsM, θP, θMs, + loss_penalty_i = convert(eltype(nLy_i),floss_penalty(y_pred_i, θMs_tr, θP, ϕg, ϕq)) + neg_log_prior_i = compute_priors_logdensity(priorsP, priorsM, θP, θMs_tr, is_omit_priors, zero_prior_logdensity) # make sure names to not match outer, otherwise Box type instability (nLy_i, neg_log_prior_i, -logjac_i, loss_penalty_i) @@ -165,7 +165,7 @@ function neg_elbo_ζtf(ζsP, ζsMs, σ, f, py, xP, y_ob, y_unc; #@usingany Cthulhu #@descend_code_warntype f_sample(first(eachcol(ζsP)), first(eachslice(ζsMs; dims=3))) #map_res = Test.@inferred map(f_sample, eachcol(ζsP), eachslice(ζsMs; dims=3)) - map_res = map(f_sample, eachcol(ζsP), eachslice(ζsMs; dims=3)) + map_res = map(f_sample, eachcol(ζsP), eachslice(ζsMs_tr; dims=3)) nLys, neg_log_priors, neglogjacs, loss_penalties = vectuptotupvec(map_res) # For robustness may compute the expectation only on the n_smallest values # because its very sensitive to few large outliers @@ -183,7 +183,7 @@ function neg_elbo_ζtf(ζsP, ζsMs, σ, f, py, xP, y_ob, y_unc; # sum_log_σ = sum(log.(σ)) # logdet_jacT2 = -sum_log_σ # log Prod(1/σ_i) = -sum log σ_i logdetΣ = 2 * sum(log.(σ)) - n_θ = size(ζsP, 1) + prod(size(ζsMs)[1:2]) + n_θ = size(ζsP, 1) + prod(size(ζsMs_tr)[1:2]) if length(σ) != n_θ error("TODO infiltrate") #Main.@infiltrate_main @@ -200,20 +200,20 @@ function neg_elbo_ζtf(ζsP, ζsMs, σ, f, py, xP, y_ob, y_unc; (;nLjoint, entropy_ζ, loss_penalty, nLy, neg_log_prior, neg_log_jac) end -function compute_priors_logdensity(priorsP, priorsM, θP, θMs, +function compute_priors_logdensity(priorsP, priorsM, θP, θMs_tr, ::Val{omit_priors}, zero_prior_logdensity) where {omit_priors} if omit_priors zero_prior_logdensity - elseif (θP isa AbstractGPUArray) || (θMs isa AbstractGPUArray) + elseif (θP isa AbstractGPUArray) || (θMs_tr isa AbstractGPUArray) @warn("neg_elbo_ζtf: Cannot apply priors to gpu array. Piors are omitted. "* "either compute PBM on CPU or omit priors.") zero_prior_logdensity else - compute_priors_logdensity(priorsP, priorsM, θP, θMs, zero_prior_logdensity) + compute_priors_logdensity(priorsP, priorsM, θP, θMs_tr, zero_prior_logdensity) end end -function compute_priors_logdensity(priorsP, priorsM, θP, θMs, zero_prior_logdensity) +function compute_priors_logdensity(priorsP, priorsM, θP, θMs_tr, zero_prior_logdensity) logpdf_t = (prior, θ) -> logpdf(prior, θ)::eltype(θP) function logpdf_tv_sum(prior, θ::AbstractVector{T}) where T # logpdf_tv_sum_inner = let prior = prior @@ -235,13 +235,13 @@ function compute_priors_logdensity(priorsP, priorsM, θP, θMs, zero_prior_logde # logpdf_tv_sum(priorMi, θMi) # sum(logpdf_tv_sum(priorMi, θMi))::eltype(θMi) # end - f_col = let priorsM=priorsM, θMs=θMs + f_col = let priorsM=priorsM, θMs_tr=θMs_tr function f_col_inner(i) # TP = ChainRulesCore.@ignore_derivatives Base.return_types(getindex, Tuple{typeof(priorsM), typeof(i)}) # if TP != [typeof(priorsM[i])] # error("encountered unstable priorsM: $TP") # end - logpdf_tv_sum(priorsM[i], θMs[:,i]) + logpdf_tv_sum(priorsM[i], θMs_tr[:,i]) #Tθ = Base.return_types(getindex, Tuple{typeof(θMs), Colon, typeof(i)}) #TRET = Base.return_types(logpdf_tv_sum, Tuple{typeof(priorsM[i]), typeof(θMs[:,i])}) end @@ -252,7 +252,7 @@ function compute_priors_logdensity(priorsP, priorsM, θP, θMs, zero_prior_logde neg_log_prior_i = nlP0 - nlMs_sum if !isfinite(neg_log_prior_i) @show neg_log_prior_i, nlP0 - @show θMs + @show θMs_tr @show priorsM error("inspect non-finite priors") end @@ -302,33 +302,42 @@ Prediction function for hybrid variational inference parameter model. - `xP`: model drivers for process based model (PBM): Matrix with (n_site_pred) rows. Possibility to override the default from `get_hybridproblem_train_dataloader`. -Returns an NamedTuple `(; y, θsP, θsMs, entropy_ζ)` with entries +Returns an NamedTuple `(; y, θsP, θsMs_tr, entropy_ζ)` with entries - `y`: Array `(n_obs, n_site, n_sample_pred)` of model predictions. - `θsP`: ComponentArray `(n_θP, n_sample_pred)` of PBM model parameters that are kept constant across sites. -- `θsMs`: ComponentArray `(n_site, n_θM, n_sample_pred)` of PBM model parameters +- `θsMs_tr`: ComponentArray `(n_site, n_θM, n_sample_pred)` of PBM model parameters that vary by site. - `entropy_ζ`: The entropy of the log-determinant of the transformation of the set of model parameters, which is involved in uncertainty quantification. + +Note that for some approximations, such as `MeanVarSepHVIApproximation`, +`prob.ϕq` contains uncertainty parameters that are specific to sites. +For a proper prediction for new sites, update `prob.ϕq` before appropriately. +If xM and xP is unspecified, the problem's sites are used and `prob.ϕq` is consistent. +If predicting for a subset of sites, specify keyword argument `i_sites` . """ function predict_hvi(rng, prob::AbstractHybridProblem; scenario=Val(()), gdevs = get_gdev_MP(scenario), xM = nothing, xP = nothing, is_testmode = true, + i_sites = nothing, kwargs... ) if isnothing(xM) || isnothing(xP) dl = get_hybridproblem_train_dataloader(prob; scenario) dl_dev = gdev_hybridproblem_dataloader(dl; gdevs) xM_dl, xP_dl = dl_dev.data[1:2] - xM = isnothing(xM) ? xM_dl : xM - xP = isnothing(xP) ? xP_dl : xP + i_sites = isnothing(i_sites) ? (1:size(xM_dl, 2)) : i_sites + xP = isnothing(xP) ? xP_dl[:,i_sites] : xP + xM = isnothing(xM) ? xM_dl[:,i_sites] : xM end - (; θsP, θsMs, entropy_ζ) = sample_posterior( - rng, prob, xM; scenario, gdevs, is_testmode, kwargs...) + # sample_posterior required consistent prob.ϕq and xM + (; θsP, θsMs_tr, entropy_ζ) = sample_posterior( + rng, prob, xM; scenario, gdevs, is_testmode, i_sites, kwargs...) # n_site, n_batch = get_hybridproblem_n_site_and_batch(prob; scenario) - n_site_pred = size(θsMs,1) # determined by size(xM) + n_site_pred = size(θsMs_tr,1) # determined by size(xM) @assert size(xP, 2) == n_site_pred f_batch = get_hybridproblem_PBmodel(prob; scenario) f = n_site_pred == n_batch ? f_batch : create_nsite_applicator(f_batch, n_site_pred) @@ -337,9 +346,9 @@ function predict_hvi(rng, prob::AbstractHybridProblem; scenario=Val(()), else f_dev = f end - #y = apply_process_model(θsP, θsMs, f_dev, xP) - y = f_dev(θsP, θsMs, xP) - (; y, θsP, θsMs, entropy_ζ) + #y = apply_process_model(θsP, θsMs_tr, f_dev, xP) + y = f_dev(θsP, θsMs_tr, xP) + (; y, θsP, θsMs_tr, entropy_ζ) end """ @@ -361,21 +370,27 @@ Optional keyword arguments and parameter transformtation, default to [`get_gdev_MP`](@ref)`(scenario)`. - `is_inferred`: set to `Val(true)` to activate type stabilicy check for transformation -Returns an NamedTuple `(; θsP, θsMs, entropy_ζ)` with entries +Returns an NamedTuple `(; θsP, θsMs_tr, entropy_ζ)` with entries - `θsP`: ComponentArray `(n_θP, n_sample_pred)` of PBM model parameters that are kept constant across sites. -- `θsMs`: ComponentArray `(n_site, n_θM, n_sample_pred)` of PBM model parameters +- `θsMs_tr`: ComponentArray `(n_site, n_θM, n_sample_pred)` of PBM model parameters that vary by site. - `entropy_ζ`: The entropy of the log-determinant of the transformation of the set of model parameters, which is involved in uncertainty quantification. """ -function sample_posterior(rng, prob::AbstractHybridProblem; scenario=Val(()), +function sample_posterior(rng, prob::AbstractHybridProblem; i_sites=nothing, scenario=Val(()), gdevs = get_gdev_MP(scenario), kwargs...) dl = get_hybridproblem_train_dataloader(prob; scenario) dl_dev = gdev_hybridproblem_dataloader(dl; gdevs) - xM = dl_dev.data[1] - sample_posterior(rng, prob, xM; scenario, gdevs, kwargs...) + xM_all = dl_dev.data[1] + if !isnothing(i_sites) + xM = xM_all[:,i_sites] + else + xM = xM_all + i_sites = 1:size(xM, 2) + end + sample_posterior(rng, prob, xM; scenario, gdevs, i_sites,kwargs...) end @@ -405,13 +420,13 @@ function sample_posterior(rng, prob::AbstractHybridProblem, xM::AbstractMatrix; if isnothing(approx) approx = prob.approx # assuming has field approx, e.g. if its a HybridProblem end - (; θsP, θsMs, entropy_ζ) = sample_posterior(rng, g_dev, ϕ_dev, xM; + (; θsP, θsMs_tr, entropy_ζ) = sample_posterior(rng, g_dev, ϕ_dev, xM; int_ϕg_ϕq, int_ϕq, transP, transM, n_sample_pred, cdev=infer_cdev(gdevs), cor_ends, pbm_covar_indices, approx, kwargs...) θsPc = ComponentArrayInterpreter(par_templates.θP, (n_sample_pred,))(θsP) - θsMsc = ComponentArrayInterpreter((n_site,), par_templates.θM, (n_sample_pred,))(θsMs) - (; θsP=θsPc, θsMs=θsMsc, entropy_ζ) + θsMsc_tr = ComponentArrayInterpreter((n_site,), par_templates.θM, (n_sample_pred,))(θsMs_tr) + (; θsP=θsPc, θsMs_tr=θsMsc_tr, entropy_ζ) end function sample_posterior(rng, g, ϕ::AbstractVector, xM::AbstractMatrix; @@ -425,20 +440,21 @@ function sample_posterior(rng, g, ϕ::AbstractVector, xM::AbstractMatrix; is_inferred::Val{is_infer} = Val(false), is_testmode, approx::AbstractHVIApproximation, + i_sites, ) where is_infer - ζsP_gpu, ζsMs_gpu, σ = generate_ζ(approx, rng, g, CA.getdata(ϕ), CA.getdata(xM); + ζsP_gpu, ζsMs_tr_gpu, σ = generate_ζ(approx, rng, g, CA.getdata(ϕ), CA.getdata(xM); int_ϕg_ϕq, int_ϕq, - n_MC=n_sample_pred, cor_ends, pbm_covar_indices, is_testmode) + n_MC=n_sample_pred, cor_ends, pbm_covar_indices, is_testmode, i_sites) ζsP = cdev(ζsP_gpu) - ζsMs = cdev(ζsMs_gpu) + ζsMs_tr = cdev(ζsMs_tr_gpu) logdetΣ = 2 * sum(log.(σ)) entropy_ζ = entropy_MvNormal(length(σ), logdetΣ) trans_mP = StackedArray(transP, size(ζsP, 2)) - trans_mMs = StackedArray(transM, size(ζsMs, 1) * size(ζsMs, 3)) - θsP, θsMs = is_infer ? - Test.@inferred(transform_ζs(ζsP, ζsMs; trans_mP, trans_mMs)) : - transform_ζs(ζsP, ζsMs; trans_mP, trans_mMs) - (; θsP, θsMs, entropy_ζ) + trans_mMs = StackedArray(transM, size(ζsMs_tr, 1) * size(ζsMs_tr, 3)) + θsP, θsMs_tr = is_infer ? + Test.@inferred(transform_ζs(ζsP, ζsMs_tr; trans_mP, trans_mMs)) : + transform_ζs(ζsP, ζsMs_tr; trans_mP, trans_mMs) + (; θsP, θsMs_tr, entropy_ζ) end @@ -453,12 +469,15 @@ model. The output shape of size `(n_site x n_par x n_MC)` is tailored to iterating each MC sample and then transforming each parameter on block across sites. """ -function generate_ζ(approx::AbstractMeanHVIApproximation, rng::AbstractRNG, +function generate_ζ( + approx::Union{AbstractMeanHVIApproximation, AbstractMeanVarSepHVIApproximation}, + rng::AbstractRNG, g, ϕ::AbstractVector{FT}, xM::MT; int_ϕg_ϕq::AbstractComponentArrayInterpreter, int_ϕq::AbstractComponentArrayInterpreter, n_MC=3, cor_ends, pbm_covar_indices, is_testmode, + i_sites, # = 1:size(xM,2), ) where {FT,MT} # see documentation of neg_elbo_gtf ϕc = int_ϕg_ϕq(CA.getdata(ϕ)) @@ -472,12 +491,13 @@ function generate_ζ(approx::AbstractMeanHVIApproximation, rng::AbstractRNG, xMP0 = _append_each_covars(xM, CA.getdata(μ_ζP), pbm_covar_indices) ϕm0 = g(xMP0, ϕg; is_testmode) μ_ζMs0 = ϕm0 - ζP_resids, ζMs_parfirst_resids, σ = sample_ζresid_norm(approx, rng, ϕm0, ϕq; n_MC, cor_ends, int_ϕq) + ζP_resids, ζMs_parfirst_resids, σ = sample_ζresid_norm(approx, rng, + i_sites, ϕm0, ϕq; n_MC, cor_ends, int_ϕq) ζsP = isempty(μ_ζP) ? ζP_resids : (μ_ζP .+ ζP_resids) # n_par x n_MC if pbm_covar_indices isa SA.SVector{0} # do not need to predict again but just add the residuals to μ_ζP and μ_ζMs #ζsP = μ_ζP .+ ζP_resids # n_par x n_MC # .+ on empty view does not work - ζsMs = permutedims(μ_ζMs0 .+ ζMs_parfirst_resids, (2, 1, 3)) # n_site x n_par x n_MC + ζsMs_tr = permutedims(μ_ζMs0 .+ ζMs_parfirst_resids, (2, 1, 3)) # n_site x n_par x n_MC # if any(ζsMs[:,2,:] .> 80.0) # @show ζsMs # @show ζMs_parfirst_resids @@ -495,9 +515,9 @@ function generate_ζ(approx::AbstractMeanHVIApproximation, rng::AbstractRNG, end # ζsP = stack(map(first, ζst); dims=1) # n_MC x n_par # ζsMs = stack(map(x -> x[2], ζst); dims=1) # n_MC x n_site x n_par - ζsMs = stack(ζsMs_vec) # n_site x n_par x n_MC + ζsMs_tr = stack(ζsMs_vec) # n_site x n_par x n_MC end - ζsP, ζsMs, σ + ζsP, ζsMs_tr, σ end # function _append_PBM_covars(xM, ζP, pbm_covars::NTuple{N,Symbol}) where N @@ -568,6 +588,7 @@ ML-model predcitions of size `(n_θM, n_site)`. ρsP, ρsM, logσ2_ζP, coef_logσ2_ζMs(intercept + slope), """ function sample_ζresid_norm(approx::AbstractHVIApproximation, rng::Random.AbstractRNG, + i_sites, ϕm::AbstractMatrix, ϕq::AbstractVector, args...; n_MC, cor_ends, int_ϕq) @@ -583,17 +604,39 @@ function sample_ζresid_norm(approx::AbstractHVIApproximation, rng::Random.Abstr #z = _create_randn(rng, CA.getdata(ζP), n_MC, n_θP) zP = _create_randn(rng, CA.getdata(ζP), n_MC, n_θP) zMs = _create_randn(rng, CA.getdata(ζP), n_MC, n_θMs) - sample_ζresid_norm(approx, zP, zMs, CA.getdata(ϕm), ϕq, args...; + sample_ζresid_norm(approx, i_sites, zP, zMs, CA.getdata(ϕm), ϕq, args...; cor_ends, int_ϕq=get_concrete(int_ϕq) ) end +""" + get_hybridproblem_correlation_Ms(prob; scenario = Val(())) + +Extract correlation matrix of a problem based on `MeanHVIApproximation`. +At unconstrained parameter scale. +""" +function get_hybridproblem_correlation_Ms(prob::AbstractHybridProblem; + xM = nothing, scenario = Val(())) + UM = get_hybridproblem_cholesky_correlation_Ms(prob; xM, scenario) + UM' * UM +end + +function get_hybridproblem_cholesky_correlation_Ms(prob::AbstractHybridProblem; + xM = nothing, scenario = Val(())) + ϕq = get_hybridproblem_ϕq(prob; scenario) + cor_ends = get_hybridproblem_cor_ends(prob; scenario) + ρsM = ϕq[Val(:ρsM)] + UM = transformU_block_cholesky1(ρsM, cor_ends.M) +end + function sample_ζresid_norm(approx::MeanHVIApproximationMat, + i_sites, zP::AbstractMatrix, zMs::AbstractMatrix, ϕm::TM, ϕq::AbstractVector{T}; int_ϕq=get_concrete(ComponentArrayInterpreter(ϕq)), - cor_ends + cor_ends, + # assume to index into ϕq at the beginning, or provide those indices here ) where {T,TM<:AbstractMatrix{T}} ζMs = ϕm ϕuncc = ϕqc = int_ϕq(CA.getdata(ϕq)) @@ -737,10 +780,10 @@ Transform parameters and compute absolute of determinant of Jacobian of the tran - to constrained θ scale of format (n_site x n_par) """ -function transform_and_logjac_ζ(ζP::AbstractVector, ζMs::AbstractMatrix; +function transform_and_logjac_ζ(ζP::AbstractVector, ζMs_tr::AbstractMatrix; transP::Bijectors.Transform, - transMs::StackedArray=StackedArray(transM, size(ζMs, 1))) - θMs, logjac_M = Bijectors.with_logabsdet_jacobian(transMs, ζMs) + transMs::StackedArray=StackedArray(transM, size(ζMs_tr, 1))) + θMs_tr, logjac_M = Bijectors.with_logabsdet_jacobian(transMs, ζMs_tr) # if !all(isfinite.(θMs)) # @show θMs # @show ζMs @@ -751,8 +794,8 @@ function transform_and_logjac_ζ(ζP::AbstractVector, ζMs::AbstractMatrix; # end # constrain parameters to sqrt of range of numeric type # due to sampling they might exceed the range - θMs = min.(sqrt(floatmax(eltype(θMs))), θMs) - θMs = max.(sqrt(floatmin(eltype(θMs))), θMs) + θMs_tr = min.(sqrt(floatmax(eltype(θMs_tr))), θMs_tr) + θMs_tr = max.(sqrt(floatmin(eltype(θMs_tr))), θMs_tr) θP, logjac_P = if isempty(ζP) ζP, zero(logjac_M) else @@ -761,7 +804,7 @@ function transform_and_logjac_ζ(ζP::AbstractVector, ζMs::AbstractMatrix; θP = max.(sqrt(floatmin(eltype(θP))), θP) θP, logjac_P end - θP, θMs, logjac_P + logjac_M + θP, θMs_tr, logjac_P + logjac_M end """ @@ -769,26 +812,26 @@ Transform parameters - from unconstrained (e.g. log) ζ scale of format ((n_site x n_par) x n_mc) - to constrained θ scale of the same format """ -function transform_ζs(ζsP::AbstractMatrix, ζsMs::AbstractArray; +function transform_ζs(ζsP::AbstractMatrix, ζsMs_tr::AbstractArray; trans_mP::StackedArray=StackedArray(transP, n_MC), trans_mMs::StackedArray=StackedArray(transM, n_MC * n_site_batch) ) # transform to parameter-last that can apply transformations effectively - θsMst = trans_mMs(permutedims(ζsMs, (3, 1, 2))) + θsMs_tr = trans_mMs(permutedims(ζsMs_tr, (3, 1, 2))) # backtransform to n_mc last for efficient mapping - θsMs = permutedims(θsMst, (2, 3, 1)) + θsMs_tr = permutedims(θsMs_tr, (2, 3, 1)) θsPt = trans_mP(ζsP') # Bijectors use copy and copy(ζsP') errors if ζsP is an empty CuArray θsP = θsPt' # θsP = if isempty(ζsP) # # trans_mP(ζsP') of empty array has problems with AD # # copy(ζsP')' # copy of empty array does no harm but ensures type is Adjoint # ζsP # leads to type instability - # #θsMs[1, 1:0, :] # workaround: extract empty matrix from first mc_batch of θsMs not the same type + # #θsMs_tr[1, 1:0, :] # workaround: extract empty matrix from first mc_batch of θsMs_tr not the same type # else # θsPt = trans_mP(ζsP') # θsP = θsPt' # end - θsP, θsMs + θsP, θsMs_tr end function flatten_hybrid_pars(xsP::AbstractMatrix{FT}, xsMs::AbstractArray{FT,3}) where FT diff --git a/src/elbo2.jl b/src/elbo2.jl index 7561159..f6b477c 100644 --- a/src/elbo2.jl +++ b/src/elbo2.jl @@ -1,4 +1,4 @@ -# Re-Implementation of MeanHVIApproximationVec where random numbers are +# Re-Implementation of MeanHVIApproximationMat where random numbers are # generated for each block in the correlation matrix separately. # # Unfortunately, having many smaller matrix multiplications, the derivative @@ -11,11 +11,12 @@ # this implementation is faster on gpu, but slower than the Vec # implementation on CPU (that uses triangular and blocked matrices) # -# Hence, currently, rather use the MeanHVIApproximationVec CPU implementation. +# Hence, currently, rather use the MeanHVIApproximationMat CPU implementation. # for gradient on few sites (1.6ms cpu vs 5.4ms gpu) # and forward runs for many sites (760mus cpu vs 439ms gpu unit!) function sample_ζresid_norm(app::MeanHVIApproximation, + i_sites, zP::AbstractMatrix, zMs::AbstractMatrix, ϕm::TM, ϕq::AbstractVector{T}; int_ϕq=get_concrete(ComponentArrayInterpreter(ϕq)), diff --git a/src/elbo_sepvec.jl b/src/elbo_sepvec.jl new file mode 100644 index 0000000..80ce903 --- /dev/null +++ b/src/elbo_sepvec.jl @@ -0,0 +1,49 @@ +# Similar to MeanHVIApproximationMat +# but own variance parameter for each predicted parameter +function sample_ζresid_norm(approx::MeanVarSepHVIApproximation, + i_sites, + zP::AbstractMatrix, zMs::AbstractMatrix, + ϕm::TM, ϕq::AbstractVector{T}; + int_ϕq=get_concrete(ComponentArrayInterpreter(ϕq)), + cor_ends +) where {T,TM<:AbstractMatrix{T}} + ζMs = ϕm + ϕuncc = ϕqc = int_ϕq(CA.getdata(ϕq)) + ζP = ϕqc[Val(:μP)] + n_θP, n_θMs, (n_θM, n_batch) = length(ζP), length(ζMs), size(ζMs) + # do not create a UpperTriangular Matrix of an AbgeneraGÜUArray in transformU_cholesky1 + ρsP = isempty(ϕuncc[Val(:ρsP)]) ? similar(ϕuncc[Val(:ρsP)]) : ϕuncc[Val(:ρsP)] # required by zygote + UP = transformU_block_cholesky1(ρsP, cor_ends.P) + ρsM = isempty(ϕuncc[Val(:ρsM)]) ? similar(ϕuncc[Val(:ρsM)]) : ϕuncc[Val(:ρsM)] # required by zygote + # cholesky factor of the correlation: diag(UM' * UM) .== 1 + # coefficients ρsM can be larger than 1, still yielding correlations <1 in UM' * UM + UM = transformU_block_cholesky1(ρsM, cor_ends.M) + # + # make that ϕuncc[:logσ2_ζMs] stores the uncertainty for each site currently predicted + logσ2_logMs = ϕuncc[Val(:logσ2_ζMs)][:,i_sites] + logσ2_ζP = vec(CA.getdata(ϕuncc[Val(:logσ2_ζP)])) + # CUDA cannot multiply BlockDiagonal * Diagonal, construct already those blocks + σMs = reshape(exp.(logσ2_logMs ./ 2), n_θM, :) + σP = exp.(logσ2_ζP ./ 2) + # BlockDiagonal does work with CUDA, but not with combination of Zygote and CUDA + # need to construct full matrix for CUDA + Uσ, diagUσ = _compute_choleskyfactor(UP, UM, σP, σMs, n_batch) # inferred only BlockDiagonal + #diagUσ = diag(Uσ)::typeof(σP) # elements of the diagonal: standard deviations + n_MC = size(zP, 1) + # is this multiplication efficient if Uσ is not concrete but only sumtype BlockDiagonal? + urandn = hcat(zP, zMs) + ζ_resids_parfirst = (Uσ' * urandn') #::typeof(urandn) # n_par x n_MC + #ζ_resids_parfirst = (urandn * Uσ)' #::typeof(urandn) # n_par x n_MC + #ζ_resids_parfirst = urandn' * Uσ # n_MC x n_par + # need to handle empty(ζP) explicitly, otherwise Zygote tries to take gradient + ζP_resids = isempty(ζP) ? ζ_resids_parfirst[1:0, :] : ζ_resids_parfirst[1:n_θP, :] + ζMs_parfirst_resids = reshape(ζ_resids_parfirst[(n_θP+1):end, :], n_θM, n_batch, n_MC) + ζP_resids, ζMs_parfirst_resids, diagUσ + # #map(std, eachcol(ζ_resids_parfirst[:, 3:8])) + # ζ_resid = transpose_mPMs_sitefirst(ζ_resids_parfirst; intm_PMs_parfirst) + # #map(std, eachcol(ζ_resid[:, 3:8])) # all ~ 0.1 in sample_ζresid_norm cpu + # #map(std, eachcol(ζ_resid[:, 2 + n_batch .+ (-1:5)])) # all ~ 100, except first two + # # returns AbstractGPUuArrays to either continue on GPU or need to transfer to CPU + # ζ_resid, diagUσ +end + diff --git a/src/gf.jl b/src/gf.jl index df4e27b..a7f0b28 100644 --- a/src/gf.jl +++ b/src/gf.jl @@ -38,9 +38,9 @@ # y = stack(yv) # return(y) # end -# function map_f_each_site(f, θMs::AbstractMatrix, θPs::AbstractMatrix, θFix::AbstractVector, xP, args...; kwargs...) +# function map_f_each_site(f, θMs_tr::AbstractMatrix, θPs::AbstractMatrix, θFix::AbstractVector, xP, args...; kwargs...) # # do not call f with matrix θ, because .* with vectors S1 would go wrong -# yv = map(eachcol(θMs), eachcol(θPs), xP) do θM, θP, xP_site +# yv = map(eachcol(θMs_tr), eachcol(θPs), xP) do θM, θP, xP_site # f(vcat(θP, θM, θFix), xP_site, args...; kwargs...) # end # y = stack(yv) @@ -65,11 +65,11 @@ the sampling step but returns the prediction at the mean in unconstrained space. - `xP`: model drivers for process based model (PBM): Matrix with (n_site_pred) rows. Possibility to override the default from `get_hybridproblem_train_dataloader`. -Returns an NamedTuple `(; y, θMs, θP)` with entries +Returns an NamedTuple `(; y, θMs_tr, θP)` with entries - `y`: Matrix `(n_obs, n_site)` of model predictions. - `θP`: ComponentVector of PBM model parameters that are kept constant across sites. -- `θMs`: ComponentMatrix `(n_site, n_θM)` of PBM model parameters +- `θMs_tr`: ComponentMatrix `(n_site, n_θM)` of PBM model parameters that vary by site. """ function predict_point_hvi(rng, prob::AbstractHybridProblem; scenario=Val(()), @@ -85,11 +85,11 @@ function predict_point_hvi(rng, prob::AbstractHybridProblem; scenario=Val(()), xM = isnothing(xM) ? xM_dl : xM xP = isnothing(xP) ? xP_dl : xP end - y_pred, θMs, θP = gf(prob, xM, xP; scenario, gdevs, is_testmode, kwargs...) + y_pred, θMs_tr, θP = gf(prob, xM, xP; scenario, gdevs, is_testmode, kwargs...) pt = get_hybridproblem_par_templates(prob) θPc = ComponentArrayInterpreter(pt.θP)(θP) - θMsc = ComponentArrayInterpreter((size(θMs,1),), pt.θM)(θMs) - (;y_pred, θMs=θMsc, θP=θPc) + θMsc = ComponentArrayInterpreter((size(θMs_tr,1),), pt.θM)(θMs_tr) + (;y_pred, θMs_tr=θMsc, θP=θPc) end @@ -115,7 +115,7 @@ function gf(prob::AbstractHybridProblem, xM::AbstractMatrix, xP::AbstractMatrix; n_site_pred = size(xP,2) @assert size(xM, 2) == n_site_pred f_batch = get_hybridproblem_PBmodel(prob; scenario) - f = (n_site_pred == n_batch) ? f : create_nsite_applicator(f_batch, n_site_pred) + f = (n_site_pred == n_batch) ? f_batch : create_nsite_applicator(f_batch, n_site_pred) if gdevs.gdev_P isa MLDataDevices.AbstractGPUDevice f_dev = gdevs.gdev_P(f) #fmap(gdevs.gdev_P, f) else @@ -162,17 +162,17 @@ function gf(g::AbstractModelApplicator, transMs, transP, f, xM, xP, ϕg, ζP, # end #xMP = _append_PBM_covars(xM, intP(ζP), pbm_covars) xMP = _append_each_covars(xM, CA.getdata(ζP), pbm_covar_indices) - θMs = gtrans(g, transMs, xMP, ϕg; cdev, is_testmode) + θMs_tr = gtrans(g, transMs, xMP, ϕg; cdev, is_testmode) # transPM = RRuleMonitor("transP", ζP -> transP(ζP)) # θP = transPM(CA.getdata(ζP)) θP = transP(CA.getdata(ζP)) θP_cpu = cdev(θP) - y_pred = f(θP_cpu, θMs, xP) - # fM = RRuleMonitor("f in gf", (θP_cpu) -> f(θP_cpu, θMs, xP), DI.AutoForwardDiff()) + y_pred = f(θP_cpu, θMs_tr, xP) + # fM = RRuleMonitor("f in gf", (θP_cpu) -> f(θP_cpu, θMs_tr, xP), DI.AutoForwardDiff()) # y_pred = fM(θP_cpu) - # fM = RRuleMonitor("f in gf", (θP_cpu, θMs) -> f(θP_cpu, θMs, xP)) - # y_pred = fM(θP_cpu, θMs) # very slow large JvP with θMs - return y_pred, θMs, θP_cpu + # fM = RRuleMonitor("f in gf", (θP_cpu, θMs_tr) -> f(θP_cpu, θMs_tr, xP)) + # y_pred = fM(θP_cpu, θMs_tr) # very slow large JvP with θMs_tr + return y_pred, θMs_tr, θP_cpu end """ @@ -183,24 +183,23 @@ function gtrans(g, transMs, xMP, ϕg; cdev, is_testmode) # TODO remove after removing gf # predict the log of the parameters ϕg = g(xMP, ϕg; is_testmode) - ζMs = ϕg' - ζMs_cpu = cdev(ζMs) - θMs = transMs(ζMs_cpu) - if !all(isfinite.(θMs)) + ζMs_tr = ϕg' + ζMs_tr_cpu = cdev(ζMs_tr) + θMs_tr = transMs(ζMs_tr_cpu) + if !all(isfinite.(θMs_tr)) @info "gtrans: encountered non-finite parameters" - #@show θMs, ζMs_cpu, transMs + #@show θMs_tr, ζMs_cpu, transMs #@show xMP, ϕg, is_testmode #TODO save xMP, ϕg, is_testmode using JLD2 end - θMs - #θMs = reduce(hcat, map(transM, eachcol(ζMs_cpu))) # transform each row + θMs_tr end """ Create a loss function for given - g(x, ϕ): machine learning model - transM: transformation of parameters at unconstrained space -- f(θMs, θP): mechanistic model +- f(θMs_tr, θP): mechanistic model - py: `function(y_pred, y_obs, y_unc)` to compute negative log-likelihood, i.e. cost - intϕ: interpreter attaching axis with components ϕg and ϕP - intP: interpreter attaching axis to ζP = ϕP with components used by f, @@ -220,10 +219,10 @@ The loss function `loss_gf(ϕ, xM, xP, y_o, y_unc, i_sites)` takes and returns a NamedTuple of - `nLjoint`: the negative-log of the joint parameter probability (Likelihood * prior) - `y_pred`: predicted values -- `θMs`, `θP`: PBM-parameters +- `θMs_tr`, `θP`: PBM-parameters - `nLy`: negative log-Likelihood of y_pred -- `neg_log_prior`: negative log-prior of `θMs` and `θP` -- `neg_log_prior`: negative log-prior of `θMs` and `θP` +- `neg_log_prior`: negative log-prior of `θMs_tr` and `θP` +- `neg_log_prior`: negative log-prior of `θMs_tr` and `θP` """ function get_loss_gf(g, transM, transP, f, py, intϕ::AbstractComponentArrayInterpreter, @@ -266,12 +265,12 @@ function get_loss_gf(g, transM, transP, f, py, @show ϕc.ϕP #Main.@infiltrate_main end - y_pred, θMs_pred, θP_pred = gf( + y_pred, θMs_tr_pred, θP_pred = gf( g, transMs, transP, f, xM, xP, CA.getdata(ϕc.ϕg), CA.getdata(ϕc.ϕP), pbm_covar_indices; cdev, is_testmode, kwargs...) #σ = exp.(y_unc ./ 2) #nLy = sum(abs2, (y_pred .- y_o) ./ σ) - nLy = py( y_pred, y_o, y_unc) + nLy = py(y_o, y_pred, y_unc) # logpdf is not typestable for Distribution{Univariate, Continuous} logpdf_t = (prior, θ) -> logpdf(prior, θ)::eltype(θP_pred) logpdf_tv = (prior, θ::AbstractVector) -> begin @@ -279,18 +278,18 @@ function get_loss_gf(g, transM, transP, f, py, end neg_log_prior = # @descend_code_warntype ( - compute_priors_logdensity(priorsP, priorsM, θP_pred, θMs_pred, + compute_priors_logdensity(priorsP, priorsM, θP_pred, θMs_tr_pred, is_omit_priors, zero_prior_logdensity) if !isfinite(neg_log_prior) @info "loss_gf: encountered non-finite prior density" - @show θP_pred, θMs_pred, ϕc.ϕP + @show θP_pred, θMs_tr_pred, ϕc.ϕP error("debug get_loss_gf") end ϕq = eltype(θP_pred)[] # no uncertainty parameters optimized - loss_penalty = floss_penalty(y_pred, θMs_pred, θP_pred, ϕc.ϕg, ϕq) + loss_penalty = floss_penalty(y_pred, θMs_tr_pred, θP_pred, ϕc.ϕg, ϕq) #@show nLy, neg_log_prior, loss_penalty nLjoint_pen = nLy + neg_log_prior + loss_penalty - return (;nLjoint_pen, y_pred, θMs_pred, θP_pred, nLy, neg_log_prior, loss_penalty) + return (;nLjoint_pen, y_pred, θMs_tr_pred, θP_pred, nLy, neg_log_prior, loss_penalty) end end end diff --git a/src/init_hybrid_params.jl b/src/init_hybrid_params.jl index bd9473b..c429e5a 100644 --- a/src/init_hybrid_params.jl +++ b/src/init_hybrid_params.jl @@ -112,6 +112,9 @@ function init_hybrid_ϕunc( hcat, (coef_logσ2_logM for _ in 1:cor_ends.M[end])), ρsP = fill(ρ0, get_cor_count(cor_ends.P)), ρsM = fill(ρ0, get_cor_count(cor_ends.M)), + transM, + θM::CA.ComponentVector, + n_site::Integer = 0, ) where {FT} nt = (; logσ2_ζP, @@ -121,6 +124,49 @@ function init_hybrid_ϕunc( ca = CA.ComponentVector(;nt...)::CA.ComponentVector end +function init_hybrid_ϕunc( + approx::AbstractMeanVarSepHVIApproximation, + cor_ends::NamedTuple, + ρ0::FT = 0.0f0, + logσ2_ζMs::AbstractMatrix{FT} = Array{FT}(undef, 0, 0), + logσ2_ζP::AbstractVector{FT} = fill(FT(-10.0), cor_ends.P[end]), + ρsP = fill(ρ0, get_cor_count(cor_ends.P)), + ρsM = fill(ρ0, get_cor_count(cor_ends.M)); + transM, + θM::CA.ComponentVector, + n_site::Integer, + relerr = 0.01, +) where {FT} + logσ2_ζMs = if isempty(logσ2_ζMs) + # sigma is the relative error of the template of θM + σ = compute_σ_unconstrained(transM, CA.getdata(θM), relerr) + repeat(FT(2) * log.(convert.(FT,σ)), 1, n_site) + else + logσ2_ζMs + end + nt = (; + logσ2_ζP, + logσ2_ζMs, + ρsP, + ρsM) + ca = CA.ComponentVector(;nt...)::CA.ComponentVector +end + +function compute_σ_unconstrained(transM::Stacked, θM, rel_err) + σ = mapreduce(vcat, transM.bs, transM.ranges_in) do b, range_in + θM_sub = θM[range_in] + #b, θM_sub + compute_σ_unconstrained(b, θM_sub, rel_err) + end +end +function compute_σ_unconstrained(::HybridVariationalInference.Exp, θM::AbstractArray{T}, rel_err) where T + σ_single = sqrt.(log.(abs2(convert(T,rel_err)) .+ one(T))) # Wutzler 2020 + fill(σ_single, size(θM)) +end +function compute_σ_unconstrained(::typeof(identity), θM::AbstractArray{T}, rel_err) where T + convert(T,rel_err) .* θM +end + # macro gen_unc(nt) # quote # nt_ev = $(esc(nt)) diff --git a/src/logden_normal.jl b/src/logden_normal.jl index 262adea..1655383 100644 --- a/src/logden_normal.jl +++ b/src/logden_normal.jl @@ -37,6 +37,8 @@ function neg_logden_indep_normal(obs::AbstractArray, μ::AbstractArray, logσ2:: logσ2_fin = logσ2[i_finobs] nlogL = sum( # observations might by NaN for missing σfac .* logσ2_fin .+ abs2.(obs_data .- μ_data) .* exp.(.-logσ2_fin)) / convert(eltype(μ),2) + #Main.@infiltrate_main + return (nlogL) end diff --git a/test/runtests.jl b/test/runtests.jl index 0d110ed..41e0902 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -31,6 +31,8 @@ const GROUP = get(ENV, "GROUP", "All") # defined in in CI.yml @time @safetestset "test_cholesky_structure" include("test_cholesky_structure.jl") #@safetestset "test" include("test/test_sample_zeta.jl") @time @safetestset "test_sample_zeta" include("test_sample_zeta.jl") + #@safetestset "test" include("test/test_init_unc.jl") + @time @safetestset "test_elbo" include("test_init_unc.jl") #@safetestset "test" include("test/test_elbo.jl") @time @safetestset "test_elbo" include("test_elbo.jl") # diff --git a/test/test_HybridProblem.jl b/test/test_HybridProblem.jl index 7505d41..7e55e63 100644 --- a/test/test_HybridProblem.jl +++ b/test/test_HybridProblem.jl @@ -50,9 +50,13 @@ function construct_problem(; scenario::Val{scen}) where scen rng = StableRNG(111) # n_batch = 10 n_site, n_batch = get_hybridproblem_n_site_and_batch(CP.DoubleMM.DoubleMMCase(); scenario) + n_site_test = 60 # dependency on DeoubleMMCase -> take care of changes in covariates - (; xM, θP_true, θMs_true, xP, y_true, y_o, y_unc - ) = gen_hybridproblem_synthetic(rng, DoubleMM.DoubleMMCase(); scenario) + (; xM, θP_true, θMs_true, xP, y_true, y_o, y_unc + ) = gen_hybridproblem_synthetic(rng, DoubleMM.DoubleMMCase(); n_site_test,scenario) + i_test = n_site .+ (1:n_site_test) + test_data = (; xM = xM[:, i_test], xP = xP[:, i_test], y_true = y_true[:, i_test], + y_o = y_o[:, i_test], y_unc = y_unc[:, i_test]) n_covar = size(xM,1) n_input = (:covarK2 ∈ scen) ? n_covar +1 : n_covar g_chain = SimpleChain( @@ -72,8 +76,10 @@ function construct_problem(; scenario::Val{scen}) where scen # MLUtils.DataLoader((xM, xP, y_o, y_unc, i_sites), batchsize=n_batch, partial=false) # end # end + i_train = 1:n_site train_dataloader = MLUtils.DataLoader( - (CA.getdata(xM), CA.getdata(xP), y_o, y_unc, i_sites), batchsize=n_batch, partial=false) + (CA.getdata(xM[:,i_train]), CA.getdata(xP[:,i_train]), y_o[:,i_train], + y_unc[:,i_train], i_sites[i_train]), batchsize=n_batch, partial=false) θall = vcat(θP, θM) priors_dict = Dict{Symbol, Distribution}( keys(θall) .=> fit.(LogNormal, θall, QuantilePoint.(θall .* 3, 0.95))) @@ -89,7 +95,7 @@ function construct_problem(; scenario::Val{scen}) where scen f_batch = PBMSiteApplicator( f_doubleMM; θP, θM, θFix=CA.ComponentVector{FT}(), xPvec=xP[:,1]) - ϕunc0 = init_hybrid_ϕunc(MeanHVIApproximation(), cor_ends, zero(FT)) + ϕunc0 = init_hybrid_ϕunc(MeanHVIApproximation(), cor_ends, zero(FT); θM, transM, n_site) ϕq = CP.update_μP_by_θP(ϕunc0, θP, transP) approx = if (:MeanHVIApproxBlocks ∈ scen) MeanHVIApproximation() @@ -98,7 +104,7 @@ function construct_problem(; scenario::Val{scen}) where scen end HybridProblem(θM, ϕq, g_chain_scaled, ϕg0, f_batch, priors_dict, py, - transM, transP, train_dataloader, n_covar, n_site, n_batch, + transM, transP, train_dataloader, test_data, n_covar, n_site, n_batch; cor_ends, pbm_covars, approx, #ϕunc0, ) @@ -236,7 +242,7 @@ test_with_flux = (scenario) -> begin end)() @test θPo.r0 < 1.5 * θP.r0 @test ϕ.ϕP.K2 < 1.5 * log(θP.K2) - (;y_pred, θMs, θP) = predict_point_hvi(rng, probo; scenario) + (;y_pred, θMs_tr, θP) = tmp = predict_point_hvi(rng, probo; scenario) _,_,y_obs,_ = get_hybridproblem_train_dataloader(prob; scenario).data @test size(y_pred) == size(y_obs) end; @@ -257,7 +263,7 @@ test_with_flux = (scenario) -> begin @test θP.r0 < 1.5 * θPt.r0 @test exp(ϕ.ϕq.μP.K2) == θP.K2 < 1.5 * θP.K2 n_sample_pred = 12 - (; y, θsP, θsMs, entropy_ζ) = predict_hvi(rng, probo; scenario, n_sample_pred); + (; y, θsP, θsMs_tr, entropy_ζ) = predict_hvi(rng, probo; scenario, n_sample_pred); _,_,y_obs,_ = get_hybridproblem_train_dataloader(prob; scenario).data @test size(y) == (size(y_obs)..., n_sample_pred) yc = cdev(y) @@ -304,7 +310,7 @@ test_with_flux_gpu = (scenario) -> begin @test cdev(ϕ.ϕq.ρsM)[1] > 0 @test probo.ϕq == cdev(ϕ.ϕq) n_sample_pred = 22 - (; y, θsP, θsMs) = predict_hvi( + (; y, θsP, θsMs_tr) = predict_hvi( rng, probo; scenario = scenf, n_sample_pred, is_inferred=Val(true)); (_xM, _xP, _y_o, _y_unc, _i_sites) = get_hybridproblem_train_dataloader( prob; scenario).data @@ -323,8 +329,8 @@ test_with_flux_gpu = (scenario) -> begin @test probo.ϕq == cdev(ϕ.ϕq) # predict using problem and its associated dataloader n_sample_pred = 201 - (; y, θsP, θsMs) = predict_hvi(rng, probo; scenario = scenf, n_sample_pred); - # to inspect correlations among θP and θMs construct ComponentVector + (; y, θsP, θsMs_tr) = predict_hvi(rng, probo; scenario = scenf, n_sample_pred); + # to inspect correlations among θP and θMs_tr construct ComponentVector # TODO redo get_int_PMst_site # get_ca_int_PMs = let # function get_ca_int_PMs_inner(n_site) @@ -334,7 +340,7 @@ test_with_flux_gpu = (scenario) -> begin # end # end int_mPMs = stack_ca_int(Val((n_sample_pred,)), get_int_PMst_site(hpints)) - θs = int_mPMs(CP.flatten_hybrid_pars(θsP, θsMs)) + θs = int_mPMs(CP.flatten_hybrid_pars(θsP, θsMs_tr)) mean_θ = CA.ComponentVector(vec(mean(CA.getdata(θs), dims=1)), last(CA.getaxes(θs))) mean_θ.Ms sd_θ = CA.ComponentVector(vec(std(CA.getdata(θs), dims=1)), last(CA.getaxes(θs))) @@ -377,7 +383,7 @@ test_with_flux_gpu = (scenario) -> begin ); @test resopt.u isa GPUArraysCore.AbstractGPUVector n_sample_pred = 11 - (; y, θsP, θsMs) = predict_hvi( + (; y, θsP, θsMs_tr) = predict_hvi( rng, probo; scenario = scenf, n_sample_pred,is_inferred = Val(true)); # @test cdev(ϕ.ϕq.ρsM)[1] > 0 # too few iterations end; diff --git a/test/test_doubleMM.jl b/test/test_doubleMM.jl index ec29691..2684f05 100644 --- a/test/test_doubleMM.jl +++ b/test/test_doubleMM.jl @@ -185,11 +185,11 @@ end #histogram(ϕg_opt1) # all similar magnitude around zero #first(ϕg_opt1,5) pred = loss_g(ϕg_opt1, xM_batch, g, transMs) - θMs_pred = θMs_pred_1 = pred[2] - #scatterplot(vec(θMs_true_tb), vec(θMs_pred)) - #@test cor(vec(θMs_true), vec(θMs_pred)) > 0.9 - @test cor(θMs_true_tb[:, 1], θMs_pred[:, 1]) > 0.9 - @test cor(θMs_true_tb[:, 2], θMs_pred[:, 2]) > 0.9 + θMs_tr_pred = θMs_pred_1 = pred[2] + #scatterplot(vec(θMs_true_tb), vec(θMs_tr_pred)) + #@test cor(vec(θMs_true), vec(θMs_tr_pred)) > 0.9 + @test cor(θMs_true_tb[:, 1], θMs_tr_pred[:, 1]) > 0.9 + @test cor(θMs_true_tb[:, 2], θMs_tr_pred[:, 2]) > 0.9 end end @@ -243,14 +243,14 @@ end #optprob, Adam(0.02), callback = callback_loss(100), maxiters = 5000); optprob, Adam(0.02), maxiters = 2000) - (;nLjoint_pen, y_pred, θMs_pred, θP_pred, nLy, neg_log_prior, loss_penalty) = loss_gf_site( + (;nLjoint_pen, y_pred, θMs_tr_pred, θP_pred, nLy, neg_log_prior, loss_penalty) = loss_gf_site( res.u, train_loader.data...; is_testmode=true) - #(nLjoint, y_pred, θMs_pred, θP, nLy, neg_log_prior, loss_penalty) = loss_gf(p0, xM, xP, y_o, y_unc); - θMs_pred = CA.ComponentArray(θMs_pred, CA.getaxes(θMs_true')) + #(nLjoint, y_pred, θMs_tr_pred, θP, nLy, neg_log_prior, loss_penalty) = loss_gf(p0, xM, xP, y_o, y_unc); + θMs_tr_pred = CA.ComponentArray(θMs_tr_pred, CA.getaxes(θMs_true')) #TODO @test isapprox(par_templates.θP, intϕ(res.u).ϕP, rtol = 0.15) - #@test cor(vec(θMs_true), vec(θMs_pred)) > 0.8 - @test cor(θMs_true'[:, 1], θMs_pred[:, 1]) > 0.8 - @test cor(θMs_true'[:, 2], θMs_pred[:, 2]) > 0.8 + #@test cor(vec(θMs_true), vec(θMs_tr_pred)) > 0.8 + @test cor(θMs_true'[:, 1], θMs_tr_pred[:, 1]) > 0.8 + @test cor(θMs_true'[:, 2], θMs_tr_pred[:, 2]) > 0.8 # started from low values -> increased but not too much above true values # logpdf.(priorsP, θP_pred) # logpdf.(priorsP, par_templates.θP) @@ -258,9 +258,9 @@ end () -> begin #@usingany UnicodePlots - scatterplot(θMs_true'[:,1], θMs_pred[:,1]) - scatterplot(θMs_true'[:,2], θMs_pred[:,2]) - scatterplot(log.(vec(θMs_true')), log.(vec(θMs_pred))) + scatterplot(θMs_true'[:,1], θMs_tr_pred[:,1]) + scatterplot(θMs_true'[:,2], θMs_tr_pred[:,2]) + scatterplot(log.(vec(θMs_true')), log.(vec(θMs_tr_pred))) scatterplot(vec(y_pred), vec(y_o)) hcat(par_templates.θP, intϕ(p0).ϕP, intϕ(res.u).ϕP, transP(intϕ(p0).ϕP), θP_pred) end diff --git a/test/test_elbo.jl b/test/test_elbo.jl index 79d218f..c92ea3d 100644 --- a/test/test_elbo.jl +++ b/test/test_elbo.jl @@ -28,10 +28,10 @@ const prob = DoubleMM.DoubleMMCase() scenario = Val((:default,)) #scenario = Val((:covarK2,)) -const approx = MeanHVIApproximationMat() -#const approx = MeanHVIApproximation() +#approx = MeanHVIApproximationMat() +#approx = MeanVarSepHVIApproximation() -test_scenario = (scenario) -> begin +test_scenario = (scenario, approx) -> begin probc = HybridProblem(prob; scenario, approx); FT = get_hybridproblem_float_type(probc; scenario) par_templates = get_hybridproblem_par_templates(probc; scenario) @@ -74,7 +74,7 @@ test_scenario = (scenario) -> begin # transP = elementwise(exp) # transM = Stacked(elementwise(identity), elementwise(exp)) #transM = Stacked(elementwise(identity), elementwise(exp), elementwise(exp)) # test mismatch - ϕq0 = init_hybrid_ϕq(approx, par_templates.θP, par_templates.θM, transP, cor_ends) + ϕq0 = init_hybrid_ϕq(approx, par_templates.θP, par_templates.θM, transP, cor_ends; transM, n_site) # ϕunc0 = init_hybrid_ϕunc(cor_ends, zero(FT)) # ϕq0 = CP.update_μP_by_θP(ϕunc0, θP_true, transP) (; ϕ, interpreters) = init_hybrid_params(ϕg0, ϕq0) @@ -94,11 +94,13 @@ test_scenario = (scenario) -> begin g_gpu = ggdev(g_flux) end - ζsP, ζsMs, σ = @inferred ( + i_sites = 1:n_batch + ζsP, ζsMs_tr, σ = @inferred ( # @descend_code_warntype ( CP.generate_ζ( - approx, rng, g, ϕ_ini, xM[:, 1:n_batch]; + approx, rng, g, ϕ_ini, xM[:, i_sites]; n_MC, cor_ends, pbm_covar_indices, + i_sites, int_ϕq=interpreters.ϕq, int_ϕg_ϕq=interpreters.ϕg_ϕq, is_testmode = false) ) @@ -108,22 +110,23 @@ test_scenario = (scenario) -> begin # approx, rng, g, ϕ_ini, xMtest[:, 1:n_batch], map(get_concrete, interpreters); # n_MC = 8, cor_ends, pbm_covar_indices) @test ζsP isa AbstractMatrix - @test ζsMs isa AbstractArray + @test ζsMs_tr isa AbstractArray @test size(ζsP) == (n_θP, n_MC) - @test size(ζsMs) == (n_batch, n_θM, n_MC) + @test size(ζsMs_tr) == (n_batch, n_θM, n_MC) gr = Zygote.gradient( ϕ -> begin - _ζsP, _ζsMs, _σ = CP.generate_ζ( - approx, rng, g, ϕ, xM[:, 1:n_batch]; + _ζsP, _ζsMs_tr, _σ = CP.generate_ζ( + approx, rng, g, ϕ, xM[:, i_sites]; + i_sites, n_MC=8, cor_ends, pbm_covar_indices, int_ϕq=interpreters.ϕq, int_ϕg_ϕq=interpreters.ϕg_ϕq, is_testmode = true) - sum(_ζsP) + sum(_ζsMs) + sum(_σ) + sum(_ζsP) + sum(_ζsMs_tr) + sum(_σ) end, CA.getdata(ϕ_ini)) @test gr[1] isa Vector end - if !(:covarK2 ∈ CP._val_value(scenario)) + if !(:covarK2 ∈ CP._val_value(scenario)) && (approx isa MeanHVIApproximation) # can only test distribution if g is not repeated @testset "generate_ζ check sd residuals $(last(CP._val_value(scenario)))" begin # prescribe very different uncertainties @@ -155,23 +158,25 @@ test_scenario = (scenario) -> begin #hcat(ϕ_ini, ϕ, _ϕ)[1:4,:] #hcat(ϕ_ini, ϕ, _ϕ)[(end-20):end,:] n_predict = 10_000 #8_000 - xM_batch = xM[:, 1:n_batch] - _ζsP, _ζsMs, _σ = @inferred ( + i_sites = 1:n_batch + xM_batch = xM[:, i_sites] + _ζsP, _ζsMs_tr, _σ = @inferred ( # @descend_code_warntype ( CP.generate_ζ( approx, rng, g, _ϕ, xM_batch; + i_sites, n_MC = n_predict, cor_ends, pbm_covar_indices, int_ϕq=interpreters.ϕq, int_ϕg_ϕq=interpreters.ϕg_ϕq, is_testmode = true) ) ζMs_g = g(xM_batch, probc.ϕg)' # have been generated with no scaling - function test_distζ(_ζsP, _ζsMs, ϕunc_true, ζMs_g) + function test_distζ(_ζsP, _ζsMs_tr, ϕunc_true, ζMs_g) mP = mean(_ζsP; dims=2) residP = _ζsP .- mP sdP = vec(std(residP; dims=2)) _sd_ζP_true = sqrt.(exp.(ϕunc_true.logσ2_ζP)) @test isapprox(sdP, _sd_ζP_true; rtol=0.05) - mMs = mean(_ζsMs; dims=3)[:,:,1] + mMs = mean(_ζsMs_tr; dims=3)[:,:,1] hcat(mMs, ζMs_g) # @usingany UnicodePlots #scatterplot(ζMs_g[:,1], mMs[:,1]) @@ -183,7 +188,7 @@ test_scenario = (scenario) -> begin @test isapprox(mMs[:,ipar], ζMs_g[:,ipar]; rtol=0.1) end #ζMs_true = stack(map(inverse(transM), eachcol(CA.getdata(θMs_true[:,1:n_batch]))))' - residMs = _ζsMs .- mMs + residMs = _ζsMs_tr .- mMs sdMs = std(residMs; dims=3)[:,:,1] # (_a,_b), mMi = first(zip( # eachcol(ϕunc_true.coef_logσ2_ζMs), eachcol(mMs))) @@ -214,20 +219,20 @@ test_scenario = (scenario) -> begin @test cor_PMs[5,6] ≈ ρsM_true[1] atol=0.02 @test all(.≈(cor_PMs[5:6,7:end], 0.0, atol=0.1)) # no correlations M1, M2 end - test_distζ(_ζsP, _ζsMs, ϕunc_true, ζMs_g) + test_distζ(_ζsP, _ζsMs_tr, ϕunc_true, ζMs_g) @testset "predict_hvi check sd" begin # test if uncertainty and reshaping is propagated # here inverse the predicted θs and then test distribution probcu = HybridProblem(probc, ϕq=ϕq_true); n_sample_pred = 10_000 #2_400 #n_sample_pred = 400 - (; y, θsP, θsMs, entropy_ζ) = predict_hvi(rng, probcu; scenario, n_sample_pred); + (; y, θsP, θsMs_tr, entropy_ζ) = predict_hvi(rng, probcu; scenario, n_sample_pred); #size(_ζsMs), size(θsMs) #size(_ζsP), size(θsP) trans_minvP = StackedArray(inverse(transP), n_sample_pred) _ζsP2 = trans_minvP(θsP) int_minvM = StackedArray(inverse(transM), n_site) - _ζsMs2 = stack(map(eachslice(θsMs; dims=3)) do _θMs + _ζsMs2 = stack(map(eachslice(θsMs_tr; dims=3)) do _θMs int_minvM(_θMs) end) ζMs_g2 = g(xM, probcu.ϕg)' # have been generated with no scaling @@ -241,29 +246,31 @@ test_scenario = (scenario) -> begin ϕ = ggdev(CA.getdata(ϕ_ini)) @test g_gpu.μ isa GPUArraysCore.AbstractGPUArray # @test g_gpu.app isa HybridVariationalInferenceFluxExt.FluxApplicator - xMg_batch = ggdev(xM[:, 1:n_batch]) - ζsP_d, ζsMs_d, σ_d = @inferred ( + xMg_batch = ggdev(xM[:, i_sites]) + ζsP_d, ζsMs_tr_d, σ_d = @inferred ( # @descend_code_warntype ( CP.generate_ζ( approx, rng, g_gpu, ϕ, xMg_batch; + i_sites, n_MC, cor_ends, pbm_covar_indices, int_ϕq=interpreters.ϕq, int_ϕg_ϕq=interpreters.ϕg_ϕq, is_testmode = true)) @test ζsP_d isa Union{GPUArraysCore.AbstractGPUMatrix, LinearAlgebra.Adjoint{FT,<:GPUArraysCore.AbstractGPUMatrix}} - @test ζsMs_d isa Union{GPUArraysCore.AbstractGPUArray, + @test ζsMs_tr_d isa Union{GPUArraysCore.AbstractGPUArray, LinearAlgebra.Adjoint{FT,<:GPUArraysCore.AbstractGPUArray}} - @test eltype(ζsP_d) == eltype(ζsMs_d) == FT + @test eltype(ζsP_d) == eltype(ζsMs_tr_d) == FT @test size(ζsP_d) == (n_θP, n_MC) - @test size(ζsMs_d) == (n_batch, n_θM, n_MC) + @test size(ζsMs_tr_d) == (n_batch, n_θM, n_MC) gr = Zygote.gradient( ϕ -> begin - _ζsP, _ζsMs, _σ = CP.generate_ζ( + _ζsP, _ζsMs_tr, _σ = CP.generate_ζ( approx, rng, g_gpu, ϕ, xMg_batch; + i_sites, n_MC, cor_ends, pbm_covar_indices, int_ϕq=interpreters.ϕq, int_ϕg_ϕq=interpreters.ϕg_ϕq, is_testmode = false) - sum(_ζsP) + sum(_ζsMs) + sum(_σ) + sum(_ζsP) + sum(_ζsMs_tr) + sum(_σ) end, CA.getdata(ϕ)) @test gr[1] isa GPUArraysCore.AbstractGPUVector end @@ -288,24 +295,24 @@ test_scenario = (scenario) -> begin # @test size(θsP) == (n_MC, n_θP) # @test size(θsMs) == (n_MC, n_batch, n_θM) # map by rows - ζP, ζMs = ζsP[:, 1], ζsMs[:, :, 1] + ζP, ζMs = ζsP[:, 1], ζsMs_tr[:, :, 1] n_site_batch = size(ζMs, 1) transMs = StackedArray(transM, n_site_batch) - θP, θMs, logjac = @inferred CP.transform_and_logjac_ζ(ζP, ζMs; transP, transMs) + θP, θMs_tr, logjac = @inferred CP.transform_and_logjac_ζ(ζP, ζMs; transP, transMs) @test size(θP) == (n_θP,) - @test size(θMs) == (n_site_batch, n_θM) + @test size(θMs_tr) == (n_site_batch, n_θM) @test θP == transP(ζP) - @test θMs[1, :] == transM(ζMs[1, :]) - @test θMs[end, :] == transM(ζMs[end, :]) + @test θMs_tr[1, :] == transM(ζMs[1, :]) + @test θMs_tr[end, :] == transM(ζMs[end, :]) if ggdev isa MLDataDevices.AbstractGPUDevice ζPdev, ζMsdev = ggdev.((ζP, ζMs)) - θP, θMs, logjac = @inferred CP.transform_and_logjac_ζ( + θP, θMs_tr, logjac = @inferred CP.transform_and_logjac_ζ( ζPdev, ζMsdev; transP, transMs) @test size(θP) == (n_θP,) - @test size(θMs) == (n_site_batch, n_θM) + @test size(θMs_tr) == (n_site_batch, n_θM) gr = Zygote.gradient(ζPdev, ζMsdev) do ζPdev, ζMsdev - θP, θMs, logjac = CP.transform_and_logjac_ζ(ζPdev, ζMsdev; transP, transMs) - sum(θP) + sum(θMs) + logjac + θP, θMs_tr, logjac = CP.transform_and_logjac_ζ(ζPdev, ζMsdev; transP, transMs) + sum(θP) + sum(θMs_tr) + logjac end @test eltype(gr[1]) == eltype(ζPdev) @test eltype(gr[2]) == eltype(ζMsdev) @@ -313,27 +320,27 @@ test_scenario = (scenario) -> begin end @testset "transform_ζs $(last(CP._val_value(scenario)))" begin - n_site_batch, _, n_MC = size(ζsMs) + n_site_batch, _, n_MC = size(ζsMs_tr) trans_mP = StackedArray(transP, n_MC) #trans_mP = StackedArray(Stacked((identity,),(1:n_θP,)), n_MC) trans_mMs = StackedArray(transM, n_MC * n_site_batch) - θsP, θsMs = @inferred CP.transform_ζs(ζsP, ζsMs; trans_mP, trans_mMs) + θsP, θsMs_tr = @inferred CP.transform_ζs(ζsP, ζsMs_tr; trans_mP, trans_mMs) #@descend_code_warntype CP.transform_ζs(ζsP, ζsMs; trans_mP, trans_mMs) @test size(θsP) == (n_θP, n_MC) - @test size(θsMs) == (n_site_batch, n_θM, n_MC) + @test size(θsMs_tr) == (n_site_batch, n_θM, n_MC) @test θsP[:, 1] == transP(ζsP[:, 1]) @test θsP[:, end] == transP(ζsP[:, end]) - @test θsMs[1, :, 1] == transM(ζsMs[1, :, 1]) # first parameter - @test θsMs[end, :, 1] == transM(ζsMs[end, :, 1]) - @test θsMs[1, :, end] == transM(ζsMs[1, :, end]) # last parameter - @test θsMs[end, :, end] == transM(ζsMs[end, :, end]) + @test θsMs_tr[1, :, 1] == transM(ζsMs_tr[1, :, 1]) # first parameter + @test θsMs_tr[end, :, 1] == transM(ζsMs_tr[end, :, 1]) + @test θsMs_tr[1, :, end] == transM(ζsMs_tr[1, :, end]) # last parameter + @test θsMs_tr[end, :, end] == transM(ζsMs_tr[end, :, end]) if ggdev isa MLDataDevices.AbstractGPUDevice - ζsPdev, ζsMsdev = ggdev.((ζsP, ζsMs)) + ζsPdev, ζsMsdev = ggdev.((ζsP, ζsMs_tr)) #trans_mP(ζsPdev) - θsP, θsMs = @inferred CP.transform_ζs(ζsPdev, ζsMsdev; trans_mP, trans_mMs) + θsP, θsMs_tr = @inferred CP.transform_ζs(ζsPdev, ζsMsdev; trans_mP, trans_mMs) gr = Zygote.gradient(ζsPdev, ζsMsdev) do ζsPdev, ζsMsdev - θsP, θsMs = CP.transform_ζs(ζsPdev, ζsMsdev; trans_mP, trans_mMs) - sum(θsP) + sum(θsMs) + θsP, θsMs_tr = CP.transform_ζs(ζsPdev, ζsMsdev; trans_mP, trans_mMs) + sum(θsP) + sum(θsMs_tr) end @test eltype(gr[1]) == eltype(ζsPdev) @test eltype(gr[2]) == eltype(ζsMsdev) @@ -342,7 +349,7 @@ test_scenario = (scenario) -> begin @testset "neg_elbo_gtf cpu $(last(CP._val_value(scenario)))" begin i_sites = 1:n_batch - transMs = StackedArray(transM, size(ζsMs, 1)) + transMs = StackedArray(transM, size(ζsMs_tr, 1)) cost = @inferred ( #@descend_code_warntype ( neg_elbo_gtf(rng, ϕ_ini, g, f, py, @@ -371,7 +378,7 @@ test_scenario = (scenario) -> begin if ggdev isa MLDataDevices.AbstractGPUDevice @testset "neg_elbo_gtf gpu $(last(CP._val_value(scenario)))" begin i_sites = 1:n_batch - transMs = StackedArray(transM, size(ζsMs, 1)) + transMs = StackedArray(transM, size(ζsMs_tr, 1)) ϕ = ggdev(CA.getdata(ϕ_ini)) xMg_batch = ggdev(xM[:, i_sites]) xP_batch = xP[:, i_sites] # used in f which runs on CPU @@ -408,10 +415,11 @@ test_scenario = (scenario) -> begin # @test length(intm_PMs_gen) == 402 # @test trans_PMs_gen.length_in == 402 n_sample_pred = 30 - (; θsP, θsMs, entropy_ζ) = + (; θsP, θsMs_tr, entropy_ζ) = #Cthulhu.@descend_code_warntype ( @inferred ( sample_posterior(rng, g, ϕ_ini, xM; + i_sites = 1:size(xM, 2), int_ϕg_ϕq, int_ϕq, transP, transM, cdev = identity, @@ -421,12 +429,12 @@ test_scenario = (scenario) -> begin ) ) @test θsP isa AbstractMatrix - @test θsMs isa AbstractArray{T,3} where {T} + @test θsMs_tr isa AbstractArray{T,3} where {T} int_mP = ComponentArrayInterpreter(int_P, (size(θsP, 2),)) θsPc = int_mP(θsP) @test all(θsPc[:r0, :] .> 0) # - y = @inferred f_pred(θsP, θsMs, xP) + y = @inferred f_pred(θsP, θsMs_tr, xP) @test y isa Array @test size(y) == (size(y_o)..., n_sample_pred) end @@ -436,7 +444,7 @@ test_scenario = (scenario) -> begin ϕ_ini_g = ggdev(CA.getdata(ϕ_ini)) xMg = ggdev(xM) n_sample_pred = 30 - (; θsP, θsMs, entropy_ζ) = + (; θsP, θsMs_tr, entropy_ζ) = #Cthulhu.@descend_code_warntype ( @inferred ( sample_posterior(rng, g_gpu, ϕ_ini_g, xMg; @@ -451,13 +459,13 @@ test_scenario = (scenario) -> begin ) # this variant without the problem, does not attach axes @test θsP isa AbstractMatrix - @test θsMs isa AbstractArray{T,3} where {T} + @test θsMs_tr isa AbstractArray{T,3} where {T} int_mP = ComponentArrayInterpreter(int_P, (size(θsP, 2),)) @test all(int_mP(θsP)[:r0, :] .> 0) # xP_dev = ggdev(xP); f_pred_dev = ggdev(f_pred) #fmap(ggdev, f_pred) - y = @inferred f_pred_dev(θsP, θsMs, xP_dev) + y = @inferred f_pred_dev(θsP, θsMs_tr, xP_dev) #@benchmark f_pred_dev(θsP, θsMs, xP_dev) @test y isa GPUArraysCore.AbstractGPUArray @test size(y) == (size(y_o)..., n_sample_pred) @@ -490,7 +498,8 @@ test_scenario = (scenario) -> begin end # test_scenario -test_scenario(Val((:default,))) +test_scenario(Val((:default,)), MeanHVIApproximationMat()) +test_scenario(Val((:default,)), MeanVarSepHVIApproximation()) # with providing process parameter as additional covariate -test_scenario(Val((:covarK2,))) +test_scenario(Val((:covarK2,)), MeanHVIApproximationMat()) diff --git a/test/test_init_unc.jl b/test/test_init_unc.jl new file mode 100644 index 0000000..1f063f0 --- /dev/null +++ b/test/test_init_unc.jl @@ -0,0 +1,29 @@ +#using LinearAlgebra, BlockDiagonals +using LinearAlgebra + +using Test +using HybridVariationalInference +using HybridVariationalInference: HybridVariationalInference as CP +using HybridVariationalInference: HybridVariationalInference as HVI +using StableRNGs +using Random +using ComponentArrays: ComponentArrays as CA +using Bijectors + +# using Zygote +# import GPUArraysCore: GPUArraysCore +# #import CUDA, cuDNN +# using MLDataDevices + +@testset "compute_σ_unconstrained" begin + FT = Float32 + ζM = rand(FT, 5) + rel_err = 0.1 + transM = Stacked((HVI.Exp(),identity),(1:2,3:5)) + θM = transM(ζM) + σ = @inferred CP.compute_σ_unconstrained(transM, θM, rel_err) + @test σ[1] == σ[2] ≈ FT(sqrt(log(rel_err^2 + 1.0))) # exp only depends on rel_err + @test all(σ[3:5] .≈ FT(rel_err) .* θM[3:5]) + @test eltype(σ) == eltype(θM) +end + diff --git a/test/test_missingdriver.jl b/test/test_missingdriver.jl index 36ec2df..b8247b3 100644 --- a/test/test_missingdriver.jl +++ b/test/test_missingdriver.jl @@ -96,7 +96,7 @@ function test_driverNaN(scenario::Val{scen}) where scen scenario, ); @test all(isfinite.(ϕ)) - (;y_pred, θMs, θP) = predict_point_hvi(rng, probo; scenario); + (;y_pred, θMs_tr, θP) = predict_point_hvi(rng, probo; scenario); _,_,y_obs,_ = get_hybridproblem_train_dataloader(prob; scenario).data @test size(y_pred) == size(y_obs) y_predc = cdev(y_pred) @@ -112,7 +112,7 @@ function test_driverNaN(scenario::Val{scen}) where scen ); @test all(isfinite.(probo.θP)) n_sample_pred = 12 - (; y, θsP, θsMs, entropy_ζ) = predict_hvi(rng, probo; scenario, n_sample_pred); + (; y, θsP, θsMs_tr, entropy_ζ) = predict_hvi(rng, probo; scenario, n_sample_pred); @test size(y) == (size(y_pred)..., n_sample_pred) yc = cdev(y) _ = map(eachslice(yc; dims = 3)) do ycs diff --git a/test/test_no_globals.jl b/test/test_no_globals.jl index 719c373..8ac64df 100644 --- a/test/test_no_globals.jl +++ b/test/test_no_globals.jl @@ -31,7 +31,7 @@ function test_no_globals(scenario::Val{scen}) where scen scenario, ); @test all(isfinite.(ϕ)) - (;y_pred, θMs, θP) = predict_point_hvi(rng, probo; scenario); + (;y_pred, θMs_tr, θP) = predict_point_hvi(rng, probo; scenario); _,_,y_obs,_ = get_hybridproblem_train_dataloader(prob; scenario).data @test size(y_pred) == size(y_obs) y_predc = cdev(y_pred) @@ -48,7 +48,7 @@ function test_no_globals(scenario::Val{scen}) where scen ); @test all(isfinite.(CP.get_hybridproblem_θP(probo))) n_sample_pred = 12 - (; y, θsP, θsMs, entropy_ζ) = predict_hvi(rng, probo; scenario, n_sample_pred); + (; y, θsP, θsMs_tr, entropy_ζ) = predict_hvi(rng, probo; scenario, n_sample_pred); @test size(y) == (size(y_pred)..., n_sample_pred) yc = cdev(y) _ = map(eachslice(yc; dims = 3)) do ycs diff --git a/test/test_sample_zeta.jl b/test/test_sample_zeta.jl index 86991fc..2c27982 100644 --- a/test/test_sample_zeta.jl +++ b/test/test_sample_zeta.jl @@ -55,6 +55,10 @@ function test_with_scenario(scenario) Ms=θMs_true) ϕ_true = CA.ComponentVector(Ms = θMs_true, ϕq=ϕq_true) ϕ_cpu = CA.ComponentVector(Ms = θMs_true .+ FT(0.01), ϕq=ϕq) + # initial estimate of error in θMs of 2% of true value + ϕ_cpu_sepvar = CA.ComponentVector(Ms = θMs_true, + ϕq = CA.ComponentVector(ϕ_cpu.ϕq; + logσ2_ζMs = 2 .* log.(0.02 * θMs_true .+ FT(0.01)))) interpreters = (; pmu=ComponentArrayInterpreter(ϕ_true), ϕq=ComponentArrayInterpreter(ϕq) @@ -90,13 +94,15 @@ function test_with_scenario(scenario) # approx = MeanHVIApproximation() # approx = MeanHVIApproximationMat() # approx = CP.MeanHVIApproximationDev() + # approx = MeanVarSepHVIApproximation() function test_sample_ζresid_norm(approx) - ϕc = copy(ϕ_cpu) + ϕc = approx isa MeanVarSepHVIApproximation ? copy(ϕ_cpu_sepvar) : copy(ϕ_cpu) ϕc.ϕq.coef_logσ2_ζMs[1,:] .= (log ∘ abs2).((0.1, 100.0)) ϕc.ϕq.ρsM .= 0.0 int_ϕq = get_concrete(ComponentArrayInterpreter(ϕc.ϕq)) n_MC_pred = 300 # larger n_MC to test σ2 n_site_batch = size(ϕc.Ms,2) + i_sites = 1:n_site_batch #rng = StableRNG(111) # @inferred gives any, while Cthulhu inferres concrete type # ζP_resids, ζMs_parfirst_resids, σ = @inferred CP.sample_ζresid_norm(approx, rng, ϕc.Ms, ϕc.ϕq; @@ -105,7 +111,9 @@ function test_with_scenario(scenario) # n_MC=n_MC_pred, cor_ends, int_ϕq)) # ζP_resids, ζMs_parfirst_resids, σ = CP.sample_ζresid_norm(approx, rng, ϕc.P, ϕc.Ms, ϕc.ϕq; # n_MC=n_MC_pred, cor_ends, int_ϕq) - ζP_resids, ζMs_parfirst_resids, σ = @inferred CP.sample_ζresid_norm(approx, rng, ϕc.Ms, ϕc.ϕq; + i_sites = 1:n_site_batch + ζP_resids, ζMs_parfirst_resids, σ = @inferred CP.sample_ζresid_norm( + approx, rng, i_sites, ϕc.Ms, ϕc.ϕq; n_MC=n_MC_pred, cor_ends, int_ϕq) #@code_warntype CP.sample_ζresid_norm(approx, rng, ϕc.Ms, ϕc.ϕq; n_MC=n_MC_pred, cor_ends, int_ϕq) #@usingany Cthulhu @@ -117,7 +125,7 @@ function test_with_scenario(scenario) gr = Zygote.gradient(ϕc -> begin ζP_resids, ζMs_parfirst_resids, σ = CP.sample_ζresid_norm( - approx, rng, ϕc.Ms, ϕc.ϕq; + approx, rng, i_sites, ϕc.Ms, ϕc.ϕq; n_MC, cor_ends, int_ϕq) sum(ζP_resids) + sum(ζMs_parfirst_resids) end, ϕc)[1] @@ -130,9 +138,16 @@ function test_with_scenario(scenario) # isapprox(std(xc.Ms[:,1,1]), 0.1, rtol = 0.1) # site 1 parameter 1 # isapprox(std(xc.Ms[:,:,1]), 0.1, rtol = 0.1) # parameter 1 # isapprox(std(xc.Ms[:,:,2]), 100.1, rtol = 0.1) # parameter 2 - isapprox(std(ζMs_parfirst_resids[1,1,:]), 0.1, rtol = 0.1) # site 1 parameter 1 - isapprox(std(ζMs_parfirst_resids[1,:,:]), 0.1, rtol = 0.1) # parameter 1 - isapprox(std(ζMs_parfirst_resids[2,:,:]), 100.1, rtol = 0.1) # parameter 2 + if approx isa MeanVarSepHVIApproximation + isapprox(std(ζMs_parfirst_resids[1,1,:]), exp(ϕc.ϕq.logσ2_ζMs[1,1]/2), rtol = 0.1) # site 1 parameter 1 + isapprox(std(ζMs_parfirst_resids[1,end,:]), exp(ϕc.ϕq.logσ2_ζMs[1,end]/2), rtol = 0.1) # site 1 parameter 1 + isapprox(std(ζMs_parfirst_resids[end,1,:]), exp(ϕc.ϕq.logσ2_ζMs[end,1]/2), rtol = 0.1) # site 1 parameter 1 + isapprox(std(ζMs_parfirst_resids[end,end,:]), exp(ϕc.ϕq.logσ2_ζMs[end,end]/2), rtol = 0.1) # site 1 parameter 1 + else + isapprox(std(ζMs_parfirst_resids[1,1,:]), 0.1, rtol = 0.1) # site 1 parameter 1 + isapprox(std(ζMs_parfirst_resids[1,:,:]), 0.1, rtol = 0.1) # parameter 1 + isapprox(std(ζMs_parfirst_resids[2,:,:]), 100.1, rtol = 0.1) # parameter 2 + end # if ggdev isa MLDataDevices.AbstractGPUDevice @testset "sample_ζresid_norm gpu" begin @@ -149,8 +164,9 @@ function test_with_scenario(scenario) # ζP_resids, ζMs_parfirst_resids, σ = CP.sample_ζresid_norm( # approx, rng, CA.getdata(ϕcd.Ms), CA.getdata(ϕcd.ϕq); # n_MC = n_MC_pred, cor_ends, int_ϕq) + i_sites = 1:n_site_batch ζP_resids, ζMs_parfirst_resids, σ = @inferred CP.sample_ζresid_norm( - approx, rng, CA.getdata(ϕcd.Ms), CA.getdata(ϕcd.ϕq); + approx, rng, i_sites, CA.getdata(ϕcd.Ms), CA.getdata(ϕcd.ϕq); n_MC = n_MC_pred, cor_ends, int_ϕq) #@descend_code_warntype CP.sample_ζresid_norm(rng, CA.getdata(ϕcd.Ms), CA.getdata(ϕcd.ϕq); n_MC = n_MC_pred, cor_ends, int_ϕq) @test ζP_resids isa GPUArraysCore.AbstractGPUArray @@ -180,26 +196,26 @@ function test_with_scenario(scenario) () -> begin CP.sample_ζresid_norm( #@benchmark CP.sample_ζresid_norm( - approx, rng, ϕc.Ms, ϕc.ϕq; + approx, rng, i_sites, ϕc.Ms, ϕc.ϕq; n_MC, cor_ends, int_ϕq) # CP.sample_ζresid_norm( #@benchmark CP.sample_ζresid_norm( - approx, rng, ϕcd.Ms, ϕcd.ϕq; + approx, rng, i_sites, ϕcd.Ms, ϕcd.ϕq; n_MC, cor_ends, int_ϕq) # ϕc_few = CA.ComponentVector(ϕc; Ms = ϕc.Ms[:,1:n_site_few]); Zygote.gradient(ϕc -> begin #@benchmark Zygote.gradient(ϕc -> begin # many small allocs ζP_resids, ζMs_parfirst_resids, σ = CP.sample_ζresid_norm( - approx, rng, ϕc.Ms, ϕc.ϕq; + approx, rng, i_sites, ϕc.Ms, ϕc.ϕq; n_MC, cor_ends, int_ϕq) sum(ζP_resids) + sum(ζMs_parfirst_resids) end, ϕc_few)[1] Zygote.gradient(ϕc -> begin # many small allocs #@benchmark Zygote.gradient(ϕc -> begin # many small allocs ζP_resids, ζMs_parfirst_resids, σ = CP.sample_ζresid_norm( - approx, rng, CA.getdata(ϕc.Ms), CA.getdata(ϕc.ϕq); + approx, rng, i_sites, CA.getdata(ϕc.Ms), CA.getdata(ϕc.ϕq); n_MC, cor_ends, int_ϕq) sum(ζP_resids) + sum(ζMs_parfirst_resids) end, ϕcd_few)[1] @@ -219,6 +235,12 @@ function test_with_scenario(scenario) approx = MeanHVIApproximation() test_sample_ζresid_norm(approx) end + + @testset "sample_ζresid_norm MeanVarSepHVIApproximation $(last(CP._val_value(scenario)))" begin + approx = MeanVarSepHVIApproximation() + test_sample_ζresid_norm(approx) + end + end @testset "default scenario" begin @@ -226,6 +248,12 @@ end test_with_scenario(scenario) end +@testset "sepvar" begin + scenario = Val((:sepvar,)) + test_with_scenario(scenario) +end + + @testset "noglobals scenario" begin scenario = Val((:no_globals,)) test_with_scenario(scenario)