diff --git a/Manifest.toml b/Manifest.toml deleted file mode 100644 index adde889..0000000 --- a/Manifest.toml +++ /dev/null @@ -1,2757 +0,0 @@ -# This file is machine-generated - editing it directly is not advised - -julia_version = "1.11.7" -manifest_format = "2.0" -project_hash = "4955dfdbb7a233ddefa69e3cce2833f416ffe1bc" - -[[deps.ANSIColoredPrinters]] -git-tree-sha1 = "574baf8110975760d391c710b6341da1afa48d8c" -uuid = "a4c015fc-c6ff-483c-b24f-f7ea428134e9" -version = "0.0.1" - -[[deps.ATK_jll]] -deps = ["Artifacts", "Glib_jll", "JLLWrappers", "Libdl"] -git-tree-sha1 = "c0a10eaf3a7e1e909ef8fe45971a73524bfce1bf" -uuid = "7b86fcea-f67b-53e1-809c-8f1719c154e8" -version = "2.38.1+0" - -[[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 = "3b86719127f50670efe356bc11073d84b4ed7a5d" -uuid = "7d9f7c33-5ae7-4f3b-8dc6-eff91059b697" -version = "0.1.42" - - [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.ArgParse]] -deps = ["Logging", "TextWrap"] -git-tree-sha1 = "22cf435ac22956a7b45b0168abbc871176e7eecc" -uuid = "c7e460c6-2fb9-53a9-8c5b-16f535851c63" -version = "1.2.0" - -[[deps.ArgTools]] -uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" -version = "1.1.2" - -[[deps.ArnoldiMethod]] -deps = ["LinearAlgebra", "Random", "StaticArrays"] -git-tree-sha1 = "d57bd3762d308bded22c3b82d033bff85f6195c6" -uuid = "ec485272-7323-5ecc-a04f-4719b315124d" -version = "0.4.0" - -[[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.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.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.Bessels]] -git-tree-sha1 = "4435559dc39793d53a9e3d278e185e920b4619ef" -uuid = "0e736298-9ec6-45e8-9647-e4fc86a2fe38" -version = "0.2.8" - -[[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.BufferedStreams]] -git-tree-sha1 = "6863c5b7fc997eadcabdbaf6c5f201dc30032643" -uuid = "e1450e63-4bb3-523b-b2a4-4ffa8c0fd77d" -version = "1.2.2" - -[[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.CSTParser]] -deps = ["Tokenize"] -git-tree-sha1 = "0157e592151e39fa570645e2b2debcdfb8a0f112" -uuid = "00ebfdb7-1f24-5e51-bd34-a7502290713f" -version = "3.4.3" - -[[deps.CSV]] -deps = ["CodecZlib", "Dates", "FilePathsBase", "InlineStrings", "Mmap", "Parsers", "PooledArrays", "PrecompileTools", "SentinelArrays", "Tables", "Unicode", "WeakRefStrings", "WorkerUtilities"] -git-tree-sha1 = "deddd8725e5e1cc49ee205a1964256043720a6c3" -uuid = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b" -version = "0.10.15" - -[[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 = "9bd45574379e50579a78774334f4a1f1238c0af5" -uuid = "13f3f980-e62b-5c42-98c6-ff1f3baf88f0" -version = "0.13.10" - -[[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 = "fde3bf89aead2e723284a8ff9cdf5b551ed700e8" -uuid = "83423d85-b0ee-5818-9007-b63ccbeb887a" -version = "1.18.5+0" - -[[deps.CatIndices]] -deps = ["CustomUnitRanges", "OffsetArrays"] -git-tree-sha1 = "a0f80a09780eed9b1d106a1bf62041c2efc995bc" -uuid = "aafaddc9-749c-510e-ac4f-586e18779b91" -version = "0.2.2" - -[[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.ChunkCodecCore]] -git-tree-sha1 = "51f4c10ee01bda57371e977931de39ee0f0cdb3e" -uuid = "0b6fb165-00bc-4d37-ab8b-79f91016dbe1" -version = "1.0.0" - -[[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.Clustering]] -deps = ["Distances", "LinearAlgebra", "NearestNeighbors", "Printf", "Random", "SparseArrays", "Statistics", "StatsBase"] -git-tree-sha1 = "3e22db924e2945282e70c33b75d4dde8bfa44c94" -uuid = "aaaa29a8-35af-508c-8bc3-b662a17a0fe5" -version = "0.15.8" - -[[deps.CodeTracking]] -deps = ["InteractiveUtils", "UUIDs"] -git-tree-sha1 = "9ce926a33a8608421a4d45c012884165b3fcd3ee" -uuid = "da1fd8a2-8d9e-5ec2-8556-3022fb5608a2" -version = "2.0.2" - -[[deps.CodecBase]] -deps = ["TranscodingStreams"] -git-tree-sha1 = "40956acdbef3d8c7cc38cba42b56034af8f8581a" -uuid = "6c391c72-fb7b-5838-ba82-7cfb1bcfecbf" -version = "0.3.4" - -[[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 = "b10d0b65641d57b8b4d5e234446582de5047050d" -uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f" -version = "0.11.5" - -[[deps.ColorVectorSpace]] -deps = ["ColorTypes", "FixedPointNumbers", "LinearAlgebra", "Requires", "Statistics", "TensorCore"] -git-tree-sha1 = "a1f44953f2382ebb937d60dafbe2deea4bd23249" -uuid = "c3611d14-8923-5661-9e6a-0046d554d3a4" -version = "0.10.0" -weakdeps = ["SpecialFunctions"] - - [deps.ColorVectorSpace.extensions] - SpecialFunctionsExt = "SpecialFunctions" - -[[deps.Colors]] -deps = ["ColorTypes", "FixedPointNumbers", "Reexport"] -git-tree-sha1 = "362a287c3aa50601b0bc359053d5c2468f0e7ce0" -uuid = "5ae59095-9a9b-59fe-a467-6f913c188581" -version = "0.12.11" - -[[deps.CommonMark]] -deps = ["Crayons", "PrecompileTools"] -git-tree-sha1 = "5fdf00d1979fd4883b44b754fc3423175c9504b4" -uuid = "a80b9123-70ca-4bc0-993e-6e3bcb318db6" -version = "0.8.16" - -[[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.Compiler]] -git-tree-sha1 = "382d79bfe72a406294faca39ef0c3cef6e6ce1f1" -uuid = "807dbc54-b67e-4c79-8afb-eafe4df6f2e1" -version = "0.1.1" - -[[deps.CompilerSupportLibraries_jll]] -deps = ["Artifacts", "Libdl"] -uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" -version = "1.1.1+0" - -[[deps.CompositionsBase]] -git-tree-sha1 = "802bb88cd69dfd1509f6670416bd4434015693ad" -uuid = "a33af91c-f02d-484b-be07-31d278c5ca2b" -version = "0.1.2" -weakdeps = ["InverseFunctions"] - - [deps.CompositionsBase.extensions] - CompositionsBaseInverseFunctionsExt = "InverseFunctions" - -[[deps.ComputationalResources]] -git-tree-sha1 = "52cb3ec90e8a8bea0e62e275ba577ad0f74821f7" -uuid = "ed09eef8-17a6-5b46-8889-db040fac31e3" -version = "0.3.2" - -[[deps.ConcurrentUtilities]] -deps = ["Serialization", "Sockets"] -git-tree-sha1 = "d9d26935a0bcffc87d2613ce14c527c99fc543fd" -uuid = "f0e56b4a-5159-44fe-b623-3e5288b988bb" -version = "2.5.0" - -[[deps.Configurations]] -deps = ["ExproniconLite", "OrderedCollections", "TOML"] -git-tree-sha1 = "4358750bb58a3caefd5f37a4a0c5bfdbbf075252" -uuid = "5218b696-f38b-4ac9-8b61-a12ec717816d" -version = "0.17.6" - -[[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.ContinuousWavelets]] -deps = ["AbstractFFTs", "Documenter", "FFTW", "Interpolations", "LinearAlgebra", "SpecialFunctions", "Wavelets"] -git-tree-sha1 = "6e883d34f7040ab2ec36c60c738ae53864819508" -uuid = "96eb917e-2868-4417-9cb6-27e7ff17528f" -version = "1.1.7" - -[[deps.Contour]] -git-tree-sha1 = "439e35b0b36e2e5881738abc8857bd92ad6ff9a8" -uuid = "d38c429a-6771-53c6-b99e-75d170b6e991" -version = "0.6.3" - -[[deps.ConvexHulls2d]] -deps = ["LinearAlgebra"] -git-tree-sha1 = "cd7759cfeaf855fed46ec26a26fb323ac3a5501e" -uuid = "438b5665-92b0-42e6-bc36-e4ac8449fa2d" -version = "0.1.1" -weakdeps = ["Makie"] - - [deps.ConvexHulls2d.extensions] - ConvexHulls2dMakieExt = "Makie" - -[[deps.CoordinateTransformations]] -deps = ["LinearAlgebra", "StaticArrays"] -git-tree-sha1 = "a692f5e257d332de1e554e4566a4e5a8a72de2b2" -uuid = "150eb455-5306-5404-9cee-2592286d6298" -version = "0.6.4" - -[[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.CustomUnitRanges]] -git-tree-sha1 = "1a3f97f907e6dd8983b744d2642651bb162a3f7a" -uuid = "dc8bdbbb-1ca9-579f-8c36-e416f6a65cce" -version = "1.0.2" - -[[deps.DSP]] -deps = ["Bessels", "FFTW", "IterTools", "LinearAlgebra", "Polynomials", "Random", "Reexport", "SpecialFunctions", "Statistics"] -git-tree-sha1 = "5989debfc3b38f736e69724818210c67ffee4352" -uuid = "717857b8-e6f2-59f4-9121-6e50c889abd2" -version = "0.8.4" -weakdeps = ["OffsetArrays"] - - [deps.DSP.extensions] - OffsetArraysExt = "OffsetArrays" - -[[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 = ["Compat", "InteractiveUtils", "OrderedCollections"] -git-tree-sha1 = "4e1fe97fdaed23e9dc21d4d664bea76b65fc50a0" -uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" -version = "0.18.22" - -[[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.DelaunayTriangulation]] -deps = ["AdaptivePredicates", "EnumX", "ExactPredicates", "Random"] -git-tree-sha1 = "783b21581a051ac91a3921ee37e26a23ed7f57a6" -uuid = "927a84f5-c5f4-47a5-9785-b46e178433df" -version = "1.6.5" - -[[deps.DelimitedFiles]] -deps = ["Mmap"] -git-tree-sha1 = "9e2f36d3c96a820c678f2f1f1782582fcf685bae" -uuid = "8bb1440f-4735-579b-a4ab-409b98df4dab" -version = "1.9.1" - -[[deps.Distances]] -deps = ["LinearAlgebra", "Statistics", "StatsAPI"] -git-tree-sha1 = "c7e3a542b999843086e2f29dac96a618c105be1d" -uuid = "b4f34e82-e78d-54a5-968a-f98e89d6e8f7" -version = "0.10.12" -weakdeps = ["ChainRulesCore", "SparseArrays"] - - [deps.Distances.extensions] - DistancesChainRulesCoreExt = "ChainRulesCore" - DistancesSparseArraysExt = "SparseArrays" - -[[deps.Distributed]] -deps = ["Random", "Serialization", "Sockets"] -uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" -version = "1.11.0" - -[[deps.Distributions]] -deps = ["AliasTables", "FillArrays", "LinearAlgebra", "PDMats", "Printf", "QuadGK", "Random", "SpecialFunctions", "Statistics", "StatsAPI", "StatsBase", "StatsFuns"] -git-tree-sha1 = "3bc002af51045ca3b47d2e1787d6ce02e68b943a" -uuid = "31c24e10-a181-5473-b8eb-7969acd0382f" -version = "0.25.122" - - [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.Documenter]] -deps = ["ANSIColoredPrinters", "AbstractTrees", "Base64", "CodecZlib", "Dates", "DocStringExtensions", "Downloads", "Git", "IOCapture", "InteractiveUtils", "JSON", "Logging", "Markdown", "MarkdownAST", "Pkg", "PrecompileTools", "REPL", "RegistryInstances", "SHA", "TOML", "Test", "Unicode"] -git-tree-sha1 = "70c521ca3a23c576e12655d15963977c9766c26b" -uuid = "e30172f5-a6a5-5a46-863b-614d45cd2de4" -version = "1.16.0" - -[[deps.DotEnv]] -deps = ["PrecompileTools"] -git-tree-sha1 = "92e88cb68a5b10545234f46dfaeb2fa8a8a50c45" -uuid = "4dc1fcf4-5e3b-5448-94ab-0c38ec0385c1" -version = "1.0.0" - -[[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 = "bddad79635af6aec424f53ed8aad5d7555dc6f00" -uuid = "4e289a0a-7415-4d19-859d-a7e5c4648b56" -version = "1.0.5" - -[[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.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.EzXML]] -deps = ["Printf", "XML2_jll"] -git-tree-sha1 = "7ea1aa5869e2626ccae84480e4f37185bc6f41d3" -uuid = "8f5d6c58-4d21-5cfd-889c-e3ad7ee6a615" -version = "1.2.3" - -[[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 = "eaa040768ea663ca695d442be1bc97edfe6824f2" -uuid = "b22a6f82-2f65-5046-a5b2-351ab43fb4e5" -version = "6.1.3+0" - -[[deps.FFTViews]] -deps = ["CustomUnitRanges", "FFTW"] -git-tree-sha1 = "cbdf14d1e8c7c8aacbe8b19862e0179fd08321c2" -uuid = "4f61f5a4-77b1-5117-aa51-3ab5ef4ef0cd" -version = "0.3.2" - -[[deps.FFTW]] -deps = ["AbstractFFTs", "FFTW_jll", "Libdl", "LinearAlgebra", "MKL_jll", "Preferences", "Reexport"] -git-tree-sha1 = "97f08406df914023af55ade2f843c39e99c5d969" -uuid = "7a1cc6ca-52ef-59f5-83cd-3a7055c09341" -version = "1.10.0" - -[[deps.FFTW_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "6d6219a004b8cf1e0b4dbe27a2860b8e04eba0be" -uuid = "f5851436-0d7a-5f13-b9de-f02708fd171a" -version = "3.3.11+0" - -[[deps.FileIO]] -deps = ["Pkg", "Requires", "UUIDs"] -git-tree-sha1 = "d60eb76f37d7e5a40cc2e7c36974d864b82dc802" -uuid = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" -version = "1.17.1" -weakdeps = ["HTTP"] - - [deps.FileIO.extensions] - HTTPExt = "HTTP" - -[[deps.FilePaths]] -deps = ["FilePathsBase", "MacroTools", "Reexport", "Requires"] -git-tree-sha1 = "919d9412dbf53a2e6fe74af62a73ceed0bce0629" -uuid = "8fc22ac5-c921-52a6-82fd-178b2807b824" -version = "0.8.3" - -[[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 = "5bfcd42851cf2f1b303f51525a54dc5e98d408a3" -uuid = "1a297f60-69ca-5386-bcde-b61e274b549b" -version = "1.15.0" -weakdeps = ["PDMats", "SparseArrays", "Statistics"] - - [deps.FillArrays.extensions] - FillArraysPDMatsExt = "PDMats" - FillArraysSparseArraysExt = "SparseArrays" - 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.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.Future]] -deps = ["Random"] -uuid = "9fa8497b-333b-5362-9e8d-4d0656e87820" -version = "1.11.0" - -[[deps.GLFW]] -deps = ["GLFW_jll"] -git-tree-sha1 = "40412e58ec374029de3d4ad7c13e1a52aa1e149f" -uuid = "f7f18e0c-5ee9-5ccd-a5bf-e8befd85ed98" -version = "3.4.5" - -[[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 = "fcb0584ff34e25155876418979d4c8971243bb89" -uuid = "0656b61e-2033-5cc2-a64a-77c0f6c09b89" -version = "3.4.0+2" - -[[deps.GLMakie]] -deps = ["ColorTypes", "Colors", "FileIO", "FixedPointNumbers", "FreeTypeAbstraction", "GLFW", "GeometryBasics", "LinearAlgebra", "Makie", "Markdown", "MeshIO", "ModernGL", "Observables", "PrecompileTools", "Printf", "ShaderAbstractions", "StaticArrays"] -git-tree-sha1 = "d16b3b912164f0fd90a393e8c3b6f5a4ec073fde" -uuid = "e9467ef8-e4e7-5192-8a1a-b1aee30e663a" -version = "0.11.11" - -[[deps.GMP_jll]] -deps = ["Artifacts", "Libdl"] -uuid = "781609d7-10c4-51f6-84f2-b8444358ff6d" -version = "6.3.0+0" - -[[deps.GTK3_jll]] -deps = ["ATK_jll", "Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "FriBidi_jll", "Glib_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl", "Libepoxy_jll", "Pango_jll", "Pkg", "Wayland_jll", "Xorg_libX11_jll", "Xorg_libXcomposite_jll", "Xorg_libXcursor_jll", "Xorg_libXdamage_jll", "Xorg_libXext_jll", "Xorg_libXfixes_jll", "Xorg_libXi_jll", "Xorg_libXinerama_jll", "Xorg_libXrandr_jll", "Xorg_libXrender_jll", "at_spi2_atk_jll", "gdk_pixbuf_jll", "iso_codes_jll", "xkbcommon_jll"] -git-tree-sha1 = "b080a592525632d287aee4637a62682576b7f5e4" -uuid = "77ec8976-b24b-556a-a1bf-49a033a670a6" -version = "3.24.31+0" - -[[deps.GarishPrint]] -deps = ["Configurations", "Preferences"] -git-tree-sha1 = "41136d24cc02c4d7c2b8c8982823fedac66d0a45" -uuid = "b0ab02a7-8576-43f7-aa76-eaa7c3897c54" -version = "0.5.1" - -[[deps.Genie]] -deps = ["ArgParse", "Base64", "Dates", "Distributed", "DotEnv", "EzXML", "FilePathsBase", "HTTP", "HttpCommon", "Inflector", "JSON3", "JuliaFormatter", "Logging", "LoggingExtras", "LoweredCodeUtils", "MIMEs", "Markdown", "Millboard", "Nettle", "OrderedCollections", "Pkg", "REPL", "Random", "Reexport", "Revise", "SHA", "Serialization", "Sockets", "UUIDs", "Unicode", "XML2_jll", "YAML"] -git-tree-sha1 = "86356a37e97b135ee86ec1f0e1dd8fc52830dcff" -uuid = "c43c736e-a2d1-11e8-161f-af95117fbd1e" -version = "5.33.17" - -[[deps.GenieAutoReload]] -deps = ["Distributed", "Genie", "Logging", "Revise"] -git-tree-sha1 = "d2c018ae2b097631c09a09d9e88cf551e3a378fc" -uuid = "c6228e60-a24f-11e9-1776-c313472ebacc" -version = "2.2.5" - -[[deps.GenieDevTools]] -deps = ["Dates", "Genie", "RemoteREPL", "Revise", "Stipple", "StippleUI", "Tables"] -git-tree-sha1 = "5c84de04cde55e272e760e7ef021bb645f53bd67" -uuid = "4e5d9629-6565-4102-a9ff-45c707eb060e" -version = "2.12.1" - -[[deps.GenieFramework]] -deps = ["GarishPrint", "Genie", "GenieAutoReload", "GenieDevTools", "GeniePackageManager", "Reexport", "Revise", "Stipple", "StipplePivotTable", "StipplePlotly", "StippleTable", "StippleTabs", "StippleUI"] -git-tree-sha1 = "4dcc51e8dbaf7d02ba80a2dbebc7b05eb477cc03" -uuid = "a59fdf5c-6bf0-4f5d-949c-a137c9e2f353" -version = "2.10.0" - -[[deps.GeniePackageManager]] -deps = ["Base64", "Genie", "Pkg"] -git-tree-sha1 = "3e0a96753f53eab0d15ad837ef1a3742389c928b" -uuid = "3bdcc7f3-4b7d-42a1-be8e-724ecf5e3574" -version = "1.1.0" - -[[deps.GenieSession]] -deps = ["Dates", "Genie", "HTTP", "Logging", "Random", "SHA"] -git-tree-sha1 = "936838b4eccdd5a2b62b695558d5dbc1f5f56560" -uuid = "03cc5b98-4f21-4eb6-99f2-22eced81f962" -version = "1.1.2" - -[[deps.GenieSessionFileSession]] -deps = ["Genie", "GenieSession", "Logging", "Serialization"] -git-tree-sha1 = "5f5ffc33251d0d5f110072f7a0c07717c9453c97" -uuid = "5c4fdc26-39e3-47cf-9034-e533e09961c2" -version = "1.1.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.Git]] -deps = ["Git_LFS_jll", "Git_jll", "JLLWrappers", "OpenSSH_jll"] -git-tree-sha1 = "824a1890086880696fc908fe12a17bcf61738bd8" -uuid = "d7ba0133-e1db-5d97-8f8c-041e4b3a1eb2" -version = "1.5.0" - -[[deps.Git_LFS_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "bb8471f313ed941f299aa53d32a94ab3bee08844" -uuid = "020c3dae-16b3-5ae5-87b3-4cb189e250b2" -version = "3.7.0+0" - -[[deps.Git_jll]] -deps = ["Artifacts", "Expat_jll", "JLLWrappers", "LibCURL_jll", "Libdl", "Libiconv_jll", "OpenSSL_jll", "PCRE2_jll", "Zlib_jll"] -git-tree-sha1 = "b6a684587ebe896d9f68ae777f648205940f0f70" -uuid = "f8c6e375-362e-5223-8a59-34ff63f689eb" -version = "2.51.3+0" - -[[deps.Glib_jll]] -deps = ["Artifacts", "GettextRuntime_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Libiconv_jll", "Libmount_jll", "PCRE2_jll", "Zlib_jll"] -git-tree-sha1 = "50c11ffab2a3d50192a228c313f05b5b5dc5acb2" -uuid = "7746bdde-850d-59dc-9ae8-88ece973131d" -version = "2.86.0+0" - -[[deps.Glob]] -git-tree-sha1 = "97285bbd5230dd766e9ef6749b80fc617126d496" -uuid = "c27321d9-0574-5035-807b-f59d2c89b15c" -version = "1.3.1" - -[[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.Graphs]] -deps = ["ArnoldiMethod", "DataStructures", "Distributed", "Inflate", "LinearAlgebra", "Random", "SharedArrays", "SimpleTraits", "SparseArrays", "Statistics"] -git-tree-sha1 = "7a98c6502f4632dbe9fb1973a4244eaa3324e84d" -uuid = "86223c79-3864-5bf0-83f7-82e725a168b6" -version = "1.13.1" - -[[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.HistogramThresholding]] -deps = ["ImageBase", "LinearAlgebra", "MappedArrays"] -git-tree-sha1 = "7194dfbb2f8d945abdaf68fa9480a965d6661e69" -uuid = "2c695a8d-9458-5d45-9878-1b8a99cf7853" -version = "0.3.1" - -[[deps.HostCPUFeatures]] -deps = ["BitTwiddlingConvenienceFunctions", "IfElse", "Libdl", "Static"] -git-tree-sha1 = "8e070b599339d622e9a081d17230d74a5c473293" -uuid = "3e5b6fbb-0976-4d2c-9146-d79de83f2fb0" -version = "0.1.17" - -[[deps.HttpCommon]] -deps = ["Dates", "Nullables", "Test", "URIParser"] -git-tree-sha1 = "46313284237aa6ca67a6bce6d6fbd323d19cff59" -uuid = "77172c1b-203f-54ac-aa54-3f1198fe9f90" -version = "0.5.0" - -[[deps.HypergeometricFunctions]] -deps = ["LinearAlgebra", "OpenLibm_jll", "SpecialFunctions"] -git-tree-sha1 = "68c173f4f449de5b438ee67ed0c9c748dc31a2ec" -uuid = "34004b35-14d8-5ef3-9330-4cdb6864b03a" -version = "0.3.28" - -[[deps.IOCapture]] -deps = ["Logging", "Random"] -git-tree-sha1 = "0ee181ec08df7d7c911901ea38baf16f755114dc" -uuid = "b5f81e59-6552-4d32-b1f0-c071b021bf89" -version = "1.0.0" - -[[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.ImageBinarization]] -deps = ["HistogramThresholding", "ImageCore", "LinearAlgebra", "Polynomials", "Reexport", "Statistics"] -git-tree-sha1 = "33485b4e40d1df46c806498c73ea32dc17475c59" -uuid = "cbc4b850-ae4b-5111-9e64-df94c024a13d" -version = "0.3.1" - -[[deps.ImageComponentAnalysis]] -deps = ["AbstractTrees", "ConvexHulls2d", "DataFrames", "DataStructures", "ImageFiltering", "LeftChildRightSiblingTrees", "LinearAlgebra", "OffsetArrays", "Parameters", "StaticArrays"] -git-tree-sha1 = "0f1e954d54bafec3df4aa9d1ce1f110e311a9043" -uuid = "d9b9e9a0-1569-11e9-2cb5-bbca914b0e89" -version = "0.2.2" - -[[deps.ImageContrastAdjustment]] -deps = ["ImageBase", "ImageCore", "ImageTransformations", "Parameters"] -git-tree-sha1 = "eb3d4365a10e3f3ecb3b115e9d12db131d28a386" -uuid = "f332f351-ec65-5f6a-b3d1-319c6670881a" -version = "0.3.12" - -[[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.ImageCorners]] -deps = ["ImageCore", "ImageFiltering", "PrecompileTools", "StaticArrays", "StatsBase"] -git-tree-sha1 = "24c52de051293745a9bad7d73497708954562b79" -uuid = "89d5987c-236e-4e32-acd0-25bd6bd87b70" -version = "0.1.3" - -[[deps.ImageDistances]] -deps = ["Distances", "ImageCore", "ImageMorphology", "LinearAlgebra", "Statistics"] -git-tree-sha1 = "08b0e6354b21ef5dd5e49026028e41831401aca8" -uuid = "51556ac3-7006-55f5-8cb3-34580c88182d" -version = "0.2.17" - -[[deps.ImageFiltering]] -deps = ["CatIndices", "ComputationalResources", "DataStructures", "FFTViews", "FFTW", "ImageBase", "ImageCore", "LinearAlgebra", "OffsetArrays", "PrecompileTools", "Reexport", "SparseArrays", "StaticArrays", "Statistics", "TiledIteration"] -git-tree-sha1 = "52116260a234af5f69969c5286e6a5f8dc3feab8" -uuid = "6a3955dd-da59-5b1f-98d4-e7296123deb5" -version = "0.7.12" - -[[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.ImageMagick]] -deps = ["FileIO", "ImageCore", "ImageMagick_jll", "InteractiveUtils"] -git-tree-sha1 = "8e64ab2f0da7b928c8ae889c514a52741debc1c2" -uuid = "6218d12a-5da1-5696-b52f-db25d2ecc6d1" -version = "1.4.2" - -[[deps.ImageMagick_jll]] -deps = ["Artifacts", "Bzip2_jll", "FFTW_jll", "Ghostscript_jll", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Libtiff_jll", "OpenJpeg_jll", "Zlib_jll", "Zstd_jll", "libpng_jll", "libwebp_jll", "libzip_jll"] -git-tree-sha1 = "d670e8e3adf0332f57054955422e85a4aec6d0b0" -uuid = "c73af94c-d91f-53ed-93a7-00f77d67a9d7" -version = "7.1.2005+0" - -[[deps.ImageMetadata]] -deps = ["AxisArrays", "ImageAxes", "ImageBase", "ImageCore"] -git-tree-sha1 = "2a81c3897be6fbcde0802a0ebe6796d0562f63ec" -uuid = "bc367c6b-8a6b-528e-b4bd-a4b897500b49" -version = "0.9.10" - -[[deps.ImageMorphology]] -deps = ["DataStructures", "ImageCore", "LinearAlgebra", "LoopVectorization", "OffsetArrays", "Requires", "TiledIteration"] -git-tree-sha1 = "cffa21df12f00ca1a365eb8ed107614b40e8c6da" -uuid = "787d08f9-d448-5407-9aad-5290dd7ab264" -version = "0.4.6" - -[[deps.ImageQualityIndexes]] -deps = ["ImageContrastAdjustment", "ImageCore", "ImageDistances", "ImageFiltering", "LazyModules", "OffsetArrays", "PrecompileTools", "Statistics"] -git-tree-sha1 = "783b70725ed326340adf225be4889906c96b8fd1" -uuid = "2996bd0c-7a13-11e9-2da2-2f5ce47296a9" -version = "0.3.7" - -[[deps.ImageSegmentation]] -deps = ["Clustering", "DataStructures", "Distances", "Graphs", "ImageCore", "ImageFiltering", "ImageMorphology", "LinearAlgebra", "MetaGraphs", "RegionTrees", "SimpleWeightedGraphs", "StaticArrays", "Statistics"] -git-tree-sha1 = "7196039573b6f312864547eb7a74360d6c0ab8e6" -uuid = "80713f31-8817-5129-9cf8-209ff8fb23e1" -version = "1.9.0" - -[[deps.ImageShow]] -deps = ["Base64", "ColorSchemes", "FileIO", "ImageBase", "ImageCore", "OffsetArrays", "StackViews"] -git-tree-sha1 = "3b5344bcdbdc11ad58f3b1956709b5b9345355de" -uuid = "4e3cecfd-b093-5904-9786-8bbb286a6a31" -version = "0.3.8" - -[[deps.ImageTransformations]] -deps = ["AxisAlgorithms", "CoordinateTransformations", "ImageBase", "ImageCore", "Interpolations", "OffsetArrays", "Rotations", "StaticArrays"] -git-tree-sha1 = "dfde81fafbe5d6516fb864dc79362c5c6b973c82" -uuid = "02fcd773-0e25-5acc-982a-7f6622650795" -version = "0.10.2" - -[[deps.Images]] -deps = ["Base64", "FileIO", "Graphics", "ImageAxes", "ImageBase", "ImageBinarization", "ImageContrastAdjustment", "ImageCore", "ImageCorners", "ImageDistances", "ImageFiltering", "ImageIO", "ImageMagick", "ImageMetadata", "ImageMorphology", "ImageQualityIndexes", "ImageSegmentation", "ImageShow", "ImageTransformations", "IndirectArrays", "IntegralArrays", "Random", "Reexport", "SparseArrays", "StaticArrays", "Statistics", "StatsBase", "TiledIteration"] -git-tree-sha1 = "a49b96fd4a8d1a9a718dfd9cde34c154fc84fcd5" -uuid = "916415d5-f1e6-5110-898d-aaa5f9f070e0" -version = "0.26.2" - -[[deps.Imath_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "0936ba688c6d201805a83da835b55c61a180db52" -uuid = "905a6f67-0a94-5f89-b386-d35d92009cd1" -version = "3.1.11+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.Inflector]] -deps = ["Unicode"] -git-tree-sha1 = "c82a172a07c94887709e613cc67cec0b472fb742" -uuid = "6d011eab-0732-4556-8808-e463c76bf3b6" -version = "1.1.0" - -[[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.IntegralArrays]] -deps = ["ColorTypes", "FixedPointNumbers", "IntervalSets"] -git-tree-sha1 = "b842cbff3f44804a84fda409745cc8f04c029a20" -uuid = "1d092043-8f09-5a30-832f-7509e371ab51" -version = "0.1.6" - -[[deps.IntelOpenMP_jll]] -deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl"] -git-tree-sha1 = "ec1debd61c300961f98064cfb21287613ad7f303" -uuid = "1d5cc7b8-4909-519e-a0f8-d0f5ad9712d0" -version = "2025.2.0+0" - -[[deps.InteractiveUtils]] -deps = ["Markdown"] -uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" -version = "1.11.0" - -[[deps.Interpolations]] -deps = ["Adapt", "AxisAlgorithms", "ChainRulesCore", "LinearAlgebra", "OffsetArrays", "Random", "Ratios", "Requires", "SharedArrays", "SparseArrays", "StaticArrays", "WoodburyMatrices"] -git-tree-sha1 = "88a101217d7cb38a7b481ccd50d21876e1d1b0e0" -uuid = "a98d9a8b-a2ab-59e6-89dd-64a1c18fca59" -version = "0.15.1" -weakdeps = ["Unitful"] - - [deps.Interpolations.extensions] - 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 = "03b4f40b4987baa6a653a21f6f33f902af6255f3" -uuid = "8197267c-284f-5f27-9208-e0e47529a953" -version = "0.7.12" -weakdeps = ["Printf", "Random", "RecipesBase", "Statistics"] - - [deps.IntervalSets.extensions] - IntervalSetsPrintfExt = "Printf" - 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 = "da2e9b4d1abbebdcca0aa68afa0aa272102baad7" -uuid = "033835bb-8acc-5ee8-8aae-3f567f8a3819" -version = "0.6.2" -weakdeps = ["UnPack"] - - [deps.JLD2.extensions] - UnPackExt = "UnPack" - -[[deps.JLLWrappers]] -deps = ["Artifacts", "Preferences"] -git-tree-sha1 = "0533e564aae234aff59ab625543145446d8b6ec2" -uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" -version = "1.7.1" - -[[deps.JSON]] -deps = ["Dates", "Mmap", "Parsers", "Unicode"] -git-tree-sha1 = "31e996f0a15c7b280ba9f76636b3ff9e2ae58c9a" -uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" -version = "0.21.4" - -[[deps.JSON3]] -deps = ["Dates", "Mmap", "Parsers", "PrecompileTools", "StructTypes", "UUIDs"] -git-tree-sha1 = "411eccfe8aba0814ffa0fdf4860913ed09c34975" -uuid = "0f8b85d8-7281-11e9-16c2-39a750bddbf1" -version = "1.14.3" - - [deps.JSON3.extensions] - JSON3ArrowExt = ["ArrowTypes"] - - [deps.JSON3.weakdeps] - ArrowTypes = "31f734f8-188a-4ce0-8406-c8a06bd891cd" - -[[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 = "4255f0032eafd6451d707a51d5f0248b8a165e4d" -uuid = "aacddb02-875f-59d6-b918-886e6ef4fbf8" -version = "3.1.3+0" - -[[deps.JuliaFormatter]] -deps = ["CSTParser", "CommonMark", "DataStructures", "Glob", "PrecompileTools", "TOML", "Tokenize"] -git-tree-sha1 = "59cf7ad64f1b0708a4fa4369879d33bad3239b56" -uuid = "98e50ef6-434e-11e9-1051-2b60c6c9e899" -version = "1.0.62" - -[[deps.JuliaInterpreter]] -deps = ["CodeTracking", "InteractiveUtils", "Random", "UUIDs"] -git-tree-sha1 = "b6c76964c65ebf8309460fb8f0f437b4a59d809b" -uuid = "aa1ae85d-cabe-5617-a682-6adf51b2e16a" -version = "0.10.7" - -[[deps.KernelDensity]] -deps = ["Distributions", "DocStringExtensions", "FFTW", "Interpolations", "StatsBase"] -git-tree-sha1 = "ba51324b894edaf1df3ab16e2cc6bc3280a2f1a7" -uuid = "5ab0869b-81aa-558d-bb23-cbf5423bbe9b" -version = "0.6.10" - -[[deps.LAME_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "059aabebaa7c82ccb853dd4a0ee9d17796f7e1bc" -uuid = "c1c5ebd0-6772-5130-a774-d5fcae4a789d" -version = "3.100.3+0" - -[[deps.LERC_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "aaafe88dccbd957a8d82f7d05be9b69172e0cee3" -uuid = "88015f11-f218-50d7-93a8-a6af411a945d" -version = "4.0.1+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.LaTeXStrings]] -git-tree-sha1 = "dda21b8cbd6a6c40d9d02a73230f9d70fed6918c" -uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" -version = "1.4.0" - -[[deps.LayoutPointers]] -deps = ["ArrayInterface", "LinearAlgebra", "ManualMemory", "SIMDTypes", "Static", "StaticArrayInterface"] -git-tree-sha1 = "a9eaadb366f5493a5654e843864c13d8b107548c" -uuid = "10f19ff3-798f-405d-979b-55457f8fc047" -version = "0.1.17" - -[[deps.LazilyInitializedFields]] -git-tree-sha1 = "0f2da712350b020bc3957f269c9caad516383ee0" -uuid = "0e77f7df-68c5-4e49-93ce-4cd80f5598bf" -version = "1.3.0" - -[[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.Libdl]] -uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" -version = "1.11.0" - -[[deps.Libepoxy_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Libglvnd_jll", "Xorg_libX11_jll"] -git-tree-sha1 = "94d068f57b4241dd090693b6aba63416892298de" -uuid = "42c93a91-0102-5b3f-8f9d-e41de60ac950" -version = "1.5.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 = "3acf07f130a76f87c041cfb2ff7d7284ca67b072" -uuid = "4b2f31a3-9ecc-558c-b454-b3730dcb73e9" -version = "2.41.2+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 = "2a7a12fc0a4e7fb773450d17975322aa77142106" -uuid = "38a345b3-de98-5d2b-a5d3-14cd9215e700" -version = "2.41.2+0" - -[[deps.Libz]] -deps = ["BufferedStreams", "Random", "Test"] -git-tree-sha1 = "bf1510e80f1e0dba2297b05b59a3a7c8175a9517" -uuid = "2ec943e9-cfe8-584d-b93d-64dcb6d567b7" -version = "1.0.1" - -[[deps.LinearAlgebra]] -deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"] -uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" -version = "1.11.0" - -[[deps.LittleCMS_jll]] -deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Libtiff_jll"] -git-tree-sha1 = "8e6a74641caf3b84800f2ccd55dc7ab83893c10b" -uuid = "d3a379c0-f9a3-5b72-a4c0-6bf4d2e8af0f" -version = "2.17.0+0" - -[[deps.Loess]] -deps = ["Distances", "LinearAlgebra", "Statistics", "StatsAPI"] -git-tree-sha1 = "f749e7351f120b3566e5923fefdf8e52ba5ec7f9" -uuid = "4345ca2d-374a-55d4-8d30-97f9976e7612" -version = "0.6.4" - -[[deps.LogExpFunctions]] -deps = ["DocStringExtensions", "IrrationalConstants", "LinearAlgebra"] -git-tree-sha1 = "13ca9e2586b89836fd20cccf56e57e2b9ae7f38f" -uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688" -version = "0.3.29" - - [deps.LogExpFunctions.extensions] - LogExpFunctionsChainRulesCoreExt = "ChainRulesCore" - LogExpFunctionsChangesOfVariablesExt = "ChangesOfVariables" - LogExpFunctionsInverseFunctionsExt = "InverseFunctions" - - [deps.LogExpFunctions.weakdeps] - ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" - ChangesOfVariables = "9e997f8a-9a97-42d5-a9f1-ce6bfc15e2c0" - InverseFunctions = "3587e190-3f89-42d0-90ee-14403ec27112" - -[[deps.Logging]] -uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" -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" - - [deps.LoopVectorization.extensions] - ForwardDiffExt = ["ChainRulesCore", "ForwardDiff"] - ForwardDiffNNlibExt = ["ForwardDiff", "NNlib"] - SpecialFunctionsExt = "SpecialFunctions" - - [deps.LoopVectorization.weakdeps] - ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" - ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" - NNlib = "872c559c-99b0-510c-b3b7-b6c96a88d5cd" - SpecialFunctions = "276daf66-3868-5448-9aa4-cd146d93841b" - -[[deps.LoweredCodeUtils]] -deps = ["CodeTracking", "Compiler", "JuliaInterpreter"] -git-tree-sha1 = "e24491cb83551e44a69b9106c50666dea9d953ab" -uuid = "6f1432cf-f94c-5a45-995e-cdbf5db27b0b" -version = "3.4.4" - -[[deps.MIMEs]] -git-tree-sha1 = "c64d943587f7187e751162b3b84445bbbd79f691" -uuid = "6c6e2e6c-3030-632d-7369-2d6c69616d65" -version = "1.1.0" - -[[deps.MKL_jll]] -deps = ["Artifacts", "IntelOpenMP_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "oneTBB_jll"] -git-tree-sha1 = "282cadc186e7b2ae0eeadbd7a4dffed4196ae2aa" -uuid = "856f044c-d86e-5d09-b602-aeab76dc8ba7" -version = "2025.2.0+0" - -[[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", "Contour", "Dates", "DelaunayTriangulation", "Distributions", "DocStringExtensions", "Downloads", "FFMPEG_jll", "FileIO", "FilePaths", "FixedPointNumbers", "Format", "FreeType", "FreeTypeAbstraction", "GeometryBasics", "GridLayoutBase", "ImageBase", "ImageIO", "InteractiveUtils", "Interpolations", "IntervalSets", "InverseFunctions", "Isoband", "KernelDensity", "LaTeXStrings", "LinearAlgebra", "MacroTools", "MakieCore", "Markdown", "MathTeXEngine", "Observables", "OffsetArrays", "PNGFiles", "Packing", "PlotUtils", "PolygonOps", "PrecompileTools", "Printf", "REPL", "Random", "RelocatableFolders", "Scratch", "ShaderAbstractions", "Showoff", "SignedDistanceFields", "SparseArrays", "Statistics", "StatsBase", "StatsFuns", "StructArrays", "TriplotBase", "UnicodeFun", "Unitful"] -git-tree-sha1 = "1d7d16f0e02ec063becd7a140f619b2ffe5f2b11" -uuid = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a" -version = "0.22.10" - -[[deps.MakieCore]] -deps = ["ColorTypes", "GeometryBasics", "IntervalSets", "Observables"] -git-tree-sha1 = "c3159eb1e3aa3e409edbb71f4035ed8b1fc16e23" -uuid = "20f20a25-4f0e-4fdf-b5d1-57303727442b" -version = "0.9.5" - -[[deps.ManualMemory]] -git-tree-sha1 = "bcaef4fc7a0cfe2cba636d84cda54b5e4e4ca3cd" -uuid = "d125e4d3-2237-4719-b19c-fa641b8a4667" -version = "0.1.8" - -[[deps.MappedArrays]] -git-tree-sha1 = "2dab0221fe2b0f2cb6754eaa743cc266339f527e" -uuid = "dbb5928d-eab1-5f90-85c2-b9b0edb7c900" -version = "0.4.2" - -[[deps.Markdown]] -deps = ["Base64"] -uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" -version = "1.11.0" - -[[deps.MarkdownAST]] -deps = ["AbstractTrees", "Markdown"] -git-tree-sha1 = "465a70f0fc7d443a00dcdc3267a497397b8a3899" -uuid = "d0879d2d-cac2-40c8-9cee-1863dc0c7391" -version = "0.1.2" - -[[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.MeshIO]] -deps = ["ColorTypes", "FileIO", "GeometryBasics", "Printf"] -git-tree-sha1 = "c009236e222df68e554c7ce5c720e4a33cc0c23f" -uuid = "7269a6da-0436-5bbc-96c2-40638cbb6118" -version = "0.5.3" - -[[deps.MetaGraphs]] -deps = ["Graphs", "JLD2", "Random"] -git-tree-sha1 = "3a8f462a180a9d735e340f4e8d5f364d411da3a4" -uuid = "626554b9-1ddb-594c-aa3c-2596fe9399a5" -version = "0.8.1" - -[[deps.Millboard]] -git-tree-sha1 = "ea6a5b7e56e76d8051023faaa11d91d1d881dac3" -uuid = "39ec1447-df44-5f4c-beaa-866f30b4d3b2" -version = "0.2.5" - -[[deps.Missings]] -deps = ["DataAPI"] -git-tree-sha1 = "ec4f7fbeab05d7747bdf98eb74d130a2a2ed298d" -uuid = "e1d29d7a-bbdc-5cf2-9ac0-f12de2c33e28" -version = "1.2.0" - -[[deps.Mixers]] -deps = ["MacroTools"] -git-tree-sha1 = "58ec7ac60dad6e8ca4553225251dfd380e3930dd" -uuid = "2a8e4939-dab8-5edc-8f64-72a8776f13de" -version = "0.1.2" - -[[deps.Mmap]] -uuid = "a63ad114-7e13-5084-954f-fe012c677804" -version = "1.11.0" - -[[deps.ModernGL]] -deps = ["Libdl"] -git-tree-sha1 = "ac6cb1d8807a05cf1acc9680e09d2294f9d33956" -uuid = "66fc600b-dfda-50eb-8b99-91cfa97b1301" -version = "1.1.8" - -[[deps.MosaicViews]] -deps = ["MappedArrays", "OffsetArrays", "PaddedViews", "StackViews"] -git-tree-sha1 = "7b86a5d4d70a9f5cdf2dacb3cbe6d251d1a61dbe" -uuid = "e94cdb99-869f-56ef-bcf0-1ae2bcbe0389" -version = "0.3.4" - -[[deps.MozillaCACerts_jll]] -uuid = "14a3606d-f60d-562e-9121-12d972cd8159" -version = "2023.12.12" - -[[deps.NaNMath]] -deps = ["OpenLibm_jll"] -git-tree-sha1 = "9b8215b1ee9e78a293f99797cd31375471b2bcae" -uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" -version = "1.1.3" - -[[deps.NativeFileDialog]] -deps = ["FilePathsBase", "NativeFileDialog_jll"] -git-tree-sha1 = "6964c902c838b214cb4e8b4a94ca45e585c9d47b" -uuid = "e1fe445b-aa65-4df4-81c1-2041507f0fd4" -version = "0.2.1" - -[[deps.NativeFileDialog_jll]] -deps = ["Artifacts", "GTK3_jll", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "916d2db66748820c8e8bc3329a2a23c42c1520de" -uuid = "94d9ae2c-efc7-56f8-9a02-54c47b797961" -version = "1.1.6+3" - -[[deps.NaturalSort]] -git-tree-sha1 = "eda490d06b9f7c00752ee81cfa451efe55521e21" -uuid = "c020b1a1-e9b0-503a-9c33-f039bfc54a85" -version = "1.0.0" - -[[deps.NearestNeighbors]] -deps = ["Distances", "StaticArrays"] -git-tree-sha1 = "17399deebfc0ef7d7a97225776571d13adf01a36" -uuid = "b8a86587-4115-5ab1-83bc-aa920d37bbce" -version = "0.4.23" - -[[deps.Netpbm]] -deps = ["FileIO", "ImageCore", "ImageMetadata"] -git-tree-sha1 = "d92b107dbb887293622df7697a2223f9f8176fcd" -uuid = "f09324ee-3d7c-5217-9330-fc30815ba969" -version = "1.1.1" - -[[deps.Nettle]] -deps = ["Libdl", "Nettle_jll"] -git-tree-sha1 = "6fa48cbae828267848ee32c1bb31d1652e210d7d" -uuid = "49dea1ee-f6fa-5aa6-9a11-8816cee7d4b9" -version = "1.0.0" - -[[deps.Nettle_jll]] -deps = ["Artifacts", "GMP_jll", "JLLWrappers", "Libdl"] -git-tree-sha1 = "fd4678a4bd1f7156c98691200fab47c76b376360" -uuid = "4c82536e-c426-54e4-b420-14f461c4ed8b" -version = "3.10.1+0" - -[[deps.NetworkOptions]] -uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" -version = "1.2.0" - -[[deps.Nullables]] -git-tree-sha1 = "8f87854cc8f3685a60689d8edecaa29d2251979b" -uuid = "4d1e1d77-625e-5b40-9113-a560ec7a8ecd" -version = "1.0.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 = "567515ca155d0020a45b05175449b499c63e7015" -uuid = "6cdc7f73-28fd-5e50-80fb-958a8875b1af" -version = "0.3.29+0" - -[[deps.OpenBLAS_jll]] -deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] -uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" -version = "0.3.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 = "8292dd5c8a38257111ada2174000a33745b06d4e" -uuid = "18a262bb-aa17-5467-a713-aee519bc75cb" -version = "3.2.4+0" - -[[deps.OpenJpeg_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Libtiff_jll", "LittleCMS_jll", "libpng_jll"] -git-tree-sha1 = "215a6666fee6d6b3a6e75f2cc22cb767e2dd393a" -uuid = "643b3616-a352-519d-856d-80112ee9badc" -version = "2.5.5+0" - -[[deps.OpenLibm_jll]] -deps = ["Artifacts", "Libdl"] -uuid = "05823500-19ac-5b8b-9628-191a04bc5112" -version = "0.8.5+0" - -[[deps.OpenSSH_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "OpenSSL_jll", "Zlib_jll"] -git-tree-sha1 = "cf28501224f22b2b4d237d3cc7215c7c0cb52f6a" -uuid = "9bd350c2-7e96-507f-8002-3f2e150b4e1b" -version = "9.9.2+0" - -[[deps.OpenSSL]] -deps = ["BitFlags", "Dates", "MozillaCACerts_jll", "NetworkOptions", "OpenSSL_jll", "Sockets"] -git-tree-sha1 = "386b47442468acfb1add94bf2d85365dea10cbab" -uuid = "4d8831e6-92b7-49fb-bdf8-b643e874388c" -version = "1.6.0" - -[[deps.OpenSSL_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "2ae7d4ddec2e13ad3bddf5c0796f7547cf682391" -uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95" -version = "3.5.2+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.Opus_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "c392fc5dd032381919e3b22dd32d6443760ce7ea" -uuid = "91d4177d-7536-5919-b921-800302f37372" -version = "1.5.2+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 = "d922b4d80d1e12c658da7785e754f4796cc1d60d" -uuid = "90014a1f-27ba-587c-ab20-58faa44d9150" -version = "0.11.36" -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.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.Parameters]] -deps = ["OrderedCollections", "UnPack"] -git-tree-sha1 = "34c0e9ad262e5f7fc75b10a9952ca7692cfc5fbe" -uuid = "d96e819e-fc66-5662-9728-84c9c7592b0a" -version = "0.12.3" - -[[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.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.PlotlyBase]] -deps = ["ColorSchemes", "Colors", "Dates", "DelimitedFiles", "DocStringExtensions", "JSON", "LaTeXStrings", "Logging", "Parameters", "Pkg", "REPL", "Requires", "Statistics", "UUIDs"] -git-tree-sha1 = "28278bb0053da0fd73537be94afd1682cc5a0a83" -uuid = "a03496cd-edff-5a9b-9e67-9cda94a718b5" -version = "0.8.21" - - [deps.PlotlyBase.extensions] - DataFramesExt = "DataFrames" - DistributionsExt = "Distributions" - IJuliaExt = "IJulia" - JSON3Ext = "JSON3" - - [deps.PlotlyBase.weakdeps] - DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" - Distributions = "31c24e10-a181-5473-b8eb-7969acd0382f" - IJulia = "7073ff75-c697-5162-941a-fcdaad2a7d2a" - JSON3 = "0f8b85d8-7281-11e9-16c2-39a750bddbf1" - -[[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.Polynomials]] -deps = ["LinearAlgebra", "OrderedCollections", "RecipesBase", "Requires", "Setfield", "SparseArrays"] -git-tree-sha1 = "2660ba4e0e9354cf0f3deeefb61531bbdac5495d" -uuid = "f27b6e38-b328-58d1-80ce-0feddd5e7a45" -version = "4.0.21" - - [deps.Polynomials.extensions] - PolynomialsChainRulesCoreExt = "ChainRulesCore" - PolynomialsFFTWExt = "FFTW" - PolynomialsMakieCoreExt = "MakieCore" - PolynomialsMutableArithmeticsExt = "MutableArithmetics" - - [deps.Polynomials.weakdeps] - ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" - FFTW = "7a1cc6ca-52ef-59f5-83cd-3a7055c09341" - MakieCore = "20f20a25-4f0e-4fdf-b5d1-57303727442b" - MutableArithmetics = "d8a4904e-b15c-11e9-3269-09a3773c0cb0" - -[[deps.PooledArrays]] -deps = ["DataAPI", "Future"] -git-tree-sha1 = "36d8b4b899628fb92c2749eb488d884a926614d3" -uuid = "2dfb63ee-cc39-5dd5-95bd-886bf059d720" -version = "1.4.3" - -[[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 = "0f27480397253da18fe2c12a4ba4eb9eb208bf3d" -uuid = "21216c6a-2e73-6563-6e65-726566657250" -version = "1.5.0" - -[[deps.PrettyTables]] -deps = ["Crayons", "LaTeXStrings", "Markdown", "PrecompileTools", "Printf", "REPL", "Reexport", "StringManipulation", "Tables"] -git-tree-sha1 = "6b8e2f0bae3f678811678065c09571c1619da219" -uuid = "08abe8d2-0d0c-5749-adfa-8a2ac140af0d" -version = "3.1.0" - -[[deps.Printf]] -deps = ["Unicode"] -uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" -version = "1.11.0" - -[[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 = "8b3fc30bc0390abdce15f8822c889f669baed73d" -uuid = "4b34888f-f399-49d4-9bb3-47ed5cae4e65" -version = "1.0.1" - -[[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.Quaternions]] -deps = ["LinearAlgebra", "Random", "RealDot"] -git-tree-sha1 = "994cc27cdacca10e68feb291673ec3a76aa2fae9" -uuid = "94ee1d12-ae83-5a48-8b1c-48b8ff168ae0" -version = "0.7.6" - -[[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.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.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.Reexport]] -git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" -uuid = "189a3867-3050-52da-a836-e630ba90ab69" -version = "1.2.2" - -[[deps.RegionTrees]] -deps = ["IterTools", "LinearAlgebra", "StaticArrays"] -git-tree-sha1 = "4618ed0da7a251c7f92e869ae1a19c74a7d2a7f9" -uuid = "dee08c22-ab7f-5625-9660-a9af2021b33f" -version = "0.3.2" - -[[deps.RegistryInstances]] -deps = ["LazilyInitializedFields", "Pkg", "TOML", "Tar"] -git-tree-sha1 = "ffd19052caf598b8653b99404058fce14828be51" -uuid = "2792f1a3-b283-48e8-9a74-f99dce5104f3" -version = "0.1.0" - -[[deps.RelocatableFolders]] -deps = ["SHA", "Scratch"] -git-tree-sha1 = "ffdaf70d81cf6ff22c2b6e733c900c3321cab864" -uuid = "05181044-ff0b-4ac5-8273-598c1e38db00" -version = "1.0.1" - -[[deps.RemoteREPL]] -deps = ["Logging", "OpenSSH_jll", "REPL", "ReplMaker", "Serialization", "Sockets", "UUIDs"] -git-tree-sha1 = "1d75634838e7a07872c3339aed8b86bfce9afafc" -uuid = "1bd9f7bb-701c-4338-bec7-ac987af7c555" -version = "0.3.0" - -[[deps.ReplMaker]] -deps = ["REPL", "Unicode"] -git-tree-sha1 = "f8bb680b97ee232c4c6591e213adc9c1e4ba0349" -uuid = "b873ce64-0db9-51f5-a568-4457d8e49576" -version = "0.2.7" - -[[deps.Requires]] -deps = ["UUIDs"] -git-tree-sha1 = "62389eeff14780bfe55195b7204c0d8738436d64" -uuid = "ae029012-a4dd-5104-9daa-d747884805df" -version = "1.3.1" - -[[deps.Revise]] -deps = ["CodeTracking", "FileWatching", "JuliaInterpreter", "LibGit2", "LoweredCodeUtils", "OrderedCollections", "REPL", "Requires", "UUIDs", "Unicode"] -git-tree-sha1 = "85d94c2be31f58728cd69d13f2e0bdd7ecf6dfe9" -uuid = "295af30f-e4ad-537b-8983-00126c2a3abe" -version = "3.12.1" -weakdeps = ["Distributed"] - - [deps.Revise.extensions] - DistributedExt = "Distributed" - -[[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.Rotations]] -deps = ["LinearAlgebra", "Quaternions", "Random", "StaticArrays"] -git-tree-sha1 = "5680a9276685d392c87407df00d57c9924d9f11e" -uuid = "6038ab10-8711-5258-84ad-4b1120ba62dc" -version = "1.7.1" -weakdeps = ["RecipesBase"] - - [deps.Rotations.extensions] - RotationsRecipesBaseExt = "RecipesBase" - -[[deps.RoundingEmulator]] -git-tree-sha1 = "40b9edad2e5287e05bd413a38f61a8ff55b9557b" -uuid = "5eaf0fd0-dfba-4ccb-bf02-d820a40db705" -version = "0.2.1" - -[[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.SavitzkyGolay]] -deps = ["LinearAlgebra"] -git-tree-sha1 = "7bbc5949a42f53f4fca1a0157c72f9d3f78050d1" -uuid = "c4bf5708-b6a6-4fbe-bcd0-6850ed671584" -version = "0.9.1" - -[[deps.SciMLPublic]] -git-tree-sha1 = "ed647f161e8b3f2973f24979ec074e8d084f1bee" -uuid = "431bcebd-1456-4ced-9d72-93c2757fff0b" -version = "1.0.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 = "712fb0231ee6f9120e005ccd56297abbc053e7e0" -uuid = "91c51154-3ec4-41a3-a24f-3f23e20d615c" -version = "1.4.8" - -[[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.Showoff]] -deps = ["Dates", "Grisu"] -git-tree-sha1 = "91eddf657aca81df9ae6ceb20b959ae5653ad1de" -uuid = "992d4aef-0814-514b-bc4d-f2e9a6c4116f" -version = "1.0.3" - -[[deps.SignedDistanceFields]] -deps = ["Random", "Statistics", "Test"] -git-tree-sha1 = "d263a08ec505853a5ff1c1ebde2070419e3f28e9" -uuid = "73760f76-fbc4-59ce-8f25-708e95d2df96" -version = "0.4.0" - -[[deps.SimpleBufferStream]] -git-tree-sha1 = "f305871d2f381d21527c770d4788c06c097c9bc1" -uuid = "777ac1f9-54b0-4bf8-805c-2214025038e7" -version = "1.2.0" - -[[deps.SimpleTraits]] -deps = ["InteractiveUtils", "MacroTools"] -git-tree-sha1 = "be8eeac05ec97d379347584fa9fe2f5f76795bcb" -uuid = "699a6c99-e7fa-54fc-8d76-47d257e15c1d" -version = "0.9.5" - -[[deps.SimpleWeightedGraphs]] -deps = ["Graphs", "LinearAlgebra", "Markdown", "SparseArrays"] -git-tree-sha1 = "3e5f165e58b18204aed03158664c4982d691f454" -uuid = "47aef6b3-ad0c-573a-a1e2-d07658019622" -version = "1.5.0" - -[[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.SpecialFunctions]] -deps = ["IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"] -git-tree-sha1 = "f2685b435df2613e25fc10ad8c26dddb8640f547" -uuid = "276daf66-3868-5448-9aa4-cd146d93841b" -version = "2.6.1" -weakdeps = ["ChainRulesCore"] - - [deps.SpecialFunctions.extensions] - SpecialFunctionsChainRulesCoreExt = "ChainRulesCore" - -[[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", "Static"] -git-tree-sha1 = "96381d50f1ce85f2663584c8e886a6ca97e60554" -uuid = "0d7ed370-da01-4f52-bd93-41d350b8b718" -version = "1.8.0" -weakdeps = ["OffsetArrays", "StaticArrays"] - - [deps.StaticArrayInterface.extensions] - StaticArrayInterfaceOffsetArraysExt = "OffsetArrays" - StaticArrayInterfaceStaticArraysExt = "StaticArrays" - -[[deps.StaticArrays]] -deps = ["LinearAlgebra", "PrecompileTools", "Random", "StaticArraysCore"] -git-tree-sha1 = "b8693004b385c842357406e3af647701fe783f98" -uuid = "90137ffa-7385-5640-81b9-e52037218182" -version = "1.9.15" -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.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 = "9d72a13a3f4dd3795a195ac5a44d7d6ff5f552ff" -uuid = "82ae8749-77ed-4fe6-ae5f-f523153014b0" -version = "1.7.1" - -[[deps.StatsBase]] -deps = ["AliasTables", "DataAPI", "DataStructures", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"] -git-tree-sha1 = "064b532283c97daae49e544bb9cb413c26511f8c" -uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" -version = "0.34.8" - -[[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.Stipple]] -deps = ["Dates", "FilePathsBase", "Genie", "GenieSession", "GenieSessionFileSession", "JSON3", "Logging", "MacroTools", "Mixers", "Observables", "OrderedCollections", "Parameters", "Pkg", "PrecompileTools", "Random", "Reexport", "Requires", "StructTypes", "Tables"] -git-tree-sha1 = "9455fc54d50b4a6e6cb986eda7e8a0d09938ba06" -uuid = "4acbeb90-81a0-11ea-1966-bdaff8155998" -version = "0.28.23" -weakdeps = ["DataFrames", "JSON", "OffsetArrays"] - - [deps.Stipple.extensions] - StippleDataFramesExt = "DataFrames" - StippleJSONExt = "JSON" - StippleOffsetArraysExt = "OffsetArrays" - -[[deps.StipplePivotTable]] -deps = ["Stipple", "StippleUI", "Tables"] -git-tree-sha1 = "98d96b177125630eb5d273b3e705aec22bb4ec86" -uuid = "adab0226-ee3c-44de-8f2f-393b1bf1e936" -version = "0.4.3" - -[[deps.StipplePlotly]] -deps = ["DataFrames", "Genie", "Requires", "Stipple"] -git-tree-sha1 = "05cc51d2268f430b0f8dada1ccc330d1a9d20c3f" -uuid = "ec984513-233d-481d-95b0-a3b58b97af2b" -version = "0.13.16" -weakdeps = ["PlotlyBase"] - - [deps.StipplePlotly.extensions] - StipplePlotlyPlotlyBaseExt = "PlotlyBase" - -[[deps.StippleTable]] -deps = ["Stipple", "StippleUI"] -git-tree-sha1 = "f4a36ed4b56181d459b47bd16429308a03e05c1c" -uuid = "5bb4b094-0818-496d-ae94-fd777e10e8ba" -version = "1.0.3" - -[[deps.StippleTabs]] -deps = ["Stipple", "StippleUI"] -git-tree-sha1 = "cf1440b0d7510c98553ed75c7ba0842780a45319" -uuid = "29f11006-3202-4091-a17b-0a26282d76dd" -version = "1.1.0" - -[[deps.StippleUI]] -deps = ["Colors", "Dates", "Genie", "OrderedCollections", "PrecompileTools", "Stipple", "Tables"] -git-tree-sha1 = "fb442128bab27a90c9356f9e5ed39dada2b3d207" -uuid = "a3c5d34a-b254-4859-a8fa-b86abb7e84a3" -version = "0.23.7" -weakdeps = ["DataFrames"] - - [deps.StippleUI.extensions] - StippleUIDataFramesExt = "DataFrames" - -[[deps.StringEncodings]] -deps = ["Libiconv_jll"] -git-tree-sha1 = "b765e46ba27ecf6b44faf70df40c57aa3a547dcb" -uuid = "69024149-9ee7-55f6-a4c4-859efe599b68" -version = "0.3.7" - -[[deps.StringManipulation]] -deps = ["PrecompileTools"] -git-tree-sha1 = "725421ae8e530ec29bcbdddbe91ff8053421d023" -uuid = "892a3eda-7b42-436c-8928-eab12a02cf0e" -version = "0.4.1" - -[[deps.StructArrays]] -deps = ["ConstructionBase", "DataAPI", "Tables"] -git-tree-sha1 = "a2c37d815bf00575332b7bd0389f771cb7987214" -uuid = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" -version = "0.7.2" - - [deps.StructArrays.extensions] - StructArraysAdaptExt = "Adapt" - StructArraysGPUArraysCoreExt = ["GPUArraysCore", "KernelAbstractions"] - StructArraysLinearAlgebraExt = "LinearAlgebra" - StructArraysSparseArraysExt = "SparseArrays" - StructArraysStaticArraysExt = "StaticArrays" - - [deps.StructArrays.weakdeps] - Adapt = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" - GPUArraysCore = "46192b85-c4d5-4398-a991-12ede77f4527" - KernelAbstractions = "63c18a36-062a-441e-b654-da1e3ab1ce7c" - LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" - SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" - StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" - -[[deps.StructTypes]] -deps = ["Dates", "UUIDs"] -git-tree-sha1 = "159331b30e94d7b11379037feeb9b690950cace8" -uuid = "856f2bd8-1eba-4b0a-8007-ebc267875bd4" -version = "1.11.0" - -[[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.TOML]] -deps = ["Dates"] -uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" -version = "1.0.3" - -[[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.Test]] -deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] -uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" -version = "1.11.0" - -[[deps.TextWrap]] -git-tree-sha1 = "43044b737fa70bc12f6105061d3da38f881a3e3c" -uuid = "b718987f-49a8-5099-9789-dcd902bef87d" -version = "1.0.2" - -[[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.TiledIteration]] -deps = ["OffsetArrays", "StaticArrayInterface"] -git-tree-sha1 = "1176cc31e867217b06928e2f140c90bd1bc88283" -uuid = "06e1c1a7-607b-532d-9fad-de7d9aa2abac" -version = "0.5.0" - -[[deps.Tokenize]] -git-tree-sha1 = "468b4685af4abe0e9fd4d7bf495a6554a6276e75" -uuid = "0796e94c-ce3b-5d07-9a54-7f471281c624" -version = "0.5.29" - -[[deps.TranscodingStreams]] -git-tree-sha1 = "0c45878dcfdcfa8480052b6ab162cdd138781742" -uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa" -version = "0.11.3" - -[[deps.TriplotBase]] -git-tree-sha1 = "4d4ed7f294cda19382ff7de4c137d24d16adc89b" -uuid = "981d1d27-644d-49a2-9326-4793e63143c3" -version = "0.1.0" - -[[deps.URIParser]] -deps = ["Unicode"] -git-tree-sha1 = "53a9f49546b8d2dd2e688d216421d050c9a31d0d" -uuid = "30578b45-9adc-5946-b283-645ec420af67" -version = "0.4.1" - -[[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 = "83360bda12f61c250835830cc40b64f487cc2230" -uuid = "1986cc42-f94f-5a68-af5c-568840ba703d" -version = "1.25.1" - - [deps.Unitful.extensions] - ConstructionBaseUnitfulExt = "ConstructionBase" - ForwardDiffExt = "ForwardDiff" - InverseFunctionsUnitfulExt = "InverseFunctions" - LatexifyExt = ["Latexify", "LaTeXStrings"] - PrintfExt = "Printf" - - [deps.Unitful.weakdeps] - ConstructionBase = "187b0558-2788-49d3-abe0-74a17ed4e7c9" - ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" - InverseFunctions = "3587e190-3f89-42d0-90ee-14403ec27112" - LaTeXStrings = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" - Latexify = "23fbe1c1-3f47-55db-b15f-69d7ec21a316" - Printf = "de0858da-6303-5e67-8744-51eddeeeb8d7" - -[[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.Wavelets]] -deps = ["DSP", "FFTW", "LinearAlgebra", "Reexport", "SpecialFunctions", "Statistics"] -git-tree-sha1 = "d0ec97a100abbe47a5e9a02361841da49cce6029" -uuid = "29a6e085-ba6d-5f35-a997-948ac2efa89a" -version = "0.10.1" - -[[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.WeakRefStrings]] -deps = ["DataAPI", "InlineStrings", "Parsers"] -git-tree-sha1 = "b1be2855ed9ed8eac54e5caff2afcdb442d52c23" -uuid = "ea10d353-3f73-51f8-a26c-33c1cb351aa5" -version = "1.4.2" - -[[deps.WebP]] -deps = ["CEnum", "ColorTypes", "FileIO", "FixedPointNumbers", "ImageCore", "libwebp_jll"] -git-tree-sha1 = "aa1ca3c47f119fbdae8770c29820e5e6119b83f2" -uuid = "e3aaa7dc-3e4b-44e0-be63-ffb868ccd7c1" -version = "0.1.3" - -[[deps.WoodburyMatrices]] -deps = ["LinearAlgebra", "SparseArrays"] -git-tree-sha1 = "c1a7aa6219628fcd757dede0ca95e245c5cd9511" -uuid = "efce3f68-66dc-5838-9240-27a6d6f5f9b6" -version = "1.0.0" - -[[deps.WorkerUtilities]] -git-tree-sha1 = "cd1659ba0d57b71a464a29e64dbc67cfe83d54e7" -uuid = "76eceee3-57b5-4d4a-8e66-0e911cebbf60" -version = "1.6.1" - -[[deps.XML2_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Zlib_jll"] -git-tree-sha1 = "80d3930c6347cfce7ccf96bd3bafdf079d9c0390" -uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a" -version = "2.13.9+0" - -[[deps.XZ_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "fee71455b0aaa3440dfdd54a9a36ccef829be7d4" -uuid = "ffd25f8a-64ca-5728-b0f7-c24cf3aae800" -version = "5.8.1+0" - -[[deps.Xorg_libX11_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxcb_jll", "Xorg_xtrans_jll"] -git-tree-sha1 = "b5899b25d17bf1889d25906fb9deed5da0c15b3b" -uuid = "4f6342f7-b3d2-589e-9d20-edeb45f2b2bc" -version = "1.8.12+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_libXcomposite_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libXfixes_jll"] -git-tree-sha1 = "a630cfb0c2018a616d52f30e34cffa071ce93d42" -uuid = "3c9796d7-64a0-5134-86ad-79f8eb684845" -version = "0.4.6+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_libXdamage_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libXfixes_jll"] -git-tree-sha1 = "534ed7d299469f3438b2c136d7beb0b50da88ce0" -uuid = "0aeada51-83db-5f97-b67e-184615cfc6f6" -version = "1.1.6+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 = "a4c0ee07ad36bf8bbce1c3bb52d21fb1e0b987fb" -uuid = "1082639a-0dae-5f34-9b06-72781eeb8cb3" -version = "1.3.7+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 = "a5bc75478d323358a90dc36766f3c99ba7feb024" -uuid = "d1454406-59df-5ea1-beac-c340f2130bc3" -version = "1.1.6+0" - -[[deps.Xorg_libXrandr_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libXext_jll", "Xorg_libXrender_jll"] -git-tree-sha1 = "aff463c82a773cb86061bce8d53a0d976854923e" -uuid = "ec84b674-ba8e-5d96-8ba1-2a689ba10484" -version = "1.5.5+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_libXtst_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libXext_jll", "Xorg_libXfixes_jll", "Xorg_libXi_jll"] -git-tree-sha1 = "58c2e8f49733034d33b461d45a7e874b4135b644" -uuid = "b6f176f1-7aea-5357-ad67-1d3e565ea1c6" -version = "1.2.5+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 = "e3150c7400c41e207012b41659591f083f3ef795" -uuid = "cc61e674-0454-545c-8b26-ed2c68acab7a" -version = "1.1.3+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.YAML]] -deps = ["Base64", "Dates", "Printf", "StringEncodings"] -git-tree-sha1 = "a1c0c7585346251353cddede21f180b96388c403" -uuid = "ddb6d928-2868-570f-bddf-ab3f9cf99eb6" -version = "0.4.16" - -[[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.at_spi2_atk_jll]] -deps = ["ATK_jll", "Artifacts", "JLLWrappers", "Libdl", "XML2_jll", "Xorg_libX11_jll", "at_spi2_core_jll"] -git-tree-sha1 = "249ab7c4da34d86d3d66b524705b1c07fe96b815" -uuid = "de012916-1e3f-58c2-8f29-df3ef51d412d" -version = "2.38.0+0" - -[[deps.at_spi2_core_jll]] -deps = ["Artifacts", "Dbus_jll", "Glib_jll", "JLLWrappers", "Libdl", "Xorg_libXtst_jll"] -git-tree-sha1 = "87819499fbacf7606859f6d7f31fa97d5db5452a" -uuid = "0fc3237b-ac94-5853-b45c-d43d59a06200" -version = "2.58.1+0" - -[[deps.gdk_pixbuf_jll]] -deps = ["Artifacts", "Glib_jll", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Libtiff_jll", "Xorg_libX11_jll", "libpng_jll"] -git-tree-sha1 = "895f21b699121d1a57ecac57e65a852caf569254" -uuid = "da03df04-f53b-5353-a52f-6a8b0620ced0" -version = "2.42.13+0" - -[[deps.iso_codes_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "9200917315ff176d445ccc759945ea3fdb7c49c3" -uuid = "bf975903-5238-5d20-8243-bc370bc1e7e5" -version = "4.18.0+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.libfdk_aac_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "646634dd19587a56ee2f1199563ec056c5f228df" -uuid = "f638f0a6-7fb0-5443-88ba-1cc74229b280" -version = "2.0.4+0" - -[[deps.libpng_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Zlib_jll"] -git-tree-sha1 = "07b6a107d926093898e82b3b1db657ebe33134ec" -uuid = "b53b4c65-9356-5827-b1ea-8c7a1a84506f" -version = "1.6.50+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.libzip_jll]] -deps = ["Artifacts", "Bzip2_jll", "JLLWrappers", "Libdl", "OpenSSL_jll", "XZ_jll", "Zlib_jll", "Zstd_jll"] -git-tree-sha1 = "86addc139bca85fdf9e7741e10977c45785727b7" -uuid = "337d8026-41b4-5cde-a456-74a10e5b31d1" -version = "1.11.3+0" - -[[deps.nghttp2_jll]] -deps = ["Artifacts", "Libdl"] -uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" -version = "1.59.0+0" - -[[deps.oneTBB_jll]] -deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl"] -git-tree-sha1 = "1350188a69a6e46f799d3945beef36435ed7262f" -uuid = "1317d2d5-d96f-522e-a858-c73665f53c3e" -version = "2022.0.0+1" - -[[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 = "fbf139bce07a534df0e699dbb5f5cc9346f95cc1" -uuid = "d8fb68d0-12a3-5cfd-a85a-d49703b185fd" -version = "1.9.2+0" diff --git a/app.jl b/app.jl index a99a9b4..d7eaa70 100644 --- a/app.jl +++ b/app.jl @@ -8,6 +8,7 @@ using Libz using PlotlyBase using CairoMakie using Colors +using Dates using MSI_src # Import the new MSIData library using Statistics using NaturalSort @@ -113,7 +114,9 @@ function get_processed_mean_spectrum(spectra::Vector{MutableSpectrum}; num_bins= # 3. Bin intensities for s in spectra - for i in eachindex(s.mz) + # Use minimum length to avoid bounds errors if arrays are mismatched + n_points = min(length(s.mz), length(s.intensity)) + for i in 1:n_points bin_index = trunc(Int, (s.mz[i] - min_mz) * inv_bin_step + 1.0) final_index = clamp(bin_index, 1, num_bins) intensity_sum[final_index] += s.intensity[i] @@ -147,7 +150,9 @@ function get_processed_sum_spectrum(spectra::Vector{MutableSpectrum}; num_bins=2 inv_bin_step = 1.0 / bin_step for s in spectra - for i in eachindex(s.mz) + # Use minimum length to avoid bounds errors if arrays are mismatched + n_points = min(length(s.mz), length(s.intensity)) + for i in 1:n_points bin_index = trunc(Int, (s.mz[i] - min_mz) * inv_bin_step + 1.0) final_index = clamp(bin_index, 1, num_bins) intensity_sum[final_index] += s.intensity[i] @@ -157,11 +162,44 @@ function get_processed_sum_spectrum(spectra::Vector{MutableSpectrum}; num_bins=2 return collect(mz_bins), intensity_sum end +INITIAL_MODEL_STATE = Dict{Symbol,Any}() + +# Function to capture initial state (also outside @app block) +function capture_initial_state!(model) + empty!(INITIAL_MODEL_STATE) + for name in fieldnames(typeof(model)) + if !startswith(String(name), "_") + INITIAL_MODEL_STATE[name] = deepcopy(getfield(model, name)) + end + end + println("Captured $(length(INITIAL_MODEL_STATE)) reactive variables") +end + @genietools # == Reactive code == +#= +macro ui_log(message, level="INFO", log_entries) + quote + local timestamp = Dates.format(now(), "HH:MM:SS") + local new_entry = Dict("time" => timestamp, "message" => string($(esc(message))), "level" => $(esc(level))) + println("log entries value: $log_entries") + pushfirst!(log_entries, new_entry) + if length(log_entries) > 100 + popfirst!(log_entries) + end + push!(__model__) + end +end +=# + # Reactive code to make the UI interactive @app begin + # == Notification & Logs == + # @in log_entries = Dict{String,Any}[] + # @in show_log_sidebar = false + @in showBugModal = false + # == Loading Screen Variables == @in is_initializing = true @in initialization_message = "Initializing..." @@ -348,6 +386,7 @@ end @in export_params_btn = false # Export parameters to file @in import_params_btn = false # Import parameters from file @in save_feature_matrix_btn = false # Save feature matrix results + @in reset_session_btn = false # Deep session reset # Preprocessing results @in selected_spectrum_id_for_plot = 1 @@ -616,12 +655,64 @@ end # Reactive handlers watch a variable and execute a block of code when its value changes # The onbutton handler will set the variable to false after the block is executed - # This handler correctly uses pick_file and loads the selected file - # as the active dataset for the UI. + @onbutton reset_session_btn begin + is_processing = true + push!(__model__) + + try + # 1. Clear large data objects explicitly + msi_data = nothing + feature_matrix_result = nothing + bin_info_result = nothing + + # 2. Reset ALL reactive variables using captured initial state + if !isempty(INITIAL_MODEL_STATE) + for (name, value) in INITIAL_MODEL_STATE + setfield!(__model__, name, deepcopy(value)) + end + msg = "Session reset: restored $(length(INITIAL_MODEL_STATE)) variables to initial state." + else + msg = "Warning: No initial state captured. Using partial reset." + end + + # 3. Reset file lists (these will be repopulated by normal operation) + msi_bmp = sort(filter(filename -> startswith(filename, "MSI_") && endswith(filename, ".bmp"), readdir("public")), lt=natural) + col_msi_png = sort(filter(filename -> startswith(filename, "colorbar_MSI_") && endswith(filename, ".png"), readdir("public")), lt=natural) + triq_bmp = sort(filter(filename -> startswith(filename, "TrIQ_") && endswith(filename, ".bmp"), readdir("public")), lt=natural) + col_triq_png = sort(filter(filename -> startswith(filename, "colorbar_TrIQ_") && endswith(filename, ".png"), readdir("public")), lt=natural) + + # 4. Clear any cached images/plots + imgInt = "/.bmp" + imgIntT = "/.bmp" + colorbar = "/.png" + colorbarT = "/.png" + + # 5. Reset plot data to default traces + traceImg = PlotlyBase.heatmap(x=Vector{Float64}(), y=Vector{Float64}()) + plotdataImg = [traceImg] + plotdataImgT = [traceImg] + plotdata = [PlotlyBase.scatter(x=Vector{Float64}(), y=Vector{Float64}(), mode="lines")] + + # 6. Aggressive garbage collection + GC.gc(true) + if Sys.islinux() + ccall(:malloc_trim, Int32, (Int32,), 0) + end + println("Session reset successfully.") + catch e + println("Error during session reset: $e") + msg = "Reset error: $e" + finally + is_processing = false + end + end + @onbutton btnSearch begin is_processing = true + push!(__model__) picked_route = pick_file(; filterlist="imzML,imzml,mzML,mzml") - if isempty(picked_route) + + if isnothing(picked_route) || isempty(picked_route) is_processing = false return end @@ -938,6 +1029,7 @@ end @onbutton export_params_btn begin is_processing = true + push!(__model__) params_to_export = Dict( "pipeline_step_order" => pipeline_step_order, "enable_standards" => enable_standards, # Export global flag @@ -1011,6 +1103,7 @@ end @onbutton import_params_btn begin is_processing = true + push!(__model__) picked_file = pick_file(filterlist="json") if isempty(picked_file) is_processing = false @@ -1021,39 +1114,57 @@ end json_string = read(picked_file, String) params = JSON.parse(json_string) - # This is a list of all known reactive variables that can be imported. - # This prevents arbitrary variable assignment. - known_params = [ - "stabilization_method", "smoothing_method", "smoothing_window", "smoothing_order", - "baseline_method", "baseline_iterations", "baseline_window", "normalization_method", - "alignment_method", "alignment_span", "alignment_tolerance", "alignment_tolerance_unit", - "alignment_max_shift_ppm", "alignment_min_matched_peaks", "peak_picking_method", - "peak_picking_snr_threshold", "peak_picking_half_window", "peak_picking_min_peak_prominence", - "peak_picking_merge_peaks_tolerance", "peak_picking_min_peak_width_ppm", - "peak_picking_max_peak_width_ppm", "peak_picking_min_peak_shape_r2", "binning_method", - "binning_tolerance", "binning_tolerance_unit", "binning_frequency_threshold", - "binning_min_peak_per_bin", "binning_max_bin_width_ppm", "binning_intensity_weighted_centers", - "binning_num_uniform_bins", "calibration_fit_order", "calibration_ppm_tolerance", - "peak_selection_min_snr", "peak_selection_min_fwhm_ppm", "peak_selection_max_fwhm_ppm", - "peak_selection_min_shape_r2", "peak_selection_frequency_threshold", "peak_selection_correlation_threshold" - ] - - for (key, value) in params - if key == "reference_peaks_list" - reference_peaks_list = value - elseif key == "pipeline_step_order" - pipeline_step_order = value - elseif key == "enable_standards" - enable_standards = value - elseif key in known_params - # Use getfield and setproperty! to update reactive variables by name - if hasfield(typeof(@__MODULE__), Symbol(key)) - getfield(@__MODULE__, Symbol(key))[] = value - end - else - @warn "Unknown parameter '$key' found in JSON file. Skipping." - end + # Import special variables first + if haskey(params, "reference_peaks_list") + reference_peaks_list = params["reference_peaks_list"] end + if haskey(params, "pipeline_step_order") + pipeline_step_order = params["pipeline_step_order"] + end + if haskey(params, "enable_standards") + enable_standards = params["enable_standards"] + end + + # Import regular parameters with explicit assignments + haskey(params, "stabilization_method") && (stabilization_method = params["stabilization_method"]) + haskey(params, "smoothing_method") && (smoothing_method = params["smoothing_method"]) + haskey(params, "smoothing_window") && (smoothing_window = params["smoothing_window"]) + haskey(params, "smoothing_order") && (smoothing_order = params["smoothing_order"]) + haskey(params, "baseline_method") && (baseline_method = params["baseline_method"]) + haskey(params, "baseline_iterations") && (baseline_iterations = params["baseline_iterations"]) + haskey(params, "baseline_window") && (baseline_window = params["baseline_window"]) + haskey(params, "normalization_method") && (normalization_method = params["normalization_method"]) + haskey(params, "alignment_method") && (alignment_method = params["alignment_method"]) + haskey(params, "alignment_span") && (alignment_span = params["alignment_span"]) + haskey(params, "alignment_tolerance") && (alignment_tolerance = params["alignment_tolerance"]) + haskey(params, "alignment_tolerance_unit") && (alignment_tolerance_unit = params["alignment_tolerance_unit"]) + haskey(params, "alignment_max_shift_ppm") && (alignment_max_shift_ppm = params["alignment_max_shift_ppm"]) + haskey(params, "alignment_min_matched_peaks") && (alignment_min_matched_peaks = params["alignment_min_matched_peaks"]) + haskey(params, "peak_picking_method") && (peak_picking_method = params["peak_picking_method"]) + haskey(params, "peak_picking_snr_threshold") && (peak_picking_snr_threshold = params["peak_picking_snr_threshold"]) + haskey(params, "peak_picking_half_window") && (peak_picking_half_window = params["peak_picking_half_window"]) + haskey(params, "peak_picking_min_peak_prominence") && (peak_picking_min_peak_prominence = params["peak_picking_min_peak_prominence"]) + haskey(params, "peak_picking_merge_peaks_tolerance") && (peak_picking_merge_peaks_tolerance = params["peak_picking_merge_peaks_tolerance"]) + haskey(params, "peak_picking_min_peak_width_ppm") && (peak_picking_min_peak_width_ppm = params["peak_picking_min_peak_width_ppm"]) + haskey(params, "peak_picking_max_peak_width_ppm") && (peak_picking_max_peak_width_ppm = params["peak_picking_max_peak_width_ppm"]) + haskey(params, "peak_picking_min_peak_shape_r2") && (peak_picking_min_peak_shape_r2 = params["peak_picking_min_peak_shape_r2"]) + haskey(params, "binning_method") && (binning_method = params["binning_method"]) + haskey(params, "binning_tolerance") && (binning_tolerance = params["binning_tolerance"]) + haskey(params, "binning_tolerance_unit") && (binning_tolerance_unit = params["binning_tolerance_unit"]) + haskey(params, "binning_frequency_threshold") && (binning_frequency_threshold = params["binning_frequency_threshold"]) + haskey(params, "binning_min_peak_per_bin") && (binning_min_peak_per_bin = params["binning_min_peak_per_bin"]) + haskey(params, "binning_max_bin_width_ppm") && (binning_max_bin_width_ppm = params["binning_max_bin_width_ppm"]) + haskey(params, "binning_intensity_weighted_centers") && (binning_intensity_weighted_centers = params["binning_intensity_weighted_centers"]) + haskey(params, "binning_num_uniform_bins") && (binning_num_uniform_bins = params["binning_num_uniform_bins"]) + haskey(params, "calibration_fit_order") && (calibration_fit_order = params["calibration_fit_order"]) + haskey(params, "calibration_ppm_tolerance") && (calibration_ppm_tolerance = params["calibration_ppm_tolerance"]) + haskey(params, "peak_selection_min_snr") && (peak_selection_min_snr = params["peak_selection_min_snr"]) + haskey(params, "peak_selection_min_fwhm_ppm") && (peak_selection_min_fwhm_ppm = params["peak_selection_min_fwhm_ppm"]) + haskey(params, "peak_selection_max_fwhm_ppm") && (peak_selection_max_fwhm_ppm = params["peak_selection_max_fwhm_ppm"]) + haskey(params, "peak_selection_min_shape_r2") && (peak_selection_min_shape_r2 = params["peak_selection_min_shape_r2"]) + haskey(params, "peak_selection_frequency_threshold") && (peak_selection_frequency_threshold = params["peak_selection_frequency_threshold"]) + haskey(params, "peak_selection_correlation_threshold") && (peak_selection_correlation_threshold = params["peak_selection_correlation_threshold"]) + msg = "Parameters imported successfully from $(basename(picked_file))." catch e msg = "Failed to import parameters: $e" @@ -1110,13 +1221,14 @@ end @onbutton run_full_pipeline begin is_processing = true + push!(__model__) + overall_progress = 0.0 + local pipeline_msi_data = nothing + local current_spectra = Vector{MutableSpectrum}() current_pipeline_step = "Initializing..." - println("DEBUG: run_full_pipeline started.") - # println("DEBUG: Current pipeline_step_order configuration: $pipeline_step_order") try # --- 1. Initial Checks and Data Loading --- - println("DEBUG: Performing initial checks and data loading...") if isempty(selected_folder_main) msg = "No dataset loaded. Please load a file using 'Select an imzMl / mzML file'." warning_msg = true @@ -1136,26 +1248,31 @@ end target_path = entry["source_path"] # Ensure msi_data is for the currently selected file and load if needed - if msi_data === nothing || full_route != target_path - println("DEBUG: Active file path changed or data not in memory. Reloading MSI data: $(basename(target_path))") - if msi_data !== nothing; close(msi_data); end - msg = "Reloading $(basename(target_path)) for analysis..." - full_route = target_path - msi_data = OpenMSIData(target_path) - - # Determine plot mode from loaded data - df = msi_data.spectrum_stats_df + # NOTE: For the pipeline, we will open a DEDICATED instance to avoid race conditions + # with the global msi_data used for plotting/interactive exploration. + println("DEBUG: Opening isolated MSIData instance for pipeline stability...") + pipeline_msi_data = OpenMSIData(target_path) + + # Determine plot mode from metadata for correct visualization late + metadata = pipeline_msi_data.instrument_metadata + acq_mode = metadata !== nothing ? metadata.acquisition_mode : :unknown + + if acq_mode == :centroid + last_plot_mode = "stem" + elseif acq_mode == :profile + last_plot_mode = "lines" + else + # Fallback to stats if mode is unknown + df = pipeline_msi_data.spectrum_stats_df if df !== nothing && "Mode" in names(df) profile_count = count(==(MSI_src.PROFILE), df.Mode) total_count = length(df.Mode) last_plot_mode = profile_count > total_count / 2 ? "lines" : "stem" - println("DEBUG: Auto-detected plot mode for pipeline: $(last_plot_mode)") else last_plot_mode = "lines" # Default end - else - println("DEBUG: Using already loaded MSI data for $(basename(target_path)).") end + println("DEBUG: Auto-detected plot mode from metadata: $(last_plot_mode) (acq_mode: $(acq_mode)) [Initial set]") # Mask path retrieval from registry local mask_path_for_pipeline::Union{String, Nothing} = nothing @@ -1171,6 +1288,7 @@ end warning_msg = true @warn msg println("DEBUG: $msg") + close(pipeline_msi_data) # Important cleanup return end else @@ -1178,6 +1296,7 @@ end warning_msg = true @warn msg println("DEBUG: $msg") + close(pipeline_msi_data) # Important cleanup return end else @@ -1185,22 +1304,24 @@ end end # Apply mask if enabled to get indices to process - spectrum_indices_to_process = collect(1:length(msi_data.spectra_metadata)) + # Use pipeline_msi_data for consistency + spectrum_indices_to_process = collect(1:length(pipeline_msi_data.spectra_metadata)) if mask_path_for_pipeline !== nothing current_pipeline_step = "Applying mask..." println("DEBUG: Applying mask matrix to filter spectra...") - mask_matrix = load_and_prepare_mask(mask_path_for_pipeline, msi_data.image_dims) - masked_indices_set = get_masked_spectrum_indices(msi_data, mask_matrix) + mask_matrix = load_and_prepare_mask(mask_path_for_pipeline, pipeline_msi_data.image_dims) + masked_indices_set = get_masked_spectrum_indices(pipeline_msi_data, mask_matrix) spectrum_indices_to_process = collect(masked_indices_set) if isempty(spectrum_indices_to_process) msg = "No spectra remaining after applying mask. Aborting pipeline." warning_msg = true println("DEBUG: $msg") + close(pipeline_msi_data) # Important cleanup return end println("DEBUG: $(length(spectrum_indices_to_process)) spectra remaining after mask application.") else - println("DEBUG: No mask applied. Processing all $(length(msi_data.spectra_metadata)) spectra.") + println("DEBUG: No mask applied. Processing all $(length(pipeline_msi_data.spectra_metadata)) spectra.") end # Apply subset processing if enabled @@ -1211,17 +1332,91 @@ end println("DEBUG: Subset processing enabled. Processing first $(length(spectrum_indices_to_process)) of $n_total spectra.") end - # Initialize spectra data structure - current_pipeline_step = "Loading spectra..." - println("DEBUG: Loading $(length(spectrum_indices_to_process)) spectra into MutableSpectrum objects...") - current_spectra = Vector{MutableSpectrum}(undef, length(spectrum_indices_to_process)) + # --- BOUNDS VALIDATION AND DIAGNOSTIC LOGGING --- + # Validate all indices are within bounds before attempting to load + max_spectra_idx = length(pipeline_msi_data.spectra_metadata) + println("DEBUG: Total spectra in dataset: $max_spectra_idx") + println("DEBUG: Number of indices to process: $(length(spectrum_indices_to_process))") - Threads.@threads for i in 1:length(spectrum_indices_to_process) - original_idx = spectrum_indices_to_process[i] - mz, intensity = GetSpectrum(msi_data, original_idx) # Fetch mz and intensity for the current spectrum - current_spectra[i] = MutableSpectrum(original_idx, copy(Float64.(mz)), copy(Float64.(intensity)), NamedTuple{(:mz, :intensity, :fwhm, :shape_r2, :snr, :prominence), NTuple{6, Float64}}[]) + if !isempty(spectrum_indices_to_process) + min_idx = minimum(spectrum_indices_to_process) + max_idx = maximum(spectrum_indices_to_process) + println("DEBUG: Spectrum indices range: $min_idx to $max_idx") + + # Check for invalid indices + invalid_indices = filter(idx -> idx < 1 || idx > max_spectra_idx, spectrum_indices_to_process) + if !isempty(invalid_indices) + n_invalid = length(invalid_indices) + sample_invalid = first(sort(invalid_indices), min(10, n_invalid)) + msg = "Invalid spectrum indices detected: $n_invalid indices out of range [1, $max_spectra_idx]. First few invalid indices: $sample_invalid" + warning_msg = true + @error msg + println("DEBUG: $msg") + close(pipeline_msi_data) # Important cleanup + return + end + println("DEBUG: All spectrum indices are valid (within [1, $max_spectra_idx]).") + else + println("DEBUG: Warning - spectrum_indices_to_process is empty!") + end + + # CRITICAL: Verify indices are unique to prevent race conditions during loading + if length(Set(spectrum_indices_to_process)) != length(spectrum_indices_to_process) + @warn "Non-unique indices detected in spectrum_indices_to_process. This may cause issues during parallel loading." + end + + # Use pipeline_msi_data for reading + # Split loading into chunks to update progress bar + n_spectra = length(spectrum_indices_to_process) + println("DEBUG: Loading $n_spectra spectra into MutableSpectrum objects...") + current_spectra = Vector{MutableSpectrum}(undef, n_spectra) + + chunk_size = max(1, n_spectra ÷ 10) # Update progress every 10% + for chunk_start in 1:chunk_size:n_spectra + chunk_end = min(chunk_start + chunk_size - 1, n_spectra) + + Threads.@threads for i in chunk_start:chunk_end + local original_idx = spectrum_indices_to_process[i] + local mz, intensity # Enforce thread-local scope + + try + mz, intensity = GetSpectrum(pipeline_msi_data, original_idx) + + # Diagnostic check for length mismatch and defensive truncation + l_mz = length(mz) + l_int = length(intensity) + if l_mz != l_int + new_len = min(l_mz, l_int) + @warn "CRITICAL: Mismatch during loading at index $original_idx. mz=$l_mz, int=$l_int. TRUNCATING." + mz = mz[1:new_len] + intensity = intensity[1:new_len] + end + + current_spectra[i] = MutableSpectrum(original_idx, copy(Float64.(mz)), copy(Float64.(intensity)), NamedTuple{(:mz, :intensity, :fwhm, :shape_r2, :snr, :prominence), NTuple{6, Float64}}[]) + catch loop_error + rethrow(loop_error) + end + end + + overall_progress = (chunk_end / n_spectra) * 0.2 # Loading is first 20% + push!(__model__) end println("DEBUG: All spectra loaded into temporary structure for processing.") + + # We can now close the local MSI data instance as we have loaded everything into memory + # However, if we want to support lazy loading scenarios later, we might keep it open. + # For now, let's close it here to free up file handles early, + # UNLESS `execute_full_preprocessing` needs it (it doesn't seem to based on signature). + close(pipeline_msi_data) + pipeline_msi_data = nothing # Prevent accidental use + + # Aggressive memory cleanup to return memory to OS + println("DEBUG: Performing aggressive memory cleanup...") + GC.gc(true) # Full garbage collection with all generations + if Sys.islinux() + ccall(:malloc_trim, Int32, (Int32,), 0) + end + println("DEBUG: Closed local pipeline MSIData instance and freed memory.") # --- 2. Parameter Assembly with Validation --- @@ -1450,8 +1645,16 @@ end mask_path_for_pipeline ) do step current_pipeline_step = "Processing: $step" - println("DEBUG: Processing step: $step") + + # Update progress based on step index + step_idx = findfirst(==(step), pipeline_stp) + if step_idx !== nothing + # Preprocessing is 20% to 90% (total 70%) + overall_progress = 0.2 + (step_idx / length(pipeline_stp)) * 0.7 + end + push!(__model__) end + println("DEBUG: Pipeline execution finished.") # 4. Update Results Display @@ -1638,7 +1841,8 @@ end mkpath(output_dir) save_feature_matrix(feature_matrix_result, bin_info_result, output_dir) msg = "Pipeline completed successfully. Feature matrix saved." - println("DEBUG: Feature matrix saved to $output_dir") + overall_progress = 1.0 + push!(__model__) else msg = "Pipeline completed successfully. No feature matrix generated (binning step not enabled)." println("DEBUG: $msg") @@ -1650,18 +1854,71 @@ end @error "Pipeline failed" exception=(e, catch_backtrace()) println("DEBUG: Pipeline caught an exception: $e") finally + # Aggressive memory cleanup + println("DEBUG: Starting aggressive memory cleanup...") + + # Explicitly clear large data structures + try + if current_spectra !== nothing && !isempty(current_spectra) + # Deep clear individual objects to break references effectively + # Use isassigned to prevent UndefRefError if loading failed halfway + for i in eachindex(current_spectra) + if isassigned(current_spectra, i) + s = current_spectra[i] + s.mz = Float64[] + s.intensity = Float64[] + empty!(s.peaks) + end + end + empty!(current_spectra) + end + current_spectra = nothing + + if feature_matrix_result !== nothing + feature_matrix_result = nothing + end + + # Close any open pipeline data handles + if pipeline_msi_data !== nothing + try + close(pipeline_msi_data) + catch + # Already closed, ignore + end + pipeline_msi_data = nothing + end + + println("DEBUG: Data structures cleared. Triggering garbage collection...") + catch cleanup_error + @warn "Error during data cleanup: $cleanup_error" + end + is_processing = false + overall_progress = 0.0 current_pipeline_step = "" println("DEBUG: run_full_pipeline finished (finally block).") - GC.gc() # Trigger garbage collection + + # Force garbage collection multiple times for thorough cleanup + GC.gc() + GC.gc() # Second pass to catch any circular references + + # On Linux/Unix, force Julia to return memory to OS if Sys.islinux() - ccall(:malloc_trim, Int32, (Int32,), 0) # Ensure Julia returns the freed memory to OS + try + ccall(:malloc_trim, Int32, (Int32,), 0) + println("DEBUG: malloc_trim called successfully (Linux).") + catch e + @warn "malloc_trim failed: $e" + end end + + println("DEBUG: Memory cleanup complete.") end end @onbutton recalculate_suggestions_btn begin is_processing = true + push!(__model__) if msi_data === nothing msg = "Please load a file first." warning_msg = true @@ -1903,6 +2160,7 @@ end # This new handler correctly adds the file from full_route to the batch list. @onbutton btnAddBatch begin is_processing = true + push!(__model__) if isempty(full_route) || full_route == "unknown (manually added)" msg = "No active file selected to add to batch." warning_msg = true @@ -1923,6 +2181,7 @@ end @onbutton clear_batch_btn begin is_processing = true + push!(__model__) selected_files = String[] batch_file_count = 0 msg = "Batch cleared" @@ -1974,6 +2233,7 @@ end @onchange btnSearchMzml, btnSearchSync begin is_processing = true + push!(__model__) if btnSearchMzml picked_route = pick_file(; filterlist="mzML,mzml") if !isempty(picked_route) @@ -1997,6 +2257,7 @@ end @onbutton convert_process begin is_processing = true + push!(__model__) if isempty(mzml_full_route) || isempty(sync_full_route) msg_conversion = "Please select both an .mzML file and a .txt sync file." warning_msg = true @@ -2029,6 +2290,7 @@ end @error "Conversion failed" exception=(e, catch_backtrace()) finally is_processing = false + overall_progress = 0.0 # Re-enable button if files are still selected btnConvertDisable = isempty(mzml_full_route) || isempty(sync_full_route) end @@ -2061,6 +2323,7 @@ end return end is_processing = true + push!(__model__) masses = Float64[] try @@ -2087,7 +2350,8 @@ end for (file_idx, file_path) in enumerate(current_selected_files) progress_message = "Processing file $(file_idx)/$(num_files): $(basename(file_path))" - overall_progress = current_step / total_steps + overall_progress = (file_idx - 1) / num_files + push!(__model__) all_params = ( tolerance = current_tol, @@ -2218,6 +2482,10 @@ end end @onbutton createMeanPlot @time begin + # Pre-initialize for safe cleanup in finally block + local xSpectraMz = Vector{Float64}() + local ySpectraMz = Vector{Float64}() + if isempty(selected_folder_main) msg = "No dataset selected. Please process a file and select a folder first." warning_msg = true @@ -2225,6 +2493,7 @@ end end is_processing = true + push!(__model__) try sTime = time() @@ -2275,12 +2544,25 @@ end msg = "Plot loaded in $(eTime) seconds" log_memory_usage("Mean Plot Generated", msi_data) catch e - msg = "Could not generate mean spectrum plot: $e" - warning_msg = true - @error "Mean spectrum plotting failed" exception=(e, catch_backtrace()) - finally - is_processing = false - GC.gc() # Trigger garbage collection + msg = "Could not generate mean spectrum plot: $e" + warning_msg = true + @error "Mean spectrum plotting failed" exception=(e, catch_backtrace()) + finally + is_processing = false + try + if plotdata_before !== nothing + plotdata_before = nothing + end + if !isempty(xSpectraMz) + empty!(xSpectraMz) + end + if !isempty(ySpectraMz) + empty!(ySpectraMz) + end + catch + end + + GC.gc() # Trigger garbage collection if Sys.islinux() ccall(:malloc_trim, Int32, (Int32,), 0) # Ensure Julia returns the freed memory to OS end @@ -2288,6 +2570,10 @@ end end @onbutton createSumPlot @time begin + # Pre-initialize for safe cleanup in finally block + local xSpectraMz = Vector{Float64}() + local ySpectraMz = Vector{Float64}() + if isempty(selected_folder_main) msg = "No dataset selected. Please process a file and select a folder first." warning_msg = true @@ -2295,6 +2581,7 @@ end end is_processing = true + push!(__model__) msg = "Loading total spectrum plot for $(selected_folder_main)..." try @@ -2350,6 +2637,18 @@ end @error "Total spectrum plotting failed" exception=(e, catch_backtrace()) finally is_processing = false + try + if plotdata_before !== nothing + plotdata_before = nothing + end + if !isempty(xSpectraMz) + empty!(xSpectraMz) + end + if !isempty(ySpectraMz) + empty!(ySpectraMz) + end + catch + end GC.gc() # Trigger garbage collection if Sys.islinux() ccall(:malloc_trim, Int32, (Int32,), 0) # Ensure Julia returns the freed memory to OS @@ -2365,6 +2664,7 @@ end end is_processing = true + push!(__model__) msg = "Loading plot for $(selected_folder_main)..." try @@ -2479,6 +2779,7 @@ end end is_processing = true + push!(__model__) msg = "Loading plot for $(selected_folder_main)..." try @@ -3022,6 +3323,7 @@ end return end is_processing = true + push!(__model__) try # --- Get Mask Path --- @@ -3079,6 +3381,7 @@ end end is_processing = true + push!(__model__) try # --- Get Mask Path --- @@ -3137,6 +3440,7 @@ end end is_processing = true + push!(__model__) try sTime=time() @@ -3175,6 +3479,7 @@ end end is_processing = true + push!(__model__) try sTime=time() @@ -3401,6 +3706,10 @@ end @mounted watchplots() @onchange isready begin + # Capture state on first run only + if isempty(INITIAL_MODEL_STATE) + capture_initial_state!(__model__) + end # is_processing = true if isready && !registry_init_done sTime=time() @@ -3471,6 +3780,5 @@ end end end # == Pages == -# Register a new route and the page that will be loaded on access @page("/", "app.jl.html") end \ No newline at end of file diff --git a/app.jl.html b/app.jl.html index 736c96c..8dd5d49 100644 --- a/app.jl.html +++ b/app.jl.html @@ -3,16 +3,30 @@

