diff --git a/Project.toml b/Project.toml index f7a74a2d..c69eb30a 100644 --- a/Project.toml +++ b/Project.toml @@ -1,7 +1,7 @@ name = "AdvancedPS" uuid = "576499cb-2369-40b2-a588-c64705576edc" authors = ["TuringLang"] -version = "0.4" +version = "0.4.0" [deps] AbstractMCMC = "80f14c24-f653-4e6a-9b94-39d6b0f70001" diff --git a/examples/gaussian-ssm/Manifest.toml b/examples/gaussian-ssm/Manifest.toml deleted file mode 100644 index e077aa73..00000000 --- a/examples/gaussian-ssm/Manifest.toml +++ /dev/null @@ -1,1077 +0,0 @@ -# This file is machine-generated - editing it directly is not advised - -[[AbstractMCMC]] -deps = ["BangBang", "ConsoleProgressMonitor", "Distributed", "Logging", "LoggingExtras", "ProgressLogging", "Random", "StatsBase", "TerminalLoggers", "Transducers"] -git-tree-sha1 = "db0a7ff3fbd987055c43b4e12d2fa30aaae8749c" -uuid = "80f14c24-f653-4e6a-9b94-39d6b0f70001" -version = "3.2.1" - -[[AbstractTrees]] -git-tree-sha1 = "03e0550477d86222521d254b741d470ba17ea0b5" -uuid = "1520ce14-60c1-5f80-bbc7-55ef81b5835c" -version = "0.3.4" - -[[Adapt]] -deps = ["LinearAlgebra"] -git-tree-sha1 = "84918055d15b3114ede17ac6a7182f68870c16f7" -uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" -version = "3.3.1" - -[[AdvancedPS]] -deps = ["AbstractMCMC", "Distributions", "Libtask", "Random", "StatsFuns"] -git-tree-sha1 = "06da6c283cf17cf0f97ed2c07c29b6333ee83dc9" -uuid = "576499cb-2369-40b2-a588-c64705576edc" -version = "0.2.4" - -[[ArgCheck]] -git-tree-sha1 = "dedbbb2ddb876f899585c4ec4433265e3017215a" -uuid = "dce04be8-c92d-5529-be00-80e4d2c0e197" -version = "2.1.0" - -[[ArgTools]] -git-tree-sha1 = "bdf73eec6a88885256f282d48eafcad25d7de494" -uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" -version = "1.1.1" - -[[Artifacts]] -deps = ["Pkg"] -git-tree-sha1 = "c30985d8821e0cd73870b17b0ed0ce6dc44cb744" -uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" -version = "1.3.0" - -[[BangBang]] -deps = ["Compat", "ConstructionBase", "Future", "InitialValues", "LinearAlgebra", "Requires", "Setfield", "Tables", "ZygoteRules"] -git-tree-sha1 = "0ad226aa72d8671f20d0316e03028f0ba1624307" -uuid = "198e06fe-97b7-11e9-32a5-e1d131e6ad66" -version = "0.3.32" - -[[Base64]] -uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" - -[[Baselet]] -git-tree-sha1 = "aebf55e6d7795e02ca500a689d326ac979aaf89e" -uuid = "9718e550-a3fa-408a-8086-8db961cd8217" -version = "0.1.1" - -[[Bzip2_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "c3598e525718abcc440f69cc6d5f60dda0a1b61e" -uuid = "6e34b625-4abd-537c-b88f-471c36dfa7a0" -version = "1.0.6+5" - -[[Cairo_jll]] -deps = ["Artifacts", "Bzip2_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "JLLWrappers", "LZO_jll", "Libdl", "Pixman_jll", "Pkg", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Zlib_jll", "libpng_jll"] -git-tree-sha1 = "e2f47f6d8337369411569fd45ae5753ca10394c6" -uuid = "83423d85-b0ee-5818-9007-b63ccbeb887a" -version = "1.16.0+6" - -[[ChainRulesCore]] -deps = ["Compat", "LinearAlgebra", "SparseArrays"] -git-tree-sha1 = "f885e7e7c124f8c92650d61b9477b9ac2ee607dd" -uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" -version = "1.11.1" - -[[ChangesOfVariables]] -deps = ["LinearAlgebra", "Test"] -git-tree-sha1 = "9a1d594397670492219635b35a3d830b04730d62" -uuid = "9e997f8a-9a97-42d5-a9f1-ce6bfc15e2c0" -version = "0.1.1" - -[[ColorSchemes]] -deps = ["ColorTypes", "Colors", "FixedPointNumbers", "Random"] -git-tree-sha1 = "a851fec56cb73cfdf43762999ec72eff5b86882a" -uuid = "35d6a980-a343-548e-a6ea-1d62b119f2f4" -version = "3.15.0" - -[[ColorTypes]] -deps = ["FixedPointNumbers", "Random"] -git-tree-sha1 = "024fe24d83e4a5bf5fc80501a314ce0d1aa35597" -uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f" -version = "0.11.0" - -[[Colors]] -deps = ["ColorTypes", "FixedPointNumbers", "Reexport"] -git-tree-sha1 = "417b0ed7b8b838aa6ca0a87aadf1bb9eb111ce40" -uuid = "5ae59095-9a9b-59fe-a467-6f913c188581" -version = "0.12.8" - -[[Compat]] -deps = ["Base64", "Dates", "DelimitedFiles", "Distributed", "InteractiveUtils", "LibGit2", "Libdl", "LinearAlgebra", "Markdown", "Mmap", "Pkg", "Printf", "REPL", "Random", "SHA", "Serialization", "SharedArrays", "Sockets", "SparseArrays", "Statistics", "Test", "UUIDs", "Unicode"] -git-tree-sha1 = "dce3e3fea680869eaa0b774b2e8343e9ff442313" -uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" -version = "3.40.0" - -[[CompilerSupportLibraries_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "8e695f735fca77e9708e795eda62afdb869cbb70" -uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" -version = "0.3.4+0" - -[[CompositionsBase]] -git-tree-sha1 = "455419f7e328a1a2493cabc6428d79e951349769" -uuid = "a33af91c-f02d-484b-be07-31d278c5ca2b" -version = "0.1.1" - -[[ConsoleProgressMonitor]] -deps = ["Logging", "ProgressMeter"] -git-tree-sha1 = "3ab7b2136722890b9af903859afcf457fa3059e8" -uuid = "88cd18e8-d9cc-4ea6-8889-5259c0d15c8b" -version = "0.1.2" - -[[ConstructionBase]] -deps = ["LinearAlgebra"] -git-tree-sha1 = "f74e9d5388b8620b4cee35d4c5a618dd4dc547f4" -uuid = "187b0558-2788-49d3-abe0-74a17ed4e7c9" -version = "1.3.0" - -[[Contour]] -deps = ["StaticArrays"] -git-tree-sha1 = "9f02045d934dc030edad45944ea80dbd1f0ebea7" -uuid = "d38c429a-6771-53c6-b99e-75d170b6e991" -version = "0.5.7" - -[[DataAPI]] -git-tree-sha1 = "cc70b17275652eb47bc9e5f81635981f13cea5c8" -uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a" -version = "1.9.0" - -[[DataStructures]] -deps = ["Compat", "InteractiveUtils", "OrderedCollections"] -git-tree-sha1 = "7d9d316f04214f7efdbb6398d545446e246eff02" -uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" -version = "0.18.10" - -[[DataValueInterfaces]] -git-tree-sha1 = "bfc1187b79289637fa0ef6d4436ebdfe6905cbd6" -uuid = "e2d170a0-9d28-54be-80f0-106bbe20a464" -version = "1.0.0" - -[[Dates]] -deps = ["Printf"] -uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" - -[[DefineSingletons]] -git-tree-sha1 = "77b4ca280084423b728662fe040e5ff8819347c5" -uuid = "244e2a9f-e319-4986-a169-4d1fe445cd52" -version = "0.1.1" - -[[DelimitedFiles]] -deps = ["Mmap"] -uuid = "8bb1440f-4735-579b-a4ab-409b98df4dab" - -[[DensityInterface]] -deps = ["InverseFunctions", "Test"] -git-tree-sha1 = "794daf62dce7df839b8ed446fc59c68db4b5182f" -uuid = "b429d917-457f-4dbc-8f4c-0cc954292b1d" -version = "0.3.3" - -[[Distributed]] -deps = ["Random", "Serialization", "Sockets"] -uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" - -[[Distributions]] -deps = ["ChainRulesCore", "DensityInterface", "FillArrays", "LinearAlgebra", "PDMats", "Printf", "QuadGK", "Random", "SparseArrays", "SpecialFunctions", "Statistics", "StatsBase", "StatsFuns", "Test"] -git-tree-sha1 = "cce8159f0fee1281335a04bbf876572e46c921ba" -uuid = "31c24e10-a181-5473-b8eb-7969acd0382f" -version = "0.25.29" - -[[DocStringExtensions]] -deps = ["LibGit2"] -git-tree-sha1 = "b19534d1895d702889b219c382a6e18010797f0b" -uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" -version = "0.8.6" - -[[Downloads]] -deps = ["ArgTools", "LibCURL", "NetworkOptions"] -git-tree-sha1 = "cd7f38a6540ce18f53dba40f8e251eeab49871c6" -uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" -version = "1.5.2" - -[[EarCut_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "92d8f9f208637e8d2d28c664051a00569c01493d" -uuid = "5ae413db-bbd1-5e63-b57d-d24a61df00f5" -version = "2.1.5+1" - -[[Expat_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "1402e52fcda25064f51c77a9655ce8680b76acf0" -uuid = "2e619515-83b5-522b-bb60-26c02a35a201" -version = "2.2.7+6" - -[[FFMPEG]] -deps = ["FFMPEG_jll"] -git-tree-sha1 = "b57e3acbe22f8484b4b5ff66a7499717fe1a9cc8" -uuid = "c87230d0-a227-11e9-1b43-d7ebe4e7570a" -version = "0.4.1" - -[[FFMPEG_jll]] -deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "JLLWrappers", "LAME_jll", "LibVPX_jll", "Libdl", "Ogg_jll", "OpenSSL_jll", "Opus_jll", "Pkg", "Zlib_jll", "libass_jll", "libfdk_aac_jll", "libvorbis_jll", "x264_jll", "x265_jll"] -git-tree-sha1 = "3cc57ad0a213808473eafef4845a74766242e05f" -uuid = "b22a6f82-2f65-5046-a5b2-351ab43fb4e5" -version = "4.3.1+4" - -[[FillArrays]] -deps = ["LinearAlgebra", "Random", "SparseArrays", "Statistics"] -git-tree-sha1 = "8756f9935b7ccc9064c6eef0bff0ad643df733a3" -uuid = "1a297f60-69ca-5386-bcde-b61e274b549b" -version = "0.12.7" - -[[FixedPointNumbers]] -deps = ["Statistics"] -git-tree-sha1 = "335bfdceacc84c5cdf16aadc768aa5ddfc5383cc" -uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" -version = "0.8.4" - -[[Fontconfig_jll]] -deps = ["Artifacts", "Bzip2_jll", "Expat_jll", "FreeType2_jll", "JLLWrappers", "Libdl", "Libuuid_jll", "Pkg", "Zlib_jll"] -git-tree-sha1 = "35895cf184ceaab11fd778b4590144034a167a2f" -uuid = "a3f928ae-7b40-5064-980b-68af3947d34b" -version = "2.13.1+14" - -[[Formatting]] -deps = ["Printf"] -git-tree-sha1 = "8339d61043228fdd3eb658d86c926cb282ae72a8" -uuid = "59287772-0a20-5a39-b81b-1366585eb4c0" -version = "0.4.2" - -[[FreeType2_jll]] -deps = ["Artifacts", "Bzip2_jll", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] -git-tree-sha1 = "cbd58c9deb1d304f5a245a0b7eb841a2560cfec6" -uuid = "d7e528f0-a631-5988-bf34-fe36492bcfd7" -version = "2.10.1+5" - -[[FriBidi_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "0d20aed5b14dd4c9a2453c1b601d08e1149679cc" -uuid = "559328eb-81f9-559d-9380-de523a88c83c" -version = "1.0.5+6" - -[[Future]] -deps = ["Random"] -uuid = "9fa8497b-333b-5362-9e8d-4d0656e87820" - -[[GLFW_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Libglvnd_jll", "Pkg", "Xorg_libXcursor_jll", "Xorg_libXi_jll", "Xorg_libXinerama_jll", "Xorg_libXrandr_jll"] -git-tree-sha1 = "a199aefead29c3c2638c3571a9993b564109d45a" -uuid = "0656b61e-2033-5cc2-a64a-77c0f6c09b89" -version = "3.3.4+0" - -[[GR]] -deps = ["Base64", "DelimitedFiles", "GR_jll", "HTTP", "JSON", "Libdl", "LinearAlgebra", "Pkg", "Printf", "Random", "Serialization", "Sockets", "Test", "UUIDs"] -git-tree-sha1 = "30f2b340c2fff8410d89bfcdc9c0a6dd661ac5f7" -uuid = "28b8d3ca-fb5f-59d9-8090-bfdbd6d07a71" -version = "0.62.1" - -[[GR_jll]] -deps = ["Artifacts", "Bzip2_jll", "Cairo_jll", "FFMPEG_jll", "Fontconfig_jll", "GLFW_jll", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Libtiff_jll", "Pixman_jll", "Pkg", "Qt5Base_jll", "Zlib_jll", "libpng_jll"] -git-tree-sha1 = "d59e8320c2747553788e4fc42231489cc602fa50" -uuid = "d2c73de3-f751-5644-a686-071e5b155ba9" -version = "0.58.1+0" - -[[GeometryBasics]] -deps = ["EarCut_jll", "IterTools", "LinearAlgebra", "StaticArrays", "StructArrays", "Tables"] -git-tree-sha1 = "58bcdf5ebc057b085e58d95c138725628dd7453c" -uuid = "5c1252a2-5f33-56bf-86c9-59e7332b4326" -version = "0.4.1" - -[[Gettext_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Pkg", "XML2_jll"] -git-tree-sha1 = "8c14294a079216000a0bdca5ec5a447f073ddc9d" -uuid = "78b55507-aeef-58d4-861c-77aaff3498b1" -version = "0.20.1+7" - -[[Glib_jll]] -deps = ["Artifacts", "Gettext_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Libiconv_jll", "Libmount_jll", "PCRE_jll", "Pkg", "Zlib_jll"] -git-tree-sha1 = "04690cc5008b38ecbdfede949220bc7d9ba26397" -uuid = "7746bdde-850d-59dc-9ae8-88ece973131d" -version = "2.59.0+4" - -[[Grisu]] -git-tree-sha1 = "53bb909d1151e57e2484c3d1b53e19552b887fb2" -uuid = "42e2da0e-8278-4e71-bc24-59509adca0fe" -version = "1.0.2" - -[[HTTP]] -deps = ["Base64", "Dates", "IniFile", "Logging", "MbedTLS", "NetworkOptions", "Sockets", "URIs"] -git-tree-sha1 = "14eece7a3308b4d8be910e265c724a6ba51a9798" -uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3" -version = "0.9.16" - -[[IOCapture]] -deps = ["Logging", "Random"] -git-tree-sha1 = "f7be53659ab06ddc986428d3a9dcc95f6fa6705a" -uuid = "b5f81e59-6552-4d32-b1f0-c071b021bf89" -version = "0.2.2" - -[[IniFile]] -deps = ["Test"] -git-tree-sha1 = "098e4d2c533924c921f9f9847274f2ad89e018b8" -uuid = "83e8ac13-25f8-5344-8a64-a9f2b223428f" -version = "0.5.0" - -[[InitialValues]] -git-tree-sha1 = "7f6a4508b4a6f46db5ccd9799a3fc71ef5cad6e6" -uuid = "22cec73e-a1b8-11e9-2c92-598750a2cf9c" -version = "0.2.11" - -[[InteractiveUtils]] -deps = ["Markdown"] -uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" - -[[InverseFunctions]] -deps = ["Test"] -git-tree-sha1 = "a7254c0acd8e62f1ac75ad24d5db43f5f19f3c65" -uuid = "3587e190-3f89-42d0-90ee-14403ec27112" -version = "0.1.2" - -[[IrrationalConstants]] -git-tree-sha1 = "7fd44fd4ff43fc60815f8e764c0f352b83c49151" -uuid = "92d709cd-6900-40b7-9082-c6be49f344b6" -version = "0.1.1" - -[[IterTools]] -git-tree-sha1 = "05110a2ab1fc5f932622ffea2a003221f4782c18" -uuid = "c8e1da08-722c-5040-9ed9-7db0dc04731e" -version = "1.3.0" - -[[IteratorInterfaceExtensions]] -git-tree-sha1 = "a3f24677c21f5bbe9d2a714f95dcd58337fb2856" -uuid = "82899510-4779-5014-852e-03e436cf321d" -version = "1.0.0" - -[[JLLWrappers]] -deps = ["Preferences"] -git-tree-sha1 = "642a199af8b68253517b80bd3bfd17eb4e84df6e" -uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" -version = "1.3.0" - -[[JSON]] -deps = ["Dates", "Mmap", "Parsers", "Unicode"] -git-tree-sha1 = "8076680b162ada2a031f707ac7b4953e30667a37" -uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" -version = "0.21.2" - -[[JpegTurbo_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "9aff0587d9603ea0de2c6f6300d9f9492bbefbd3" -uuid = "aacddb02-875f-59d6-b918-886e6ef4fbf8" -version = "2.0.1+3" - -[[LAME_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "df381151e871f41ee86cee4f5f6fd598b8a68826" -uuid = "c1c5ebd0-6772-5130-a774-d5fcae4a789d" -version = "3.100.0+3" - -[[LZO_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "f128cd6cd05ffd6d3df0523ed99b90ff6f9b349a" -uuid = "dd4b983a-f0e5-5f8d-a1b7-129d4a5fb1ac" -version = "2.10.0+3" - -[[LaTeXStrings]] -git-tree-sha1 = "f2355693d6778a178ade15952b7ac47a4ff97996" -uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" -version = "1.3.0" - -[[Latexify]] -deps = ["Formatting", "InteractiveUtils", "LaTeXStrings", "MacroTools", "Markdown", "Printf", "Requires"] -git-tree-sha1 = "a8f4f279b6fa3c3c4f1adadd78a621b13a506bce" -uuid = "23fbe1c1-3f47-55db-b15f-69d7ec21a316" -version = "0.15.9" - -[[LeftChildRightSiblingTrees]] -deps = ["AbstractTrees"] -git-tree-sha1 = "71be1eb5ad19cb4f61fa8c73395c0338fd092ae0" -uuid = "1d6d02ad-be62-4b6b-8a6d-2f90e265016e" -version = "0.1.2" - -[[LibCURL]] -deps = ["LibCURL_jll", "MozillaCACerts_jll"] -git-tree-sha1 = "cdbe7465ab7b52358804713a53c7fe1dac3f8a3f" -uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" -version = "0.6.3" - -[[LibCURL_jll]] -deps = ["LibSSH2_jll", "Libdl", "MbedTLS_jll", "Pkg", "Zlib_jll", "nghttp2_jll"] -git-tree-sha1 = "897d962c20031e6012bba7b3dcb7a667170dad17" -uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" -version = "7.70.0+2" - -[[LibGit2]] -deps = ["Printf"] -uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" - -[[LibSSH2_jll]] -deps = ["Libdl", "MbedTLS_jll", "Pkg"] -git-tree-sha1 = "717705533148132e5466f2924b9a3657b16158e8" -uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" -version = "1.9.0+3" - -[[LibVPX_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "85fcc80c3052be96619affa2fe2e6d2da3908e11" -uuid = "dd192d2f-8180-539f-9fb4-cc70b1dcf69a" -version = "1.9.0+1" - -[[Libdl]] -uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" - -[[Libffi_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "a2cd088a88c0d37eef7d209fd3d8712febce0d90" -uuid = "e9f186c6-92d2-5b65-8a66-fee21dc1b490" -version = "3.2.1+4" - -[[Libgcrypt_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgpg_error_jll", "Pkg"] -git-tree-sha1 = "b391a18ab1170a2e568f9fb8d83bc7c780cb9999" -uuid = "d4300ac3-e22c-5743-9152-c294e39db1e4" -version = "1.8.5+4" - -[[Libglvnd_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll", "Xorg_libXext_jll"] -git-tree-sha1 = "7739f837d6447403596a75d19ed01fd08d6f56bf" -uuid = "7e76a0d4-f3c7-5321-8279-8d96eeed0f29" -version = "1.3.0+3" - -[[Libgpg_error_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "ec7f2e8ad5c9fa99fc773376cdbc86d9a5a23cb7" -uuid = "7add5ba3-2f88-524e-9cd5-f83b8a55f7b8" -version = "1.36.0+3" - -[[Libiconv_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "cba7b560fcc00f8cd770fa85a498cbc1d63ff618" -uuid = "94ce4f54-9a6c-5748-9c1c-f9c7231a4531" -version = "1.16.0+8" - -[[Libmount_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "51ad0c01c94c1ce48d5cad629425035ad030bfd5" -uuid = "4b2f31a3-9ecc-558c-b454-b3730dcb73e9" -version = "2.34.0+3" - -[[Libtask]] -deps = ["Libtask_jll", "LinearAlgebra", "Statistics"] -git-tree-sha1 = "90c6ed7f9ac449cddacd80d5c1fca59c97d203e7" -uuid = "6f1fad26-d15e-5dc8-ae53-837a1d7b8c9f" -version = "0.5.3" - -[[Libtask_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "36ec688d51b7c9cc38e057b97d7bc25768600dfd" -uuid = "3ae2931a-708c-5973-9c38-ccf7496fb450" -version = "0.4.2+0" - -[[Libtiff_jll]] -deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Pkg", "Zlib_jll", "Zstd_jll"] -git-tree-sha1 = "291dd857901f94d683973cdf679984cdf73b56d0" -uuid = "89763e89-9b03-5906-acba-b20f662cd828" -version = "4.1.0+2" - -[[Libuuid_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "f879ae9edbaa2c74c922e8b85bb83cc84ea1450b" -uuid = "38a345b3-de98-5d2b-a5d3-14cd9215e700" -version = "2.34.0+7" - -[[LinearAlgebra]] -deps = ["Libdl"] -uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" - -[[Literate]] -deps = ["Base64", "IOCapture", "JSON", "REPL"] -git-tree-sha1 = "d3493acfb9e6aa0cff46b09773fc2342327b0feb" -uuid = "98b081ad-f1c9-55d3-8b20-4c87d4299306" -version = "2.9.4" - -[[LogExpFunctions]] -deps = ["ChainRulesCore", "ChangesOfVariables", "DocStringExtensions", "InverseFunctions", "IrrationalConstants", "LinearAlgebra"] -git-tree-sha1 = "be9eef9f9d78cecb6f262f3c10da151a6c5ab827" -uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688" -version = "0.3.5" - -[[Logging]] -uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" - -[[LoggingExtras]] -deps = ["Dates", "Logging"] -git-tree-sha1 = "dfeda1c1130990428720de0024d4516b1902ce98" -uuid = "e6f89c97-d47a-5376-807f-9c37f3926c36" -version = "0.4.7" - -[[MacroTools]] -deps = ["Markdown", "Random"] -git-tree-sha1 = "3d3e902b31198a27340d0bf00d6ac452866021cf" -uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" -version = "0.5.9" - -[[Markdown]] -deps = ["Base64"] -uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" - -[[MbedTLS]] -deps = ["Dates", "MbedTLS_jll", "Random", "Sockets"] -git-tree-sha1 = "1c38e51c3d08ef2278062ebceade0e46cefc96fe" -uuid = "739be429-bea8-5141-9913-cc70e7f3736d" -version = "1.0.3" - -[[MbedTLS_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "0eef589dd1c26a3ac9d753fe1a8bcad63f956fa6" -uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" -version = "2.16.8+1" - -[[Measures]] -git-tree-sha1 = "e498ddeee6f9fdb4551ce855a46f54dbd900245f" -uuid = "442fdcdd-2543-5da2-b0f3-8c86c306513e" -version = "0.3.1" - -[[MicroCollections]] -deps = ["BangBang", "Setfield"] -git-tree-sha1 = "4f65bdbbe93475f6ff9ea6969b21532f88d359be" -uuid = "128add7d-3638-4c79-886c-908ea0c25c34" -version = "0.1.1" - -[[Missings]] -deps = ["DataAPI"] -git-tree-sha1 = "bf210ce90b6c9eed32d25dbcae1ebc565df2687f" -uuid = "e1d29d7a-bbdc-5cf2-9ac0-f12de2c33e28" -version = "1.0.2" - -[[Mmap]] -uuid = "a63ad114-7e13-5084-954f-fe012c677804" - -[[MozillaCACerts_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "f1662575f7bf53c73c2bbc763bace4b024de822c" -uuid = "14a3606d-f60d-562e-9121-12d972cd8159" -version = "2021.1.19+0" - -[[NaNMath]] -git-tree-sha1 = "bfe47e760d60b82b66b61d2d44128b62e3a369fb" -uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" -version = "0.3.5" - -[[NetworkOptions]] -git-tree-sha1 = "ed3157f48a05543cce9b241e1f2815f7e843d96e" -uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" -version = "1.2.0" - -[[Ogg_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "a42c0f138b9ebe8b58eba2271c5053773bde52d0" -uuid = "e7412a2a-1a6e-54c0-be00-318e2571c051" -version = "1.3.4+2" - -[[OpenLibm_jll]] -deps = ["Libdl", "Pkg"] -git-tree-sha1 = "d22054f66695fe580009c09e765175cbf7f13031" -uuid = "05823500-19ac-5b8b-9628-191a04bc5112" -version = "0.7.1+0" - -[[OpenSSL_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "71bbbc616a1d710879f5a1021bcba65ffba6ce58" -uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95" -version = "1.1.1+6" - -[[OpenSpecFun_jll]] -deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "9db77584158d0ab52307f8c04f8e7c08ca76b5b3" -uuid = "efe28fd5-8261-553b-a9e1-b2916fc3738e" -version = "0.5.3+4" - -[[Opus_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "f9d57f4126c39565e05a2b0264df99f497fc6f37" -uuid = "91d4177d-7536-5919-b921-800302f37372" -version = "1.3.1+3" - -[[OrderedCollections]] -git-tree-sha1 = "85f8e6578bf1f9ee0d11e7bb1b1456435479d47c" -uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" -version = "1.4.1" - -[[PCRE_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "1b556ad51dceefdbf30e86ffa8f528b73c7df2bb" -uuid = "2f80f16e-611a-54ab-bc61-aa92de5b98fc" -version = "8.42.0+4" - -[[PDMats]] -deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"] -git-tree-sha1 = "c8b8775b2f242c80ea85c83714c64ecfa3c53355" -uuid = "90014a1f-27ba-587c-ab20-58faa44d9150" -version = "0.11.3" - -[[Parsers]] -deps = ["Dates"] -git-tree-sha1 = "ae4bbcadb2906ccc085cf52ac286dc1377dceccc" -uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" -version = "2.1.2" - -[[Pixman_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "6a20a83c1ae86416f0a5de605eaea08a552844a3" -uuid = "30392449-352a-5448-841d-b1acce4e97dc" -version = "0.40.0+0" - -[[Pkg]] -deps = ["Dates", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "UUIDs"] -uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" - -[[PlotThemes]] -deps = ["PlotUtils", "Requires", "Statistics"] -git-tree-sha1 = "a3a964ce9dc7898193536002a6dd892b1b5a6f1d" -uuid = "ccf2f8ad-2431-5c83-bf29-c5338b663b6a" -version = "2.0.1" - -[[PlotUtils]] -deps = ["ColorSchemes", "Colors", "Dates", "Printf", "Random", "Reexport", "Statistics"] -git-tree-sha1 = "b084324b4af5a438cd63619fd006614b3b20b87b" -uuid = "995b91a9-d308-5afd-9ec6-746e21dbc043" -version = "1.0.15" - -[[Plots]] -deps = ["Base64", "Contour", "Dates", "Downloads", "FFMPEG", "FixedPointNumbers", "GR", "GeometryBasics", "JSON", "Latexify", "LinearAlgebra", "Measures", "NaNMath", "PlotThemes", "PlotUtils", "Printf", "REPL", "Random", "RecipesBase", "RecipesPipeline", "Reexport", "Requires", "Scratch", "Showoff", "SparseArrays", "Statistics", "StatsBase", "UUIDs", "UnicodeFun"] -git-tree-sha1 = "0d185e8c33401084cab546a756b387b15f76720c" -uuid = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" -version = "1.23.6" - -[[Preferences]] -deps = ["TOML"] -git-tree-sha1 = "00cfd92944ca9c760982747e9a1d0d5d86ab1e5a" -uuid = "21216c6a-2e73-6563-6e65-726566657250" -version = "1.2.2" - -[[Printf]] -deps = ["Unicode"] -uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" - -[[ProgressLogging]] -deps = ["Logging", "SHA", "UUIDs"] -git-tree-sha1 = "80d919dee55b9c50e8d9e2da5eeafff3fe58b539" -uuid = "33c8b6b6-d38a-422a-b730-caa89a2f386c" -version = "0.1.4" - -[[ProgressMeter]] -deps = ["Distributed", "Printf"] -git-tree-sha1 = "afadeba63d90ff223a6a48d2009434ecee2ec9e8" -uuid = "92933f4c-e287-5a05-a399-4b506db050ca" -version = "1.7.1" - -[[Qt5Base_jll]] -deps = ["Artifacts", "CompilerSupportLibraries_jll", "Fontconfig_jll", "Glib_jll", "JLLWrappers", "Libdl", "Libglvnd_jll", "OpenSSL_jll", "Pkg", "Xorg_libXext_jll", "Xorg_libxcb_jll", "Xorg_xcb_util_image_jll", "Xorg_xcb_util_keysyms_jll", "Xorg_xcb_util_renderutil_jll", "Xorg_xcb_util_wm_jll", "Zlib_jll", "xkbcommon_jll"] -git-tree-sha1 = "16626cfabbf7206d60d84f2bf4725af7b37d4a77" -uuid = "ea2cea3b-5b76-57ae-a6ef-0a8af62496e1" -version = "5.15.2+0" - -[[QuadGK]] -deps = ["DataStructures", "LinearAlgebra"] -git-tree-sha1 = "78aadffb3efd2155af139781b8a8df1ef279ea39" -uuid = "1fd47b50-473d-5c70-9696-f719f8f3bcdc" -version = "2.4.2" - -[[REPL]] -deps = ["InteractiveUtils", "Markdown", "Sockets"] -uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" - -[[Random]] -deps = ["Serialization"] -uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" - -[[RecipesBase]] -git-tree-sha1 = "44a75aa7a527910ee3d1751d1f0e4148698add9e" -uuid = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" -version = "1.1.2" - -[[RecipesPipeline]] -deps = ["Dates", "NaNMath", "PlotUtils", "RecipesBase"] -git-tree-sha1 = "7ad0dfa8d03b7bcf8c597f59f5292801730c55b8" -uuid = "01d81517-befc-4cb6-b9ec-a95719d0359c" -version = "0.4.1" - -[[Reexport]] -git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" -uuid = "189a3867-3050-52da-a836-e630ba90ab69" -version = "1.2.2" - -[[Requires]] -deps = ["UUIDs"] -git-tree-sha1 = "4036a3bd08ac7e968e27c203d45f5fff15020621" -uuid = "ae029012-a4dd-5104-9daa-d747884805df" -version = "1.1.3" - -[[Rmath]] -deps = ["Random", "Rmath_jll"] -git-tree-sha1 = "86c5647b565873641538d8f812c04e4c9dbeb370" -uuid = "79098fc4-a85e-5d69-aa6a-4863f24498fa" -version = "0.6.1" - -[[Rmath_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "1b7bf41258f6c5c9c31df8c1ba34c1fc88674957" -uuid = "f50d1b31-88e8-58de-be2c-1cc44531875f" -version = "0.2.2+2" - -[[SHA]] -uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" - -[[Scratch]] -deps = ["Dates"] -git-tree-sha1 = "0b4b7f1393cff97c33891da2a0bf69c6ed241fda" -uuid = "6c6a2e73-6563-6170-7368-637461726353" -version = "1.1.0" - -[[Serialization]] -uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" - -[[Setfield]] -deps = ["ConstructionBase", "Future", "MacroTools", "Requires"] -git-tree-sha1 = "def0718ddbabeb5476e51e5a43609bee889f285d" -uuid = "efcf1570-3423-57d1-acb7-fd33fddbac46" -version = "0.8.0" - -[[SharedArrays]] -deps = ["Distributed", "Mmap", "Random", "Serialization"] -uuid = "1a1011a3-84de-559e-8e89-a11a2f7dc383" - -[[Showoff]] -deps = ["Dates", "Grisu"] -git-tree-sha1 = "91eddf657aca81df9ae6ceb20b959ae5653ad1de" -uuid = "992d4aef-0814-514b-bc4d-f2e9a6c4116f" -version = "1.0.3" - -[[Sockets]] -uuid = "6462fe0b-24de-5631-8697-dd941f90decc" - -[[SortingAlgorithms]] -deps = ["DataStructures"] -git-tree-sha1 = "b3363d7460f7d098ca0912c69b082f75625d7508" -uuid = "a2af1166-a08f-5f64-846c-94a0d3cef48c" -version = "1.0.1" - -[[SparseArrays]] -deps = ["LinearAlgebra", "Random"] -uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" - -[[SpecialFunctions]] -deps = ["ChainRulesCore", "IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"] -git-tree-sha1 = "f0bccf98e16759818ffc5d97ac3ebf87eb950150" -uuid = "276daf66-3868-5448-9aa4-cd146d93841b" -version = "1.8.1" - -[[SplittablesBase]] -deps = ["Setfield", "Test"] -git-tree-sha1 = "39c9f91521de844bad65049efd4f9223e7ed43f9" -uuid = "171d559e-b47b-412a-8079-5efa626c420e" -version = "0.1.14" - -[[StaticArrays]] -deps = ["LinearAlgebra", "Random", "Statistics"] -git-tree-sha1 = "3c76dde64d03699e074ac02eb2e8ba8254d428da" -uuid = "90137ffa-7385-5640-81b9-e52037218182" -version = "1.2.13" - -[[Statistics]] -deps = ["LinearAlgebra", "SparseArrays"] -uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" - -[[StatsAPI]] -git-tree-sha1 = "1958272568dc176a1d881acb797beb909c785510" -uuid = "82ae8749-77ed-4fe6-ae5f-f523153014b0" -version = "1.0.0" - -[[StatsBase]] -deps = ["DataAPI", "DataStructures", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"] -git-tree-sha1 = "eb35dcc66558b2dda84079b9a1be17557d32091a" -uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" -version = "0.33.12" - -[[StatsFuns]] -deps = ["ChainRulesCore", "InverseFunctions", "IrrationalConstants", "LogExpFunctions", "Reexport", "Rmath", "SpecialFunctions"] -git-tree-sha1 = "385ab64e64e79f0cd7cfcf897169b91ebbb2d6c8" -uuid = "4c63d2b9-4356-54db-8cca-17b64c39e42c" -version = "0.9.13" - -[[StructArrays]] -deps = ["Adapt", "DataAPI", "StaticArrays", "Tables"] -git-tree-sha1 = "2ce41e0d042c60ecd131e9fb7154a3bfadbf50d3" -uuid = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" -version = "0.6.3" - -[[SuiteSparse]] -deps = ["Libdl", "LinearAlgebra", "Serialization", "SparseArrays"] -uuid = "4607b0f0-06f3-5cda-b6b1-a6196a1729e9" - -[[TOML]] -deps = ["Dates"] -git-tree-sha1 = "44aaac2d2aec4a850302f9aa69127c74f0c3787e" -uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" -version = "1.0.3" - -[[TableTraits]] -deps = ["IteratorInterfaceExtensions"] -git-tree-sha1 = "c06b2f539df1c6efa794486abfb6ed2022561a39" -uuid = "3783bdb8-4a98-5b6b-af9a-565f29a5fe9c" -version = "1.0.1" - -[[Tables]] -deps = ["DataAPI", "DataValueInterfaces", "IteratorInterfaceExtensions", "LinearAlgebra", "TableTraits", "Test"] -git-tree-sha1 = "fed34d0e71b91734bf0a7e10eb1bb05296ddbcd0" -uuid = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" -version = "1.6.0" - -[[TerminalLoggers]] -deps = ["LeftChildRightSiblingTrees", "Logging", "Markdown", "Printf", "ProgressLogging", "UUIDs"] -git-tree-sha1 = "62846a48a6cd70e63aa29944b8c4ef704360d72f" -uuid = "5d786b92-1e48-4d6f-9151-6b4477ca9bed" -version = "0.1.5" - -[[Test]] -deps = ["Distributed", "InteractiveUtils", "Logging", "Random"] -uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" - -[[Transducers]] -deps = ["Adapt", "ArgCheck", "BangBang", "Baselet", "CompositionsBase", "DefineSingletons", "Distributed", "InitialValues", "Logging", "Markdown", "MicroCollections", "Requires", "Setfield", "SplittablesBase", "Tables"] -git-tree-sha1 = "bccb153150744d476a6a8d4facf5299325d5a442" -uuid = "28d57a85-8fef-5791-bfe6-a80928e7c999" -version = "0.4.67" - -[[URIs]] -git-tree-sha1 = "97bbe755a53fe859669cd907f2d96aee8d2c1355" -uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" -version = "1.3.0" - -[[UUIDs]] -deps = ["Random", "SHA"] -uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" - -[[Unicode]] -uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" - -[[UnicodeFun]] -deps = ["REPL"] -git-tree-sha1 = "53915e50200959667e78a92a418594b428dffddf" -uuid = "1cfade01-22cf-5700-b092-accc4b62d6e1" -version = "0.4.1" - -[[Wayland_jll]] -deps = ["Artifacts", "Expat_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Pkg", "XML2_jll"] -git-tree-sha1 = "dc643a9b774da1c2781413fd7b6dcd2c56bb8056" -uuid = "a2964d1f-97da-50d4-b82a-358c7fce9d89" -version = "1.17.0+4" - -[[Wayland_protocols_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Wayland_jll"] -git-tree-sha1 = "2839f1c1296940218e35df0bbb220f2a79686670" -uuid = "2381bf8a-dfd0-557d-9999-79630e7b1b91" -version = "1.18.0+4" - -[[XML2_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Pkg", "Zlib_jll"] -git-tree-sha1 = "be0db24f70aae7e2b89f2f3092e93b8606d659a6" -uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a" -version = "2.9.10+3" - -[[XSLT_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgcrypt_jll", "Libgpg_error_jll", "Pkg", "XML2_jll"] -git-tree-sha1 = "2b3eac39df218762d2d005702d601cd44c997497" -uuid = "aed1982a-8fda-507f-9586-7b0439959a61" -version = "1.1.33+4" - -[[Xorg_libX11_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libxcb_jll", "Xorg_xtrans_jll"] -git-tree-sha1 = "5be649d550f3f4b95308bf0183b82e2582876527" -uuid = "4f6342f7-b3d2-589e-9d20-edeb45f2b2bc" -version = "1.6.9+4" - -[[Xorg_libXau_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "4e490d5c960c314f33885790ed410ff3a94ce67e" -uuid = "0c0b7dd1-d40b-584c-a123-a41640f87eec" -version = "1.0.9+4" - -[[Xorg_libXcursor_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXfixes_jll", "Xorg_libXrender_jll"] -git-tree-sha1 = "12e0eb3bc634fa2080c1c37fccf56f7c22989afd" -uuid = "935fb764-8cf2-53bf-bb30-45bb1f8bf724" -version = "1.2.0+4" - -[[Xorg_libXdmcp_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "4fe47bd2247248125c428978740e18a681372dd4" -uuid = "a3789734-cfe1-5b06-b2d0-1dd0d9d62d05" -version = "1.1.3+4" - -[[Xorg_libXext_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll"] -git-tree-sha1 = "b7c0aa8c376b31e4852b360222848637f481f8c3" -uuid = "1082639a-0dae-5f34-9b06-72781eeb8cb3" -version = "1.3.4+4" - -[[Xorg_libXfixes_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll"] -git-tree-sha1 = "0e0dc7431e7a0587559f9294aeec269471c991a4" -uuid = "d091e8ba-531a-589c-9de9-94069b037ed8" -version = "5.0.3+4" - -[[Xorg_libXi_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXext_jll", "Xorg_libXfixes_jll"] -git-tree-sha1 = "89b52bc2160aadc84d707093930ef0bffa641246" -uuid = "a51aa0fd-4e3c-5386-b890-e753decda492" -version = "1.7.10+4" - -[[Xorg_libXinerama_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXext_jll"] -git-tree-sha1 = "26be8b1c342929259317d8b9f7b53bf2bb73b123" -uuid = "d1454406-59df-5ea1-beac-c340f2130bc3" -version = "1.1.4+4" - -[[Xorg_libXrandr_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXext_jll", "Xorg_libXrender_jll"] -git-tree-sha1 = "34cea83cb726fb58f325887bf0612c6b3fb17631" -uuid = "ec84b674-ba8e-5d96-8ba1-2a689ba10484" -version = "1.5.2+4" - -[[Xorg_libXrender_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll"] -git-tree-sha1 = "19560f30fd49f4d4efbe7002a1037f8c43d43b96" -uuid = "ea2f1a96-1ddc-540d-b46f-429655e07cfa" -version = "0.9.10+4" - -[[Xorg_libpthread_stubs_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "6783737e45d3c59a4a4c4091f5f88cdcf0908cbb" -uuid = "14d82f49-176c-5ed1-bb49-ad3f5cbd8c74" -version = "0.1.0+3" - -[[Xorg_libxcb_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "XSLT_jll", "Xorg_libXau_jll", "Xorg_libXdmcp_jll", "Xorg_libpthread_stubs_jll"] -git-tree-sha1 = "daf17f441228e7a3833846cd048892861cff16d6" -uuid = "c7cfdc94-dc32-55de-ac96-5a1b8d977c5b" -version = "1.13.0+3" - -[[Xorg_libxkbfile_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll"] -git-tree-sha1 = "926af861744212db0eb001d9e40b5d16292080b2" -uuid = "cc61e674-0454-545c-8b26-ed2c68acab7a" -version = "1.1.0+4" - -[[Xorg_xcb_util_image_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] -git-tree-sha1 = "0fab0a40349ba1cba2c1da699243396ff8e94b97" -uuid = "12413925-8142-5f55-bb0e-6d7ca50bb09b" -version = "0.4.0+1" - -[[Xorg_xcb_util_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libxcb_jll"] -git-tree-sha1 = "e7fd7b2881fa2eaa72717420894d3938177862d1" -uuid = "2def613f-5ad1-5310-b15b-b15d46f528f5" -version = "0.4.0+1" - -[[Xorg_xcb_util_keysyms_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] -git-tree-sha1 = "d1151e2c45a544f32441a567d1690e701ec89b00" -uuid = "975044d2-76e6-5fbe-bf08-97ce7c6574c7" -version = "0.4.0+1" - -[[Xorg_xcb_util_renderutil_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] -git-tree-sha1 = "dfd7a8f38d4613b6a575253b3174dd991ca6183e" -uuid = "0d47668e-0667-5a69-a72c-f761630bfb7e" -version = "0.3.9+1" - -[[Xorg_xcb_util_wm_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] -git-tree-sha1 = "e78d10aab01a4a154142c5006ed44fd9e8e31b67" -uuid = "c22f9ab0-d5fe-5066-847c-f4bb1cd4e361" -version = "0.4.1+1" - -[[Xorg_xkbcomp_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libxkbfile_jll"] -git-tree-sha1 = "4bcbf660f6c2e714f87e960a171b119d06ee163b" -uuid = "35661453-b289-5fab-8a00-3d9160c6a3a4" -version = "1.4.2+4" - -[[Xorg_xkeyboard_config_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xkbcomp_jll"] -git-tree-sha1 = "5c8424f8a67c3f2209646d4425f3d415fee5931d" -uuid = "33bec58e-1273-512f-9401-5d533626f822" -version = "2.27.0+4" - -[[Xorg_xtrans_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "79c31e7844f6ecf779705fbc12146eb190b7d845" -uuid = "c5fb5394-a638-5e4d-96e5-b29de1b5cf10" -version = "1.4.0+3" - -[[Zlib_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "320228915c8debb12cb434c59057290f0834dbf6" -uuid = "83775a58-1f1d-513f-b197-d71354ab007a" -version = "1.2.11+18" - -[[Zstd_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "2c1332c54931e83f8f94d310fa447fd743e8d600" -uuid = "3161d3a3-bdf6-5164-811a-617609db77b4" -version = "1.4.8+0" - -[[ZygoteRules]] -deps = ["MacroTools"] -git-tree-sha1 = "8c1a8e4dfacb1fd631745552c8db35d0deb09ea0" -uuid = "700de1a5-db45-46bc-99cf-38207098b444" -version = "0.2.2" - -[[libass_jll]] -deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] -git-tree-sha1 = "acc685bcf777b2202a904cdcb49ad34c2fa1880c" -uuid = "0ac62f75-1d6f-5e53-bd7c-93b484bb37c0" -version = "0.14.0+4" - -[[libfdk_aac_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "7a5780a0d9c6864184b3a2eeeb833a0c871f00ab" -uuid = "f638f0a6-7fb0-5443-88ba-1cc74229b280" -version = "0.1.6+4" - -[[libpng_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] -git-tree-sha1 = "6abbc424248097d69c0c87ba50fcb0753f93e0ee" -uuid = "b53b4c65-9356-5827-b1ea-8c7a1a84506f" -version = "1.6.37+6" - -[[libvorbis_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Ogg_jll", "Pkg"] -git-tree-sha1 = "fa14ac25af7a4b8a7f61b287a124df7aab601bcd" -uuid = "f27f6e37-5d2b-51aa-960f-b287f2bc3b7a" -version = "1.3.6+6" - -[[nghttp2_jll]] -deps = ["Libdl", "Pkg"] -git-tree-sha1 = "8e2c44ab4d49ad9518f359ed8b62f83ba8beede4" -uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" -version = "1.40.0+2" - -[[x264_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "d713c1ce4deac133e3334ee12f4adff07f81778f" -uuid = "1270edf5-f2f9-52d2-97e9-ab00b5d0237a" -version = "2020.7.14+2" - -[[x265_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "487da2f8f2f0c8ee0e83f39d13037d6bbf0a45ab" -uuid = "dfaa095f-4041-5dcd-9319-2fabd8486b76" -version = "3.0.0+3" - -[[xkbcommon_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Wayland_jll", "Wayland_protocols_jll", "Xorg_libxcb_jll", "Xorg_xkeyboard_config_jll"] -git-tree-sha1 = "ece2350174195bb31de1a63bea3a41ae1aa593b6" -uuid = "d8fb68d0-12a3-5cfd-a85a-d49703b185fd" -version = "0.9.1+5" diff --git a/examples/gaussian-ssm/script.jl b/examples/gaussian-ssm/script.jl index f75057e0..8f46e70c 100644 --- a/examples/gaussian-ssm/script.jl +++ b/examples/gaussian-ssm/script.jl @@ -1,13 +1,75 @@ # # Gaussian State Space Model using AdvancedPS -using AbstractMCMC +using Random using Distributions -using Libtask: produce -using StatsFuns - using Plots -x = [1, 2, 3] -y = [2, 5, 1] +# Parameters +Parameters = @NamedTuple begin + a::Float64 + q::Float64 + r::Float64 +end + +a = 0.9 # Scale +q = 0.32 # State variance +r = 1 # Observation variance +Tₘ = 300 # Number of observation +Nₚ = 50 # Number of particles +Nₛ = 1000 # Number of samples +seed = 9 # Reproduce everything + +θ₀ = Parameters((a, q, r)) + +mutable struct NonLinearTimeSeries <: AdvancedPS.AbstractStateSpaceModel + X::Vector{Float64} + θ::Parameters + NonLinearTimeSeries(θ::Parameters) = new(Vector{Float64}(), θ) + NonLinearTimeSeries() = new(Vector{Float64}(), θ₀) +end + +f(m::NonLinearTimeSeries, state, t) = Normal(m.θ.a * state, m.θ.q) # Transition density +g(m::NonLinearTimeSeries, state, t) = Normal(state, m.θ.r) # Observation density +f₀(m::NonLinearTimeSeries) = Normal(0, m.θ.q / (1 - m.θ.a^2)) # Initial state density + +AdvancedPS.initialization(model::NonLinearTimeSeries) = f₀(model) +AdvancedPS.transition(model::NonLinearTimeSeries, state, step) = f(model, state, step) +function AdvancedPS.observation(model::NonLinearTimeSeries, state, step) + return logpdf(g(model, state, step), y[step]) +end # Return log-pdf of the obs +AdvancedPS.isdone(::NonLinearTimeSeries, step) = step > Tₘ + +# Generate some synthetic data +rng = Random.MersenneTwister(seed) + +x = zeros(Tₘ) +y = zeros(Tₘ) + +reference = NonLinearTimeSeries(θ₀) # Reference model +x[1] = rand(rng, f₀(reference)) +for t in 1:Tₘ + if t < Tₘ + x[t + 1] = rand(rng, f(reference, x[t], t)) + end + y[t] = rand(rng, g(reference, x[t], t)) +end + +plot(x; label="x", color=:black) +plot(y; label="y", color=:black) + +# Setup up a particle Gibbs sampler +model = NonLinearTimeSeries(θ₀) +pgas = AdvancedPS.PGAS(Nₚ) +chains = sample(rng, model, pgas, Nₛ) + +particles = hcat([chain.trajectory.model.X for chain in chains]...) # Concat all sampled states +mean_trajectory = mean(particles; dims=2) + +scatter(particles; label=false, opacity=0.01, color=:black) +plot!(x; color=:red, label="Original Trajectory") +plot!(mean_trajectory; color=:blue, label="Posterior mean", opacity=0.9) -plot(x, y) +# Compute mixing rate +update_rate = sum(abs.(diff(particles; dims=2)) .> 0; dims=2) / Nₛ +plot(update_rate; label=false, ylim=[0, 1]) +hline!([1 - 1 / Nₚ]; label=false) diff --git a/src/AdvancedPS.jl b/src/AdvancedPS.jl index e1c7832d..c0abcfb2 100644 --- a/src/AdvancedPS.jl +++ b/src/AdvancedPS.jl @@ -7,10 +7,15 @@ using Random: Random using StatsFuns: StatsFuns using Random123: Random123 +""" Abstract type for an abstract model formulated in the state space form +""" +abstract type AbstractStateSpaceModel <: AbstractMCMC.AbstractModel end + include("resampling.jl") include("rng.jl") +include("model.jl") include("container.jl") +include("pgas.jl") include("smc.jl") -include("model.jl") end diff --git a/src/container.jl b/src/container.jl index e621a21f..bc0697fe 100644 --- a/src/container.jl +++ b/src/container.jl @@ -1,82 +1,13 @@ -struct Trace{F,R<:TracedRNG} - f::F - task::Libtask.TapedTask - rng::R -end - -const Particle = Trace - -function Trace(f, rng::TracedRNG) - task = Libtask.TapedTask(f, rng) - - # add backward reference - newtrace = Trace(f, task, rng) - addreference!(task.task, newtrace) - - return newtrace -end - -function Trace(f, task::Libtask.TapedTask) - return Trace(f, task, TracedRNG()) -end - -# Copy task -Base.copy(trace::Trace) = Trace(trace.f, copy(trace.task), deepcopy(trace.rng)) - # step to the next observe statement and # return the log probability of the transition (or nothing if done) -function advance!(t::Trace, isref::Bool) +function advance!(t::GenericTrace, isref::Bool=false) isref ? load_state!(t.rng) : save_state!(t.rng) inc_counter!(t.rng) # Move to next step - return Libtask.consume(t.task) + return Libtask.consume(t.model.ctask) end -# reset log probability -reset_logprob!(t::Trace) = nothing - -reset_model(f) = deepcopy(f) -delete_retained!(f) = nothing - -# Task copying version of fork for Trace. -function fork(trace::Trace, isref::Bool=false) - newtrace = copy(trace) - isref && delete_retained!(newtrace.f) - - # add backward reference - addreference!(newtrace.task.task, newtrace) - - return newtrace -end - -# PG requires keeping all randomness for the reference particle -# Create new task and copy randomness -function forkr(trace::Trace) - newf = reset_model(trace.f) - Random123.set_counter!(trace.rng, 1) - - task = Libtask.TapedTask(newf, trace.rng) - - # add backward reference - newtrace = Trace(newf, task, trace.rng) - addreference!(task.task, newtrace) - - return newtrace -end - -# create a backward reference in task_local_storage -function addreference!(task::Task, trace::Trace) - if task.storage === nothing - task.storage = IdDict() - end - task.storage[:__trace] = trace - - return task -end - -current_trace() = current_task().storage[:__trace] - """ Data structure for particle filters - `effectiveSampleSize(pc :: ParticleContainer)`: Return the effective sample size of the particles in `pc` @@ -135,6 +66,13 @@ function Base.copy(pc::ParticleContainer) return ParticleContainer(vals, logWs, rng) end +""" + update_ref!(particle::Trace, pc::ParticleContainer) + +Update reference trajectory. Defaults to `nothing` +""" +update_ref!(particle::Trace, pc::ParticleContainer) = nothing + """ reset_logweights!(pc::ParticleContainer) @@ -237,19 +175,16 @@ of the particle `weights`. For Particle Gibbs sampling, one can provide a refere `ref` that is ensured to survive the resampling step. """ function resample_propagate!( - rng::Random.AbstractRNG, + ::Random.AbstractRNG, pc::ParticleContainer, - randcat=resample_systematic, + randcat=DEFAULT_RESAMPLER, ref::Union{Particle,Nothing}=nothing; weights=getweights(pc), ) - # check that weights are not NaN - @assert !any(isnan, weights) - # sample ancestor indices n = length(pc) nresamples = ref === nothing ? n : n - 1 - indx = randcat(rng, weights, nresamples) + indx = randcat(pc.rng, weights, nresamples) # count number of children for each particle num_children = zeros(Int, n) @@ -263,16 +198,18 @@ function resample_propagate!( j = 0 @inbounds for i in 1:n ni = num_children[i] - if ni > 0 # fork first child pi = particles[i] isref = pi === ref p = isref ? fork(pi, isref) : pi - nseeds = isref ? ni - 1 : ni - seeds = split(p.rng.rng.key, nseeds) - !isref && Random.seed!(p.rng, seeds[1]) + key = isref ? safe_get_refseed(ref.rng) : state(p.rng.rng) # Pick up the alternative rng stream if using the reference particle + nsplits = isref ? ni + 1 : ni # We need one more seed to refresh the alternative rng stream + seeds = split(key, nsplits) + isref && safe_set_refseed!(ref.rng, seeds[end]) # Refresh the alternative rng stream + + Random.seed!(p.rng, seeds[1]) children[j += 1] = p # fork additional children @@ -287,6 +224,7 @@ function resample_propagate!( if ref !== nothing # Insert the retained particle. This is based on the replaying trick for efficiency # reasons. If we implement PG using task copying, we need to store Nx * T particles! + update_ref!(ref, pc) @inbounds children[n] = ref end diff --git a/src/model.jl b/src/model.jl index d2028389..d33e2ba9 100644 --- a/src/model.jl +++ b/src/model.jl @@ -1,3 +1,90 @@ +""" + GenericModel{F} + +State wrapper to hold `Libtask.CTask` model initiated from `f` +""" +struct GenericModel{F} <: AbstractMCMC.AbstractModel + f::F + ctask::Libtask.TapedTask{F} +end + +GenericModel(f, args...) = GenericModel(f, Libtask.TapedTask(f, args...)) +Base.copy(model::GenericModel) = GenericModel(model.f, copy(model.ctask)) + +""" + Trace{F,R} +""" +struct Trace{F,R} + model::F + rng::R + + Trace(model::F, rng::R) where {F,R} = new{F,R}(model, rng) # Bring back the default since we override + + function Trace(model::F, rng::R) where {F<:GenericModel,R} + # add backward reference + newtrace = new{F,R}(model, rng) + addreference!(model.ctask.task, newtrace) + return newtrace + end +end + +const Particle = Trace + +const SSMTrace{R} = Trace{<:AbstractStateSpaceModel,R} +const GenericTrace{R} = Trace{<:GenericModel,R} + +# Copy task +Base.copy(trace::GenericTrace) = Trace(copy(trace.model), deepcopy(trace.rng)) + +# create a backward reference in task_local_storage +function addreference!(task::Task, trace::GenericTrace) + if task.storage === nothing + task.storage = IdDict() + end + task.storage[:__trace] = trace + + return task +end + +current_trace() = current_task().storage[:__trace] + +# Task copying version of fork for Trace. +function fork(trace::GenericTrace, isref::Bool=false) + newtrace = copy(trace) + isref && delete_retained!(newtrace.model.f) + + # add backward reference + addreference!(newtrace.model.ctask.task, newtrace) + return newtrace +end + +# PG requires keeping all randomness for the reference particle +# Create new task and copy randomness +function forkr(trace::GenericTrace) + newf = reset_model(trace.model.f) + Random123.set_counter!(trace.rng, 1) + + ctask = Libtask.TapedTask(newf, trace.rng) + new_tapedmodel = GenericModel(newf, ctask) + + # add backward reference + newtrace = Trace(new_tapedmodel, trace.rng) + addreference!(ctask.task, newtrace) + gen_refseed!(newtrace) + return newtrace +end + +function gen_refseed!(part::Particle) + seed = split(state(part.rng.rng), 1) + return safe_set_refseed!(part.rng, seed[1]) +end + +# reset log probability +reset_logprob!(::Particle) = nothing + +reset_model(f) = deepcopy(f) +delete_retained!(f) = nothing + """ observe(dist::Distribution, x) diff --git a/src/pgas.jl b/src/pgas.jl new file mode 100644 index 00000000..1ed2a838 --- /dev/null +++ b/src/pgas.jl @@ -0,0 +1,151 @@ +""" + initialization(model::AbstractStateSpaceModel) + +Define the distribution of the initial state of the State Space Model +""" +function initialization end + +""" + transition(model::AbstractStateSpaceModel, state, step) + +Define the transition density of the State Space Model +Must return `nothing` if it consumed all the data +""" +function transition end + +""" + observation(model::AbstractStateSpaceModel, state, step) + +Return the log-likelihood of the observed measurement conditional on the current state of the model. +Must return `nothing` if it consumed all the data +""" +function observation end + +""" + isdone(model::AbstractStateSpaceModel, step) + +Return `true` if model reached final state else `false` +""" +function isdone end + +""" + previous_state(trace::SSMTrace) + +Return `Xₜ₋₁` or `nothing` from `model` +""" +function previous_state(trace::SSMTrace) + return trace.model.X[current_step(trace) - 1] +end + +function past_idx(trace::SSMTrace) + return 1:(current_step(trace) - 1) +end + +""" + current_step(model::AbstractStateSpaceModel) + +Return current model step +""" +current_step(trace::SSMTrace) = trace.rng.count + +""" + transition_logweight(model::AbstractStateSpaceModel, x) + +Get the log weight of the transition from previous state of `model` to `x` +""" +function transition_logweight(particle::SSMTrace, x) + score = Distributions.logpdf( + transition( + particle.model, + particle.model.X[current_step(particle) - 2], + current_step(particle) - 2, + ), + x, + ) + return score +end + +""" + get_ancestor_logweights(pc::ParticleContainer{F,R}, x) where {F<:SSMTrace,R} + +Get the ancestor log weights for each particle in `pc` +""" +function get_ancestor_logweights(pc::ParticleContainer{<:SSMTrace}, x, weights) + nparticles = length(pc.vals) + + logweights = map(1:nparticles) do i + transition_logweight(pc.vals[i], x) + weights[i] + end + return logweights +end + +""" + advance!(particle::SSMTrace, isref::Bool=false) + +Return the log-probability of the transition nothing if done +""" +function advance!(particle::SSMTrace, isref::Bool=false) + isref ? load_state!(particle.rng) : save_state!(particle.rng) + + model = particle.model + running_step = current_step(particle) + isdone(model, running_step) && return nothing + + if !isref + if running_step == 1 + new_state = rand(particle.rng, initialization(model)) # Generate initial state, maybe fallback to 0 if initialization is not defined + else + current_state = model.X[running_step - 1] + new_state = rand(particle.rng, transition(model, current_state, running_step)) + end + else + new_state = model.X[running_step] # We need the current state from the reference particle + end + + score = observation(model, new_state, running_step) + + # accept transition + !isref && push!(model.X, new_state) + inc_counter!(particle.rng) # Increase rng counter, we use it as the model `time` index instead of handling two distinct counters + + return score +end + +function truncate!(particle::SSMTrace) + model = particle.model + idx = past_idx(particle) + model.X = model.X[idx] + particle.rng.keys = particle.rng.keys[idx] + return model +end + +function fork(particle::SSMTrace, isref::Bool) + model = deepcopy(particle.model) + new_particle = Trace(model, deepcopy(particle.rng)) + isref && truncate!(new_particle) # Forget the rest of the reference trajectory + return new_particle +end + +function forkr(particle::SSMTrace) + Random123.set_counter!(particle.rng, 1) + newtrace = Trace(deepcopy(particle.model), deepcopy(particle.rng)) + gen_refseed!(newtrace) + return newtrace +end + +function update_ref!(ref::SSMTrace, pc::ParticleContainer{<:SSMTrace}) + current_step(ref) <= 2 && return nothing # At the beginning of step + 1 since we start at 1 + isdone(ref.model, current_step(ref)) && return nothing + + ancestor_weights = get_ancestor_logweights( + pc, ref.model.X[current_step(ref) - 1], pc.logWs + ) + norm_weights = StatsFuns.softmax(ancestor_weights) + + ancestor_index = rand(pc.rng, Distributions.Categorical(norm_weights)) + ancestor = pc.vals[ancestor_index] + + idx = past_idx(ref) + ref.model.X[idx] = ancestor.model.X[idx] + return ref.rng.keys[idx] = ancestor.rng.keys[idx] +end diff --git a/src/resampling.jl b/src/resampling.jl index 6ad00291..96969876 100644 --- a/src/resampling.jl +++ b/src/resampling.jl @@ -7,21 +7,6 @@ # - http://people.isy.liu.se/rt/schon/Publications/HolSG2006.pdf # Code adapted from: http://uk.mathworks.com/matlabcentral/fileexchange/24968-resampling-methods-for-particle-filtering -""" - ResampleWithESSThreshold{R,T<:Real} - -Perform resampling using `R` if the effective sample size is below `T`. -By default we use `resample_systematic` with a threshold of 0.5 -""" -struct ResampleWithESSThreshold{R,T<:Real} - resampler::R - threshold::T -end - -function ResampleWithESSThreshold(resampler=resample_systematic) - return ResampleWithESSThreshold(resampler, 0.5) -end - # More stable, faster version of rand(Categorical) function randcat(rng::Random.AbstractRNG, p::AbstractVector{<:Real}) T = eltype(p) @@ -196,3 +181,24 @@ function resample_systematic( return samples end + +const DEFAULT_RESAMPLER = resample_systematic + +""" + ResampleWithESSThreshold{R,T<:Real} + +Perform resampling using `R` if the effective sample size is below `T`. +By default we use `resample_systematic` with a threshold of 0.5 +""" +struct ResampleWithESSThreshold{R,T<:Real} + resampler::R + threshold::T +end + +function ResampleWithESSThreshold(resampler=DEFAULT_RESAMPLER) + return ResampleWithESSThreshold(resampler, 0.5) +end + +function ResampleWithESSThreshold(threshold::T) where {T<:Real} + return ResampleWithESSThreshold(DEFAULT_RESAMPLER, threshold) +end diff --git a/src/rng.jl b/src/rng.jl index 62d9637f..83d0cb9e 100644 --- a/src/rng.jl +++ b/src/rng.jl @@ -13,6 +13,8 @@ mutable struct TracedRNG{R,N,T<:Random123.AbstractR123} <: Random.AbstractRNG rng::T "Array of keys" keys::Array{R,N} + "Reference particle alternative seed" + refseed::Union{R,Nothing} end """ @@ -21,7 +23,7 @@ Create a `TracedRNG` with `r` as the inner RNG. """ function TracedRNG(r::Random123.AbstractR123=_BASE_RNG()) Random123.set_counter!(r, 0) - return TracedRNG(1, r, Random123.seed_type(r)[]) + return TracedRNG(1, r, Random123.seed_type(r)[], nothing) end # Connect to the Random API @@ -86,7 +88,21 @@ end state(rng::Random123.Philox2x) = rng.key state(rng::Random123.Philox4x) = (rng.key1, rng.key2) -Base.copy(r::TracedRNG) = TracedRNG(r.count, copy(r.rng), deepcopy(r.keys)) +function Base.copy(rng::TracedRNG) + return TracedRNG(rng.count, copy(rng.rng), deepcopy(rng.keys), rng.refseed) +end + +# Add an extra seed to the reference particle keys array to use as an alternative stream +# (we don't need to tack this one) +# +# We have to be careful when spliting the reference particle. +# Since we don't know the seed tree from the previous SMC run we cannot reuse any of the intermediate seed +# in the TracedRNG container. We might collide with a previous seed and the children particle would collapse +# to the reference particle. A solution to solve this is to have an extra stream attached to the reference particle +# that we only use to seed the children of the reference particle. +# +safe_set_refseed!(rng::TracedRNG{R}, seed::R) where {R} = rng.refseed = seed +safe_get_refseed(rng::TracedRNG) = rng.refseed """ set_counter!(r::TracedRNG, n::Integer) diff --git a/src/smc.jl b/src/smc.jl index e885a226..f8e525d8 100644 --- a/src/smc.jl +++ b/src/smc.jl @@ -18,7 +18,7 @@ SMC(nparticles::Int) = SMC(nparticles, ResampleWithESSThreshold()) function SMC(nparticles::Int, resampler, threshold::Real) return SMC(nparticles, ResampleWithESSThreshold(resampler, threshold)) end -SMC(nparticles::Int, threshold::Real) = SMC(nparticles, resample_systematic, threshold) +SMC(nparticles::Int, threshold::Real) = SMC(nparticles, DEFAULT_RESAMPLER, threshold) struct SMCSample{P,W,L} trajectories::P @@ -37,10 +37,14 @@ function AbstractMCMC.sample( @warn "keyword arguments $(keys(kwargs)) are not supported by `SMC`" end + traces = map(1:(sampler.nparticles)) do i + trng = TracedRNG() + tmodel = GenericModel(model, trng) + Trace(tmodel, trng) + end + # Create a set of particles. - particles = ParticleContainer( - [Trace(model, TracedRNG()) for _ in 1:(sampler.nparticles)], TracedRNG(), rng - ) + particles = ParticleContainer(traces, TracedRNG(), rng) # Perform particle sweep. logevidence = sweep!(rng, particles, sampler.resampler) @@ -70,7 +74,7 @@ PG(nparticles::Int) = PG(nparticles, ResampleWithESSThreshold()) function PG(nparticles::Int, resampler, threshold::Real) return PG(nparticles, ResampleWithESSThreshold(resampler, threshold)) end -PG(nparticles::Int, threshold::Real) = PG(nparticles, resample_systematic, threshold) +PG(nparticles::Int, threshold::Real) = PG(nparticles, DEFAULT_RESAMPLER, threshold) struct PGState{T} trajectory::T @@ -81,50 +85,74 @@ struct PGSample{T,L} logevidence::L end +struct PGAS{R} <: AbstractMCMC.AbstractSampler + """Number of particles.""" + nparticles::Int + """Resampling algorithm.""" + resampler::R +end + +PGAS(nparticles::Int) = PGAS(nparticles, ResampleWithESSThreshold(1.0)) + function AbstractMCMC.step( - rng::Random.AbstractRNG, model::AbstractMCMC.AbstractModel, sampler::PG; kwargs... + rng::Random.AbstractRNG, + model::AbstractMCMC.AbstractModel, + sampler::PG, + state::Union{PGState,Nothing}=nothing; + kwargs..., ) # Create a new set of particles. - particles = ParticleContainer( - [Trace(model, TracedRNG()) for _ in 1:(sampler.nparticles)], TracedRNG(), rng - ) + nparticles = sampler.nparticles + isref = !isnothing(state) + + traces = map(1:nparticles) do i + if i == nparticles && isref + # Create reference trajectory. + forkr(state.trajectory) + else + trng = TracedRNG() + Trace(GenericModel(model, trng), trng) + end + end + + particles = ParticleContainer(traces, TracedRNG(), rng) # Perform a particle sweep. - logevidence = sweep!(rng, particles, sampler.resampler) + reference = isref ? particles.vals[nparticles] : nothing + logevidence = sweep!(rng, particles, sampler.resampler, reference) # Pick a particle to be retained. - trajectory = rand(rng, particles) + newtrajectory = rand(rng, particles) - return PGSample(trajectory, logevidence), PGState(trajectory) + return PGSample(newtrajectory, logevidence), PGState(newtrajectory) end function AbstractMCMC.step( rng::Random.AbstractRNG, - model::AbstractMCMC.AbstractModel, - sampler::PG, - state::PGState; + model::AbstractStateSpaceModel, + sampler::PGAS, + state::Union{PGState,Nothing}=nothing; kwargs..., ) # Create a new set of particles. nparticles = sampler.nparticles + isref = !isnothing(state) - x = map(1:nparticles) do i - if i == nparticles + traces = map(1:nparticles) do i + if i == nparticles && isref # Create reference trajectory. - forkr(state.trajectory) + forkr(deepcopy(state.trajectory)) else - Trace(model, TracedRNG()) + Trace(deepcopy(model), TracedRNG()) end end - - reference = x[end] - particles = ParticleContainer(x, TracedRNG(), rng) + particles = ParticleContainer(traces, TracedRNG(), rng) # Perform a particle sweep. + reference = isref ? particles.vals[nparticles] : nothing logevidence = sweep!(rng, particles, sampler.resampler, reference) # Pick a particle to be retained. - newtrajectory = rand(rng, particles) - + newtrajectory = rand(particles.rng, particles) return PGSample(newtrajectory, logevidence), PGState(newtrajectory) end diff --git a/test/container.jl b/test/container.jl index 333db404..9eea2505 100644 --- a/test/container.jl +++ b/test/container.jl @@ -22,7 +22,11 @@ # Create particle container. logps = [0.0, -1.0, -2.0] - particles = [AdvancedPS.Trace(fpc(logp), AdvancedPS.TracedRNG()) for logp in logps] + particles = map(logps) do logp + trng = AdvancedPS.TracedRNG() + tmodel = AdvancedPS.GenericModel(fpc(logp), trng) + AdvancedPS.Trace(tmodel, trng) + end pc = AdvancedPS.ParticleContainer(particles) # Initial state. @@ -52,12 +56,20 @@ @test AdvancedPS.logZ(pc) ≈ log(sum(exp, 2 .* logps)) # Resample and propagate particles with reference particle - particles_ref = [ - AdvancedPS.Trace(fpc(logp), AdvancedPS.TracedRNG()) for logp in logps - ] + particles_ref = map(logps) do logp + trng = AdvancedPS.TracedRNG() + tmodel = AdvancedPS.GenericModel(fpc(logp), trng) + AdvancedPS.Trace(tmodel, trng) + end pc_ref = AdvancedPS.ParticleContainer(particles_ref) + + selected = particles_ref[end] # Replicate life cycle of the reference particle + AdvancedPS.advance!(selected) + ref = AdvancedPS.forkr(selected) + pc_ref.vals[end] = ref + AdvancedPS.resample_propagate!( - Random.GLOBAL_RNG, pc_ref, AdvancedPS.resample_systematic, particles_ref[end] + Random.GLOBAL_RNG, pc_ref, AdvancedPS.resample_systematic, ref ) @test pc_ref.logWs == zeros(3) @test AdvancedPS.getweights(pc_ref) == fill(1 / 3, 3) @@ -109,17 +121,19 @@ end # Test task copy version of trace - tr = AdvancedPS.Trace(f2, AdvancedPS.TracedRNG()) + trng = AdvancedPS.TracedRNG() + tmodel = AdvancedPS.GenericModel(f2, trng) + tr = AdvancedPS.Trace(tmodel, trng) - consume(tr.task) - consume(tr.task) + consume(tr.model.ctask) + consume(tr.model.ctask) a = AdvancedPS.fork(tr) - consume(a.task) - consume(a.task) + consume(a.model.ctask) + consume(a.model.ctask) - @test consume(tr.task) == 2 - @test consume(a.task) == 4 + @test consume(tr.model.ctask) == 2 + @test consume(a.model.ctask) == 4 end @testset "seed container" begin @@ -129,7 +143,11 @@ n = 3 rng = Random.MersenneTwister(seed) - particles = [AdvancedPS.Trace(dummy, AdvancedPS.TracedRNG()) for _ in 1:n] + particles = map(1:n) do _ + trng = AdvancedPS.TracedRNG() + tmodel = AdvancedPS.GenericModel(dummy, trng) + AdvancedPS.Trace(tmodel, trng) + end pc = AdvancedPS.ParticleContainer(particles, AdvancedPS.TracedRNG()) AdvancedPS.seed_from_rng!(pc, rng) diff --git a/test/pgas.jl b/test/pgas.jl new file mode 100644 index 00000000..cd319a4b --- /dev/null +++ b/test/pgas.jl @@ -0,0 +1,73 @@ +@testset "pgas.jl" begin + mutable struct Params + a::Float64 + q::Float64 + r::Float64 + end + + mutable struct BaseModel <: AdvancedPS.AbstractStateSpaceModel + X::Vector{Float64} + θ::Params + BaseModel(params::Params) = new(Vector{Float64}(), params) + end + + AdvancedPS.initialization(model::BaseModel) = Normal(0, model.θ.q) + function AdvancedPS.transition(model::BaseModel, state, step) + return Distributions.Normal(model.θ.a * state, model.θ.q) + end + function AdvancedPS.observation(model::BaseModel, state, step) + return Distributions.logpdf(Distributions.Normal(state, model.θ.r), 0) + end + + AdvancedPS.isdone(::BaseModel, step) = step > 3 + + @testset "fork reference" begin + model = BaseModel(Params(0.9, 0.32, 1)) + part = AdvancedPS.Trace(model, AdvancedPS.TracedRNG()) + + AdvancedPS.advance!(part) + AdvancedPS.advance!(part) + AdvancedPS.advance!(part) + @test length(part.model.X) == 3 + + trajectory = deepcopy(part.model.X) + ref = AdvancedPS.forkr(part) + @test all(trajectory .≈ ref.model.X) + + AdvancedPS.advance!(ref) + new_part = AdvancedPS.fork(ref, true) + @test length(new_part.model.X) == 1 + @test new_part.model.X[1] ≈ ref.model.X[1] + end + + @testset "update reference" begin + base_rng = Random.MersenneTwister(31) + particles = [ + AdvancedPS.Trace(BaseModel(Params(0.9, 0.31, 1)), AdvancedPS.TracedRNG()) for + _ in 1:3 + ] + resampler = AdvancedPS.ResampleWithESSThreshold(1.0) + + part = particles[3] + AdvancedPS.advance!(part) + AdvancedPS.advance!(part) + AdvancedPS.advance!(part) + + ref = AdvancedPS.forkr(part) + particles[3] = ref + pc = AdvancedPS.ParticleContainer(particles, AdvancedPS.TracedRNG(), base_rng) + + AdvancedPS.reweight!(pc, ref) + AdvancedPS.resample_propagate!(base_rng, pc, resampler, ref) + + AdvancedPS.reweight!(pc, ref) + pc.logWs = [-Inf, 0, -Inf] # Force ancestor update to second particle + AdvancedPS.resample_propagate!(base_rng, pc, resampler, ref) + + AdvancedPS.reweight!(pc, ref) + @test all(pc.vals[2].model.X[1:2] .≈ ref.model.X[1:2]) + + terminal_values = [part.model.X[3] for part in pc.vals] + @test length(Set(terminal_values)) == 3 # All distinct + end +end diff --git a/test/runtests.jl b/test/runtests.jl index 32adc400..d7058062 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -18,4 +18,7 @@ using Test @testset "RNG tests" begin include("rng.jl") end + @testset "PG-AS" begin + include("pgas.jl") + end end diff --git a/test/smc.jl b/test/smc.jl index d8765133..8bb2419d 100644 --- a/test/smc.jl +++ b/test/smc.jl @@ -93,7 +93,7 @@ chains_smc = sample(TestModel(), AdvancedPS.SMC(100)) - @test all(isone(p.f.x) for p in chains_smc.trajectories) + @test all(isone(p.model.f.x) for p in chains_smc.trajectories) @test chains_smc.logevidence ≈ -2 * log(2) end @@ -147,7 +147,7 @@ chains_pg = sample(TestModel(), AdvancedPS.PG(10), 100) - @test all(isone(p.trajectory.f.x) for p in chains_pg) + @test all(isone(p.trajectory.model.f.x) for p in chains_pg) @test mean(x.logevidence for x in chains_pg) ≈ -2 * log(2) atol = 0.01 end @@ -170,8 +170,8 @@ pg = AdvancedPS.PG(1) first, second = sample(Model(), pg, 2) - first_model = first.trajectory.f - second_model = second.trajectory.f + first_model = first.trajectory.model.f + second_model = second.trajectory.model.f # Single Particle - must be replaying @test first_model.a ≈ second_model.a