diff --git a/Project.toml b/Project.toml index b66a06051..f909f0b17 100644 --- a/Project.toml +++ b/Project.toml @@ -1,7 +1,7 @@ name = "ModelPredictiveControl" uuid = "61f9bdb8-6ae4-484a-811f-bbf86720c31c" authors = ["Francis Gagnon"] -version = "0.21.1" +version = "0.21.2" [deps] ControlSystemsBase = "aaaaaaaa-a6ca-5380-bf3e-84a91bcd477e" @@ -12,6 +12,7 @@ LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" OSQP = "ab2f91bb-94b4-55e3-9ba0-7f65df51de79" PreallocationTools = "d236fae5-4411-538c-8e31-a6e3d9e00b46" PrecompileTools = "aea7be01-6a6a-4083-8856-8a6e6704d82a" +ProgressLogging = "33c8b6b6-d38a-422a-b730-caa89a2f386c" Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" RecipesBase = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" @@ -29,10 +30,10 @@ RecipesBase = "1" julia = "1.6" [extras] +DAQP = "c47d62df-3981-49c8-9651-128b1cd08617" Documenter = "e30172f5-a6a5-5a46-863b-614d45cd2de4" Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" -DAQP = "c47d62df-3981-49c8-9651-128b1cd08617" [targets] test = ["Test", "Documenter", "Plots", "DAQP"] diff --git a/docs/Manifest.toml b/docs/Manifest.toml new file mode 100644 index 000000000..918e64187 --- /dev/null +++ b/docs/Manifest.toml @@ -0,0 +1,1478 @@ +# This file is machine-generated - editing it directly is not advised + +julia_version = "1.10.3" +manifest_format = "2.0" +project_hash = "601cd4e4e7909e09ff35e9dd42fb08b749ee2e30" + +[[deps.ANSIColoredPrinters]] +git-tree-sha1 = "574baf8110975760d391c710b6341da1afa48d8c" +uuid = "a4c015fc-c6ff-483c-b24f-f7ea428134e9" +version = "0.0.1" + +[[deps.AbstractFFTs]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "d92ad398961a3ed262d8bf04a1a2b8340f915fef" +uuid = "621f4979-c628-5d54-868e-fcf4e3e8185c" +version = "1.5.0" + + [deps.AbstractFFTs.extensions] + AbstractFFTsChainRulesCoreExt = "ChainRulesCore" + AbstractFFTsTestExt = "Test" + + [deps.AbstractFFTs.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[[deps.AbstractTrees]] +git-tree-sha1 = "2d9c9a55f9c93e8887ad391fbae72f8ef55e1177" +uuid = "1520ce14-60c1-5f80-bbc7-55ef81b5835c" +version = "0.4.5" + +[[deps.Adapt]] +deps = ["LinearAlgebra", "Requires"] +git-tree-sha1 = "6a55b747d1812e699320963ffde36f1ebdda4099" +uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" +version = "4.0.4" + + [deps.Adapt.extensions] + AdaptStaticArraysExt = "StaticArrays" + + [deps.Adapt.weakdeps] + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + +[[deps.ArgTools]] +uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" +version = "1.1.1" + +[[deps.ArrayInterface]] +deps = ["Adapt", "LinearAlgebra", "SparseArrays", "SuiteSparse"] +git-tree-sha1 = "133a240faec6e074e07c31ee75619c90544179cf" +uuid = "4fba245c-0d91-5ea0-9b3e-6abc04ee57a9" +version = "7.10.0" + + [deps.ArrayInterface.extensions] + ArrayInterfaceBandedMatricesExt = "BandedMatrices" + ArrayInterfaceBlockBandedMatricesExt = "BlockBandedMatrices" + ArrayInterfaceCUDAExt = "CUDA" + ArrayInterfaceCUDSSExt = "CUDSS" + ArrayInterfaceChainRulesExt = "ChainRules" + ArrayInterfaceGPUArraysCoreExt = "GPUArraysCore" + ArrayInterfaceReverseDiffExt = "ReverseDiff" + 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" + GPUArraysCore = "46192b85-c4d5-4398-a991-12ede77f4527" + ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + StaticArraysCore = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" + Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" + +[[deps.Artifacts]] +uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" + +[[deps.Base64]] +uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" + +[[deps.BenchmarkTools]] +deps = ["JSON", "Logging", "Printf", "Profile", "Statistics", "UUIDs"] +git-tree-sha1 = "f1dff6729bc61f4d49e140da1af55dcd1ac97b2f" +uuid = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf" +version = "1.5.0" + +[[deps.BitFlags]] +git-tree-sha1 = "2dc09997850d68179b69dafb58ae806167a32b1b" +uuid = "d1d4a3ce-64b1-5f1a-9ba4-7e7e69966f35" +version = "0.1.8" + +[[deps.BitTwiddlingConvenienceFunctions]] +deps = ["Static"] +git-tree-sha1 = "0c5f81f47bbbcf4aea7b2959135713459170798b" +uuid = "62783981-4cbd-42fc-bca8-16325de8dc4b" +version = "0.1.5" + +[[deps.Bzip2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "9e2a6b69137e6969bab0152632dcb3bc108c8bdd" +uuid = "6e34b625-4abd-537c-b88f-471c36dfa7a0" +version = "1.0.8+1" + +[[deps.CPUSummary]] +deps = ["CpuId", "IfElse", "PrecompileTools", "Static"] +git-tree-sha1 = "601f7e7b3d36f18790e2caf83a882d88e9b71ff1" +uuid = "2a0fbf3d-bb9c-48f3-b0a9-814d99fd7ab9" +version = "0.2.4" + +[[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 = "a4c43f59baa34011e303e76f5c8c91bf58415aaf" +uuid = "83423d85-b0ee-5818-9007-b63ccbeb887a" +version = "1.18.0+1" + +[[deps.CloseOpenIntervals]] +deps = ["Static", "StaticArrayInterface"] +git-tree-sha1 = "70232f82ffaab9dc52585e0dd043b5e0c6b714f1" +uuid = "fb6a15b2-703c-40df-9091-08a04967cfa9" +version = "0.1.12" + +[[deps.CodecBzip2]] +deps = ["Bzip2_jll", "Libdl", "TranscodingStreams"] +git-tree-sha1 = "9b1ca1aa6ce3f71b3d1840c538a8210a043625eb" +uuid = "523fee87-0ab8-5b00-afb7-3ecf72e48cfd" +version = "0.8.2" + +[[deps.CodecZlib]] +deps = ["TranscodingStreams", "Zlib_jll"] +git-tree-sha1 = "59939d8a997469ee05c4b4944560a820f9ba0d73" +uuid = "944b1d66-785c-5afd-91f1-9de20f533193" +version = "0.7.4" + +[[deps.ColorSchemes]] +deps = ["ColorTypes", "ColorVectorSpace", "Colors", "FixedPointNumbers", "PrecompileTools", "Random"] +git-tree-sha1 = "67c1f244b991cad9b0aa4b7540fb758c2488b129" +uuid = "35d6a980-a343-548e-a6ea-1d62b119f2f4" +version = "3.24.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 = "fc08e5930ee9a4e03f84bfb5211cb54e7769758a" +uuid = "5ae59095-9a9b-59fe-a467-6f913c188581" +version = "0.12.10" + +[[deps.CommonSubexpressions]] +deps = ["MacroTools", "Test"] +git-tree-sha1 = "7b8a93dba8af7e3b42fecabf646260105ac373f7" +uuid = "bbf7d656-a473-5ed7-a52c-81e309532950" +version = "0.3.0" + +[[deps.Compat]] +deps = ["TOML", "UUIDs"] +git-tree-sha1 = "b1c55339b7c6c350ee89f2c1604299660525b248" +uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" +version = "4.15.0" +weakdeps = ["Dates", "LinearAlgebra"] + + [deps.Compat.extensions] + CompatLinearAlgebraExt = "LinearAlgebra" + +[[deps.CompilerSupportLibraries_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" +version = "1.1.1+0" + +[[deps.ConcurrentUtilities]] +deps = ["Serialization", "Sockets"] +git-tree-sha1 = "6cbbd4d241d7e6579ab354737f4dd95ca43946e1" +uuid = "f0e56b4a-5159-44fe-b623-3e5288b988bb" +version = "2.4.1" + +[[deps.ConstructionBase]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "260fd2400ed2dab602a7c15cf10c1933c59930a2" +uuid = "187b0558-2788-49d3-abe0-74a17ed4e7c9" +version = "1.5.5" + + [deps.ConstructionBase.extensions] + ConstructionBaseIntervalSetsExt = "IntervalSets" + ConstructionBaseStaticArraysExt = "StaticArrays" + + [deps.ConstructionBase.weakdeps] + IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953" + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + +[[deps.Contour]] +git-tree-sha1 = "439e35b0b36e2e5881738abc8857bd92ad6ff9a8" +uuid = "d38c429a-6771-53c6-b99e-75d170b6e991" +version = "0.6.3" + +[[deps.ControlSystemsBase]] +deps = ["DSP", "ForwardDiff", "IterTools", "LaTeXStrings", "LinearAlgebra", "MacroTools", "MatrixEquations", "MatrixPencils", "Polyester", "Polynomials", "PrecompileTools", "Printf", "Random", "RecipesBase", "SparseArrays", "StaticArraysCore", "UUIDs"] +git-tree-sha1 = "a58517a0b734b4a79789687518fed76ab521212b" +uuid = "aaaaaaaa-a6ca-5380-bf3e-84a91bcd477e" +version = "1.10.2" + + [deps.ControlSystemsBase.extensions] + ControlSystemsBaseImplicitDifferentiationExt = ["ImplicitDifferentiation", "ComponentArrays"] + + [deps.ControlSystemsBase.weakdeps] + ComponentArrays = "b0b7db55-cfe3-40fc-9ded-d10e2dbeff66" + ImplicitDifferentiation = "57b37032-215b-411a-8a7c-41a003a55207" + +[[deps.CpuId]] +deps = ["Markdown"] +git-tree-sha1 = "fcbb72b032692610bfbdb15018ac16a36cf2e406" +uuid = "adafc99b-e345-5852-983c-f28acb93d879" +version = "0.3.1" + +[[deps.DAQP]] +deps = ["DAQP_jll", "LinearAlgebra", "MathOptInterface"] +git-tree-sha1 = "c73f650ee3cfe55ca843a65eaab1629e47a7862b" +uuid = "c47d62df-3981-49c8-9651-128b1cd08617" +version = "0.5.2" + +[[deps.DAQP_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "6e25dea369e8cb8a36c9b9a103408b7ba296f4a7" +uuid = "5c51c916-43bf-57fe-9d62-13064ebbf40d" +version = "0.5.0+0" + +[[deps.DSP]] +deps = ["Compat", "FFTW", "IterTools", "LinearAlgebra", "Polynomials", "Random", "Reexport", "SpecialFunctions", "Statistics"] +git-tree-sha1 = "f7f4319567fe769debfcf7f8c03d8da1dd4e2fb0" +uuid = "717857b8-e6f2-59f4-9121-6e50c889abd2" +version = "0.7.9" + +[[deps.DataAPI]] +git-tree-sha1 = "abe83f3a2f1b857aac70ef8b269080af17764bbe" +uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a" +version = "1.16.0" + +[[deps.DataStructures]] +deps = ["Compat", "InteractiveUtils", "OrderedCollections"] +git-tree-sha1 = "1d0a14036acb104d9e89698bd408f63ab58cdc82" +uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" +version = "0.18.20" + +[[deps.Dates]] +deps = ["Printf"] +uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" + +[[deps.DelimitedFiles]] +deps = ["Mmap"] +git-tree-sha1 = "9e2f36d3c96a820c678f2f1f1782582fcf685bae" +uuid = "8bb1440f-4735-579b-a4ab-409b98df4dab" +version = "1.9.1" + +[[deps.DiffResults]] +deps = ["StaticArraysCore"] +git-tree-sha1 = "782dd5f4561f5d267313f23853baaaa4c52ea621" +uuid = "163ba53b-c6d8-5494-b064-1a9d43ac40c5" +version = "1.1.0" + +[[deps.DiffRules]] +deps = ["IrrationalConstants", "LogExpFunctions", "NaNMath", "Random", "SpecialFunctions"] +git-tree-sha1 = "23163d55f885173722d1e4cf0f6110cdbaf7e272" +uuid = "b552c78f-8df3-52c6-915a-8e097449b14b" +version = "1.15.1" + +[[deps.DocStringExtensions]] +deps = ["LibGit2"] +git-tree-sha1 = "2fb1e02f2b635d0845df5d7c167fec4dd739b00d" +uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" +version = "0.9.3" + +[[deps.Documenter]] +deps = ["ANSIColoredPrinters", "AbstractTrees", "Base64", "CodecZlib", "Dates", "DocStringExtensions", "Downloads", "Git", "IOCapture", "InteractiveUtils", "JSON", "LibGit2", "Logging", "Markdown", "MarkdownAST", "Pkg", "PrecompileTools", "REPL", "RegistryInstances", "SHA", "TOML", "Test", "Unicode"] +git-tree-sha1 = "5461b2a67beb9089980e2f8f25145186b6d34f91" +uuid = "e30172f5-a6a5-5a46-863b-614d45cd2de4" +version = "1.4.1" + +[[deps.Downloads]] +deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] +uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" +version = "1.6.0" + +[[deps.EpollShim_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "8e9441ee83492030ace98f9789a654a6d0b1f643" +uuid = "2702e6a9-849d-5ed8-8c21-79e8b8f9ee43" +version = "0.0.20230411+0" + +[[deps.ExceptionUnwrapping]] +deps = ["Test"] +git-tree-sha1 = "dcb08a0d93ec0b1cdc4af184b26b591e9695423a" +uuid = "460bff9d-24e4-43bc-9d9f-a8973cb893f4" +version = "0.1.10" + +[[deps.Expat_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "1c6317308b9dc757616f0b5cb379db10494443a7" +uuid = "2e619515-83b5-522b-bb60-26c02a35a201" +version = "2.6.2+0" + +[[deps.FFMPEG]] +deps = ["FFMPEG_jll"] +git-tree-sha1 = "b57e3acbe22f8484b4b5ff66a7499717fe1a9cc8" +uuid = "c87230d0-a227-11e9-1b43-d7ebe4e7570a" +version = "0.4.1" + +[[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 = "466d45dc38e15794ec7d5d63ec03d776a9aff36e" +uuid = "b22a6f82-2f65-5046-a5b2-351ab43fb4e5" +version = "4.4.4+1" + +[[deps.FFTW]] +deps = ["AbstractFFTs", "FFTW_jll", "LinearAlgebra", "MKL_jll", "Preferences", "Reexport"] +git-tree-sha1 = "4820348781ae578893311153d69049a93d05f39d" +uuid = "7a1cc6ca-52ef-59f5-83cd-3a7055c09341" +version = "1.8.0" + +[[deps.FFTW_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "c6033cc3892d0ef5bb9cd29b7f2f0331ea5184ea" +uuid = "f5851436-0d7a-5f13-b9de-f02708fd171a" +version = "3.3.10+0" + +[[deps.FileWatching]] +uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" + +[[deps.FixedPointNumbers]] +deps = ["Statistics"] +git-tree-sha1 = "335bfdceacc84c5cdf16aadc768aa5ddfc5383cc" +uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" +version = "0.8.4" + +[[deps.Fontconfig_jll]] +deps = ["Artifacts", "Bzip2_jll", "Expat_jll", "FreeType2_jll", "JLLWrappers", "Libdl", "Libuuid_jll", "Zlib_jll"] +git-tree-sha1 = "db16beca600632c95fc8aca29890d83788dd8b23" +uuid = "a3f928ae-7b40-5064-980b-68af3947d34b" +version = "2.13.96+0" + +[[deps.Format]] +git-tree-sha1 = "9c68794ef81b08086aeb32eeaf33531668d5f5fc" +uuid = "1fa38f19-a742-5d3f-a2b9-30dd87b9d5f8" +version = "1.3.7" + +[[deps.ForwardDiff]] +deps = ["CommonSubexpressions", "DiffResults", "DiffRules", "LinearAlgebra", "LogExpFunctions", "NaNMath", "Preferences", "Printf", "Random", "SpecialFunctions"] +git-tree-sha1 = "cf0fe81336da9fb90944683b8c41984b08793dad" +uuid = "f6369f11-7733-5829-9624-2563aa707210" +version = "0.10.36" + + [deps.ForwardDiff.extensions] + ForwardDiffStaticArraysExt = "StaticArrays" + + [deps.ForwardDiff.weakdeps] + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + +[[deps.FreeType2_jll]] +deps = ["Artifacts", "Bzip2_jll", "JLLWrappers", "Libdl", "Zlib_jll"] +git-tree-sha1 = "d8db6a5a2fe1381c1ea4ef2cab7c69c2de7f9ea0" +uuid = "d7e528f0-a631-5988-bf34-fe36492bcfd7" +version = "2.13.1+0" + +[[deps.FriBidi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "1ed150b39aebcc805c26b93a8d0122c940f64ce2" +uuid = "559328eb-81f9-559d-9380-de523a88c83c" +version = "1.0.14+0" + +[[deps.Future]] +deps = ["Random"] +uuid = "9fa8497b-333b-5362-9e8d-4d0656e87820" + +[[deps.GLFW_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libglvnd_jll", "Xorg_libXcursor_jll", "Xorg_libXi_jll", "Xorg_libXinerama_jll", "Xorg_libXrandr_jll"] +git-tree-sha1 = "ff38ba61beff76b8f4acad8ab0c97ef73bb670cb" +uuid = "0656b61e-2033-5cc2-a64a-77c0f6c09b89" +version = "3.3.9+0" + +[[deps.GR]] +deps = ["Artifacts", "Base64", "DelimitedFiles", "Downloads", "GR_jll", "HTTP", "JSON", "Libdl", "LinearAlgebra", "Preferences", "Printf", "Random", "Serialization", "Sockets", "TOML", "Tar", "Test", "p7zip_jll"] +git-tree-sha1 = "ddda044ca260ee324c5fc07edb6d7cf3f0b9c350" +uuid = "28b8d3ca-fb5f-59d9-8090-bfdbd6d07a71" +version = "0.73.5" + +[[deps.GR_jll]] +deps = ["Artifacts", "Bzip2_jll", "Cairo_jll", "FFMPEG_jll", "Fontconfig_jll", "FreeType2_jll", "GLFW_jll", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Libtiff_jll", "Pixman_jll", "Qt6Base_jll", "Zlib_jll", "libpng_jll"] +git-tree-sha1 = "278e5e0f820178e8a26df3184fcb2280717c79b1" +uuid = "d2c73de3-f751-5644-a686-071e5b155ba9" +version = "0.73.5+0" + +[[deps.Gettext_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Libiconv_jll", "Pkg", "XML2_jll"] +git-tree-sha1 = "9b02998aba7bf074d14de89f9d37ca24a1a0b046" +uuid = "78b55507-aeef-58d4-861c-77aaff3498b1" +version = "0.21.0+0" + +[[deps.Git]] +deps = ["Git_jll"] +git-tree-sha1 = "04eff47b1354d702c3a85e8ab23d539bb7d5957e" +uuid = "d7ba0133-e1db-5d97-8f8c-041e4b3a1eb2" +version = "1.3.1" + +[[deps.Git_jll]] +deps = ["Artifacts", "Expat_jll", "JLLWrappers", "LibCURL_jll", "Libdl", "Libiconv_jll", "OpenSSL_jll", "PCRE2_jll", "Zlib_jll"] +git-tree-sha1 = "d18fb8a1f3609361ebda9bf029b60fd0f120c809" +uuid = "f8c6e375-362e-5223-8a59-34ff63f689eb" +version = "2.44.0+2" + +[[deps.Glib_jll]] +deps = ["Artifacts", "Gettext_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Libiconv_jll", "Libmount_jll", "PCRE2_jll", "Zlib_jll"] +git-tree-sha1 = "359a1ba2e320790ddbe4ee8b4d54a305c0ea2aff" +uuid = "7746bdde-850d-59dc-9ae8-88ece973131d" +version = "2.80.0+0" + +[[deps.Graphite2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "344bf40dcab1073aca04aa0df4fb092f920e4011" +uuid = "3b182d85-2403-5c21-9c21-1e1f0cc25472" +version = "1.3.14+0" + +[[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", "Random", "SimpleBufferStream", "Sockets", "URIs", "UUIDs"] +git-tree-sha1 = "2c3ec1f90bb4a8f7beafb0cffea8a4c3f4e636ab" +uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3" +version = "1.10.6" + +[[deps.HarfBuzz_jll]] +deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "Graphite2_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Pkg"] +git-tree-sha1 = "129acf094d168394e80ee1dc4bc06ec835e510a3" +uuid = "2e76f6c2-a576-52d4-95c1-20adfe4de566" +version = "2.8.1+1" + +[[deps.IOCapture]] +deps = ["Logging", "Random"] +git-tree-sha1 = "8b72179abc660bfab5e28472e019392b97d0985c" +uuid = "b5f81e59-6552-4d32-b1f0-c071b021bf89" +version = "0.2.4" + +[[deps.IfElse]] +git-tree-sha1 = "debdd00ffef04665ccbb3e150747a77560e8fad1" +uuid = "615f187c-cbe4-4ef1-ba3b-2fcf58d6d173" +version = "0.1.1" + +[[deps.IntelOpenMP_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "be50fe8df3acbffa0274a744f1a99d29c45a57f4" +uuid = "1d5cc7b8-4909-519e-a0f8-d0f5ad9712d0" +version = "2024.1.0+0" + +[[deps.InteractiveUtils]] +deps = ["Markdown"] +uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" + +[[deps.IrrationalConstants]] +git-tree-sha1 = "630b497eafcc20001bba38a4651b327dcfc491d2" +uuid = "92d709cd-6900-40b7-9082-c6be49f344b6" +version = "0.2.2" + +[[deps.IterTools]] +git-tree-sha1 = "42d5f897009e7ff2cf88db414a389e5ed1bdd023" +uuid = "c8e1da08-722c-5040-9ed9-7db0dc04731e" +version = "1.10.0" + +[[deps.JLFzf]] +deps = ["Pipe", "REPL", "Random", "fzf_jll"] +git-tree-sha1 = "a53ebe394b71470c7f97c2e7e170d51df21b17af" +uuid = "1019f520-868f-41f5-a6de-eb00f4b6a39c" +version = "0.1.7" + +[[deps.JLLWrappers]] +deps = ["Artifacts", "Preferences"] +git-tree-sha1 = "7e5d6779a1e09a36db2a7b6cff50942a0a7d0fca" +uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" +version = "1.5.0" + +[[deps.JSON]] +deps = ["Dates", "Mmap", "Parsers", "Unicode"] +git-tree-sha1 = "31e996f0a15c7b280ba9f76636b3ff9e2ae58c9a" +uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" +version = "0.21.4" + +[[deps.JpegTurbo_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "3336abae9a713d2210bb57ab484b1e065edd7d23" +uuid = "aacddb02-875f-59d6-b918-886e6ef4fbf8" +version = "3.0.2+0" + +[[deps.JuMP]] +deps = ["LinearAlgebra", "MacroTools", "MathOptInterface", "MutableArithmetics", "OrderedCollections", "PrecompileTools", "Printf", "SparseArrays"] +git-tree-sha1 = "07385c772da34d91fc55d6c704b6224302082ba0" +uuid = "4076af6c-e467-56ae-b986-b466b2749572" +version = "1.21.1" + + [deps.JuMP.extensions] + JuMPDimensionalDataExt = "DimensionalData" + + [deps.JuMP.weakdeps] + DimensionalData = "0703355e-b756-11e9-17c0-8b28908087d0" + +[[deps.LAME_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "170b660facf5df5de098d866564877e119141cbd" +uuid = "c1c5ebd0-6772-5130-a774-d5fcae4a789d" +version = "3.100.2+0" + +[[deps.LERC_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "bf36f528eec6634efc60d7ec062008f171071434" +uuid = "88015f11-f218-50d7-93a8-a6af411a945d" +version = "3.0.0+1" + +[[deps.LLVMOpenMP_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "d986ce2d884d49126836ea94ed5bfb0f12679713" +uuid = "1d63c593-3942-5779-bab2-d838dc0a180e" +version = "15.0.7+0" + +[[deps.LZO_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "70c5da094887fd2cae843b8db33920bac4b6f07d" +uuid = "dd4b983a-f0e5-5f8d-a1b7-129d4a5fb1ac" +version = "2.10.2+0" + +[[deps.LaTeXStrings]] +git-tree-sha1 = "50901ebc375ed41dbf8058da26f9de442febbbec" +uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" +version = "1.3.1" + +[[deps.Latexify]] +deps = ["Format", "InteractiveUtils", "LaTeXStrings", "MacroTools", "Markdown", "OrderedCollections", "Requires"] +git-tree-sha1 = "e0b5cd21dc1b44ec6e64f351976f961e6f31d6c4" +uuid = "23fbe1c1-3f47-55db-b15f-69d7ec21a316" +version = "0.16.3" + + [deps.Latexify.extensions] + DataFramesExt = "DataFrames" + SymEngineExt = "SymEngine" + + [deps.Latexify.weakdeps] + DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" + SymEngine = "123dc426-2d89-5057-bbad-38513e3affd8" + +[[deps.LayoutPointers]] +deps = ["ArrayInterface", "LinearAlgebra", "ManualMemory", "SIMDTypes", "Static", "StaticArrayInterface"] +git-tree-sha1 = "62edfee3211981241b57ff1cedf4d74d79519277" +uuid = "10f19ff3-798f-405d-979b-55457f8fc047" +version = "0.1.15" + +[[deps.LazilyInitializedFields]] +git-tree-sha1 = "8f7f3cabab0fd1800699663533b6d5cb3fc0e612" +uuid = "0e77f7df-68c5-4e49-93ce-4cd80f5598bf" +version = "1.2.2" + +[[deps.LazyArtifacts]] +deps = ["Artifacts", "Pkg"] +uuid = "4af54fe1-eca0-43a8-85a7-787d91b784e3" + +[[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.4.0+0" + +[[deps.LibGit2]] +deps = ["Base64", "LibGit2_jll", "NetworkOptions", "Printf", "SHA"] +uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" + +[[deps.LibGit2_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll"] +uuid = "e37daf67-58a4-590a-8e99-b0245dd2ffc5" +version = "1.6.4+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" + +[[deps.Libffi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "0b4a5d71f3e5200a7dff793393e09dfc2d874290" +uuid = "e9f186c6-92d2-5b65-8a66-fee21dc1b490" +version = "3.2.2+1" + +[[deps.Libgcrypt_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgpg_error_jll"] +git-tree-sha1 = "9fd170c4bbfd8b935fdc5f8b7aa33532c991a673" +uuid = "d4300ac3-e22c-5743-9152-c294e39db1e4" +version = "1.8.11+0" + +[[deps.Libglvnd_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll", "Xorg_libXext_jll"] +git-tree-sha1 = "6f73d1dd803986947b2c750138528a999a6c7733" +uuid = "7e76a0d4-f3c7-5321-8279-8d96eeed0f29" +version = "1.6.0+0" + +[[deps.Libgpg_error_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "fbb1f2bef882392312feb1ede3615ddc1e9b99ed" +uuid = "7add5ba3-2f88-524e-9cd5-f83b8a55f7b8" +version = "1.49.0+0" + +[[deps.Libiconv_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "f9557a255370125b405568f9767d6d195822a175" +uuid = "94ce4f54-9a6c-5748-9c1c-f9c7231a4531" +version = "1.17.0+0" + +[[deps.Libmount_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "4b683b19157282f50bfd5dcaa2efe5295814ea22" +uuid = "4b2f31a3-9ecc-558c-b454-b3730dcb73e9" +version = "2.40.0+0" + +[[deps.Libtiff_jll]] +deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "LERC_jll", "Libdl", "XZ_jll", "Zlib_jll", "Zstd_jll"] +git-tree-sha1 = "2da088d113af58221c52828a80378e16be7d037a" +uuid = "89763e89-9b03-5906-acba-b20f662cd828" +version = "4.5.1+1" + +[[deps.Libuuid_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "27fd5cc10be85658cacfe11bb81bee216af13eda" +uuid = "38a345b3-de98-5d2b-a5d3-14cd9215e700" +version = "2.40.0+0" + +[[deps.LinearAlgebra]] +deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"] +uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + +[[deps.LinearMaps]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "9948d6f8208acfebc3e8cf4681362b2124339e7e" +uuid = "7a12625a-238d-50fd-b39a-03d52299707e" +version = "3.11.2" + + [deps.LinearMaps.extensions] + LinearMapsChainRulesCoreExt = "ChainRulesCore" + LinearMapsSparseArraysExt = "SparseArrays" + LinearMapsStatisticsExt = "Statistics" + + [deps.LinearMaps.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" + +[[deps.LogExpFunctions]] +deps = ["DocStringExtensions", "IrrationalConstants", "LinearAlgebra"] +git-tree-sha1 = "18144f3e9cbe9b15b070288eef858f71b291ce37" +uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688" +version = "0.3.27" + + [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" + +[[deps.LoggingExtras]] +deps = ["Dates", "Logging"] +git-tree-sha1 = "c1dd6d7978c12545b4179fb6153b9250c96b0075" +uuid = "e6f89c97-d47a-5376-807f-9c37f3926c36" +version = "1.0.3" + +[[deps.MKL_jll]] +deps = ["Artifacts", "IntelOpenMP_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "oneTBB_jll"] +git-tree-sha1 = "80b2833b56d466b3858d565adcd16a4a05f2089b" +uuid = "856f044c-d86e-5d09-b602-aeab76dc8ba7" +version = "2024.1.0+0" + +[[deps.MacroTools]] +deps = ["Markdown", "Random"] +git-tree-sha1 = "2fa9ee3e63fd3a4f7a9a4f4744a52f4856de82df" +uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" +version = "0.5.13" + +[[deps.ManualMemory]] +git-tree-sha1 = "bcaef4fc7a0cfe2cba636d84cda54b5e4e4ca3cd" +uuid = "d125e4d3-2237-4719-b19c-fa641b8a4667" +version = "0.1.8" + +[[deps.Markdown]] +deps = ["Base64"] +uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" + +[[deps.MarkdownAST]] +deps = ["AbstractTrees", "Markdown"] +git-tree-sha1 = "465a70f0fc7d443a00dcdc3267a497397b8a3899" +uuid = "d0879d2d-cac2-40c8-9cee-1863dc0c7391" +version = "0.1.2" + +[[deps.MathOptInterface]] +deps = ["BenchmarkTools", "CodecBzip2", "CodecZlib", "DataStructures", "ForwardDiff", "JSON", "LinearAlgebra", "MutableArithmetics", "NaNMath", "OrderedCollections", "PrecompileTools", "Printf", "SparseArrays", "SpecialFunctions", "Test", "Unicode"] +git-tree-sha1 = "9cc5acd6b76174da7503d1de3a6f8cf639b6e5cb" +uuid = "b8f27783-ece8-5eb3-8dc8-9495eed66fee" +version = "1.29.0" + +[[deps.MatrixEquations]] +deps = ["LinearAlgebra", "LinearMaps"] +git-tree-sha1 = "f765b4eda3ea9be8e644b9127809ca5151f3d9ea" +uuid = "99c1a7ee-ab34-5fd5-8076-27c950a045f4" +version = "2.4.2" + +[[deps.MatrixPencils]] +deps = ["LinearAlgebra", "Polynomials", "Random"] +git-tree-sha1 = "c00a086f4f1df792c77dc1bd674357044aa08d74" +uuid = "48965c70-4690-11ea-1f13-43a2532b2fa8" +version = "1.8.0" + +[[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.2+1" + +[[deps.Measures]] +git-tree-sha1 = "c13304c81eec1ed3af7fc20e75fb6b26092a1102" +uuid = "442fdcdd-2543-5da2-b0f3-8c86c306513e" +version = "0.3.2" + +[[deps.Missings]] +deps = ["DataAPI"] +git-tree-sha1 = "ec4f7fbeab05d7747bdf98eb74d130a2a2ed298d" +uuid = "e1d29d7a-bbdc-5cf2-9ac0-f12de2c33e28" +version = "1.2.0" + +[[deps.Mmap]] +uuid = "a63ad114-7e13-5084-954f-fe012c677804" + +[[deps.MozillaCACerts_jll]] +uuid = "14a3606d-f60d-562e-9121-12d972cd8159" +version = "2023.1.10" + +[[deps.MutableArithmetics]] +deps = ["LinearAlgebra", "SparseArrays", "Test"] +git-tree-sha1 = "a3589efe0005fc4718775d8641b2de9060d23f73" +uuid = "d8a4904e-b15c-11e9-3269-09a3773c0cb0" +version = "1.4.4" + +[[deps.NaNMath]] +deps = ["OpenLibm_jll"] +git-tree-sha1 = "0877504529a3e5c3343c6f8b4c0381e57e4387e4" +uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" +version = "1.0.2" + +[[deps.NetworkOptions]] +uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" +version = "1.2.0" + +[[deps.Ogg_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "887579a3eb005446d514ab7aeac5d1d027658b8f" +uuid = "e7412a2a-1a6e-54c0-be00-318e2571c051" +version = "1.3.5+1" + +[[deps.OpenBLAS_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] +uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" +version = "0.3.23+4" + +[[deps.OpenLibm_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "05823500-19ac-5b8b-9628-191a04bc5112" +version = "0.8.1+2" + +[[deps.OpenSSL]] +deps = ["BitFlags", "Dates", "MozillaCACerts_jll", "OpenSSL_jll", "Sockets"] +git-tree-sha1 = "38cb508d080d21dc1128f7fb04f20387ed4c0af4" +uuid = "4d8831e6-92b7-49fb-bdf8-b643e874388c" +version = "1.4.3" + +[[deps.OpenSSL_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "3da7367955dcc5c54c1ba4d402ccdc09a1a3e046" +uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95" +version = "3.0.13+1" + +[[deps.OpenSpecFun_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "13652491f6856acfd2db29360e1bbcd4565d04f1" +uuid = "efe28fd5-8261-553b-a9e1-b2916fc3738e" +version = "0.5.5+0" + +[[deps.Opus_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "51a08fb14ec28da2ec7a927c4337e4332c2a4720" +uuid = "91d4177d-7536-5919-b921-800302f37372" +version = "1.3.2+0" + +[[deps.OrderedCollections]] +git-tree-sha1 = "dfdf5519f235516220579f949664f1bf44e741c5" +uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" +version = "1.6.3" + +[[deps.PCRE2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "efcefdf7-47ab-520b-bdef-62a2eaa19f15" +version = "10.42.0+1" + +[[deps.Parsers]] +deps = ["Dates", "PrecompileTools", "UUIDs"] +git-tree-sha1 = "8489905bcdbcfac64d1daa51ca07c0d8f0283821" +uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" +version = "2.8.1" + +[[deps.Pipe]] +git-tree-sha1 = "6842804e7867b115ca9de748a0cf6b364523c16d" +uuid = "b98c9c47-44ae-5843-9183-064241ee97a0" +version = "1.3.0" + +[[deps.Pixman_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LLVMOpenMP_jll", "Libdl"] +git-tree-sha1 = "64779bc4c9784fee475689a1752ef4d5747c5e87" +uuid = "30392449-352a-5448-841d-b1acce4e97dc" +version = "0.42.2+0" + +[[deps.Pkg]] +deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] +uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" +version = "1.10.0" + +[[deps.PlotThemes]] +deps = ["PlotUtils", "Statistics"] +git-tree-sha1 = "1f03a2d339f42dca4a4da149c7e15e9b896ad899" +uuid = "ccf2f8ad-2431-5c83-bf29-c5338b663b6a" +version = "3.1.0" + +[[deps.PlotUtils]] +deps = ["ColorSchemes", "Colors", "Dates", "PrecompileTools", "Printf", "Random", "Reexport", "Statistics"] +git-tree-sha1 = "7b1a9df27f072ac4c9c7cbe5efb198489258d1f5" +uuid = "995b91a9-d308-5afd-9ec6-746e21dbc043" +version = "1.4.1" + +[[deps.Plots]] +deps = ["Base64", "Contour", "Dates", "Downloads", "FFMPEG", "FixedPointNumbers", "GR", "JLFzf", "JSON", "LaTeXStrings", "Latexify", "LinearAlgebra", "Measures", "NaNMath", "Pkg", "PlotThemes", "PlotUtils", "PrecompileTools", "Printf", "REPL", "Random", "RecipesBase", "RecipesPipeline", "Reexport", "RelocatableFolders", "Requires", "Scratch", "Showoff", "SparseArrays", "Statistics", "StatsBase", "UUIDs", "UnicodeFun", "UnitfulLatexify", "Unzip"] +git-tree-sha1 = "442e1e7ac27dd5ff8825c3fa62fbd1e86397974b" +uuid = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" +version = "1.40.4" + + [deps.Plots.extensions] + FileIOExt = "FileIO" + GeometryBasicsExt = "GeometryBasics" + IJuliaExt = "IJulia" + ImageInTerminalExt = "ImageInTerminal" + UnitfulExt = "Unitful" + + [deps.Plots.weakdeps] + FileIO = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" + GeometryBasics = "5c1252a2-5f33-56bf-86c9-59e7332b4326" + IJulia = "7073ff75-c697-5162-941a-fcdaad2a7d2a" + ImageInTerminal = "d8c32880-2388-543b-8c61-d9f865259254" + Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" + +[[deps.Polyester]] +deps = ["ArrayInterface", "BitTwiddlingConvenienceFunctions", "CPUSummary", "IfElse", "ManualMemory", "PolyesterWeave", "Requires", "Static", "StaticArrayInterface", "StrideArraysCore", "ThreadingUtilities"] +git-tree-sha1 = "2ba5f33cbb51a85ef58a850749492b08f9bf2193" +uuid = "f517fe37-dbe3-4b94-8317-1923a5111588" +version = "0.7.13" + +[[deps.PolyesterWeave]] +deps = ["BitTwiddlingConvenienceFunctions", "CPUSummary", "IfElse", "Static", "ThreadingUtilities"] +git-tree-sha1 = "240d7170f5ffdb285f9427b92333c3463bf65bf6" +uuid = "1d0040c9-8b98-4ee7-8388-3f51789ca0ad" +version = "0.2.1" + +[[deps.Polynomials]] +deps = ["LinearAlgebra", "RecipesBase", "Setfield", "SparseArrays"] +git-tree-sha1 = "89620a0b5458dca4bf9ea96174fa6422b3adf6f9" +uuid = "f27b6e38-b328-58d1-80ce-0feddd5e7a45" +version = "4.0.8" + + [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.PrecompileTools]] +deps = ["Preferences"] +git-tree-sha1 = "5aa36f7049a63a1528fe8f7c3f2113413ffd4e1f" +uuid = "aea7be01-6a6a-4083-8856-8a6e6704d82a" +version = "1.2.1" + +[[deps.Preferences]] +deps = ["TOML"] +git-tree-sha1 = "9306f6085165d270f7e3db02af26a400d580f5c6" +uuid = "21216c6a-2e73-6563-6e65-726566657250" +version = "1.4.3" + +[[deps.Printf]] +deps = ["Unicode"] +uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" + +[[deps.Profile]] +deps = ["Printf"] +uuid = "9abbd945-dff8-562f-b5e8-e1ebf5ef1b79" + +[[deps.Qt6Base_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Fontconfig_jll", "Glib_jll", "JLLWrappers", "Libdl", "Libglvnd_jll", "OpenSSL_jll", "Vulkan_Loader_jll", "Xorg_libSM_jll", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Xorg_libxcb_jll", "Xorg_xcb_util_cursor_jll", "Xorg_xcb_util_image_jll", "Xorg_xcb_util_keysyms_jll", "Xorg_xcb_util_renderutil_jll", "Xorg_xcb_util_wm_jll", "Zlib_jll", "libinput_jll", "xkbcommon_jll"] +git-tree-sha1 = "37b7bb7aabf9a085e0044307e1717436117f2b3b" +uuid = "c0090381-4147-56d7-9ebc-da0b1113ec56" +version = "6.5.3+1" + +[[deps.REPL]] +deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] +uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" + +[[deps.Random]] +deps = ["SHA"] +uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" + +[[deps.RecipesBase]] +deps = ["PrecompileTools"] +git-tree-sha1 = "5c3d09cc4f31f5fc6af001c250bf1278733100ff" +uuid = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" +version = "1.3.4" + +[[deps.RecipesPipeline]] +deps = ["Dates", "NaNMath", "PlotUtils", "PrecompileTools", "RecipesBase"] +git-tree-sha1 = "45cf9fd0ca5839d06ef333c8201714e888486342" +uuid = "01d81517-befc-4cb6-b9ec-a95719d0359c" +version = "0.6.12" + +[[deps.Reexport]] +git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" +uuid = "189a3867-3050-52da-a836-e630ba90ab69" +version = "1.2.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.Requires]] +deps = ["UUIDs"] +git-tree-sha1 = "838a3a4188e2ded87a4f9f184b4b0d78a1e91cb7" +uuid = "ae029012-a4dd-5104-9daa-d747884805df" +version = "1.3.0" + +[[deps.SHA]] +uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" +version = "0.7.0" + +[[deps.SIMDTypes]] +git-tree-sha1 = "330289636fb8107c5f32088d2741e9fd7a061a5c" +uuid = "94e857df-77ce-4151-89e5-788b33177be4" +version = "0.1.0" + +[[deps.Scratch]] +deps = ["Dates"] +git-tree-sha1 = "3bac05bc7e74a75fd9cba4295cde4045d9fe2386" +uuid = "6c6a2e73-6563-6170-7368-637461726353" +version = "1.2.1" + +[[deps.Serialization]] +uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" + +[[deps.Setfield]] +deps = ["ConstructionBase", "Future", "MacroTools", "StaticArraysCore"] +git-tree-sha1 = "e2cc6d8c88613c05e1defb55170bf5ff211fbeac" +uuid = "efcf1570-3423-57d1-acb7-fd33fddbac46" +version = "1.1.1" + +[[deps.Showoff]] +deps = ["Dates", "Grisu"] +git-tree-sha1 = "91eddf657aca81df9ae6ceb20b959ae5653ad1de" +uuid = "992d4aef-0814-514b-bc4d-f2e9a6c4116f" +version = "1.0.3" + +[[deps.SimpleBufferStream]] +git-tree-sha1 = "874e8867b33a00e784c8a7e4b60afe9e037b74e1" +uuid = "777ac1f9-54b0-4bf8-805c-2214025038e7" +version = "1.1.0" + +[[deps.Sockets]] +uuid = "6462fe0b-24de-5631-8697-dd941f90decc" + +[[deps.SortingAlgorithms]] +deps = ["DataStructures"] +git-tree-sha1 = "66e0a8e672a0bdfca2c3f5937efb8538b9ddc085" +uuid = "a2af1166-a08f-5f64-846c-94a0d3cef48c" +version = "1.2.1" + +[[deps.SparseArrays]] +deps = ["Libdl", "LinearAlgebra", "Random", "Serialization", "SuiteSparse_jll"] +uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" +version = "1.10.0" + +[[deps.SpecialFunctions]] +deps = ["IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"] +git-tree-sha1 = "e2cfc4012a19088254b3950b85c3c1d8882d864d" +uuid = "276daf66-3868-5448-9aa4-cd146d93841b" +version = "2.3.1" + + [deps.SpecialFunctions.extensions] + SpecialFunctionsChainRulesCoreExt = "ChainRulesCore" + + [deps.SpecialFunctions.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + +[[deps.Static]] +deps = ["IfElse"] +git-tree-sha1 = "d2fdac9ff3906e27f7a618d47b676941baa6c80c" +uuid = "aedffcd0-7271-4cad-89d0-dc628f76c6d3" +version = "0.8.10" + +[[deps.StaticArrayInterface]] +deps = ["ArrayInterface", "Compat", "IfElse", "LinearAlgebra", "PrecompileTools", "Requires", "SparseArrays", "Static", "SuiteSparse"] +git-tree-sha1 = "5d66818a39bb04bf328e92bc933ec5b4ee88e436" +uuid = "0d7ed370-da01-4f52-bd93-41d350b8b718" +version = "1.5.0" + + [deps.StaticArrayInterface.extensions] + StaticArrayInterfaceOffsetArraysExt = "OffsetArrays" + StaticArrayInterfaceStaticArraysExt = "StaticArrays" + + [deps.StaticArrayInterface.weakdeps] + OffsetArrays = "6fe1bfb0-de20-5000-8ca7-80f57d26f881" + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + +[[deps.StaticArraysCore]] +git-tree-sha1 = "36b3d696ce6366023a0ea192b4cd442268995a0d" +uuid = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" +version = "1.4.2" + +[[deps.Statistics]] +deps = ["LinearAlgebra", "SparseArrays"] +uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" +version = "1.10.0" + +[[deps.StatsAPI]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "1ff449ad350c9c4cbc756624d6f8a8c3ef56d3ed" +uuid = "82ae8749-77ed-4fe6-ae5f-f523153014b0" +version = "1.7.0" + +[[deps.StatsBase]] +deps = ["DataAPI", "DataStructures", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"] +git-tree-sha1 = "5cf7606d6cef84b543b483848d4ae08ad9832b21" +uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" +version = "0.34.3" + +[[deps.StrideArraysCore]] +deps = ["ArrayInterface", "CloseOpenIntervals", "IfElse", "LayoutPointers", "LinearAlgebra", "ManualMemory", "SIMDTypes", "Static", "StaticArrayInterface", "ThreadingUtilities"] +git-tree-sha1 = "25349bf8f63aa36acbff5e3550a86e9f5b0ef682" +uuid = "7792a7ef-975c-4747-a70f-980b88e8d1da" +version = "0.5.6" + +[[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.2.1+1" + +[[deps.TOML]] +deps = ["Dates"] +uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" +version = "1.0.3" + +[[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" + +[[deps.ThreadingUtilities]] +deps = ["ManualMemory"] +git-tree-sha1 = "eda08f7e9818eb53661b3deb74e3159460dfbc27" +uuid = "8290d209-cae3-49c0-8002-c8c24d57dab5" +version = "0.5.2" + +[[deps.TranscodingStreams]] +git-tree-sha1 = "5d54d076465da49d6746c647022f3b3674e64156" +uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa" +version = "0.10.8" +weakdeps = ["Random", "Test"] + + [deps.TranscodingStreams.extensions] + TestExt = ["Test", "Random"] + +[[deps.URIs]] +git-tree-sha1 = "67db6cc7b3821e19ebe75791a9dd19c9b1188f2b" +uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" +version = "1.5.1" + +[[deps.UUIDs]] +deps = ["Random", "SHA"] +uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" + +[[deps.Unicode]] +uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" + +[[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 = "3c793be6df9dd77a0cf49d80984ef9ff996948fa" +uuid = "1986cc42-f94f-5a68-af5c-568840ba703d" +version = "1.19.0" + + [deps.Unitful.extensions] + ConstructionBaseUnitfulExt = "ConstructionBase" + InverseFunctionsUnitfulExt = "InverseFunctions" + + [deps.Unitful.weakdeps] + ConstructionBase = "187b0558-2788-49d3-abe0-74a17ed4e7c9" + InverseFunctions = "3587e190-3f89-42d0-90ee-14403ec27112" + +[[deps.UnitfulLatexify]] +deps = ["LaTeXStrings", "Latexify", "Unitful"] +git-tree-sha1 = "e2d817cc500e960fdbafcf988ac8436ba3208bfd" +uuid = "45397f5d-5981-4c77-b2b3-fc36d6e9b728" +version = "1.6.3" + +[[deps.Unzip]] +git-tree-sha1 = "ca0969166a028236229f63514992fc073799bb78" +uuid = "41fe7b60-77ed-43a1-b4f0-825fd5a5650d" +version = "0.2.0" + +[[deps.Vulkan_Loader_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Wayland_jll", "Xorg_libX11_jll", "Xorg_libXrandr_jll", "xkbcommon_jll"] +git-tree-sha1 = "2f0486047a07670caad3a81a075d2e518acc5c59" +uuid = "a44049a8-05dd-5a78-86c9-5fde0876e88c" +version = "1.3.243+0" + +[[deps.Wayland_jll]] +deps = ["Artifacts", "EpollShim_jll", "Expat_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Pkg", "XML2_jll"] +git-tree-sha1 = "7558e29847e99bc3f04d6569e82d0f5c54460703" +uuid = "a2964d1f-97da-50d4-b82a-358c7fce9d89" +version = "1.21.0+1" + +[[deps.Wayland_protocols_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "93f43ab61b16ddfb2fd3bb13b3ce241cafb0e6c9" +uuid = "2381bf8a-dfd0-557d-9999-79630e7b1b91" +version = "1.31.0+0" + +[[deps.XML2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Zlib_jll"] +git-tree-sha1 = "532e22cf7be8462035d092ff21fada7527e2c488" +uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a" +version = "2.12.6+0" + +[[deps.XSLT_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgcrypt_jll", "Libgpg_error_jll", "Libiconv_jll", "Pkg", "XML2_jll", "Zlib_jll"] +git-tree-sha1 = "91844873c4085240b95e795f692c4cec4d805f8a" +uuid = "aed1982a-8fda-507f-9586-7b0439959a61" +version = "1.1.34+0" + +[[deps.XZ_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "ac88fb95ae6447c8dda6a5503f3bafd496ae8632" +uuid = "ffd25f8a-64ca-5728-b0f7-c24cf3aae800" +version = "5.4.6+0" + +[[deps.Xorg_libICE_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "326b4fea307b0b39892b3e85fa451692eda8d46c" +uuid = "f67eecfb-183a-506d-b269-f58e52b52d7c" +version = "1.1.1+0" + +[[deps.Xorg_libSM_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libICE_jll"] +git-tree-sha1 = "3796722887072218eabafb494a13c963209754ce" +uuid = "c834827a-8449-5923-a945-d239c165b7dd" +version = "1.2.4+0" + +[[deps.Xorg_libX11_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxcb_jll", "Xorg_xtrans_jll"] +git-tree-sha1 = "afead5aba5aa507ad5a3bf01f58f82c8d1403495" +uuid = "4f6342f7-b3d2-589e-9d20-edeb45f2b2bc" +version = "1.8.6+0" + +[[deps.Xorg_libXau_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "6035850dcc70518ca32f012e46015b9beeda49d8" +uuid = "0c0b7dd1-d40b-584c-a123-a41640f87eec" +version = "1.0.11+0" + +[[deps.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" + +[[deps.Xorg_libXdmcp_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "34d526d318358a859d7de23da945578e8e8727b7" +uuid = "a3789734-cfe1-5b06-b2d0-1dd0d9d62d05" +version = "1.1.4+0" + +[[deps.Xorg_libXext_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] +git-tree-sha1 = "d2d1a5c49fae4ba39983f63de6afcbea47194e85" +uuid = "1082639a-0dae-5f34-9b06-72781eeb8cb3" +version = "1.3.6+0" + +[[deps.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" + +[[deps.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" + +[[deps.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" + +[[deps.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" + +[[deps.Xorg_libXrender_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] +git-tree-sha1 = "47e45cd78224c53109495b3e324df0c37bb61fbe" +uuid = "ea2f1a96-1ddc-540d-b46f-429655e07cfa" +version = "0.9.11+0" + +[[deps.Xorg_libpthread_stubs_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "8fdda4c692503d44d04a0603d9ac0982054635f9" +uuid = "14d82f49-176c-5ed1-bb49-ad3f5cbd8c74" +version = "0.1.1+0" + +[[deps.Xorg_libxcb_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "XSLT_jll", "Xorg_libXau_jll", "Xorg_libXdmcp_jll", "Xorg_libpthread_stubs_jll"] +git-tree-sha1 = "b4bfde5d5b652e22b9c790ad00af08b6d042b97d" +uuid = "c7cfdc94-dc32-55de-ac96-5a1b8d977c5b" +version = "1.15.0+0" + +[[deps.Xorg_libxkbfile_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] +git-tree-sha1 = "730eeca102434283c50ccf7d1ecdadf521a765a4" +uuid = "cc61e674-0454-545c-8b26-ed2c68acab7a" +version = "1.1.2+0" + +[[deps.Xorg_xcb_util_cursor_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_xcb_util_image_jll", "Xorg_xcb_util_jll", "Xorg_xcb_util_renderutil_jll"] +git-tree-sha1 = "04341cb870f29dcd5e39055f895c39d016e18ccd" +uuid = "e920d4aa-a673-5f3a-b3d7-f755a4d47c43" +version = "0.1.4+0" + +[[deps.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" + +[[deps.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" + +[[deps.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" + +[[deps.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" + +[[deps.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" + +[[deps.Xorg_xkbcomp_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxkbfile_jll"] +git-tree-sha1 = "330f955bc41bb8f5270a369c473fc4a5a4e4d3cb" +uuid = "35661453-b289-5fab-8a00-3d9160c6a3a4" +version = "1.4.6+0" + +[[deps.Xorg_xkeyboard_config_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_xkbcomp_jll"] +git-tree-sha1 = "691634e5453ad362044e2ad653e79f3ee3bb98c3" +uuid = "33bec58e-1273-512f-9401-5d533626f822" +version = "2.39.0+0" + +[[deps.Xorg_xtrans_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "e92a1a012a10506618f10b7047e478403a046c77" +uuid = "c5fb5394-a638-5e4d-96e5-b29de1b5cf10" +version = "1.5.0+0" + +[[deps.Zlib_jll]] +deps = ["Libdl"] +uuid = "83775a58-1f1d-513f-b197-d71354ab007a" +version = "1.2.13+1" + +[[deps.Zstd_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "e678132f07ddb5bfa46857f0d7620fb9be675d3b" +uuid = "3161d3a3-bdf6-5164-811a-617609db77b4" +version = "1.5.6+0" + +[[deps.eudev_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "gperf_jll"] +git-tree-sha1 = "431b678a28ebb559d224c0b6b6d01afce87c51ba" +uuid = "35ca27e7-8b34-5b7f-bca9-bdc33f59eb06" +version = "3.2.9+0" + +[[deps.fzf_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "a68c9655fbe6dfcab3d972808f1aafec151ce3f8" +uuid = "214eeab7-80f7-51ab-84ad-2988db7cef09" +version = "0.43.0+0" + +[[deps.gperf_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "3516a5630f741c9eecb3720b1ec9d8edc3ecc033" +uuid = "1a1c6b14-54f6-533d-8383-74cd7377aa70" +version = "3.1.1+0" + +[[deps.libaom_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "3a2ea60308f0996d26f1e5354e10c24e9ef905d4" +uuid = "a4ae2306-e953-59d6-aa16-d00cac43593b" +version = "3.4.0+0" + +[[deps.libass_jll]] +deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] +git-tree-sha1 = "5982a94fcba20f02f42ace44b9894ee2b140fe47" +uuid = "0ac62f75-1d6f-5e53-bd7c-93b484bb37c0" +version = "0.15.1+0" + +[[deps.libblastrampoline_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" +version = "5.8.0+1" + +[[deps.libevdev_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "141fe65dc3efabb0b1d5ba74e91f6ad26f84cc22" +uuid = "2db6ffa8-e38f-5e21-84af-90c45d0032cc" +version = "1.11.0+0" + +[[deps.libfdk_aac_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "daacc84a041563f965be61859a36e17c4e4fcd55" +uuid = "f638f0a6-7fb0-5443-88ba-1cc74229b280" +version = "2.0.2+0" + +[[deps.libinput_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "eudev_jll", "libevdev_jll", "mtdev_jll"] +git-tree-sha1 = "ad50e5b90f222cfe78aa3d5183a20a12de1322ce" +uuid = "36db933b-70db-51c0-b978-0f229ee0e533" +version = "1.18.0+0" + +[[deps.libpng_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Zlib_jll"] +git-tree-sha1 = "d7015d2e18a5fd9a4f47de711837e980519781a4" +uuid = "b53b4c65-9356-5827-b1ea-8c7a1a84506f" +version = "1.6.43+1" + +[[deps.libvorbis_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Ogg_jll", "Pkg"] +git-tree-sha1 = "b910cb81ef3fe6e78bf6acee440bda86fd6ae00c" +uuid = "f27f6e37-5d2b-51aa-960f-b287f2bc3b7a" +version = "1.3.7+1" + +[[deps.mtdev_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "814e154bdb7be91d78b6802843f76b6ece642f11" +uuid = "009596ad-96f7-51b1-9f1b-5ce2d5e8a71e" +version = "1.1.6+0" + +[[deps.nghttp2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" +version = "1.52.0+1" + +[[deps.oneTBB_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "7d0ea0f4895ef2f5cb83645fa689e52cb55cf493" +uuid = "1317d2d5-d96f-522e-a858-c73665f53c3e" +version = "2021.12.0+0" + +[[deps.p7zip_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" +version = "17.4.0+2" + +[[deps.x264_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "4fea590b89e6ec504593146bf8b988b2c00922b2" +uuid = "1270edf5-f2f9-52d2-97e9-ab00b5d0237a" +version = "2021.5.5+0" + +[[deps.x265_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "ee567a171cce03570d77ad3a43e90218e38937a9" +uuid = "dfaa095f-4041-5dcd-9319-2fabd8486b76" +version = "3.5.0+0" + +[[deps.xkbcommon_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Wayland_jll", "Wayland_protocols_jll", "Xorg_libxcb_jll", "Xorg_xkeyboard_config_jll"] +git-tree-sha1 = "9c304562909ab2bab0262639bd4f444d7bc2be37" +uuid = "d8fb68d0-12a3-5cfd-a85a-d49703b185fd" +version = "1.4.1+1" diff --git a/docs/Project.toml b/docs/Project.toml index 4f16766f5..ef63dc804 100644 --- a/docs/Project.toml +++ b/docs/Project.toml @@ -11,4 +11,4 @@ Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" ControlSystemsBase = "1" Documenter = "1" LinearAlgebra = "1.6" -Logging = "1.6" \ No newline at end of file +Logging = "1.6" diff --git a/docs/make.jl b/docs/make.jl index 2c34291dc..cf099540c 100644 --- a/docs/make.jl +++ b/docs/make.jl @@ -35,6 +35,7 @@ makedocs( "State Estimators" => "public/state_estim.md", "Predictive Controllers" => "public/predictive_control.md", "Generic Functions" => "public/generic_func.md", + "Simulations and Plots" => "public/plot_sim.md", ], "Internals" => [ "Plant Models" => "internals/sim_model.md", diff --git a/docs/src/index.md b/docs/src/index.md index 3832b8f25..80c9e49dc 100644 --- a/docs/src/index.md +++ b/docs/src/index.md @@ -41,6 +41,7 @@ Pages = [ "public/state_estim.md", "public/predictive_control.md", "public/generic_func.md", + "public/plot_sim.md", ] ``` diff --git a/docs/src/manual/linmpc.md b/docs/src/manual/linmpc.md index 276edf210..84dc94c7c 100644 --- a/docs/src/manual/linmpc.md +++ b/docs/src/manual/linmpc.md @@ -149,7 +149,7 @@ function plot_data(t_data, u_data, y_data, ry_data) return plot(p1, p2, p3, layout=(3,1)) end plot_data(t_data, u_data, y_data, ry_data) -savefig(ans, "plot1_LinMPC.svg"); nothing # hide +savefig("plot1_LinMPC.svg"); nothing # hide ``` ![plot1_LinMPC](plot1_LinMPC.svg) @@ -172,7 +172,7 @@ u, y = model.uop, model() initstate!(mpc2, u, y) u_data, y_data, ry_data = test_mpc(mpc2, model) plot_data(t_data, u_data, y_data, ry_data) -savefig(ans, "plot2_LinMPC.svg"); nothing # hide +savefig("plot2_LinMPC.svg"); nothing # hide ``` ![plot2_LinMPC](plot2_LinMPC.svg) @@ -208,7 +208,7 @@ u, y, d = model.uop, model(), mpc_mhe.estim.model.dop initstate!(mpc_mhe, u, y, d) u_data, y_data, ry_data = test_mpc(mpc_mhe, model) plot_data(t_data, u_data, y_data, ry_data) -savefig(ans, "plot3_LinMPC.svg"); nothing # hide +savefig("plot3_LinMPC.svg"); nothing # hide ``` ![plot3_LinMPC](plot3_LinMPC.svg) @@ -280,7 +280,7 @@ u, y, d = model.uop, model(), mpc_d.estim.model.dop initstate!(mpc_d, u, y, d) u_data, y_data, ry_data = test_mpc_d(mpc_d, model) plot_data(t_data, u_data, y_data, ry_data) -savefig(ans, "plot4_LinMPC.svg"); nothing # hide +savefig("plot4_LinMPC.svg"); nothing # hide ``` ![plot4_LinMPC](plot4_LinMPC.svg) diff --git a/docs/src/manual/nonlinmpc.md b/docs/src/manual/nonlinmpc.md index 38d2fb1ea..a9215a72f 100644 --- a/docs/src/manual/nonlinmpc.md +++ b/docs/src/manual/nonlinmpc.md @@ -4,6 +4,11 @@ Pages = ["nonlinmpc.md"] ``` +```@setup 1 +using Logging; errlogger = ConsoleLogger(stderr, Error); +old_logger = global_logger(); global_logger(errlogger); +``` + ## Nonlinear Model In this example, the goal is to control the angular position ``θ`` of a pendulum @@ -70,7 +75,7 @@ u = [0.5] N = 35 res = sim!(model, N, u) plot(res, plotu=false) -savefig(ans, "plot1_NonLinMPC.svg"); nothing # hide +savefig("plot1_NonLinMPC.svg"); nothing # hide ``` ![plot1_NonLinMPC](plot1_NonLinMPC.svg) @@ -99,7 +104,7 @@ f_plant(x, u, _ ) = pendulum(par_plant, x, u) plant = setname!(NonLinModel(f_plant, h, Ts, nu, nx, ny); u=vu, x=vx, y=vy) res = sim!(estim, N, [0.5], plant=plant, y_noise=[0.5]) plot(res, plotu=false, plotxwithx̂=true) -savefig(ans, "plot2_NonLinMPC.svg"); nothing # hide +savefig("plot2_NonLinMPC.svg"); nothing # hide ``` ![plot2_NonLinMPC](plot2_NonLinMPC.svg) @@ -121,11 +126,10 @@ The option `Cwt=Inf` disables the slack variable `ϵ` for constraint softening. performance on `plant` by imposing an angular setpoint of 180° (inverted position): ```@example 1 -using Logging; disable_logging(Warn) # hide -using JuMP; unset_time_limit_sec(nmpc.optim) # hide +using JuMP; unset_time_limit_sec(nmpc.optim) # hide res_ry = sim!(nmpc, N, [180.0], plant=plant, x_0=[0, 0], x̂_0=[0, 0, 0]) plot(res_ry) -savefig(ans, "plot3_NonLinMPC.svg"); nothing # hide +savefig("plot3_NonLinMPC.svg"); nothing # hide ``` ![plot3_NonLinMPC](plot3_NonLinMPC.svg) @@ -137,7 +141,7 @@ satisfactory: ```@example 1 res_yd = sim!(nmpc, N, [180.0], plant=plant, x_0=[π, 0], x̂_0=[π, 0, 0], y_step=[10]) plot(res_yd) -savefig(ans, "plot4_NonLinMPC.svg"); nothing # hide +savefig("plot4_NonLinMPC.svg"); nothing # hide ``` ![plot4_NonLinMPC](plot4_NonLinMPC.svg) @@ -201,10 +205,10 @@ speed ``ω`` is not requested to track a setpoint. The closed-loop response to a setpoint is similar: ```@example 1 -unset_time_limit_sec(empc.optim) # hide +unset_time_limit_sec(empc.optim) # hide res2_ry = sim!(empc, N, [180, 0], plant=plant2, x_0=[0, 0], x̂_0=[0, 0, 0]) plot(res2_ry) -savefig(ans, "plot5_NonLinMPC.svg"); nothing # hide +savefig("plot5_NonLinMPC.svg"); nothing # hide ``` ![plot5_NonLinMPC](plot5_NonLinMPC.svg) @@ -224,7 +228,7 @@ Also, for a 10° step disturbance: ```@example 1 res2_yd = sim!(empc, N, [180; 0]; plant=plant2, x_0=[π, 0], x̂_0=[π, 0, 0], y_step=[10, 0]) plot(res2_yd) -savefig(ans, "plot6_NonLinMPC.svg"); nothing # hide +savefig("plot6_NonLinMPC.svg"); nothing # hide ``` ![plot6_NonLinMPC](plot6_NonLinMPC.svg) @@ -264,7 +268,7 @@ The linear controller has difficulties to reject the 10° step disturbance: ```@example 1 res_lin = sim!(mpc, N, [180.0]; plant, x_0=[π, 0], y_step=[10]) plot(res_lin) -savefig(ans, "plot7_NonLinMPC.svg"); nothing # hide +savefig("plot7_NonLinMPC.svg"); nothing # hide ``` ![plot7_NonLinMPC](plot7_NonLinMPC.svg) @@ -302,7 +306,7 @@ does improve the rejection of the step disturbance: ```@example 1 res_lin2 = sim!(mpc2, N, [180.0]; plant, x_0=[π, 0], y_step=[10]) plot(res_lin2) -savefig(ans, "plot8_NonLinMPC.svg"); nothing # hide +savefig("plot8_NonLinMPC.svg"); nothing # hide ``` ![plot8_NonLinMPC](plot8_NonLinMPC.svg) @@ -316,7 +320,7 @@ poor in the first quadrant: ```@example 1 res_lin3 = sim!(mpc2, N, [180.0]; plant, x_0=[0, 0]) plot(res_lin3) -savefig(ans, "plot9_NonLinMPC.svg"); nothing # hide +savefig("plot9_NonLinMPC.svg"); nothing # hide ``` ![plot9_NonLinMPC](plot9_NonLinMPC.svg) @@ -370,7 +374,7 @@ performances are similar to the nonlinear MPC, both for the 180° setpoint: ```@example 1 res_slin = test_slmpc(model, mpc3, [180], plant, x_0=[0, 0]) plot(res_slin) -savefig(ans, "plot10_NonLinMPC.svg"); nothing # hide +savefig("plot10_NonLinMPC.svg"); nothing # hide ``` ![plot10_NonLinMPC](plot10_NonLinMPC.svg) @@ -380,7 +384,7 @@ and the 10° step disturbance: ```@example 1 res_slin = test_slmpc(model, mpc3, [180], plant, x_0=[π, 0], y_step=[10]) plot(res_slin) -savefig(ans, "plot11_NonLinMPC.svg"); nothing # hide +savefig("plot11_NonLinMPC.svg"); nothing # hide ``` ![plot11_NonLinMPC](plot11_NonLinMPC.svg) @@ -388,3 +392,7 @@ savefig(ans, "plot11_NonLinMPC.svg"); nothing # hide The computations of the successive linearization MPC are about 125 times faster than the nonlinear MPC (0.00012 s per time steps versus 0.015 s per time steps, on average), an impressive gain for similar closed-loop performances! + +```@setup 1 +global_logger(old_logger); +``` diff --git a/docs/src/public/generic_func.md b/docs/src/public/generic_func.md index 6d1857f8c..9984d2022 100644 --- a/docs/src/public/generic_func.md +++ b/docs/src/public/generic_func.md @@ -43,20 +43,6 @@ setstate! setmodel! ``` -## Quick Simulation - -### Simulate - -```@docs -sim! -``` - -### Simulation Results - -```@docs -SimResult -``` - ## Get Additional Information ```@docs diff --git a/docs/src/public/plot_sim.md b/docs/src/public/plot_sim.md new file mode 100644 index 000000000..d77e3c415 --- /dev/null +++ b/docs/src/public/plot_sim.md @@ -0,0 +1,29 @@ +# Functions: Simulations and Plots + +```@contents +Pages = ["plot_sim.md"] +``` + +This page documents the functions for quick plotting of open- and closed-loop +simulations. They are generic to [`SimModel`](@ref), [`StateEstimator`](@ref) and +[`PredictiveController`](@ref) types. A [`SimResult`](@ref) instance must be created first +with its constructor or by calling [`sim!`](@ref). The results are then visualized with +`plot` function from [`Plots.jl`](https://github.com/JuliaPlots/Plots.jl). + +## Quick Simulations + +```@docs +sim! +``` + +## Simulation Results + +```@docs +SimResult +``` + +## Plotting Results + +```@docs +ModelPredictiveControl.plot +``` diff --git a/src/ModelPredictiveControl.jl b/src/ModelPredictiveControl.jl index 369d8a8e7..00941ba8f 100644 --- a/src/ModelPredictiveControl.jl +++ b/src/ModelPredictiveControl.jl @@ -5,6 +5,7 @@ using LinearAlgebra using Random: randn using RecipesBase +using ProgressLogging using ForwardDiff import ControlSystemsBase diff --git a/src/controller/explicitmpc.jl b/src/controller/explicitmpc.jl index 74ab42434..a1387bd39 100644 --- a/src/controller/explicitmpc.jl +++ b/src/controller/explicitmpc.jl @@ -238,4 +238,10 @@ function set_objective_hessian!(mpc::ExplicitMPC) H̃_chol = cholesky(mpc.H̃) mpc.H̃_chol.factors .= H̃_chol.factors return nothing -end \ No newline at end of file +end + +"Called by plots recipes for manipulated inputs constraints." +getUcon(mpc::ExplicitMPC, nu) = fill(-Inf, mpc.Hp*nu), fill(+Inf, mpc.Hp*nu) + +"Called by plots recipes for predicted output constraints." +getYcon(mpc::ExplicitMPC, ny) = fill(-Inf, mpc.Hp*ny), fill(+Inf, mpc.Hp*ny) \ No newline at end of file diff --git a/src/estimator/mhe/execute.jl b/src/estimator/mhe/execute.jl index c3ef5d26f..451c44496 100644 --- a/src/estimator/mhe/execute.jl +++ b/src/estimator/mhe/execute.jl @@ -561,4 +561,7 @@ function setmodel_estimator!( estim.Z̃[nϵ+1:nϵ+nx̂] .-= x̂op estim.x̂0arr_old .-= x̂op return nothing -end \ No newline at end of file +end + +"Called by plots recipes for the estimated states constraints." +getX̂con(estim::MovingHorizonEstimator, _ ) = estim.con.X̂0min+estim.X̂op, estim.con.X̂0max+estim.X̂op \ No newline at end of file diff --git a/src/plot_sim.jl b/src/plot_sim.jl index 12d833388..36d35f300 100644 --- a/src/plot_sim.jl +++ b/src/plot_sim.jl @@ -1,64 +1,73 @@ struct SimResult{NT<:Real, O<:Union{SimModel, StateEstimator, PredictiveController}} - obj::O # simulated instance - T_data ::Vector{NT} # time in seconds - Y_data ::Matrix{NT} # plant outputs (both measured and unmeasured) - Ry_data::Matrix{NT} # output setpoints - Ŷ_data ::Matrix{NT} # estimated outputs - U_data ::Matrix{NT} # manipulated inputs - Ud_data::Matrix{NT} # manipulated inputs including load disturbances - Ru_data::Matrix{NT} # manipulated input setpoints - D_data ::Matrix{NT} # measured disturbances - X_data ::Matrix{NT} # plant states - X̂_data ::Matrix{NT} # estimated states + obj::O # simulated instance + xname ::Vector{String} # plant state names + T_data ::Vector{NT} # time in seconds + Y_data ::Matrix{NT} # plant outputs (both measured and unmeasured) + Ry_data::Matrix{NT} # output setpoints + Ŷ_data ::Matrix{NT} # estimated outputs + U_data ::Matrix{NT} # manipulated inputs + Ud_data::Matrix{NT} # manipulated inputs including load disturbances + Ru_data::Matrix{NT} # manipulated input setpoints + D_data ::Matrix{NT} # measured disturbances + X_data ::Matrix{NT} # plant states + X̂_data ::Matrix{NT} # estimated states end """ - SimResult( - obj::Union{SimModel, StateEstimator, PredictiveController}, - U_data, - Y_data, - D_data = []; - X_data = nothing, - X̂_data = nothing, - Ry_data = nothing, - Ru_data = nothing, - Ŷ_data = nothing - ) + SimResult(obj::SimModel, U_data, Y_data, D_data=[]; ) + SimResult(obj::StateEstimator, U_data, Y_data, D_data=[]; ) + SimResult(obj::PredictiveController, U_data, Y_data, D_data=[]; ) Manually construct a `SimResult` to quickly plot `obj` simulations. Except for `obj`, all the arguments should be matrices of `N` columns, where `N` is the number of time steps. [`SimResult`](@ref) objects allow to quickly plot simulation results. -Simply call `plot` from [`Plots.jl`](https://github.com/JuliaPlots/Plots.jl) on them. +Simply call `plot` on them. + +# Arguments +!!! info + Keyword arguments in *`italic`* are non-Unicode alternatives. + +- `obj` : simulated [`SimModel`](@ref)/[`StateEstimator`](@ref)/[`PredictiveController`](@ref) +- `U_data` : manipulated inputs +- `Y_data` : plant outputs +- `D_data=[]` : measured disturbances +- `X_data=nothing` : plant states +- `X̂_data=nothing` or *`Xhat_data`* : estimated states +- `Ŷ_data=nothing` or *`Yhat_data`* : estimated outputs +- `Ry_data=nothing` : plant output setpoints +- `Ru_data=nothing` : manipulated input setpoints +- `plant=get_model(obj)` : simulated plant model, default to `obj` internal plant model # Examples -```julia-repl -julia> plant = LinModel(tf(1, [1, 1]), 1.0); N = 5; U_data = fill(1.0, 1, N); +```jldoctest +julia> model = LinModel(tf(1, [1, 1]), 1.0); N = 5; U_data = fill(1.0, 1, N); -julia> Y_data = reduce(hcat, (updatestate!(plant, U_data[:, i]); plant()) for i=1:N) +julia> Y_data = reduce(hcat, (updatestate!(model, U_data[:, i]); model()) for i=1:N) 1×5 Matrix{Float64}: 0.632121 0.864665 0.950213 0.981684 0.993262 -julia> res = SimResult(plant, U_data, Y_data) +julia> res = SimResult(model, U_data, Y_data) Simulation results of LinModel with 5 time steps. - -julia> using Plots; plot(res) - ``` """ function SimResult( obj::O, U_data, Y_data, - D_data = zeros(NT, 0, size(U_data, 2)); - X_data = nothing, - X̂_data = nothing, - Ry_data = nothing, - Ru_data = nothing, - Ŷ_data = nothing + D_data = zeros(NT, 0, size(U_data, 2)); + X_data = nothing, + Xhat_data = nothing, + Yhat_data = nothing, + Ry_data = nothing, + Ru_data = nothing, + X̂_data = Xhat_data, + Ŷ_data = Yhat_data, + plant = get_model(obj) ) where {NT<:Real, O<:Union{SimModel{NT}, StateEstimator{NT}, PredictiveController{NT}}} model = get_model(obj) - Ts, nu, ny, nx, nx̂ = model.Ts, model.nu, model.ny, model.nx, get_nx̂(obj) + Ts, nu, ny, nx̂ = model.Ts, model.nu, model.ny, get_nx̂(obj) + nx = plant.nx N = size(U_data, 2) T_data = collect(Ts*(0:N-1)) isnothing(X_data) && (X_data = fill(NaN, nx, N)) @@ -67,13 +76,16 @@ function SimResult( isnothing(Ru_data) && (Ru_data = fill(NaN, nu, N)) isnothing(Ŷ_data) && (Ŷ_data = fill(NaN, ny, N)) NU, NY, NX, NX̂ = size(U_data, 2), size(Y_data, 2), size(X_data, 2), size(X̂_data, 2) - NRy, NRu = size(Ry_data, 2), size(Ru_data, 2) - if !(NU == NY == NX == NX̂ == NRy == NRu) + NRy, NRu, NŶ = size(Ry_data, 2), size(Ru_data, 2), size(Ŷ_data, 2) + if !(NU == NY == NX == NX̂ == NRy == NRu == NŶ) throw(ArgumentError("All arguments must have the same number of columns (time steps)")) end size(Y_data, 2) == N || error("Y_data must be of size ($ny, $N)") - return SimResult{NT, O}(obj, T_data, Y_data, Ry_data, Ŷ_data, U_data, U_data, - Ru_data, D_data, X_data, X̂_data) + return SimResult{NT, O}( + obj, plant.xname, + T_data, Y_data, Ry_data, Ŷ_data, + U_data, U_data, Ru_data, D_data, X_data, X̂_data + ) end get_model(model::SimModel) = model @@ -99,18 +111,15 @@ Open-loop simulation of `plant` for `N` time steps, default to unit bump test on The manipulated inputs ``\mathbf{u}`` and measured disturbances ``\mathbf{d}`` are held constant at `u` and `d` values, respectively. The plant initial state ``\mathbf{x}(0)`` is specified by `x_0` keyword arguments. The function returns [`SimResult`](@ref) instances -that can be visualized by calling `plot` from [`Plots.jl`](https://github.com/JuliaPlots/Plots.jl) -on them (see Examples below). Note that the method mutates `plant` internal states. +that can be visualized by calling `plot` on them. Note that the method mutates `plant` +internal states. # Examples -```julia-repl +```jldoctest julia> plant = NonLinModel((x,u,d)->0.1x+u+d, (x,_)->2x, 10.0, 1, 1, 1, 1, solver=nothing); julia> res = sim!(plant, 15, [0], [0], x_0=[1]) Simulation results of NonLinModel with 15 time steps. - -julia> using Plots; plot(res, plotu=false, plotd=false, plotx=true) - ``` """ function sim!( @@ -126,7 +135,7 @@ function sim!( D_data = Matrix{NT}(undef, plant.nd, N) X_data = Matrix{NT}(undef, plant.nx, N) setstate!(plant, x_0) - for i=1:N + @progress name="$(typeof(plant).name.name) simulation" for i=1:N y = evaloutput(plant, d) Y_data[:, i] .= y U_data[:, i] .= u @@ -134,8 +143,11 @@ function sim!( X_data[:, i] .= plant.x0 .+ plant.xop updatestate!(plant, u, d) end - return SimResult(plant, T_data, Y_data, U_data, Y_data, - U_data, U_data, U_data, D_data, X_data, X_data) + return SimResult( + plant, plant.xname, + T_data, Y_data, U_data, Y_data, + U_data, U_data, U_data, D_data, X_data, X_data + ) end @doc raw""" @@ -175,16 +187,13 @@ vectors. The simulated sensor and process noises of `plant` are specified by `y_ - `lastu = plant.uop` : last plant input ``\mathbf{u}`` for ``\mathbf{x̂}`` initialization # Examples -```julia-repl +```jldoctest julia> model = LinModel(tf(3, [30, 1]), 0.5); julia> estim = KalmanFilter(model, σR=[0.5], σQ=[0.25], σQint_ym=[0.01], σPint_ym_0=[0.1]); julia> res = sim!(estim, 50, [0], y_noise=[0.5], x_noise=[0.25], x_0=[-10], x̂_0=[0, 0]) Simulation results of KalmanFilter with 50 time steps. - -julia> using Plots; plot(res, plotŷ=true, plotu=false, plotxwithx̂=true) - ``` """ function sim!( @@ -213,16 +222,13 @@ The output and manipulated input setpoints are held constant at `ry` and `ru`, r The keyword arguments are identical to [`sim!(::StateEstimator, ::Int)`](@ref). # Examples -```julia-repl +```jldoctest julia> model = LinModel([tf(3, [30, 1]); tf(2, [5, 1])], 4); julia> mpc = setconstraint!(LinMPC(model, Mwt=[0, 1], Nwt=[0.01], Hp=30), ymin=[0, -Inf]); julia> res = sim!(mpc, 25, [0, 0], y_noise=[0.1], y_step=[-10, 0]) Simulation results of LinMPC with 25 time steps. - -julia> using Plots; plot(res, plotry=true, plotŷ=true, plotymin=true, plotu=true) - ``` """ function sim!( @@ -274,7 +280,7 @@ function sim_closedloop!( lastd, lasty = d, evaloutput(plant, d) initstate!(est_mpc, lastu, lasty[estim.i_ym], lastd) isnothing(x̂_0) || setstate!(est_mpc, x̂_0) - for i=1:N + @progress name="$(typeof(est_mpc).name.name) simulation" for i=1:N d = lastd + d_step + d_noise.*randn(plant.nd) y = evaloutput(plant, d) + y_step + y_noise.*randn(plant.ny) ym = y[estim.i_ym] @@ -293,8 +299,11 @@ function sim_closedloop!( x[:] += x_noise.*randn(plant.nx) updatestate!(est_mpc, u, ym, d) end - res = SimResult(est_mpc, T_data, Y_data, U_Ry_data, Ŷ_data, - U_data, Ud_data, Ru_data, D_data, X_data, X̂_data) + res = SimResult( + est_mpc, plant.xname, + T_data, Y_data, U_Ry_data, Ŷ_data, + U_data, Ud_data, Ru_data, D_data, X_data, X̂_data + ) plant.x0 .= old_x0 return res end @@ -306,8 +315,34 @@ end "Keep manipulated input `u` unchanged for state estimator simulation." sim_getu!(::StateEstimator, u, _ , _ , _ ) = u -"Plots.jl recipe for `SimResult` objects constructed with `SimModel` objects." -@recipe function plot( + +# dummy plot methods to document recipes (both in ?-mode and web documentation) +plot(::Nothing, ::SimResult{<:Real, <:SimModel}) = nothing +plot(::Nothing, ::SimResult{<:Real, <:StateEstimator}) = nothing +plot(::Nothing, ::SimResult{<:Real, <:PredictiveController}) = nothing + +@doc raw""" + plot(res::SimResult{<:Real, <:SimModel}; ) + +Plot the simulation results of a [`SimModel`](@ref). + +# Arguments + +- `res::SimResult{<:Real, <:SimModel}` : simulation results to plot +- `plotu=true` : plot manipulated inputs ``\mathbf{u}`` +- `plotd=true` : plot measured disturbances ``\mathbf{d}`` if applicable +- `plotx=false` : plot plant states ``\mathbf{x}`` + +# Examples +```julia-repl +julia> res = sim!(LinModel(tf(2, [10, 1]), 2.0), 25); + +julia> plot(res, plotu=false); +``` +""" +plot(::Nothing, ::SimResult{<:Real, <:SimModel}) + +@recipe function plot_recipe( res::SimResult{<:Real, <:SimModel}; plotu = true, plotd = true, @@ -322,7 +357,7 @@ sim_getu!(::StateEstimator, u, _ , _ , _ ) = u uname = model.uname yname = model.yname dname = model.dname - xname = model.xname + xname = res.xname layout_mat = [(ny, 1)] plotu && (layout_mat = [layout_mat (nu, 1)]) (plotd && nd ≠ 0) && (layout_mat = [layout_mat (nd, 1)]) @@ -390,15 +425,50 @@ sim_getu!(::StateEstimator, u, _ , _ , _ ) = u end end -"Plots.jl recipe for `SimResult` objects constructed with `StateEstimator` objects." -@recipe function plot( +@doc raw""" + plot(res::SimResult{<:Real, <:StateEstimator}; ) + +Plot the simulation results of a [`StateEstimator`](@ref). + +# Arguments +!!! info + Keyword arguments in *`italic`* are non-Unicode alternatives. + +- `res::SimResult{<:Real, <:StateEstimator}` : simulation results to plot +- `plotŷ=true` or *`plotyhat`* : plot estimated outputs ``\mathbf{ŷ}`` +- `plotx̂=false` or *`plotxhat`* : plot estimated states ``\mathbf{x̂}`` +- `plotxwithx̂=false` or *`plotxwithxhat`* : plot plant states ``\mathbf{x}`` and estimated + states ``\mathbf{x̂}`` together +- `plotx̂min=true` or *`plotxhatmin`* : plot estimated state lower bounds ``\mathbf{x̂_{min}}`` + if applicable +- `plotx̂max=true` or *`plotxhatmax`* : plot estimated state upper bounds ``\mathbf{x̂_{max}}`` + if applicable +- `` of [`plot(::SimResult{<:Real, <:SimModel})`](@ref) + +# Examples +```julia-repl +julia> res = sim!(KalmanFilter(LinModel(tf(3, [2.0, 1]), 1.0)), 25, [0], y_step=[1]); + +julia> plot(res, plotu=false, plotŷ=true, plotxwithx̂=true); +``` +""" +plot(::Nothing, ::SimResult{<:Real, <:StateEstimator}) + +@recipe function plot_recipe( res::SimResult{<:Real, <:StateEstimator}; - plotŷ = true, + plotyhat = true, plotu = true, plotd = true, plotx = false, - plotx̂ = false, - plotxwithx̂ = false + plotxhat = false, + plotxwithxhat = false, + plotxhatmin = true, + plotxhatmax = true, + plotŷ = plotyhat, + plotx̂ = plotxhat, + plotxwithx̂ = plotxwithxhat, + plotx̂min = plotxhatmin, + plotx̂max = plotxhatmax ) t = res.T_data ny = size(res.Y_data, 1) @@ -406,17 +476,20 @@ end nd = size(res.D_data, 1) nx = size(res.X_data, 1) nx̂ = size(res.X̂_data, 1) - model = res.obj.model + estim = res.obj + model = estim.model uname = model.uname yname = model.yname dname = model.dname - xname = model.xname + x̂name = [model.xname; ["\$\\hat{x}_{$i}\$" for i in (nx+1):(nx̂)]] + xname = res.xname layout_mat = [(ny, 1)] plotu && (layout_mat = [layout_mat (nu, 1)]) (plotd && nd ≠ 0) && (layout_mat = [layout_mat (nd, 1)]) (plotx && !plotxwithx̂) && (layout_mat = [layout_mat (nx, 1)]) (plotx̂ || plotxwithx̂) && (layout_mat = [layout_mat (nx̂, 1)]) layout := layout_mat + X̂min, X̂max = getX̂con(estim, nx̂) # --- outputs y --- subplot_base = 0 for i in 1:ny @@ -493,10 +566,10 @@ end # --- estimated states x̂ --- if plotx̂ || plotxwithx̂ for i in 1:nx̂ + withPlantState = plotxwithx̂ && i ≤ nx @series begin i == nx̂ && (xguide --> "Time (s)") - withPlantState = plotxwithx̂ && i ≤ nx - yguide --> (withPlantState ? xname[i] : "\$\\hat{x}_{$i}\$") + yguide --> (withPlantState ? xname[i] : x̂name[i]) color --> 2 subplot --> subplot_base + i linestyle --> :dashdot @@ -505,25 +578,88 @@ end legend --> (withPlantState ? true : false) t, res.X̂_data[i, :] end + if plotx̂min && !isinf(X̂min[end-2*nx̂+i]) + @series begin + i == nx̂ && (xguide --> "Time (s)") + yguide --> (withPlantState ? xname[i] : x̂name[i]) + color --> 3 + subplot --> subplot_base + i + linestyle --> :dot + linewidth --> 1.5 + label --> "\$\\mathbf{\\hat{x}_{min}}\$" + legend --> true + t, fill(X̂min[end-2*nx̂+i], length(t)) + end + end + if plotx̂max && !isinf(X̂max[end-2*nx̂+i]) + @series begin + i == nx̂ && (xguide --> "Time (s)") + yguide --> (withPlantState ? xname[i] : x̂name[i]) + color --> 4 + subplot --> subplot_base + i + linestyle --> :dot + linewidth --> 1.5 + label --> "\$\\mathbf{\\hat{x}_{max}}\$" + legend --> true + t, fill(X̂max[end-2*nx̂+i], length(t)) + end + end end end end -"Plots.jl recipe for `SimResult` objects constructed with `PredictiveController` objects." -@recipe function plot( +@doc raw""" + plot(res::SimResult{<:Real, <:PredictiveController}; ) + +Plot the simulation results of a [`PredictiveController`](@ref). + +# Arguments +!!! info + Keyword arguments in *`italic`* are non-Unicode alternatives. + +- `res::SimResult{<:Real, <:PredictiveController}` : simulation results to plot +- `plotry=true` : plot plant output setpoints ``\mathbf{r_y}`` if applicable +- `plotymin=true` : plot predicted output lower bounds ``\mathbf{y_{min}}`` if applicable +- `plotymax=true` : plot predicted output upper bounds ``\mathbf{y_{max}}`` if applicable +- `plotru=true` : plot manipulated input setpoints ``\mathbf{r_u}`` if applicable +- `plotumin=true` : plot manipulated input lower bounds ``\mathbf{u_{min}}`` if applicable +- `plotumax=true` : plot manipulated input upper bounds ``\mathbf{u_{max}}`` if applicable +- `` of [`plot(::SimResult{<:Real, <:SimModel})`](@ref) +- `` of [`plot(::SimResult{<:Real, <:StateEstimator})`](@ref) + +# Examples +```julia-repl +julia> model = LinModel(tf(2, [5.0, 1]), 1.0); + +julia> res = sim!(setconstraint!(LinMPC(model), umax=[1.0]), 30, [0], u_step=[-1]); + +julia> plot(res, plotŷ=true, plotry=true, plotumax=true); +``` + +""" +plot(::Nothing, ::SimResult{<:Real, <:PredictiveController}) + +@recipe function plot_recipe( res::SimResult{<:Real, <:PredictiveController}; - plotry = true, - plotymin = true, - plotymax = true, - plotŷ = false, - plotu = true, - plotru = true, - plotumin = true, - plotumax = true, - plotd = true, - plotx = false, - plotx̂ = false, - plotxwithx̂ = false + plotry = true, + plotymin = true, + plotymax = true, + plotyhat = false, + plotu = true, + plotru = true, + plotumin = true, + plotumax = true, + plotd = true, + plotx = false, + plotxhat = false, + plotxwithxhat = false, + plotxhatmin = true, + plotxhatmax = true, + plotŷ = plotyhat, + plotx̂ = plotxhat, + plotxwithx̂ = plotxwithxhat, + plotx̂min = plotxhatmin, + plotx̂max = plotxhatmax ) mpc = res.obj t = res.T_data @@ -536,7 +672,8 @@ end uname = model.uname yname = model.yname dname = model.dname - xname = model.xname + x̂name = [model.xname; ["\$\\hat{x}_{$i}\$" for i in (nx+1):(nx̂)]] + xname = res.xname layout_mat = [(ny, 1)] plotu && (layout_mat = [layout_mat (nu, 1)]) (plotd && nd ≠ 0) && (layout_mat = [layout_mat (nd, 1)]) @@ -546,6 +683,7 @@ end # --- constraints --- Umin, Umax = getUcon(mpc, nu) Ymin, Ymax = getYcon(mpc, ny) + X̂min, X̂max = getX̂con(mpc.estim, nx̂) # --- outputs y --- subplot_base = 0 for i in 1:ny @@ -700,24 +838,48 @@ end # --- estimated states x̂ --- if plotx̂ || plotxwithx̂ for i in 1:nx̂ + withPlantState = plotxwithx̂ && i ≤ nx @series begin i == nx̂ && (xguide --> "Time (s)") - withPlantState = plotxwithx̂ && i ≤ nx - yguide --> (withPlantState ? xname[i] : "\$\\hat{x}_{$i}\$") + yguide --> (withPlantState ? xname[i] : x̂name[i]) color --> 2 subplot --> subplot_base + i - linestyle --> :dashdot - linewidth --> 0.75 + linestyle --> :dashdot + linewidth --> 0.75 label --> "\$\\mathbf{\\hat{x}}\$" legend --> (withPlantState ? true : false) t, res.X̂_data[i, :] end + if plotx̂min && !isinf(X̂min[end-2*nx̂+i]) + @series begin + i == nx̂ && (xguide --> "Time (s)") + yguide --> (withPlantState ? xname[i] : x̂name[i]) + color --> 3 + subplot --> subplot_base + i + linestyle --> :dot + linewidth --> 1.5 + label --> "\$\\mathbf{\\hat{x}_{min}}\$" + legend --> true + t, fill(X̂min[end-2*nx̂+i], length(t)) + end + end + if plotx̂max && !isinf(X̂max[end-2*nx̂+i]) + @series begin + i == nx̂ && (xguide --> "Time (s)") + yguide --> (withPlantState ? xname[i] : x̂name[i]) + color --> 4 + subplot --> subplot_base + i + linestyle --> :dot + linewidth --> 1.5 + label --> "\$\\mathbf{\\hat{x}_{max}}\$" + legend --> true + t, fill(X̂max[end-2*nx̂+i], length(t)) + end + end end end end getUcon(mpc::PredictiveController, _ ) = mpc.con.U0min+mpc.Uop, mpc.con.U0max+mpc.Uop -getUcon(mpc::ExplicitMPC, nu) = fill(-Inf, mpc.Hp*nu), fill(+Inf, mpc.Hp*nu) - getYcon(mpc::PredictiveController, _ ) = mpc.con.Y0min+mpc.Yop, mpc.con.Y0max+mpc.Yop -getYcon(mpc::ExplicitMPC, ny) = fill(-Inf, mpc.Hp*ny), fill(+Inf, mpc.Hp*ny) \ No newline at end of file +getX̂con(estim::StateEstimator, nx̂) = fill(-Inf, 2nx̂), fill(+Inf, 2nx̂) diff --git a/test/test_plot_sim.jl b/test/test_plot_sim.jl index c623c3cf3..eecb3de8b 100644 --- a/test/test_plot_sim.jl +++ b/test/test_plot_sim.jl @@ -1,6 +1,6 @@ Ts = 400.0 -sys = [ tf(1.90,[18.0,1]) tf(1.90,[18.0,1]) tf(1.90,[18.0,1]); - tf(-0.74,[8.0,1]) tf(0.74,[8.0,1]) tf(-0.74,[8.0,1]) ] +sys = [ tf(1.90,[1800.0,1]) tf(1.90,[1800.0,1]) tf(1.90,[1800.0,1]); + tf(-0.74,[800.0,1]) tf(0.74,[800.0,1]) tf(-0.74,[800.0,1]) ] @testset "SimModel quick simulation" begin model = LinModel(sys, Ts, i_d=[3]) @@ -60,7 +60,9 @@ end end @testset "StateEstimator Plots" begin - estim = SteadyKalmanFilter(LinModel(sys, Ts, i_d=[3])) + estim = MovingHorizonEstimator(LinModel(sys, Ts, i_d=[3]), He=5) + estim = setconstraint!(estim, x̂min=[-100,-101,-102,-103,-Inf,-Inf]) + estim = setconstraint!(estim, x̂max=[+100,+101,+102,+103,+Inf,+Inf]) res = sim!(estim, 15, [1, 3], [-10]) p1 = plot(res, plotx=true) @test p1[1][1][:x] ≈ res.T_data @@ -68,7 +70,7 @@ end @test p1[end-2][1][:y] ≈ res.X_data[2,:] @test p1[end-1][1][:y] ≈ res.X_data[3,:] @test p1[end-0][1][:y] ≈ res.X_data[4,:] - p2 = plot(res, plotx̂=true) + p2 = plot(res, plotx̂=true, plotx̂min=false, plotx̂max=false) @test p2[1][1][:x] ≈ res.T_data @test p2[end-5][1][:y] ≈ res.X̂_data[1,:] @test p2[end-4][1][:y] ≈ res.X̂_data[2,:] @@ -76,7 +78,7 @@ end @test p2[end-2][1][:y] ≈ res.X̂_data[4,:] @test p2[end-1][1][:y] ≈ res.X̂_data[5,:] @test p2[end-0][1][:y] ≈ res.X̂_data[6,:] - p3 = plot(res, plotxwithx̂=true) + p3 = plot(res, plotxwithx̂=true, plotx̂min=false, plotx̂max=false) @test p3[1][1][:x] ≈ res.T_data @test p3[end-5][1][:y] ≈ res.X_data[1,:] @test p3[end-5][2][:y] ≈ res.X̂_data[1,:] @@ -88,6 +90,18 @@ end @test p3[end-2][2][:y] ≈ res.X̂_data[4,:] @test p3[end-1][1][:y] ≈ res.X̂_data[5,:] @test p3[end-0][1][:y] ≈ res.X̂_data[6,:] + p4 = plot(res, plotx̂=true, plotx̂min=true, plotx̂max=false) + @test p4[1][1][:x] ≈ res.T_data + @test all(p4[end-5][2][:y] .≈ -100) + @test all(p4[end-4][2][:y] .≈ -101) + @test all(p4[end-3][2][:y] .≈ -102) + @test all(p4[end-2][2][:y] .≈ -103) + p5 = plot(res, plotx̂=true, plotx̂min=false, plotx̂max=true) + @test p5[1][1][:x] ≈ res.T_data + @test all(p5[end-5][2][:y] .≈ +100) + @test all(p5[end-4][2][:y] .≈ +101) + @test all(p5[end-3][2][:y] .≈ +102) + @test all(p5[end-2][2][:y] .≈ +103) end @testset "PredictiveController quick simulation" begin diff --git a/test/test_state_estim.jl b/test/test_state_estim.jl index 6e79f8ea6..432939cef 100644 --- a/test/test_state_estim.jl +++ b/test/test_state_estim.jl @@ -924,6 +924,36 @@ end @test info[:V̂] ≈ [-1,-1] atol=5e-2 end +@testset "MovingHorizonEstimator v.s. Kalman filters" begin + linmodel1 = setop!(LinModel(sys,Ts,i_d=[3]), uop=[10,50], yop=[50,30], dop=[20]) + mhe = MovingHorizonEstimator(linmodel1, He=3, nint_ym=0) + kf = KalmanFilter(linmodel1, nint_ym=0) + X̂0_mhe = zeros(4, 6) + X̂0_kf = zeros(4, 6) + for i in 1:6 + X̂0_mhe[:,i] = mhe.x̂0 + X̂0_kf[:,i] = kf.x̂0 + updatestate!(mhe, [11, 50], [50, 31], [25]) + updatestate!(kf, [11, 50], [50, 31], [25]) + end + @test X̂0_mhe ≈ X̂0_kf atol=1e-3 + f = (x,u,d) -> linmodel1.A*x + linmodel1.Bu*u + linmodel1.Bd*d + h = (x,d) -> linmodel1.C*x + linmodel1.Dd*d + nonlinmodel = NonLinModel(f, h, Ts, 2, 4, 2, 1, solver=nothing) + nonlinmodel = setop!(nonlinmodel, uop=[10,50], yop=[50,30], dop=[20]) + mhe = MovingHorizonEstimator(nonlinmodel, He=5, nint_ym=0) + ukf = UnscentedKalmanFilter(nonlinmodel, nint_ym=0) + X̂0_mhe = zeros(4, 6) + X̂0_ukf = zeros(4, 6) + for i in 1:6 + X̂0_mhe[:,i] = mhe.x̂0 + X̂0_ukf[:,i] = ukf.x̂0 + updatestate!(mhe, [11, 50], [50, 31], [25]) + updatestate!(ukf, [11, 50], [50, 31], [25]) + end + @test X̂0_mhe ≈ X̂0_ukf atol=1e-3 +end + @testset "MovingHorizonEstimator set model" begin linmodel = LinModel(ss(0.5, 0.3, 1.0, 0, 10.0)) linmodel = setop!(linmodel, uop=[2.0], yop=[50.0], xop=[3.0], fop=[3.0])