JuliaMSI 

+ +
+ + Report a Bug + + + Deep Session Reset + +
-
@@ -26,432 +40,521 @@ -
imzML & mzML Data Pre-Treatment
- - -
- - - - - -
+
imzML & mzML Data Pre-Treatment
- -
- -
+ +
+ + + + + +
- - - -
-
-
Quick Test (Subset Processing)
-
Process only the first N spectra to quickly test parameters.
-
-
- -
-
-
- - - -
-
-
-

{{msg}}

+ +
+ +
- -
-
Preview Spectrum:
- - - - Mean spectrum plot - - - Sum Spectrum plot - - - Spectrum plot (X,Y) - - - - Spectrum plot (ID) - - - - -
-
- -
-
- -
-
- -
-
-
- - - - - - - - - - - - - -
-
- + + + +
+
+
Quick Test (Subset Processing)
+
Process only the first N spectra to quickly test parameters.
-
- +
+
- - - - - - - - -
- - - +
+ + + +
+ + +

{{msg}}

+ + +
+
Preview Spectrum:
+ + + + Mean spectrum plot + + + Sum Spectrum plot + + + Spectrum plot (X,Y) + + + + Spectrum plot (ID) + + + + +
+
+ +
+
+ +
+
+ +
+
+
+ + + + + + + + + + + + + +
+
+ +
+
+ +
+
+
+
+ + + + + +
+
+ + + +
+
+
+
+ +
Preprocessing Pipeline
+ + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
-
-
- -
Preprocessing Pipeline
- - - - - + - - - - - - - - - - + + +
Method
+
The algorithm to use for baseline correction.
+
+ +
+
+
+
+ +
Parameters
+
+ +
+
+ +
+
+ +
+
+
+
- - - - -
-
- -
-
- -
-
-
-
+ + +
Method
+
The normalization method to apply.
+
+ +
+
+
+
+
+
- - -
Method
-
The algorithm to use for baseline correction.
-
- -
-
-
-
- -
Parameters
-
- -
-
- -
-
- -
-
-
-
+ + +
Method
+
The alignment algorithm.
+
+ +
+
+
+
+ +
Parameters
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+
- - -
Method
-
The normalization method to apply.
-
- -
-
-
-
-
-
+ + +
Parameters
+
+ +
+
+ +
+
+ +
+
+
+
- - -
Method
-
The alignment algorithm.
-
- -
-
-
-
- -
Parameters
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
-
-
+ + +
Method
+
The peak detection algorithm.
+
+ +
+
+
+
+ +
Parameters
+
+ +
+
+ +
+
+ +
+
+
+
+ +
+
+ +
+
+
+
+ +
+
+ +
+
+ +
+
- - -
Parameters
-
- -
-
- -
-
- -
-
-
-
+ + +
Peak Quality Filters
+
+ +
+
+ +
+
+ +
+
+
+
+ +
+
+ +
+
+
+
+ +
+
+ +
+
+
+
- - -
Method
-
The peak detection algorithm.
-
- -
-
-
-
- -
Parameters
-
- -
-
- -
-
- -
-
-
-
- -
-
- -
-
-
-
- -
-
- -
-
- -
-
+ + +
Method
+
The binning strategy.
+
+ +
+
+
+ +
Parameters
+
+ +
+
+ +
+
+ +
+
+
+
+ +
+
+ +
+
+
+
+ +
+
+ +
+
+ +
+
- - -
Peak Quality Filters
-
- -
-
- -
-
- -
-
-
-
- -
-
- -
-
-
-
- -
-
- -
-
-
-
+
+
- - -
Method
-
The binning strategy.
-
- -
-
-
- -
Parameters
-
- -
-
- -
-
- -
+ +
+ + +
-
-
- -
-
- -
-
-
-
- -
-
- -
-
- - - - - - - - -
- - - -
- +
imzML & mzML Data Processor

