From 980a4fa1ea26e0af8a3178df8dfbfdc9ccde7add Mon Sep 17 00:00:00 2001 From: Aaron Trowbridge Date: Fri, 23 Jun 2023 15:43:00 -0400 Subject: [PATCH 1/6] edits --- src/problem_templates.jl | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/src/problem_templates.jl b/src/problem_templates.jl index cb700ded..e31d1cab 100644 --- a/src/problem_templates.jl +++ b/src/problem_templates.jl @@ -50,9 +50,16 @@ function UnitarySmoothPulseProblem( constraints::Vector{<:AbstractConstraint}=AbstractConstraint[], timesteps_all_equal::Bool=true, verbose=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) @@ -62,17 +69,22 @@ function UnitarySmoothPulseProblem( 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. Using random initial trajectory." + Ũ⃗ = 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) + Ũ⃗ = unitary_rollout(Ũ⃗_init, a_guess, Δt, system) Δt = vec(Δt) a = a_guess da = derivative(a, Δt) @@ -93,8 +105,14 @@ function UnitarySmoothPulseProblem( Δ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), ) From 870b1d045651d4e9eb48ffcd960ebaa5270b35d8 Mon Sep 17 00:00:00 2001 From: repo-visualizer Date: Fri, 23 Jun 2023 19:43:18 +0000 Subject: [PATCH 2/6] Repo visualizer: update diagram --- images/diagram.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/images/diagram.svg b/images/diagram.svg index 44fd34c2..986599b0 100644 --- a/images/diagram.svg +++ b/images/diagram.svg @@ -1 +1 @@ -testtestsrcsrcexamplesexamplesdocsdocstransmontransmonthree_qubit_swapthree_qubit_swapsingle_qubitsingle_qubitscriptsscriptsqramqramnotebooksnotebookscavitycavitydata/pi_gatedata/pi_gateresultsresultsnewresultsnewresultsresultsresultsdatadatadatadatamintimemintimebinomial_codebinomial_codeintegrat...integrat...integrat...constrai...constrai...constrai...Manifest...Manifest...Manifest...figures_...figures_...figures_...analysis...analysis...analysis...figures_...figures_...figures_...figures_...figures_...figures_...pi_gate....pi_gate....pi_gate....data_exp...data_exp...data_exp...continuo...continuo...continuo...binomial...binomial...binomial....gitignore.ipynb.jl.tomleach dot sized by file size \ No newline at end of file +testtestsrcsrcexamplesexamplesdocsdocstransmontransmonthree_qubit_swapthree_qubit_swapsingle_qubitsingle_qubitscriptsscriptsqramqramnotebooksnotebookscavitycavitydata/pi_gatedata/pi_gateresultsresultsnewresultsnewresultsresultsresultsdatadatadatadatamintimemintimebinomial_codebinomial_codeintegrat...integrat...integrat...constrai...constrai...constrai...Manifest...Manifest...Manifest...figures_...figures_...figures_...analysis...analysis...analysis...figures_...figures_...figures_...figures_...figures_...figures_...pi_gate....pi_gate....pi_gate....data_exp...data_exp...data_exp...continuo...continuo...continuo...binomial...binomial...binomial....gitignore.ipynb.jl.tomleach dot sized by file size \ No newline at end of file From f77853445b8c40646e37a895e71a457df57be2cb Mon Sep 17 00:00:00 2001 From: Aaron Trowbridge Date: Fri, 23 Jun 2023 16:19:14 -0400 Subject: [PATCH 3/6] edit --- src/problem_templates.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/problem_templates.jl b/src/problem_templates.jl index e31d1cab..1614e014 100644 --- a/src/problem_templates.jl +++ b/src/problem_templates.jl @@ -49,8 +49,8 @@ function UnitarySmoothPulseProblem( ipopt_options::Options=Options(), constraints::Vector{<:AbstractConstraint}=AbstractConstraint[], timesteps_all_equal::Bool=true, - verbose=false, - U_init=Union{AbstractMatrix{<:Number}, Nothing}=nothing, + verbose::Bool=false, + U_init::Union{AbstractMatrix{<:Number},Nothing}=nothing, ) U_goal = Matrix{ComplexF64}(U_goal) From 01931c631a99b1810b86909e4f61665f37c604dd Mon Sep 17 00:00:00 2001 From: repo-visualizer Date: Fri, 23 Jun 2023 20:19:30 +0000 Subject: [PATCH 4/6] Repo visualizer: update diagram --- images/diagram.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/images/diagram.svg b/images/diagram.svg index 986599b0..d00bd68e 100644 --- a/images/diagram.svg +++ b/images/diagram.svg @@ -1 +1 @@ -testtestsrcsrcexamplesexamplesdocsdocstransmontransmonthree_qubit_swapthree_qubit_swapsingle_qubitsingle_qubitscriptsscriptsqramqramnotebooksnotebookscavitycavitydata/pi_gatedata/pi_gateresultsresultsnewresultsnewresultsresultsresultsdatadatadatadatamintimemintimebinomial_codebinomial_codeintegrat...integrat...integrat...constrai...constrai...constrai...Manifest...Manifest...Manifest...figures_...figures_...figures_...analysis...analysis...analysis...figures_...figures_...figures_...figures_...figures_...figures_...pi_gate....pi_gate....pi_gate....data_exp...data_exp...data_exp...continuo...continuo...continuo...binomial...binomial...binomial....gitignore.ipynb.jl.tomleach dot sized by file size \ No newline at end of file +testtestsrcsrcexamplesexamplesdocsdocstransmontransmonthree_qubit_swapthree_qubit_swapsingle_qubitsingle_qubitscriptsscriptsqramqramnotebooksnotebookscavitycavitydata/pi_gatedata/pi_gateresultsresultsnewresultsnewresultsresultsresultsdatadatadatadatamintimemintimebinomial_codebinomial_codeintegrat...integrat...integrat...constrai...constrai...constrai...Manifest...Manifest...Manifest...figures_...figures_...figures_...analysis...analysis...analysis...figures_...figures_...figures_...figures_...figures_...figures_...pi_gate....pi_gate....pi_gate....data_exp...data_exp...data_exp...continuo...continuo...continuo...binomial...binomial...binomial....gitignore.ipynb.jl.tomleach dot sized by file size \ No newline at end of file From 2b491ba56ed7a589b7727e4d73282bece6a40356 Mon Sep 17 00:00:00 2001 From: Aaron Trowbridge Date: Wed, 28 Jun 2023 19:18:57 -0400 Subject: [PATCH 5/6] feat: fixed time problems --- Manifest.toml | 343 +++++++++--------- examples/qram/pi_gate.ipynb | 62 ++-- ...1_Q_200.0_R_0.01_dda_bound_0.05_00000.jld2 | Bin 0 -> 51350 bytes ...1_Q_200.0_R_0.01_dda_bound_0.05_00002.jld2 | Bin 0 -> 89750 bytes examples/transmon/pi_gate.jl | 11 +- src/dynamics.jl | 95 +++-- src/integrators.jl | 274 +++++++++----- src/problem_templates.jl | 219 +++++++---- src/rollouts.jl | 10 +- 9 files changed, 608 insertions(+), 406 deletions(-) create mode 100644 examples/transmon/data/pi_gate/T_100_dt_0.1_Q_200.0_R_0.01_dda_bound_0.05_00000.jld2 create mode 100644 examples/transmon/data/pi_gate/T_400_dt_0.1_Q_200.0_R_0.01_dda_bound_0.05_00002.jld2 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 0000000000000000000000000000000000000000..5ba2f9844af8d3825d773261096814b9781aa67a GIT binary patch literal 51350 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..c1f629c9cd7b2f67d1949ce72dbb3582a361a52f GIT binary patch literal 89750 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 literal 0 HcmV?d00001 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/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 1614e014..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)), @@ -65,7 +66,9 @@ function UnitarySmoothPulseProblem( 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 @@ -78,33 +81,18 @@ function UnitarySmoothPulseProblem( try Ũ⃗ = unitary_geodesic(U_goal, T) catch e - @warn "Could not find geodesic. Using random initial trajectory." + @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(Ũ⃗_init, a_guess, Δt, system) - Δt = vec(Δt) 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 @@ -124,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) @@ -140,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( @@ -244,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)), @@ -290,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([ @@ -315,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) @@ -350,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) @@ -383,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) + ] + + 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 timesteps_all_equal - push!(constraints, TimeStepsAllEqualConstraint(:Δt, traj)) + 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 ) From 7435ece2708ada9ca5d6c6b42f988f380aef149d Mon Sep 17 00:00:00 2001 From: repo-visualizer Date: Wed, 28 Jun 2023 23:19:16 +0000 Subject: [PATCH 6/6] Repo visualizer: update diagram --- images/diagram.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/images/diagram.svg b/images/diagram.svg index d00bd68e..ef9f2cbb 100644 --- a/images/diagram.svg +++ b/images/diagram.svg @@ -1 +1 @@ -testtestsrcsrcexamplesexamplesdocsdocstransmontransmonthree_qubit_swapthree_qubit_swapsingle_qubitsingle_qubitscriptsscriptsqramqramnotebooksnotebookscavitycavitydata/pi_gatedata/pi_gateresultsresultsnewresultsnewresultsresultsresultsdatadatadatadatamintimemintimebinomial_codebinomial_codeintegrat...integrat...integrat...constrai...constrai...constrai...Manifest...Manifest...Manifest...figures_...figures_...figures_...analysis...analysis...analysis...figures_...figures_...figures_...figures_...figures_...figures_...pi_gate....pi_gate....pi_gate....data_exp...data_exp...data_exp...continuo...continuo...continuo...binomial...binomial...binomial....gitignore.ipynb.jl.tomleach dot sized by file size \ No newline at end of file +testtestsrcsrcexamplesexamplesdocsdocstransmontransmonthree_qubit_swapthree_qubit_swapsingle_qubitsingle_qubitscriptsscriptsqramqramnotebooksnotebookscavitycavitydata/pi_gatedata/pi_gateresultsresultsnewresultsnewresultsresultsresultsdatadatadatadatamintimemintimebinomial_codebinomial_codeproblem_...problem_...problem_...integrat...integrat...integrat...constrai...constrai...constrai...objectiv...objectiv...objectiv...Manifest...Manifest...Manifest...figures_...figures_...figures_...analysis...analysis...analysis...figures_...figures_...figures_...figures_...figures_...figures_...pi_gate....pi_gate....pi_gate....data_exp...data_exp...data_exp...continuo...continuo...continuo...binomial...binomial...binomial....gitignore.ipynb.jl.tomleach dot sized by file size \ No newline at end of file