diff --git a/Manifest.toml b/Manifest.toml
index 14d4bc87..55db52b0 100644
--- a/Manifest.toml
+++ b/Manifest.toml
@@ -4,6 +4,11 @@ julia_version = "1.8.5"
manifest_format = "2.0"
project_hash = "fbf69595a65087194326489e6a6a6f3da6dc4ad8"
+[[deps.ADTypes]]
+git-tree-sha1 = "e58c18d2312749847a74f5be80bb0fa53da102bd"
+uuid = "47edcb42-4c32-4615-8424-f2b9edc5f35b"
+version = "0.1.5"
+
[[deps.ANSIColoredPrinters]]
git-tree-sha1 = "574baf8110975760d391c710b6341da1afa48d8c"
uuid = "a4c015fc-c6ff-483c-b24f-f7ea428134e9"
@@ -16,10 +21,10 @@ uuid = "ae81ac8f-d209-56e5-92de-9978fef736f9"
version = "0.1.3+0"
[[deps.AbstractAlgebra]]
-deps = ["GroupsCore", "InteractiveUtils", "LinearAlgebra", "MacroTools", "Random", "RandomExtensions", "SparseArrays", "Test"]
-git-tree-sha1 = "3ee5c58774f4487a5bf2bb05e39d91ff5022b4cc"
+deps = ["GroupsCore", "InteractiveUtils", "LinearAlgebra", "MacroTools", "Preferences", "Random", "RandomExtensions", "SparseArrays", "Test"]
+git-tree-sha1 = "1bd8a536c949eb3de9b58042d57790ded6b70fa6"
uuid = "c3fe647b-3220-5bb0-a1ea-a7954cac585d"
-version = "0.29.4"
+version = "0.30.9"
[[deps.AbstractDifferentiation]]
deps = ["ChainRulesCore", "ExprTools", "LinearAlgebra", "Requires"]
@@ -29,9 +34,9 @@ version = "0.5.2"
[[deps.AbstractFFTs]]
deps = ["ChainRulesCore", "LinearAlgebra"]
-git-tree-sha1 = "16b6dbc4cf7caee4e1e75c49485ec67b667098a0"
+git-tree-sha1 = "8bc0aaec0ca548eb6cf5f0d7d16351650c1ee956"
uuid = "621f4979-c628-5d54-868e-fcf4e3e8185c"
-version = "1.3.1"
+version = "1.3.2"
[[deps.AbstractTrees]]
git-tree-sha1 = "faa260e4cb5aba097a73fab382dd4b5819d8ec8c"
@@ -40,9 +45,9 @@ version = "0.4.4"
[[deps.Adapt]]
deps = ["LinearAlgebra", "Requires"]
-git-tree-sha1 = "cc37d689f599e8df4f464b2fa3870ff7db7492ef"
+git-tree-sha1 = "76289dc51920fdc6e0013c872ba9551d54961c24"
uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e"
-version = "3.6.1"
+version = "3.6.2"
[[deps.Animations]]
deps = ["Colors"]
@@ -66,10 +71,10 @@ uuid = "ec485272-7323-5ecc-a04f-4719b315124d"
version = "0.2.0"
[[deps.ArrayInterface]]
-deps = ["Adapt", "LinearAlgebra", "Requires", "SnoopPrecompile", "SparseArrays", "SuiteSparse"]
-git-tree-sha1 = "38911c7737e123b28182d89027f4216cfc8a9da7"
+deps = ["Adapt", "LinearAlgebra", "Requires", "SparseArrays", "SuiteSparse"]
+git-tree-sha1 = "f83ec24f76d4c8f525099b2ac475fc098138ec31"
uuid = "4fba245c-0d91-5ea0-9b3e-6abc04ee57a9"
-version = "7.4.3"
+version = "7.4.11"
[[deps.Artifacts]]
uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33"
@@ -132,10 +137,10 @@ uuid = "159f3aea-2a34-519c-b102-8c37f9878175"
version = "1.0.5"
[[deps.CairoMakie]]
-deps = ["Base64", "Cairo", "Colors", "FFTW", "FileIO", "FreeType", "GeometryBasics", "LinearAlgebra", "Makie", "SHA", "SnoopPrecompile"]
-git-tree-sha1 = "2aba202861fd2b7603beb80496b6566491229855"
+deps = ["Base64", "Cairo", "Colors", "FFTW", "FileIO", "FreeType", "GeometryBasics", "LinearAlgebra", "Makie", "PrecompileTools", "SHA"]
+git-tree-sha1 = "bfc7d54b3c514f8015055e6ad0d5997da64d99fc"
uuid = "13f3f980-e62b-5c42-98c6-ff1f3baf88f0"
-version = "0.10.4"
+version = "0.10.6"
[[deps.Cairo_jll]]
deps = ["Artifacts", "Bzip2_jll", "CompilerSupportLibraries_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "JLLWrappers", "LZO_jll", "Libdl", "Pixman_jll", "Pkg", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Zlib_jll", "libpng_jll"]
@@ -151,15 +156,15 @@ version = "0.5.1"
[[deps.ChainRules]]
deps = ["Adapt", "ChainRulesCore", "Compat", "Distributed", "GPUArraysCore", "IrrationalConstants", "LinearAlgebra", "Random", "RealDot", "SparseArrays", "Statistics", "StructArrays"]
-git-tree-sha1 = "8bae903893aeeb429cf732cf1888490b93ecf265"
+git-tree-sha1 = "61549d9b52c88df34d21bd306dba1d43bb039c87"
uuid = "082447d4-558c-5d27-93f4-14fc19e9eca2"
-version = "1.49.0"
+version = "1.51.0"
[[deps.ChainRulesCore]]
deps = ["Compat", "LinearAlgebra", "SparseArrays"]
-git-tree-sha1 = "c6d890a52d2c4d55d326439580c3b8d0875a77d9"
+git-tree-sha1 = "e30f2f4e20f7f186dc36529910beaedc60cfa644"
uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4"
-version = "1.15.7"
+version = "1.16.0"
[[deps.ChangesOfVariables]]
deps = ["LinearAlgebra", "Test"]
@@ -221,9 +226,9 @@ uuid = "861a8166-3701-5b0c-9a16-15d98fcdc6aa"
version = "1.0.2"
[[deps.CommonSolve]]
-git-tree-sha1 = "9441451ee712d1aec22edad62db1a9af3dc8d852"
+git-tree-sha1 = "0eee5eb66b1cf62cd6ad1b460238e60e4b09400c"
uuid = "38540f10-b2f7-11e9-35d8-d573e4eb0ff2"
-version = "0.2.3"
+version = "0.2.4"
[[deps.CommonSubexpressions]]
deps = ["MacroTools", "Test"]
@@ -233,9 +238,9 @@ version = "0.3.0"
[[deps.Compat]]
deps = ["Dates", "LinearAlgebra", "UUIDs"]
-git-tree-sha1 = "7a60c856b9fa189eb34f5f8a6f6b5529b7942957"
+git-tree-sha1 = "4e88377ae7ebeaf29a047aa1ee40826e0b708a5d"
uuid = "34da2185-b29b-5c13-b0c7-acf172513d20"
-version = "4.6.1"
+version = "4.7.0"
[[deps.CompilerSupportLibraries_jll]]
deps = ["Artifacts", "Libdl"]
@@ -249,15 +254,15 @@ version = "0.1.3"
[[deps.ConcurrentUtilities]]
deps = ["Serialization", "Sockets"]
-git-tree-sha1 = "b306df2650947e9eb100ec125ff8c65ca2053d30"
+git-tree-sha1 = "96d823b94ba8d187a6d8f0826e731195a74b90e9"
uuid = "f0e56b4a-5159-44fe-b623-3e5288b988bb"
-version = "2.1.1"
+version = "2.2.0"
[[deps.Conda]]
deps = ["Downloads", "JSON", "VersionParsing"]
-git-tree-sha1 = "e32a90da027ca45d84678b826fffd3110bb3fc90"
+git-tree-sha1 = "915ebe6f0e7302693bdd8eac985797dba1d25662"
uuid = "8f4d0f93-b110-5947-807f-2305c1781a2d"
-version = "1.8.0"
+version = "1.9.0"
[[deps.CondaPkg]]
deps = ["JSON3", "Markdown", "MicroMamba", "Pidfile", "Pkg", "TOML"]
@@ -278,9 +283,9 @@ version = "0.6.2"
[[deps.CovarianceEstimation]]
deps = ["LinearAlgebra", "Statistics", "StatsBase"]
-git-tree-sha1 = "3c8de95b4e932d76ec8960e12d681eba580e9674"
+git-tree-sha1 = "6711ad240bb8861dda376bad332d3f89e2ac5f30"
uuid = "587fd27a-f159-11e8-2dae-1979310e6154"
-version = "0.2.8"
+version = "0.2.9"
[[deps.DSP]]
deps = ["Compat", "FFTW", "IterTools", "LinearAlgebra", "Polynomials", "Random", "Reexport", "SpecialFunctions", "Statistics"]
@@ -289,9 +294,9 @@ uuid = "717857b8-e6f2-59f4-9121-6e50c889abd2"
version = "0.7.8"
[[deps.DataAPI]]
-git-tree-sha1 = "e8119c1a33d267e16108be441a287a6981ba1630"
+git-tree-sha1 = "8da84edb865b0b5b0100c0666a9bc9a0b71c553c"
uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a"
-version = "1.14.0"
+version = "1.15.0"
[[deps.DataStructures]]
deps = ["Compat", "InteractiveUtils", "OrderedCollections"]
@@ -332,19 +337,19 @@ version = "1.1.0"
[[deps.DiffRules]]
deps = ["IrrationalConstants", "LogExpFunctions", "NaNMath", "Random", "SpecialFunctions"]
-git-tree-sha1 = "a4ad7ef19d2cdc2eff57abbbe68032b1cd0bd8f8"
+git-tree-sha1 = "23163d55f885173722d1e4cf0f6110cdbaf7e272"
uuid = "b552c78f-8df3-52c6-915a-8e097449b14b"
-version = "1.13.0"
+version = "1.15.1"
[[deps.Distributed]]
deps = ["Random", "Serialization", "Sockets"]
uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b"
[[deps.Distributions]]
-deps = ["ChainRulesCore", "DensityInterface", "FillArrays", "LinearAlgebra", "PDMats", "Printf", "QuadGK", "Random", "SparseArrays", "SpecialFunctions", "Statistics", "StatsBase", "StatsFuns", "Test"]
-git-tree-sha1 = "c2614fa3aafe03d1a44b8e16508d9be718b8095a"
+deps = ["ChainRulesCore", "DensityInterface", "FillArrays", "LinearAlgebra", "PDMats", "Printf", "QuadGK", "Random", "SparseArrays", "SpecialFunctions", "Statistics", "StatsAPI", "StatsBase", "StatsFuns", "Test"]
+git-tree-sha1 = "db40d3aff76ea6a3619fdd15a8c78299221a2394"
uuid = "31c24e10-a181-5473-b8eb-7969acd0382f"
-version = "0.25.89"
+version = "0.25.97"
[[deps.DocStringExtensions]]
deps = ["LibGit2"]
@@ -360,9 +365,9 @@ version = "0.27.24"
[[deps.DomainSets]]
deps = ["CompositeTypes", "IntervalSets", "LinearAlgebra", "Random", "StaticArrays", "Statistics"]
-git-tree-sha1 = "698124109da77b6914f64edd696be8dccf90229e"
+git-tree-sha1 = "51b4b84d33ec5e0955b55ff4b748b99ce2c3faa9"
uuid = "5b8099bc-c8ec-5219-889f-1d9e522a28bf"
-version = "0.6.6"
+version = "0.6.7"
[[deps.Downloads]]
deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"]
@@ -398,11 +403,17 @@ git-tree-sha1 = "bdb1942cd4c45e3c678fd11569d5cccd80976237"
uuid = "4e289a0a-7415-4d19-859d-a7e5c4648b56"
version = "1.0.4"
+[[deps.ExceptionUnwrapping]]
+deps = ["Test"]
+git-tree-sha1 = "e90caa41f5a86296e014e148ee061bd6c3edec96"
+uuid = "460bff9d-24e4-43bc-9d9f-a8973cb893f4"
+version = "0.1.9"
+
[[deps.Expat_jll]]
-deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
-git-tree-sha1 = "bad72f730e9e91c08d9427d5e8db95478a3c323d"
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "4558ab818dcceaab612d1bb8c19cee87eda2b83c"
uuid = "2e619515-83b5-522b-bb60-26c02a35a201"
-version = "2.4.8+0"
+version = "2.5.0+0"
[[deps.ExponentialAction]]
deps = ["AbstractDifferentiation", "ChainRulesCore", "Compat", "LinearAlgebra", "SparseArrays"]
@@ -434,9 +445,9 @@ version = "4.4.2+2"
[[deps.FFTW]]
deps = ["AbstractFFTs", "FFTW_jll", "LinearAlgebra", "MKL_jll", "Preferences", "Reexport"]
-git-tree-sha1 = "f9818144ce7c8c41edf5c4c179c684d92aa4d9fe"
+git-tree-sha1 = "b4fbdd20c889804969571cc589900803edda16b7"
uuid = "7a1cc6ca-52ef-59f5-83cd-3a7055c09341"
-version = "1.6.0"
+version = "1.7.1"
[[deps.FFTW_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
@@ -455,15 +466,15 @@ uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee"
[[deps.FillArrays]]
deps = ["LinearAlgebra", "Random", "SparseArrays", "Statistics"]
-git-tree-sha1 = "fc86b4fd3eff76c3ce4f5e96e2fdfa6282722885"
+git-tree-sha1 = "0b3b52afd0f87b0a3f5ada0466352d125c9db458"
uuid = "1a297f60-69ca-5386-bcde-b61e274b549b"
-version = "1.0.0"
+version = "1.2.1"
[[deps.FiniteDiff]]
deps = ["ArrayInterface", "LinearAlgebra", "Requires", "Setfield", "SparseArrays", "StaticArrays"]
-git-tree-sha1 = "6604e18a0220650dbbea7854938768f15955dd8e"
+git-tree-sha1 = "c6e4a1fbe73b31a3dea94b1da449503b8830c306"
uuid = "6a86dc24-6348-571c-b903-95158fe2bd41"
-version = "2.20.0"
+version = "2.21.1"
[[deps.FixedPointNumbers]]
deps = ["Statistics"]
@@ -536,15 +547,15 @@ version = "3.3.8+0"
[[deps.GPUArrays]]
deps = ["Adapt", "GPUArraysCore", "LLVM", "LinearAlgebra", "Printf", "Random", "Reexport", "Serialization", "Statistics"]
-git-tree-sha1 = "9ade6983c3dbbd492cf5729f865fe030d1541463"
+git-tree-sha1 = "2e57b4a4f9cc15e85a24d603256fe08e527f48d1"
uuid = "0c68f7d7-f131-5f86-a1c3-88cf8149b2d7"
-version = "8.6.6"
+version = "8.8.1"
[[deps.GPUArraysCore]]
deps = ["Adapt"]
-git-tree-sha1 = "1cd7f0af1aa58abc02ea1d872953a97359cb87fa"
+git-tree-sha1 = "2d6ca471a6c7b536127afccfa7564b5b39227fe0"
uuid = "46192b85-c4d5-4398-a991-12ede77f4527"
-version = "0.1.4"
+version = "0.1.5"
[[deps.GR]]
deps = ["Artifacts", "Base64", "DelimitedFiles", "Downloads", "GR_jll", "HTTP", "JSON", "Libdl", "LinearAlgebra", "Pkg", "Preferences", "Printf", "Random", "Serialization", "Sockets", "TOML", "Tar", "Test", "UUIDs", "p7zip_jll"]
@@ -560,9 +571,9 @@ version = "0.72.7+0"
[[deps.GeoInterface]]
deps = ["Extents"]
-git-tree-sha1 = "0eb6de0b312688f852f347171aba888658e29f20"
+git-tree-sha1 = "bb198ff907228523f3dee1070ceee63b9359b6ab"
uuid = "cf35fbd7-0cd7-5166-be24-54bfbe79505f"
-version = "1.3.0"
+version = "1.3.1"
[[deps.GeometryBasics]]
deps = ["EarCut_jll", "GeoInterface", "IterTools", "LinearAlgebra", "StaticArrays", "StructArrays", "Tables"]
@@ -613,9 +624,9 @@ version = "1.0.2"
[[deps.Groebner]]
deps = ["AbstractAlgebra", "Combinatorics", "Logging", "MultivariatePolynomials", "Primes", "Random", "SnoopPrecompile"]
-git-tree-sha1 = "b6c3e9e1eb8dcc6fd9bc68fe08dcc7ab22710de6"
+git-tree-sha1 = "c8b55b624a83f60bcd6574cc999ad148d0a47dd6"
uuid = "0b43b601-686d-58a3-8a1c-6623616c7cd4"
-version = "0.3.4"
+version = "0.3.6"
[[deps.GroupsCore]]
deps = ["Markdown", "Random"]
@@ -625,9 +636,9 @@ version = "0.4.0"
[[deps.HDF5]]
deps = ["Compat", "HDF5_jll", "Libdl", "Mmap", "Random", "Requires", "UUIDs"]
-git-tree-sha1 = "3dab31542b3da9f25a6a1d11159d4af8fdce7d67"
+git-tree-sha1 = "c73fdc3d9da7700691848b78c61841274076932a"
uuid = "f67ccb44-e63f-5c2f-98bd-6dc0ccc4ba2f"
-version = "0.16.14"
+version = "0.16.15"
[[deps.HDF5_jll]]
deps = ["Artifacts", "JLLWrappers", "LibCURL_jll", "Libdl", "OpenSSL_jll", "Pkg", "Zlib_jll"]
@@ -636,10 +647,10 @@ uuid = "0234f1f7-429e-5d53-9886-15a909be8d59"
version = "1.12.2+2"
[[deps.HTTP]]
-deps = ["Base64", "CodecZlib", "ConcurrentUtilities", "Dates", "Logging", "LoggingExtras", "MbedTLS", "NetworkOptions", "OpenSSL", "Random", "SimpleBufferStream", "Sockets", "URIs", "UUIDs"]
-git-tree-sha1 = "69182f9a2d6add3736b7a06ab6416aafdeec2196"
+deps = ["Base64", "CodecZlib", "ConcurrentUtilities", "Dates", "ExceptionUnwrapping", "Logging", "LoggingExtras", "MbedTLS", "NetworkOptions", "OpenSSL", "Random", "SimpleBufferStream", "Sockets", "URIs", "UUIDs"]
+git-tree-sha1 = "2613d054b0e18a3dea99ca1594e9a3960e025da4"
uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3"
-version = "1.8.0"
+version = "1.9.7"
[[deps.HarfBuzz_jll]]
deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "Graphite2_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Pkg"]
@@ -655,27 +666,27 @@ version = "0.4.15"
[[deps.HypergeometricFunctions]]
deps = ["DualNumbers", "LinearAlgebra", "OpenLibm_jll", "SpecialFunctions"]
-git-tree-sha1 = "432b5b03176f8182bd6841fbfc42c718506a2d5f"
+git-tree-sha1 = "0ec02c648befc2f94156eaef13b0f38106212f3f"
uuid = "34004b35-14d8-5ef3-9330-4cdb6864b03a"
-version = "0.3.15"
+version = "0.3.17"
[[deps.IJulia]]
deps = ["Base64", "Conda", "Dates", "InteractiveUtils", "JSON", "Libdl", "Logging", "Markdown", "MbedTLS", "Pkg", "Printf", "REPL", "Random", "SoftGlobalScope", "Test", "UUIDs", "ZMQ"]
-git-tree-sha1 = "59e19713542dd9dd02f31d59edbada69530d6a14"
+git-tree-sha1 = "47ac8cc196b81001a711f4b2c12c97372338f00c"
uuid = "7073ff75-c697-5162-941a-fcdaad2a7d2a"
-version = "1.24.0"
+version = "1.24.2"
[[deps.IOCapture]]
deps = ["Logging", "Random"]
-git-tree-sha1 = "f7be53659ab06ddc986428d3a9dcc95f6fa6705a"
+git-tree-sha1 = "d75853a0bdbfb1ac815478bacd89cd27b550ace6"
uuid = "b5f81e59-6552-4d32-b1f0-c071b021bf89"
-version = "0.2.2"
+version = "0.2.3"
[[deps.IRTools]]
deps = ["InteractiveUtils", "MacroTools", "Test"]
-git-tree-sha1 = "0ade27f0c49cebd8db2523c4eeccf779407cf12c"
+git-tree-sha1 = "eac00994ce3229a464c2847e956d77a2c64ad3a5"
uuid = "7869d1d1-7146-5819-86e3-90919afe41df"
-version = "0.4.9"
+version = "0.4.10"
[[deps.IfElse]]
git-tree-sha1 = "debdd00ffef04665ccbb3e150747a77560e8fad1"
@@ -729,9 +740,9 @@ uuid = "d25df0c9-e2be-5dd7-82c8-3ad0b3e990b9"
version = "0.1.3"
[[deps.IntegerMathUtils]]
-git-tree-sha1 = "f366daebdfb079fd1fe4e3d560f99a0c892e15bc"
+git-tree-sha1 = "70f65ced5129d36dbf200b07c51ea8a955294660"
uuid = "18e54dd8-cb9d-406c-a71d-865a43cbb235"
-version = "0.1.0"
+version = "0.1.1"
[[deps.IntelOpenMP_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
@@ -762,16 +773,16 @@ uuid = "3587e190-3f89-42d0-90ee-14403ec27112"
version = "0.1.9"
[[deps.Ipopt]]
-deps = ["Ipopt_jll", "LinearAlgebra", "MathOptInterface", "OpenBLAS32_jll", "SnoopPrecompile"]
-git-tree-sha1 = "392d19287155a54d0053360a90dd1b43037a8ef2"
+deps = ["Ipopt_jll", "LinearAlgebra", "MathOptInterface", "OpenBLAS32_jll", "PrecompileTools"]
+git-tree-sha1 = "fdb3430a3b7b909bcb5abf9439d61450f49e3e2c"
uuid = "b6b21f68-93f8-5de0-b562-5493be1d77c9"
-version = "1.2.1"
+version = "1.4.1"
[[deps.Ipopt_jll]]
-deps = ["ASL_jll", "Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "MUMPS_seq_jll", "OpenBLAS32_jll", "Pkg", "libblastrampoline_jll"]
-git-tree-sha1 = "97c0e9fa36e93448fe214fea5366fac1ba3d1bfa"
+deps = ["ASL_jll", "Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "MUMPS_seq_jll", "OpenBLAS32_jll", "Pkg"]
+git-tree-sha1 = "e3e202237d93f18856b6ff1016166b0f172a49a8"
uuid = "9cc047cb-c261-5740-88fc-0cf96f7bdcc7"
-version = "300.1400.1000+0"
+version = "300.1400.400+0"
[[deps.IrrationalConstants]]
git-tree-sha1 = "630b497eafcc20001bba38a4651b327dcfc491d2"
@@ -785,9 +796,9 @@ uuid = "f1662d9f-8043-43de-a69a-05efc1cc6ff4"
version = "0.1.1"
[[deps.IterTools]]
-git-tree-sha1 = "fa6287a4469f5e048d763df38279ee729fbd44e5"
+git-tree-sha1 = "4ced6667f9974fc5c5943fa5e2ef1ca43ea9e450"
uuid = "c8e1da08-722c-5040-9ed9-7db0dc04731e"
-version = "1.4.0"
+version = "1.8.0"
[[deps.IteratorInterfaceExtensions]]
git-tree-sha1 = "a3f24677c21f5bbe9d2a714f95dcd58337fb2856"
@@ -819,10 +830,10 @@ uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6"
version = "0.21.4"
[[deps.JSON3]]
-deps = ["Dates", "Mmap", "Parsers", "SnoopPrecompile", "StructTypes", "UUIDs"]
-git-tree-sha1 = "84b10656a41ef564c39d2d477d7236966d2b5683"
+deps = ["Dates", "Mmap", "Parsers", "PrecompileTools", "StructTypes", "UUIDs"]
+git-tree-sha1 = "5b62d93f2582b09e469b3099d839c2d2ebf5066d"
uuid = "0f8b85d8-7281-11e9-16c2-39a750bddbf1"
-version = "1.12.0"
+version = "1.13.1"
[[deps.JpegTurbo]]
deps = ["CEnum", "FileIO", "ImageCore", "JpegTurbo_jll", "TOML"]
@@ -850,9 +861,9 @@ version = "0.6.7"
[[deps.Kronecker]]
deps = ["LinearAlgebra", "NamedDims", "SparseArrays", "StatsBase"]
-git-tree-sha1 = "78d9909daf659c901ae6c7b9de7861ba45a743f4"
+git-tree-sha1 = "bd47e8074c6bd478abf7efa6d504f6c1c38a487c"
uuid = "2c470bb0-bcc8-11e8-3dad-c9649493f05e"
-version = "0.5.3"
+version = "0.5.4"
[[deps.LAME_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
@@ -868,15 +879,21 @@ version = "3.0.0+1"
[[deps.LLVM]]
deps = ["CEnum", "LLVMExtra_jll", "Libdl", "Printf", "Unicode"]
-git-tree-sha1 = "a8960cae30b42b66dd41808beb76490519f6f9e2"
+git-tree-sha1 = "7d5788011dd273788146d40eb5b1fbdc199d0296"
uuid = "929cbde3-209d-540e-8aea-75f648917ca0"
-version = "5.0.0"
+version = "6.0.1"
[[deps.LLVMExtra_jll]]
deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl", "TOML"]
-git-tree-sha1 = "09b7505cc0b1cee87e5d4a26eea61d2e1b0dcd35"
+git-tree-sha1 = "1222116d7313cdefecf3d45a2bc1a89c4e7c9217"
uuid = "dad2f222-ce93-54a1-a47d-0025e8a3acab"
-version = "0.0.21+0"
+version = "0.0.22+0"
+
+[[deps.LLVMOpenMP_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
+git-tree-sha1 = "f689897ccbe049adb19a065c495e75f372ecd42b"
+uuid = "1d63c593-3942-5779-bab2-d838dc0a180e"
+version = "15.0.4+0"
[[deps.LZO_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
@@ -997,21 +1014,21 @@ uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
[[deps.LinearMaps]]
deps = ["ChainRulesCore", "LinearAlgebra", "SparseArrays", "Statistics"]
-git-tree-sha1 = "4af48c3585177561e9f0d24eb9619ad3abf77cc7"
+git-tree-sha1 = "62f9b2762cc107667b137af621e951f52e020a0f"
uuid = "7a12625a-238d-50fd-b39a-03d52299707e"
-version = "3.10.0"
+version = "3.10.2"
[[deps.LiveServer]]
deps = ["HTTP", "MIMEs", "Pkg", "Sockets"]
-git-tree-sha1 = "b0db05c042a7c54bb858f9846a4ca39ac15f8c44"
+git-tree-sha1 = "494010f12dd98fa0d558cb7679b7c21d3a0a430a"
uuid = "16fef848-5104-11e9-1b77-fb7a48bbb589"
-version = "1.1.1"
+version = "1.2.0"
[[deps.LogExpFunctions]]
deps = ["ChainRulesCore", "ChangesOfVariables", "DocStringExtensions", "InverseFunctions", "IrrationalConstants", "LinearAlgebra"]
-git-tree-sha1 = "0a1b7c2863e44523180fdb3146534e265a91870b"
+git-tree-sha1 = "c3ce8e7420b3a6e071e0fe4745f5d4300e37b13f"
uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688"
-version = "0.3.23"
+version = "0.3.24"
[[deps.Logging]]
uuid = "56ddb016-857b-54e1-b83d-db4d58db5568"
@@ -1041,15 +1058,15 @@ version = "0.1.4"
[[deps.MKL_jll]]
deps = ["Artifacts", "IntelOpenMP_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "Pkg"]
-git-tree-sha1 = "2ce8695e1e699b68702c03402672a69f54b8aca9"
+git-tree-sha1 = "154d7aaa82d24db6d8f7e4ffcfe596f40bff214b"
uuid = "856f044c-d86e-5d09-b602-aeab76dc8ba7"
-version = "2022.2.0+0"
+version = "2023.1.0+0"
[[deps.MUMPS_seq_jll]]
-deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "METIS_jll", "OpenBLAS32_jll", "Pkg", "libblastrampoline_jll"]
-git-tree-sha1 = "f429d6bbe9ad015a2477077c9e89b978b8c26558"
+deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "METIS_jll", "OpenBLAS32_jll", "Pkg"]
+git-tree-sha1 = "29de2841fa5aefe615dea179fcde48bb87b58f57"
uuid = "d7ed1dd3-d0ae-5e8e-bfb4-87a502085b8d"
-version = "500.500.101+0"
+version = "5.4.1+0"
[[deps.MacroTools]]
deps = ["Markdown", "Random"]
@@ -1058,10 +1075,10 @@ uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09"
version = "0.5.10"
[[deps.Makie]]
-deps = ["Animations", "Base64", "ColorBrewer", "ColorSchemes", "ColorTypes", "Colors", "Contour", "Distributions", "DocStringExtensions", "Downloads", "FFMPEG", "FileIO", "FixedPointNumbers", "Formatting", "FreeType", "FreeTypeAbstraction", "GeometryBasics", "GridLayoutBase", "ImageIO", "InteractiveUtils", "IntervalSets", "Isoband", "KernelDensity", "LaTeXStrings", "LinearAlgebra", "MakieCore", "Markdown", "Match", "MathTeXEngine", "MiniQhull", "Observables", "OffsetArrays", "Packing", "PlotUtils", "PolygonOps", "Printf", "Random", "RelocatableFolders", "Setfield", "Showoff", "SignedDistanceFields", "SnoopPrecompile", "SparseArrays", "StableHashTraits", "Statistics", "StatsBase", "StatsFuns", "StructArrays", "TriplotBase", "UnicodeFun"]
-git-tree-sha1 = "74657542dc85c3b72b8a5a9392d57713d8b7a999"
+deps = ["Animations", "Base64", "ColorBrewer", "ColorSchemes", "ColorTypes", "Colors", "Contour", "Distributions", "DocStringExtensions", "Downloads", "FFMPEG", "FileIO", "FixedPointNumbers", "Formatting", "FreeType", "FreeTypeAbstraction", "GeometryBasics", "GridLayoutBase", "ImageIO", "InteractiveUtils", "IntervalSets", "Isoband", "KernelDensity", "LaTeXStrings", "LinearAlgebra", "MacroTools", "MakieCore", "Markdown", "Match", "MathTeXEngine", "MiniQhull", "Observables", "OffsetArrays", "Packing", "PlotUtils", "PolygonOps", "PrecompileTools", "Printf", "REPL", "Random", "RelocatableFolders", "Setfield", "Showoff", "SignedDistanceFields", "SparseArrays", "StableHashTraits", "Statistics", "StatsBase", "StatsFuns", "StructArrays", "TriplotBase", "UnicodeFun"]
+git-tree-sha1 = "a6695a632992a2e19ae1a1d0c9bee0e137e2f3cb"
uuid = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a"
-version = "0.19.4"
+version = "0.19.6"
[[deps.MakieCore]]
deps = ["Observables"]
@@ -1070,27 +1087,27 @@ uuid = "20f20a25-4f0e-4fdf-b5d1-57303727442b"
version = "0.6.3"
[[deps.ManifoldDiff]]
-deps = ["LinearAlgebra", "ManifoldsBase", "Markdown", "Requires"]
-git-tree-sha1 = "b34672ebeea5350e984fb1dc5bb62c63362e50c0"
+deps = ["LinearAlgebra", "ManifoldsBase", "Markdown", "Random", "Requires"]
+git-tree-sha1 = "349141981abc7fc53f3b547b4be4be270d35ef0c"
uuid = "af67fdf4-a580-4b9f-bbec-742ef357defd"
-version = "0.3.1"
+version = "0.3.4"
[[deps.Manifolds]]
-deps = ["Colors", "Distributions", "Einsum", "Graphs", "HybridArrays", "Kronecker", "LinearAlgebra", "ManifoldDiff", "ManifoldsBase", "Markdown", "MatrixEquations", "Quaternions", "Random", "RecipesBase", "RecursiveArrayTools", "Requires", "SimpleWeightedGraphs", "SpecialFunctions", "StaticArrays", "Statistics", "StatsBase"]
-git-tree-sha1 = "f9757cc3482ea2fd3a2ff264716e057414c7df85"
+deps = ["Distributions", "Einsum", "Graphs", "HybridArrays", "Kronecker", "LinearAlgebra", "ManifoldDiff", "ManifoldsBase", "Markdown", "MatrixEquations", "Quaternions", "Random", "RecursiveArrayTools", "Requires", "SimpleWeightedGraphs", "SpecialFunctions", "StaticArrays", "Statistics", "StatsBase"]
+git-tree-sha1 = "1a131c6810b91ac48aa944c4fef97147018f3f63"
uuid = "1cead3c2-87b3-11e9-0ccd-23c62b72b94e"
-version = "0.8.59"
+version = "0.8.72"
[[deps.ManifoldsBase]]
deps = ["LinearAlgebra", "Markdown", "Random"]
-git-tree-sha1 = "efdf83d766c61aa26d5a8e210324e71448d9f147"
+git-tree-sha1 = "6ba91cf9dad7f3980b707a583dcccef932f74316"
uuid = "3362f125-f0bb-47a3-aa74-596ffd7ef2fb"
-version = "0.14.5"
+version = "0.14.6"
[[deps.MappedArrays]]
-git-tree-sha1 = "e8b359ef06ec72e8c030463fe02efe5527ee5142"
+git-tree-sha1 = "2dab0221fe2b0f2cb6754eaa743cc266339f527e"
uuid = "dbb5928d-eab1-5f90-85c2-b9b0edb7c900"
-version = "0.4.1"
+version = "0.4.2"
[[deps.Markdown]]
deps = ["Base64"]
@@ -1103,9 +1120,9 @@ version = "1.2.0"
[[deps.MathOptInterface]]
deps = ["BenchmarkTools", "CodecBzip2", "CodecZlib", "DataStructures", "ForwardDiff", "JSON", "LinearAlgebra", "MutableArithmetics", "NaNMath", "OrderedCollections", "PrecompileTools", "Printf", "SparseArrays", "SpecialFunctions", "Test", "Unicode"]
-git-tree-sha1 = "8e054675d393ce5866dcdd6a071075e25e21a39c"
+git-tree-sha1 = "5c5cd501ae1d76d3ccd7c7e6b4325a15dde7f31c"
uuid = "b8f27783-ece8-5eb3-8dc8-9495eed66fee"
-version = "1.15.1"
+version = "1.18.0"
[[deps.MathTeXEngine]]
deps = ["AbstractTrees", "Automa", "DataStructures", "FreeTypeAbstraction", "GeometryBasics", "LaTeXStrings", "REPL", "RelocatableFolders", "Test", "UnicodeFun"]
@@ -1115,9 +1132,9 @@ version = "0.5.6"
[[deps.MatrixEquations]]
deps = ["LinearAlgebra", "LinearMaps"]
-git-tree-sha1 = "15838905f0d1eb5d450b12986e64861a82fd6e03"
+git-tree-sha1 = "dc2a12b326751cd40785c9310b9965c5ad5dcc95"
uuid = "99c1a7ee-ab34-5fd5-8076-27c950a045f4"
-version = "2.2.9"
+version = "2.2.10"
[[deps.MbedTLS]]
deps = ["Dates", "MbedTLS_jll", "MozillaCACerts_jll", "Random", "Sockets"]
@@ -1198,7 +1215,7 @@ version = "0.2.50"
[[deps.NamedTrajectories]]
deps = ["CairoMakie", "DataStructures", "Documenter", "JLD2", "LaTeXStrings", "Latexify", "Reexport", "Revise", "Unidecode"]
-git-tree-sha1 = "9320c72ea6cd9fedb263000277e128f4e5618ea6"
+git-tree-sha1 = "f3967113b26ca5898525b2824c2f535610de047e"
repo-rev = "main"
repo-url = "https://github.com/aarontrowbridge/NamedTrajectories.jl.git"
uuid = "538bc3a1-5ab9-4fc3-b776-35ca1e893e08"
@@ -1261,15 +1278,15 @@ version = "0.8.1+0"
[[deps.OpenSSL]]
deps = ["BitFlags", "Dates", "MozillaCACerts_jll", "OpenSSL_jll", "Sockets"]
-git-tree-sha1 = "7fb975217aea8f1bb360cf1dde70bad2530622d2"
+git-tree-sha1 = "51901a49222b09e3743c65b8847687ae5fc78eb2"
uuid = "4d8831e6-92b7-49fb-bdf8-b643e874388c"
-version = "1.4.0"
+version = "1.4.1"
[[deps.OpenSSL_jll]]
-deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
-git-tree-sha1 = "9ff31d101d987eb9d66bd8b176ac7c277beccd09"
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "1aa4b74f80b01c6bc2b89992b861b5f210e665b5"
uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95"
-version = "1.1.20+0"
+version = "1.1.21+0"
[[deps.OpenSpecFun_jll]]
deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Pkg"]
@@ -1301,9 +1318,9 @@ version = "0.11.17"
[[deps.PGFPlotsX]]
deps = ["ArgCheck", "Dates", "DefaultApplication", "DocStringExtensions", "MacroTools", "OrderedCollections", "Parameters", "Requires", "Tables"]
-git-tree-sha1 = "e98a6743775e107062be357560977c06850a79be"
+git-tree-sha1 = "3e7a0345b9f37da2cd770a5d47bb5cb6e62c7a81"
uuid = "8314cec4-20b6-5062-9cdb-752b83310925"
-version = "1.5.3"
+version = "1.6.0"
[[deps.PNGFiles]]
deps = ["Base64", "CEnum", "ImageCore", "IndirectArrays", "OffsetArrays", "libpng_jll"]
@@ -1336,10 +1353,10 @@ uuid = "d96e819e-fc66-5662-9728-84c9c7592b0a"
version = "0.12.3"
[[deps.Parsers]]
-deps = ["Dates", "SnoopPrecompile"]
-git-tree-sha1 = "478ac6c952fddd4399e71d4779797c538d0ff2bf"
+deps = ["Dates", "PrecompileTools", "UUIDs"]
+git-tree-sha1 = "4b2e829ee66d4218e0cef22c0a64ee37cf258c29"
uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0"
-version = "2.5.8"
+version = "2.7.1"
[[deps.Pidfile]]
deps = ["FileWatching", "Test"]
@@ -1353,10 +1370,10 @@ uuid = "b98c9c47-44ae-5843-9183-064241ee97a0"
version = "1.3.0"
[[deps.Pixman_jll]]
-deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
-git-tree-sha1 = "b4f5d02549a10e20780a24fce72bea96b6329e29"
+deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LLVMOpenMP_jll", "Libdl"]
+git-tree-sha1 = "64779bc4c9784fee475689a1752ef4d5747c5e87"
uuid = "30392449-352a-5448-841d-b1acce4e97dc"
-version = "0.40.1+0"
+version = "0.42.2+0"
[[deps.Pkg]]
deps = ["Artifacts", "Dates", "Downloads", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"]
@@ -1383,9 +1400,9 @@ version = "1.3.5"
[[deps.Plots]]
deps = ["Base64", "Contour", "Dates", "Downloads", "FFMPEG", "FixedPointNumbers", "GR", "JLFzf", "JSON", "LaTeXStrings", "Latexify", "LinearAlgebra", "Measures", "NaNMath", "Pkg", "PlotThemes", "PlotUtils", "PrecompileTools", "Preferences", "Printf", "REPL", "Random", "RecipesBase", "RecipesPipeline", "Reexport", "RelocatableFolders", "Requires", "Scratch", "Showoff", "SparseArrays", "Statistics", "StatsBase", "UUIDs", "UnicodeFun", "UnitfulLatexify", "Unzip"]
-git-tree-sha1 = "ceb1ec8d4fbeb02f8817004837d924583707951b"
+git-tree-sha1 = "75ca67b2c6512ad2d0c767a7cfc55e75075f8bbc"
uuid = "91a5bcdd-55d7-5caf-9e0b-520d859cae80"
-version = "1.38.15"
+version = "1.38.16"
[[deps.PolygonOps]]
git-tree-sha1 = "77b3d3605fc1cd0b42d95eba87dfcd2bf67d5ff6"
@@ -1406,9 +1423,9 @@ version = "0.4.12"
[[deps.PrecompileTools]]
deps = ["Preferences"]
-git-tree-sha1 = "d0984cc886c48e5a165705ce65236dc2ec467b91"
+git-tree-sha1 = "9673d39decc5feece56ef3940e5dafba15ba0f81"
uuid = "aea7be01-6a6a-4083-8856-8a6e6704d82a"
-version = "1.1.0"
+version = "1.1.2"
[[deps.Preferences]]
deps = ["TOML"]
@@ -1461,10 +1478,10 @@ uuid = "460c41e3-6112-5d7f-b78c-b6823adb3f2d"
version = "1.0.0+1"
[[deps.Qhull_jll]]
-deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
-git-tree-sha1 = "238dd7e2cc577281976b9681702174850f8d4cbc"
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "be2449911f4d6cfddacdf7efc895eceda3eee5c1"
uuid = "784f63db-0788-585a-bace-daefebcd302b"
-version = "8.0.1001+0"
+version = "8.0.1003+0"
[[deps.Qt5Base_jll]]
deps = ["Artifacts", "CompilerSupportLibraries_jll", "Fontconfig_jll", "Glib_jll", "JLLWrappers", "Libdl", "Libglvnd_jll", "OpenSSL_jll", "Pkg", "Xorg_libXext_jll", "Xorg_libxcb_jll", "Xorg_xcb_util_image_jll", "Xorg_xcb_util_keysyms_jll", "Xorg_xcb_util_renderutil_jll", "Xorg_xcb_util_wm_jll", "Zlib_jll", "xkbcommon_jll"]
@@ -1505,9 +1522,9 @@ version = "0.3.2"
[[deps.Ratios]]
deps = ["Requires"]
-git-tree-sha1 = "6d7bb727e76147ba18eed998700998e17b8e4911"
+git-tree-sha1 = "1342a47bf3260ee108163042310d26f2be5ec90b"
uuid = "c84ed2f1-dad5-54f0-aa8e-dbefe2724439"
-version = "0.4.4"
+version = "0.4.5"
[[deps.RealDot]]
deps = ["LinearAlgebra"]
@@ -1529,9 +1546,9 @@ version = "0.6.12"
[[deps.RecursiveArrayTools]]
deps = ["Adapt", "ArrayInterface", "DocStringExtensions", "GPUArraysCore", "IteratorInterfaceExtensions", "LinearAlgebra", "RecipesBase", "Requires", "StaticArraysCore", "Statistics", "SymbolicIndexingInterface", "Tables"]
-git-tree-sha1 = "68078e9fa9130a6a768815c48002d0921a232c11"
+git-tree-sha1 = "02ef02926f30d53b94be443bfaea010c47f6b556"
uuid = "731186ca-8d62-57ce-b412-fbd966d074cd"
-version = "2.38.4"
+version = "2.38.5"
[[deps.Reexport]]
git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b"
@@ -1552,9 +1569,9 @@ version = "1.3.0"
[[deps.Revise]]
deps = ["CodeTracking", "Distributed", "FileWatching", "JuliaInterpreter", "LibGit2", "LoweredCodeUtils", "OrderedCollections", "Pkg", "REPL", "Requires", "UUIDs", "Unicode"]
-git-tree-sha1 = "feafdc70b2e6684314e188d95fe66d116de834a7"
+git-tree-sha1 = "1e597b93700fa4045d7189afa7c004e0584ea548"
uuid = "295af30f-e4ad-537b-8983-00126c2a3abe"
-version = "3.5.2"
+version = "3.5.3"
[[deps.Rmath]]
deps = ["Random", "Rmath_jll"]
@@ -1570,19 +1587,19 @@ version = "0.4.0+0"
[[deps.RuntimeGeneratedFunctions]]
deps = ["ExprTools", "SHA", "Serialization"]
-git-tree-sha1 = "f139e81a81e6c29c40f1971c9e5309b09c03f2c3"
+git-tree-sha1 = "0b9b18d6236e9ab2b092defaacdffd929d572642"
uuid = "7e49a35a-f44a-4d26-94aa-eba1b4ca6b47"
-version = "0.5.6"
+version = "0.5.9"
[[deps.SHA]]
uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce"
version = "0.7.0"
[[deps.SIMD]]
-deps = ["SnoopPrecompile"]
-git-tree-sha1 = "8b20084a97b004588125caebf418d8cab9e393d1"
+deps = ["PrecompileTools"]
+git-tree-sha1 = "0e270732477b9e551d884e6b07e23bb2ec947790"
uuid = "fdea26ae-647d-5447-a871-4b548cad5224"
-version = "3.4.4"
+version = "3.4.5"
[[deps.ScanByte]]
deps = ["Libdl", "SIMD"]
@@ -1591,16 +1608,16 @@ uuid = "7b38b023-a4d7-4c5e-8d43-3f3097f304eb"
version = "0.3.3"
[[deps.SciMLBase]]
-deps = ["ArrayInterface", "CommonSolve", "ConstructionBase", "Distributed", "DocStringExtensions", "EnumX", "FunctionWrappersWrappers", "IteratorInterfaceExtensions", "LinearAlgebra", "Logging", "Markdown", "Preferences", "RecipesBase", "RecursiveArrayTools", "Reexport", "RuntimeGeneratedFunctions", "SciMLOperators", "SnoopPrecompile", "StaticArraysCore", "Statistics", "SymbolicIndexingInterface", "Tables", "TruncatedStacktraces"]
-git-tree-sha1 = "392d3e28b05984496af37100ded94dc46fa6c8de"
+deps = ["ADTypes", "ArrayInterface", "CommonSolve", "ConstructionBase", "Distributed", "DocStringExtensions", "EnumX", "FunctionWrappersWrappers", "IteratorInterfaceExtensions", "LinearAlgebra", "Logging", "Markdown", "PrecompileTools", "Preferences", "RecipesBase", "RecursiveArrayTools", "Reexport", "RuntimeGeneratedFunctions", "SciMLOperators", "StaticArraysCore", "Statistics", "SymbolicIndexingInterface", "Tables", "TruncatedStacktraces"]
+git-tree-sha1 = "a22a12db91f6a921e28a7ae39a9546eed93fd92e"
uuid = "0bca4576-84f4-4d90-8ffe-ffa030f20462"
-version = "1.91.7"
+version = "1.93.0"
[[deps.SciMLOperators]]
deps = ["ArrayInterface", "DocStringExtensions", "Lazy", "LinearAlgebra", "Setfield", "SparseArrays", "StaticArraysCore", "Tricks"]
-git-tree-sha1 = "e61e48ef909375203092a6e83508c8416df55a83"
+git-tree-sha1 = "668ed6b2265d1adb36b7239501e9369025bd6c78"
uuid = "c0aeaf25-5076-4817-a8d5-81caf7dfa961"
-version = "0.2.0"
+version = "0.3.2"
[[deps.Scratch]]
deps = ["Dates"]
@@ -1685,9 +1702,9 @@ version = "1.1.0"
[[deps.SortingAlgorithms]]
deps = ["DataStructures"]
-git-tree-sha1 = "a4ada03f999bd01b3a25dcaa30b2d929fe537e00"
+git-tree-sha1 = "c60ec5c62180f27efea3ba2908480f8055e17cee"
uuid = "a2af1166-a08f-5f64-846c-94a0d3cef48c"
-version = "1.1.0"
+version = "1.1.1"
[[deps.SparseArrays]]
deps = ["LinearAlgebra", "Random"]
@@ -1695,9 +1712,9 @@ uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf"
[[deps.SpecialFunctions]]
deps = ["ChainRulesCore", "IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"]
-git-tree-sha1 = "ef28127915f4229c971eb43f3fc075dd3fe91880"
+git-tree-sha1 = "7beb031cf8145577fbccacd94b8a8f4ce78428d3"
uuid = "276daf66-3868-5448-9aa4-cd146d93841b"
-version = "2.2.0"
+version = "2.3.0"
[[deps.StableHashTraits]]
deps = ["CRC32c", "Compat", "Dates", "SHA", "Tables", "TupleTools", "UUIDs"]
@@ -1713,9 +1730,9 @@ version = "0.1.1"
[[deps.StaticArrays]]
deps = ["LinearAlgebra", "Random", "StaticArraysCore", "Statistics"]
-git-tree-sha1 = "c262c8e978048c2b095be1672c9bee55b4619521"
+git-tree-sha1 = "832afbae2a45b4ae7e831f86965469a24d1d8a83"
uuid = "90137ffa-7385-5640-81b9-e52037218182"
-version = "1.5.24"
+version = "1.5.26"
[[deps.StaticArraysCore]]
git-tree-sha1 = "6b7ba252635a5eff6a0b0664a41ee140a1c9e72a"
@@ -1734,9 +1751,9 @@ version = "1.6.0"
[[deps.StatsBase]]
deps = ["DataAPI", "DataStructures", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"]
-git-tree-sha1 = "d1bf48bfcc554a3761a133fe3a9bb01488e06916"
+git-tree-sha1 = "75ebe04c5bed70b91614d684259b661c9e6274a4"
uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91"
-version = "0.33.21"
+version = "0.34.0"
[[deps.StatsFuns]]
deps = ["ChainRulesCore", "HypergeometricFunctions", "InverseFunctions", "IrrationalConstants", "LogExpFunctions", "Reexport", "Rmath", "SpecialFunctions"]
@@ -1774,9 +1791,9 @@ version = "1.0.5"
[[deps.Symbolics]]
deps = ["ArrayInterface", "ConstructionBase", "DataStructures", "DiffRules", "Distributions", "DocStringExtensions", "DomainSets", "Groebner", "IfElse", "LaTeXStrings", "LambertW", "Latexify", "Libdl", "LinearAlgebra", "MacroTools", "Markdown", "NaNMath", "RecipesBase", "Reexport", "Requires", "RuntimeGeneratedFunctions", "SciMLBase", "Setfield", "SparseArrays", "SpecialFunctions", "StaticArrays", "SymbolicUtils", "TreeViews"]
-git-tree-sha1 = "e23ec62c083ca8f15a4b7174331b3b8d1c511e47"
+git-tree-sha1 = "c4e5688a9a5a2f4088cd1a779b0742be31cbe9aa"
uuid = "0c5d862f-8b57-4792-8d23-62f2024744c7"
-version = "5.3.1"
+version = "5.5.0"
[[deps.TOML]]
deps = ["Dates"]
@@ -2108,10 +2125,10 @@ uuid = "3161d3a3-bdf6-5164-811a-617609db77b4"
version = "1.5.5+0"
[[deps.Zygote]]
-deps = ["AbstractFFTs", "ChainRules", "ChainRulesCore", "DiffRules", "Distributed", "FillArrays", "ForwardDiff", "GPUArrays", "GPUArraysCore", "IRTools", "InteractiveUtils", "LinearAlgebra", "LogExpFunctions", "MacroTools", "NaNMath", "Random", "Requires", "SnoopPrecompile", "SparseArrays", "SpecialFunctions", "Statistics", "ZygoteRules"]
-git-tree-sha1 = "987ae5554ca90e837594a0f30325eeb5e7303d1e"
+deps = ["AbstractFFTs", "ChainRules", "ChainRulesCore", "DiffRules", "Distributed", "FillArrays", "ForwardDiff", "GPUArrays", "GPUArraysCore", "IRTools", "InteractiveUtils", "LinearAlgebra", "LogExpFunctions", "MacroTools", "NaNMath", "PrecompileTools", "Random", "Requires", "SparseArrays", "SpecialFunctions", "Statistics", "ZygoteRules"]
+git-tree-sha1 = "5be3ddb88fc992a7d8ea96c3f10a49a7e98ebc7b"
uuid = "e88e6eb3-aa80-5325-afca-941959d7151f"
-version = "0.6.60"
+version = "0.6.62"
[[deps.ZygoteRules]]
deps = ["ChainRulesCore", "MacroTools"]
diff --git a/examples/qram/pi_gate.ipynb b/examples/qram/pi_gate.ipynb
index 0f8689dd..2cf7918f 100644
--- a/examples/qram/pi_gate.ipynb
+++ b/examples/qram/pi_gate.ipynb
@@ -18,23 +18,23 @@
},
{
"cell_type": "code",
- "execution_count": 2,
+ "execution_count": 22,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
- "Loading data dict from data/limited_drives_T_100_dt_1.0_dda_0.0001_a_0.12566370614359174_max_iter_100_00000.jld2:\n",
+ "Loading data dict from data/limited_drives_T_100_dt_1.0_dda_0.002_a_0.02_max_iter_500_00002.jld2:\n",
"\n",
- " duration = 72.61324981519805\n",
- " final_fidelity = 0.9922185163356951\n"
+ " duration = 26.80948914618727\n",
+ " final_fidelity = 0.9550975523905912\n"
]
},
{
"data": {
"text/plain": [
- "NamedTrajectory{Float64}([1.0 1.0 … 0.007575094597536527 0.0066429378333538545; 0.0 0.0 … 0.0 0.0; … ; 1.8981443306253186e-6 3.7667442303727987e-6 … 1.107924470744334e-10 -5.112400723147125e-21; 0.7334671698504867 0.7334671698504867 … 0.7334671698504867 0.7334671698504867], [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 … 0.0, 0.0, 0.05541568848816433, 0.0, 0.0, -0.0034719494553613253, -0.000302106228627415, 6.171191907215001e-21, -5.112400723147125e-21, 0.7334671698504867], 100, :Δt, 519, (Ũ⃗ = 512, a = 2, da = 2, dda = 2, Δt = 1, states = 516, controls = 3), (a = ([-0.12566370614359174, -0.12566370614359174], [0.12566370614359174, 0.12566370614359174]), dda = ([-0.0001, -0.0001], [0.0001, 0.0001]), Δt = ([0.5], [1.2])), (Ũ⃗ = [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 … 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], a = [0.0, 0.0]), (a = [0.0, 0.0],), (Ũ⃗ = [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0 … 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],), (Ũ⃗ = 1:512, a = 513:514, da = 515:516, dda = 517:518, Δt = 519:519, states = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10 … 507, 508, 509, 510, 511, 512, 513, 514, 515, 516], controls = [517, 518, 519]), (:Ũ⃗, :a, :da, :dda, :Δt), (:Ũ⃗, :a, :da), (:dda, :Δt))"
+ "NamedTrajectory{Float64}([1.0 1.0 … 0.08078165468060403 0.07882587664153458; 0.0 0.0 … 0.0 0.0; … ; 0.00047588630074294944 0.00076657588428622 … 1.7132035748174996e-7 1.1444956860524965e-19; 0.27080292066855877 0.27080292066855877 … 0.27080292066855877 0.27080292066855877], [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 … 0.0, 0.0, 0.09915545055176467, 0.0, 0.0, -0.008633865997297213, -0.0031638252315717543, 1.1444956860524965e-19, 1.1444956860524965e-19, 0.27080292066855877], 100, :Δt, 519, (Ũ⃗ = 512, a = 2, da = 2, dda = 2, Δt = 1, states = 516, controls = 3), (a = ([-0.02, -0.02], [0.02, 0.02]), dda = ([-0.002, -0.002], [0.002, 0.002]), Δt = ([0.1], [1.2])), (Ũ⃗ = [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 … 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], a = [0.0, 0.0]), (a = [0.0, 0.0],), (Ũ⃗ = [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0 … 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],), (Ũ⃗ = 1:512, a = 513:514, da = 515:516, dda = 517:518, Δt = 519:519, states = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10 … 507, 508, 509, 510, 511, 512, 513, 514, 515, 516], controls = [517, 518, 519]), (:Ũ⃗, :a, :da, :dda, :Δt), (:Ũ⃗, :a, :da), (:dda, :Δt))"
]
},
"metadata": {},
@@ -42,40 +42,22 @@
}
],
"source": [
- "data_path = \"data/T_100_dt_1.0_dda_0.0001_a_0.12566370614359174_max_iter_100_00000.jld2\"\n",
+ "data_path = \"data/limited_drives_T_100_dt_1.0_dda_0.002_a_0.02_max_iter_500_00002.jld2\"\n",
"data = load_problem(data_path; return_data=true)\n",
"traj = data[\"trajectory\"]"
]
},
{
"cell_type": "code",
- "execution_count": 4,
+ "execution_count": 23,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
- "100-element Vector{Float64}:\n",
- " 0.0\n",
- " 0.7334671698504867\n",
- " 1.4669343397009733\n",
- " 2.20040150955146\n",
- " 2.9338686794019466\n",
- " 3.6673358492524333\n",
- " 4.40080301910292\n",
- " 5.134270188953407\n",
- " 5.867737358803893\n",
- " 6.60120452865438\n",
- " ⋮\n",
- " 66.74551245639417\n",
- " 67.47897962624465\n",
- " 68.21244679609514\n",
- " 68.94591396594562\n",
- " 69.6793811357961\n",
- " 70.41284830564659\n",
- " 71.14631547549708\n",
- " 71.87978264534756\n",
- " 72.61324981519805"
+ "2×100 Matrix{Float64}:\n",
+ " 0.0 0.00233826 0.0045334 0.00658378 … 0.00453315 0.00233811 0.0\n",
+ " 0.0 -0.000790894 -0.00154689 -0.00224667 0.00167523 0.000856786 0.0"
]
},
"metadata": {},
@@ -83,18 +65,18 @@
}
],
"source": [
- "pulse = traj.a\n",
- "ts = times(traj)"
+ "ts = times(traj)\n",
+ "pulse = traj.a"
]
},
{
"cell_type": "code",
- "execution_count": 5,
+ "execution_count": 21,
"metadata": {},
"outputs": [],
"source": [
"# save pulse and times\n",
- "pulse_path = \"data/pulse.hdf5\"\n",
+ "pulse_path = \"data/pulse_2_drive_shorter_time.hdf5\"\n",
"pulse_file = h5open(pulse_path, \"w\")\n",
"pulse_file[\"pulse\"] = pulse\n",
"pulse_file[\"ts\"] = ts\n",
@@ -103,15 +85,21 @@
},
{
"cell_type": "code",
- "execution_count": 9,
+ "execution_count": 15,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
- "2×100 Matrix{Float64}:\n",
- " 0.0 0.00254727 0.00505691 … 0.00505566 0.00254656 0.0\n",
- " 0.0 -0.000218839 -0.000436656 0.000442186 0.000221585 0.0"
+ "8×100 Matrix{Float64}:\n",
+ " 0.0 3.94116e-5 3.67995e-5 … 0.00379268 0.00191292 0.0\n",
+ " 0.0 -0.00172882 -0.00339493 -0.00183975 -0.000952879 0.0\n",
+ " 0.0 0.000255824 0.000559932 0.000507485 0.000229223 0.0\n",
+ " 0.0 5.76738e-5 0.000119058 -0.000104015 -5.0021e-5 0.0\n",
+ " 0.0 -0.000697201 -0.001356 0.00152926 0.000782295 0.0\n",
+ " 0.0 0.000126126 0.000269827 … -2.13574e-5 -2.33794e-5 0.0\n",
+ " 0.0 0.00110387 0.00218492 0.00216998 0.00110303 0.0\n",
+ " 0.0 0.000466185 0.000899852 -0.000223202 -0.000123923 0.0"
]
},
"metadata": {},
@@ -120,7 +108,7 @@
],
"source": [
"# load pulse and times\n",
- "pulse_path = \"data/pulse.hdf5\"\n",
+ "pulse_path = \"data/pulse_full.hdf5\"\n",
"pulse_file = h5open(pulse_path, \"r\")\n",
"pulse_file[\"pulse\"][:,:]"
]
diff --git a/examples/transmon/data/pi_gate/T_100_dt_0.1_Q_200.0_R_0.01_dda_bound_0.05_00000.jld2 b/examples/transmon/data/pi_gate/T_100_dt_0.1_Q_200.0_R_0.01_dda_bound_0.05_00000.jld2
new file mode 100644
index 00000000..5ba2f984
Binary files /dev/null and b/examples/transmon/data/pi_gate/T_100_dt_0.1_Q_200.0_R_0.01_dda_bound_0.05_00000.jld2 differ
diff --git a/examples/transmon/data/pi_gate/T_400_dt_0.1_Q_200.0_R_0.01_dda_bound_0.05_00002.jld2 b/examples/transmon/data/pi_gate/T_400_dt_0.1_Q_200.0_R_0.01_dda_bound_0.05_00002.jld2
new file mode 100644
index 00000000..c1f629c9
Binary files /dev/null and b/examples/transmon/data/pi_gate/T_400_dt_0.1_Q_200.0_R_0.01_dda_bound_0.05_00002.jld2 differ
diff --git a/examples/transmon/pi_gate.jl b/examples/transmon/pi_gate.jl
index 5df7a2b0..380789ac 100644
--- a/examples/transmon/pi_gate.jl
+++ b/examples/transmon/pi_gate.jl
@@ -20,8 +20,8 @@ system = QuantumSystem(
H_drives
)
-T = 400
-Δt = 0.1
+T = 100
+Δt = 0.4
Q = 200.
R = 0.01
R_L1 = 1.0
@@ -36,7 +36,10 @@ max_iter = 500
time = T * Δt
+free_time = false
+
prob = UnitarySmoothPulseProblem(system, U_goal, T, Δt;
+ free_time=free_time,
a_bounds=a_bounds,
dda_bound=dda_bound,
max_iter=max_iter,
@@ -47,7 +50,9 @@ prob = UnitarySmoothPulseProblem(system, U_goal, T, Δt;
solve!(prob)
-println("fidelity = ", unitary_fidelity(prob.trajectory[end].Ũ⃗, prob.trajectory.goal.Ũ⃗))
+Ũ⃗_final = unitary_rollout(prob.trajectory.initial.Ũ⃗, prob.trajectory.a, prob.trajectory.timestep, system)[:, end]
+
+println("fidelity = ", unitary_fidelity(Ũ⃗_final, prob.trajectory.goal.Ũ⃗))
plot_dir = joinpath(@__DIR__, "plots/pi_gate/")
diff --git a/images/diagram.svg b/images/diagram.svg
index 44fd34c2..ef9f2cbb 100644
--- a/images/diagram.svg
+++ b/images/diagram.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/src/dynamics.jl b/src/dynamics.jl
index 67313a99..e043b65c 100644
--- a/src/dynamics.jl
+++ b/src/dynamics.jl
@@ -40,12 +40,22 @@ function QuantumDynamics(
println(" constructing knot point dynamics functions...")
end
- @assert all([
- !isnothing(state(integrator)) &&
- !isnothing(controls(integrator)) &&
- !isnothing(timestep(integrator))
- for integrator ∈ integrators
- ])
+ free_time = traj.timestep isa Symbol
+
+ if free_time
+ @assert all([
+ !isnothing(state(integrator)) &&
+ !isnothing(controls(integrator)) &&
+ !isnothing(timestep(integrator))
+ for integrator ∈ integrators
+ ])
+ else
+ @assert all([
+ !isnothing(state(integrator)) &&
+ !isnothing(controls(integrator))
+ for integrator ∈ integrators
+ ])
+ end
for integrator ∈ integrators
if integrator isa QuantumIntegrator && controls(integrator) isa Tuple
@@ -91,10 +101,16 @@ function QuantumDynamics(
∂[integrator_comps, 1:2traj.dim] = ∂P(zₜ, zₜ₊₁)
else
- x_comps, u_comps, Δt_comps = comps(integrator, traj)
-
- ∂xₜf, ∂xₜ₊₁f, ∂uₜf, ∂Δtₜf =
- Integrators.jacobian(integrator, zₜ, zₜ₊₁, traj)
+ if free_time
+ x_comps, u_comps, Δt_comps = comps(integrator, traj)
+ ∂xₜf, ∂xₜ₊₁f, ∂uₜf, ∂Δtₜf =
+ Integrators.jacobian(integrator, zₜ, zₜ₊₁, traj)
+ ∂[integrator_comps, Δt_comps] = ∂Δtₜf
+ else
+ x_comps, u_comps = comps(integrator, traj)
+ ∂xₜf, ∂xₜ₊₁f, ∂uₜf =
+ Integrators.jacobian(integrator, zₜ, zₜ₊₁, traj)
+ end
∂[integrator_comps, x_comps] = ∂xₜf
∂[integrator_comps, x_comps .+ traj.dim] = ∂xₜ₊₁f
@@ -107,20 +123,26 @@ function QuantumDynamics(
∂[integrator_comps, u_comps] = ∂uₜf
end
- ∂[integrator_comps, Δt_comps] = ∂Δtₜf
end
elseif integrator isa DerivativeIntegrator
- x_comps, dx_comps, Δt_comps = comps(integrator, traj)
-
- ∂xₜf, ∂xₜ₊₁f, ∂dxₜf, ∂Δtₜf =
- Integrators.jacobian(integrator, zₜ, zₜ₊₁, traj)
+ if free_time
+ x_comps, dx_comps, Δt_comps = comps(integrator, traj)
+ ∂xₜf, ∂xₜ₊₁f, ∂dxₜf, ∂Δtₜf =
+ Integrators.jacobian(integrator, zₜ, zₜ₊₁, traj)
+ else
+ x_comps, dx_comps = comps(integrator, traj)
+ ∂xₜf, ∂xₜ₊₁f, ∂dxₜf =
+ Integrators.jacobian(integrator, zₜ, zₜ₊₁, traj)
+ end
∂[integrator_comps, x_comps] = ∂xₜf
∂[integrator_comps, x_comps .+ traj.dim] = ∂xₜ₊₁f
∂[integrator_comps, dx_comps] = ∂dxₜf
- ∂[integrator_comps, Δt_comps] = ∂Δtₜf
+ if free_time
+ ∂[integrator_comps, Δt_comps] = ∂Δtₜf
+ end
else
error("integrator type not supported: $(typeof(integrator))")
end
@@ -147,10 +169,16 @@ function QuantumDynamics(
μ∂²[1:2traj.dim, 1:2traj.dim] = sparse(μ∂²P(zₜ, zₜ₊₁, μₜ[integrator_comps]))
else
- x_comps, u_comps, Δt_comps = comps(integrator, traj)
- μ∂uₜ∂xₜf, μ∂²uₜf, μ∂Δtₜ∂xₜf, μ∂Δtₜ∂uₜf, μ∂²Δtₜf, μ∂xₜ₊₁∂uₜf, μ∂xₜ₊₁∂Δtₜf =
- hessian_of_the_lagrangian(integrator, zₜ, zₜ₊₁, μₜ[integrator_comps], traj)
+ if free_time
+ x_comps, u_comps, Δt_comps = comps(integrator, traj)
+ μ∂uₜ∂xₜf, μ∂²uₜf, μ∂Δtₜ∂xₜf, μ∂Δtₜ∂uₜf, μ∂²Δtₜf, μ∂xₜ₊₁∂uₜf, μ∂xₜ₊₁∂Δtₜf =
+ hessian_of_the_lagrangian(integrator, zₜ, zₜ₊₁, μₜ[integrator_comps], traj)
+ else
+ x_comps, u_comps = comps(integrator, traj)
+ μ∂uₜ∂xₜf, μ∂²uₜf, μ∂xₜ₊₁∂uₜf =
+ hessian_of_the_lagrangian(integrator, zₜ, zₜ₊₁, μₜ[integrator_comps], traj)
+ end
if u_comps isa Tuple
for (uᵢ_comps, μ∂uₜᵢ∂xₜf) ∈ zip(u_comps, μ∂uₜ∂xₜf)
@@ -159,8 +187,10 @@ function QuantumDynamics(
for (uᵢ_comps, μ∂²uₜᵢf) ∈ zip(u_comps, μ∂²uₜf)
μ∂²[uᵢ_comps, uᵢ_comps] += μ∂²uₜᵢf
end
- for (uᵢ_comps, μ∂Δtₜ∂uₜᵢf) ∈ zip(u_comps, μ∂Δtₜ∂uₜf)
- μ∂²[uᵢ_comps, Δt_comps] += μ∂Δtₜ∂uₜᵢf
+ if free_time
+ for (uᵢ_comps, μ∂Δtₜ∂uₜᵢf) ∈ zip(u_comps, μ∂Δtₜ∂uₜf)
+ μ∂²[uᵢ_comps, Δt_comps] += μ∂Δtₜ∂uₜᵢf
+ end
end
for (uᵢ_comps, μ∂xₜ₊₁∂uₜᵢf) ∈ zip(u_comps, μ∂xₜ₊₁∂uₜf)
μ∂²[uᵢ_comps, x_comps .+ traj.dim] += μ∂xₜ₊₁∂uₜᵢf
@@ -168,23 +198,26 @@ function QuantumDynamics(
else
μ∂²[x_comps, u_comps] += μ∂uₜ∂xₜf
μ∂²[u_comps, u_comps] += μ∂²uₜf
- μ∂²[u_comps, Δt_comps] += μ∂Δtₜ∂uₜf
+ if free_time
+ μ∂²[u_comps, Δt_comps] += μ∂Δtₜ∂uₜf
+ end
μ∂²[u_comps, x_comps .+ traj.dim] += μ∂xₜ₊₁∂uₜf
end
-
- μ∂²[x_comps, Δt_comps] += μ∂Δtₜ∂xₜf
- μ∂²[Δt_comps, x_comps .+ traj.dim] += μ∂xₜ₊₁∂Δtₜf
- μ∂²[Δt_comps, Δt_comps] .+= μ∂²Δtₜf
+ if free_time
+ μ∂²[x_comps, Δt_comps] += μ∂Δtₜ∂xₜf
+ μ∂²[Δt_comps, x_comps .+ traj.dim] += μ∂xₜ₊₁∂Δtₜf
+ μ∂²[Δt_comps, Δt_comps] .+= μ∂²Δtₜf
+ end
end
elseif integrator isa DerivativeIntegrator
+ if free_time
+ x_comps, dx_comps, Δt_comps = comps(integrator, traj)
- x_comps, dx_comps, Δt_comps = comps(integrator, traj)
-
- μ∂dxₜ∂Δtₜf = -μₜ[integrator_comps]
-
- μ∂²[dx_comps, Δt_comps] += μ∂dxₜ∂Δtₜf
+ μ∂dxₜ∂Δtₜf = -μₜ[integrator_comps]
+ μ∂²[dx_comps, Δt_comps] += μ∂dxₜ∂Δtₜf
+ end
end
end
diff --git a/src/integrators.jl b/src/integrators.jl
index 352bcfbf..388ff3b0 100644
--- a/src/integrators.jl
+++ b/src/integrators.jl
@@ -158,8 +158,12 @@ function comps(P::AbstractIntegrator, traj::NamedTrajectory)
else
control_comps = traj.components[u]
end
- timestep_comp = traj.components[timestep(P)]
- return state_comps, control_comps, timestep_comp
+ if traj.timestep isa Float64
+ return state_comps, control_comps
+ else
+ timestep_comp = traj.components[traj.timestep]
+ return state_comps, control_comps, timestep_comp
+ end
end
dim(integrator::AbstractIntegrator) = integrator.dim
@@ -168,22 +172,19 @@ dim(integrators::AbstractVector{<:AbstractIntegrator}) = sum(dim, integrators)
struct DerivativeIntegrator <: AbstractIntegrator
variable::Symbol
derivative::Symbol
- timestep::Symbol
dim::Int
end
function DerivativeIntegrator(
variable::Symbol,
derivative::Symbol,
- timestep::Symbol,
traj::NamedTrajectory
)
- return DerivativeIntegrator(variable, derivative, timestep, traj.dims[variable])
+ return DerivativeIntegrator(variable, derivative, traj.dims[variable])
end
state(integrator::DerivativeIntegrator) = integrator.variable
controls(integrator::DerivativeIntegrator) = integrator.derivative
-timestep(integrator::DerivativeIntegrator) = integrator.timestep
@views function (D::DerivativeIntegrator)(
zₜ::AbstractVector,
@@ -193,8 +194,11 @@ timestep(integrator::DerivativeIntegrator) = integrator.timestep
xₜ = zₜ[traj.components[D.variable]]
xₜ₊₁ = zₜ₊₁[traj.components[D.variable]]
dxₜ = zₜ[traj.components[D.derivative]]
- Δtₜ = zₜ[traj.components[D.timestep]][1]
-
+ if traj.timestep isa Symbol
+ Δtₜ = zₜ[traj.components[traj.timestep]][1]
+ else
+ Δtₜ = traj.timestep
+ end
return xₜ₊₁ - xₜ - Δtₜ * dxₜ
end
@@ -205,13 +209,15 @@ end
traj::NamedTrajectory
)
dxₜ = zₜ[traj.components[D.derivative]]
- Δtₜ = zₜ[traj.components[D.timestep]][1]
-
+ if traj.timestep isa Symbol
+ Δtₜ = zₜ[traj.components[traj.timestep]][1]
+ else
+ Δtₜ = traj.timestep
+ end
∂xₜD = sparse(-1.0I(D.dim))
∂xₜ₊₁D = sparse(1.0I(D.dim))
∂dxₜD = sparse(-Δtₜ * I(D.dim))
∂ΔtₜD = -dxₜ
-
return ∂xₜD, ∂xₜ₊₁D, ∂dxₜD, ∂ΔtₜD
end
@@ -245,7 +251,6 @@ struct UnitaryPadeIntegrator{R} <: QuantumPadeIntegrator
H_drives_real_anticomm_H_drives_imag::Matrix{Matrix{R}}
unitary_symb::Union{Symbol,Nothing}
drive_symb::Union{Symbol,Tuple{Vararg{Symbol}},Nothing}
- timestep_symb::Union{Symbol,Nothing}
n_drives::Int
N::Int
dim::Int
@@ -255,11 +260,10 @@ struct UnitaryPadeIntegrator{R} <: QuantumPadeIntegrator
"""
UnitaryPadeIntegrator(
sys::QuantumSystem{R},
- unitary_symb::Union{Symbol,Nothing}=nothing,
- drive_symb::Union{Symbol,Tuple{Vararg{Symbol}},Nothing}=nothing,
- timestep_symb::Union{Symbol,Nothing}=nothing;
+ unitary_symb::Symbol,
+ drive_symb::Union{Symbol,Tuple{Vararg{Symbol}}};
order::Int=4,
- autodiff::Bool=false
+ autodiff::Bool=order != 4
) where R <: Real
Construct a `UnitaryPadeIntegrator` for the quantum system `sys`.
@@ -271,33 +275,34 @@ struct UnitaryPadeIntegrator{R} <: QuantumPadeIntegrator
P = UnitaryPadeIntegrator(sys)
```
- ## for a single drive `a` and timestep `Δt`:
+ ## for a single drive `a`:
```julia
- P = UnitaryPadeIntegrator(sys, :Ũ⃗, :a, :Δt)
+ P = UnitaryPadeIntegrator(sys, :Ũ⃗, :a)
```
- ## for two drives `α` and `γ`, timestep `Δt`, order `4`, and autodiffed:
+ ## for two drives `α` and `γ`, order `4`, and autodiffed:
```julia
- P = UnitaryPadeIntegrator(sys, :Ũ⃗, (:α, :γ), :Δt; order=4, autodiff=true)
+ P = UnitaryPadeIntegrator(sys, :Ũ⃗, (:α, :γ); order=4, autodiff=true)
```
# Arguments
- `sys::QuantumSystem{R}`: the quantum system
- `unitary_symb::Union{Symbol,Nothing}=nothing`: the symbol for the unitary
- `drive_symb::Union{Symbol,Tuple{Vararg{Symbol}},Nothing}=nothing`: the symbol(s) for the drives
- - `timestep_symb::Union{Symbol,Nothing}=nothing`: the symbol for the timestep
- `order::Int=4`: the order of the Pade approximation. Must be in `[4, 6, 8, 10]`. If order is not `4` and `autodiff` is `false`, then the integrator will use the hand-coded fourth order derivatives.
- - `autodiff::Bool=false`: whether to use automatic differentiation to compute the jacobian and hessian of the lagrangian
+ - `autodiff::Bool=order != 4`: whether to use automatic differentiation to compute the jacobian and hessian of the lagrangian
+
"""
function UnitaryPadeIntegrator(
sys::QuantumSystem{R},
unitary_symb::Union{Symbol,Nothing}=nothing,
drive_symb::Union{Symbol,Tuple{Vararg{Symbol}},Nothing}=nothing,
- timestep_symb::Union{Symbol,Nothing}=nothing;
order::Int=4,
autodiff::Bool=false
) where R <: Real
@assert order ∈ [4, 6, 8, 10] "order must be in [4, 6, 8, 10]"
+ @assert !isnothing(unitary_symb) "must specify unitary symbol"
+ @assert !isnothing(drive_symb) "must specify drive symbol"
n_drives = length(sys.H_drives_real)
N = size(sys.H_drift_real, 1)
@@ -358,7 +363,6 @@ struct UnitaryPadeIntegrator{R} <: QuantumPadeIntegrator
fetch(H_drives_real_anticomm_H_drives_imag),
unitary_symb,
drive_symb,
- timestep_symb,
n_drives,
N,
dim,
@@ -370,7 +374,6 @@ end
state(P::UnitaryPadeIntegrator) = P.unitary_symb
controls(P::UnitaryPadeIntegrator) = P.drive_symb
-timestep(P::UnitaryPadeIntegrator) = P.timestep_symb
struct QuantumStatePadeIntegrator{R} <: QuantumPadeIntegrator
G_drift::Union{Nothing, Matrix{R}}
@@ -391,7 +394,6 @@ struct QuantumStatePadeIntegrator{R} <: QuantumPadeIntegrator
H_drives_real_anticomm_H_drives_imag::Matrix{Matrix{R}}
state_symb::Union{Symbol,Nothing}
drive_symb::Union{Symbol,Tuple{Vararg{Symbol}},Nothing}
- timestep_symb::Union{Symbol,Nothing}
n_drives::Int
N::Int
dim::Int
@@ -412,38 +414,33 @@ struct QuantumStatePadeIntegrator{R} <: QuantumPadeIntegrator
# Examples
- ## a bare integrator
- ```julia
- P = QuantumstatePadeIntegrator(sys)
- ```
-
- ## for a single drive `a` and timestep `Δt`:
+ ## for a single drive `a`:
```julia
- P = QuantumstatePadeIntegrator(sys, :ψ̃, :a, :Δt)
+ P = QuantumstatePadeIntegrator(sys, :ψ̃, :a)
```
- ## for two drives `α` and `γ`, timestep `Δt`, order `8`, and autodiffed:
+ ## for two drives `α` and `γ`, order `8`, and autodiffed:
```julia
- P = QuantumstatePadeIntegrator(sys, :ψ̃, (:α, :γ), :Δt; order=8, autodiff=true)
+ P = QuantumstatePadeIntegrator(sys, :ψ̃, (:α, :γ); order=8, autodiff=true)
```
# Arguments
- `sys::QuantumSystem{R}`: the quantum system
- - `state_symb::Union{Symbol,Nothing}=nothing`: the symbol for the quantum state
- - `drive_symb::Union{Symbol,Tuple{Vararg{Symbol}},Nothing}=nothing`: the symbol(s) for the drives
- - `timestep_symb::Union{Symbol,Nothing}=nothing`: the symbol for the timestep
+ - `state_symb::Symbol`: the symbol for the quantum state
+ - `drive_symb::Union{Symbol,Tuple{Vararg{Symbol}}}`: the symbol(s) for the drives
- `order::Int=4`: the order of the Pade approximation. Must be in `[4, 6, 8, 10]`. If order is not `4` and `autodiff` is `false`, then the integrator will use the hand-coded fourth order derivatives.
- `autodiff::Bool=false`: whether to use automatic differentiation to compute the jacobian and hessian of the lagrangian
"""
function QuantumStatePadeIntegrator(
sys::QuantumSystem{R},
state_symb::Union{Symbol,Nothing}=nothing,
- drive_symb::Union{Symbol,Tuple{Vararg{Symbol}},Nothing}=nothing,
- timestep_symb::Union{Symbol,Nothing}=nothing;
+ drive_symb::Union{Symbol,Tuple{Vararg{Symbol}},Nothing}=nothing;
order::Int=4,
- autodiff::Bool=false
+ autodiff::Bool=order != 4
) where R <: Real
@assert order ∈ [4, 6, 8, 10] "order must be in [4, 6, 8, 10]"
+ @assert !isnothing(state_symb) "state_symb must be specified"
+ @assert !isnothing(drive_symb) "drive_symb must be specified"
n_drives = length(sys.H_drives_real)
N = size(sys.H_drift_real, 1)
@@ -499,7 +496,6 @@ struct QuantumStatePadeIntegrator{R} <: QuantumPadeIntegrator
fetch(H_drives_real_anticomm_H_drives_imag),
state_symb,
drive_symb,
- timestep_symb,
n_drives,
N,
dim,
@@ -511,9 +507,6 @@ end
state(P::QuantumStatePadeIntegrator) = P.state_symb
controls(P::QuantumStatePadeIntegrator) = P.drive_symb
-timestep(P::QuantumStatePadeIntegrator) = P.timestep_symb
-
-
@inline function squared_operator(
a::AbstractVector{<:Real},
@@ -649,6 +642,7 @@ end
return δŨ⃗
end
+
function nth_order_pade(
P::UnitaryPadeIntegrator{R},
Ũ⃗ₜ₊₁::AbstractVector,
@@ -674,12 +668,16 @@ end
) where R <: Real
Ũ⃗ₜ₊₁ = zₜ₊₁[traj.components[P.unitary_symb]]
Ũ⃗ₜ = zₜ[traj.components[P.unitary_symb]]
+ if traj.timestep isa Symbol
+ Δtₜ = zₜ[traj.components[traj.timestep]][1]
+ else
+ Δtₜ = traj.timestep
+ end
if P.drive_symb isa Tuple
aₜ = vcat([zₜ[traj.components[s]] for s in P.drive_symb]...)
else
aₜ = zₜ[traj.components[P.drive_symb]]
end
- Δtₜ = zₜ[traj.components[P.timestep_symb]][1]
if P.order == 4
return fourth_order_pade(P, Ũ⃗ₜ₊₁, Ũ⃗ₜ, aₜ, Δtₜ)
else
@@ -734,7 +732,11 @@ end
else
aₜ = zₜ[traj.components[P.drive_symb]]
end
- Δtₜ = zₜ[traj.components[P.timestep_symb]][1]
+ if traj.timestep isa Symbol
+ Δtₜ = zₜ[traj.components[traj.timestep]][1]
+ else
+ Δtₜ = traj.timestep
+ end
if P.order == 4
return fourth_order_pade(P, ψ̃ₜ₊₁, ψ̃ₜ, aₜ, Δtₜ)
else
@@ -812,7 +814,7 @@ function ∂aₜ(
Ũ⃗ₜ₊₁::AbstractVector{T},
Ũ⃗ₜ::AbstractVector{T},
aₜ::AbstractVector{T},
- Δtₜ::T,
+ Δtₜ::Real,
drive_indices=1:P.n_drives
) where {R <: Real, T <: Real}
n_drives = length(aₜ)
@@ -834,7 +836,7 @@ function ∂aₜ(
ψ̃ₜ₊₁::AbstractVector{T},
ψ̃ₜ::AbstractVector{T},
aₜ::AbstractVector{T},
- Δtₜ::T,
+ Δtₜ::Real,
drive_indices=1:P.n_drives
) where {R <: Real, T <: Real}
n_drives = length(aₜ)
@@ -973,9 +975,16 @@ end
zₜ₊₁::AbstractVector,
traj::NamedTrajectory
)
+ free_time = traj.timestep isa Symbol
+
Ũ⃗ₜ₊₁ = zₜ₊₁[traj.components[P.unitary_symb]]
Ũ⃗ₜ = zₜ[traj.components[P.unitary_symb]]
- Δtₜ = zₜ[traj.components[P.timestep_symb]][1]
+
+ if free_time
+ Δtₜ = zₜ[traj.components[traj.timestep]][1]
+ else
+ Δtₜ = traj.timestep
+ end
if P.drive_symb isa Tuple
aₜs = Tuple(zₜ[traj.components[s]] for s ∈ P.drive_symb)
@@ -990,6 +999,9 @@ end
end
end
∂aₜP = tuple(∂aₜPs...)
+ if free_time
+ ∂ΔtₜP = ∂Δtₜ(P, Ũ⃗ₜ₊₁, Ũ⃗ₜ, vcat(aₜs...), Δtₜ)
+ end
∂ΔtₜP = ∂Δtₜ(P, Ũ⃗ₜ₊₁, Ũ⃗ₜ, vcat(aₜs...), Δtₜ)
BR = B_real(P, vcat(aₜs...), Δtₜ)
BI = B_imag(P, vcat(aₜs...), Δtₜ)
@@ -998,7 +1010,9 @@ end
else
aₜ = zₜ[traj.components[P.drive_symb]]
∂aₜP = ∂aₜ(P, Ũ⃗ₜ₊₁, Ũ⃗ₜ, aₜ, Δtₜ)
- ∂ΔtₜP = ∂Δtₜ(P, Ũ⃗ₜ₊₁, Ũ⃗ₜ, aₜ, Δtₜ)
+ if free_time
+ ∂ΔtₜP = ∂Δtₜ(P, Ũ⃗ₜ₊₁, Ũ⃗ₜ, aₜ, Δtₜ)
+ end
BR = B_real(P, aₜ, Δtₜ)
BI = B_imag(P, aₜ, Δtₜ)
FR = F_real(P, aₜ, Δtₜ)
@@ -1011,7 +1025,11 @@ end
∂Ũ⃗ₜP = -F̂
∂Ũ⃗ₜ₊₁P = B̂
- return ∂Ũ⃗ₜP, ∂Ũ⃗ₜ₊₁P, ∂aₜP, ∂ΔtₜP
+ if free_time
+ return ∂Ũ⃗ₜP, ∂Ũ⃗ₜ₊₁P, ∂aₜP, ∂ΔtₜP
+ else
+ return ∂Ũ⃗ₜP, ∂Ũ⃗ₜ₊₁P, ∂aₜP
+ end
end
@views function jacobian(
@@ -1020,9 +1038,16 @@ end
zₜ₊₁::AbstractVector,
traj::NamedTrajectory
)
+ free_time = !isnothing(P.timestep_symb)
+
ψ̃ₜ₊₁ = zₜ₊₁[traj.components[P.state_symb]]
ψ̃ₜ = zₜ[traj.components[P.state_symb]]
- Δtₜ = zₜ[traj.components[P.timestep_symb]][1]
+
+ if free_time
+ Δtₜ = zₜ[traj.components[traj.timestep]][1]
+ else
+ Δtₜ = traj.timestep
+ end
if P.drive_symb isa Tuple
aₜs = Tuple(zₜ[traj.components[s]] for s ∈ P.drive_symb)
@@ -1037,7 +1062,9 @@ end
end
end
∂aₜP = tuple(∂aₜPs...)
- ∂ΔtₜP = ∂Δtₜ(P, ψ̃ₜ₊₁, ψ̃ₜ, vcat(aₜs...), Δtₜ)
+ if free_time
+ ∂ΔtₜP = ∂Δtₜ(P, ψ̃ₜ₊₁, ψ̃ₜ, vcat(aₜs...), Δtₜ)
+ end
BR = B_real(P, vcat(aₜs...), Δtₜ)
BI = B_imag(P, vcat(aₜs...), Δtₜ)
FR = F_real(P, vcat(aₜs...), Δtₜ)
@@ -1045,7 +1072,9 @@ end
else
aₜ = zₜ[traj.components[P.drive_symb]]
∂aₜP = ∂aₜ(P, ψ̃ₜ₊₁, ψ̃ₜ, aₜ, Δtₜ)
- ∂ΔtₜP = ∂Δtₜ(P, ψ̃ₜ₊₁, ψ̃ₜ, aₜ, Δtₜ)
+ if free_time
+ ∂ΔtₜP = ∂Δtₜ(P, ψ̃ₜ₊₁, ψ̃ₜ, aₜ, Δtₜ)
+ end
BR = B_real(P, aₜ, Δtₜ)
BI = B_imag(P, aₜ, Δtₜ)
FR = F_real(P, aₜ, Δtₜ)
@@ -1058,7 +1087,11 @@ end
∂ψ̃ₜP = -F
∂ψ̃ₜ₊₁P = B
- return ∂ψ̃ₜP, ∂ψ̃ₜ₊₁P, ∂aₜP, ∂ΔtₜP
+ if free_time
+ return ∂ψ̃ₜP, ∂ψ̃ₜ₊₁P, ∂aₜP, ∂ΔtₜP
+ else
+ return ∂ψ̃ₜP, ∂ψ̃ₜ₊₁P, ∂aₜP
+ end
end
@@ -1070,7 +1103,7 @@ end
function μ∂aₜ∂Ũ⃗ₜ(
P::UnitaryPadeIntegrator,
aₜ::AbstractVector{T},
- Δtₜ::T,
+ Δtₜ::Real,
μₜ::AbstractVector{T},
drive_indices=1:P.n_drives
) where T <: Real
@@ -1088,7 +1121,7 @@ end
function μ∂Ũ⃗ₜ₊₁∂aₜ(
P::UnitaryPadeIntegrator,
aₜ::AbstractVector{T},
- Δtₜ::T,
+ Δtₜ::Real,
μₜ::AbstractVector{T},
drive_indices=1:P.n_drives
) where T <: Real
@@ -1106,7 +1139,7 @@ end
function μ∂aₜ∂ψ̃ₜ(
P::QuantumStatePadeIntegrator,
aₜ::AbstractVector{T},
- Δtₜ::T,
+ Δtₜ::Real,
μₜ::AbstractVector{T},
drive_indices=1:P.n_drives
) where T <: Real
@@ -1124,7 +1157,7 @@ end
function μ∂ψ̃ₜ₊₁∂aₜ(
P::QuantumStatePadeIntegrator,
aₜ::AbstractVector{T},
- Δtₜ::T,
+ Δtₜ::Real,
μₜ::AbstractVector{T},
drive_indices=1:P.n_drives
) where T <: Real
@@ -1143,7 +1176,7 @@ function μ∂²aₜ(
P::UnitaryPadeIntegrator,
Ũ⃗ₜ₊₁::AbstractVector{T},
Ũ⃗ₜ::AbstractVector{T},
- Δtₜ::T,
+ Δtₜ::Real,
μₜ::AbstractVector{T},
drive_indices=1:P.n_drives
) where T <: Real
@@ -1179,7 +1212,7 @@ function μ∂²aₜ(
P::QuantumStatePadeIntegrator,
ψ̃ₜ₊₁::AbstractVector{T},
ψ̃ₜ::AbstractVector{T},
- Δtₜ::T,
+ Δtₜ::Real,
μₜ::AbstractVector{T},
drive_indices=1:P.n_drives
) where T <: Real
@@ -1448,17 +1481,25 @@ end
μₜ::AbstractVector,
traj::NamedTrajectory
)
+ free_time = traj.timestep isa Symbol
+
Ũ⃗ₜ₊₁ = zₜ₊₁[traj.components[P.unitary_symb]]
Ũ⃗ₜ = zₜ[traj.components[P.unitary_symb]]
- Δtₜ = zₜ[traj.components[P.timestep_symb]][1]
+ if free_time
+ Δtₜ = zₜ[traj.components[traj.timestep]][1]
+ else
+ Δtₜ = traj.timestep
+ end
if P.drive_symb isa Tuple
aₜ = Tuple(zₜ[traj.components[s]] for s ∈ P.drive_symb)
μ∂aₜᵢ∂Ũ⃗ₜPs = []
μ∂²aₜᵢPs = []
- μ∂Δtₜ∂aₜᵢPs = []
+ if free_time
+ μ∂Δtₜ∂aₜᵢPs = []
+ end
μ∂Ũ⃗ₜ₊₁∂aₜᵢPs = []
H_drive_mark = 0
@@ -1474,8 +1515,10 @@ end
μ∂²aₜᵢP = μ∂²aₜ(P, Ũ⃗ₜ₊₁, Ũ⃗ₜ, Δtₜ, μₜ, drive_indices)
push!(μ∂²aₜᵢPs, μ∂²aₜᵢP)
- μ∂Δtₜ∂aₜᵢP = μ∂Δtₜ∂aₜ(P, Ũ⃗ₜ₊₁, Ũ⃗ₜ, aₜᵢ, Δtₜ, μₜ, drive_indices)
- push!(μ∂Δtₜ∂aₜᵢPs, μ∂Δtₜ∂aₜᵢP)
+ if free_time
+ μ∂Δtₜ∂aₜᵢP = μ∂Δtₜ∂aₜ(P, Ũ⃗ₜ₊₁, Ũ⃗ₜ, aₜᵢ, Δtₜ, μₜ, drive_indices)
+ push!(μ∂Δtₜ∂aₜᵢPs, μ∂Δtₜ∂aₜᵢP)
+ end
μ∂Ũ⃗ₜ₊₁∂aₜᵢP = μ∂Ũ⃗ₜ₊₁∂aₜ(P, aₜᵢ, Δtₜ, μₜ, drive_indices)
push!(μ∂Ũ⃗ₜ₊₁∂aₜᵢPs, μ∂Ũ⃗ₜ₊₁∂aₜᵢP)
@@ -1485,7 +1528,9 @@ end
μ∂aₜ∂Ũ⃗ₜP = tuple(μ∂aₜᵢ∂Ũ⃗ₜPs...)
μ∂²aₜP = tuple(μ∂²aₜᵢPs...)
- μ∂Δtₜ∂aₜP = tuple(μ∂Δtₜ∂aₜᵢPs...)
+ if free_time
+ μ∂Δtₜ∂aₜP = tuple(μ∂Δtₜ∂aₜᵢPs...)
+ end
μ∂Ũ⃗ₜ₊₁∂aₜP = tuple(μ∂Ũ⃗ₜ₊₁∂aₜᵢPs...)
else
@@ -1493,7 +1538,9 @@ end
μ∂aₜ∂Ũ⃗ₜP = μ∂aₜ∂Ũ⃗ₜ(P, aₜ, Δtₜ, μₜ)
μ∂²aₜP = μ∂²aₜ(P, Ũ⃗ₜ₊₁, Ũ⃗ₜ, Δtₜ, μₜ)
- μ∂Δtₜ∂aₜP = μ∂Δtₜ∂aₜ(P, Ũ⃗ₜ₊₁, Ũ⃗ₜ, aₜ, Δtₜ, μₜ)
+ if free_time
+ μ∂Δtₜ∂aₜP = μ∂Δtₜ∂aₜ(P, Ũ⃗ₜ₊₁, Ũ⃗ₜ, aₜ, Δtₜ, μₜ)
+ end
μ∂Ũ⃗ₜ₊₁∂aₜP = μ∂Ũ⃗ₜ₊₁∂aₜ(P, aₜ, Δtₜ, μₜ)
end
@@ -1501,19 +1548,26 @@ end
aₜ = vcat(aₜ...)
end
- μ∂Δtₜ∂Ũ⃗ₜP = μ∂Δtₜ∂Ũ⃗ₜ(P, aₜ, Δtₜ, μₜ)
- μ∂²ΔtₜP = μ∂²Δtₜ(P, Ũ⃗ₜ₊₁, Ũ⃗ₜ, aₜ, μₜ)
- μ∂Ũ⃗ₜ₊₁∂ΔtₜP = μ∂Ũ⃗ₜ₊₁∂Δtₜ(P, aₜ, Δtₜ, μₜ)
-
- return (
- μ∂aₜ∂Ũ⃗ₜP,
- μ∂²aₜP,
- μ∂Δtₜ∂Ũ⃗ₜP,
- μ∂Δtₜ∂aₜP,
- μ∂²ΔtₜP,
- μ∂Ũ⃗ₜ₊₁∂aₜP,
- μ∂Ũ⃗ₜ₊₁∂ΔtₜP
- )
+ if free_time
+ μ∂Δtₜ∂Ũ⃗ₜP = μ∂Δtₜ∂Ũ⃗ₜ(P, aₜ, Δtₜ, μₜ)
+ μ∂²ΔtₜP = μ∂²Δtₜ(P, Ũ⃗ₜ₊₁, Ũ⃗ₜ, aₜ, μₜ)
+ μ∂Ũ⃗ₜ₊₁∂ΔtₜP = μ∂Ũ⃗ₜ₊₁∂Δtₜ(P, aₜ, Δtₜ, μₜ)
+ return (
+ μ∂aₜ∂Ũ⃗ₜP,
+ μ∂²aₜP,
+ μ∂Δtₜ∂Ũ⃗ₜP,
+ μ∂Δtₜ∂aₜP,
+ μ∂²ΔtₜP,
+ μ∂Ũ⃗ₜ₊₁∂aₜP,
+ μ∂Ũ⃗ₜ₊₁∂ΔtₜP
+ )
+ else
+ return (
+ μ∂aₜ∂Ũ⃗ₜP,
+ μ∂²aₜP,
+ μ∂Ũ⃗ₜ₊₁∂aₜP
+ )
+ end
end
@views function hessian_of_the_lagrangian(
@@ -1523,17 +1577,23 @@ end
μₜ::AbstractVector,
traj::NamedTrajectory
)
+ free_time = traj.timestep isa Symbol
+
ψ̃ₜ₊₁ = zₜ₊₁[traj.components[P.state_symb]]
ψ̃ₜ = zₜ[traj.components[P.state_symb]]
- Δtₜ = zₜ[traj.components[P.timestep_symb]][1]
+ if free_time
+ Δtₜ = zₜ[traj.components[traj.timestep]][1]
+ end
if P.drive_symb isa Tuple
aₜ = Tuple(zₜ[traj.components[s]] for s ∈ P.drive_symb)
μ∂aₜᵢ∂ψ̃ₜPs = []
μ∂²aₜᵢPs = []
- μ∂Δtₜ∂aₜᵢPs = []
+ if free_time
+ μ∂Δtₜ∂aₜᵢPs = []
+ end
μ∂ψ̃ₜ₊₁∂aₜᵢPs = []
H_drive_mark = 0
@@ -1549,8 +1609,10 @@ end
μ∂²aₜᵢP = μ∂²aₜ(P, ψ̃ₜ₊₁, ψ̃ₜ, Δtₜ, μₜ, drive_indices)
push!(μ∂²aₜᵢPs, μ∂²aₜᵢP)
- μ∂Δtₜ∂aₜᵢP = μ∂Δtₜ∂aₜ(P, ψ̃ₜ₊₁, ψ̃ₜ, aₜᵢ, Δtₜ, μₜ, drive_indices)
- push!(μ∂Δtₜ∂aₜᵢPs, μ∂Δtₜ∂aₜᵢP)
+ if free_time
+ μ∂Δtₜ∂aₜᵢP = μ∂Δtₜ∂aₜ(P, ψ̃ₜ₊₁, ψ̃ₜ, aₜᵢ, Δtₜ, μₜ, drive_indices)
+ push!(μ∂Δtₜ∂aₜᵢPs, μ∂Δtₜ∂aₜᵢP)
+ end
μ∂ψ̃ₜ₊₁∂aₜᵢP = μ∂ψ̃ₜ₊₁∂aₜ(P, aₜᵢ, Δtₜ, μₜ, drive_indices)
push!(μ∂ψ̃ₜ₊₁∂aₜᵢPs, μ∂ψ̃ₜ₊₁∂aₜᵢP)
@@ -1560,7 +1622,9 @@ end
μ∂aₜ∂ψ̃ₜP = tuple(μ∂aₜᵢ∂ψ̃ₜPs...)
μ∂²aₜP = tuple(μ∂²aₜᵢPs...)
- μ∂Δtₜ∂aₜP = tuple(μ∂Δtₜ∂aₜᵢPs...)
+ if free_time
+ μ∂Δtₜ∂aₜP = tuple(μ∂Δtₜ∂aₜᵢPs...)
+ end
μ∂ψ̃ₜ₊₁∂aₜP = tuple(μ∂ψ̃ₜ₊₁∂aₜᵢPs...)
else
@@ -1568,7 +1632,9 @@ end
μ∂aₜ∂ψ̃ₜP = μ∂aₜ∂ψ̃ₜ(P, aₜ, Δtₜ, μₜ)
μ∂²aₜP = μ∂²aₜ(P, ψ̃ₜ₊₁, ψ̃ₜ, Δtₜ, μₜ)
- μ∂Δtₜ∂aₜP = μ∂Δtₜ∂aₜ(P, ψ̃ₜ₊₁, ψ̃ₜ, aₜ, Δtₜ, μₜ)
+ if free_time
+ μ∂Δtₜ∂aₜP = μ∂Δtₜ∂aₜ(P, ψ̃ₜ₊₁, ψ̃ₜ, aₜ, Δtₜ, μₜ)
+ end
μ∂ψ̃ₜ₊₁∂aₜP = μ∂ψ̃ₜ₊₁∂aₜ(P, aₜ, Δtₜ, μₜ)
end
@@ -1576,19 +1642,27 @@ end
aₜ = vcat(aₜ...)
end
- μ∂Δtₜ∂ψ̃ₜP = μ∂Δtₜ∂ψ̃ₜ(P, aₜ, Δtₜ, μₜ)
- μ∂²ΔtₜP = μ∂²Δtₜ(P, ψ̃ₜ₊₁, ψ̃ₜ, aₜ, μₜ)
- μ∂ψ̃ₜ₊₁∂ΔtₜP = μ∂ψ̃ₜ₊₁∂Δtₜ(P, aₜ, Δtₜ, μₜ)
-
- return (
- μ∂aₜ∂ψ̃ₜP,
- μ∂²aₜP,
- μ∂Δtₜ∂ψ̃ₜP,
- μ∂Δtₜ∂aₜP,
- μ∂²ΔtₜP,
- μ∂ψ̃ₜ₊₁∂aₜP,
- μ∂ψ̃ₜ₊₁∂ΔtₜP
- )
+ if free_time
+ μ∂Δtₜ∂ψ̃ₜP = μ∂Δtₜ∂ψ̃ₜ(P, aₜ, Δtₜ, μₜ)
+ μ∂²ΔtₜP = μ∂²Δtₜ(P, ψ̃ₜ₊₁, ψ̃ₜ, aₜ, μₜ)
+ μ∂ψ̃ₜ₊₁∂ΔtₜP = μ∂ψ̃ₜ₊₁∂Δtₜ(P, aₜ, Δtₜ, μₜ)
+
+ return (
+ μ∂aₜ∂ψ̃ₜP,
+ μ∂²aₜP,
+ μ∂Δtₜ∂ψ̃ₜP,
+ μ∂Δtₜ∂aₜP,
+ μ∂²ΔtₜP,
+ μ∂ψ̃ₜ₊₁∂aₜP,
+ μ∂ψ̃ₜ₊₁∂ΔtₜP
+ )
+ else
+ return (
+ μ∂aₜ∂ψ̃ₜP,
+ μ∂²aₜP,
+ μ∂ψ̃ₜ₊₁∂aₜP
+ )
+ end
end
diff --git a/src/problem_templates.jl b/src/problem_templates.jl
index cb700ded..14e9a976 100644
--- a/src/problem_templates.jl
+++ b/src/problem_templates.jl
@@ -30,6 +30,7 @@ function UnitarySmoothPulseProblem(
U_goal::AbstractMatrix{<:Number},
T::Int,
Δt::Float64;
+ free_time=true,
init_trajectory::Union{NamedTrajectory, Nothing}=nothing,
a_bound::Float64=Inf,
a_bounds::Vector{Float64}=fill(a_bound, length(system.G_drives)),
@@ -49,52 +50,57 @@ function UnitarySmoothPulseProblem(
ipopt_options::Options=Options(),
constraints::Vector{<:AbstractConstraint}=AbstractConstraint[],
timesteps_all_equal::Bool=true,
- verbose=false,
+ verbose::Bool=false,
+ U_init::Union{AbstractMatrix{<:Number},Nothing}=nothing,
)
U_goal = Matrix{ComplexF64}(U_goal)
+ if isnothing(U_init)
+ Ũ⃗_init = operator_to_iso_vec(1.0I(size(U_goal, 1)))
+ else
+ Ũ⃗_init = operator_to_iso_vec(U_init)
+ end
+
n_drives = length(system.G_drives)
if !isnothing(init_trajectory)
traj = init_trajectory
else
- Δt = fill(Δt, 1, T)
+ if free_time
+ Δt = fill(Δt, 1, T)
+ end
if isnothing(a_guess)
# TODO: add warning in case U_goal is not unitary
- Ũ⃗ = unitary_geodesic(U_goal, T)
a_dists = [Uniform(-a_bounds[i], a_bounds[i]) for i = 1:n_drives]
a = hcat([
zeros(n_drives),
vcat([rand(a_dists[i], 1, T - 2) for i = 1:n_drives]...),
zeros(n_drives)
]...)
+ try
+ Ũ⃗ = unitary_geodesic(U_goal, T)
+ catch e
+ @warn "Could not find geodesic. Rolling out unitary from random intial controls."
+ Ũ⃗ = unitary_rollout(Ũ⃗_init, a, Δt, system)
+ end
da = randn(n_drives, T) * drive_derivative_σ
dda = randn(n_drives, T) * drive_derivative_σ
else
- Ũ⃗ = unitary_rollout(a_guess, Δt, system)
- Δt = vec(Δt)
+ Ũ⃗ = unitary_rollout(Ũ⃗_init, a_guess, Δt, system)
a = a_guess
da = derivative(a, Δt)
dda = derivative(da, Δt)
end
- components = (
- Ũ⃗ = Ũ⃗,
- a = a,
- da = da,
- dda = dda,
- Δt = Δt,
- )
-
- bounds = (
- a = a_bounds,
- dda = dda_bounds,
- Δt = (Δt_min, Δt_max),
- )
+ if isnothing(U_init)
+ Ũ⃗_init = operator_to_iso_vec(1.0I(size(U_goal, 1)))
+ else
+ Ũ⃗_init = operator_to_iso_vec(U_init)
+ end
initial = (
- Ũ⃗ = operator_to_iso_vec(1.0I(size(U_goal, 1))),
+ Ũ⃗ = Ũ⃗_init,
a = zeros(n_drives),
)
@@ -106,15 +112,53 @@ function UnitarySmoothPulseProblem(
Ũ⃗ = operator_to_iso_vec(U_goal),
)
- traj = NamedTrajectory(
- components;
- controls=(:dda, :Δt),
- timestep=:Δt,
- bounds=bounds,
- initial=initial,
- final=final,
- goal=goal
- )
+ if free_time
+ components = (
+ Ũ⃗ = Ũ⃗,
+ a = a,
+ da = da,
+ dda = dda,
+ Δt = Δt,
+ )
+
+ bounds = (
+ a = a_bounds,
+ dda = dda_bounds,
+ Δt = (Δt_min, Δt_max),
+ )
+
+ traj = NamedTrajectory(
+ components;
+ controls=(:dda, :Δt),
+ timestep=:Δt,
+ bounds=bounds,
+ initial=initial,
+ final=final,
+ goal=goal
+ )
+ else
+ components = (
+ Ũ⃗ = Ũ⃗,
+ a = a,
+ da = da,
+ dda = dda,
+ )
+
+ bounds = (
+ a = a_bounds,
+ dda = dda_bounds,
+ )
+
+ traj = NamedTrajectory(
+ components;
+ controls=(:dda,),
+ timestep=Δt,
+ bounds=bounds,
+ initial=initial,
+ final=final,
+ goal=goal
+ )
+ end
end
J = QuantumUnitaryObjective(:Ũ⃗, traj, Q)
@@ -122,14 +166,24 @@ function UnitarySmoothPulseProblem(
J += QuadraticRegularizer(:da, traj, R_da)
J += QuadraticRegularizer(:dda, traj, R_dda)
- integrators = [
- UnitaryPadeIntegrator(system, :Ũ⃗, :a, :Δt),
- DerivativeIntegrator(:a, :da, :Δt, traj),
- DerivativeIntegrator(:da, :dda, :Δt, traj),
- ]
+ if free_time
+ integrators = [
+ UnitaryPadeIntegrator(system, :Ũ⃗, :a, :Δt),
+ DerivativeIntegrator(:a, :da, :Δt, traj),
+ DerivativeIntegrator(:da, :dda, :Δt, traj),
+ ]
+ else
+ integrators = [
+ UnitaryPadeIntegrator(system, :Ũ⃗, :a),
+ DerivativeIntegrator(:a, :da, traj),
+ DerivativeIntegrator(:da, :dda, traj),
+ ]
+ end
- if timesteps_all_equal
- push!(constraints, TimeStepsAllEqualConstraint(:Δt, traj))
+ if free_time
+ if timesteps_all_equal
+ push!(constraints, TimeStepsAllEqualConstraint(:Δt, traj))
+ end
end
return QuantumControlProblem(
@@ -226,6 +280,7 @@ function QuantumStateSmoothPulseProblem(
ψ_goal::Union{AbstractVector{<:Number}, Vector{<:AbstractVector{<:Number}}},
T::Int,
Δt::Float64;
+ free_time=true,
init_trajectory::Union{NamedTrajectory, Nothing}=nothing,
a_bound::Float64=Inf,
a_bounds::Vector{Float64}=fill(a_bound, length(system.G_drives)),
@@ -272,7 +327,9 @@ function QuantumStateSmoothPulseProblem(
if !isnothing(init_trajectory)
traj = init_trajectory
else
- Δt = fill(Δt, T)
+ if free_time
+ Δt = fill(Δt, T)
+ end
if isnothing(a_guess)
ψ̃s = NamedTuple([
@@ -297,21 +354,6 @@ function QuantumStateSmoothPulseProblem(
dda = derivative(da, Δt)
end
- control_components = (
- a = a,
- da = da,
- dda = dda,
- Δt = Δt,
- )
-
- components = merge(ψ̃s, control_components)
-
- bounds = (
- a = a_bounds,
- dda = dda_bounds,
- Δt = (Δt_min, Δt_max),
- )
-
ψ̃_initial = NamedTuple([
Symbol("ψ̃$i") => ψ̃_init
for (i, ψ̃_init) in enumerate(ψ̃_inits)
@@ -332,15 +374,56 @@ function QuantumStateSmoothPulseProblem(
for (i, ψ̃_goal) in enumerate(ψ̃_goals)
])
- traj = NamedTrajectory(
- components;
- controls=(:dda, :Δt),
- timestep=:Δt,
- bounds=bounds,
- initial=initial,
- final=final,
- goal=goal
- )
+ if free_time
+
+ control_components = (
+ a = a,
+ da = da,
+ dda = dda,
+ Δt = Δt,
+ )
+
+ components = merge(ψ̃s, control_components)
+
+ bounds = (
+ a = a_bounds,
+ dda = dda_bounds,
+ Δt = (Δt_min, Δt_max),
+ )
+
+ traj = NamedTrajectory(
+ components;
+ controls=(:dda, :Δt),
+ timestep=:Δt,
+ bounds=bounds,
+ initial=initial,
+ final=final,
+ goal=goal
+ )
+ else
+ control_components = (
+ a = a,
+ da = da,
+ dda = dda,
+ )
+
+ components = merge(ψ̃s, control_components)
+
+ bounds = (
+ a = a_bounds,
+ dda = dda_bounds,
+ )
+
+ traj = NamedTrajectory(
+ components;
+ controls=(:dda,),
+ timestep=Δt,
+ bounds=bounds,
+ initial=initial,
+ final=final,
+ goal=goal
+ )
+ end
end
J = QuadraticRegularizer(:a, traj, R_a)
@@ -365,19 +448,35 @@ function QuantumStateSmoothPulseProblem(
append!(constraints, L1_slack_constraints)
- ψ̃_integrators = [
- QuantumStatePadeIntegrator(system, Symbol("ψ̃$i"), :a, :Δt)
- for i = 1:length(ψ_inits)
- ]
+ if free_time
- integrators = [
- ψ̃_integrators...,
- DerivativeIntegrator(:a, :da, :Δt, traj),
- DerivativeIntegrator(:da, :dda, :Δt, traj)
- ]
+ ψ̃_integrators = [
+ QuantumStatePadeIntegrator(system, Symbol("ψ̃$i"), :a, :Δt)
+ for i = 1:length(ψ_inits)
+ ]
- if timesteps_all_equal
- push!(constraints, TimeStepsAllEqualConstraint(:Δt, traj))
+ integrators = [
+ ψ̃_integrators...,
+ DerivativeIntegrator(:a, :da, :Δt, traj),
+ DerivativeIntegrator(:da, :dda, :Δt, traj)
+ ]
+ else
+ ψ̃_integrators = [
+ QuantumStatePadeIntegrator(system, Symbol("ψ̃$i"), :a)
+ for i = 1:length(ψ_inits)
+ ]
+
+ integrators = [
+ ψ̃_integrators...,
+ DerivativeIntegrator(:a, :da, traj),
+ DerivativeIntegrator(:da, :dda, traj)
+ ]
+ end
+
+ if free_time
+ if timesteps_all_equal
+ push!(constraints, TimeStepsAllEqualConstraint(:Δt, traj))
+ end
end
return QuantumControlProblem(
diff --git a/src/rollouts.jl b/src/rollouts.jl
index 32aa50e0..a8f92ba9 100644
--- a/src/rollouts.jl
+++ b/src/rollouts.jl
@@ -17,13 +17,15 @@ using LinearAlgebra
function rollout(
ψ̃₁::AbstractVector{<:Number},
controls::AbstractMatrix{Float64},
- Δt::Union{AbstractVector{Float64}, AbstractMatrix{Float64}},
+ Δt::Union{AbstractVector{Float64}, AbstractMatrix{Float64}, Float64},
system::QuantumSystem;
integrator=Integrators.fourth_order_pade
)
if Δt isa AbstractMatrix
@assert size(Δt, 1) == 1
Δt = vec(Δt)
+ elseif Δt isa Float64
+ Δt = fill(Δt, size(controls, 2))
end
T = size(controls, 2)
@@ -55,13 +57,15 @@ end
function unitary_rollout(
Ũ⃗₁::AbstractVector{<:Real},
controls::AbstractMatrix{Float64},
- Δt::Union{AbstractVector{Float64}, AbstractMatrix{Float64}},
+ Δt::Union{AbstractVector{Float64}, AbstractMatrix{Float64}, Float64},
system::QuantumSystem;
integrator=Integrators.fourth_order_pade
)
if Δt isa AbstractMatrix
@assert size(Δt, 1) == 1
Δt = vec(Δt)
+ elseif Δt isa Float64
+ Δt = fill(Δt, size(controls, 2))
end
T = size(controls, 2)
@@ -89,7 +93,7 @@ end
function unitary_rollout(
controls::AbstractMatrix{Float64},
- Δt::Union{AbstractVector{Float64}, AbstractMatrix{Float64}},
+ Δt::Union{AbstractVector{Float64}, AbstractMatrix{Float64}, Float64},
system::QuantumSystem;
integrator=Integrators.fourth_order_pade
)