Please make sure the ibd and imzML file are located in the same directory and have the same name. @@ -467,9 +570,10 @@ - - + +

@@ -477,7 +581,8 @@ {{ file }} - + @@ -495,12 +600,14 @@
+ :rules="[val => !!val || '* Required', val => val >= 0.0 && val <= 1.0 || 'Needs to be in range between 0 and 1']" + :readonly="is_processing">
+ :rules="[ val => !!val || '* Required', val => val >= 2 && val <= 256 || 'Needs to be in range between 2 and 256']" + :readonly="is_processing">
@@ -519,7 +626,8 @@ + ]" :readonly="is_processing || !triqEnabled" + :disable="is_processing || !triqEnabled">
@@ -560,7 +668,7 @@
+ hint="Not for Mean/Sum plots." :readonly="is_processing">
- - + +
{{ progress_message }}
@@ -687,7 +796,8 @@
Before Preprocessing
- + @@ -710,8 +820,10 @@ - - + +
@@ -733,8 +845,10 @@ - - + +
@@ -834,8 +948,8 @@
+ label="Select Left Dataset" class="q-ma-sm" style="min-width: 200px;" v-on:focus="refetch_folders = true" + :disable="is_processing"> @@ -845,9 +959,10 @@
- - + +
@@ -867,9 +982,10 @@
- - + +
@@ -904,8 +1020,8 @@
+ label="Select Right Dataset" class="q-ma-sm" style="min-width: 200px;" v-on:focus="refetch_folders = true" + :disable="is_processing"> @@ -915,9 +1031,10 @@
- - + +
@@ -937,9 +1054,10 @@
- - + +
@@ -1028,3 +1146,37 @@ + + + + +
Report a Bug
+ + +
+ + +

To help us fix the issue, please send an email to:

+
+ julian.sierrag@icloud.com +
+ +

Subject: JuliaMSI Bug

+ + + + Please include: +
    +
  • The full error message.
  • +
  • Steps to reproduce the crash.
  • +
+
+
+ + + + +
+
\ No newline at end of file diff --git a/julia_imzML_visual.jl b/julia_imzML_visual.jl index 37325e4..da11bd3 100644 --- a/julia_imzML_visual.jl +++ b/julia_imzML_visual.jl @@ -1,6 +1,5 @@ # julia_imzML_visual.jl -const REGISTRY_LOCK = ReentrantLock() """ increment_image(current_image, image_list) diff --git a/mask.jl b/mask.jl index 608269b..8b0df75 100644 --- a/mask.jl +++ b/mask.jl @@ -9,7 +9,7 @@ using Statistics, NaturalSort, LinearAlgebra, StipplePlotly using Base.Filesystem: mv using MSI_src -using .MSI_src: MSIData, process_image_pipeline +using .MSI_src: MSIData, process_image_pipeline, REGISTRY_LOCK # Plot Handling include("./julia_imzML_visual.jl") @@ -799,8 +799,10 @@ end end # Save the updated registry - open(reg_path, "w") do f - JSON.print(f, registry, 4) + lock(REGISTRY_LOCK) do + open(reg_path, "w") do f + JSON.print(f, registry, 4) + end end @info "Registry updated with mask: $(final_mask_name)" @@ -874,8 +876,10 @@ end if !isempty(new_folders) || !isempty(removed_folders) println("Registry changed, saving...") - open(reg_path, "w") do f - JSON.print(f, registry, 4) + lock(REGISTRY_LOCK) do + open(reg_path, "w") do f + JSON.print(f, registry, 4) + end end end diff --git a/src/Common.jl b/src/Common.jl index 850a466..b74d969 100644 --- a/src/Common.jl +++ b/src/Common.jl @@ -82,30 +82,35 @@ A dramatically simplified buffer pool that avoids complex locking. mutable struct SimpleBufferPool buffers::Dict{Int, Vector{Vector{UInt8}}} max_pool_size::Int + lock::ReentrantLock # Add lock for thread safety end -SimpleBufferPool() = SimpleBufferPool(Dict{Int, Vector{Vector{UInt8}}}(), 50) +SimpleBufferPool() = SimpleBufferPool(Dict{Int, Vector{Vector{UInt8}}}(), 50, ReentrantLock()) function get_buffer!(pool::SimpleBufferPool, size::Int)::Vector{UInt8} - # Check for existing buffers of exact size first - if haskey(pool.buffers, size) && !isempty(pool.buffers[size]) - return pop!(pool.buffers[size]) + lock(pool.lock) do + # Check for existing buffers of exact size first + if haskey(pool.buffers, size) && !isempty(pool.buffers[size]) + return pop!(pool.buffers[size]) + end end - # No suitable buffer found, allocate new one + # No suitable buffer found, allocate new one (outside lock to reduce contention) return Vector{UInt8}(undef, size) end function release_buffer!(pool::SimpleBufferPool, buffer::Vector{UInt8}) size = length(buffer) - if !haskey(pool.buffers, size) - pool.buffers[size] = Vector{Vector{UInt8}}() - end - - # Limit pool size to prevent memory bloat - if length(pool.buffers[size]) < pool.max_pool_size - push!(pool.buffers[size], buffer) + lock(pool.lock) do + if !haskey(pool.buffers, size) + pool.buffers[size] = Vector{Vector{UInt8}}() + end + + # Limit pool size to prevent memory bloat + if length(pool.buffers[size]) < pool.max_pool_size + push!(pool.buffers[size], buffer) + end end # If pool is full, let buffer get GC'd end diff --git a/src/MSIData.jl b/src/MSIData.jl index 439ebd6..3b4e553 100644 --- a/src/MSIData.jl +++ b/src/MSIData.jl @@ -35,7 +35,12 @@ Atomically seeks to a position and reads data into an array. This is the thread- way to read from a specific offset in the file. """ function read_at!(tsfh::ThreadSafeFileHandle, a::AbstractArray, pos::Integer) + if pos < 0 + throw(ArgumentError("Invalid seek position: $pos")) + end lock(tsfh.lock) do + # Also check against file size if possible, though filesize() might be expensive to call repeatedly + # Let's rely on seek throwing if it goes way out of bounds, but catch the negative case which is definitely an error. seek(tsfh.handle, pos) read!(tsfh.handle, a) end @@ -510,6 +515,19 @@ function read_spectrum_from_disk(source::ImzMLSource, meta::SpectrumMetadata) mz = Array{source.mz_format}(undef, meta.mz_asset.encoded_length) intensity = Array{source.intensity_format}(undef, meta.int_asset.encoded_length) + # Validate offsets before reading + file_size = filesize(source.ibd_handle) + + mz_end = meta.mz_asset.offset + sizeof(source.mz_format) * meta.mz_asset.encoded_length + if meta.mz_asset.offset < 0 || mz_end > file_size + throw(FileFormatError("Invalid m/z data offset/length for spectrum $(meta.id): offset=$(meta.mz_asset.offset), end=$mz_end, file_size=$file_size")) + end + + int_end = meta.int_asset.offset + sizeof(source.intensity_format) * meta.int_asset.encoded_length + if meta.int_asset.offset < 0 || int_end > file_size + throw(FileFormatError("Invalid intensity data offset/length for spectrum $(meta.id): offset=$(meta.int_asset.offset), end=$int_end, file_size=$file_size")) + end + # Use the new atomic read_at! method for thread-safety read_at!(source.ibd_handle, mz, meta.mz_asset.offset) read_at!(source.ibd_handle, intensity, meta.int_asset.offset) diff --git a/src/MSI_src.jl b/src/MSI_src.jl index 3dd7243..4ab390f 100644 --- a/src/MSI_src.jl +++ b/src/MSI_src.jl @@ -19,7 +19,11 @@ export OpenMSIData, get_global_mz_range, MSIData, _iterate_spectra_fast, - validate_spectrum + validate_spectrum, + REGISTRY_LOCK + +# Define shared registry lock +const REGISTRY_LOCK = ReentrantLock() # Export the public preprocessing & precalculations API export run_preprocessing_analysis, diff --git a/src/Precalculations.jl b/src/Precalculations.jl index 70e28f7..a99b74f 100644 --- a/src/Precalculations.jl +++ b/src/Precalculations.jl @@ -1,4 +1,5 @@ using StatsBase # For mean, std, median, quantile, mad +using Base.Threads # For atomic counters and locking # ============================================================================= # 7) Spatial & Advanced Processing (Stubs & New Functions) @@ -80,11 +81,12 @@ function analyze_mass_accuracy( println("Analyzing mass accuracy for $(length(spectrum_indices)) spectra...") all_ppm_errors = Float64[] - total_matched_peaks = 0 - total_spectra_processed = 0 + total_matched_peaks = Atomic{Int}(0) + total_spectra_processed = Atomic{Int}(0) + results_lock = ReentrantLock() _iterate_spectra_fast(msi_data, spectrum_indices) do idx, mz, intensity - total_spectra_processed += 1 + atomic_add!(total_spectra_processed, 1) if !validate_spectrum(mz, intensity) @warn "Spectrum $idx is invalid, skipping mass accuracy analysis for it." return @@ -106,8 +108,10 @@ function analyze_mass_accuracy( end if best_matched_peak_mz !== nothing - push!(all_ppm_errors, min_ppm_error) - total_matched_peaks += 1 + lock(results_lock) do + push!(all_ppm_errors, min_ppm_error) + end + atomic_add!(total_matched_peaks, 1) end end end @@ -140,8 +144,8 @@ function analyze_mass_accuracy( std_ppm_error = std_err, min_ppm_error = min_err, max_ppm_error = max_err, - total_matched_peaks = total_matched_peaks, - total_spectra_analyzed = total_spectra_processed, + total_matched_peaks = total_matched_peaks[], + total_spectra_analyzed = total_spectra_processed[], ppm_error_distribution = all_ppm_errors ) end @@ -318,21 +322,29 @@ function analyze_instrument_characteristics(msi_data::MSIData; sample_indices::A return results end + results_lock = ReentrantLock() + _iterate_spectra_fast(msi_data, sample_indices) do idx, mz, intensity # Record spectrum mode - push!(spectrum_modes, msi_data.spectra_metadata[idx].mode) + lock(results_lock) do + push!(spectrum_modes, msi_data.spectra_metadata[idx].mode) + end # Calculate m/z step statistics (for profile data) if length(mz) > 1 && msi_data.spectra_metadata[idx].mode == PROFILE steps = diff(mz) if !isempty(steps) - push!(mz_step_sizes, mean(steps)) + lock(results_lock) do + push!(mz_step_sizes, mean(steps)) + end end end # Record intensity range if !isempty(intensity) - push!(intensity_ranges, (minimum(intensity), maximum(intensity))) + lock(results_lock) do + push!(intensity_ranges, (minimum(intensity), maximum(intensity))) + end end end @@ -442,11 +454,15 @@ function analyze_signal_quality(msi_data::MSIData; sample_indices::AbstractVecto return results end + results_lock = ReentrantLock() + _iterate_spectra_fast(msi_data, sample_indices) do idx, mz, intensity if !isempty(intensity) # Noise estimation using MAD noise = mad(intensity, normalize=true) - push!(noise_levels, noise) + lock(results_lock) do + push!(noise_levels, noise) + end # FIX: More robust SNR calculation valid_intensity = intensity[intensity .> 0] # Remove zeros @@ -458,12 +474,16 @@ function analyze_signal_quality(msi_data::MSIData; sample_indices::AbstractVecto if noise_robust > 0 && isfinite(signal_estimate) snr_val = signal_estimate / noise_robust # Cap unrealistic SNR values - push!(snr_distribution, min(snr_val, 1e6)) + lock(results_lock) do + push!(snr_distribution, min(snr_val, 1e6)) + end end end # Total ion count - push!(tic_values, sum(intensity)) + lock(results_lock) do + push!(tic_values, sum(intensity)) + end end end @@ -651,20 +671,23 @@ function analyze_peak_characteristics(msi_data::MSIData, instrument_analysis::Di peak_counts = Int[] fwhm_values = Float64[] - spectra_analyzed = 0 - peaks_analyzed = 0 + spectra_analyzed = Atomic{Int}(0) + peaks_analyzed = Atomic{Int}(0) + results_lock = ReentrantLock() _iterate_spectra_fast(msi_data, spectrum_indices) do idx, mz, intensity if length(mz) < 10 # Skip spectra with too few points return end - spectra_analyzed += 1 + atomic_add!(spectra_analyzed, 1) meta = msi_data.spectra_metadata[idx] # Detect peaks with lower SNR threshold to find more peaks peaks = detect_peaks_profile_core(mz, intensity; snr_threshold=2.0) - push!(peak_counts, length(peaks)) + lock(results_lock) do + push!(peak_counts, length(peaks)) + end if !isempty(peaks) # Analyze the strongest 3 peaks per spectrum @@ -679,15 +702,17 @@ function analyze_peak_characteristics(msi_data::MSIData, instrument_analysis::Di if !isnan(fwhm_delta_m) && fwhm_delta_m > 0.001 && fwhm_delta_m < 0.5 # Reasonable range in Da fwhm_ppm = 1e6 * fwhm_delta_m / peak.mz if 5.0 < fwhm_ppm < 500.0 # Reasonable ppm range - push!(peak_widths_ppm, fwhm_ppm) - push!(fwhm_values, fwhm_delta_m) + lock(results_lock) do + push!(peak_widths_ppm, fwhm_ppm) + push!(fwhm_values, fwhm_delta_m) + + r2 = _fit_gaussian_and_r2(mz, intensity, peak_idx, 5) + push!(r_squared_values, r2) + end + atomic_add!(peaks_analyzed, 1) - r2 = _fit_gaussian_and_r2(mz, intensity, peak_idx, 5) - push!(r_squared_values, r2) - peaks_analyzed += 1 - - if peaks_analyzed <= 3 - println("DEBUG: Peak at m/z $(peak.mz), FWHM = $(fwhm_ppm) ppm, R² = $r2") + if peaks_analyzed[] <= 3 + println("DEBUG: Peak at m/z $(peak.mz), FWHM = $(fwhm_ppm) ppm, R² = $(r_squared_values[end])") end end end @@ -698,7 +723,7 @@ function analyze_peak_characteristics(msi_data::MSIData, instrument_analysis::Di end end - println("DEBUG: Analyzed $peaks_analyzed peaks from $spectra_analyzed spectra") + println("DEBUG: Analyzed $(peaks_analyzed[]) peaks from $(spectra_analyzed[]) spectra") if !isempty(peak_widths_ppm) results[:mean_fwhm_ppm] = mean(peak_widths_ppm) @@ -727,9 +752,13 @@ function analyze_peak_characteristics(msi_data::MSIData, instrument_analysis::Di peak_counts = Int[] + results_lock = ReentrantLock() + _iterate_spectra_fast(msi_data, spectrum_indices) do idx, mz, intensity if !isempty(mz) - push!(peak_counts, length(mz)) + lock(results_lock) do + push!(peak_counts, length(mz)) + end end end diff --git a/src/PreprocessingPipeline.jl b/src/PreprocessingPipeline.jl index 5118dad..c990156 100644 --- a/src/PreprocessingPipeline.jl +++ b/src/PreprocessingPipeline.jl @@ -33,7 +33,15 @@ function apply_baseline_correction(spectra::Vector{MutableSpectrum}, params::Dic Threads.@threads for s in spectra if validate_spectrum(s.mz, s.intensity) + original_length = length(s.intensity) baseline = apply_baseline_correction_core(s.intensity; method=method, iterations=iterations, window=window) + + # CRITICAL: Ensure baseline has the same length as intensity + if length(baseline) != original_length + @warn "Baseline correction: length mismatch for spectrum $(s.id). baseline=$(length(baseline)), intensity=$original_length. Skipping this spectrum." + continue + end + s.intensity = max.(0.0, s.intensity .- baseline) end end @@ -53,7 +61,16 @@ function apply_intensity_transformation(spectra::Vector{MutableSpectrum}, params Threads.@threads for s in spectra if validate_spectrum(s.mz, s.intensity) - s.intensity = transform_intensity_core(s.intensity; method=method) + original_length = length(s.intensity) + transformed = transform_intensity_core(s.intensity; method=method) + + # CRITICAL: Ensure transformation preserves array length + if length(transformed) != original_length + @warn "Intensity transformation: length mismatch for spectrum $(s.id). transformed=$(length(transformed)), original=$original_length. Skipping this spectrum." + continue + end + + s.intensity = transformed end end end @@ -76,8 +93,16 @@ function apply_smoothing(spectra::Vector{MutableSpectrum}, params::Dict) Threads.@threads for s in spectra if validate_spectrum(s.mz, s.intensity) - smoothed_intensity = max.(0.0, smooth_spectrum_core(s.intensity; method=method, window=window, order=order)) - s.intensity = smoothed_intensity + original_length = length(s.intensity) + smoothed_intensity = smooth_spectrum_core(s.intensity; method=method, window=window, order=order) + + # CRITICAL: Ensure smoothing preserves array length + if length(smoothed_intensity) != original_length + @warn "Smoothing: length mismatch for spectrum $(s.id). smoothed=$(length(smoothed_intensity)), original=$original_length, method=$method, window=$window. Skipping this spectrum." + continue + end + + s.intensity = max.(0.0, smoothed_intensity) end end end @@ -104,6 +129,7 @@ function apply_peak_picking(spectra::Vector{MutableSpectrum}, params::Dict) Threads.@threads for s in spectra if validate_spectrum(s.mz, s.intensity) + # old_len = length(s.peaks) if method == :profile s.peaks = detect_peaks_profile_core(s.mz, s.intensity; snr_threshold=snr_threshold, half_window=half_window, min_peak_prominence=min_peak_prominence, merge_peaks_tolerance=merge_peaks_tolerance) elseif method == :wavelet @@ -113,6 +139,7 @@ function apply_peak_picking(spectra::Vector{MutableSpectrum}, params::Dict) else s.peaks = detect_peaks_profile_core(s.mz, s.intensity; snr_threshold=snr_threshold, half_window=half_window) end + # @info "Spectrum $(s.id): detected $(length(s.peaks)) peaks" else s.peaks = [] end @@ -182,12 +209,21 @@ function apply_calibration(spectra::Vector{MutableSpectrum}, params::Dict, refer Threads.@threads for i in 1:length(spectra) s = spectra[i] if validate_spectrum(s.mz, s.intensity) + original_length = length(s.mz) matched_peaks = find_calibration_peaks_core(s.mz, s.intensity, reference_masses; ppm_tolerance=ppm_tolerance) if length(matched_peaks) >= 2 measured = sort(collect(values(matched_peaks))) theoretical = sort(collect(keys(matched_peaks))) itp = linear_interpolation(measured, theoretical, extrapolation_bc=Line()) - s.mz = itp(s.mz) # Modify mz-axis in-place + new_mz = itp(s.mz) + + # CRITICAL: Ensure m/z axis preserves array length + if length(new_mz) != original_length + @warn "Calibration: length mismatch for spectrum $(s.id). new_mz=$(length(new_mz)), original=$original_length. Skipping this spectrum." + continue + end + + s.mz = new_mz # Modify mz-axis in-place else @warn "Spectrum $(s.id): insufficient reference peaks ($(length(matched_peaks)) found), skipping calibration." end @@ -233,7 +269,16 @@ function apply_peak_alignment(spectra::Vector{MutableSpectrum}, params::Dict) current_peaks_mz = [p.mz for p in s.peaks] alignment_func = align_peaks_lowess_core(ref_peaks_mz, current_peaks_mz; method=method, tolerance=tolerance, tolerance_unit=tolerance_unit) - s.mz = alignment_func.(s.mz) # Update m/z axis + original_length = length(s.mz) + new_mz = alignment_func.(s.mz) + + # CRITICAL: Ensure alignment preserves array length + if length(new_mz) != original_length + @warn "Peak alignment: m/z length mismatch for spectrum $(s.id). new_mz=$(length(new_mz)), original=$original_length. Skipping this spectrum." + continue + end + + s.mz = new_mz # Update m/z axis # Update peak m/z values for i in 1:length(s.peaks) @@ -258,7 +303,16 @@ function apply_normalization(spectra::Vector{MutableSpectrum}, params::Dict) Threads.@threads for s in spectra if validate_spectrum(s.mz, s.intensity) - s.intensity = apply_normalization_core(s.intensity; method=method) + original_length = length(s.intensity) + normalized = apply_normalization_core(s.intensity; method=method) + + # CRITICAL: Ensure normalization preserves array length + if length(normalized) != original_length + @warn "Normalization: length mismatch for spectrum $(s.id). normalized=$(length(normalized)), original=$original_length. Skipping this spectrum." + continue + end + + s.intensity = normalized end end end diff --git a/start_MSI_GUI.jl b/start_MSI_GUI.jl index ffc8250..1e1c14a 100644 --- a/start_MSI_GUI.jl +++ b/start_MSI_GUI.jl @@ -6,17 +6,14 @@ ENV["GENIE_ENV"] = "dev" manifest_path = joinpath(@__DIR__, "Manifest.toml") -# Only instantiate in development mode -if get(ENV, "GENIE_ENV", "dev") != "prod" || !isfile(manifest_path) - @info "Development environment detected. Instantiating packages..." - - if !isfile(manifest_path) - @info "Manifest.toml not found. Generating it based on Project.toml..." - end - +# Selective instantiation for faster startup +if get(ENV, "GENIE_ENV", "dev") != "prod" && !isfile(manifest_path) + @info "Development environment detected and Manifest.toml missing. Instantiating packages..." Pkg.resolve() Pkg.instantiate() Pkg.gc() +elseif get(ENV, "GENIE_ENV", "dev") != "prod" + @info "Manifest.toml found. Skipping Pkg.instantiate() for faster boot. Delete Manifest.toml if you need to re-instantiate." end using Genie diff --git a/test/test_buffer_pool_concurrency.jl b/test/test_buffer_pool_concurrency.jl new file mode 100644 index 0000000..3896b2e --- /dev/null +++ b/test/test_buffer_pool_concurrency.jl @@ -0,0 +1,32 @@ +using MSI_src +using Test +using Base.Threads + +@testset "SimpleBufferPool Concurrency Stress Test" begin + pool = MSI_src.SimpleBufferPool() + n_threads = Threads.nthreads() + n_iterations = 1000 + buffer_size = 1024 + + println("Running buffer pool stress test with $n_threads threads...") + + # Parallel stress test + Threads.@threads for i in 1:(n_threads * n_iterations) + # get_buffer! and release_buffer! are now thread-safe + buf = MSI_src.get_buffer!(pool, buffer_size) + + # Simulate some work + fill!(buf, UInt8(i % 256)) + + MSI_src.release_buffer!(pool, buf) + end + + # After stress test, the dictionary should be coherent + sizes = collect(keys(pool.buffers)) + if !isempty(sizes) + @test buffer_size ∈ sizes + @test length(pool.buffers[buffer_size]) <= pool.max_pool_size + end + + println("Buffer pool stress test PASSED.") +end diff --git a/test/test_pipeline_concurrency.jl b/test/test_pipeline_concurrency.jl new file mode 100644 index 0000000..2e5f5c6 --- /dev/null +++ b/test/test_pipeline_concurrency.jl @@ -0,0 +1,146 @@ + +using Pkg +Pkg.activate(joinpath(@__DIR__, "..")) +using MSI_src +using Test +using Base.Threads + +# --- Test Configuration --- +const TEST_FILE = "/home/pixel/Documents/Cinvestav_2025/Analisis/Stomach/Stomach_DHB_uncompressed.imzML" + +println("Starting concurrency test with file: $TEST_FILE") + +if !isfile(TEST_FILE) + error("Test file not found: $TEST_FILE") +end + +# --- Simulation of the Concurrency Issue --- + +# Global "UI State" variable simulates the app's msi_data +global_msi_data = nothing +const GLOBAL_LOCK = ReentrantLock() + +function ui_load_file(path) + global global_msi_data + lock(GLOBAL_LOCK) do + if global_msi_data !== nothing + close(global_msi_data) + end + println("UI: Loading file...") + global_msi_data = OpenMSIData(path) + println("UI: File loaded.") + end +end + +function ui_close_file() + global global_msi_data + lock(GLOBAL_LOCK) do + if global_msi_data !== nothing + println("UI: Closing file...") + close(global_msi_data) + global_msi_data = nothing + println("UI: File closed.") + end + end +end + +# Mock pipeline function that mimics `run_full_pipeline` in app.jl +# Crucially, it uses its own local `pipeline_msi_data` as per the fix +function run_mock_pipeline_isolated(path) + println("Pipeline: Starting isolated pipeline...") + + # 1. Open ISOLATED instance + pipeline_msi_data = OpenMSIData(path) + println("Pipeline: Opened isolated MSIData instance.") + + try + # 2. Simulate reading spectra + indices = 1:min(100, length(pipeline_msi_data.spectra_metadata)) # Read first 100 spectra + + # Artificial delay to allow "user" interaction + sleep(0.5) + + println("Pipeline: Reading spectra...") + Threads.@threads for i in indices + # Use local instance + mz, int = GetSpectrum(pipeline_msi_data, i) + # Simulate processing work + sum(int) + end + println("Pipeline: Finished reading spectra successfully.") + return true + catch e + println("Pipeline: CRASHED with error: $e") + return false + finally + close(pipeline_msi_data) + println("Pipeline: Closed isolated MSIData instance.") + end +end + +# Mock pipeline that uses GLOBAL instance (The BUGGY version) +function run_mock_pipeline_buggy() + println("Buggy Pipeline: Starting...") + # Uses global_msi_data directly + + try + global global_msi_data + if global_msi_data === nothing + println("Buggy Pipeline: No data loaded!") + return false + end + + local_ref = global_msi_data # Still points to same object + + indices = 1:min(100, length(local_ref.spectra_metadata)) + + sleep(0.5) + + println("Buggy Pipeline: Reading spectra from shared object...") + Threads.@threads for i in indices + # This will fail if ui_close_file() happens concurrently + mz, int = GetSpectrum(local_ref, i) + sum(int) + end + println("Buggy Pipeline: Success (Unexpected if concurrency worked)") + return true + catch e + println("Buggy Pipeline: CRASHED as expected: $e") + return false + end +end + + +# --- execute checks --- + +@testset "Concurrency Crash Fix Verification" begin + + # 1. Setup: Load file initially + ui_load_file(TEST_FILE) + + # 2. Test the FIX: Isolated Pipeline + println("\n--- Testing Fixed (Isolated) Pipeline ---") + + t_pipeline = Threads.@spawn run_mock_pipeline_isolated(TEST_FILE) + + # Simulate user closing/reloading file while pipeline runs + sleep(0.2) + ui_close_file() + + # Wait for pipeline + success = fetch(t_pipeline) + @test success == true + println("Fixed pipeline result: ", success ? "PASSED" : "FAILED") + + + # 3. Test the BUG: Global Pipeline (Optional, to prove it crashes without fix) + # Uncomment to verify the bug exists if needed, but we assume it does based on user report. + # println("\n--- Testing Buggy (Shared) Pipeline ---") + # ui_load_file(TEST_FILE) + # t_buggy = Threads.@spawn run_mock_pipeline_buggy() + # sleep(0.2) + # ui_close_file() + # buggy_success = fetch(t_buggy) + # println("Buggy pipeline result: ", buggy_success ? "PASSED (No crash?)" : "FAILED (Crashed as expected)") + +end